diff options
author | nyan <nyan@FreeBSD.org> | 2008-08-25 14:45:24 +0000 |
---|---|---|
committer | nyan <nyan@FreeBSD.org> | 2008-08-25 14:45:24 +0000 |
commit | 848a954cf438588fa15a30f37d3b363b5deb618e (patch) | |
tree | 240f9808095c9e96d0ac86fca8d3e79916f8b2b8 /sys/dev/uart/uart_cpu_pc98.c | |
parent | acf5da1d357825978c6574d39909901e5174e4a7 (diff) | |
download | FreeBSD-src-848a954cf438588fa15a30f37d3b363b5deb618e.zip FreeBSD-src-848a954cf438588fa15a30f37d3b363b5deb618e.tar.gz |
Add the 2nd CCU and PnP devices support on pc98.
Reviewed by: imp
Obtained from: //depot/projects/uart with some fixes
Diffstat (limited to 'sys/dev/uart/uart_cpu_pc98.c')
-rw-r--r-- | sys/dev/uart/uart_cpu_pc98.c | 44 |
1 files changed, 35 insertions, 9 deletions
diff --git a/sys/dev/uart/uart_cpu_pc98.c b/sys/dev/uart/uart_cpu_pc98.c index c0c1f4e..455b195 100644 --- a/sys/dev/uart/uart_cpu_pc98.c +++ b/sys/dev/uart/uart_cpu_pc98.c @@ -1,4 +1,5 @@ /*- + * Copyright (c) 2008 TAKAHASHI Yoshihiro * Copyright (c) 2003 M. Warner Losh, Marcel Moolenaar * All rights reserved. * @@ -39,18 +40,41 @@ __FBSDID("$FreeBSD$"); bus_space_tag_t uart_bus_space_io = I386_BUS_SPACE_IO; bus_space_tag_t uart_bus_space_mem = I386_BUS_SPACE_MEM; +static struct { + u_long iobase; + struct uart_class *class; +} uart_pc98_devs[] = { + { 0x238, &uart_ns8250_class }, + { 0, NULL } +}; + +struct uart_class * +uart_pc98_getdev(u_long port) +{ + int i; + + for (i = 0; uart_pc98_devs[i].iobase; i++) { + if (port == uart_pc98_devs[i].iobase) + return (uart_pc98_devs[i].class); + } + return (NULL); +} + int uart_cpu_eqres(struct uart_bas *b1, struct uart_bas *b2) { - return (0); /* XXX */ + if (i386_memio_compare(b1->bst, b1->bsh, b2->bst, b2->bsh) == 0) + return (1); + + return (0); } int uart_cpu_getdev(int devtype, struct uart_devinfo *di) { struct uart_class *class; - unsigned int i, ivar, flags; + unsigned int i, ivar; class = &uart_ns8250_class; if (class == NULL) @@ -63,16 +87,14 @@ uart_cpu_getdev(int devtype, struct uart_devinfo *di) /* * There is a serial port on all pc98 hardware. It is 8251 or * an enhance version of that. Some pc98 have the second serial - * port which is 16550A compatible. However, for the sio driver, - * flags selected which type of uart was in the sytem. We use - * something similar to sort things out. + * port which is 16550A compatible. */ - for (i = 0; i < 1; i++) { - if (resource_int_value("uart", i, "flags", &flags)) + for (i = 0; i < 2; i++) { + if (resource_int_value("uart", i, "flags", &ivar)) continue; - if (devtype == UART_DEV_CONSOLE && !UART_FLAGS_CONSOLE(flags)) + if (devtype == UART_DEV_CONSOLE && !UART_FLAGS_CONSOLE(ivar)) continue; - if (devtype == UART_DEV_DBGPORT && !UART_FLAGS_DBGPORT(flags)) + if (devtype == UART_DEV_DBGPORT && !UART_FLAGS_DBGPORT(ivar)) continue; /* * We have a possible device. Make sure it's enabled and @@ -85,6 +107,10 @@ uart_cpu_getdev(int devtype, struct uart_devinfo *di) ivar == 0) continue; + class = uart_pc98_getdev(ivar); + if (class == NULL) + continue; + di->ops = uart_getops(class); di->bas.chan = 0; di->bas.bst = uart_bus_space_io; |