From: "Pali Rohár" <pali@kernel.org> To: "Jason Cooper" <jason@lakedaemon.net>, "Andrew Lunn" <andrew@lunn.ch>, "Gregory Clement" <gregory.clement@bootlin.com>, "Sebastian Hesselbarth" <sebastian.hesselbarth@gmail.com>, "Rob Herring" <robh+dt@kernel.org>, "Thomas Petazzoni" <thomas.petazzoni@bootlin.com>, "Lorenzo Pieralisi" <lorenzo.pieralisi@arm.com>, "Andrew Murray" <amurray@thegoodpenguin.co.uk>, "Bjorn Helgaas" <bhelgaas@google.com>, "Remi Pommarel" <repk@triplefau.lt>, "Marek Behún" <marek.behun@nic.cz>, "Tomasz Maciej Nowak" <tmn505@gmail.com>, Xogium <contact@xogium.me> Cc: devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, linux-pci@vger.kernel.org Subject: [PATCH v4 05/12] PCI: aardvark: Issue PERST via GPIO Date: Thu, 30 Apr 2020 10:06:18 +0200 [thread overview] Message-ID: <20200430080625.26070-6-pali@kernel.org> (raw) In-Reply-To: <20200430080625.26070-1-pali@kernel.org> Add support for issuing PERST via GPIO specified in 'reset-gpios' property (as described in PCI device tree bindings). Some buggy cards (e.g. Compex WLE900VX or WLE1216) are not detected after reboot when PERST is not issued during driver initialization. If bootloader already enabled link training then issuing PERST has no effect for some buggy cards (e.g. Compex WLE900VX) and these cards are not detected. We therefore clear the LINK_TRAINING_EN register before. It was observed that Compex WLE900VX card needs to be in PERST reset for at least 10ms if bootloader enabled link training. Tested on Turris MOX. Signed-off-by: Pali Rohár <pali@kernel.org> --- drivers/pci/controller/pci-aardvark.c | 43 ++++++++++++++++++++++++++- 1 file changed, 42 insertions(+), 1 deletion(-) diff --git a/drivers/pci/controller/pci-aardvark.c b/drivers/pci/controller/pci-aardvark.c index e202f954eb84..2ecc79c03ade 100644 --- a/drivers/pci/controller/pci-aardvark.c +++ b/drivers/pci/controller/pci-aardvark.c @@ -9,6 +9,7 @@ */ #include <linux/delay.h> +#include <linux/gpio.h> #include <linux/interrupt.h> #include <linux/irq.h> #include <linux/irqdomain.h> @@ -18,6 +19,7 @@ #include <linux/platform_device.h> #include <linux/msi.h> #include <linux/of_address.h> +#include <linux/of_gpio.h> #include <linux/of_pci.h> #include "../pci.h" @@ -204,6 +206,7 @@ struct advk_pcie { int root_bus_nr; int link_gen; struct pci_bridge_emul bridge; + struct gpio_desc *reset_gpio; }; static inline void advk_writel(struct advk_pcie *pcie, u32 val, u64 reg) @@ -330,10 +333,31 @@ static void advk_pcie_train_link(struct advk_pcie *pcie) dev_err(dev, "link never came up\n"); } +static void advk_pcie_issue_perst(struct advk_pcie *pcie) +{ + u32 reg; + + if (!pcie->reset_gpio) + return; + + /* PERST does not work for some cards when link training is enabled */ + reg = advk_readl(pcie, PCIE_CORE_CTRL0_REG); + reg &= ~LINK_TRAINING_EN; + advk_writel(pcie, reg, PCIE_CORE_CTRL0_REG); + + /* 10ms delay is needed for some cards */ + dev_info(&pcie->pdev->dev, "issuing PERST via reset GPIO for 10ms\n"); + gpiod_set_value_cansleep(pcie->reset_gpio, 1); + usleep_range(10000, 11000); + gpiod_set_value_cansleep(pcie->reset_gpio, 0); +} + static void advk_pcie_setup_hw(struct advk_pcie *pcie) { u32 reg; + advk_pcie_issue_perst(pcie); + /* Set to Direct mode */ reg = advk_readl(pcie, CTRL_CONFIG_REG); reg &= ~(CTRL_MODE_MASK << CTRL_MODE_SHIFT); @@ -406,7 +430,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 + * function advk_pcie_issue_perst(), 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. */ @@ -1046,6 +1071,22 @@ static int advk_pcie_probe(struct platform_device *pdev) } pcie->root_bus_nr = bus->start; + pcie->reset_gpio = devm_gpiod_get_from_of_node(dev, dev->of_node, + "reset-gpios", 0, + GPIOD_OUT_LOW, + "pcie1-reset"); + ret = PTR_ERR_OR_ZERO(pcie->reset_gpio); + if (ret) { + if (ret == -ENOENT) { + pcie->reset_gpio = NULL; + } else { + if (ret != -EPROBE_DEFER) + dev_err(dev, "Failed to get reset-gpio: %i\n", + ret); + return ret; + } + } + ret = of_pci_get_max_link_speed(dev->of_node); if (ret <= 0 || ret > 3) pcie->link_gen = 3; -- 2.20.1
next prev parent reply other threads:[~2020-04-30 8:07 UTC|newest] Thread overview: 35+ messages / expand[flat|nested] mbox.gz Atom feed top 2020-04-30 8:06 [PATCH v4 00/12] PCI: aardvark: Fix support for Turris MOX and Compex wifi cards Pali Rohár 2020-04-30 8:06 ` [PATCH v4 01/12] PCI: aardvark: Train link immediately after enabling training Pali Rohár 2020-05-04 15:50 ` Bjorn Helgaas 2020-05-07 21:05 ` Rob Herring 2020-04-30 8:06 ` [PATCH v4 02/12] PCI: aardvark: Don't blindly enable ASPM L0s and don't write to read-only register Pali Rohár 2020-05-07 21:07 ` Rob Herring 2020-04-30 8:06 ` [PATCH v4 03/12] PCI: of: Zero max-link-speed value is invalid Pali Rohár 2020-05-07 21:07 ` Rob Herring 2020-04-30 8:06 ` [PATCH v4 04/12] PCI: aardvark: Improve link training Pali Rohár 2020-05-07 21:10 ` Rob Herring 2020-04-30 8:06 ` Pali Rohár [this message] 2020-04-30 8:22 ` [PATCH v4 05/12] PCI: aardvark: Issue PERST via GPIO Pali Rohár 2020-05-07 21:20 ` Rob Herring 2020-04-30 8:06 ` [PATCH v4 06/12] PCI: aardvark: Add FIXME comment for PCIE_CORE_CMD_STATUS_REG access Pali Rohár 2020-05-07 21:20 ` Rob Herring 2020-04-30 8:06 ` [PATCH v4 07/12] PCI: aardvark: Add PHY support Pali Rohár 2020-05-07 21:23 ` Rob Herring 2020-04-30 8:06 ` [PATCH v4 08/12] PCI: aardvark: Replace custom macros by standard linux/pci_regs.h macros Pali Rohár 2020-05-04 15:52 ` Bjorn Helgaas 2020-05-07 21:24 ` Rob Herring 2020-04-30 8:06 ` [PATCH v4 09/12] dt-bindings: PCI: aardvark: Describe new properties Pali Rohár 2020-05-07 21:25 ` Rob Herring 2020-04-30 8:06 ` [PATCH v4 10/12] arm64: dts: marvell: armada-37xx: Set pcie_reset_pin to gpio function Pali Rohár 2020-04-30 8:06 ` [PATCH v4 11/12] arm64: dts: marvell: armada-37xx: Move PCIe comphy handle property Pali Rohár 2020-04-30 8:06 ` [PATCH v4 12/12] arm64: dts: marvell: armada-37xx: Move PCIe max-link-speed property Pali Rohár 2020-05-04 15:50 ` Bjorn Helgaas 2020-05-08 13:11 ` [PATCH v4 00/12] PCI: aardvark: Fix support for Turris MOX and Compex wifi cards Tomasz Maciej Nowak 2020-05-13 11:16 ` Pali Rohár 2020-05-13 11:33 ` Lorenzo Pieralisi 2020-05-13 11:59 ` Pali Rohár 2020-05-13 11:56 ` Thomas Petazzoni 2020-05-17 15:57 ` Gregory CLEMENT 2020-05-18 10:30 ` Pali Rohár 2020-05-18 13:46 ` Lorenzo Pieralisi 2020-05-18 13:50 ` Marek Behun
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=20200430080625.26070-6-pali@kernel.org \ --to=pali@kernel.org \ --cc=amurray@thegoodpenguin.co.uk \ --cc=andrew@lunn.ch \ --cc=bhelgaas@google.com \ --cc=contact@xogium.me \ --cc=devicetree@vger.kernel.org \ --cc=gregory.clement@bootlin.com \ --cc=jason@lakedaemon.net \ --cc=linux-kernel@vger.kernel.org \ --cc=linux-pci@vger.kernel.org \ --cc=lorenzo.pieralisi@arm.com \ --cc=marek.behun@nic.cz \ --cc=repk@triplefau.lt \ --cc=robh+dt@kernel.org \ --cc=sebastian.hesselbarth@gmail.com \ --cc=thomas.petazzoni@bootlin.com \ --cc=tmn505@gmail.com \ --subject='Re: [PATCH v4 05/12] PCI: aardvark: Issue PERST via GPIO' \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: link
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.