From: Alexandre Belloni <alexandre.belloni@bootlin.com>
To: Michal Simek <monstr@monstr.eu>
Cc: Srinivas Neeli <srinivas.neeli@xilinx.com>,
Alessandro Zummo <a.zummo@towertech.it>,
Srinivas Goud <sgoud@xilinx.com>,
Shubhrajyoti Datta <shubhraj@xilinx.com>,
linux-rtc@vger.kernel.org, LKML <linux-kernel@vger.kernel.org>,
linux-arm <linux-arm-kernel@lists.infradead.org>,
git <git@xilinx.com>
Subject: Re: [PATCH] rtc: zynqmp: Clear alarm interrupt status before interrupt enable
Date: Tue, 11 Feb 2020 11:39:39 +0100 [thread overview]
Message-ID: <20200211103939.GD3527@piout.net> (raw)
In-Reply-To: <CAHTX3dKSq1oTzkoRv3wK3rhkc1r0rOiQhFKmgsYbtG_uvOfAJg@mail.gmail.com>
On 10/02/2020 12:48:14+0100, Michal Simek wrote:
> Hi,
>
> čt 12. 12. 2019 v 14:01 odesílatel Srinivas Neeli
> <srinivas.neeli@xilinx.com> napsal:
> >
> > Fix multiple occurring interrupts for alarm interrupt. RTC module doesn't
> > clear the alarm interrupt status bit immediately after the interrupt is
> > triggered.This is due to the sticky nature of the alarm interrupt status
> > register. The alarm interrupt status register can be cleared only after
> > the second counter outruns the set alarm value. To fix multiple spurious
> > interrupts, disable alarm interrupt in the handler and clear the status
> > bit before enabling the alarm interrupt.
> >
> > Fixes: 11143c19eb57 ("rtc: add xilinx zynqmp rtc driver")
> > Signed-off-by: Srinivas Neeli <srinivas.neeli@xilinx.com>
> > ---
> > drivers/rtc/rtc-zynqmp.c | 29 ++++++++++++++++++++++++-----
> > 1 file changed, 24 insertions(+), 5 deletions(-)
> >
> > diff --git a/drivers/rtc/rtc-zynqmp.c b/drivers/rtc/rtc-zynqmp.c
> > index 5786866c09e9..d311e3ef1f21 100644
> > --- a/drivers/rtc/rtc-zynqmp.c
> > +++ b/drivers/rtc/rtc-zynqmp.c
> > @@ -38,6 +38,8 @@
> >
> > #define RTC_CALIB_DEF 0x198233
> > #define RTC_CALIB_MASK 0x1FFFFF
> > +#define RTC_ALRM_MASK BIT(1)
> > +#define RTC_MSEC 1000
> >
> > struct xlnx_rtc_dev {
> > struct rtc_device *rtc;
> > @@ -124,11 +126,28 @@ static int xlnx_rtc_alarm_irq_enable(struct device *dev, u32 enabled)
> > {
> > struct xlnx_rtc_dev *xrtcdev = dev_get_drvdata(dev);
> >
>
> here shouldn't be empty line.
>
> > - if (enabled)
> > + unsigned int status;
> > + ulong timeout;
> > +
> > + timeout = jiffies + msecs_to_jiffies(RTC_MSEC);
> > +
> > + if (enabled) {
> > + while (1) {
> > + status = readl(xrtcdev->reg_base + RTC_INT_STS);
> > + if (!((status & RTC_ALRM_MASK) == RTC_ALRM_MASK))
> > + break;
> > +
> > + if (time_after_eq(jiffies, timeout)) {
> > + dev_err(dev, "Time out occur, while clearing alarm status bit\n");
> > + return -ETIMEDOUT;
> > + }
> > + writel(RTC_INT_ALRM, xrtcdev->reg_base + RTC_INT_STS);
> > + }
> > +
> > writel(RTC_INT_ALRM, xrtcdev->reg_base + RTC_INT_EN);
> > - else
> > + } else {
> > writel(RTC_INT_ALRM, xrtcdev->reg_base + RTC_INT_DIS);
> > -
> > + }
>
> And here it was good to have empty line.
>
> > return 0;
> > }
> >
> > @@ -183,8 +202,8 @@ static irqreturn_t xlnx_rtc_interrupt(int irq, void *id)
> > if (!(status & (RTC_INT_SEC | RTC_INT_ALRM)))
> > return IRQ_NONE;
> >
> > - /* Clear RTC_INT_ALRM interrupt only */
> > - writel(RTC_INT_ALRM, xrtcdev->reg_base + RTC_INT_STS);
> > + /* Disable RTC_INT_ALRM interrupt only */
> > + writel(RTC_INT_ALRM, xrtcdev->reg_base + RTC_INT_DIS);
> >
> > if (status & RTC_INT_ALRM)
> > rtc_update_irq(xrtcdev->rtc, 1, RTC_IRQF | RTC_AF);
> > --
> > 2.7.4
>
> Other then these two above things look good.
>
> Alexandre: Any issue with this patch?
>
No issue, I was kind of waiting for your review. I'll take the patch
once your comments are addressed.
--
Alexandre Belloni, Bootlin
Embedded Linux and Kernel engineering
https://bootlin.com
WARNING: multiple messages have this Message-ID (diff)
From: Alexandre Belloni <alexandre.belloni@bootlin.com>
To: Michal Simek <monstr@monstr.eu>
Cc: linux-rtc@vger.kernel.org,
Alessandro Zummo <a.zummo@towertech.it>,
Srinivas Neeli <srinivas.neeli@xilinx.com>,
Srinivas Goud <sgoud@xilinx.com>,
LKML <linux-kernel@vger.kernel.org>, git <git@xilinx.com>,
Shubhrajyoti Datta <shubhraj@xilinx.com>,
linux-arm <linux-arm-kernel@lists.infradead.org>
Subject: Re: [PATCH] rtc: zynqmp: Clear alarm interrupt status before interrupt enable
Date: Tue, 11 Feb 2020 11:39:39 +0100 [thread overview]
Message-ID: <20200211103939.GD3527@piout.net> (raw)
In-Reply-To: <CAHTX3dKSq1oTzkoRv3wK3rhkc1r0rOiQhFKmgsYbtG_uvOfAJg@mail.gmail.com>
On 10/02/2020 12:48:14+0100, Michal Simek wrote:
> Hi,
>
> čt 12. 12. 2019 v 14:01 odesílatel Srinivas Neeli
> <srinivas.neeli@xilinx.com> napsal:
> >
> > Fix multiple occurring interrupts for alarm interrupt. RTC module doesn't
> > clear the alarm interrupt status bit immediately after the interrupt is
> > triggered.This is due to the sticky nature of the alarm interrupt status
> > register. The alarm interrupt status register can be cleared only after
> > the second counter outruns the set alarm value. To fix multiple spurious
> > interrupts, disable alarm interrupt in the handler and clear the status
> > bit before enabling the alarm interrupt.
> >
> > Fixes: 11143c19eb57 ("rtc: add xilinx zynqmp rtc driver")
> > Signed-off-by: Srinivas Neeli <srinivas.neeli@xilinx.com>
> > ---
> > drivers/rtc/rtc-zynqmp.c | 29 ++++++++++++++++++++++++-----
> > 1 file changed, 24 insertions(+), 5 deletions(-)
> >
> > diff --git a/drivers/rtc/rtc-zynqmp.c b/drivers/rtc/rtc-zynqmp.c
> > index 5786866c09e9..d311e3ef1f21 100644
> > --- a/drivers/rtc/rtc-zynqmp.c
> > +++ b/drivers/rtc/rtc-zynqmp.c
> > @@ -38,6 +38,8 @@
> >
> > #define RTC_CALIB_DEF 0x198233
> > #define RTC_CALIB_MASK 0x1FFFFF
> > +#define RTC_ALRM_MASK BIT(1)
> > +#define RTC_MSEC 1000
> >
> > struct xlnx_rtc_dev {
> > struct rtc_device *rtc;
> > @@ -124,11 +126,28 @@ static int xlnx_rtc_alarm_irq_enable(struct device *dev, u32 enabled)
> > {
> > struct xlnx_rtc_dev *xrtcdev = dev_get_drvdata(dev);
> >
>
> here shouldn't be empty line.
>
> > - if (enabled)
> > + unsigned int status;
> > + ulong timeout;
> > +
> > + timeout = jiffies + msecs_to_jiffies(RTC_MSEC);
> > +
> > + if (enabled) {
> > + while (1) {
> > + status = readl(xrtcdev->reg_base + RTC_INT_STS);
> > + if (!((status & RTC_ALRM_MASK) == RTC_ALRM_MASK))
> > + break;
> > +
> > + if (time_after_eq(jiffies, timeout)) {
> > + dev_err(dev, "Time out occur, while clearing alarm status bit\n");
> > + return -ETIMEDOUT;
> > + }
> > + writel(RTC_INT_ALRM, xrtcdev->reg_base + RTC_INT_STS);
> > + }
> > +
> > writel(RTC_INT_ALRM, xrtcdev->reg_base + RTC_INT_EN);
> > - else
> > + } else {
> > writel(RTC_INT_ALRM, xrtcdev->reg_base + RTC_INT_DIS);
> > -
> > + }
>
> And here it was good to have empty line.
>
> > return 0;
> > }
> >
> > @@ -183,8 +202,8 @@ static irqreturn_t xlnx_rtc_interrupt(int irq, void *id)
> > if (!(status & (RTC_INT_SEC | RTC_INT_ALRM)))
> > return IRQ_NONE;
> >
> > - /* Clear RTC_INT_ALRM interrupt only */
> > - writel(RTC_INT_ALRM, xrtcdev->reg_base + RTC_INT_STS);
> > + /* Disable RTC_INT_ALRM interrupt only */
> > + writel(RTC_INT_ALRM, xrtcdev->reg_base + RTC_INT_DIS);
> >
> > if (status & RTC_INT_ALRM)
> > rtc_update_irq(xrtcdev->rtc, 1, RTC_IRQF | RTC_AF);
> > --
> > 2.7.4
>
> Other then these two above things look good.
>
> Alexandre: Any issue with this patch?
>
No issue, I was kind of waiting for your review. I'll take the patch
once your comments are addressed.
--
Alexandre Belloni, Bootlin
Embedded Linux and Kernel engineering
https://bootlin.com
_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
next prev parent reply other threads:[~2020-02-11 10:39 UTC|newest]
Thread overview: 8+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-12-12 13:00 [PATCH] rtc: zynqmp: Clear alarm interrupt status before interrupt enable Srinivas Neeli
2019-12-12 13:00 ` Srinivas Neeli
2020-02-10 11:48 ` Michal Simek
2020-02-10 11:48 ` Michal Simek
2020-02-11 10:39 ` Alexandre Belloni [this message]
2020-02-11 10:39 ` Alexandre Belloni
2020-02-11 10:40 ` Michal Simek
2020-02-11 10:40 ` Michal Simek
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20200211103939.GD3527@piout.net \
--to=alexandre.belloni@bootlin.com \
--cc=a.zummo@towertech.it \
--cc=git@xilinx.com \
--cc=linux-arm-kernel@lists.infradead.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-rtc@vger.kernel.org \
--cc=monstr@monstr.eu \
--cc=sgoud@xilinx.com \
--cc=shubhraj@xilinx.com \
--cc=srinivas.neeli@xilinx.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.