[<prev] [next>] [<thread-prev] [day] [month] [year] [list]
Message-ID:
<SJ1PR12MB6076CAEB3B0429159B4151AA921FA@SJ1PR12MB6076.namprd12.prod.outlook.com>
Date: Thu, 25 Sep 2025 06:04:18 +0000
From: "T, Harini" <Harini.T@....com>
To: "alexandre.belloni@...tlin.com" <alexandre.belloni@...tlin.com>, "Simek,
Michal" <michal.simek@....com>
CC: "linux-rtc@...r.kernel.org" <linux-rtc@...r.kernel.org>,
"linux-arm-kernel@...ts.infradead.org"
<linux-arm-kernel@...ts.infradead.org>, "linux-kernel@...r.kernel.org"
<linux-kernel@...r.kernel.org>, "git (AMD-Xilinx)" <git@....com>
Subject: RE: [PATCH V2] rtc: zynqmp: Restore alarm functionality after kexec
transition
[Public]
Ping!
> -----Original Message-----
> From: T, Harini
> Sent: Wednesday, September 3, 2025 8:53 PM
> To: Harini T <harini.t@....com>; alexandre.belloni@...tlin.com; Simek,
> Michal <michal.simek@....com>
> Cc: linux-rtc@...r.kernel.org; linux-arm-kernel@...ts.infradead.org; linux-
> kernel@...r.kernel.org; git (AMD-Xilinx) <git@....com>
> Subject: RE: [PATCH V2] rtc: zynqmp: Restore alarm functionality after kexec
> transition
>
> Hi Alexandre,
>
> > -----Original Message-----
> > From: Harini T <harini.t@....com>
> > Sent: Wednesday, July 30, 2025 7:51 PM
> > To: alexandre.belloni@...tlin.com; Simek, Michal
> > <michal.simek@....com>
> > Cc: linux-rtc@...r.kernel.org; linux-arm-kernel@...ts.infradead.org;
> > linux- kernel@...r.kernel.org; git (AMD-Xilinx) <git@....com>; T,
> > Harini <Harini.T@....com>
> > 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 <harini.t@....com>
> > ---
> > 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@....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
Powered by blists - more mailing lists