diff options
Diffstat (limited to 'drivers/rtc/rtc-s3c.c')
-rw-r--r-- | drivers/rtc/rtc-s3c.c | 37 |
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; | |||
51 | static void __iomem *s3c_rtc_base; | 51 | static void __iomem *s3c_rtc_base; |
52 | static int s3c_rtc_alarmno = NO_IRQ; | 52 | static int s3c_rtc_alarmno = NO_IRQ; |
53 | static int s3c_rtc_tickno = NO_IRQ; | 53 | static int s3c_rtc_tickno = NO_IRQ; |
54 | static bool wake_en; | ||
55 | static enum s3c_cpu_type s3c_rtc_cpu_type; | 54 | static enum s3c_cpu_type s3c_rtc_cpu_type; |
56 | 55 | ||
57 | static DEFINE_SPINLOCK(s3c_rtc_pie_lock); | 56 | static DEFINE_SPINLOCK(s3c_rtc_pie_lock); |
@@ -423,13 +422,11 @@ static void s3c_rtc_enable(struct platform_device *pdev, int en) | |||
423 | 422 | ||
424 | static int s3c_rtc_remove(struct platform_device *dev) | 423 | static 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 | ||
590 | static int ticnt_save, ticnt_en_save; | 585 | static int ticnt_save, ticnt_en_save; |
586 | static bool wake_en; | ||
591 | 587 | ||
592 | static int s3c_rtc_suspend(struct platform_device *pdev, pm_message_t state) | 588 | static 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 | ||
614 | static int s3c_rtc_resume(struct platform_device *pdev) | 612 | static 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 | ||
635 | static SIMPLE_DEV_PM_OPS(s3c_rtc_pm_ops, s3c_rtc_suspend, s3c_rtc_resume); | ||
636 | |||
639 | #ifdef CONFIG_OF | 637 | #ifdef CONFIG_OF |
640 | static struct s3c_rtc_drv_data s3c_rtc_drv_data_array[] = { | 638 | static 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); | |||
685 | static struct platform_driver s3c_rtc_driver = { | 683 | static 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 | }; |