diff options
author | Jingoo Han <jg1.han@samsung.com> | 2013-04-29 19:20:35 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2013-04-29 21:28:36 -0400 |
commit | 9d42e4651074898bb831f53adb9155e9b6ffcd04 (patch) | |
tree | 8f8a24dbaeb6ca9075ea06bf570c6b77b9b22c1b /drivers/rtc | |
parent | fa11f7e777077210fad0a962699f874d83fc9bfd (diff) |
rtc: rtc-at91sam9: use devm_*() functions
Use devm_*() functions to make cleanup paths simpler.
Signed-off-by: Jingoo Han <jg1.han@samsung.com>
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-at91sam9.c | 34 |
1 files changed, 12 insertions, 22 deletions
diff --git a/drivers/rtc/rtc-at91sam9.c b/drivers/rtc/rtc-at91sam9.c index 39cfd2ee0042..7b77c27e0955 100644 --- a/drivers/rtc/rtc-at91sam9.c +++ b/drivers/rtc/rtc-at91sam9.c | |||
@@ -20,6 +20,7 @@ | |||
20 | #include <linux/ioctl.h> | 20 | #include <linux/ioctl.h> |
21 | #include <linux/slab.h> | 21 | #include <linux/slab.h> |
22 | #include <linux/platform_data/atmel.h> | 22 | #include <linux/platform_data/atmel.h> |
23 | #include <linux/io.h> | ||
23 | 24 | ||
24 | #include <mach/at91_rtt.h> | 25 | #include <mach/at91_rtt.h> |
25 | #include <mach/cpu.h> | 26 | #include <mach/cpu.h> |
@@ -309,7 +310,7 @@ static int at91_rtc_probe(struct platform_device *pdev) | |||
309 | return irq; | 310 | return irq; |
310 | } | 311 | } |
311 | 312 | ||
312 | rtc = kzalloc(sizeof *rtc, GFP_KERNEL); | 313 | rtc = devm_kzalloc(&pdev->dev, sizeof(*rtc), GFP_KERNEL); |
313 | if (!rtc) | 314 | if (!rtc) |
314 | return -ENOMEM; | 315 | return -ENOMEM; |
315 | 316 | ||
@@ -320,18 +321,19 @@ static int at91_rtc_probe(struct platform_device *pdev) | |||
320 | device_init_wakeup(&pdev->dev, 1); | 321 | device_init_wakeup(&pdev->dev, 1); |
321 | 322 | ||
322 | platform_set_drvdata(pdev, rtc); | 323 | platform_set_drvdata(pdev, rtc); |
323 | rtc->rtt = ioremap(r->start, resource_size(r)); | 324 | rtc->rtt = devm_ioremap(&pdev->dev, r->start, resource_size(r)); |
324 | if (!rtc->rtt) { | 325 | if (!rtc->rtt) { |
325 | dev_err(&pdev->dev, "failed to map registers, aborting.\n"); | 326 | dev_err(&pdev->dev, "failed to map registers, aborting.\n"); |
326 | ret = -ENOMEM; | 327 | ret = -ENOMEM; |
327 | goto fail; | 328 | goto fail; |
328 | } | 329 | } |
329 | 330 | ||
330 | rtc->gpbr = ioremap(r_gpbr->start, resource_size(r_gpbr)); | 331 | rtc->gpbr = devm_ioremap(&pdev->dev, r_gpbr->start, |
332 | resource_size(r_gpbr)); | ||
331 | if (!rtc->gpbr) { | 333 | if (!rtc->gpbr) { |
332 | dev_err(&pdev->dev, "failed to map gpbr registers, aborting.\n"); | 334 | dev_err(&pdev->dev, "failed to map gpbr registers, aborting.\n"); |
333 | ret = -ENOMEM; | 335 | ret = -ENOMEM; |
334 | goto fail_gpbr; | 336 | goto fail; |
335 | } | 337 | } |
336 | 338 | ||
337 | mr = rtt_readl(rtc, MR); | 339 | mr = rtt_readl(rtc, MR); |
@@ -346,20 +348,19 @@ static int at91_rtc_probe(struct platform_device *pdev) | |||
346 | mr &= ~(AT91_RTT_ALMIEN | AT91_RTT_RTTINCIEN); | 348 | mr &= ~(AT91_RTT_ALMIEN | AT91_RTT_RTTINCIEN); |
347 | rtt_writel(rtc, MR, mr); | 349 | rtt_writel(rtc, MR, mr); |
348 | 350 | ||
349 | rtc->rtcdev = rtc_device_register(pdev->name, &pdev->dev, | 351 | rtc->rtcdev = devm_rtc_device_register(&pdev->dev, pdev->name, |
350 | &at91_rtc_ops, THIS_MODULE); | 352 | &at91_rtc_ops, THIS_MODULE); |
351 | if (IS_ERR(rtc->rtcdev)) { | 353 | if (IS_ERR(rtc->rtcdev)) { |
352 | ret = PTR_ERR(rtc->rtcdev); | 354 | ret = PTR_ERR(rtc->rtcdev); |
353 | goto fail_register; | 355 | goto fail; |
354 | } | 356 | } |
355 | 357 | ||
356 | /* register irq handler after we know what name we'll use */ | 358 | /* register irq handler after we know what name we'll use */ |
357 | ret = request_irq(rtc->irq, at91_rtc_interrupt, IRQF_SHARED, | 359 | ret = devm_request_irq(&pdev->dev, rtc->irq, at91_rtc_interrupt, |
358 | dev_name(&rtc->rtcdev->dev), rtc); | 360 | IRQF_SHARED, dev_name(&rtc->rtcdev->dev), rtc); |
359 | if (ret) { | 361 | if (ret) { |
360 | dev_dbg(&pdev->dev, "can't share IRQ %d?\n", rtc->irq); | 362 | dev_dbg(&pdev->dev, "can't share IRQ %d?\n", rtc->irq); |
361 | rtc_device_unregister(rtc->rtcdev); | 363 | goto fail; |
362 | goto fail_register; | ||
363 | } | 364 | } |
364 | 365 | ||
365 | /* NOTE: sam9260 rev A silicon has a ROM bug which resets the | 366 | /* NOTE: sam9260 rev A silicon has a ROM bug which resets the |
@@ -374,13 +375,8 @@ static int at91_rtc_probe(struct platform_device *pdev) | |||
374 | 375 | ||
375 | return 0; | 376 | return 0; |
376 | 377 | ||
377 | fail_register: | ||
378 | iounmap(rtc->gpbr); | ||
379 | fail_gpbr: | ||
380 | iounmap(rtc->rtt); | ||
381 | fail: | 378 | fail: |
382 | platform_set_drvdata(pdev, NULL); | 379 | platform_set_drvdata(pdev, NULL); |
383 | kfree(rtc); | ||
384 | return ret; | 380 | return ret; |
385 | } | 381 | } |
386 | 382 | ||
@@ -394,14 +390,8 @@ static int at91_rtc_remove(struct platform_device *pdev) | |||
394 | 390 | ||
395 | /* disable all interrupts */ | 391 | /* disable all interrupts */ |
396 | rtt_writel(rtc, MR, mr & ~(AT91_RTT_ALMIEN | AT91_RTT_RTTINCIEN)); | 392 | rtt_writel(rtc, MR, mr & ~(AT91_RTT_ALMIEN | AT91_RTT_RTTINCIEN)); |
397 | free_irq(rtc->irq, rtc); | ||
398 | |||
399 | rtc_device_unregister(rtc->rtcdev); | ||
400 | 393 | ||
401 | iounmap(rtc->gpbr); | ||
402 | iounmap(rtc->rtt); | ||
403 | platform_set_drvdata(pdev, NULL); | 394 | platform_set_drvdata(pdev, NULL); |
404 | kfree(rtc); | ||
405 | return 0; | 395 | return 0; |
406 | } | 396 | } |
407 | 397 | ||