[PATCH] rtc: mpfs: Fix alarm register word order
Conor Dooley
conor at kernel.org
Tue Oct 20 03:17:43 PDT 2026
On Tue, Oct 20, 2026 at 12:10:24AM +0900, Baek Kyu, Kim wrote:
> mpfs_rtc_readalarm() swaps the low and high words of the alarm time.
> The RTC core reads this value during device registration to initialize
> its alarm timer. This can populate the cached alarm and timer queue
> with an incorrect expiry time, or leave an enabled hardware alarm out
> of the timer queue if the decoded time appears to be in the past.
>
> Read the low 32 bits from ALARM_LOWER_REG and place the masked high
> 11 bits from ALARM_UPPER_REG in bits 42:32. This matches the layout
> used by mpfs_rtc_setalarm() and the low/high assembly in
> mpfs_rtc_readtime(), so the RTC core imports the programmed alarm
> time correctly during device registration.
>
> Fixes: 0b31d703598d ("rtc: Add driver for Microchip PolarFire SoC")
> Signed-off-by: Baek Kyu, Kim <pocj8ur4in at gmail.com>
That's very odd, wonder how that happened. Definitely a blindspot when
it came to testing. This should look the same as reading the time.
Reviewed-by: Conor Dooley <conor.dooley at microchip.com>
CC: stable at vger.kernel.org
Cheers,
Conor.
> ---
> Tested with KUnit under ARM64 QEMU using RAM-backed MMIO and the actual
> MPFS RTC callbacks and RTC core registration. All ten tests pass with the
> fix, including importing a preloaded alarm and checking its timer queue
> entry. Four additional tests covering current-date alarms also pass.
> No physical MPFS hardware or suspend/wakeup was tested.
>
> drivers/rtc/rtc-mpfs.c | 4 ++--
> 1 file changed, 2 insertions(+), 2 deletions(-)
>
> diff --git a/drivers/rtc/rtc-mpfs.c b/drivers/rtc/rtc-mpfs.c
> index 60596b0ea9d8..6616ca1f02c7 100644
> --- a/drivers/rtc/rtc-mpfs.c
> +++ b/drivers/rtc/rtc-mpfs.c
> @@ -131,8 +131,8 @@ static int mpfs_rtc_readalarm(struct device *dev, struct rtc_wkalrm *alrm)
>
> alrm->enabled = mode & MODE_WAKE_EN;
>
> - time = (u64)readl(rtcdev->base + ALARM_LOWER_REG) << 32;
> - time |= (readl(rtcdev->base + ALARM_UPPER_REG) & ALARM_UPPER_MASK);
> + time = readl(rtcdev->base + ALARM_LOWER_REG);
> + time |= ((u64)readl(rtcdev->base + ALARM_UPPER_REG) & ALARM_UPPER_MASK) << 32;
> rtc_time64_to_tm(time, &alrm->time);
>
> return 0;
>
> base-commit: 58161ead29e50d70a317ea26b472e0c7508e69da
> --
> 2.55.0
>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 228 bytes
Desc: not available
URL: <http://lists.infradead.org/pipermail/linux-riscv/attachments/20261020/cd062eec/attachment.sig>
More information about the linux-riscv
mailing list