Greg,

> -----Original Message-----
> From: [email protected] [mailto:[email protected]]
> Sent: Tuesday, June 17, 2014 5:16 PM
> To: [email protected]; [email protected];
> [email protected]; Bryan Evenson; [email protected];
> [email protected]; [email protected]; [email protected];
> [email protected]
> Cc: [email protected]; [email protected]
> Subject: Patch "rtc: rtc-at91rm9200: fix infinite wait for ACKUPD irq" has 
> been
> added to the 3.10-stable tree
> 
> 
> This is a note to let you know that I've just added the patch titled
> 
>     rtc: rtc-at91rm9200: fix infinite wait for ACKUPD irq
> 
> to the 3.10-stable tree which can be found at:
>     http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-
> queue.git;a=summary
> 
> The filename of the patch is:
>      rtc-rtc-at91rm9200-fix-infinite-wait-for-ackupd-irq.patch
> and it can be found in the queue-3.10 subdirectory.
> 
> If you, or anyone else, feels it should not be added to the stable tree, 
> please
> let <[email protected]> know about it.

This patch should be added to the stable tree, but in my testing it needs an 
additional patch to avoid causing a different problem.  This patch does fix the 
stated problem, but in my testing on an AT91SAM9G25 platform the system would 
not boot up after a power cycle if the RTC backup battery was in place.  This 
second patch is needed to fix the second issue:

https://git.kernel.org/cgit/linux/kernel/git/next/linux-next.git/commit/?id=9dcc87fec8947308e0111c65dcd881e6aa5b1673

I had seen the failure to boot happen rarely in the past, but after applying 
the "rtc: rtc-at91rm9200: fix infinite wait for ACKUPD irq" patch the failure 
to boot from power cycle was happening every time on my system.  I then applied 
the second patch I linked to above and my system would then boot up after a 
power cycle without issue every time.  So I would suggest only applying this 
patch to 3.10-stable, 3.14-stable and 3.15-stable if the "ARM: at91: fix 
at91_sysirq_mask_rtc for sam9x5 SoCs" patch linked to above is applied in the 
same series.

Regards,
Bryan

> 
> 
> From 2fe121e1f5aa3bf31b418a9790db6c400e922291 Mon Sep 17 00:00:00
> 2001
> From: Boris BREZILLON <[email protected]>
> Date: Fri, 6 Jun 2014 14:36:09 -0700
> Subject: rtc: rtc-at91rm9200: fix infinite wait for ACKUPD irq
> 
> From: Boris BREZILLON <[email protected]>
> 
> commit 2fe121e1f5aa3bf31b418a9790db6c400e922291 upstream.
> 
> The rtc user must wait at least 1 sec between each time/calandar update
> (see atmel's datasheet chapter "Updating Time/Calendar").
> 
> Use the 1Hz interrupt to update the at91_rtc_upd_rdy flag and wait for the
> at91_rtc_wait_upd_rdy event if the rtc is not ready.
> 
> This patch fixes a deadlock in an uninterruptible wait when the RTC is
> updated more than once every second.  AFAICT the bug is here from the
> beginning, but I think we should at least backport this fix to 3.10 and the
> following longterm and stable releases.
> 
> Signed-off-by: Boris BREZILLON <[email protected]>
> Reported-by: Bryan Evenson <[email protected]>
> Tested-by: Bryan Evenson <[email protected]>
> Cc: Andrew Victor <[email protected]>
> Cc: Nicolas Ferre <[email protected]>
> Cc: Jean-Christophe Plagniol-Villard <[email protected]>
> Cc: Alessandro Zummo <[email protected]>
> Signed-off-by: Andrew Morton <[email protected]>
> Signed-off-by: Linus Torvalds <[email protected]>
> Signed-off-by: Greg Kroah-Hartman <[email protected]>
> 
> ---
>  drivers/rtc/rtc-at91rm9200.c |   16 ++++++++++++++--
>  1 file changed, 14 insertions(+), 2 deletions(-)
> 
> --- a/drivers/rtc/rtc-at91rm9200.c
> +++ b/drivers/rtc/rtc-at91rm9200.c
> @@ -49,6 +49,7 @@ struct at91_rtc_config {
> 
>  static const struct at91_rtc_config *at91_rtc_config;  static
> DECLARE_COMPLETION(at91_rtc_updated);
> +static DECLARE_COMPLETION(at91_rtc_upd_rdy);
>  static unsigned int at91_alarm_year = AT91_RTC_EPOCH;  static void
> __iomem *at91_rtc_regs;  static int irq; @@ -162,6 +163,8 @@ static int
> at91_rtc_settime(struct devic
>               1900 + tm->tm_year, tm->tm_mon, tm->tm_mday,
>               tm->tm_hour, tm->tm_min, tm->tm_sec);
> 
> +     wait_for_completion(&at91_rtc_upd_rdy);
> +
>       /* Stop Time/Calendar from counting */
>       cr = at91_rtc_read(AT91_RTC_CR);
>       at91_rtc_write(AT91_RTC_CR, cr | AT91_RTC_UPDCAL |
> AT91_RTC_UPDTIM); @@ -184,7 +187,9 @@ static int
> at91_rtc_settime(struct devic
> 
>       /* Restart Time/Calendar */
>       cr = at91_rtc_read(AT91_RTC_CR);
> +     at91_rtc_write(AT91_RTC_SCCR, AT91_RTC_SECEV);
>       at91_rtc_write(AT91_RTC_CR, cr & ~(AT91_RTC_UPDCAL |
> AT91_RTC_UPDTIM));
> +     at91_rtc_write_ier(AT91_RTC_SECEV);
> 
>       return 0;
>  }
> @@ -291,8 +296,10 @@ static irqreturn_t at91_rtc_interrupt(in
>       if (rtsr) {             /* this interrupt is shared!  Is it ours? */
>               if (rtsr & AT91_RTC_ALARM)
>                       events |= (RTC_AF | RTC_IRQF);
> -             if (rtsr & AT91_RTC_SECEV)
> -                     events |= (RTC_UF | RTC_IRQF);
> +             if (rtsr & AT91_RTC_SECEV) {
> +                     complete(&at91_rtc_upd_rdy);
> +                     at91_rtc_write_idr(AT91_RTC_SECEV);
> +             }
>               if (rtsr & AT91_RTC_ACKUPD)
>                       complete(&at91_rtc_updated);
> 
> @@ -415,6 +422,11 @@ static int __init at91_rtc_probe(struct
>       }
>       platform_set_drvdata(pdev, rtc);
> 
> +     /* enable SECEV interrupt in order to initialize at91_rtc_upd_rdy
> +      * completion.
> +      */
> +     at91_rtc_write_ier(AT91_RTC_SECEV);
> +
>       dev_info(&pdev->dev, "AT91 Real Time Clock driver.\n");
>       return 0;
> 
> 
> 
> Patches currently in stable-queue which might be from boris.brezillon@free-
> electrons.com are
> 
> queue-3.10/rtc-rtc-at91rm9200-fix-infinite-wait-for-ackupd-irq.patch
--
To unsubscribe from this list: send the line "unsubscribe stable" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to