|
@@ -2675,6 +2675,9 @@ static void __init serial8250_isa_init_ports(void)
|
|
|
return;
|
|
|
first = 0;
|
|
|
|
|
|
+ if (nr_uarts > UART_NR)
|
|
|
+ nr_uarts = UART_NR;
|
|
|
+
|
|
|
for (i = 0; i < nr_uarts; i++) {
|
|
|
struct uart_8250_port *up = &serial8250_ports[i];
|
|
|
struct uart_port *port = &up->port;
|
|
@@ -2684,6 +2687,7 @@ static void __init serial8250_isa_init_ports(void)
|
|
|
|
|
|
init_timer(&up->timer);
|
|
|
up->timer.function = serial8250_timeout;
|
|
|
+ up->cur_iotype = 0xFF;
|
|
|
|
|
|
/*
|
|
|
* ALPHA_KLUDGE_MCR needs to be killed.
|
|
@@ -2735,13 +2739,9 @@ serial8250_register_ports(struct uart_driver *drv, struct device *dev)
|
|
|
|
|
|
for (i = 0; i < nr_uarts; i++) {
|
|
|
struct uart_8250_port *up = &serial8250_ports[i];
|
|
|
- up->cur_iotype = 0xFF;
|
|
|
- }
|
|
|
|
|
|
- serial8250_isa_init_ports();
|
|
|
-
|
|
|
- for (i = 0; i < nr_uarts; i++) {
|
|
|
- struct uart_8250_port *up = &serial8250_ports[i];
|
|
|
+ if (up->port.dev)
|
|
|
+ continue;
|
|
|
|
|
|
up->port.dev = dev;
|
|
|
|
|
@@ -2866,9 +2866,6 @@ static struct console serial8250_console = {
|
|
|
|
|
|
static int __init serial8250_console_init(void)
|
|
|
{
|
|
|
- if (nr_uarts > UART_NR)
|
|
|
- nr_uarts = UART_NR;
|
|
|
-
|
|
|
serial8250_isa_init_ports();
|
|
|
register_console(&serial8250_console);
|
|
|
return 0;
|
|
@@ -3151,7 +3148,8 @@ int serial8250_register_8250_port(struct uart_8250_port *up)
|
|
|
|
|
|
uart = serial8250_find_match_or_unused(&up->port);
|
|
|
if (uart) {
|
|
|
- uart_remove_one_port(&serial8250_reg, &uart->port);
|
|
|
+ if (uart->port.dev)
|
|
|
+ uart_remove_one_port(&serial8250_reg, &uart->port);
|
|
|
|
|
|
uart->port.iobase = up->port.iobase;
|
|
|
uart->port.membase = up->port.membase;
|
|
@@ -3235,8 +3233,7 @@ static int __init serial8250_init(void)
|
|
|
{
|
|
|
int ret;
|
|
|
|
|
|
- if (nr_uarts > UART_NR)
|
|
|
- nr_uarts = UART_NR;
|
|
|
+ serial8250_isa_init_ports();
|
|
|
|
|
|
printk(KERN_INFO "Serial: 8250/16550 driver, "
|
|
|
"%d ports, IRQ sharing %sabled\n", nr_uarts,
|
|
@@ -3251,11 +3248,15 @@ static int __init serial8250_init(void)
|
|
|
if (ret)
|
|
|
goto out;
|
|
|
|
|
|
+ ret = serial8250_pnp_init();
|
|
|
+ if (ret)
|
|
|
+ goto unreg_uart_drv;
|
|
|
+
|
|
|
serial8250_isa_devs = platform_device_alloc("serial8250",
|
|
|
PLAT8250_DEV_LEGACY);
|
|
|
if (!serial8250_isa_devs) {
|
|
|
ret = -ENOMEM;
|
|
|
- goto unreg_uart_drv;
|
|
|
+ goto unreg_pnp;
|
|
|
}
|
|
|
|
|
|
ret = platform_device_add(serial8250_isa_devs);
|
|
@@ -3271,6 +3272,8 @@ static int __init serial8250_init(void)
|
|
|
platform_device_del(serial8250_isa_devs);
|
|
|
put_dev:
|
|
|
platform_device_put(serial8250_isa_devs);
|
|
|
+unreg_pnp:
|
|
|
+ serial8250_pnp_exit();
|
|
|
unreg_uart_drv:
|
|
|
#ifdef CONFIG_SPARC
|
|
|
sunserial_unregister_minors(&serial8250_reg, UART_NR);
|
|
@@ -3295,6 +3298,8 @@ static void __exit serial8250_exit(void)
|
|
|
platform_driver_unregister(&serial8250_isa_driver);
|
|
|
platform_device_unregister(isa_dev);
|
|
|
|
|
|
+ serial8250_pnp_exit();
|
|
|
+
|
|
|
#ifdef CONFIG_SPARC
|
|
|
sunserial_unregister_minors(&serial8250_reg, UART_NR);
|
|
|
#else
|