8250_pnp: do pnp probe before legacy probe
[cascardo/linux.git] / drivers / tty / serial / 8250 / 8250.c
index 932a216..a2042c6 100644 (file)
@@ -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