Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S933968Ab3CHMyK (ORCPT ); Fri, 8 Mar 2013 07:54:10 -0500 Received: from mail-la0-f44.google.com ([209.85.215.44]:37995 "EHLO mail-la0-f44.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1757186Ab3CHMyF (ORCPT ); Fri, 8 Mar 2013 07:54:05 -0500 From: Johan Hovold To: Nicolas Ferre Cc: Jean-Christophe Plagniol-Villard , Andrew Victor , Alessandro Zummo , linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, rtc-linux@googlegroups.com, Johan Hovold , stable Subject: [PATCH 1/3] ARM: at91/rtc: fix boot after RTC wake-up Date: Fri, 8 Mar 2013 13:51:41 +0100 Message-Id: <1362747103-21445-2-git-send-email-jhovold@gmail.com> X-Mailer: git-send-email 1.8.1.1 In-Reply-To: <1362747103-21445-1-git-send-email-jhovold@gmail.com> References: <1362747103-21445-1-git-send-email-jhovold@gmail.com> Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 3646 Lines: 86 Fix failed boot after RTC wake-up by making sure RTC-interrupts are disabled at shutdown. The RTC-registers are not reset at shutdown when there is backup power available, and hence the RTC-interrupt, which uses the shared system interrupt, may be enabled during early boot. If an RTC-alarm goes off before the RTC-driver is initialised (e.g. when waking up from an RTC-alarm) this results in disabled system interrupts. Without earlyprintk boot hangs after Uncompressing Linux... done, booting the kernel. and earlyprintk reveals that the shared system interrupt gets disabled: irq 17: nobody cared (try booting with the "irqpoll" option) [] (unwind_backtrace+0x0/0xf0) from [] (__report_bad_irq+0x20/0xe8) [] (__report_bad_irq+0x20/0xe8) from [] (note_interrupt+0x1e0/0x244) [] (note_interrupt+0x1e0/0x244) from [] (handle_irq_event_percpu+0xac/0x1c4) [] (handle_irq_event_percpu+0xac/0x1c4) from [] (handle_irq_event+0x54/0x84) [] (handle_irq_event+0x54/0x84) from [] (handle_fasteoi_irq+0x84/0x154) [] (handle_fasteoi_irq+0x84/0x154) from [] (generic_handle_irq+0x20/0x30) [] (generic_handle_irq+0x20/0x30) from [] (handle_IRQ+0x30/0x84) [] (handle_IRQ+0x30/0x84) from [] (__irq_svc+0x40/0x6c) [] (__irq_svc+0x40/0x6c) from [] (__do_softirq+0x5c/0x164) [] (__do_softirq+0x5c/0x164) from [] (irq_exit+0x58/0x60) [] (irq_exit+0x58/0x60) from [] (handle_IRQ+0x34/0x84) [] (handle_IRQ+0x34/0x84) from [] (__irq_svc+0x40/0x6c) [] (__irq_svc+0x40/0x6c) from [] (start_kernel+0x1d8/0x29c) [] (start_kernel+0x1d8/0x29c) from [<70008040>] (0x70008040) handlers: [] at91sam926x_pit_interrupt Disabling IRQ #17 Note that disabling the RTC-interrupts at shutdown fixes boot after a clean shutdown, but that an RTC-alarm after a user (or watchdog) reset could still prevent the system from booting. Note also that the only way to recover from a failed boot after an RTC-alarm is to remove any backup power (e.g. backup battery) or to disable (or acknowledge) the RTC-interrupt manually from the bootloader. In particular, a user-reset is not sufficient. Tested on at91sam9g45. Cc: stable Signed-off-by: Johan Hovold --- drivers/rtc/rtc-at91rm9200.c | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/drivers/rtc/rtc-at91rm9200.c b/drivers/rtc/rtc-at91rm9200.c index b6469e2..936c75a 100644 --- a/drivers/rtc/rtc-at91rm9200.c +++ b/drivers/rtc/rtc-at91rm9200.c @@ -338,6 +338,14 @@ static int __exit at91_rtc_remove(struct platform_device *pdev) return 0; } +static void at91_rtc_shutdown(struct platform_device *pdev) +{ + /* Disable all interrupts */ + at91_rtc_write(AT91_RTC_IDR, AT91_RTC_ACKUPD | AT91_RTC_ALARM | + AT91_RTC_SECEV | AT91_RTC_TIMEV | + AT91_RTC_CALEV); +} + #ifdef CONFIG_PM /* AT91RM9200 RTC Power management control */ @@ -384,6 +392,7 @@ static const struct dev_pm_ops at91_rtc_pm = { static struct platform_driver at91_rtc_driver = { .remove = __exit_p(at91_rtc_remove), + .shutdown = at91_rtc_shutdown, .driver = { .name = "at91_rtc", .owner = THIS_MODULE, -- 1.8.1.1 -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/