aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/rtc/rtc-sh.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/rtc/rtc-sh.c')
-rw-r--r--drivers/rtc/rtc-sh.c74
1 files changed, 21 insertions, 53 deletions
diff --git a/drivers/rtc/rtc-sh.c b/drivers/rtc/rtc-sh.c
index 8d5bd2e36776..6d87e26355a3 100644
--- a/drivers/rtc/rtc-sh.c
+++ b/drivers/rtc/rtc-sh.c
@@ -593,7 +593,7 @@ static int __init sh_rtc_probe(struct platform_device *pdev)
593 char clk_name[6]; 593 char clk_name[6];
594 int clk_id, ret; 594 int clk_id, ret;
595 595
596 rtc = kzalloc(sizeof(struct sh_rtc), GFP_KERNEL); 596 rtc = devm_kzalloc(&pdev->dev, sizeof(*rtc), GFP_KERNEL);
597 if (unlikely(!rtc)) 597 if (unlikely(!rtc))
598 return -ENOMEM; 598 return -ENOMEM;
599 599
@@ -602,9 +602,8 @@ static int __init sh_rtc_probe(struct platform_device *pdev)
602 /* get periodic/carry/alarm irqs */ 602 /* get periodic/carry/alarm irqs */
603 ret = platform_get_irq(pdev, 0); 603 ret = platform_get_irq(pdev, 0);
604 if (unlikely(ret <= 0)) { 604 if (unlikely(ret <= 0)) {
605 ret = -ENOENT;
606 dev_err(&pdev->dev, "No IRQ resource\n"); 605 dev_err(&pdev->dev, "No IRQ resource\n");
607 goto err_badres; 606 return -ENOENT;
608 } 607 }
609 608
610 rtc->periodic_irq = ret; 609 rtc->periodic_irq = ret;
@@ -613,24 +612,21 @@ static int __init sh_rtc_probe(struct platform_device *pdev)
613 612
614 res = platform_get_resource(pdev, IORESOURCE_IO, 0); 613 res = platform_get_resource(pdev, IORESOURCE_IO, 0);
615 if (unlikely(res == NULL)) { 614 if (unlikely(res == NULL)) {
616 ret = -ENOENT;
617 dev_err(&pdev->dev, "No IO resource\n"); 615 dev_err(&pdev->dev, "No IO resource\n");
618 goto err_badres; 616 return -ENOENT;
619 } 617 }
620 618
621 rtc->regsize = resource_size(res); 619 rtc->regsize = resource_size(res);
622 620
623 rtc->res = request_mem_region(res->start, rtc->regsize, pdev->name); 621 rtc->res = devm_request_mem_region(&pdev->dev, res->start,
624 if (unlikely(!rtc->res)) { 622 rtc->regsize, pdev->name);
625 ret = -EBUSY; 623 if (unlikely(!rtc->res))
626 goto err_badres; 624 return -EBUSY;
627 }
628 625
629 rtc->regbase = ioremap_nocache(rtc->res->start, rtc->regsize); 626 rtc->regbase = devm_ioremap_nocache(&pdev->dev, rtc->res->start,
630 if (unlikely(!rtc->regbase)) { 627 rtc->regsize);
631 ret = -EINVAL; 628 if (unlikely(!rtc->regbase))
632 goto err_badmap; 629 return -EINVAL;
633 }
634 630
635 clk_id = pdev->id; 631 clk_id = pdev->id;
636 /* With a single device, the clock id is still "rtc0" */ 632 /* With a single device, the clock id is still "rtc0" */
@@ -639,7 +635,7 @@ static int __init sh_rtc_probe(struct platform_device *pdev)
639 635
640 snprintf(clk_name, sizeof(clk_name), "rtc%d", clk_id); 636 snprintf(clk_name, sizeof(clk_name), "rtc%d", clk_id);
641 637
642 rtc->clk = clk_get(&pdev->dev, clk_name); 638 rtc->clk = devm_clk_get(&pdev->dev, clk_name);
643 if (IS_ERR(rtc->clk)) { 639 if (IS_ERR(rtc->clk)) {
644 /* 640 /*
645 * No error handling for rtc->clk intentionally, not all 641 * No error handling for rtc->clk intentionally, not all
@@ -665,8 +661,8 @@ static int __init sh_rtc_probe(struct platform_device *pdev)
665 661
666 if (rtc->carry_irq <= 0) { 662 if (rtc->carry_irq <= 0) {
667 /* register shared periodic/carry/alarm irq */ 663 /* register shared periodic/carry/alarm irq */
668 ret = request_irq(rtc->periodic_irq, sh_rtc_shared, 664 ret = devm_request_irq(&pdev->dev, rtc->periodic_irq,
669 0, "sh-rtc", rtc); 665 sh_rtc_shared, 0, "sh-rtc", rtc);
670 if (unlikely(ret)) { 666 if (unlikely(ret)) {
671 dev_err(&pdev->dev, 667 dev_err(&pdev->dev,
672 "request IRQ failed with %d, IRQ %d\n", ret, 668 "request IRQ failed with %d, IRQ %d\n", ret,
@@ -675,8 +671,8 @@ static int __init sh_rtc_probe(struct platform_device *pdev)
675 } 671 }
676 } else { 672 } else {
677 /* register periodic/carry/alarm irqs */ 673 /* register periodic/carry/alarm irqs */
678 ret = request_irq(rtc->periodic_irq, sh_rtc_periodic, 674 ret = devm_request_irq(&pdev->dev, rtc->periodic_irq,
679 0, "sh-rtc period", rtc); 675 sh_rtc_periodic, 0, "sh-rtc period", rtc);
680 if (unlikely(ret)) { 676 if (unlikely(ret)) {
681 dev_err(&pdev->dev, 677 dev_err(&pdev->dev,
682 "request period IRQ failed with %d, IRQ %d\n", 678 "request period IRQ failed with %d, IRQ %d\n",
@@ -684,24 +680,21 @@ static int __init sh_rtc_probe(struct platform_device *pdev)
684 goto err_unmap; 680 goto err_unmap;
685 } 681 }
686 682
687 ret = request_irq(rtc->carry_irq, sh_rtc_interrupt, 683 ret = devm_request_irq(&pdev->dev, rtc->carry_irq,
688 0, "sh-rtc carry", rtc); 684 sh_rtc_interrupt, 0, "sh-rtc carry", rtc);
689 if (unlikely(ret)) { 685 if (unlikely(ret)) {
690 dev_err(&pdev->dev, 686 dev_err(&pdev->dev,
691 "request carry IRQ failed with %d, IRQ %d\n", 687 "request carry IRQ failed with %d, IRQ %d\n",
692 ret, rtc->carry_irq); 688 ret, rtc->carry_irq);
693 free_irq(rtc->periodic_irq, rtc);
694 goto err_unmap; 689 goto err_unmap;
695 } 690 }
696 691
697 ret = request_irq(rtc->alarm_irq, sh_rtc_alarm, 692 ret = devm_request_irq(&pdev->dev, rtc->alarm_irq,
698 0, "sh-rtc alarm", rtc); 693 sh_rtc_alarm, 0, "sh-rtc alarm", rtc);
699 if (unlikely(ret)) { 694 if (unlikely(ret)) {
700 dev_err(&pdev->dev, 695 dev_err(&pdev->dev,
701 "request alarm IRQ failed with %d, IRQ %d\n", 696 "request alarm IRQ failed with %d, IRQ %d\n",
702 ret, rtc->alarm_irq); 697 ret, rtc->alarm_irq);
703 free_irq(rtc->carry_irq, rtc);
704 free_irq(rtc->periodic_irq, rtc);
705 goto err_unmap; 698 goto err_unmap;
706 } 699 }
707 } 700 }
@@ -714,13 +707,10 @@ static int __init sh_rtc_probe(struct platform_device *pdev)
714 sh_rtc_setaie(&pdev->dev, 0); 707 sh_rtc_setaie(&pdev->dev, 0);
715 sh_rtc_setcie(&pdev->dev, 0); 708 sh_rtc_setcie(&pdev->dev, 0);
716 709
717 rtc->rtc_dev = rtc_device_register("sh", &pdev->dev, 710 rtc->rtc_dev = devm_rtc_device_register(&pdev->dev, "sh",
718 &sh_rtc_ops, THIS_MODULE); 711 &sh_rtc_ops, THIS_MODULE);
719 if (IS_ERR(rtc->rtc_dev)) { 712 if (IS_ERR(rtc->rtc_dev)) {
720 ret = PTR_ERR(rtc->rtc_dev); 713 ret = PTR_ERR(rtc->rtc_dev);
721 free_irq(rtc->periodic_irq, rtc);
722 free_irq(rtc->carry_irq, rtc);
723 free_irq(rtc->alarm_irq, rtc);
724 goto err_unmap; 714 goto err_unmap;
725 } 715 }
726 716
@@ -737,12 +727,6 @@ static int __init sh_rtc_probe(struct platform_device *pdev)
737 727
738err_unmap: 728err_unmap:
739 clk_disable(rtc->clk); 729 clk_disable(rtc->clk);
740 clk_put(rtc->clk);
741 iounmap(rtc->regbase);
742err_badmap:
743 release_mem_region(rtc->res->start, rtc->regsize);
744err_badres:
745 kfree(rtc);
746 730
747 return ret; 731 return ret;
748} 732}
@@ -751,28 +735,12 @@ static int __exit sh_rtc_remove(struct platform_device *pdev)
751{ 735{
752 struct sh_rtc *rtc = platform_get_drvdata(pdev); 736 struct sh_rtc *rtc = platform_get_drvdata(pdev);
753 737
754 rtc_device_unregister(rtc->rtc_dev);
755 sh_rtc_irq_set_state(&pdev->dev, 0); 738 sh_rtc_irq_set_state(&pdev->dev, 0);
756 739
757 sh_rtc_setaie(&pdev->dev, 0); 740 sh_rtc_setaie(&pdev->dev, 0);
758 sh_rtc_setcie(&pdev->dev, 0); 741 sh_rtc_setcie(&pdev->dev, 0);
759 742
760 free_irq(rtc->periodic_irq, rtc);
761
762 if (rtc->carry_irq > 0) {
763 free_irq(rtc->carry_irq, rtc);
764 free_irq(rtc->alarm_irq, rtc);
765 }
766
767 iounmap(rtc->regbase);
768 release_mem_region(rtc->res->start, rtc->regsize);
769
770 clk_disable(rtc->clk); 743 clk_disable(rtc->clk);
771 clk_put(rtc->clk);
772
773 platform_set_drvdata(pdev, NULL);
774
775 kfree(rtc);
776 744
777 return 0; 745 return 0;
778} 746}