aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/rtc/rtc-s3c.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/rtc/rtc-s3c.c')
-rw-r--r--drivers/rtc/rtc-s3c.c37
1 files changed, 17 insertions, 20 deletions
diff --git a/drivers/rtc/rtc-s3c.c b/drivers/rtc/rtc-s3c.c
index fb994e9ddc15..8e96c00936be 100644
--- a/drivers/rtc/rtc-s3c.c
+++ b/drivers/rtc/rtc-s3c.c
@@ -51,7 +51,6 @@ static struct clk *rtc_clk;
51static void __iomem *s3c_rtc_base; 51static void __iomem *s3c_rtc_base;
52static int s3c_rtc_alarmno = NO_IRQ; 52static int s3c_rtc_alarmno = NO_IRQ;
53static int s3c_rtc_tickno = NO_IRQ; 53static int s3c_rtc_tickno = NO_IRQ;
54static bool wake_en;
55static enum s3c_cpu_type s3c_rtc_cpu_type; 54static enum s3c_cpu_type s3c_rtc_cpu_type;
56 55
57static DEFINE_SPINLOCK(s3c_rtc_pie_lock); 56static DEFINE_SPINLOCK(s3c_rtc_pie_lock);
@@ -423,13 +422,11 @@ static void s3c_rtc_enable(struct platform_device *pdev, int en)
423 422
424static int s3c_rtc_remove(struct platform_device *dev) 423static int s3c_rtc_remove(struct platform_device *dev)
425{ 424{
426 struct rtc_device *rtc = platform_get_drvdata(dev);
427
428 platform_set_drvdata(dev, NULL); 425 platform_set_drvdata(dev, NULL);
429 rtc_device_unregister(rtc);
430 426
431 s3c_rtc_setaie(&dev->dev, 0); 427 s3c_rtc_setaie(&dev->dev, 0);
432 428
429 clk_unprepare(rtc_clk);
433 rtc_clk = NULL; 430 rtc_clk = NULL;
434 431
435 return 0; 432 return 0;
@@ -498,7 +495,7 @@ static int s3c_rtc_probe(struct platform_device *pdev)
498 return ret; 495 return ret;
499 } 496 }
500 497
501 clk_enable(rtc_clk); 498 clk_prepare_enable(rtc_clk);
502 499
503 /* check to see if everything is setup correctly */ 500 /* check to see if everything is setup correctly */
504 501
@@ -511,7 +508,7 @@ static int s3c_rtc_probe(struct platform_device *pdev)
511 508
512 /* register RTC and exit */ 509 /* register RTC and exit */
513 510
514 rtc = rtc_device_register("s3c", &pdev->dev, &s3c_rtcops, 511 rtc = devm_rtc_device_register(&pdev->dev, "s3c", &s3c_rtcops,
515 THIS_MODULE); 512 THIS_MODULE);
516 513
517 if (IS_ERR(rtc)) { 514 if (IS_ERR(rtc)) {
@@ -574,23 +571,24 @@ static int s3c_rtc_probe(struct platform_device *pdev)
574 571
575 err_alarm_irq: 572 err_alarm_irq:
576 platform_set_drvdata(pdev, NULL); 573 platform_set_drvdata(pdev, NULL);
577 rtc_device_unregister(rtc);
578 574
579 err_nortc: 575 err_nortc:
580 s3c_rtc_enable(pdev, 0); 576 s3c_rtc_enable(pdev, 0);
581 clk_disable(rtc_clk); 577 clk_disable_unprepare(rtc_clk);
582 578
583 return ret; 579 return ret;
584} 580}
585 581
586#ifdef CONFIG_PM 582#ifdef CONFIG_PM_SLEEP
587
588/* RTC Power management control */ 583/* RTC Power management control */
589 584
590static int ticnt_save, ticnt_en_save; 585static int ticnt_save, ticnt_en_save;
586static bool wake_en;
591 587
592static int s3c_rtc_suspend(struct platform_device *pdev, pm_message_t state) 588static int s3c_rtc_suspend(struct device *dev)
593{ 589{
590 struct platform_device *pdev = to_platform_device(dev);
591
594 clk_enable(rtc_clk); 592 clk_enable(rtc_clk);
595 /* save TICNT for anyone using periodic interrupts */ 593 /* save TICNT for anyone using periodic interrupts */
596 ticnt_save = readb(s3c_rtc_base + S3C2410_TICNT); 594 ticnt_save = readb(s3c_rtc_base + S3C2410_TICNT);
@@ -600,19 +598,20 @@ static int s3c_rtc_suspend(struct platform_device *pdev, pm_message_t state)
600 } 598 }
601 s3c_rtc_enable(pdev, 0); 599 s3c_rtc_enable(pdev, 0);
602 600
603 if (device_may_wakeup(&pdev->dev) && !wake_en) { 601 if (device_may_wakeup(dev) && !wake_en) {
604 if (enable_irq_wake(s3c_rtc_alarmno) == 0) 602 if (enable_irq_wake(s3c_rtc_alarmno) == 0)
605 wake_en = true; 603 wake_en = true;
606 else 604 else
607 dev_err(&pdev->dev, "enable_irq_wake failed\n"); 605 dev_err(dev, "enable_irq_wake failed\n");
608 } 606 }
609 clk_disable(rtc_clk); 607 clk_disable(rtc_clk);
610 608
611 return 0; 609 return 0;
612} 610}
613 611
614static int s3c_rtc_resume(struct platform_device *pdev) 612static int s3c_rtc_resume(struct device *dev)
615{ 613{
614 struct platform_device *pdev = to_platform_device(dev);
616 unsigned int tmp; 615 unsigned int tmp;
617 616
618 clk_enable(rtc_clk); 617 clk_enable(rtc_clk);
@@ -623,7 +622,7 @@ static int s3c_rtc_resume(struct platform_device *pdev)
623 writew(tmp | ticnt_en_save, s3c_rtc_base + S3C2410_RTCCON); 622 writew(tmp | ticnt_en_save, s3c_rtc_base + S3C2410_RTCCON);
624 } 623 }
625 624
626 if (device_may_wakeup(&pdev->dev) && wake_en) { 625 if (device_may_wakeup(dev) && wake_en) {
627 disable_irq_wake(s3c_rtc_alarmno); 626 disable_irq_wake(s3c_rtc_alarmno);
628 wake_en = false; 627 wake_en = false;
629 } 628 }
@@ -631,11 +630,10 @@ static int s3c_rtc_resume(struct platform_device *pdev)
631 630
632 return 0; 631 return 0;
633} 632}
634#else
635#define s3c_rtc_suspend NULL
636#define s3c_rtc_resume NULL
637#endif 633#endif
638 634
635static SIMPLE_DEV_PM_OPS(s3c_rtc_pm_ops, s3c_rtc_suspend, s3c_rtc_resume);
636
639#ifdef CONFIG_OF 637#ifdef CONFIG_OF
640static struct s3c_rtc_drv_data s3c_rtc_drv_data_array[] = { 638static struct s3c_rtc_drv_data s3c_rtc_drv_data_array[] = {
641 [TYPE_S3C2410] = { TYPE_S3C2410 }, 639 [TYPE_S3C2410] = { TYPE_S3C2410 },
@@ -685,12 +683,11 @@ MODULE_DEVICE_TABLE(platform, s3c_rtc_driver_ids);
685static struct platform_driver s3c_rtc_driver = { 683static struct platform_driver s3c_rtc_driver = {
686 .probe = s3c_rtc_probe, 684 .probe = s3c_rtc_probe,
687 .remove = s3c_rtc_remove, 685 .remove = s3c_rtc_remove,
688 .suspend = s3c_rtc_suspend,
689 .resume = s3c_rtc_resume,
690 .id_table = s3c_rtc_driver_ids, 686 .id_table = s3c_rtc_driver_ids,
691 .driver = { 687 .driver = {
692 .name = "s3c-rtc", 688 .name = "s3c-rtc",
693 .owner = THIS_MODULE, 689 .owner = THIS_MODULE,
690 .pm = &s3c_rtc_pm_ops,
694 .of_match_table = of_match_ptr(s3c_rtc_dt_match), 691 .of_match_table = of_match_ptr(s3c_rtc_dt_match),
695 }, 692 },
696}; 693};