Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

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: Julia Lawall <Julia.Lawall@lip6.fr>
Signed-off-by: Wim Van Sebroeck <wim@iguana.be>

authored by

Julia Lawall and committed by
Wim Van Sebroeck
ae21cc20 065e8238

+10 -23
+10 -23
drivers/watchdog/ar7_wdt.c
··· 282 282 platform_get_resource_byname(pdev, IORESOURCE_MEM, "regs"); 283 283 if (!ar7_regs_wdt) { 284 284 pr_err("could not get registers resource\n"); 285 - rc = -ENODEV; 286 - goto out; 285 + return -ENODEV; 287 286 } 288 287 289 - if (!request_mem_region(ar7_regs_wdt->start, 290 - resource_size(ar7_regs_wdt), LONGNAME)) { 291 - pr_warn("watchdog I/O region busy\n"); 292 - rc = -EBUSY; 293 - goto out; 294 - } 295 - 296 - ar7_wdt = ioremap(ar7_regs_wdt->start, resource_size(ar7_regs_wdt)); 288 + ar7_wdt = devm_request_and_ioremap(&pdev->dev, ar7_regs_wdt); 297 289 if (!ar7_wdt) { 298 290 pr_err("could not ioremap registers\n"); 299 - rc = -ENXIO; 300 - goto out_mem_region; 291 + return -ENXIO; 301 292 } 302 293 303 294 vbus_clk = clk_get(NULL, "vbus"); 304 295 if (IS_ERR(vbus_clk)) { 305 296 pr_err("could not get vbus clock\n"); 306 - rc = PTR_ERR(vbus_clk); 307 - goto out_mem_region; 297 + return PTR_ERR(vbus_clk); 308 298 } 309 299 310 300 ar7_wdt_disable_wdt(); ··· 304 314 rc = misc_register(&ar7_wdt_miscdev); 305 315 if (rc) { 306 316 pr_err("unable to register misc device\n"); 307 - goto out_alloc; 317 + goto out; 308 318 } 309 - goto out; 319 + return 0; 310 320 311 - out_alloc: 312 - iounmap(ar7_wdt); 313 - out_mem_region: 314 - release_mem_region(ar7_regs_wdt->start, resource_size(ar7_regs_wdt)); 315 321 out: 322 + clk_put(vbus_clk); 323 + vbus_clk = NULL; 316 324 return rc; 317 325 } 318 326 319 327 static int __devexit ar7_wdt_remove(struct platform_device *pdev) 320 328 { 321 329 misc_deregister(&ar7_wdt_miscdev); 322 - iounmap(ar7_wdt); 323 - release_mem_region(ar7_regs_wdt->start, resource_size(ar7_regs_wdt)); 324 - 330 + clk_put(vbus_clk); 331 + vbus_clk = NULL; 325 332 return 0; 326 333 } 327 334