Received: by 2002:a25:1985:0:0:0:0:0 with SMTP id 127csp2342388ybz; Thu, 23 Apr 2020 16:22:43 -0700 (PDT) X-Google-Smtp-Source: APiQypJlU8Chm5XjZsxw769Pq8f1qgB9RWeGccVLs2GvcDGDVDxkN1NxxmEJ0myiSCsLenFgdScY X-Received: by 2002:a05:6402:2076:: with SMTP id bd22mr5017740edb.334.1587684162970; Thu, 23 Apr 2020 16:22:42 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1587684162; cv=none; d=google.com; s=arc-20160816; b=o65I8NPCj/0psqlSzonU2gxHLZ1kSTP4BPUu55JBC6NVnLdO/QPg83Miz/Irh9GSP7 R3hMAMJHNYML7IyX8ciU9OttIlK1dxZLyKeVAQoQtoyPwdb6JbQKZimoxPwbnczZscUb 9q/5eV8Rqgd7X/5ev/2APZs7jd69WQXS1SxVFsgM6rm0AohWzstqDG7xJki+dy0IN9f5 vjmhcQxmKUIiKbPh+CiXHcYp1S7gF/aLWZgDYAq7lXF6FTQqrHhePcBaLDzGtG3ysH9N fysymoPgxt8ziG8vgmA6G8ncwE9A5WGMwTM2xamkY7gWDjFJ9btvHG1KP5JlSswbkXoI SGUg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:in-reply-to:subject:message-id:date:cc:to :from:mime-version:content-transfer-encoding:content-disposition; bh=NT/dx7ESCJI2/w7OIKlo9HkO2Tsf2eocpEKXfRFSak0=; b=j0XiyJ0yu+Cy4I3Vick49bo3h1mQMhOzN1caBxX+GXuRs9J8k+zHz5hs3T66VvvRdF GRp7Sn/ZiyzjYtiODvlKjQiDDPMm5AU6yYHbTOjwdDQdMxPLi5/hAAErEg6nQIRFLi7Y 8KZLV1G9oBtqtQtd2JECU6s61hVN0kC5Eyx8hMGq2kFfYp374QtYPRYwGGwIO2AWGi6j YI3tiJAdvA3uLAeIMehszoqqoRc50l7A8smbupgLfskKfepdJtg5zYwI7+YEyw2Ct4S9 1yCR/uDZaaEOG2yWGUB0NDZa6UNQbWKEsf0zP/WUN99TKAIZ+03nUvSwplcmCznlIKxf bgbA== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id w1si2050349ejq.325.2020.04.23.16.22.19; Thu, 23 Apr 2020 16:22:42 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1729906AbgDWXVG (ORCPT + 99 others); Thu, 23 Apr 2020 19:21:06 -0400 Received: from shadbolt.e.decadent.org.uk ([88.96.1.126]:48588 "EHLO shadbolt.e.decadent.org.uk" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1728204AbgDWXGd (ORCPT ); Thu, 23 Apr 2020 19:06:33 -0400 Received: from [192.168.4.242] (helo=deadeye) by shadbolt.decadent.org.uk with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.89) (envelope-from ) id 1jRkvM-0004cG-Dd; Fri, 24 Apr 2020 00:06:28 +0100 Received: from ben by deadeye with local (Exim 4.93) (envelope-from ) id 1jRkvK-00E6jV-JV; Fri, 24 Apr 2020 00:06:26 +0100 Content-Type: text/plain; charset="UTF-8" Content-Disposition: inline Content-Transfer-Encoding: 8bit MIME-Version: 1.0 From: Ben Hutchings To: linux-kernel@vger.kernel.org, stable@vger.kernel.org CC: akpm@linux-foundation.org, Denis Kirjanov , "Mika Westerberg" , "Linus Walleij" Date: Fri, 24 Apr 2020 00:04:54 +0100 Message-ID: X-Mailer: LinuxStableQueue (scripts by bwh) X-Patchwork-Hint: ignore Subject: [PATCH 3.16 067/245] pinctrl: baytrail: Clear interrupt triggering from pins that are in GPIO mode In-Reply-To: X-SA-Exim-Connect-IP: 192.168.4.242 X-SA-Exim-Mail-From: ben@decadent.org.uk X-SA-Exim-Scanned: No (on shadbolt.decadent.org.uk); SAEximRunCond expanded to false Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org 3.16.83-rc1 review patch. If anyone has any objections, please let me know. ------------------ From: Mika Westerberg commit 95f0972c7e4cbf3fc68160131c5ac2f033481d00 upstream. If the pin is already configured as GPIO and it has any of the triggering flags set, we may get spurious interrupts depending on the state of the pin. Prevent this by clearing the triggering flags on such pins. However, if the pin is also configured as "direct IRQ" we leave the flags as is. Otherwise it will prevent interrupts that are routed directly to IO-APIC. Signed-off-by: Mika Westerberg Signed-off-by: Linus Walleij [bwh: Backported to 3.16: - Add definition of BYT_DIRECT_IRQ_EN - Adjust filename] Signed-off-by: Ben Hutchings --- --- a/drivers/pinctrl/pinctrl-baytrail.c +++ b/drivers/pinctrl/pinctrl-baytrail.c @@ -44,6 +44,7 @@ /* BYT_CONF0_REG register bits */ #define BYT_IODEN BIT(31) +#define BYT_DIRECT_IRQ_EN BIT(27) #define BYT_TRIG_NEG BIT(26) #define BYT_TRIG_POS BIT(25) #define BYT_TRIG_LVL BIT(24) @@ -160,6 +161,19 @@ static void __iomem *byt_gpio_reg(struct return vg->reg_base + reg_offset + reg; } +static void byt_gpio_clear_triggering(struct byt_gpio *vg, unsigned offset) +{ + void __iomem *reg = byt_gpio_reg(&vg->chip, offset, BYT_CONF0_REG); + unsigned long flags; + u32 value; + + spin_lock_irqsave(&vg->lock, flags); + value = readl(reg); + value &= ~(BYT_TRIG_POS | BYT_TRIG_NEG | BYT_TRIG_LVL); + writel(value, reg); + spin_unlock_irqrestore(&vg->lock, flags); +} + static u32 byt_get_gpio_mux(struct byt_gpio *vg, unsigned offset) { /* SCORE pin 92-93 */ @@ -213,14 +227,8 @@ static int byt_gpio_request(struct gpio_ static void byt_gpio_free(struct gpio_chip *chip, unsigned offset) { struct byt_gpio *vg = to_byt_gpio(chip); - void __iomem *reg = byt_gpio_reg(&vg->chip, offset, BYT_CONF0_REG); - u32 value; - - /* clear interrupt triggering */ - value = readl(reg); - value &= ~(BYT_TRIG_POS | BYT_TRIG_NEG | BYT_TRIG_LVL); - writel(value, reg); + byt_gpio_clear_triggering(vg, offset); pm_runtime_put(&vg->pdev->dev); } @@ -496,6 +504,21 @@ static void byt_gpio_irq_init_hw(struct { void __iomem *reg; u32 base, value; + int i; + + /* + * Clear interrupt triggers for all pins that are GPIOs and + * do not use direct IRQ mode. This will prevent spurious + * interrupts from misconfigured pins. + */ + for (i = 0; i < vg->chip.ngpio; i++) { + value = readl(byt_gpio_reg(&vg->chip, i, BYT_CONF0_REG)); + if ((value & BYT_PIN_MUX) == byt_get_gpio_mux(vg, i) && + !(value & BYT_DIRECT_IRQ_EN)) { + byt_gpio_clear_triggering(vg, i); + dev_dbg(&vg->pdev->dev, "disabling GPIO %d\n", i); + } + } /* clear interrupt status trigger registers */ for (base = 0; base < vg->chip.ngpio; base += 32) {