[3.11.y.z extended stable] Patch "ARM: at91: fix at91_sysirq_mask_rtc for sam9x5 SoCs" has been added to staging queue

Luis Henriques luis.henriques at canonical.com
Thu Jun 26 10:37:58 UTC 2014


This is a note to let you know that I have just added a patch titled

    ARM: at91: fix at91_sysirq_mask_rtc for sam9x5 SoCs

to the linux-3.11.y-queue branch of the 3.11.y.z extended stable tree 
which can be found at:

 http://kernel.ubuntu.com/git?p=ubuntu/linux.git;a=shortlog;h=refs/heads/linux-3.11.y-queue

If you, or anyone else, feels it should not be added to this tree, please 
reply to this email.

For more information about the 3.11.y.z tree, see
https://wiki.ubuntu.com/Kernel/Dev/ExtendedStable

Thanks.
-Luis

------

>From 6a1b5ad4c3e7d4263079978bfa69b9f725250fdd Mon Sep 17 00:00:00 2001
From: Boris BREZILLON <boris.brezillon at free-electrons.com>
Date: Fri, 6 Jun 2014 14:36:11 -0700
Subject: ARM: at91: fix at91_sysirq_mask_rtc for sam9x5 SoCs

commit 9dcc87fec8947308e0111c65dcd881e6aa5b1673 upstream.

sam9x5 SoCs have the following errata:
 "RTC: Interrupt Mask Register cannot be used
  Interrupt Mask Register read always returns 0."

Hence we should not rely on what IMR claims about already masked IRQs
and just disable all IRQs.

Signed-off-by: Boris BREZILLON <boris.brezillon at free-electrons.com>
Reported-by: Bryan Evenson <bevenson at melinkcorp.com>
Reviewed-by: Johan Hovold <johan at hovold.com>
Acked-by: Nicolas Ferre <nicolas.ferre at atmel.com>
Cc: Bryan Evenson <bevenson at melinkcorp.com>
Cc: Andrew Victor <linux at maxim.org.za>
Cc: Jean-Christophe Plagniol-Villard <plagnioj at jcrosoft.com>
Cc: Alessandro Zummo <a.zummo at towertech.it>
Cc: Mark Roszko <mark.roszko at gmail.com>
Signed-off-by: Andrew Morton <akpm at linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds at linux-foundation.org>
Signed-off-by: Luis Henriques <luis.henriques at canonical.com>
---
 arch/arm/mach-at91/sysirq_mask.c | 22 +++++++++++++---------
 1 file changed, 13 insertions(+), 9 deletions(-)

diff --git a/arch/arm/mach-at91/sysirq_mask.c b/arch/arm/mach-at91/sysirq_mask.c
index 2ba694f9626b..f8bc3511a8c8 100644
--- a/arch/arm/mach-at91/sysirq_mask.c
+++ b/arch/arm/mach-at91/sysirq_mask.c
@@ -25,24 +25,28 @@

 #include "generic.h"

-#define AT91_RTC_IDR	0x24	/* Interrupt Disable Register */
-#define AT91_RTC_IMR	0x28	/* Interrupt Mask Register */
+#define AT91_RTC_IDR		0x24	/* Interrupt Disable Register */
+#define AT91_RTC_IMR		0x28	/* Interrupt Mask Register */
+#define AT91_RTC_IRQ_MASK	0x1f	/* Available IRQs mask */

 void __init at91_sysirq_mask_rtc(u32 rtc_base)
 {
 	void __iomem *base;
-	u32 mask;

 	base = ioremap(rtc_base, 64);
 	if (!base)
 		return;

-	mask = readl_relaxed(base + AT91_RTC_IMR);
-	if (mask) {
-		pr_info("AT91: Disabling rtc irq\n");
-		writel_relaxed(mask, base + AT91_RTC_IDR);
-		(void)readl_relaxed(base + AT91_RTC_IMR);	/* flush */
-	}
+	/*
+	 * sam9x5 SoCs have the following errata:
+	 * "RTC: Interrupt Mask Register cannot be used
+	 *  Interrupt Mask Register read always returns 0."
+	 *
+	 * Hence we're not relying on IMR values to disable
+	 * interrupts.
+	 */
+	writel_relaxed(AT91_RTC_IRQ_MASK, base + AT91_RTC_IDR);
+	(void)readl_relaxed(base + AT91_RTC_IMR);	/* flush */

 	iounmap(base);
 }
--
1.9.1





More information about the kernel-team mailing list