diff options
author | David Schalig <dschalig@nvidia.com> | 2011-12-13 18:37:14 +0900 |
---|---|---|
committer | Varun Wadekar <vwadekar@nvidia.com> | 2011-12-21 12:06:25 +0530 |
commit | 40422bfec37a9d8bc480f77358ea581f685a2bdf (patch) | |
tree | d192dacbb303ae4445b69684bb01d165871a48c5 /drivers/tty/serial | |
parent | 7e3c71a19da4663894bc11eebe8b203cfc8a048b (diff) |
tegra: uart: fix driver probe cleanup sequence
Bug 913493
Change-Id: I05eaa030a0d959eb0bac1344f754ce73a479be9a
Signed-off-by: David Schalig <dschalig@nvidia.com>
Reviewed-on: http://git-master/r/69710
Reviewed-by: Automatic_Commit_Validation_User
Reviewed-by: Sachin Nikam <snikam@nvidia.com>
Reviewed-by: Scott Peterson <speterson@nvidia.com>
Diffstat (limited to 'drivers/tty/serial')
-rw-r--r-- | drivers/tty/serial/tegra_hsuart.c | 30 |
1 files changed, 19 insertions, 11 deletions
diff --git a/drivers/tty/serial/tegra_hsuart.c b/drivers/tty/serial/tegra_hsuart.c index be7415ca7627..940fd3f3626b 100644 --- a/drivers/tty/serial/tegra_hsuart.c +++ b/drivers/tty/serial/tegra_hsuart.c @@ -1462,23 +1462,30 @@ static int tegra_uart_probe(struct platform_device *pdev) u->fifosize = 32; resource = platform_get_resource(pdev, IORESOURCE_MEM, 0); - if (unlikely(!resource)) - return -ENXIO; + if (unlikely(!resource)) { + ret = -ENXIO; + goto fail; + } u->mapbase = resource->start; u->membase = IO_ADDRESS(u->mapbase); - if (unlikely(!u->membase)) - return -ENOMEM; + if (unlikely(!u->membase)) { + ret = -ENOMEM; + goto fail; + } u->irq = platform_get_irq(pdev, 0); - if (unlikely(u->irq < 0)) - return -ENXIO; + if (unlikely(u->irq < 0)) { + ret = -ENXIO; + goto fail; + } u->regshift = 2; t->clk = clk_get(&pdev->dev, NULL); if (IS_ERR_OR_NULL(t->clk)) { dev_err(&pdev->dev, "Couldn't get the clock\n"); + ret = -ENODEV; goto fail; } @@ -1486,19 +1493,20 @@ static int tegra_uart_probe(struct platform_device *pdev) if (ret) { pr_err("%s: Failed(%d) to add uart port %s%d\n", __func__, ret, tegra_uart_driver.dev_name, u->line); - kfree(t); - platform_set_drvdata(pdev, NULL); - return ret; + goto fail; } snprintf(name, sizeof(name), "tegra_hsuart_%d", u->line); pr_info("Registered UART port %s%d\n", tegra_uart_driver.dev_name, u->line); t->uart_state = TEGRA_UART_CLOSED; - return ret; + return 0; fail: + if (t->clk) + clk_put(t->clk); + platform_set_drvdata(pdev, NULL); kfree(t); - return -ENODEV; + return ret; } /* Switch off the clock of the uart controller. */ |