summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--drivers/serial/8250.c33
1 files changed, 25 insertions, 8 deletions
diff --git a/drivers/serial/8250.c b/drivers/serial/8250.c
index bd03496f1276..307a7697b488 100644
--- a/drivers/serial/8250.c
+++ b/drivers/serial/8250.c
@@ -2217,6 +2217,12 @@ static struct device_driver serial8250_isa_driver = {
};
/*
+ * This "device" covers _all_ ISA 8250-compatible serial devices listed
+ * in the table in include/asm-*/serial.h
+ */
+static struct platform_device *serial8250_isa_devs;
+
+/*
* serial8250_register_port and serial8250_unregister_port allows for
* 16x50 serial ports to be configured at run-time, to support PCMCIA
* modems and PCI multiport cards.
@@ -2336,7 +2342,7 @@ void serial8250_unregister_port(int line)
uart_remove_one_port(&serial8250_reg, &uart->port);
uart->port.flags &= ~UPF_BOOT_AUTOCONF;
uart->port.type = PORT_UNKNOWN;
- uart->port.dev = NULL;
+ uart->port.dev = &serial8250_isa_devs->dev;
uart_add_one_port(&serial8250_reg, &uart->port);
up(&serial_sem);
}
@@ -2357,14 +2363,20 @@ static int __init serial8250_init(void)
if (ret)
goto out;
- serial8250_register_ports(&serial8250_reg, NULL);
-
- ret = driver_register(&serial8250_isa_driver);
- if (ret)
+ serial8250_isa_devs = platform_device_register_simple("serial8250",
+ -1, NULL, 0);
+ if (IS_ERR(serial8250_isa_devs)) {
+ ret = PTR_ERR(serial8250_isa_devs);
goto unreg;
+ }
- goto out;
+ serial8250_register_ports(&serial8250_reg, &serial8250_isa_devs->dev);
+ ret = driver_register(&serial8250_isa_driver);
+ if (ret == 0)
+ goto out;
+
+ platform_device_unregister(serial8250_isa_devs);
unreg:
uart_unregister_driver(&serial8250_reg);
out:
@@ -2377,8 +2389,13 @@ static void __exit serial8250_exit(void)
driver_unregister(&serial8250_isa_driver);
- for (i = 0; i < UART_NR; i++)
- uart_remove_one_port(&serial8250_reg, &serial8250_ports[i].port);
+ for (i = 0; i < UART_NR; i++) {
+ struct uart_8250_port *up = &serial8250_ports[i];
+ if (up->port.dev == &serial8250_isa_devs->dev)
+ uart_remove_one_port(&serial8250_reg, &up->port);
+ }
+
+ platform_device_unregister(serial8250_isa_devs);
uart_unregister_driver(&serial8250_reg);
}