From patchwork Tue Mar 21 00:17:32 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ladislav Michl X-Patchwork-Id: 9635765 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork.web.codeaurora.org (Postfix) with ESMTP id 1D63B601E9 for ; Tue, 21 Mar 2017 00:17:43 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 0D12E26E4F for ; Tue, 21 Mar 2017 00:17:43 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 00E95275A2; Tue, 21 Mar 2017 00:17:42 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-6.9 required=2.0 tests=BAYES_00, RCVD_IN_DNSWL_HI, UNPARSEABLE_RELAY autolearn=ham version=3.3.1 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 47FB226E4F for ; Tue, 21 Mar 2017 00:17:42 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1755931AbdCUARl (ORCPT ); Mon, 20 Mar 2017 20:17:41 -0400 Received: from eddie.linux-mips.org ([148.251.95.138]:48570 "EHLO cvs.linux-mips.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1755830AbdCUARl (ORCPT ); Mon, 20 Mar 2017 20:17:41 -0400 Received: (from localhost user: 'ladis' uid#1021 fake: STDIN (ladis@eddie.linux-mips.org)) by eddie.linux-mips.org id S23993878AbdCUARdn0kS6 (ORCPT ); Tue, 21 Mar 2017 01:17:33 +0100 Date: Tue, 21 Mar 2017 01:17:32 +0100 From: Ladislav Michl To: Grygorii Strashko Cc: Tony Lindgren , linux-omap@vger.kernel.org Subject: Re: gpio-omap: Edge interrupts stall Message-ID: <20170321001732.gs525wb5klq7fuq7@lenoch> References: <20170310230430.6pfljo5rr7esn5qb@lenoch> <20170311201105.GV20572@atomide.com> <20170314182125.GG20572@atomide.com> <20170315061832.yswodnpe3btfttfi@lenoch> <20170315163108.GL20572@atomide.com> <20170316191745.GP20572@atomide.com> <20170320112154.aip27xoacb7pcqut@lenoch> <15d7bf1f-a3b0-f0b7-aa89-46962e4742bc@ti.com> MIME-Version: 1.0 Content-Disposition: inline In-Reply-To: <15d7bf1f-a3b0-f0b7-aa89-46962e4742bc@ti.com> User-Agent: NeoMutt/20170113 (1.7.2) Sender: linux-omap-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-omap@vger.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP On Mon, Mar 20, 2017 at 04:16:33PM -0500, Grygorii Strashko wrote: > > > On 03/20/2017 06:21 AM, Ladislav Michl wrote: > > On Thu, Mar 16, 2017 at 12:17:45PM -0700, Tony Lindgren wrote: > >> Hmm maybe we need to flush posted writes when re-enabling the GPIO interrupts? > >> > >> Below is an untested patch that might help if that's the case. > > > > Unfortunately that's not the case. Even writing set&clear version of > > interrupt demux handler did not make it any better. And idea from > > ancient patch I initially sent is not easily extensible when we > > need to trigger interrupt on both edges. So far I'm clueless... > > So, just to be sure - can you reproduce it with LKML? Do you mean mainline kernel? I'm on 4.11-rc3 now... > As per code, the possible problem could be with double acking of edge irqs > (theoretically): > - omap_gpio_irq_handler > - "isr" = read irq status > - omap_clear_gpio_irqbank(bank, isr_saved & ~level_mask); --- clear edge status, so new irq can be accepted > - loop while "isr" > generic_handle_irq() > - handle_edge_irq() > - desc->irq_data.chip->irq_ack(&desc->irq_data); > - omap_gpio_ack_irq() > it might be that at this moment edge IRQ was triggered again and it will be cleared. > > just as an experiment, could you try to update omap_gpio_ack_irq() > as below: > > if (irq type is not edge) > omap_clear_gpio_irqstatus(bank, offset); Rewritten as: And that did the trick. So far I tried IR decoder and decoding sometimes fails, but I cannot say anything certain until I check with scope (which I do tomorrow) Thank you, ladis --- To unsubscribe from this list: send the line "unsubscribe linux-omap" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html diff --git a/drivers/gpio/gpio-omap.c b/drivers/gpio/gpio-omap.c index efc85a279d54..9381763e1fec 100644 --- a/drivers/gpio/gpio-omap.c +++ b/drivers/gpio/gpio-omap.c @@ -806,7 +806,8 @@ static void omap_gpio_ack_irq(struct irq_data *d) struct gpio_bank *bank = omap_irq_data_get_bank(d); unsigned offset = d->hwirq; - omap_clear_gpio_irqstatus(bank, offset); + if (bank->level_mask & BIT(offset)) + omap_clear_gpio_irqstatus(bank, offset); } static void omap_gpio_mask_irq(struct irq_data *d)