Commit ae21cc20 authored by Julia Lawall's avatar Julia Lawall Committed by Wim Van Sebroeck

watchdog: ar7_wdt.c: use devm_request_and_ioremap

Combine request_region and ioremap into devm_request_and_ioremap.  This has
the effect of fixing a missing iounmap on the failure of clk_get.

This also introduces a call to clk_put and clears the vbus_clk variable in
the case of failure or device removal.
Signed-off-by: default avatarJulia Lawall <Julia.Lawall@lip6.fr>
Signed-off-by: default avatarWim Van Sebroeck <wim@iguana.be>
parent 065e8238
...@@ -282,29 +282,19 @@ static int __devinit ar7_wdt_probe(struct platform_device *pdev) ...@@ -282,29 +282,19 @@ static int __devinit ar7_wdt_probe(struct platform_device *pdev)
platform_get_resource_byname(pdev, IORESOURCE_MEM, "regs"); platform_get_resource_byname(pdev, IORESOURCE_MEM, "regs");
if (!ar7_regs_wdt) { if (!ar7_regs_wdt) {
pr_err("could not get registers resource\n"); pr_err("could not get registers resource\n");
rc = -ENODEV; return -ENODEV;
goto out;
}
if (!request_mem_region(ar7_regs_wdt->start,
resource_size(ar7_regs_wdt), LONGNAME)) {
pr_warn("watchdog I/O region busy\n");
rc = -EBUSY;
goto out;
} }
ar7_wdt = ioremap(ar7_regs_wdt->start, resource_size(ar7_regs_wdt)); ar7_wdt = devm_request_and_ioremap(&pdev->dev, ar7_regs_wdt);
if (!ar7_wdt) { if (!ar7_wdt) {
pr_err("could not ioremap registers\n"); pr_err("could not ioremap registers\n");
rc = -ENXIO; return -ENXIO;
goto out_mem_region;
} }
vbus_clk = clk_get(NULL, "vbus"); vbus_clk = clk_get(NULL, "vbus");
if (IS_ERR(vbus_clk)) { if (IS_ERR(vbus_clk)) {
pr_err("could not get vbus clock\n"); pr_err("could not get vbus clock\n");
rc = PTR_ERR(vbus_clk); return PTR_ERR(vbus_clk);
goto out_mem_region;
} }
ar7_wdt_disable_wdt(); ar7_wdt_disable_wdt();
...@@ -314,24 +304,21 @@ static int __devinit ar7_wdt_probe(struct platform_device *pdev) ...@@ -314,24 +304,21 @@ static int __devinit ar7_wdt_probe(struct platform_device *pdev)
rc = misc_register(&ar7_wdt_miscdev); rc = misc_register(&ar7_wdt_miscdev);
if (rc) { if (rc) {
pr_err("unable to register misc device\n"); pr_err("unable to register misc device\n");
goto out_alloc;
}
goto out; goto out;
}
return 0;
out_alloc:
iounmap(ar7_wdt);
out_mem_region:
release_mem_region(ar7_regs_wdt->start, resource_size(ar7_regs_wdt));
out: out:
clk_put(vbus_clk);
vbus_clk = NULL;
return rc; return rc;
} }
static int __devexit ar7_wdt_remove(struct platform_device *pdev) static int __devexit ar7_wdt_remove(struct platform_device *pdev)
{ {
misc_deregister(&ar7_wdt_miscdev); misc_deregister(&ar7_wdt_miscdev);
iounmap(ar7_wdt); clk_put(vbus_clk);
release_mem_region(ar7_regs_wdt->start, resource_size(ar7_regs_wdt)); vbus_clk = NULL;
return 0; return 0;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment