]> asedeno.scripts.mit.edu Git - linux.git/blobdiff - drivers/rtc/rtc-sh.c
drm/komeda: Update the chip identify
[linux.git] / drivers / rtc / rtc-sh.c
index 1d3de2a3d1a4d7a0ad5a7d327efaaca0d72f468c..579b3ff5c644fd9df948ed2773bd7a99694e27ca 100644 (file)
@@ -276,6 +276,9 @@ static int sh_rtc_read_time(struct device *dev, struct rtc_time *tm)
        struct sh_rtc *rtc = dev_get_drvdata(dev);
        unsigned int sec128, sec2, yr, yr100, cf_bit;
 
+       if (!(readb(rtc->regbase + RCR2) & RCR2_RTCEN))
+               return -EINVAL;
+
        do {
                unsigned int tmp;
 
@@ -466,7 +469,6 @@ static int __init sh_rtc_probe(struct platform_device *pdev)
 {
        struct sh_rtc *rtc;
        struct resource *res;
-       struct rtc_time r;
        char clk_name[6];
        int clk_id, ret;
 
@@ -528,6 +530,10 @@ static int __init sh_rtc_probe(struct platform_device *pdev)
                rtc->clk = NULL;
        }
 
+       rtc->rtc_dev = devm_rtc_allocate_device(&pdev->dev);
+       if (IS_ERR(rtc->rtc_dev))
+               return PTR_ERR(rtc->rtc_dev);
+
        clk_enable(rtc->clk);
 
        rtc->capabilities = RTC_DEF_CAPABILITIES;
@@ -591,21 +597,21 @@ static int __init sh_rtc_probe(struct platform_device *pdev)
        sh_rtc_setaie(&pdev->dev, 0);
        sh_rtc_setcie(&pdev->dev, 0);
 
-       rtc->rtc_dev = devm_rtc_device_register(&pdev->dev, "sh",
-                                          &sh_rtc_ops, THIS_MODULE);
-       if (IS_ERR(rtc->rtc_dev)) {
-               ret = PTR_ERR(rtc->rtc_dev);
-               goto err_unmap;
-       }
-
+       rtc->rtc_dev->ops = &sh_rtc_ops;
        rtc->rtc_dev->max_user_freq = 256;
 
-       /* reset rtc to epoch 0 if time is invalid */
-       if (rtc_read_time(rtc->rtc_dev, &r) < 0) {
-               rtc_time_to_tm(0, &r);
-               rtc_set_time(rtc->rtc_dev, &r);
+       if (rtc->capabilities & RTC_CAP_4_DIGIT_YEAR) {
+               rtc->rtc_dev->range_min = RTC_TIMESTAMP_BEGIN_1900;
+               rtc->rtc_dev->range_max = RTC_TIMESTAMP_END_9999;
+       } else {
+               rtc->rtc_dev->range_min = mktime64(1999, 1, 1, 0, 0, 0);
+               rtc->rtc_dev->range_max = mktime64(2098, 12, 31, 23, 59, 59);
        }
 
+       ret = rtc_register_device(rtc->rtc_dev);
+       if (ret)
+               goto err_unmap;
+
        device_init_wakeup(&pdev->dev, 1);
        return 0;