uart_cpu_pc98.c revision 120379
1215976Sjmallett/* 2232812Sjmallett * Copyright (c) 2003 M. Warner Losh, Marcel Moolenaar 3215976Sjmallett * All rights reserved. 4215976Sjmallett * 5215976Sjmallett * Redistribution and use in source and binary forms, with or without 6215976Sjmallett * modification, are permitted provided that the following conditions 7215976Sjmallett * are met: 8215976Sjmallett * 9215976Sjmallett * 1. Redistributions of source code must retain the above copyright 10215976Sjmallett * notice, this list of conditions and the following disclaimer. 11215976Sjmallett * 2. Redistributions in binary form must reproduce the above copyright 12215976Sjmallett * notice, this list of conditions and the following disclaimer in the 13215976Sjmallett * documentation and/or other materials provided with the distribution. 14215976Sjmallett * 15215976Sjmallett * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 16215976Sjmallett * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 17215976Sjmallett * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 18232812Sjmallett * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 19215976Sjmallett * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 20215976Sjmallett * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 21215976Sjmallett * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 22215976Sjmallett * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 23215976Sjmallett * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 24215976Sjmallett * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 25215976Sjmallett */ 26215976Sjmallett 27215976Sjmallett#include <sys/cdefs.h> 28215976Sjmallett__FBSDID("$FreeBSD: head/sys/dev/uart/uart_cpu_pc98.c 120379 2003-09-23 09:49:37Z nyan $"); 29232812Sjmallett 30215976Sjmallett#include <sys/param.h> 31215976Sjmallett#include <sys/systm.h> 32215976Sjmallett#include <sys/bus.h> 33215976Sjmallett 34215976Sjmallett#include <machine/bus.h> 35215976Sjmallett 36215976Sjmallett#include <dev/uart/uart.h> 37215976Sjmallett#include <dev/uart/uart_cpu.h> 38215976Sjmallett 39215976Sjmallettint 40215976Sjmallettuart_cpu_eqres(struct uart_bas *b1, struct uart_bas *b2) 41215976Sjmallett{ 42215976Sjmallett 43215976Sjmallett return ((b1->iobase == b2->iobase && b1->bst == b2->bst) ? 1 : 0); 44215976Sjmallett} 45215976Sjmallett 46215976Sjmallettint 47215976Sjmallettuart_cpu_getdev(int devtype, struct uart_devinfo *di) 48215976Sjmallett{ 49215976Sjmallett unsigned int i, ivar, flags; 50215976Sjmallett 51215976Sjmallett /* 52232812Sjmallett * There are 2 built-in serial ports on pc98 hardware. The 53232812Sjmallett * first one is 8251 and the second one is I think an enhance 54215976Sjmallett * version of that. However, for the sio driver, flags selected 55215976Sjmallett * which type of uart was in the sytem. We use something similar 56215976Sjmallett * to sort things out. 57232812Sjmallett */ 58232812Sjmallett for (i = 0; i < 1; i++) { 59232812Sjmallett if (resource_int_value("uart", i, "flags", &flags)) 60232812Sjmallett continue; 61232812Sjmallett if (devtype == UART_DEV_CONSOLE && !UART_FLAGS_CONSOLE(flags)) 62232812Sjmallett continue; 63232812Sjmallett if (devtype == UART_DEV_DBGPORT && !UART_FLAGS_DBGPORT(flags)) 64232812Sjmallett continue; 65232812Sjmallett /* 66232812Sjmallett * We have a possible device. Make sure it's enabled and 67232812Sjmallett * that we have an I/O port. 68232812Sjmallett */ 69232812Sjmallett if (resource_int_value("uart", i, "disabled", &ivar) == 0 && 70232812Sjmallett ivar != 0) 71232812Sjmallett continue; 72232812Sjmallett if (resource_int_value("uart", i, "port", &ivar) != 0 || 73232812Sjmallett ivar == 0) 74232812Sjmallett continue; 75232812Sjmallett /* 76215976Sjmallett * Got it. Fill in the instance and return it. We have 77215976Sjmallett * both i8251 an ns8250 and successors on pc98. 78215976Sjmallett */ 79232812Sjmallett if (flags & 0x100) 80232812Sjmallett di->ops = uart_ns8250_ops; 81232812Sjmallett else 82232812Sjmallett di->ops = uart_i8251_ops; 83232812Sjmallett di->bas.iobase = ivar; 84232812Sjmallett di->bas.bst = I386_BUS_SPACE_IO; 85232812Sjmallett if (bus_space_map(di->bas.bst, ivar, 8, 0, &di->bas.bsh) != 0) 86232812Sjmallett return (ENXIO); 87232812Sjmallett di->bas.regshft = 0; 88232812Sjmallett di->bas.rclk = 0; 89232812Sjmallett if (resource_int_value("uart", i, "baud", &ivar) != 0) 90232812Sjmallett ivar = 0; 91232812Sjmallett di->baudrate = ivar; 92232812Sjmallett di->databits = 8; 93232812Sjmallett di->stopbits = 1; 94232812Sjmallett di->parity = UART_PARITY_NONE; 95232812Sjmallett return (0); 96232812Sjmallett } 97232812Sjmallett 98215976Sjmallett return (ENXIO); 99215976Sjmallett} 100215976Sjmallett