From patchwork Thu Feb 4 13:14:31 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Grygorii Strashko X-Patchwork-Id: 8221421 Return-Path: X-Original-To: patchwork-linux-arm@patchwork.kernel.org Delivered-To: patchwork-parsemail@patchwork2.web.kernel.org Received: from mail.kernel.org (mail.kernel.org [198.145.29.136]) by patchwork2.web.kernel.org (Postfix) with ESMTP id 0C378BEEE5 for ; Thu, 4 Feb 2016 13:16:37 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id 0AE5A202C8 for ; Thu, 4 Feb 2016 13:16:36 +0000 (UTC) Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.9]) (using TLSv1.2 with cipher AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id DBDB320266 for ; Thu, 4 Feb 2016 13:16:34 +0000 (UTC) Received: from localhost ([127.0.0.1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.80.1 #2 (Red Hat Linux)) id 1aRJkY-0008SU-Ez; Thu, 04 Feb 2016 13:15:06 +0000 Received: from devils.ext.ti.com ([198.47.26.153]) by bombadil.infradead.org with esmtps (Exim 4.80.1 #2 (Red Hat Linux)) id 1aRJkT-00088p-BU for linux-arm-kernel@lists.infradead.org; Thu, 04 Feb 2016 13:15:03 +0000 Received: from dlelxv90.itg.ti.com ([172.17.2.17]) by devils.ext.ti.com (8.13.7/8.13.7) with ESMTP id u14DEYNa022355; Thu, 4 Feb 2016 07:14:34 -0600 Received: from DLEE70.ent.ti.com (dlee70.ent.ti.com [157.170.170.113]) by dlelxv90.itg.ti.com (8.14.3/8.13.8) with ESMTP id u14DEY18030462; Thu, 4 Feb 2016 07:14:34 -0600 Received: from dlep33.itg.ti.com (157.170.170.75) by DLEE70.ent.ti.com (157.170.170.113) with Microsoft SMTP Server id 14.3.224.2; Thu, 4 Feb 2016 07:14:33 -0600 Received: from [172.22.234.164] (ileax41-snat.itg.ti.com [10.172.224.153]) by dlep33.itg.ti.com (8.14.3/8.13.8) with ESMTP id u14DEV5R021991; Thu, 4 Feb 2016 07:14:32 -0600 Subject: Re: [PATCH 3/3] ARM: OMAP2+: remove misuse of IRQF_NO_SUSPEND flag To: Sudeep Holla , , Tony Lindgren References: <1454351299-27440-1-git-send-email-sudeep.holla@arm.com> <1454351299-27440-4-git-send-email-sudeep.holla@arm.com> From: Grygorii Strashko Message-ID: <56B34EB7.4080005@ti.com> Date: Thu, 4 Feb 2016 15:14:31 +0200 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:38.0) Gecko/20100101 Thunderbird/38.5.1 MIME-Version: 1.0 In-Reply-To: <1454351299-27440-4-git-send-email-sudeep.holla@arm.com> X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20160204_051501_619188_7999E7A7 X-CRM114-Status: GOOD ( 22.53 ) X-Spam-Score: -7.4 (-------) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.20 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: linux-gpio@vger.kernel.org, Linus Walleij , "linux-omap@vger.kernel.org" Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+patchwork-linux-arm=patchwork.kernel.org@lists.infradead.org X-Spam-Status: No, score=-4.7 required=5.0 tests=BAYES_00, RCVD_IN_DNSWL_MED, RP_MATCHES_RCVD, UNPARSEABLE_RELAY autolearn=unavailable version=3.3.1 X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on mail.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP Hi Sudeep, On 02/01/2016 08:28 PM, Sudeep Holla wrote: > The IRQF_NO_SUSPEND flag is used to identify the interrupts that should > be left enabled so as to allow them to work as expected during the > suspend-resume cycle, but doesn't guarantee that it will wake the system > from a suspended state, enable_irq_wake is recommended to be used for > the wakeup. > > This patch removes the use of IRQF_NO_SUSPEND flags replacing it with > enable_irq_wake instead. And sorry for delayed reply - I've spent some time investigating it, but It was during Christmas holidays and finally I lost track of it :) So, what we have: 1) bad news: it will not work :( The PRCM wake up is handled in the following way on OMAP3+ -- PRCM IRQ omap_prcm_irq_handler() |- (a) "wkup" event -> _prcm_int_handle_wakeup() |- "io" event (shared) |- (b) _prcm_int_handle_io() |- (c) pcs_irq_handler() (mux is for legacy platform - can be ignored for now) All "wkup"/"io" events must be handled in PRCM registers before PRCM IRQ status bits can be acked and reset. It means that all IRQs (a), (b) (c) have to be enabled at the moment when PRCM IRQ is fired. Unfortunately this can't be guaranteed by IR PM core and omap_prcm_irq_handler() will stuck forever on Resume :(. Resume example: omap_prcm_irq_handler() [1] -> prcm_irq_setup->read_pending_irqs(pending); -> is there pending irqs? -> io event -> (c) pcs_irq (enabled | wakeup src) -> irq_pm_check_wakeup() -> (disabled | suspended| pending) pcs_irq_handler() not run -> goto [1] ----- OOps dead-loop 2) Potential good news: It could be fixed the same way as it's done omap34xx (and as it was before : (now chained) and, probably, make it threaded and all cascaded IRQs as nested threaded (this is just a theory). I'll be on business trip next two weeks and will not be able to help more with it Sorry. > > Cc: Grygorii Strashko > Cc: Tony Lindgren > Cc: linux-omap@vger.kernel.org > Cc: linux-arm-kernel@lists.infradead.org > Signed-off-by: Sudeep Holla > --- > arch/arm/mach-omap2/mux.c | 4 ++-- > arch/arm/mach-omap2/pm34xx.c | 9 ++++----- > arch/arm/mach-omap2/prm_common.c | 1 + > 3 files changed, 7 insertions(+), 7 deletions(-) > > diff --git a/arch/arm/mach-omap2/mux.c b/arch/arm/mach-omap2/mux.c > index 176eef6ef338..12012bef8e63 100644 > --- a/arch/arm/mach-omap2/mux.c > +++ b/arch/arm/mach-omap2/mux.c > @@ -810,13 +810,13 @@ int __init omap_mux_late_init(void) > return 0; > > ret = request_irq(omap_prcm_event_to_irq("io"), > - omap_hwmod_mux_handle_irq, IRQF_SHARED | IRQF_NO_SUSPEND, > + omap_hwmod_mux_handle_irq, IRQF_SHARED, > "hwmod_io", omap_mux_late_init); > > if (ret) > pr_warn("mux: Failed to setup hwmod io irq %d\n", ret); > > - return 0; > + return enable_irq_wake(omap_prcm_event_to_irq("io")); > } > > static void __init omap_mux_package_fixup(struct omap_mux *p, > diff --git a/arch/arm/mach-omap2/pm34xx.c b/arch/arm/mach-omap2/pm34xx.c > index 2dbd3785ee6f..49604e0023c4 100644 > --- a/arch/arm/mach-omap2/pm34xx.c > +++ b/arch/arm/mach-omap2/pm34xx.c > @@ -472,23 +472,22 @@ int __init omap3_pm_init(void) > prcm_setup_regs(); > > ret = request_irq(omap_prcm_event_to_irq("wkup"), > - _prcm_int_handle_wakeup, IRQF_NO_SUSPEND, "pm_wkup", NULL); > + _prcm_int_handle_wakeup, 0, "pm_wkup", NULL); > > if (ret) { > pr_err("pm: Failed to request pm_wkup irq\n"); > goto err1; > } > + enable_irq_wake(omap_prcm_event_to_irq("wkup")); > > /* IO interrupt is shared with mux code */ > ret = request_irq(omap_prcm_event_to_irq("io"), > - _prcm_int_handle_io, IRQF_SHARED | IRQF_NO_SUSPEND, "pm_io", > - omap3_pm_init); > - enable_irq(omap_prcm_event_to_irq("io")); > - > + _prcm_int_handle_io, IRQF_SHARED, "pm_io", omap3_pm_init); > if (ret) { > pr_err("pm: Failed to request pm_io irq\n"); > goto err2; > } > + enable_irq_wake(omap_prcm_event_to_irq("io")); > > ret = pwrdm_for_each(pwrdms_setup, NULL); > if (ret) { > diff --git a/arch/arm/mach-omap2/prm_common.c b/arch/arm/mach-omap2/prm_common.c > index 5b2f5138d938..7af688273e0d 100644 > --- a/arch/arm/mach-omap2/prm_common.c > +++ b/arch/arm/mach-omap2/prm_common.c > @@ -338,6 +338,7 @@ int omap_prcm_register_chain_handler(struct omap_prcm_irq_setup *irq_setup) > ct->chip.irq_ack = irq_gc_ack_set_bit; > ct->chip.irq_mask = irq_gc_mask_clr_bit; > ct->chip.irq_unmask = irq_gc_mask_set_bit; > + ct->chip.flags = IRQCHIP_SKIP_SET_WAKE; > > ct->regs.ack = irq_setup->ack + i * 4; > ct->regs.mask = irq_setup->mask + i * 4; > diff --git a/arch/arm/mach-omap2/pm.c b/arch/arm/mach-omap2/pm.c index 58920bc..a0f8265 100644 --- a/arch/arm/mach-omap2/pm.c +++ b/arch/arm/mach-omap2/pm.c @@ -221,8 +221,7 @@ static int omap_pm_enter(suspend_state_t suspend_state) static int omap_pm_begin(suspend_state_t state) { cpu_idle_poll_ctrl(true); - if (cpu_is_omap34xx()) - omap_prcm_irq_prepare(); + omap_prcm_irq_prepare(); return 0; } @@ -233,8 +232,7 @@ static void omap_pm_end(void) static void omap_pm_finish(void) { - if (cpu_is_omap34xx()) - omap_prcm_irq_complete(); + omap_prcm_irq_complete(); } Another option is to convert omap_prcm_irq_handler to the generic handler