127d5dc18SMarcel Moolenaar /* 227d5dc18SMarcel Moolenaar * Copyright (c) 2003 Marcel Moolenaar 327d5dc18SMarcel Moolenaar * All rights reserved. 427d5dc18SMarcel Moolenaar * 527d5dc18SMarcel Moolenaar * Redistribution and use in source and binary forms, with or without 627d5dc18SMarcel Moolenaar * modification, are permitted provided that the following conditions 727d5dc18SMarcel Moolenaar * are met: 827d5dc18SMarcel Moolenaar * 927d5dc18SMarcel Moolenaar * 1. Redistributions of source code must retain the above copyright 1027d5dc18SMarcel Moolenaar * notice, this list of conditions and the following disclaimer. 1127d5dc18SMarcel Moolenaar * 2. Redistributions in binary form must reproduce the above copyright 1227d5dc18SMarcel Moolenaar * notice, this list of conditions and the following disclaimer in the 1327d5dc18SMarcel Moolenaar * documentation and/or other materials provided with the distribution. 1427d5dc18SMarcel Moolenaar * 1527d5dc18SMarcel Moolenaar * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 1627d5dc18SMarcel Moolenaar * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 1727d5dc18SMarcel Moolenaar * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 1827d5dc18SMarcel Moolenaar * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 1927d5dc18SMarcel Moolenaar * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 2027d5dc18SMarcel Moolenaar * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 2127d5dc18SMarcel Moolenaar * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 2227d5dc18SMarcel Moolenaar * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 2327d5dc18SMarcel Moolenaar * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 2427d5dc18SMarcel Moolenaar * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 2527d5dc18SMarcel Moolenaar * 2627d5dc18SMarcel Moolenaar * $FreeBSD$ 2727d5dc18SMarcel Moolenaar */ 2827d5dc18SMarcel Moolenaar 2927d5dc18SMarcel Moolenaar #ifndef _DEV_UART_CPU_H_ 3027d5dc18SMarcel Moolenaar #define _DEV_UART_CPU_H_ 3127d5dc18SMarcel Moolenaar 3227d5dc18SMarcel Moolenaar /* 3327d5dc18SMarcel Moolenaar * Low-level operations for use by console and/or debug port support. 3427d5dc18SMarcel Moolenaar */ 3527d5dc18SMarcel Moolenaar struct uart_ops { 3627d5dc18SMarcel Moolenaar int (*probe)(struct uart_bas *); 3727d5dc18SMarcel Moolenaar void (*init)(struct uart_bas *, int, int, int, int); 3827d5dc18SMarcel Moolenaar void (*term)(struct uart_bas *); 3927d5dc18SMarcel Moolenaar void (*putc)(struct uart_bas *, int); 4027d5dc18SMarcel Moolenaar int (*poll)(struct uart_bas *); 4127d5dc18SMarcel Moolenaar int (*getc)(struct uart_bas *); 4227d5dc18SMarcel Moolenaar }; 4327d5dc18SMarcel Moolenaar 44af1af2d2SWarner Losh extern struct uart_ops uart_i8251_ops; 4527d5dc18SMarcel Moolenaar extern struct uart_ops uart_ns8250_ops; 4627d5dc18SMarcel Moolenaar extern struct uart_ops uart_sab82532_ops; 4727d5dc18SMarcel Moolenaar extern struct uart_ops uart_z8530_ops; 4827d5dc18SMarcel Moolenaar 4927d5dc18SMarcel Moolenaar /* 5027d5dc18SMarcel Moolenaar * Console and debug port device info. 5127d5dc18SMarcel Moolenaar */ 5227d5dc18SMarcel Moolenaar struct uart_softc; 5327d5dc18SMarcel Moolenaar struct uart_devinfo { 5427d5dc18SMarcel Moolenaar SLIST_ENTRY(uart_devinfo) next; 5527d5dc18SMarcel Moolenaar struct uart_ops ops; 5627d5dc18SMarcel Moolenaar struct uart_bas bas; 5727d5dc18SMarcel Moolenaar int baudrate; 5827d5dc18SMarcel Moolenaar int databits; 5927d5dc18SMarcel Moolenaar int stopbits; 6027d5dc18SMarcel Moolenaar int parity; 6127d5dc18SMarcel Moolenaar int type; 6227d5dc18SMarcel Moolenaar #define UART_DEV_CONSOLE 0 6327d5dc18SMarcel Moolenaar #define UART_DEV_DBGPORT 1 6427d5dc18SMarcel Moolenaar #define UART_DEV_KEYBOARD 2 6527d5dc18SMarcel Moolenaar int (*attach)(struct uart_softc*); 6627d5dc18SMarcel Moolenaar int (*detach)(struct uart_softc*); 6727d5dc18SMarcel Moolenaar void *cookie; /* Type dependent use. */ 6827d5dc18SMarcel Moolenaar }; 6927d5dc18SMarcel Moolenaar 70*5cc70551SMarcel Moolenaar bus_addr_t uart_cpu_busaddr(struct uart_bas *); 71*5cc70551SMarcel Moolenaar int uart_cpu_eqres(struct uart_bas *, struct uart_bas *); 72*5cc70551SMarcel Moolenaar int uart_cpu_getdev(int, struct uart_devinfo *); 7327d5dc18SMarcel Moolenaar 7427d5dc18SMarcel Moolenaar void uart_add_sysdev(struct uart_devinfo*); 7527d5dc18SMarcel Moolenaar 7627d5dc18SMarcel Moolenaar /* 7727d5dc18SMarcel Moolenaar * Operations for low-level access to the UART. Primarily for use 7827d5dc18SMarcel Moolenaar * by console and debug port logic. 7927d5dc18SMarcel Moolenaar */ 8027d5dc18SMarcel Moolenaar static __inline int 8127d5dc18SMarcel Moolenaar uart_probe(struct uart_devinfo *di) 8227d5dc18SMarcel Moolenaar { 8327d5dc18SMarcel Moolenaar return (di->ops.probe(&di->bas)); 8427d5dc18SMarcel Moolenaar } 8527d5dc18SMarcel Moolenaar 8627d5dc18SMarcel Moolenaar static __inline void 8727d5dc18SMarcel Moolenaar uart_init(struct uart_devinfo *di) 8827d5dc18SMarcel Moolenaar { 8927d5dc18SMarcel Moolenaar di->ops.init(&di->bas, di->baudrate, di->databits, di->stopbits, 9027d5dc18SMarcel Moolenaar di->parity); 9127d5dc18SMarcel Moolenaar } 9227d5dc18SMarcel Moolenaar 9327d5dc18SMarcel Moolenaar static __inline void 9427d5dc18SMarcel Moolenaar uart_term(struct uart_devinfo *di) 9527d5dc18SMarcel Moolenaar { 9627d5dc18SMarcel Moolenaar di->ops.term(&di->bas); 9727d5dc18SMarcel Moolenaar } 9827d5dc18SMarcel Moolenaar 9927d5dc18SMarcel Moolenaar static __inline void 10027d5dc18SMarcel Moolenaar uart_putc(struct uart_devinfo *di, int c) 10127d5dc18SMarcel Moolenaar { 10227d5dc18SMarcel Moolenaar di->ops.putc(&di->bas, c); 10327d5dc18SMarcel Moolenaar } 10427d5dc18SMarcel Moolenaar 10527d5dc18SMarcel Moolenaar static __inline int 10627d5dc18SMarcel Moolenaar uart_poll(struct uart_devinfo *di) 10727d5dc18SMarcel Moolenaar { 10827d5dc18SMarcel Moolenaar return (di->ops.poll(&di->bas)); 10927d5dc18SMarcel Moolenaar } 11027d5dc18SMarcel Moolenaar 11127d5dc18SMarcel Moolenaar static __inline int 11227d5dc18SMarcel Moolenaar uart_getc(struct uart_devinfo *di) 11327d5dc18SMarcel Moolenaar { 11427d5dc18SMarcel Moolenaar return (di->ops.getc(&di->bas)); 11527d5dc18SMarcel Moolenaar } 11627d5dc18SMarcel Moolenaar 11727d5dc18SMarcel Moolenaar #endif /* _DEV_UART_CPU_H_ */ 118