diff options
Diffstat (limited to 'drivers/rtc/rtc-at91sam9.c')
-rw-r--r-- | drivers/rtc/rtc-at91sam9.c | 57 |
1 files changed, 22 insertions, 35 deletions
diff --git a/drivers/rtc/rtc-at91sam9.c b/drivers/rtc/rtc-at91sam9.c index 39cfd2ee0042..b60a34cb145a 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 | ||
@@ -414,14 +404,13 @@ static void at91_rtc_shutdown(struct platform_device *pdev) | |||
414 | rtt_writel(rtc, MR, mr & ~rtc->imr); | 404 | rtt_writel(rtc, MR, mr & ~rtc->imr); |
415 | } | 405 | } |
416 | 406 | ||
417 | #ifdef CONFIG_PM | 407 | #ifdef CONFIG_PM_SLEEP |
418 | 408 | ||
419 | /* AT91SAM9 RTC Power management control */ | 409 | /* AT91SAM9 RTC Power management control */ |
420 | 410 | ||
421 | static int at91_rtc_suspend(struct platform_device *pdev, | 411 | static int at91_rtc_suspend(struct device *dev) |
422 | pm_message_t state) | ||
423 | { | 412 | { |
424 | struct sam9_rtc *rtc = platform_get_drvdata(pdev); | 413 | struct sam9_rtc *rtc = dev_get_drvdata(dev); |
425 | u32 mr = rtt_readl(rtc, MR); | 414 | u32 mr = rtt_readl(rtc, MR); |
426 | 415 | ||
427 | /* | 416 | /* |
@@ -430,7 +419,7 @@ static int at91_rtc_suspend(struct platform_device *pdev, | |||
430 | */ | 419 | */ |
431 | rtc->imr = mr & (AT91_RTT_ALMIEN | AT91_RTT_RTTINCIEN); | 420 | rtc->imr = mr & (AT91_RTT_ALMIEN | AT91_RTT_RTTINCIEN); |
432 | if (rtc->imr) { | 421 | if (rtc->imr) { |
433 | if (device_may_wakeup(&pdev->dev) && (mr & AT91_RTT_ALMIEN)) { | 422 | if (device_may_wakeup(dev) && (mr & AT91_RTT_ALMIEN)) { |
434 | enable_irq_wake(rtc->irq); | 423 | enable_irq_wake(rtc->irq); |
435 | /* don't let RTTINC cause wakeups */ | 424 | /* don't let RTTINC cause wakeups */ |
436 | if (mr & AT91_RTT_RTTINCIEN) | 425 | if (mr & AT91_RTT_RTTINCIEN) |
@@ -442,13 +431,13 @@ static int at91_rtc_suspend(struct platform_device *pdev, | |||
442 | return 0; | 431 | return 0; |
443 | } | 432 | } |
444 | 433 | ||
445 | static int at91_rtc_resume(struct platform_device *pdev) | 434 | static int at91_rtc_resume(struct device *dev) |
446 | { | 435 | { |
447 | struct sam9_rtc *rtc = platform_get_drvdata(pdev); | 436 | struct sam9_rtc *rtc = dev_get_drvdata(dev); |
448 | u32 mr; | 437 | u32 mr; |
449 | 438 | ||
450 | if (rtc->imr) { | 439 | if (rtc->imr) { |
451 | if (device_may_wakeup(&pdev->dev)) | 440 | if (device_may_wakeup(dev)) |
452 | disable_irq_wake(rtc->irq); | 441 | disable_irq_wake(rtc->irq); |
453 | mr = rtt_readl(rtc, MR); | 442 | mr = rtt_readl(rtc, MR); |
454 | rtt_writel(rtc, MR, mr | rtc->imr); | 443 | rtt_writel(rtc, MR, mr | rtc->imr); |
@@ -456,20 +445,18 @@ static int at91_rtc_resume(struct platform_device *pdev) | |||
456 | 445 | ||
457 | return 0; | 446 | return 0; |
458 | } | 447 | } |
459 | #else | ||
460 | #define at91_rtc_suspend NULL | ||
461 | #define at91_rtc_resume NULL | ||
462 | #endif | 448 | #endif |
463 | 449 | ||
450 | static SIMPLE_DEV_PM_OPS(at91_rtc_pm_ops, at91_rtc_suspend, at91_rtc_resume); | ||
451 | |||
464 | static struct platform_driver at91_rtc_driver = { | 452 | static struct platform_driver at91_rtc_driver = { |
465 | .probe = at91_rtc_probe, | 453 | .probe = at91_rtc_probe, |
466 | .remove = at91_rtc_remove, | 454 | .remove = at91_rtc_remove, |
467 | .shutdown = at91_rtc_shutdown, | 455 | .shutdown = at91_rtc_shutdown, |
468 | .suspend = at91_rtc_suspend, | ||
469 | .resume = at91_rtc_resume, | ||
470 | .driver = { | 456 | .driver = { |
471 | .name = "rtc-at91sam9", | 457 | .name = "rtc-at91sam9", |
472 | .owner = THIS_MODULE, | 458 | .owner = THIS_MODULE, |
459 | .pm = &at91_rtc_pm_ops, | ||
473 | }, | 460 | }, |
474 | }; | 461 | }; |
475 | 462 | ||