Merge tag 'rtc-5.2' of git://git.kernel.org/pub/scm/linux/kernel/git/abelloni/linux
authorLinus Torvalds <torvalds@linux-foundation.org>
Thu, 9 May 2019 21:46:33 +0000 (14:46 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Thu, 9 May 2019 21:46:33 +0000 (14:46 -0700)
Pull RTC updates from Alexandre Belloni:
 "A huge series from me this cycle. I went through many drivers to set
  the date and time range supported by the RTC which helps solving HW
  limitation when the time comes (as early as next year for some). This
  time, I focused on drivers using .set_mms and .set_mmss64, allowing me
  to remove those callbacks. About a third of the patches got reviews, I
  actually own the RTCs and I tested another third and the remaining one
  are unlikely to cause any issues.

  Other than that, a single new driver and the usual fixes here and there.

  Summary:

  Subsystem:

   - set_mmss and set_mmss64 rtc_ops removal

   - Fix timestamp value for RTC_TIMESTAMP_BEGIN_1900

   - Use SPDX identifier for the core

   - validate upper bound of tm->tm_year

  New driver:

   - Aspeed BMC SoC RTC

  Drivers:

   - abx80x: use rtc_add_group

   - ds3232: nvram support

   - pcf85063: add alarm, nvram, offset correction and microcrystal
     rv8263 support

   - x1205: add of_match_table

   - Use set_time instead of set_mms/set_mmss64 for: ab3100, coh901331,
     digicolor, ds1672, ds2404, ep93xx, imxdi, jz4740, lpc32xx, mc13xxx,
     mxc, pcap, stmp3xxx, test, wm831x, xgene.

   - Set RTC range for: ab3100, at91sam9, coh901331, da9063, digicolor,
     dm355evm, ds1672, ds2404, ep39xx, goldfish, imxdi, jz4740, lpc32xx,
     mc13xxx, mv, mxc, omap, pcap, pcf85063, pcf85363, ps3, sh,
     stmp3xxx, sun4v, tegra, wm831x, xgene.

   - Switch to rtc_time64_to_tm/rtc_tm_to_time64 for the driver that
     properly set the RTC range.

   - Use dev_get_drvdata instead of multiple indirections"

* tag 'rtc-5.2' of git://git.kernel.org/pub/scm/linux/kernel/git/abelloni/linux: (177 commits)
  rtc: snvs: Use __maybe_unused instead of #if CONFIG_PM_SLEEP
  rtc: imxdi: remove unused variable
  rtc: drop set_mms and set_mmss64
  rtc: pcap: convert to SPDX identifier
  rtc: pcap: use .set_time
  rtc: pcap: switch to rtc_time64_to_tm/rtc_tm_to_time64
  rtc: pcap: set range
  rtc: digicolor: convert to SPDX identifier
  rtc: digicolor: use .set_time
  rtc: digicolor: set range
  rtc: digicolor: fix possible race condition
  rtc: jz4740: convert to SPDX identifier
  rtc: jz4740: rework invalid time detection
  rtc: jz4740: use dev_pm_set_wake_irq() to simplify code
  rtc: jz4740: use .set_time
  rtc: jz4740: remove useless check
  rtc: jz4740: switch to rtc_time64_to_tm/rtc_tm_to_time64
  rtc: jz4740: set range
  rtc: 88pm860x: prevent use-after-free on device remove
  rtc: Use dev_get_drvdata()
  ...

1  2 
drivers/rtc/Kconfig
drivers/rtc/rtc-da9063.c
drivers/rtc/rtc-sh.c

diff --combined drivers/rtc/Kconfig
index f933c06bff4f804a3e77408d51fe15606b62e135,8a1347da79277e4eda6d502a89630661c0166137..7b8e156dbf383f2b033fe45bcc38e6f317de4208
@@@ -439,6 -439,7 +439,7 @@@ config RTC_DRV_PCF852
  
  config RTC_DRV_PCF85063
        tristate "NXP PCF85063"
+       select REGMAP_I2C
        help
          If you say yes here you get support for the PCF85063 RTC chip
  
  
  config RTC_DRV_PCF85363
        tristate "NXP PCF85363"
-       depends on I2C
        select REGMAP_I2C
        help
          If you say yes here you get support for the PCF85363 RTC chip.
@@@ -602,7 -602,6 +602,6 @@@ config RTC_DRV_FM313
  
  config RTC_DRV_RX8010
        tristate "Epson RX8010SJ"
-       depends on I2C
        help
          If you say yes here you get support for the Epson RX8010SJ RTC
          chip.
@@@ -667,9 -666,9 +666,9 @@@ config RTC_DRV_S5
          will be called rtc-s5m.
  
  config RTC_DRV_SD3078
 -    tristate "ZXW Crystal SD3078"
 +    tristate "ZXW Shenzhen whwave SD3078"
      help
 -      If you say yes here you get support for the ZXW Crystal
 +      If you say yes here you get support for the ZXW Shenzhen whwave
        SD3078 RTC chips.
  
        This driver can also be built as a module. If so, the module
@@@ -1432,7 -1431,7 +1431,7 @@@ config RTC_DRV_AT91RM920
  config RTC_DRV_AT91SAM9
        tristate "AT91SAM9 RTT as RTC"
        depends on ARCH_AT91 || COMPILE_TEST
-       depends on HAS_IOMEM
+       depends on OF && HAS_IOMEM
        select MFD_SYSCON
        help
          Some AT91SAM9 SoCs provide an RTT (Real Time Timer) block which
@@@ -1841,6 -1840,17 +1840,17 @@@ config RTC_DRV_RTD119
          If you say yes here, you get support for the RTD1295 SoC
          Real Time Clock.
  
+ config RTC_DRV_ASPEED
+       tristate "ASPEED RTC"
+       depends on OF
+       depends on ARCH_ASPEED || COMPILE_TEST
+       help
+         If you say yes here you get support for the ASPEED BMC SoC real time
+         clocks.
+         This driver can also be built as a module, if so, the module
+         will be called "rtc-aspeed".
  comment "HID Sensor RTC drivers"
  
  config RTC_DRV_HID_SENSOR_TIME
  
  config RTC_DRV_GOLDFISH
        tristate "Goldfish Real Time Clock"
-       depends on MIPS && (GOLDFISH || COMPILE_TEST)
+       depends on OF && HAS_IOMEM
+       depends on GOLDFISH || COMPILE_TEST
        help
          Say yes to enable RTC driver for the Goldfish based virtual platform.
  
diff --combined drivers/rtc/rtc-da9063.c
index 69b54e5556c06234c5339431f3149bc923ebcf49,1b792bcea3c789665be96b0e29ec51d2457b8a81..15908d51b1cbbbf16b1d9e650497bb61399ef7b8
@@@ -1,15 -1,7 +1,7 @@@
- /* rtc-da9063.c - Real time clock device driver for DA9063
+ // SPDX-License-Identifier: GPL-2.0+
+ /*
+  * Real time clock device driver for DA9063
   * Copyright (C) 2013-2015  Dialog Semiconductor Ltd.
-  *
-  * This program is free software; you can redistribute it and/or
-  * modify it under the terms of the GNU General Public License
-  * as published by the Free Software Foundation; either version 2
-  * of the License, or (at your option) any later version.
-  *
-  * This program is distributed in the hope that it will be useful,
-  * but WITHOUT ANY WARRANTY; without even the implied warranty of
-  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-  * GNU General Public License for more details.
   */
  
  #include <linux/delay.h>
@@@ -247,8 -239,8 +239,8 @@@ static int da9063_rtc_read_time(struct 
  
        da9063_data_to_tm(data, tm, rtc);
  
-       rtc_tm_to_time(tm, &tm_secs);
-       rtc_tm_to_time(&rtc->alarm_time, &al_secs);
+       tm_secs = rtc_tm_to_time64(tm);
+       al_secs = rtc_tm_to_time64(&rtc->alarm_time);
  
        /* handle the rtc synchronisation delay */
        if (rtc->rtc_sync == true && al_secs - tm_secs == 1)
@@@ -472,21 -464,17 +464,24 @@@ static int da9063_rtc_probe(struct plat
  
        platform_set_drvdata(pdev, rtc);
  
-       rtc->rtc_dev = devm_rtc_device_register(&pdev->dev, DA9063_DRVNAME_RTC,
-                                          &da9063_rtc_ops, THIS_MODULE);
+       rtc->rtc_dev = devm_rtc_allocate_device(&pdev->dev);
        if (IS_ERR(rtc->rtc_dev))
                return PTR_ERR(rtc->rtc_dev);
  
+       rtc->rtc_dev->ops = &da9063_rtc_ops;
+       rtc->rtc_dev->range_min = RTC_TIMESTAMP_BEGIN_2000;
+       rtc->rtc_dev->range_max = RTC_TIMESTAMP_END_2063;
        da9063_data_to_tm(data, &rtc->alarm_time, rtc);
        rtc->rtc_sync = false;
  
 +      /*
 +       * TODO: some models have alarms on a minute boundary but still support
 +       * real hardware interrupts. Add this once the core supports it.
 +       */
 +      if (config->rtc_data_start != RTC_SEC)
 +              rtc->rtc_dev->uie_unsupported = 1;
 +
        irq_alarm = platform_get_irq_byname(pdev, "ALARM");
        ret = devm_request_threaded_irq(&pdev->dev, irq_alarm, NULL,
                                        da9063_alarm_event,
                dev_err(&pdev->dev, "Failed to request ALARM IRQ %d: %d\n",
                        irq_alarm, ret);
  
-       return ret;
+       return rtc_register_device(rtc->rtc_dev);
  }
  
  static struct platform_driver da9063_rtc_driver = {
diff --combined drivers/rtc/rtc-sh.c
index 1d3de2a3d1a4d7a0ad5a7d327efaaca0d72f468c,4cca54aa6e2405740329970cf1b08c08c10672f5..579b3ff5c644fd9df948ed2773bd7a99694e27ca
@@@ -276,6 -276,9 +276,9 @@@ static int sh_rtc_read_time(struct devi
        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;
  
@@@ -374,7 -377,7 +377,7 @@@ static int sh_rtc_set_time(struct devic
  static inline int sh_rtc_read_alarm_value(struct sh_rtc *rtc, int reg_off)
  {
        unsigned int byte;
 -      int value = 0xff;       /* return 0xff for ignored values */
 +      int value = -1;                 /* return -1 for ignored values */
  
        byte = readb(rtc->regbase + reg_off);
        if (byte & AR_ENB) {
@@@ -466,7 -469,6 +469,6 @@@ static int __init sh_rtc_probe(struct p
  {
        struct sh_rtc *rtc;
        struct resource *res;
-       struct rtc_time r;
        char clk_name[6];
        int clk_id, ret;
  
                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;
        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;