Received: by 2002:a25:1985:0:0:0:0:0 with SMTP id 127csp712757ybz; Wed, 15 Apr 2020 17:17:46 -0700 (PDT) X-Google-Smtp-Source: APiQypLFMn5BCB8J2pScQlsgKose5N1d+LNPOtHYX+P/YfxCr+PmzT6DxwbEqH/6bFMAXYoi8Gk6 X-Received: by 2002:a17:906:2594:: with SMTP id m20mr7047744ejb.368.1586996265935; Wed, 15 Apr 2020 17:17:45 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1586996265; cv=none; d=google.com; s=arc-20160816; b=xdR1J8PpmBT5OU96feTLqpALZOrwI7QSt77FO1yWBpid9og4XqcQai/yCOwn8crAVx lAaAfOjAdq3VS8hPUZCcLtGe3FFOvvEi2E4w4b8UDTjAGBwlxtKMzqoNh814y7uLh8oc PTuvMq/WtDMH1hQqKAKmieAO6hcmXEEnl3Eyp+23FSHmXW9zBcUG8g1Y1ldHHckRDIlN 0X/HtcIVv16h10Ww2420BOHwd/nr2CFev7vxzVq0xT5/hDtQ1Hg/wiU3yqCpZiyAL8Kg HmZWesgIl9I0yT9P5bIAI1QX/dV4ZU+vOee6ZlGO2MXXmyz4SRTcBq3+BAQMC/9QtInL YcCA== 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=qscJbF25LSt2ELIcmFGHwS7ygyCaFjcJ054TGVfMLn4=; b=gVvIB6xrFpsX07KWiwSnbOBPpxuA2qvEr5Nmb1CGLxyQuJ1apdhyOeJ0f3gZFz5Tt6 4iXSNPpAhvRmsjYGRhZ+VHd7eh9+xACnGsj0oFN7d+Ww3gE9YyjM2vxj78joPKTGAiRe 4pzf8yWaLs0M22eMRApNSC0hpOqVH4cf2m3ylc5DvNeO2sJ3wap+dL6OHv66rzko/SgQ vodb2N1tbJBPPoPZFCPuOVUZjRKesLoaNVprdlYTQT5j//NgXgQuT5U52JKYI3YDtgz8 525rrj3mN1qpdrv0jAW9kRwOq3XHtkwzoJBsmHfmg4FTu/JN9RXQwznecJopAkCeUWOM RW3g== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b="Oa/43f04"; 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; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id a3si11415679ejj.33.2020.04.15.17.17.22; Wed, 15 Apr 2020 17:17:45 -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; dkim=pass header.i=@kernel.org header.s=default header.b="Oa/43f04"; 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; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S2406511AbgDOQEP (ORCPT + 99 others); Wed, 15 Apr 2020 12:04:15 -0400 Received: from mail.kernel.org ([198.145.29.99]:56712 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S2410149AbgDOQEB (ORCPT ); Wed, 15 Apr 2020 12:04:01 -0400 Received: from pali.im (pali.im [31.31.79.79]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id 5226D21569; Wed, 15 Apr 2020 16:04:01 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1586966641; bh=1YUfEX82K+60B/zqLyakfZdfKZRyfg4LKtcOqbCXQzY=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=Oa/43f04xATTEKSed4AMeN63fKk4K3aKweuLUoPUwwjQkSTtSVG7VuVXkJHNZSeAs pYfOo6c/V3czlZsEwhc72gYlkVG5Hbr46KQot3RqHzKfm6bRPIgCIWobAcdI59aUzV LQZKo/WMZLMRG0/g7B43HU4habRvHXSmk8nI4bVI= Received: by pali.im (Postfix) id 85BD258E; Wed, 15 Apr 2020 18:03:59 +0200 (CEST) From: =?UTF-8?q?Pali=20Roh=C3=A1r?= To: Jason Cooper , Andrew Lunn , Gregory Clement , Sebastian Hesselbarth , Rob Herring , Thomas Petazzoni , Lorenzo Pieralisi , Andrew Murray , Bjorn Helgaas , Remi Pommarel , =?UTF-8?q?Marek=20Beh=C3=BAn?= , Tomasz Maciej Nowak , Xogium Cc: devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, linux-pci@vger.kernel.org Subject: [PATCH 6/8] PCI: aardvark: Add support for issuing PERST via GPIO Date: Wed, 15 Apr 2020 18:03:46 +0200 Message-Id: <20200415160348.1146-2-pali@kernel.org> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20200415160054.951-1-pali@kernel.org> References: <20200415160054.951-1-pali@kernel.org> MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org bindings/pci/pci.txt defines standard DT property reset-gpios for specifying PERST GPIO. Read this property from Device Tree via devm_gpiod_get_from_of_node() function. As this property is optional, function may return -ENOENT. During initialization of aardvark PCI controller toggle supplied GPIO to issue PERST. Some Compex ath10k cards (e.g. WLE900VX or WLE1216) are not detected after reboot when PERST is not issued during driver initialization. And Compex WLE1216 cards need to be in reset state for at least 1ms otherwise they are not detected too. Tested on Turris MOX and after this change Compex cards are detected also after rebooting board. Signed-off-by: Pali Rohár --- drivers/pci/controller/pci-aardvark.c | 30 ++++++++++++++++++++++++++- 1 file changed, 29 insertions(+), 1 deletion(-) diff --git a/drivers/pci/controller/pci-aardvark.c b/drivers/pci/controller/pci-aardvark.c index a83bbc86e428..6a97a3838098 100644 --- a/drivers/pci/controller/pci-aardvark.c +++ b/drivers/pci/controller/pci-aardvark.c @@ -9,6 +9,7 @@ */ #include +#include #include #include #include @@ -18,6 +19,7 @@ #include #include #include +#include #include #include "../pci.h" @@ -203,6 +205,7 @@ struct advk_pcie { u16 msi_msg; int root_bus_nr; struct pci_bridge_emul bridge; + struct gpio_desc *reset_gpio; }; static inline void advk_writel(struct advk_pcie *pcie, u32 val, u64 reg) @@ -280,6 +283,14 @@ static void advk_pcie_setup_hw(struct advk_pcie *pcie) int max_link_speed, neg_link_speed; u32 reg; + if (pcie->reset_gpio) { + dev_info(dev, "issuing PERST via reset GPIO for 1ms\n"); + gpiod_set_value_cansleep(pcie->reset_gpio, 1); + /* Detection of some Compex WLE1216 cards needs at least 1ms */ + mdelay(1); + gpiod_set_value_cansleep(pcie->reset_gpio, 0); + } + /* Set to Direct mode */ reg = advk_readl(pcie, CTRL_CONFIG_REG); reg &= ~(CTRL_MODE_MASK << CTRL_MODE_SHIFT); @@ -358,7 +369,8 @@ static void advk_pcie_setup_hw(struct advk_pcie *pcie) /* * PERST# signal could have been asserted by pinctrl subsystem before - * probe() callback has been called, making the endpoint going into + * probe() callback has been called or issued explicitly by reset gpio + * routine at beginning of this function, making the endpoint going into * fundamental reset. As required by PCI Express spec a delay for at * least 100ms after such a reset before link training is needed. */ @@ -1043,6 +1055,22 @@ static int advk_pcie_probe(struct platform_device *pdev) } pcie->root_bus_nr = bus->start; + /* Returns -ENOENT if reset-gpios property is not populated */ + pcie->reset_gpio = devm_gpiod_get_from_of_node(dev, dev->of_node, + "reset-gpios", 0, + GPIOD_OUT_LOW, + "pcie1-reset"); + if (IS_ERR(pcie->reset_gpio)) { + if (PTR_ERR(pcie->reset_gpio) == -ENOENT) { + pcie->reset_gpio = NULL; + } else { + if (PTR_ERR(pcie->reset_gpio) != -EPROBE_DEFER) + dev_err(dev, "Failed to retrieve reset GPIO (%ld)\n", + PTR_ERR(pcie->reset_gpio)); + return PTR_ERR(pcie->reset_gpio); + } + } + advk_pcie_setup_hw(pcie); advk_sw_pci_bridge_init(pcie); -- 2.20.1