diff options
author | Viresh Kumar <viresh.kumar@linaro.org> | 2012-12-17 19:02:29 -0500 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2012-12-17 20:15:20 -0500 |
commit | bdaa2c63b060ae082ab4f20378c1a6307b59b8db (patch) | |
tree | ae9c4a3e01bc4ac74350bd5330f725ce56e6d654 /drivers/rtc | |
parent | 942bfb3ed08b677e0a447096c501d6b0b49f44f9 (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')
-rw-r--r-- | drivers/rtc/rtc-spear.c | 89 |
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 | ||
427 | err_clear_platdata: | ||
428 | platform_set_drvdata(pdev, NULL); | ||
429 | rtc_device_unregister(config->rtc); | ||
430 | err_iounmap: | ||
431 | iounmap(config->ioaddr); | ||
432 | err_disable_clock: | 419 | err_disable_clock: |
420 | platform_set_drvdata(pdev, NULL); | ||
433 | clk_disable(config->clk); | 421 | clk_disable(config->clk); |
434 | err_clk_put: | ||
435 | clk_put(config->clk); | ||
436 | err_kfree: | ||
437 | kfree(config); | ||
438 | err_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: | |||
444 | static int __devexit spear_rtc_remove(struct platform_device *pdev) | 426 | static 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 | } |