[rtc-linux] [PATCH v3] rtc: snvs: add Freescale rtc-snvs driver
Shawn Guo
shawn.guo at linaro.org
Wed Aug 15 10:16:10 EDT 2012
Thanks for looking at the patch, Andrew.
On Tue, Aug 14, 2012 at 05:03:00PM -0700, Andrew Morton wrote:
> On Fri, 13 Jul 2012 15:31:03 +0800
> Shawn Guo <shawn.guo at linaro.org> wrote:
>
> > +static int snvs_rtc_enable(struct snvs_rtc_data *data, bool enable)
> > +{
> > + unsigned long timeout = jiffies + msecs_to_jiffies(1);
> > + unsigned long flags;
> > + u32 lpcr;
> > +
> > + spin_lock_irqsave(&data->lock, flags);
> > +
> > + lpcr = readl(data->ioaddr + SNVS_LPCR);
> > + if (enable)
> > + lpcr |= SNVS_LPCR_SRTC_ENV;
> > + else
> > + lpcr &= ~SNVS_LPCR_SRTC_ENV;
> > + writel(lpcr, data->ioaddr + SNVS_LPCR);
> > +
> > + spin_unlock_irqrestore(&data->lock, flags);
> > +
> > + while (1) {
> > + lpcr = readl(data->ioaddr + SNVS_LPCR);
> > +
> > + if (enable) {
> > + if (lpcr & SNVS_LPCR_SRTC_ENV)
> > + break;
> > + } else {
> > + if (!(lpcr & SNVS_LPCR_SRTC_ENV))
> > + break;
> > + }
> > +
> > + if (time_after(jiffies, timeout))
> > + return -ETIMEDOUT;
> > + }
> > +
> > + return 0;
> > +}
>
> The timeout code here is fragile. If acquiring the spinlock takes more
> than a millisecond or if this thread gets interrupted or preempted then
> we could easily execute that loop just a single time, and fail.
>
So what about moving the timeout initialization to right above the
while(1) loop?
> It would be better to retry a fixed number of times, say 1000? That
> would take around 1 millisecond, but might be overkill.
>
How long a 1000 times loop takes really depends on the cpu frequency,
right?
BTW, I have received the notification telling that the patch has been
applied on -mm tree. So should I just send you an incremental patch
to address the comment?
--
Regards,
Shawn
More information about the linux-arm-kernel
mailing list