summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authornyan <nyan@FreeBSD.org>2008-08-25 14:45:24 +0000
committernyan <nyan@FreeBSD.org>2008-08-25 14:45:24 +0000
commit848a954cf438588fa15a30f37d3b363b5deb618e (patch)
tree240f9808095c9e96d0ac86fca8d3e79916f8b2b8
parentacf5da1d357825978c6574d39909901e5174e4a7 (diff)
downloadFreeBSD-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
-rw-r--r--sys/dev/uart/uart.h4
-rw-r--r--sys/dev/uart/uart_bus_isa.c36
-rw-r--r--sys/dev/uart/uart_cpu_pc98.c44
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;
OpenPOWER on IntegriCloud