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 | |
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')
-rw-r--r-- | sys/dev/uart/uart.h | 4 | ||||
-rw-r--r-- | sys/dev/uart/uart_bus_isa.c | 36 | ||||
-rw-r--r-- | sys/dev/uart/uart_cpu_pc98.c | 44 |
3 files changed, 68 insertions, 16 deletions
diff --git a/sys/dev/uart/uart.h b/sys/dev/uart/uart.h index ed980eb..eb66da0 100644 --- a/sys/dev/uart/uart.h +++ b/sys/dev/uart/uart.h @@ -69,6 +69,10 @@ extern struct uart_class uart_quicc_class __attribute__((weak)); extern struct uart_class uart_sab82532_class __attribute__((weak)); extern struct uart_class uart_z8530_class __attribute__((weak)); +#ifdef PC98 +struct uart_class *uart_pc98_getdev(u_long port); +#endif + /* * Device flags. */ diff --git a/sys/dev/uart/uart_bus_isa.c b/sys/dev/uart/uart_bus_isa.c index 51713ad..0f33ea9 100644 --- a/sys/dev/uart/uart_bus_isa.c +++ b/sys/dev/uart/uart_bus_isa.c @@ -1,5 +1,8 @@ /*- - * Copyright (c) 2001 M. Warner Losh. All rights reserved. + * Copyright (c) 2008 TAKAHASHI Yoshihiro + * Copyright (c) 2008 Marcel Moolenaar + * Copyright (c) 2001 M. Warner Losh + * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions @@ -141,6 +144,18 @@ static struct isa_pnp_id isa_ns8250_ids[] = { {0x0300695c, NULL}, /* WCI0003 - Fax/Voice/Modem/Speakphone/Asvd */ {0x01a0896a, NULL}, /* ZTIA001 - Zoom Internal V90 Faxmodem */ {0x61f7896a, NULL}, /* ZTIF761 - Zoom ComStar 33.6 */ + /* The following are found in PC98 hardware. */ + {0x4180a3b8, NULL}, /* NEC8041 - PC-9821CB-B04 */ + {0x0181a3b8, NULL}, /* NEC8101 - PC-9821CB2-B04 */ + {0x5181a3b8, NULL}, /* NEC8151 - Internal FAX/Modem for Cx3, Cb3 */ + {0x9181a3b8, NULL}, /* NEC8191 - PC-9801-120 */ + {0xe181a3b8, NULL}, /* NEC81E1 - Internal FAX/Modem */ + {0x1182a3b8, NULL}, /* NEC8211 - PC-9801-123 */ + {0x3182a3b8, NULL}, /* NEC8231 - Internal FAX/Modem (Voice) */ + {0x4182a3b8, NULL}, /* NEC8241 - PC-9821NR-B05 */ + {0x5182a3b8, NULL}, /* NEC8251 - Internel FAX/Modem */ + {0x7182a3b8, NULL}, /* NEC8271 - PC-9801-125 */ + {0x11802fbf, NULL}, /* OYO8011 - Internal FAX/Modem (Ring) */ {0} }; @@ -153,14 +168,21 @@ uart_isa_probe(device_t dev) parent = device_get_parent(dev); sc = device_get_softc(dev); + /* Check PnP IDs */ + if (ISA_PNP_PROBE(parent, dev, isa_ns8250_ids) == ENXIO) + return (ENXIO); + /* Probe PnP _and_ non-PnP ns8250 here. */ - if (ISA_PNP_PROBE(parent, dev, isa_ns8250_ids) != ENXIO) { +#ifdef PC98 + if (isa_get_logicalid(dev)) sc->sc_class = &uart_ns8250_class; - return (uart_bus_probe(dev, 0, 0, 0, 0)); - } - - /* Add checks for non-ns8250 IDs here. */ - return (ENXIO); + else + sc->sc_class = uart_pc98_getdev(bus_get_resource_start(dev, + SYS_RES_IOPORT, 0)); +#else + sc->sc_class = &uart_ns8250_class; +#endif + return (uart_bus_probe(dev, 0, 0, 0, 0)); } DRIVER_MODULE(uart, isa, uart_isa_driver, uart_devclass, 0, 0); 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; |