serial: samsung: Move uart_register_driver call to device probe
authorTushar Behera <tushar.behera@linaro.org>
Mon, 20 Jan 2014 09:02:34 +0000 (14:32 +0530)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 13 Feb 2014 18:32:59 +0000 (10:32 -0800)
uart_register_driver call binds the driver to a specific device
node through tty_register_driver call. This should typically happen
during device probe call.

In a multiplatform scenario, it is possible that multiple serial
drivers are part of the kernel. Currently the driver registration fails
if multiple serial drivers with same default major/minor numbers are
included in the kernel.

A typical case is observed with amba-pl011 and samsung-uart drivers.

Signed-off-by: Tushar Behera <tushar.behera@linaro.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/tty/serial/samsung.c

index 9cd706df3b3351cbfa10fa14c254b36724601cc1..23f4596007382501589476b885d269bcce1484a6 100644 (file)
@@ -1282,6 +1282,14 @@ static int s3c24xx_serial_probe(struct platform_device *pdev)
        if (ret < 0)
                goto probe_err;
 
+       if (!s3c24xx_uart_drv.state) {
+               ret = uart_register_driver(&s3c24xx_uart_drv);
+               if (ret < 0) {
+                       pr_err("Failed to register Samsung UART driver\n");
+                       return ret;
+               }
+       }
+
        dbg("%s: adding port\n", __func__);
        uart_add_one_port(&s3c24xx_uart_drv, &ourport->port);
        platform_set_drvdata(pdev, &ourport->port);
@@ -1321,6 +1329,8 @@ static int s3c24xx_serial_remove(struct platform_device *dev)
                uart_remove_one_port(&s3c24xx_uart_drv, port);
        }
 
+       uart_unregister_driver(&s3c24xx_uart_drv);
+
        return 0;
 }
 
@@ -1820,35 +1830,7 @@ static struct platform_driver samsung_serial_driver = {
        },
 };
 
-/* module initialisation code */
-
-static int __init s3c24xx_serial_modinit(void)
-{
-       int ret;
-
-       ret = uart_register_driver(&s3c24xx_uart_drv);
-       if (ret < 0) {
-               pr_err("Failed to register Samsung UART driver\n");
-               return ret;
-       }
-
-       ret = platform_driver_register(&samsung_serial_driver);
-       if (ret < 0) {
-               pr_err("Failed to register platform driver\n");
-               uart_unregister_driver(&s3c24xx_uart_drv);
-       }
-
-       return ret;
-}
-
-static void __exit s3c24xx_serial_modexit(void)
-{
-       platform_driver_unregister(&samsung_serial_driver);
-       uart_unregister_driver(&s3c24xx_uart_drv);
-}
-
-module_init(s3c24xx_serial_modinit);
-module_exit(s3c24xx_serial_modexit);
+module_platform_driver(samsung_serial_driver);
 
 MODULE_ALIAS("platform:samsung-uart");
 MODULE_DESCRIPTION("Samsung SoC Serial port driver");