TTY: serial/mpsc, clean up init/remove functions
authorJiri Slaby <jslaby@suse.cz>
Tue, 12 Jan 2016 09:49:33 +0000 (10:49 +0100)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Sun, 7 Feb 2016 06:16:21 +0000 (22:16 -0800)
There is a chain of up to 4 nested ifs in init and remove functions.
Instead, make the code linear and use goto's to handle failures.

Remove unneeded cast from mpsc_release_port by referencing pi->port
directly. And finally, use dev_dbg instead of pr_debug given we have
dev->dev node.

Signed-off-by: Jiri Slaby <jslaby@suse.cz>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/tty/serial/mpsc.c

index 3637729..44a2311 100644 (file)
@@ -1891,44 +1891,39 @@ static void mpsc_shared_unmap_regs(void)
 static int mpsc_shared_drv_probe(struct platform_device *dev)
 {
        struct mpsc_shared_pdata        *pdata;
-       int                              rc = -ENODEV;
-
-       if (dev->id == 0) {
-               rc = mpsc_shared_map_regs(dev);
-               if (!rc) {
-                       pdata = (struct mpsc_shared_pdata *)
-                               dev_get_platdata(&dev->dev);
-
-                       mpsc_shared_regs.MPSC_MRR_m = pdata->mrr_val;
-                       mpsc_shared_regs.MPSC_RCRR_m= pdata->rcrr_val;
-                       mpsc_shared_regs.MPSC_TCRR_m= pdata->tcrr_val;
-                       mpsc_shared_regs.SDMA_INTR_CAUSE_m =
-                               pdata->intr_cause_val;
-                       mpsc_shared_regs.SDMA_INTR_MASK_m =
-                               pdata->intr_mask_val;
-
-                       rc = 0;
-               }
-       }
+       int rc;
 
-       return rc;
+       if (dev->id != 0)
+               return -ENODEV;
+
+       rc = mpsc_shared_map_regs(dev);
+       if (rc)
+               return rc;
+
+       pdata = dev_get_platdata(&dev->dev);
+
+       mpsc_shared_regs.MPSC_MRR_m = pdata->mrr_val;
+       mpsc_shared_regs.MPSC_RCRR_m= pdata->rcrr_val;
+       mpsc_shared_regs.MPSC_TCRR_m= pdata->tcrr_val;
+       mpsc_shared_regs.SDMA_INTR_CAUSE_m = pdata->intr_cause_val;
+       mpsc_shared_regs.SDMA_INTR_MASK_m = pdata->intr_mask_val;
+
+       return 0;
 }
 
 static int mpsc_shared_drv_remove(struct platform_device *dev)
 {
-       int     rc = -ENODEV;
+       if (dev->id != 0)
+               return -ENODEV;
 
-       if (dev->id == 0) {
-               mpsc_shared_unmap_regs();
-               mpsc_shared_regs.MPSC_MRR_m = 0;
-               mpsc_shared_regs.MPSC_RCRR_m = 0;
-               mpsc_shared_regs.MPSC_TCRR_m = 0;
-               mpsc_shared_regs.SDMA_INTR_CAUSE_m = 0;
-               mpsc_shared_regs.SDMA_INTR_MASK_m = 0;
-               rc = 0;
-       }
+       mpsc_shared_unmap_regs();
+       mpsc_shared_regs.MPSC_MRR_m = 0;
+       mpsc_shared_regs.MPSC_RCRR_m = 0;
+       mpsc_shared_regs.MPSC_TCRR_m = 0;
+       mpsc_shared_regs.SDMA_INTR_CAUSE_m = 0;
+       mpsc_shared_regs.SDMA_INTR_MASK_m = 0;
 
-       return rc;
+       return 0;
 }
 
 static struct platform_driver mpsc_shared_driver = {
@@ -1979,10 +1974,6 @@ static int mpsc_drv_map_regs(struct mpsc_port_info *pi,
                pi->sdma_base_p = r->start;
        } else {
                mpsc_resource_err("SDMA base");
-               if (pi->mpsc_base) {
-                       iounmap(pi->mpsc_base);
-                       pi->mpsc_base = NULL;
-               }
                goto err;
        }
 
@@ -1993,19 +1984,19 @@ static int mpsc_drv_map_regs(struct mpsc_port_info *pi,
                pi->brg_base_p = r->start;
        } else {
                mpsc_resource_err("BRG base");
-               if (pi->mpsc_base) {
-                       iounmap(pi->mpsc_base);
-                       pi->mpsc_base = NULL;
-               }
-               if (pi->sdma_base) {
-                       iounmap(pi->sdma_base);
-                       pi->sdma_base = NULL;
-               }
                goto err;
        }
        return 0;
 
 err:
+       if (pi->sdma_base) {
+               iounmap(pi->sdma_base);
+               pi->sdma_base = NULL;
+       }
+       if (pi->mpsc_base) {
+               iounmap(pi->mpsc_base);
+               pi->mpsc_base = NULL;
+       }
        return -ENOMEM;
 }
 
@@ -2073,36 +2064,37 @@ static void mpsc_drv_get_platform_data(struct mpsc_port_info *pi,
 
 static int mpsc_drv_probe(struct platform_device *dev)
 {
-       struct mpsc_port_info   *pi;
-       int                     rc = -ENODEV;
-
-       pr_debug("mpsc_drv_probe: Adding MPSC %d\n", dev->id);
-
-       if (dev->id < MPSC_NUM_CTLRS) {
-               pi = &mpsc_ports[dev->id];
-
-               rc = mpsc_drv_map_regs(pi, dev);
-               if (!rc) {
-                       mpsc_drv_get_platform_data(pi, dev, dev->id);
-                       pi->port.dev = &dev->dev;
-
-                       rc = mpsc_make_ready(pi);
-                       if (!rc) {
-                               spin_lock_init(&pi->tx_lock);
-                               rc = uart_add_one_port(&mpsc_reg, &pi->port);
-                               if (!rc) {
-                                       rc = 0;
-                               } else {
-                                       mpsc_release_port((struct uart_port *)
-                                                       pi);
-                                       mpsc_drv_unmap_regs(pi);
-                               }
-                       } else {
-                               mpsc_drv_unmap_regs(pi);
-                       }
-               }
-       }
+       struct mpsc_port_info *pi;
+       int rc;
+
+       dev_dbg(&dev->dev, "mpsc_drv_probe: Adding MPSC %d\n", dev->id);
+
+       if (dev->id >= MPSC_NUM_CTLRS)
+               return -ENODEV;
+
+       pi = &mpsc_ports[dev->id];
+
+       rc = mpsc_drv_map_regs(pi, dev);
+       if (rc)
+               return rc;
 
+       mpsc_drv_get_platform_data(pi, dev, dev->id);
+       pi->port.dev = &dev->dev;
+
+       rc = mpsc_make_ready(pi);
+       if (rc)
+               goto err_unmap;
+
+       spin_lock_init(&pi->tx_lock);
+       rc = uart_add_one_port(&mpsc_reg, &pi->port);
+       if (rc)
+               goto err_relport;
+
+       return 0;
+err_relport:
+       mpsc_release_port(&pi->port);
+err_unmap:
+       mpsc_drv_unmap_regs(pi);
        return rc;
 }
 
@@ -2124,19 +2116,22 @@ static int __init mpsc_drv_init(void)
        memset(&mpsc_shared_regs, 0, sizeof(mpsc_shared_regs));
 
        rc = uart_register_driver(&mpsc_reg);
-       if (!rc) {
-               rc = platform_driver_register(&mpsc_shared_driver);
-               if (!rc) {
-                       rc = platform_driver_register(&mpsc_driver);
-                       if (rc) {
-                               platform_driver_unregister(&mpsc_shared_driver);
-                               uart_unregister_driver(&mpsc_reg);
-                       }
-               } else {
-                       uart_unregister_driver(&mpsc_reg);
-               }
-       }
+       if (rc)
+               return rc;
+
+       rc = platform_driver_register(&mpsc_shared_driver);
+       if (rc)
+               goto err_unreg_uart;
 
+       rc = platform_driver_register(&mpsc_driver);
+       if (rc)
+               goto err_unreg_plat;
+
+       return 0;
+err_unreg_plat:
+       platform_driver_unregister(&mpsc_shared_driver);
+err_unreg_uart:
+       uart_unregister_driver(&mpsc_reg);
        return rc;
 }
 device_initcall(mpsc_drv_init);