From patchwork Sun Feb 24 14:04:23 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Marc Zyngier X-Patchwork-Id: 1047508 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming-netdev@ozlabs.org Delivered-To: patchwork-incoming-netdev@ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=netdev-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=none (p=none dis=none) header.from=arm.com Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 446n0n5RvHz9s9T for ; Mon, 25 Feb 2019 01:05:45 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1728387AbfBXOFN (ORCPT ); Sun, 24 Feb 2019 09:05:13 -0500 Received: from usa-sjc-mx-foss1.foss.arm.com ([217.140.101.70]:52476 "EHLO foss.arm.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726835AbfBXOFM (ORCPT ); Sun, 24 Feb 2019 09:05:12 -0500 Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.72.51.249]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id 4D2D91596; Sun, 24 Feb 2019 06:05:12 -0800 (PST) Received: from why.lan (usa-sjc-mx-foss1.foss.arm.com [217.140.101.70]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPSA id 3166C3F690; Sun, 24 Feb 2019 06:05:09 -0800 (PST) From: Marc Zyngier To: Amitkumar Karwar , Enric Balletbo i Serra , Ganapathi Bhat , Heiko Stuebner , Kalle Valo , Nishant Sarmukadam , Rob Herring , Xinming Hu Cc: "David S. Miller" , devicetree@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, linux-rockchip@lists.infradead.org, linux-wireless@vger.kernel.org, netdev@vger.kernel.org Subject: [PATCH 1/4] dt-bindings/marvell-8xxx: Allow wake-up interrupt to be placed in a separate node Date: Sun, 24 Feb 2019 14:04:23 +0000 Message-Id: <20190224140426.3267-2-marc.zyngier@arm.com> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20190224140426.3267-1-marc.zyngier@arm.com> References: <20190224140426.3267-1-marc.zyngier@arm.com> MIME-Version: 1.0 Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org The DT binding for the PCI version of the Marvell 8xxx wifi devices is pretty broken (the fact that a PCI device requires a DT binding is quite telling on its own). The binding allows the description of a wake-up interrupt as a sideband signal, allowing the wifi device to wake-up the system. So far, so good. Until you realise that placing an interrupt in the PCI device DT node has a specific meaning, and applies to the actual PCI function, and not some random sideband stuff. This is of course in total violation of the OF specification (IEEE Std 1275-1994), but hey, who cares. Let's thus change the binding to be somewhat compatible with the spec, by placing the wake-up interrupt in a subnode called "wake-up". This still is an optional property, but a recommended one for PCI devices. Signed-off-by: Marc Zyngier --- .../bindings/net/wireless/marvell-8xxx.txt | 23 ++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/Documentation/devicetree/bindings/net/wireless/marvell-8xxx.txt b/Documentation/devicetree/bindings/net/wireless/marvell-8xxx.txt index 9bf9bbac16e2..f9340ca37047 100644 --- a/Documentation/devicetree/bindings/net/wireless/marvell-8xxx.txt +++ b/Documentation/devicetree/bindings/net/wireless/marvell-8xxx.txt @@ -33,10 +33,16 @@ Optional properties: this interrupt number. during system suspend, the irq will be enabled so that the wifi chip can wakeup host platform under certain condition. during system resume, the irq will be disabled to make sure - unnecessary interrupt is not received. + unnecessary interrupt is not received. For PCI devices, it + is recommended that this property is placed in a "wake-up" + sub-node in order to limit the ambiguity with PCI legacy + interrupts. - vmmc-supply: a phandle of a regulator, supplying VCC to the card - mmc-pwrseq: phandle to the MMC power sequence node. See "mmc-pwrseq-*" for documentation of MMC power sequence bindings. + - wake-up: a subnode containing the interrupt specifier for a wake-up + interrupt. This is the recommended configuration for PCI + devices. Example: @@ -66,3 +72,18 @@ so that firmware can wakeup host using this device side pin. marvell,wakeup-pin = <3>; }; }; + +&pci_rootport { + mvl_wifi: wifi@0,0 { + compatible = "pci1b4b,2b42"; + reg = <0x83010000 0x0 0x00000000 0x0 0x00100000 + 0x83010000 0x0 0x00100000 0x0 0x00100000>; + pinctrl-names = "default"; + pinctrl-0 = <&wlan_host_wake_l>; + wake-up { + interrupt-parent = <&gpio0>; + interrupts = <8 IRQ_TYPE_LEVEL_LOW>; + wakeup-source; + }; + }; +}; From patchwork Sun Feb 24 14:04:24 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Marc Zyngier X-Patchwork-Id: 1047507 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming-netdev@ozlabs.org Delivered-To: patchwork-incoming-netdev@ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=netdev-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=none (p=none dis=none) header.from=arm.com Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 446n0h4Cs7z9s9T for ; Mon, 25 Feb 2019 01:05:40 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1728428AbfBXOFQ (ORCPT ); Sun, 24 Feb 2019 09:05:16 -0500 Received: from usa-sjc-mx-foss1.foss.arm.com ([217.140.101.70]:52496 "EHLO foss.arm.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1728409AbfBXOFQ (ORCPT ); Sun, 24 Feb 2019 09:05:16 -0500 Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.72.51.249]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id BD79A1688; Sun, 24 Feb 2019 06:05:15 -0800 (PST) Received: from why.lan (usa-sjc-mx-foss1.foss.arm.com [217.140.101.70]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPSA id 9DDF73F690; Sun, 24 Feb 2019 06:05:12 -0800 (PST) From: Marc Zyngier To: Amitkumar Karwar , Enric Balletbo i Serra , Ganapathi Bhat , Heiko Stuebner , Kalle Valo , Nishant Sarmukadam , Rob Herring , Xinming Hu Cc: "David S. Miller" , devicetree@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, linux-rockchip@lists.infradead.org, linux-wireless@vger.kernel.org, netdev@vger.kernel.org Subject: [PATCH 2/4] mwifiex: Fetch wake-up interrupt from 'wake-up' subnode when it exists Date: Sun, 24 Feb 2019 14:04:24 +0000 Message-Id: <20190224140426.3267-3-marc.zyngier@arm.com> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20190224140426.3267-1-marc.zyngier@arm.com> References: <20190224140426.3267-1-marc.zyngier@arm.com> MIME-Version: 1.0 Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org Encoding the wake-up interrupt as part of the PCI DT node is completely broken, as it violates the most basic rules of PCI description in OF: the interrupts described in such node are supposed to apply to the PCI device, and not to some non-PCI stuff on the side. In such a configuration, both the PCI device and the wake-up widget end-up trying to share an interrupt. Of course, this doesn't work: The PCI device can only generate interrupts through the root port, while the wake-up widget uses sideband signaling that bypasses PCI altogether. Clearly, this was never tested. So let's first try and obtain the wake-up interrupt from a 'wake-up' subnode, and fallback to the main DT node otherwise. This ensures that old DTs will carry on working as bad as before (with the added warning to let the user know about the situation), and new DT will enjoy legacy interrupts in case MSIs are unavailable. Signed-off-by: Marc Zyngier --- drivers/net/wireless/marvell/mwifiex/main.c | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/drivers/net/wireless/marvell/mwifiex/main.c b/drivers/net/wireless/marvell/mwifiex/main.c index 20cee5c397fb..2105c2b7c627 100644 --- a/drivers/net/wireless/marvell/mwifiex/main.c +++ b/drivers/net/wireless/marvell/mwifiex/main.c @@ -1590,17 +1590,26 @@ static void mwifiex_probe_of(struct mwifiex_adapter *adapter) { int ret; struct device *dev = adapter->dev; + struct device_node *wup_node; if (!dev->of_node) goto err_exit; adapter->dt_node = dev->of_node; - adapter->irq_wakeup = irq_of_parse_and_map(adapter->dt_node, 0); + wup_node = of_get_child_by_name(adapter->dt_node, "wake-up"); + if (!wup_node) + wup_node = adapter->dt_node; + adapter->irq_wakeup = irq_of_parse_and_map(wup_node, 0); if (!adapter->irq_wakeup) { dev_dbg(dev, "fail to parse irq_wakeup from device tree\n"); goto err_exit; } + if (dev_is_pci(dev) && adapter->dt_node == wup_node) + dev_warn(dev, + "wake-up interrupt outside 'wake-up' subnode of %pOF\n", + adapter->dt_node); + ret = devm_request_irq(dev, adapter->irq_wakeup, mwifiex_irq_wakeup_handler, IRQF_TRIGGER_LOW, "wifi_wake", adapter); From patchwork Sun Feb 24 14:04:25 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Marc Zyngier X-Patchwork-Id: 1047506 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming-netdev@ozlabs.org Delivered-To: patchwork-incoming-netdev@ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=netdev-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=none (p=none dis=none) header.from=arm.com Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 446n0c3lqSz9sDL for ; Mon, 25 Feb 2019 01:05:36 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1728461AbfBXOFV (ORCPT ); Sun, 24 Feb 2019 09:05:21 -0500 Received: from usa-sjc-mx-foss1.foss.arm.com ([217.140.101.70]:52520 "EHLO foss.arm.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1728409AbfBXOFT (ORCPT ); Sun, 24 Feb 2019 09:05:19 -0500 Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.72.51.249]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id 3950E16A3; Sun, 24 Feb 2019 06:05:19 -0800 (PST) Received: from why.lan (usa-sjc-mx-foss1.foss.arm.com [217.140.101.70]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPSA id 1AF9E3F690; Sun, 24 Feb 2019 06:05:15 -0800 (PST) From: Marc Zyngier To: Amitkumar Karwar , Enric Balletbo i Serra , Ganapathi Bhat , Heiko Stuebner , Kalle Valo , Nishant Sarmukadam , Rob Herring , Xinming Hu Cc: "David S. Miller" , devicetree@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, linux-rockchip@lists.infradead.org, linux-wireless@vger.kernel.org, netdev@vger.kernel.org Subject: [PATCH 3/4] mwifiex: Flag wake-up interrupt as IRQ_NOAUTOEN rather than disabling it too late Date: Sun, 24 Feb 2019 14:04:25 +0000 Message-Id: <20190224140426.3267-4-marc.zyngier@arm.com> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20190224140426.3267-1-marc.zyngier@arm.com> References: <20190224140426.3267-1-marc.zyngier@arm.com> MIME-Version: 1.0 Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org The mwifiex driver makes unsafe assumptions about the state of the wake-up interrupt. It requests it and only then disable it. Of course, the interrupt may be screaming for whatever reason at that time, and the handler will then be called without the interrupt having been registered with the PM/wakeup subsystem. Oops. The right way to handle this kind of situation is to flag the interrupt with IRQ_NOAUTOEN before requesting it. It will then stay disabled until someone (the wake-up subsystem) enables it. Signed-off-by: Marc Zyngier Reviewed-by: Brian Norris --- drivers/net/wireless/marvell/mwifiex/main.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/net/wireless/marvell/mwifiex/main.c b/drivers/net/wireless/marvell/mwifiex/main.c index 2105c2b7c627..82cf35e50579 100644 --- a/drivers/net/wireless/marvell/mwifiex/main.c +++ b/drivers/net/wireless/marvell/mwifiex/main.c @@ -1610,6 +1610,7 @@ static void mwifiex_probe_of(struct mwifiex_adapter *adapter) "wake-up interrupt outside 'wake-up' subnode of %pOF\n", adapter->dt_node); + irq_set_status_flags(adapter->irq_wakeup, IRQ_NOAUTOEN); ret = devm_request_irq(dev, adapter->irq_wakeup, mwifiex_irq_wakeup_handler, IRQF_TRIGGER_LOW, "wifi_wake", adapter); @@ -1619,7 +1620,6 @@ static void mwifiex_probe_of(struct mwifiex_adapter *adapter) goto err_exit; } - disable_irq(adapter->irq_wakeup); if (device_init_wakeup(dev, true)) { dev_err(dev, "fail to init wakeup for mwifiex\n"); goto err_exit; From patchwork Sun Feb 24 14:04:26 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Marc Zyngier X-Patchwork-Id: 1047505 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming-netdev@ozlabs.org Delivered-To: patchwork-incoming-netdev@ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=netdev-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=none (p=none dis=none) header.from=arm.com Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 446n0W0C85z9sCH for ; Mon, 25 Feb 2019 01:05:31 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1728491AbfBXOFZ (ORCPT ); Sun, 24 Feb 2019 09:05:25 -0500 Received: from usa-sjc-mx-foss1.foss.arm.com ([217.140.101.70]:52534 "EHLO foss.arm.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1728409AbfBXOFX (ORCPT ); Sun, 24 Feb 2019 09:05:23 -0500 Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.72.51.249]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id A6DD1A78; Sun, 24 Feb 2019 06:05:22 -0800 (PST) Received: from why.lan (usa-sjc-mx-foss1.foss.arm.com [217.140.101.70]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPSA id 8B4963F690; Sun, 24 Feb 2019 06:05:19 -0800 (PST) From: Marc Zyngier To: Amitkumar Karwar , Enric Balletbo i Serra , Ganapathi Bhat , Heiko Stuebner , Kalle Valo , Nishant Sarmukadam , Rob Herring , Xinming Hu Cc: "David S. Miller" , devicetree@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, linux-rockchip@lists.infradead.org, linux-wireless@vger.kernel.org, netdev@vger.kernel.org Subject: [PATCH 4/4] arm64: dts: rockchip: gru: Move wifi wake-up interrupt into its own subnode Date: Sun, 24 Feb 2019 14:04:26 +0000 Message-Id: <20190224140426.3267-5-marc.zyngier@arm.com> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20190224140426.3267-1-marc.zyngier@arm.com> References: <20190224140426.3267-1-marc.zyngier@arm.com> MIME-Version: 1.0 Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org In order to get PCIe legacy interrupts working on gru-based Chromebooks, let's move the wake-up interrupt out of the way and into its own subnode. This ensures that this interrupt specifier will not be mistaken as a PCI interrupt. Signed-off-by: Marc Zyngier --- arch/arm64/boot/dts/rockchip/rk3399-gru-chromebook.dtsi | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/arch/arm64/boot/dts/rockchip/rk3399-gru-chromebook.dtsi b/arch/arm64/boot/dts/rockchip/rk3399-gru-chromebook.dtsi index c400be64170e..61fff688770c 100644 --- a/arch/arm64/boot/dts/rockchip/rk3399-gru-chromebook.dtsi +++ b/arch/arm64/boot/dts/rockchip/rk3399-gru-chromebook.dtsi @@ -310,11 +310,13 @@ ap_i2c_tp: &i2c5 { compatible = "pci1b4b,2b42"; reg = <0x83010000 0x0 0x00000000 0x0 0x00100000 0x83010000 0x0 0x00100000 0x0 0x00100000>; - interrupt-parent = <&gpio0>; - interrupts = <8 IRQ_TYPE_LEVEL_LOW>; pinctrl-names = "default"; pinctrl-0 = <&wlan_host_wake_l>; - wakeup-source; + wake-up { + interrupt-parent = <&gpio0>; + interrupts = <8 IRQ_TYPE_LEVEL_LOW>; + wakeup-source; + }; }; };