1*27d5dc18SMarcel Moolenaar /* 2*27d5dc18SMarcel Moolenaar * Copyright (c) 2003 Marcel Moolenaar 3*27d5dc18SMarcel Moolenaar * All rights reserved. 4*27d5dc18SMarcel Moolenaar * 5*27d5dc18SMarcel Moolenaar * Redistribution and use in source and binary forms, with or without 6*27d5dc18SMarcel Moolenaar * modification, are permitted provided that the following conditions 7*27d5dc18SMarcel Moolenaar * are met: 8*27d5dc18SMarcel Moolenaar * 9*27d5dc18SMarcel Moolenaar * 1. Redistributions of source code must retain the above copyright 10*27d5dc18SMarcel Moolenaar * notice, this list of conditions and the following disclaimer. 11*27d5dc18SMarcel Moolenaar * 2. Redistributions in binary form must reproduce the above copyright 12*27d5dc18SMarcel Moolenaar * notice, this list of conditions and the following disclaimer in the 13*27d5dc18SMarcel Moolenaar * documentation and/or other materials provided with the distribution. 14*27d5dc18SMarcel Moolenaar * 15*27d5dc18SMarcel Moolenaar * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 16*27d5dc18SMarcel Moolenaar * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 17*27d5dc18SMarcel Moolenaar * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 18*27d5dc18SMarcel Moolenaar * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 19*27d5dc18SMarcel Moolenaar * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 20*27d5dc18SMarcel Moolenaar * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 21*27d5dc18SMarcel Moolenaar * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 22*27d5dc18SMarcel Moolenaar * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 23*27d5dc18SMarcel Moolenaar * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 24*27d5dc18SMarcel Moolenaar * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 25*27d5dc18SMarcel Moolenaar * 26*27d5dc18SMarcel Moolenaar * $FreeBSD$ 27*27d5dc18SMarcel Moolenaar */ 28*27d5dc18SMarcel Moolenaar 29*27d5dc18SMarcel Moolenaar #ifndef _DEV_UART_CPU_H_ 30*27d5dc18SMarcel Moolenaar #define _DEV_UART_CPU_H_ 31*27d5dc18SMarcel Moolenaar 32*27d5dc18SMarcel Moolenaar /* 33*27d5dc18SMarcel Moolenaar * Low-level operations for use by console and/or debug port support. 34*27d5dc18SMarcel Moolenaar */ 35*27d5dc18SMarcel Moolenaar struct uart_ops { 36*27d5dc18SMarcel Moolenaar int (*probe)(struct uart_bas *); 37*27d5dc18SMarcel Moolenaar void (*init)(struct uart_bas *, int, int, int, int); 38*27d5dc18SMarcel Moolenaar void (*term)(struct uart_bas *); 39*27d5dc18SMarcel Moolenaar void (*putc)(struct uart_bas *, int); 40*27d5dc18SMarcel Moolenaar int (*poll)(struct uart_bas *); 41*27d5dc18SMarcel Moolenaar int (*getc)(struct uart_bas *); 42*27d5dc18SMarcel Moolenaar }; 43*27d5dc18SMarcel Moolenaar 44*27d5dc18SMarcel Moolenaar extern struct uart_ops uart_ns8250_ops; 45*27d5dc18SMarcel Moolenaar extern struct uart_ops uart_sab82532_ops; 46*27d5dc18SMarcel Moolenaar extern struct uart_ops uart_z8530_ops; 47*27d5dc18SMarcel Moolenaar 48*27d5dc18SMarcel Moolenaar /* 49*27d5dc18SMarcel Moolenaar * Console and debug port device info. 50*27d5dc18SMarcel Moolenaar */ 51*27d5dc18SMarcel Moolenaar struct uart_softc; 52*27d5dc18SMarcel Moolenaar struct uart_devinfo { 53*27d5dc18SMarcel Moolenaar SLIST_ENTRY(uart_devinfo) next; 54*27d5dc18SMarcel Moolenaar struct uart_ops ops; 55*27d5dc18SMarcel Moolenaar struct uart_bas bas; 56*27d5dc18SMarcel Moolenaar int baudrate; 57*27d5dc18SMarcel Moolenaar int databits; 58*27d5dc18SMarcel Moolenaar int stopbits; 59*27d5dc18SMarcel Moolenaar int parity; 60*27d5dc18SMarcel Moolenaar int type; 61*27d5dc18SMarcel Moolenaar #define UART_DEV_CONSOLE 0 62*27d5dc18SMarcel Moolenaar #define UART_DEV_DBGPORT 1 63*27d5dc18SMarcel Moolenaar #define UART_DEV_KEYBOARD 2 64*27d5dc18SMarcel Moolenaar int (*attach)(struct uart_softc*); 65*27d5dc18SMarcel Moolenaar int (*detach)(struct uart_softc*); 66*27d5dc18SMarcel Moolenaar void *cookie; /* Type dependent use. */ 67*27d5dc18SMarcel Moolenaar }; 68*27d5dc18SMarcel Moolenaar 69*27d5dc18SMarcel Moolenaar int uart_cpu_getdev(int devtype, struct uart_devinfo *di); 70*27d5dc18SMarcel Moolenaar int uart_cpu_eqres(struct uart_bas *b1, struct uart_bas *b2); 71*27d5dc18SMarcel Moolenaar 72*27d5dc18SMarcel Moolenaar void uart_add_sysdev(struct uart_devinfo*); 73*27d5dc18SMarcel Moolenaar 74*27d5dc18SMarcel Moolenaar /* 75*27d5dc18SMarcel Moolenaar * Operations for low-level access to the UART. Primarily for use 76*27d5dc18SMarcel Moolenaar * by console and debug port logic. 77*27d5dc18SMarcel Moolenaar */ 78*27d5dc18SMarcel Moolenaar static __inline int 79*27d5dc18SMarcel Moolenaar uart_probe(struct uart_devinfo *di) 80*27d5dc18SMarcel Moolenaar { 81*27d5dc18SMarcel Moolenaar return (di->ops.probe(&di->bas)); 82*27d5dc18SMarcel Moolenaar } 83*27d5dc18SMarcel Moolenaar 84*27d5dc18SMarcel Moolenaar static __inline void 85*27d5dc18SMarcel Moolenaar uart_init(struct uart_devinfo *di) 86*27d5dc18SMarcel Moolenaar { 87*27d5dc18SMarcel Moolenaar di->ops.init(&di->bas, di->baudrate, di->databits, di->stopbits, 88*27d5dc18SMarcel Moolenaar di->parity); 89*27d5dc18SMarcel Moolenaar } 90*27d5dc18SMarcel Moolenaar 91*27d5dc18SMarcel Moolenaar static __inline void 92*27d5dc18SMarcel Moolenaar uart_term(struct uart_devinfo *di) 93*27d5dc18SMarcel Moolenaar { 94*27d5dc18SMarcel Moolenaar di->ops.term(&di->bas); 95*27d5dc18SMarcel Moolenaar } 96*27d5dc18SMarcel Moolenaar 97*27d5dc18SMarcel Moolenaar static __inline void 98*27d5dc18SMarcel Moolenaar uart_putc(struct uart_devinfo *di, int c) 99*27d5dc18SMarcel Moolenaar { 100*27d5dc18SMarcel Moolenaar di->ops.putc(&di->bas, c); 101*27d5dc18SMarcel Moolenaar } 102*27d5dc18SMarcel Moolenaar 103*27d5dc18SMarcel Moolenaar static __inline int 104*27d5dc18SMarcel Moolenaar uart_poll(struct uart_devinfo *di) 105*27d5dc18SMarcel Moolenaar { 106*27d5dc18SMarcel Moolenaar return (di->ops.poll(&di->bas)); 107*27d5dc18SMarcel Moolenaar } 108*27d5dc18SMarcel Moolenaar 109*27d5dc18SMarcel Moolenaar static __inline int 110*27d5dc18SMarcel Moolenaar uart_getc(struct uart_devinfo *di) 111*27d5dc18SMarcel Moolenaar { 112*27d5dc18SMarcel Moolenaar return (di->ops.getc(&di->bas)); 113*27d5dc18SMarcel Moolenaar } 114*27d5dc18SMarcel Moolenaar 115*27d5dc18SMarcel Moolenaar #endif /* _DEV_UART_CPU_H_ */ 116