summaryrefslogtreecommitdiff
path: root/drivers/tty/serial
diff options
context:
space:
mode:
authorDavid Schalig <dschalig@nvidia.com>2011-12-13 18:37:14 +0900
committerVarun Wadekar <vwadekar@nvidia.com>2011-12-21 12:06:25 +0530
commit40422bfec37a9d8bc480f77358ea581f685a2bdf (patch)
treed192dacbb303ae4445b69684bb01d165871a48c5 /drivers/tty/serial
parent7e3c71a19da4663894bc11eebe8b203cfc8a048b (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.c30
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. */