rtc: ab8500: let the core handle the alarm resolution
authorAlexandre Belloni <alexandre.belloni@bootlin.com>
Sun, 7 Nov 2021 22:54:51 +0000 (23:54 +0100)
committerAlexandre Belloni <alexandre.belloni@bootlin.com>
Tue, 9 Nov 2021 23:45:57 +0000 (00:45 +0100)
Tell the RTC core UIE are not supported because the resolution of the alarm
is a minute.

Note that this is in fact also fixing how the resolution is reported as the
previous test was simply ensuring the alarm was more than a minute in the
future while the register has a minute resolution.
This would be ok if the alarm was a countdown but ab8500_rtc_read_alarm
suggests otherwise and the AB8500 datasheet states that the RTC
documentation is not public.

Finally, the comment is wrong and what makes the UIE emulation work is
uie_unsupported being set.

Signed-off-by: Alexandre Belloni <alexandre.belloni@bootlin.com>
Acked-by: Linus Walleij <linus.walleij@linaro.org>
Link: https://lore.kernel.org/r/20211107225458.111068-6-alexandre.belloni@bootlin.com
drivers/rtc/rtc-ab8500.c

index b40048871295d12351e48b00e9f9a6014ace4d7b..ea33e149d5459055cd3756ad846f9b33c1ffcfb6 100644 (file)
@@ -184,25 +184,9 @@ static int ab8500_rtc_set_alarm(struct device *dev, struct rtc_wkalrm *alarm)
 {
        int retval, i;
        unsigned char buf[ARRAY_SIZE(ab8500_rtc_alarm_regs)];
-       unsigned long mins, secs = 0, cursec = 0;
-       struct rtc_time curtm;
+       unsigned long mins;
 
-       /* Get the number of seconds since 1970 */
-       secs = rtc_tm_to_time64(&alarm->time);
-
-       /*
-        * Check whether alarm is set less than 1min.
-        * Since our RTC doesn't support alarm resolution less than 1min,
-        * return -EINVAL, so UIE EMUL can take it up, incase of UIE_ON
-        */
-       ab8500_rtc_read_time(dev, &curtm); /* Read current time */
-       cursec = rtc_tm_to_time64(&curtm);
-       if ((secs - cursec) < 59) {
-               dev_dbg(dev, "Alarm less than 1 minute not supported\r\n");
-               return -EINVAL;
-       }
-
-       mins = secs / 60;
+       mins = (unsigned long)rtc_tm_to_time64(&alarm->time) / 60;
 
        buf[2] = mins & 0xFF;
        buf[1] = (mins >> 8) & 0xFF;
@@ -394,7 +378,8 @@ static int ab8500_rtc_probe(struct platform_device *pdev)
        dev_pm_set_wake_irq(&pdev->dev, irq);
        platform_set_drvdata(pdev, rtc);
 
-       rtc->uie_unsupported = 1;
+       set_bit(RTC_FEATURE_ALARM_RES_MINUTE, rtc->features);
+       clear_bit(RTC_FEATURE_UPDATE_INTERRUPT, rtc->features);
 
        rtc->range_max = (1ULL << 24) * 60 - 1; // 24-bit minutes + 59 secs
        rtc->start_secs = RTC_TIMESTAMP_BEGIN_2000;