aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/rtc/rtc-spear.c
diff options
context:
space:
mode:
authorViresh Kumar <viresh.kumar@linaro.org>2012-12-17 19:02:29 -0500
committerLinus Torvalds <torvalds@linux-foundation.org>2012-12-17 20:15:20 -0500
commitbdaa2c63b060ae082ab4f20378c1a6307b59b8db (patch)
treeae9c4a3e01bc4ac74350bd5330f725ce56e6d654 /drivers/rtc/rtc-spear.c
parent942bfb3ed08b677e0a447096c501d6b0b49f44f9 (diff)
rtc: rtc-spear: use devm_*() routines
Free the rtc-spear driver from tension of freeing resources :) devm_* derivatives of multiple routines are used while allocating resources, which would be freed automatically by kernel. Signed-off-by: Viresh Kumar <viresh.kumar@linaro.org> Cc: Deepak Sikri <deepak.sikri@st.com> Cc: Alessandro Zummo <a.zummo@towertech.it> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'drivers/rtc/rtc-spear.c')
-rw-r--r--drivers/rtc/rtc-spear.c89
1 files changed, 29 insertions, 60 deletions
diff --git a/drivers/rtc/rtc-spear.c b/drivers/rtc/rtc-spear.c
index bb507d23f6ce..311a5274b528 100644
--- a/drivers/rtc/rtc-spear.c
+++ b/drivers/rtc/rtc-spear.c
@@ -363,35 +363,42 @@ static int __devinit spear_rtc_probe(struct platform_device *pdev)
363 dev_err(&pdev->dev, "no resource defined\n"); 363 dev_err(&pdev->dev, "no resource defined\n");
364 return -EBUSY; 364 return -EBUSY;
365 } 365 }
366 if (!request_mem_region(res->start, resource_size(res), pdev->name)) {
367 dev_err(&pdev->dev, "rtc region already claimed\n");
368 return -EBUSY;
369 }
370 366
371 config = kzalloc(sizeof(*config), GFP_KERNEL); 367 config = devm_kzalloc(&pdev->dev, sizeof(*config), GFP_KERNEL);
372 if (!config) { 368 if (!config) {
373 dev_err(&pdev->dev, "out of memory\n"); 369 dev_err(&pdev->dev, "out of memory\n");
374 status = -ENOMEM; 370 return -ENOMEM;
375 goto err_release_region;
376 } 371 }
377 372
378 config->clk = clk_get(&pdev->dev, NULL); 373 /* alarm irqs */
379 if (IS_ERR(config->clk)) { 374 irq = platform_get_irq(pdev, 0);
380 status = PTR_ERR(config->clk); 375 if (irq < 0) {
381 goto err_kfree; 376 dev_err(&pdev->dev, "no update irq?\n");
377 return irq;
382 } 378 }
383 379
384 status = clk_enable(config->clk); 380 status = devm_request_irq(&pdev->dev, irq, spear_rtc_irq, 0, pdev->name,
385 if (status < 0) 381 config);
386 goto err_clk_put; 382 if (status) {
383 dev_err(&pdev->dev, "Alarm interrupt IRQ%d already claimed\n",
384 irq);
385 return status;
386 }
387 387
388 config->ioaddr = ioremap(res->start, resource_size(res)); 388 config->ioaddr = devm_request_and_ioremap(&pdev->dev, res);
389 if (!config->ioaddr) { 389 if (!config->ioaddr) {
390 dev_err(&pdev->dev, "ioremap fail\n"); 390 dev_err(&pdev->dev, "request-ioremap fail\n");
391 status = -ENOMEM; 391 return -ENOMEM;
392 goto err_disable_clock;
393 } 392 }
394 393
394 config->clk = devm_clk_get(&pdev->dev, NULL);
395 if (IS_ERR(config->clk))
396 return PTR_ERR(config->clk);
397
398 status = clk_enable(config->clk);
399 if (status < 0)
400 return status;
401
395 spin_lock_init(&config->lock); 402 spin_lock_init(&config->lock);
396 platform_set_drvdata(pdev, config); 403 platform_set_drvdata(pdev, config);
397 404
@@ -401,22 +408,7 @@ static int __devinit spear_rtc_probe(struct platform_device *pdev)
401 dev_err(&pdev->dev, "can't register RTC device, err %ld\n", 408 dev_err(&pdev->dev, "can't register RTC device, err %ld\n",
402 PTR_ERR(config->rtc)); 409 PTR_ERR(config->rtc));
403 status = PTR_ERR(config->rtc); 410 status = PTR_ERR(config->rtc);
404 goto err_iounmap; 411 goto err_disable_clock;
405 }
406
407 /* alarm irqs */
408 irq = platform_get_irq(pdev, 0);
409 if (irq < 0) {
410 dev_err(&pdev->dev, "no update irq?\n");
411 status = irq;
412 goto err_clear_platdata;
413 }
414
415 status = request_irq(irq, spear_rtc_irq, 0, pdev->name, config);
416 if (status) {
417 dev_err(&pdev->dev, "Alarm interrupt IRQ%d already \
418 claimed\n", irq);
419 goto err_clear_platdata;
420 } 412 }
421 413
422 if (!device_can_wakeup(&pdev->dev)) 414 if (!device_can_wakeup(&pdev->dev))
@@ -424,19 +416,9 @@ static int __devinit spear_rtc_probe(struct platform_device *pdev)
424 416
425 return 0; 417 return 0;
426 418
427err_clear_platdata:
428 platform_set_drvdata(pdev, NULL);
429 rtc_device_unregister(config->rtc);
430err_iounmap:
431 iounmap(config->ioaddr);
432err_disable_clock: 419err_disable_clock:
420 platform_set_drvdata(pdev, NULL);
433 clk_disable(config->clk); 421 clk_disable(config->clk);
434err_clk_put:
435 clk_put(config->clk);
436err_kfree:
437 kfree(config);
438err_release_region:
439 release_mem_region(res->start, resource_size(res));
440 422
441 return status; 423 return status;
442} 424}
@@ -444,24 +426,11 @@ err_release_region:
444static int __devexit spear_rtc_remove(struct platform_device *pdev) 426static int __devexit spear_rtc_remove(struct platform_device *pdev)
445{ 427{
446 struct spear_rtc_config *config = platform_get_drvdata(pdev); 428 struct spear_rtc_config *config = platform_get_drvdata(pdev);
447 int irq;
448 struct resource *res;
449 429
450 /* leave rtc running, but disable irqs */ 430 rtc_device_unregister(config->rtc);
451 spear_rtc_disable_interrupt(config); 431 spear_rtc_disable_interrupt(config);
452 device_init_wakeup(&pdev->dev, 0);
453 irq = platform_get_irq(pdev, 0);
454 if (irq)
455 free_irq(irq, pdev);
456 clk_disable(config->clk); 432 clk_disable(config->clk);
457 clk_put(config->clk); 433 device_init_wakeup(&pdev->dev, 0);
458 iounmap(config->ioaddr);
459 res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
460 if (res)
461 release_mem_region(res->start, resource_size(res));
462 platform_set_drvdata(pdev, NULL);
463 rtc_device_unregister(config->rtc);
464 kfree(config);
465 434
466 return 0; 435 return 0;
467} 436}