diff options
author | Jiri Slaby <jslaby@suse.cz> | 2016-01-12 04:49:33 -0500 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2016-02-07 01:16:21 -0500 |
commit | bca1481ec4a0014271b7c220f41d7a790654dfbb (patch) | |
tree | b2f8dd7915084024ad2a5fd5ba3ee636d301f28c | |
parent | 1fba6a594cfd1ea0f1fc8a97e22f43def1505d74 (diff) |
TTY: serial/mpsc, clean up init/remove functions
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>
-rw-r--r-- | drivers/tty/serial/mpsc.c | 163 |
1 files changed, 79 insertions, 84 deletions
diff --git a/drivers/tty/serial/mpsc.c b/drivers/tty/serial/mpsc.c index 363772992acc..44a23113f469 100644 --- a/drivers/tty/serial/mpsc.c +++ b/drivers/tty/serial/mpsc.c | |||
@@ -1891,44 +1891,39 @@ static void mpsc_shared_unmap_regs(void) | |||
1891 | static int mpsc_shared_drv_probe(struct platform_device *dev) | 1891 | static int mpsc_shared_drv_probe(struct platform_device *dev) |
1892 | { | 1892 | { |
1893 | struct mpsc_shared_pdata *pdata; | 1893 | struct mpsc_shared_pdata *pdata; |
1894 | int rc = -ENODEV; | 1894 | int rc; |
1895 | |||
1896 | if (dev->id == 0) { | ||
1897 | rc = mpsc_shared_map_regs(dev); | ||
1898 | if (!rc) { | ||
1899 | pdata = (struct mpsc_shared_pdata *) | ||
1900 | dev_get_platdata(&dev->dev); | ||
1901 | |||
1902 | mpsc_shared_regs.MPSC_MRR_m = pdata->mrr_val; | ||
1903 | mpsc_shared_regs.MPSC_RCRR_m= pdata->rcrr_val; | ||
1904 | mpsc_shared_regs.MPSC_TCRR_m= pdata->tcrr_val; | ||
1905 | mpsc_shared_regs.SDMA_INTR_CAUSE_m = | ||
1906 | pdata->intr_cause_val; | ||
1907 | mpsc_shared_regs.SDMA_INTR_MASK_m = | ||
1908 | pdata->intr_mask_val; | ||
1909 | |||
1910 | rc = 0; | ||
1911 | } | ||
1912 | } | ||
1913 | 1895 | ||
1914 | return rc; | 1896 | if (dev->id != 0) |
1897 | return -ENODEV; | ||
1898 | |||
1899 | rc = mpsc_shared_map_regs(dev); | ||
1900 | if (rc) | ||
1901 | return rc; | ||
1902 | |||
1903 | pdata = dev_get_platdata(&dev->dev); | ||
1904 | |||
1905 | mpsc_shared_regs.MPSC_MRR_m = pdata->mrr_val; | ||
1906 | mpsc_shared_regs.MPSC_RCRR_m= pdata->rcrr_val; | ||
1907 | mpsc_shared_regs.MPSC_TCRR_m= pdata->tcrr_val; | ||
1908 | mpsc_shared_regs.SDMA_INTR_CAUSE_m = pdata->intr_cause_val; | ||
1909 | mpsc_shared_regs.SDMA_INTR_MASK_m = pdata->intr_mask_val; | ||
1910 | |||
1911 | return 0; | ||
1915 | } | 1912 | } |
1916 | 1913 | ||
1917 | static int mpsc_shared_drv_remove(struct platform_device *dev) | 1914 | static int mpsc_shared_drv_remove(struct platform_device *dev) |
1918 | { | 1915 | { |
1919 | int rc = -ENODEV; | 1916 | if (dev->id != 0) |
1917 | return -ENODEV; | ||
1920 | 1918 | ||
1921 | if (dev->id == 0) { | 1919 | mpsc_shared_unmap_regs(); |
1922 | mpsc_shared_unmap_regs(); | 1920 | mpsc_shared_regs.MPSC_MRR_m = 0; |
1923 | mpsc_shared_regs.MPSC_MRR_m = 0; | 1921 | mpsc_shared_regs.MPSC_RCRR_m = 0; |
1924 | mpsc_shared_regs.MPSC_RCRR_m = 0; | 1922 | mpsc_shared_regs.MPSC_TCRR_m = 0; |
1925 | mpsc_shared_regs.MPSC_TCRR_m = 0; | 1923 | mpsc_shared_regs.SDMA_INTR_CAUSE_m = 0; |
1926 | mpsc_shared_regs.SDMA_INTR_CAUSE_m = 0; | 1924 | mpsc_shared_regs.SDMA_INTR_MASK_m = 0; |
1927 | mpsc_shared_regs.SDMA_INTR_MASK_m = 0; | ||
1928 | rc = 0; | ||
1929 | } | ||
1930 | 1925 | ||
1931 | return rc; | 1926 | return 0; |
1932 | } | 1927 | } |
1933 | 1928 | ||
1934 | static struct platform_driver mpsc_shared_driver = { | 1929 | static struct platform_driver mpsc_shared_driver = { |
@@ -1979,10 +1974,6 @@ static int mpsc_drv_map_regs(struct mpsc_port_info *pi, | |||
1979 | pi->sdma_base_p = r->start; | 1974 | pi->sdma_base_p = r->start; |
1980 | } else { | 1975 | } else { |
1981 | mpsc_resource_err("SDMA base"); | 1976 | mpsc_resource_err("SDMA base"); |
1982 | if (pi->mpsc_base) { | ||
1983 | iounmap(pi->mpsc_base); | ||
1984 | pi->mpsc_base = NULL; | ||
1985 | } | ||
1986 | goto err; | 1977 | goto err; |
1987 | } | 1978 | } |
1988 | 1979 | ||
@@ -1993,19 +1984,19 @@ static int mpsc_drv_map_regs(struct mpsc_port_info *pi, | |||
1993 | pi->brg_base_p = r->start; | 1984 | pi->brg_base_p = r->start; |
1994 | } else { | 1985 | } else { |
1995 | mpsc_resource_err("BRG base"); | 1986 | mpsc_resource_err("BRG base"); |
1996 | if (pi->mpsc_base) { | ||
1997 | iounmap(pi->mpsc_base); | ||
1998 | pi->mpsc_base = NULL; | ||
1999 | } | ||
2000 | if (pi->sdma_base) { | ||
2001 | iounmap(pi->sdma_base); | ||
2002 | pi->sdma_base = NULL; | ||
2003 | } | ||
2004 | goto err; | 1987 | goto err; |
2005 | } | 1988 | } |
2006 | return 0; | 1989 | return 0; |
2007 | 1990 | ||
2008 | err: | 1991 | err: |
1992 | if (pi->sdma_base) { | ||
1993 | iounmap(pi->sdma_base); | ||
1994 | pi->sdma_base = NULL; | ||
1995 | } | ||
1996 | if (pi->mpsc_base) { | ||
1997 | iounmap(pi->mpsc_base); | ||
1998 | pi->mpsc_base = NULL; | ||
1999 | } | ||
2009 | return -ENOMEM; | 2000 | return -ENOMEM; |
2010 | } | 2001 | } |
2011 | 2002 | ||
@@ -2073,36 +2064,37 @@ static void mpsc_drv_get_platform_data(struct mpsc_port_info *pi, | |||
2073 | 2064 | ||
2074 | static int mpsc_drv_probe(struct platform_device *dev) | 2065 | static int mpsc_drv_probe(struct platform_device *dev) |
2075 | { | 2066 | { |
2076 | struct mpsc_port_info *pi; | 2067 | struct mpsc_port_info *pi; |
2077 | int rc = -ENODEV; | 2068 | int rc; |
2078 | 2069 | ||
2079 | pr_debug("mpsc_drv_probe: Adding MPSC %d\n", dev->id); | 2070 | dev_dbg(&dev->dev, "mpsc_drv_probe: Adding MPSC %d\n", dev->id); |
2080 | 2071 | ||
2081 | if (dev->id < MPSC_NUM_CTLRS) { | 2072 | if (dev->id >= MPSC_NUM_CTLRS) |
2082 | pi = &mpsc_ports[dev->id]; | 2073 | return -ENODEV; |
2083 | 2074 | ||
2084 | rc = mpsc_drv_map_regs(pi, dev); | 2075 | pi = &mpsc_ports[dev->id]; |
2085 | if (!rc) { | 2076 | |
2086 | mpsc_drv_get_platform_data(pi, dev, dev->id); | 2077 | rc = mpsc_drv_map_regs(pi, dev); |
2087 | pi->port.dev = &dev->dev; | 2078 | if (rc) |
2088 | 2079 | return rc; | |
2089 | rc = mpsc_make_ready(pi); | ||
2090 | if (!rc) { | ||
2091 | spin_lock_init(&pi->tx_lock); | ||
2092 | rc = uart_add_one_port(&mpsc_reg, &pi->port); | ||
2093 | if (!rc) { | ||
2094 | rc = 0; | ||
2095 | } else { | ||
2096 | mpsc_release_port((struct uart_port *) | ||
2097 | pi); | ||
2098 | mpsc_drv_unmap_regs(pi); | ||
2099 | } | ||
2100 | } else { | ||
2101 | mpsc_drv_unmap_regs(pi); | ||
2102 | } | ||
2103 | } | ||
2104 | } | ||
2105 | 2080 | ||
2081 | mpsc_drv_get_platform_data(pi, dev, dev->id); | ||
2082 | pi->port.dev = &dev->dev; | ||
2083 | |||
2084 | rc = mpsc_make_ready(pi); | ||
2085 | if (rc) | ||
2086 | goto err_unmap; | ||
2087 | |||
2088 | spin_lock_init(&pi->tx_lock); | ||
2089 | rc = uart_add_one_port(&mpsc_reg, &pi->port); | ||
2090 | if (rc) | ||
2091 | goto err_relport; | ||
2092 | |||
2093 | return 0; | ||
2094 | err_relport: | ||
2095 | mpsc_release_port(&pi->port); | ||
2096 | err_unmap: | ||
2097 | mpsc_drv_unmap_regs(pi); | ||
2106 | return rc; | 2098 | return rc; |
2107 | } | 2099 | } |
2108 | 2100 | ||
@@ -2124,19 +2116,22 @@ static int __init mpsc_drv_init(void) | |||
2124 | memset(&mpsc_shared_regs, 0, sizeof(mpsc_shared_regs)); | 2116 | memset(&mpsc_shared_regs, 0, sizeof(mpsc_shared_regs)); |
2125 | 2117 | ||
2126 | rc = uart_register_driver(&mpsc_reg); | 2118 | rc = uart_register_driver(&mpsc_reg); |
2127 | if (!rc) { | 2119 | if (rc) |
2128 | rc = platform_driver_register(&mpsc_shared_driver); | 2120 | return rc; |
2129 | if (!rc) { | 2121 | |
2130 | rc = platform_driver_register(&mpsc_driver); | 2122 | rc = platform_driver_register(&mpsc_shared_driver); |
2131 | if (rc) { | 2123 | if (rc) |
2132 | platform_driver_unregister(&mpsc_shared_driver); | 2124 | goto err_unreg_uart; |
2133 | uart_unregister_driver(&mpsc_reg); | ||
2134 | } | ||
2135 | } else { | ||
2136 | uart_unregister_driver(&mpsc_reg); | ||
2137 | } | ||
2138 | } | ||
2139 | 2125 | ||
2126 | rc = platform_driver_register(&mpsc_driver); | ||
2127 | if (rc) | ||
2128 | goto err_unreg_plat; | ||
2129 | |||
2130 | return 0; | ||
2131 | err_unreg_plat: | ||
2132 | platform_driver_unregister(&mpsc_shared_driver); | ||
2133 | err_unreg_uart: | ||
2134 | uart_unregister_driver(&mpsc_reg); | ||
2140 | return rc; | 2135 | return rc; |
2141 | } | 2136 | } |
2142 | device_initcall(mpsc_drv_init); | 2137 | device_initcall(mpsc_drv_init); |