From patchwork Fri Mar 8 12:51:41 2013 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Johan Hovold X-Patchwork-Id: 2237851 Return-Path: X-Original-To: patchwork-linux-arm@patchwork.kernel.org Delivered-To: patchwork-process-083081@patchwork2.kernel.org Received: from merlin.infradead.org (merlin.infradead.org [205.233.59.134]) by patchwork2.kernel.org (Postfix) with ESMTP id ECD8DDF215 for ; Fri, 8 Mar 2013 13:00:01 +0000 (UTC) Received: from localhost ([::1] helo=merlin.infradead.org) by merlin.infradead.org with esmtp (Exim 4.80.1 #2 (Red Hat Linux)) id 1UDwpe-00073U-T5; Fri, 08 Mar 2013 12:55:32 +0000 Received: from mail-lb0-f175.google.com ([209.85.217.175]) by merlin.infradead.org with esmtps (Exim 4.80.1 #2 (Red Hat Linux)) id 1UDwoK-0006nE-Mu for linux-arm-kernel@lists.infradead.org; Fri, 08 Mar 2013 12:54:10 +0000 Received: by mail-lb0-f175.google.com with SMTP id n3so1318835lbo.34 for ; Fri, 08 Mar 2013 04:54:04 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=x-received:from:to:cc:subject:date:message-id:x-mailer:in-reply-to :references; bh=iipJDKF0J4uS851QkdcIJqJ9ecP6IMP+gmt7+IWy+t0=; b=qHR5Agg8mlvHga7bAzDZleWh7ivhsvZs3m7UBoYPg/thtU+80/nTNjvhiUH+DkERvq M0jv9y7oi35cp5toVcKOtYGf5OSW2CYY0YAtz8dlH8E6qQCRuwdfQkKr2EahKOnB32ca QGOT8W1bo978mMvV90zFGQnA4sMsthbuH3J6f8USJXQ4DTKU7DFlP7sNoJhGMy17R0O6 g5zfB3fPxmiUGkTgMcCLP1mg0Oe9ven1GRFBw4T4KIsYLOxCL0RBJP60RST5XbLQsC42 C9+4h6j5Dz/UxF+Bx2OG5uiaP/SZJCC+LcZofugVWsbbyLXEluYezL+TOjsulV9dt2Gn SuXw== X-Received: by 10.152.111.67 with SMTP id ig3mr1933904lab.41.1362747243298; Fri, 08 Mar 2013 04:54:03 -0800 (PST) Received: from omicron.terra (c83-179-13-247.cust.tele2.se. [83.179.13.247]) by mx.google.com with ESMTPS id b13sm1627221lbd.10.2013.03.08.04.53.59 (version=TLSv1.2 cipher=RC4-SHA bits=128/128); Fri, 08 Mar 2013 04:54:00 -0800 (PST) Received: from johan by omicron.terra with local (Exim 4.80.1) (envelope-from ) id 1UDwnO-0005bl-Ug; Fri, 08 Mar 2013 13:53:10 +0100 From: Johan Hovold To: Nicolas Ferre 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> X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20130308_075409_318184_733E93A2 X-CRM114-Status: GOOD ( 16.14 ) X-Spam-Score: -2.7 (--) X-Spam-Report: SpamAssassin version 3.3.2 on merlin.infradead.org summary: Content analysis details: (-2.7 points) pts rule name description ---- ---------------------- -------------------------------------------------- -0.7 RCVD_IN_DNSWL_LOW RBL: Sender listed at http://www.dnswl.org/, low trust [209.85.217.175 listed in list.dnswl.org] 0.0 FREEMAIL_FROM Sender email is commonly abused enduser mail provider (jhovold[at]gmail.com) -0.0 SPF_PASS SPF: sender matches SPF record -1.9 BAYES_00 BODY: Bayes spam probability is 0 to 1% [score: 0.0000] -0.1 DKIM_VALID_AU Message has a valid DKIM or DK signature from author's domain 0.1 DKIM_SIGNED Message has a DKIM or DK signature, not necessarily valid -0.1 DKIM_VALID Message has at least one valid DKIM or DK signature Cc: Alessandro Zummo , rtc-linux@googlegroups.com, Johan Hovold , linux-kernel@vger.kernel.org, stable , Jean-Christophe Plagniol-Villard , Andrew Victor , linux-arm-kernel@lists.infradead.org X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+patchwork-linux-arm=patchwork.kernel.org@lists.infradead.org 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,