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.c102
1 files changed, 36 insertions, 66 deletions
diff --git a/drivers/rtc/rtc-sh.c b/drivers/rtc/rtc-sh.c
index d7310adb7152..06e41ed93230 100644
--- a/drivers/rtc/rtc-sh.c
+++ b/drivers/rtc/rtc-sh.c
@@ -26,10 +26,11 @@
26#include <linux/io.h> 26#include <linux/io.h>
27#include <linux/log2.h> 27#include <linux/log2.h>
28#include <linux/clk.h> 28#include <linux/clk.h>
29#include <linux/slab.h>
29#include <asm/rtc.h> 30#include <asm/rtc.h>
30 31
31#define DRV_NAME "sh-rtc" 32#define DRV_NAME "sh-rtc"
32#define DRV_VERSION "0.2.2" 33#define DRV_VERSION "0.2.3"
33 34
34#define RTC_REG(r) ((r) * rtc_reg_size) 35#define RTC_REG(r) ((r) * rtc_reg_size)
35 36
@@ -215,7 +216,7 @@ static irqreturn_t sh_rtc_shared(int irq, void *dev_id)
215 return IRQ_RETVAL(ret); 216 return IRQ_RETVAL(ret);
216} 217}
217 218
218static inline void sh_rtc_setpie(struct device *dev, unsigned int enable) 219static int sh_rtc_irq_set_state(struct device *dev, int enable)
219{ 220{
220 struct sh_rtc *rtc = dev_get_drvdata(dev); 221 struct sh_rtc *rtc = dev_get_drvdata(dev);
221 unsigned int tmp; 222 unsigned int tmp;
@@ -225,17 +226,22 @@ static inline void sh_rtc_setpie(struct device *dev, unsigned int enable)
225 tmp = readb(rtc->regbase + RCR2); 226 tmp = readb(rtc->regbase + RCR2);
226 227
227 if (enable) { 228 if (enable) {
229 rtc->periodic_freq |= PF_KOU;
228 tmp &= ~RCR2_PEF; /* Clear PES bit */ 230 tmp &= ~RCR2_PEF; /* Clear PES bit */
229 tmp |= (rtc->periodic_freq & ~PF_HP); /* Set PES2-0 */ 231 tmp |= (rtc->periodic_freq & ~PF_HP); /* Set PES2-0 */
230 } else 232 } else {
233 rtc->periodic_freq &= ~PF_KOU;
231 tmp &= ~(RCR2_PESMASK | RCR2_PEF); 234 tmp &= ~(RCR2_PESMASK | RCR2_PEF);
235 }
232 236
233 writeb(tmp, rtc->regbase + RCR2); 237 writeb(tmp, rtc->regbase + RCR2);
234 238
235 spin_unlock_irq(&rtc->lock); 239 spin_unlock_irq(&rtc->lock);
240
241 return 0;
236} 242}
237 243
238static inline int sh_rtc_setfreq(struct device *dev, unsigned int freq) 244static int sh_rtc_irq_set_freq(struct device *dev, int freq)
239{ 245{
240 struct sh_rtc *rtc = dev_get_drvdata(dev); 246 struct sh_rtc *rtc = dev_get_drvdata(dev);
241 int tmp, ret = 0; 247 int tmp, ret = 0;
@@ -278,10 +284,8 @@ static inline int sh_rtc_setfreq(struct device *dev, unsigned int freq)
278 ret = -ENOTSUPP; 284 ret = -ENOTSUPP;
279 } 285 }
280 286
281 if (ret == 0) { 287 if (ret == 0)
282 rtc->periodic_freq |= tmp; 288 rtc->periodic_freq |= tmp;
283 rtc->rtc_dev->irq_freq = freq;
284 }
285 289
286 spin_unlock_irq(&rtc->lock); 290 spin_unlock_irq(&rtc->lock);
287 return ret; 291 return ret;
@@ -346,10 +350,6 @@ static int sh_rtc_ioctl(struct device *dev, unsigned int cmd, unsigned long arg)
346 unsigned int ret = 0; 350 unsigned int ret = 0;
347 351
348 switch (cmd) { 352 switch (cmd) {
349 case RTC_PIE_OFF:
350 case RTC_PIE_ON:
351 sh_rtc_setpie(dev, cmd == RTC_PIE_ON);
352 break;
353 case RTC_AIE_OFF: 353 case RTC_AIE_OFF:
354 case RTC_AIE_ON: 354 case RTC_AIE_ON:
355 sh_rtc_setaie(dev, cmd == RTC_AIE_ON); 355 sh_rtc_setaie(dev, cmd == RTC_AIE_ON);
@@ -362,13 +362,6 @@ static int sh_rtc_ioctl(struct device *dev, unsigned int cmd, unsigned long arg)
362 rtc->periodic_freq |= PF_OXS; 362 rtc->periodic_freq |= PF_OXS;
363 sh_rtc_setcie(dev, 1); 363 sh_rtc_setcie(dev, 1);
364 break; 364 break;
365 case RTC_IRQP_READ:
366 ret = put_user(rtc->rtc_dev->irq_freq,
367 (unsigned long __user *)arg);
368 break;
369 case RTC_IRQP_SET:
370 ret = sh_rtc_setfreq(dev, arg);
371 break;
372 default: 365 default:
373 ret = -ENOIOCTLCMD; 366 ret = -ENOIOCTLCMD;
374 } 367 }
@@ -602,28 +595,6 @@ static int sh_rtc_set_alarm(struct device *dev, struct rtc_wkalrm *wkalrm)
602 return 0; 595 return 0;
603} 596}
604 597
605static int sh_rtc_irq_set_state(struct device *dev, int enabled)
606{
607 struct platform_device *pdev = to_platform_device(dev);
608 struct sh_rtc *rtc = platform_get_drvdata(pdev);
609
610 if (enabled) {
611 rtc->periodic_freq |= PF_KOU;
612 return sh_rtc_ioctl(dev, RTC_PIE_ON, 0);
613 } else {
614 rtc->periodic_freq &= ~PF_KOU;
615 return sh_rtc_ioctl(dev, RTC_PIE_OFF, 0);
616 }
617}
618
619static int sh_rtc_irq_set_freq(struct device *dev, int freq)
620{
621 if (!is_power_of_2(freq))
622 return -EINVAL;
623
624 return sh_rtc_ioctl(dev, RTC_IRQP_SET, freq);
625}
626
627static struct rtc_class_ops sh_rtc_ops = { 598static struct rtc_class_ops sh_rtc_ops = {
628 .ioctl = sh_rtc_ioctl, 599 .ioctl = sh_rtc_ioctl,
629 .read_time = sh_rtc_read_time, 600 .read_time = sh_rtc_read_time,
@@ -635,7 +606,7 @@ static struct rtc_class_ops sh_rtc_ops = {
635 .proc = sh_rtc_proc, 606 .proc = sh_rtc_proc,
636}; 607};
637 608
638static int __devinit sh_rtc_probe(struct platform_device *pdev) 609static int __init sh_rtc_probe(struct platform_device *pdev)
639{ 610{
640 struct sh_rtc *rtc; 611 struct sh_rtc *rtc;
641 struct resource *res; 612 struct resource *res;
@@ -702,13 +673,6 @@ static int __devinit sh_rtc_probe(struct platform_device *pdev)
702 673
703 clk_enable(rtc->clk); 674 clk_enable(rtc->clk);
704 675
705 rtc->rtc_dev = rtc_device_register("sh", &pdev->dev,
706 &sh_rtc_ops, THIS_MODULE);
707 if (IS_ERR(rtc->rtc_dev)) {
708 ret = PTR_ERR(rtc->rtc_dev);
709 goto err_unmap;
710 }
711
712 rtc->capabilities = RTC_DEF_CAPABILITIES; 676 rtc->capabilities = RTC_DEF_CAPABILITIES;
713 if (pdev->dev.platform_data) { 677 if (pdev->dev.platform_data) {
714 struct sh_rtc_platform_info *pinfo = pdev->dev.platform_data; 678 struct sh_rtc_platform_info *pinfo = pdev->dev.platform_data;
@@ -720,10 +684,6 @@ static int __devinit sh_rtc_probe(struct platform_device *pdev)
720 rtc->capabilities |= pinfo->capabilities; 684 rtc->capabilities |= pinfo->capabilities;
721 } 685 }
722 686
723 rtc->rtc_dev->max_user_freq = 256;
724
725 platform_set_drvdata(pdev, rtc);
726
727 if (rtc->carry_irq <= 0) { 687 if (rtc->carry_irq <= 0) {
728 /* register shared periodic/carry/alarm irq */ 688 /* register shared periodic/carry/alarm irq */
729 ret = request_irq(rtc->periodic_irq, sh_rtc_shared, 689 ret = request_irq(rtc->periodic_irq, sh_rtc_shared,
@@ -767,13 +727,26 @@ static int __devinit sh_rtc_probe(struct platform_device *pdev)
767 } 727 }
768 } 728 }
769 729
730 platform_set_drvdata(pdev, rtc);
731
770 /* everything disabled by default */ 732 /* everything disabled by default */
771 rtc->periodic_freq = 0; 733 sh_rtc_irq_set_freq(&pdev->dev, 0);
772 rtc->rtc_dev->irq_freq = 0; 734 sh_rtc_irq_set_state(&pdev->dev, 0);
773 sh_rtc_setpie(&pdev->dev, 0);
774 sh_rtc_setaie(&pdev->dev, 0); 735 sh_rtc_setaie(&pdev->dev, 0);
775 sh_rtc_setcie(&pdev->dev, 0); 736 sh_rtc_setcie(&pdev->dev, 0);
776 737
738 rtc->rtc_dev = rtc_device_register("sh", &pdev->dev,
739 &sh_rtc_ops, THIS_MODULE);
740 if (IS_ERR(rtc->rtc_dev)) {
741 ret = PTR_ERR(rtc->rtc_dev);
742 free_irq(rtc->periodic_irq, rtc);
743 free_irq(rtc->carry_irq, rtc);
744 free_irq(rtc->alarm_irq, rtc);
745 goto err_unmap;
746 }
747
748 rtc->rtc_dev->max_user_freq = 256;
749
777 /* reset rtc to epoch 0 if time is invalid */ 750 /* reset rtc to epoch 0 if time is invalid */
778 if (rtc_read_time(rtc->rtc_dev, &r) < 0) { 751 if (rtc_read_time(rtc->rtc_dev, &r) < 0) {
779 rtc_time_to_tm(0, &r); 752 rtc_time_to_tm(0, &r);
@@ -788,21 +761,20 @@ err_unmap:
788 clk_put(rtc->clk); 761 clk_put(rtc->clk);
789 iounmap(rtc->regbase); 762 iounmap(rtc->regbase);
790err_badmap: 763err_badmap:
791 release_resource(rtc->res); 764 release_mem_region(rtc->res->start, rtc->regsize);
792err_badres: 765err_badres:
793 kfree(rtc); 766 kfree(rtc);
794 767
795 return ret; 768 return ret;
796} 769}
797 770
798static int __devexit sh_rtc_remove(struct platform_device *pdev) 771static int __exit sh_rtc_remove(struct platform_device *pdev)
799{ 772{
800 struct sh_rtc *rtc = platform_get_drvdata(pdev); 773 struct sh_rtc *rtc = platform_get_drvdata(pdev);
801 774
802 if (likely(rtc->rtc_dev)) 775 rtc_device_unregister(rtc->rtc_dev);
803 rtc_device_unregister(rtc->rtc_dev); 776 sh_rtc_irq_set_state(&pdev->dev, 0);
804 777
805 sh_rtc_setpie(&pdev->dev, 0);
806 sh_rtc_setaie(&pdev->dev, 0); 778 sh_rtc_setaie(&pdev->dev, 0);
807 sh_rtc_setcie(&pdev->dev, 0); 779 sh_rtc_setcie(&pdev->dev, 0);
808 780
@@ -813,9 +785,8 @@ static int __devexit sh_rtc_remove(struct platform_device *pdev)
813 free_irq(rtc->alarm_irq, rtc); 785 free_irq(rtc->alarm_irq, rtc);
814 } 786 }
815 787
816 release_resource(rtc->res);
817
818 iounmap(rtc->regbase); 788 iounmap(rtc->regbase);
789 release_mem_region(rtc->res->start, rtc->regsize);
819 790
820 clk_disable(rtc->clk); 791 clk_disable(rtc->clk);
821 clk_put(rtc->clk); 792 clk_put(rtc->clk);
@@ -856,7 +827,7 @@ static int sh_rtc_resume(struct device *dev)
856 return 0; 827 return 0;
857} 828}
858 829
859static struct dev_pm_ops sh_rtc_dev_pm_ops = { 830static const struct dev_pm_ops sh_rtc_dev_pm_ops = {
860 .suspend = sh_rtc_suspend, 831 .suspend = sh_rtc_suspend,
861 .resume = sh_rtc_resume, 832 .resume = sh_rtc_resume,
862}; 833};
@@ -867,13 +838,12 @@ static struct platform_driver sh_rtc_platform_driver = {
867 .owner = THIS_MODULE, 838 .owner = THIS_MODULE,
868 .pm = &sh_rtc_dev_pm_ops, 839 .pm = &sh_rtc_dev_pm_ops,
869 }, 840 },
870 .probe = sh_rtc_probe, 841 .remove = __exit_p(sh_rtc_remove),
871 .remove = __devexit_p(sh_rtc_remove),
872}; 842};
873 843
874static int __init sh_rtc_init(void) 844static int __init sh_rtc_init(void)
875{ 845{
876 return platform_driver_register(&sh_rtc_platform_driver); 846 return platform_driver_probe(&sh_rtc_platform_driver, sh_rtc_probe);
877} 847}
878 848
879static void __exit sh_rtc_exit(void) 849static void __exit sh_rtc_exit(void)