diff options
Diffstat (limited to 'drivers/rtc/rtc-sh.c')
-rw-r--r-- | drivers/rtc/rtc-sh.c | 74 |
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 | ||
738 | err_unmap: | 728 | err_unmap: |
739 | clk_disable(rtc->clk); | 729 | clk_disable(rtc->clk); |
740 | clk_put(rtc->clk); | ||
741 | iounmap(rtc->regbase); | ||
742 | err_badmap: | ||
743 | release_mem_region(rtc->res->start, rtc->regsize); | ||
744 | err_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 | } |