rtc: ab8500: let the core handle the alarm resolution
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
This commit is contained in:
parent
27f06af753
commit
a5f828036c
@ -184,25 +184,9 @@ static int ab8500_rtc_set_alarm(struct device *dev, struct rtc_wkalrm *alarm)
|
|||||||
{
|
{
|
||||||
int retval, i;
|
int retval, i;
|
||||||
unsigned char buf[ARRAY_SIZE(ab8500_rtc_alarm_regs)];
|
unsigned char buf[ARRAY_SIZE(ab8500_rtc_alarm_regs)];
|
||||||
unsigned long mins, secs = 0, cursec = 0;
|
unsigned long mins;
|
||||||
struct rtc_time curtm;
|
|
||||||
|
|
||||||
/* Get the number of seconds since 1970 */
|
mins = (unsigned long)rtc_tm_to_time64(&alarm->time) / 60;
|
||||||
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;
|
|
||||||
|
|
||||||
buf[2] = mins & 0xFF;
|
buf[2] = mins & 0xFF;
|
||||||
buf[1] = (mins >> 8) & 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);
|
dev_pm_set_wake_irq(&pdev->dev, irq);
|
||||||
platform_set_drvdata(pdev, rtc);
|
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->range_max = (1ULL << 24) * 60 - 1; // 24-bit minutes + 59 secs
|
||||||
rtc->start_secs = RTC_TIMESTAMP_BEGIN_2000;
|
rtc->start_secs = RTC_TIMESTAMP_BEGIN_2000;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user