From mboxrd@z Thu Jan 1 00:00:00 1970 From: akpm@linux-foundation.org (Andrew Morton) Date: Thu, 29 May 2014 16:09:48 -0700 Subject: [PATCH] ARM: at91: fix rtc irq mask for sam9x5 SoCs In-Reply-To: <20140509163652.GE6776@localhost> References: <957b209589094df48ddedbc57c6ccdfd@BLUPR05MB037.namprd05.prod.outlook.com> <1399479649-3247-1-git-send-email-boris.brezillon@free-electrons.com> <20140508154912.GA6776@localhost> <536BBEA4.6080908@free-electrons.com> <20140509163652.GE6776@localhost> Message-ID: <20140529160948.a63fa268a37d985189837a85@linux-foundation.org> To: linux-arm-kernel@lists.infradead.org List-Id: linux-arm-kernel.lists.infradead.org On Fri, 9 May 2014 18:36:52 +0200 Johan Hovold wrote: > On Thu, May 08, 2014 at 07:28:04PM +0200, Boris BREZILLON wrote: > > > > You should also keep the flush (read of IMR) regardless (to make sure > > > the write has reached the peripheral), and remember to remove the now > > > unused mask variable. > > > > Does it has something to do with memory barriers ? > > If so, why not using writel instead of writel_relaxed ? > > You only need to use the non-relaxed version when synchronising with DMA > operations. > > The read-back of a register on the same device is a common technique to > make sure that preceding write has actually reached the peripheral > (write posting or flushing). In this case, it is used to make > (reasonably) sure that interrupts have actually been masked before > returning. (In the general case, you'd even need to verify the read-back > value to be certain that the device has changed its state.) > So I grabbed this patch as it's tied to "rtc: rtc-at91rm9200: fix uninterruptible wait for ACKUPD" and is not in linux-next. Someone shout at me if that was a mistake. From: Boris BREZILLON Subject: ARM: at91: fix rtc irq mask for sam9x5 SoCs The RTC IMR register is not reliable on sam9x5 SoCs, hence why me have to mask all interrupts no matter what IMR claims about already masked irqs. Mark said: : Atmel actually has this issue in the Errata of the SAM9G25 and SAM9G35 : datasheets which might be worth referencing in the description? Signed-off-by: Boris BREZILLON Reported-by: Bryan Evenson Tested-by: Bryan Evenson Cc: Andrew Victor Cc: Nicolas Ferre Cc: Jean-Christophe Plagniol-Villard Cc: Alessandro Zummo Cc: Mark Roszko Cc: Johan Hovold Signed-off-by: Andrew Morton --- arch/arm/mach-at91/sysirq_mask.c | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff -puN arch/arm/mach-at91/sysirq_mask.c~arm-at91-fix-rtc-irq-mask-for-sam9x5-socs arch/arm/mach-at91/sysirq_mask.c --- a/arch/arm/mach-at91/sysirq_mask.c~arm-at91-fix-rtc-irq-mask-for-sam9x5-socs +++ a/arch/arm/mach-at91/sysirq_mask.c @@ -37,12 +37,7 @@ void __init at91_sysirq_mask_rtc(u32 rtc 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 */ - } + writel_relaxed(0x1f, base + AT91_RTC_IDR); iounmap(base); } _