mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-08-31 15:22:21 -04:00
rtc: rzn1: Handle unset alarm weekday in rzn1_rtc_read_alarm
RZN1_RTC_ALW is a weekday bitmask where bit N represents weekday N.
When no alarm has been configured, the register has its power-on-reset
value of zero.
rzn1_rtc_read_alarm() uses fls() to convert the weekday bitmask into a
weekday number. When RZN1_RTC_ALW is zero, fls(0) returns zero and
fls(wday) - 1 evaluates to -1. This invalid weekday is then used to
calculate the alarm date and can either leave tm_wday set to -1 or
produce a fabricated alarm date.
Treat a zero RZN1_RTC_ALW value as an unset alarm weekday and return
without calculating the alarm date. Move reading RZN1_RTC_CTL1 before
this check so that alrm->enabled is updated for both configured and
unconfigured alarms.
Fixes: b5ad1bf00d ("rtc: rzn1: Add alarm support")
Cc: stable@vger.kernel.org
Signed-off-by: Lad Prabhakar <prabhakar.mahadev-lad.rj@bp.renesas.com>
Reviewed-by: Wolfram Sang <wsa+renesas@sang-engineering.com>
Tested-by: Wolfram Sang <wsa+renesas@sang-engineering.com>
Link: https://patch.msgid.link/20260821211032.13554-5-prabhakar.mahadev-lad.rj@bp.renesas.com
Signed-off-by: Alexandre Belloni <alexandre.belloni@bootlin.com>
This commit is contained in:
committed by
Alexandre Belloni
parent
022a2839a5
commit
457b5dbce3
@@ -235,13 +235,24 @@ static int rzn1_rtc_read_alarm(struct device *dev, struct rtc_wkalrm *alrm)
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
ctl1 = readl(rtc->base + RZN1_RTC_CTL1);
|
||||
alrm->enabled = !!(ctl1 & (RZN1_RTC_CTL1_ALME | RZN1_RTC_CTL1_1SE));
|
||||
|
||||
min = readl(rtc->base + RZN1_RTC_ALM);
|
||||
hour = readl(rtc->base + RZN1_RTC_ALH);
|
||||
wday = readl(rtc->base + RZN1_RTC_ALW);
|
||||
|
||||
tm->tm_sec = 0;
|
||||
tm->tm_min = bcd2bin(min);
|
||||
tm->tm_hour = bcd2bin(hour);
|
||||
|
||||
/*
|
||||
* If wday is zero, no bit is set in RZN1_RTC_ALW. This is the
|
||||
* register's power-on reset value.
|
||||
*/
|
||||
wday = readl(rtc->base + RZN1_RTC_ALW);
|
||||
if (!wday)
|
||||
return 0;
|
||||
|
||||
delta_days = ((fls(wday) - 1) - tm->tm_wday + 7) % 7;
|
||||
tm->tm_wday = fls(wday) - 1;
|
||||
|
||||
@@ -250,9 +261,6 @@ static int rzn1_rtc_read_alarm(struct device *dev, struct rtc_wkalrm *alrm)
|
||||
rtc_time64_to_tm(alarm, tm);
|
||||
}
|
||||
|
||||
ctl1 = readl(rtc->base + RZN1_RTC_CTL1);
|
||||
alrm->enabled = !!(ctl1 & (RZN1_RTC_CTL1_ALME | RZN1_RTC_CTL1_1SE));
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user