Received: by 2002:ac0:bc90:0:0:0:0:0 with SMTP id a16csp5596822img; Wed, 27 Mar 2019 11:22:56 -0700 (PDT) X-Google-Smtp-Source: APXvYqx40vCLwY6COjAJ0u9VJ/5j2mx6qm44jR3NW2fXRyTwoO8dCDQVw0aYDjI9IbphQM08Qw0s X-Received: by 2002:a63:3dca:: with SMTP id k193mr18992613pga.146.1553710976461; Wed, 27 Mar 2019 11:22:56 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1553710976; cv=none; d=google.com; s=arc-20160816; b=ukNpt/y1W3PxHZOXSQ/4HkAwAou3k0js1HgrHqMYkSkB5ph14DGyn0vI/uDCJF7SJI CjN5JSk6WtmaXXbQW55b5yCTrVMovv0u3NTx1XV1DwBSKzpFc2p3tSOnNaKM0jGCvGX7 LADldchB6dloGHJm23FSf2DQ723ixInnQZvsZNRInfllyGqsqtfplDOJxFDIql4mp29N OnnZvLnB4UwWBYEzvbFJXk5g0qlFwGGD/tITj0lm453js7kx9gd5yMDZcuZBZ9KjH84h r92OOSSKOKQAg1GFIE39s3toYu/+e5QaE5Rx00Jef65C77Qg5Fzs7byyhPFDr7AHMp2j yEig== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from :dkim-signature; bh=WOsbwEE/XOmHxEsoIZoflcdxrhsmUoprFZkvRjwxWnA=; b=H/kbduR+RPRviGgstXP6RUVy9mQhKU8A3+V0KWVXFDQA7HRqq3ycoowd2TVz4aubb/ 2A470N/rS7hTdsMIzZ+P51nDzq8IBLW1yrz0ScxPjxOPJ/7aCb0Pqorj8gL1AcNr8nmK UvnqDBx0vf+W/zJplV1+bnRdiU6ue+sz4883IEIL22PqcDFP0RjzJK7WTxkJJQURo8IY oKbUiHKrBd3pFjdlYwdnTeP6MHLQMLXdEuXuQqhKE/XtA6E4Bwx1jQdX29L7ipzf49R9 JqIUDpeHzC+vap2suAYbw2l3a215UTBWOkCxkLSwRLCUxhSRwFbSR0CFwuHdZzJYUerc 5huQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=FH47WM+B; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id k1si18791015pfi.25.2019.03.27.11.22.41; Wed, 27 Mar 2019 11:22:56 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=FH47WM+B; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S2391067AbfC0SU5 (ORCPT + 99 others); Wed, 27 Mar 2019 14:20:57 -0400 Received: from mail.kernel.org ([198.145.29.99]:38474 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S2390349AbfC0SUt (ORCPT ); Wed, 27 Mar 2019 14:20:49 -0400 Received: from sasha-vm.mshome.net (c-73-47-72-35.hsd1.nh.comcast.net [73.47.72.35]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id B1E5220651; Wed, 27 Mar 2019 18:20:47 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1553710848; bh=6HoH24Lvr7B8D+QzW9PUQDxGfTcmVK01tBbGaVFDf5g=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=FH47WM+BXBsZWJgK9jinshjT+c6L/lOfqSnXEBlN484RMIu3Ff+zEa3P3Ap3HmhTi GV6B3T2Vyecudd1YGhJnEFgFhG65/+5cYPHkpXVcp0jop1ZZES9hAEbTJygEP83Kn4 If40XP2B8MW3TtmRo2h1xlWI3jgrwWBVgoldc05c= From: Sasha Levin To: linux-kernel@vger.kernel.org, stable@vger.kernel.org Cc: Russell King , Aaro Koskinen , Keerthy , Peter Ujfalusi , Tony Lindgren , Linus Walleij , Sasha Levin , linux-omap@vger.kernel.org, linux-gpio@vger.kernel.org Subject: [PATCH AUTOSEL 4.9 05/87] gpio: gpio-omap: fix level interrupt idling Date: Wed, 27 Mar 2019 14:19:18 -0400 Message-Id: <20190327182040.17444-5-sashal@kernel.org> X-Mailer: git-send-email 2.19.1 In-Reply-To: <20190327182040.17444-1-sashal@kernel.org> References: <20190327182040.17444-1-sashal@kernel.org> MIME-Version: 1.0 X-Patchwork-Hint: Ignore Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Russell King [ Upstream commit d01849f7deba81f4959fd9e51bf20dbf46987d1c ] Tony notes that the GPIO module does not idle when level interrupts are in use, as the wakeup appears to get stuck. After extensive investigation, it appears that the wakeup will only be cleared if the interrupt status register is cleared while the interrupt is enabled. However, we are currently clearing it with the interrupt disabled for level-based interrupts. It is acknowledged that this observed behaviour conflicts with a statement in the TRM: CAUTION After servicing the interrupt, the status bit in the interrupt status register (GPIOi.GPIO_IRQSTATUS_0 or GPIOi.GPIO_IRQSTATUS_1) must be reset and the interrupt line released (by setting the corresponding bit of the interrupt status register to 1) before enabling an interrupt for the GPIO channel in the interrupt-enable register (GPIOi.GPIO_IRQSTATUS_SET_0 or GPIOi.GPIO_IRQSTATUS_SET_1) to prevent the occurrence of unexpected interrupts when enabling an interrupt for the GPIO channel. However, this does not appear to be a practical problem. Further, as reported by Grygorii Strashko , the TI Android kernel tree has an earlier similar patch as "GPIO: OMAP: Fix the sequence to clear the IRQ status" saying: if the status is cleared after disabling the IRQ then sWAKEUP will not be cleared and gates the module transition When we unmask the level interrupt after the interrupt has been handled, enable the interrupt and only then clear the interrupt. If the interrupt is still pending, the hardware will re-assert the interrupt status. Should the caution note in the TRM prove to be a problem, we could use a clear-enable-clear sequence instead. Cc: Aaro Koskinen Cc: Keerthy Cc: Peter Ujfalusi Signed-off-by: Russell King [tony@atomide.com: updated comments based on an earlier TI patch] Signed-off-by: Tony Lindgren Acked-by: Grygorii Strashko Signed-off-by: Linus Walleij Signed-off-by: Sasha Levin --- drivers/gpio/gpio-omap.c | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/drivers/gpio/gpio-omap.c b/drivers/gpio/gpio-omap.c index 6f9c9ac6ee70..75f30a0c418a 100644 --- a/drivers/gpio/gpio-omap.c +++ b/drivers/gpio/gpio-omap.c @@ -837,14 +837,16 @@ static void omap_gpio_unmask_irq(struct irq_data *d) if (trigger) omap_set_gpio_triggering(bank, offset, trigger); - /* For level-triggered GPIOs, the clearing must be done after - * the HW source is cleared, thus after the handler has run */ - if (bank->level_mask & BIT(offset)) { - omap_set_gpio_irqenable(bank, offset, 0); + omap_set_gpio_irqenable(bank, offset, 1); + + /* + * For level-triggered GPIOs, clearing must be done after the source + * is cleared, thus after the handler has run. OMAP4 needs this done + * after enabing the interrupt to clear the wakeup status. + */ + if (bank->level_mask & BIT(offset)) omap_clear_gpio_irqstatus(bank, offset); - } - omap_set_gpio_irqenable(bank, offset, 1); raw_spin_unlock_irqrestore(&bank->lock, flags); } -- 2.19.1