Skip to content

Commit

Permalink
drivers/rtc/rtc-tegra.c: clean up probe/remove routines
Browse files Browse the repository at this point in the history
Use the devres managed resource functions in the probe routine.  Also
affects the remove routine where the previously used free and release
functions are not needed.

The devm_* functions eliminate the need for manual resource releasing and
simplify error handling.  Resources allocated by devm_* are freed
automatically on driver detach.

Signed-off-by: Hannu Heikkinen <[email protected]>
Acked-by: Stephen Warren <[email protected]>
Cc: Alessandro Zummo <[email protected]>
Signed-off-by: Andrew Morton <[email protected]>
Signed-off-by: Linus Torvalds <[email protected]>
  • Loading branch information
Hannu Heikkinen authored and torvalds committed May 29, 2012
1 parent ac2dee5 commit 621bae7
Showing 1 changed file with 13 additions and 37 deletions.
50 changes: 13 additions & 37 deletions drivers/rtc/rtc-tegra.c
Original file line number Diff line number Diff line change
Expand Up @@ -309,37 +309,27 @@ static int __devinit tegra_rtc_probe(struct platform_device *pdev)
struct resource *res;
int ret;

info = kzalloc(sizeof(struct tegra_rtc_info), GFP_KERNEL);
info = devm_kzalloc(&pdev->dev, sizeof(struct tegra_rtc_info),
GFP_KERNEL);
if (!info)
return -ENOMEM;

res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
if (!res) {
dev_err(&pdev->dev,
"Unable to allocate resources for device.\n");
ret = -EBUSY;
goto err_free_info;
return -EBUSY;
}

if (!request_mem_region(res->start, resource_size(res), pdev->name)) {
dev_err(&pdev->dev,
"Unable to request mem region for device.\n");
ret = -EBUSY;
goto err_free_info;
info->rtc_base = devm_request_and_ioremap(&pdev->dev, res);
if (!info->rtc_base) {
dev_err(&pdev->dev, "Unable to request mem region and grab IOs for device.\n");
return -EBUSY;
}

info->tegra_rtc_irq = platform_get_irq(pdev, 0);
if (info->tegra_rtc_irq <= 0) {
ret = -EBUSY;
goto err_release_mem_region;
}

info->rtc_base = ioremap_nocache(res->start, resource_size(res));
if (!info->rtc_base) {
dev_err(&pdev->dev, "Unable to grab IOs for device.\n");
ret = -EBUSY;
goto err_release_mem_region;
}
if (info->tegra_rtc_irq <= 0)
return -EBUSY;

/* set context info. */
info->pdev = pdev;
Expand All @@ -362,11 +352,12 @@ static int __devinit tegra_rtc_probe(struct platform_device *pdev)
dev_err(&pdev->dev,
"Unable to register device (err=%d).\n",
ret);
goto err_iounmap;
return ret;
}

ret = request_irq(info->tegra_rtc_irq, tegra_rtc_irq_handler,
IRQF_TRIGGER_HIGH, "rtc alarm", &pdev->dev);
ret = devm_request_irq(&pdev->dev, info->tegra_rtc_irq,
tegra_rtc_irq_handler, IRQF_TRIGGER_HIGH,
"rtc alarm", &pdev->dev);
if (ret) {
dev_err(&pdev->dev,
"Unable to request interrupt for device (err=%d).\n",
Expand All @@ -380,30 +371,15 @@ static int __devinit tegra_rtc_probe(struct platform_device *pdev)

err_dev_unreg:
rtc_device_unregister(info->rtc_dev);
err_iounmap:
iounmap(info->rtc_base);
err_release_mem_region:
release_mem_region(res->start, resource_size(res));
err_free_info:
kfree(info);

return ret;
}

static int __devexit tegra_rtc_remove(struct platform_device *pdev)
{
struct tegra_rtc_info *info = platform_get_drvdata(pdev);
struct resource *res;

res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
if (!res)
return -EBUSY;

free_irq(info->tegra_rtc_irq, &pdev->dev);
rtc_device_unregister(info->rtc_dev);
iounmap(info->rtc_base);
release_mem_region(res->start, resource_size(res));
kfree(info);

platform_set_drvdata(pdev, NULL);

Expand Down

0 comments on commit 621bae7

Please sign in to comment.