From patchwork Mon Mar 11 18:07:55 2013 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Johan Hovold X-Patchwork-Id: 2249821 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 341F0DF5B1 for ; Mon, 11 Mar 2013 18:17:07 +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 1UF7Dx-0008Ar-GR; Mon, 11 Mar 2013 18:13:26 +0000 Received: from mail-lb0-f171.google.com ([209.85.217.171]) by merlin.infradead.org with esmtps (Exim 4.80.1 #2 (Red Hat Linux)) id 1UF7CA-0007Zr-0w for linux-arm-kernel@lists.infradead.org; Mon, 11 Mar 2013 18:11:39 +0000 Received: by mail-lb0-f171.google.com with SMTP id gg13so3371452lbb.16 for ; Mon, 11 Mar 2013 11:11:22 -0700 (PDT) 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=/VPYqdgVtDuHuTedQxvoV3rjbsF4zQfuy4OTkZXUPR8=; b=ONOnBU7kM6Oyq8iLDrZrvvUcLV0UsJrPRSpkz+ylx5ICfBWUnb9Mym4rk6M0TvjZqN 9ClFmCbUl/3GqOWp+oznFnIlf93roHEXtnc8NFm/KPDpD7q/2vuR3bkIjVU3sp1USqNH ECd8yrNvdKZjFE58V2iWMwT5LSBhsQ26iYedDzbYEQ0BIhAvpyOmV9T4bsJGgKWEAe5d Au5BIJilkfC1rHgLnbSSY0w3he0qSrxoY54T3nnBq0uIRx9i1EbnlpfSi3PdILgv7VD5 iK6YId+rD03CBh3+jbj7Hh4f/c6pJTZUsJRO27Yves/ulQGeUc954naxo+6LzAM4XXOp DhcA== X-Received: by 10.112.48.33 with SMTP id i1mr4785184lbn.76.1363025482569; Mon, 11 Mar 2013 11:11:22 -0700 (PDT) Received: from omicron.terra (c83-179-13-247.cust.tele2.se. [83.179.13.247]) by mx.google.com with ESMTPS id j2sm4757429lbd.16.2013.03.11.11.11.18 (version=TLSv1.2 cipher=RC4-SHA bits=128/128); Mon, 11 Mar 2013 11:11:19 -0700 (PDT) Received: from johan by omicron.terra with local (Exim 4.80.1) (envelope-from ) id 1UF7B7-0004cu-Nt; Mon, 11 Mar 2013 19:10:29 +0100 From: Johan Hovold To: Nicolas Ferre Subject: [PATCH v2 1/5] ARM: at91/rtc: fix boot after RTC wake-up Date: Mon, 11 Mar 2013 19:07:55 +0100 Message-Id: <1363025279-17615-2-git-send-email-jhovold@gmail.com> X-Mailer: git-send-email 1.8.1.5 In-Reply-To: <1363025279-17615-1-git-send-email-jhovold@gmail.com> References: <20130311180611.GF8797@localhost> <1363025279-17615-1-git-send-email-jhovold@gmail.com> X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20130311_141134_503268_5B9D1B5E X-CRM114-Status: GOOD ( 17.46 ) 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.171 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,