Thread (4 messages) 4 messages, 2 authors, 2025-10-05

RE: [PATCH V2] rtc: zynqmp: Restore alarm functionality after kexec transition

From: T, Harini <hidden>
Date: 2025-09-03 15:22:43
Also in: linux-rtc, lkml

[Public]

Hi Alexandre,
quoted hunk ↗ jump to hunk
-----Original Message-----
From: Harini T <redacted>
Sent: Wednesday, July 30, 2025 7:51 PM
To: alexandre.belloni@bootlin.com; Simek, Michal
[off-list ref]
Cc: linux-rtc@vger.kernel.org; linux-arm-kernel@lists.infradead.org; linux-
kernel@vger.kernel.org; git (AMD-Xilinx) [off-list ref]; T, Harini
[off-list ref]
Subject: [PATCH V2] rtc: zynqmp: Restore alarm functionality after kexec
transition

Caution: This message originated from an External Source. Use proper
caution when opening attachments, clicking links, or responding.


During kexec reboots, RTC alarms that are fired during the kernel transition
experience delayed execution. The new kernel would eventually honor these
alarms, but the interrupt handlers would only execute after the driver probe
is completed rather than at the intended alarm time.

This is because pending alarm interrupt status from the previous kernel is not
properly cleared during driver initialization, causing timing discrepancies in
alarm delivery.

To ensure precise alarm timing across kexec transitions, enhance the probe
function to:
1. Clear any pending alarm interrupt status from previous boot.
2. Detect existing valid alarms and preserve their state.
3. Re-enable alarm interrupts for future alarms.

Signed-off-by: Harini T <redacted>
---
Changes in V2:
- Remove shutdown handler to prevent alarm interrupts from being
  disabled during kexec transitions.
- Add alarm state detection and restoration in probe.

V1 link: https://lore.kernel.org/linux-rtc/20250724170517.974356-1-
harini.t@amd.com/T/#u
---
 drivers/rtc/rtc-zynqmp.c | 19 +++++++++++++++++++
 1 file changed, 19 insertions(+)
diff --git a/drivers/rtc/rtc-zynqmp.c b/drivers/rtc/rtc-zynqmp.c index
f39102b66eac..3baa2b481d9f 100644
--- a/drivers/rtc/rtc-zynqmp.c
+++ b/drivers/rtc/rtc-zynqmp.c
@@ -277,6 +277,10 @@ static irqreturn_t xlnx_rtc_interrupt(int irq, void *id)
static int xlnx_rtc_probe(struct platform_device *pdev)  {
        struct xlnx_rtc_dev *xrtcdev;
+       bool is_alarm_set = false;
+       u32 pending_alrm_irq;
+       u32 current_time;
+       u32 alarm_time;
        int ret;

        xrtcdev = devm_kzalloc(&pdev->dev, sizeof(*xrtcdev), GFP_KERNEL); @@
-296,6 +300,17 @@ static int xlnx_rtc_probe(struct platform_device *pdev)
        if (IS_ERR(xrtcdev->reg_base))
                return PTR_ERR(xrtcdev->reg_base);

+       /* Clear any pending alarm interrupts from previous kernel/boot */
+       pending_alrm_irq = readl(xrtcdev->reg_base + RTC_INT_STS) &
RTC_INT_ALRM;
+       if (pending_alrm_irq)
+               writel(pending_alrm_irq, xrtcdev->reg_base +
+ RTC_INT_STS);
+
+       /* Check if a valid alarm is already set from previous kernel/boot */
+       alarm_time = readl(xrtcdev->reg_base + RTC_ALRM);
+       current_time = readl(xrtcdev->reg_base + RTC_CUR_TM);
+       if (alarm_time > current_time && alarm_time != 0)
+               is_alarm_set = true;
+
        xrtcdev->alarm_irq = platform_get_irq_byname(pdev, "alarm");
        if (xrtcdev->alarm_irq < 0)
                return xrtcdev->alarm_irq; @@ -337,6 +352,10 @@ static int
xlnx_rtc_probe(struct platform_device *pdev)

        xlnx_init_rtc(xrtcdev);

+       /* Re-enable alarm interrupt if a valid alarm was found */
+       if (is_alarm_set)
+               writel(RTC_INT_ALRM, xrtcdev->reg_base + RTC_INT_EN);
+
        device_init_wakeup(&pdev->dev, true);

        return devm_rtc_register_device(xrtcdev->rtc);
--
2.43.0
Kindly following up on this patch. I would appreciate it if you could review it when convenient and let me know if any updates are needed.

Thank you for your time.

Best regards,
Harini T
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help