[PATCH] rtc: pl031: enable rtc alarm interrupt again

Amit Singh Tomar amittomer25 at gmail.com
Thu Aug 13 07:14:28 EDT 2020


After commit c8ff5841a90b ("rtc: pl031: switch to rtc_time64_to_tm/
rtc_tm_to_time64"), it has been observed the rtc alarm interrupt is
no more registered, and due to this waking up the system
(using rtc alarm interrupt) from suspend state is no longer possible.

Besides this, we get broken output from "hwclock".

root at localhost:~# hwclock
hwclock: select() to /dev/rtc to wait for clock tick timed out: No such file or directory

This is due to the fact that call to pl031_alarm_irq_enable(dev, alarm->enabled)
is removed (from pl031_set_alarm()) in commit c8ff5841a90b, and alarm interrupt
never gets enabled.

This commit fixes it by re-introduces the missing
pl031_alarm_irq_enable(dev, alarm->enabled).

Fixes: c8ff5841a90b ("rtc: pl031: switch to rtc_time64_to_tm/rtc_tm_to_time64")

Signed-off-by: Amit Singh Tomar <amittomer25 at gmail.com>
---
This patch is tested on QEMU ARM64 TCG guest

Without this patch:
root at localhost:~# echo +10 > /sys/class/rtc/rtc0/wakealarm && sleep 10 && cat /proc/interrupts | grep pl031
39:          0          0     GICv2  34 Level     rtc-pl031

With this patch:
root at localhost:~# echo +10 > /sys/class/rtc/rtc0/wakealarm && sleep 10 && cat /proc/interrupts | grep pl031
39:          1          0     GICv2  34 Level     rtc-pl031

root at localhost:~# hwclock 
Thu Aug 13 11:00:06 2020  -1.009351 seconds

root at localhost:~# echo +30 > /sys/class/rtc/rtc0/wakealarm
root at localhost:~# echo -n mem > /sys/power/state
root at localhost:~# hwclock -r
Thu Aug 13 08:59:14 2020  -1.010357 seconds

---
 drivers/rtc/rtc-pl031.c | 1 +
 1 file changed, 1 insertion(+)

diff --git a/drivers/rtc/rtc-pl031.c b/drivers/rtc/rtc-pl031.c
index 40d7450a1ce4..c6b89273feba 100644
--- a/drivers/rtc/rtc-pl031.c
+++ b/drivers/rtc/rtc-pl031.c
@@ -275,6 +275,7 @@ static int pl031_set_alarm(struct device *dev, struct rtc_wkalrm *alarm)
 	struct pl031_local *ldata = dev_get_drvdata(dev);
 
 	writel(rtc_tm_to_time64(&alarm->time), ldata->base + RTC_MR);
+	pl031_alarm_irq_enable(dev, alarm->enabled);
 
 	return 0;
 }
-- 
2.7.4




More information about the linux-arm-kernel mailing list