aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorFabio Estevam <fabio.estevam@nxp.com>2016-03-28 17:45:36 -0400
committerBjorn Helgaas <bhelgaas@google.com>2016-04-05 17:20:37 -0400
commitb2d7a9cd3ff8ec561348267c2ef7d47b2b91e801 (patch)
tree7bf85f7da01760ca8cd26eff77738a469f9dd913
parent9735a22799b9214d17d3c231fe377fc852f042e9 (diff)
Revert "PCI: imx6: Add support for active-low reset GPIO"
Commit 5c5fb40de8f1 ("PCI: imx6: Add support for active-low reset GPIO") cause regressions on some boards like MX6 Gateworks Ventana, for example. The reason for the breakage is that this commit sets the GPIO polarity in the wrong logic level. Also, the commit log is wrong because active-low reset GPIO is what the driver used to support since the beginning. So keep the old behavior that ignores the GPIO polarity specified in the device tree and treat the PCI reset GPIO as active-low. Reported-by: Krzysztof HaƂasa <khalasa@piap.pl> Tested-by: Tim Harvey <tharvey@gateworks.com> # Gateworks Ventana Signed-off-by: Fabio Estevam <fabio.estevam@nxp.com> Signed-off-by: Bjorn Helgaas <bhelgaas@google.com> Acked-by: Tim Harvey <tharvey@gateworks.com> Acked-by: Lucas Stach <l.stach@pengutronix.de> CC: stable@vger.kernel.org # v4.5+
-rw-r--r--drivers/pci/host/pci-imx6.c20
1 files changed, 14 insertions, 6 deletions
diff --git a/drivers/pci/host/pci-imx6.c b/drivers/pci/host/pci-imx6.c
index eb5a2755a164..2f817fa4c661 100644
--- a/drivers/pci/host/pci-imx6.c
+++ b/drivers/pci/host/pci-imx6.c
@@ -32,7 +32,7 @@
32#define to_imx6_pcie(x) container_of(x, struct imx6_pcie, pp) 32#define to_imx6_pcie(x) container_of(x, struct imx6_pcie, pp)
33 33
34struct imx6_pcie { 34struct imx6_pcie {
35 struct gpio_desc *reset_gpio; 35 int reset_gpio;
36 struct clk *pcie_bus; 36 struct clk *pcie_bus;
37 struct clk *pcie_phy; 37 struct clk *pcie_phy;
38 struct clk *pcie; 38 struct clk *pcie;
@@ -309,10 +309,10 @@ static int imx6_pcie_deassert_core_reset(struct pcie_port *pp)
309 usleep_range(200, 500); 309 usleep_range(200, 500);
310 310
311 /* Some boards don't have PCIe reset GPIO. */ 311 /* Some boards don't have PCIe reset GPIO. */
312 if (imx6_pcie->reset_gpio) { 312 if (gpio_is_valid(imx6_pcie->reset_gpio)) {
313 gpiod_set_value_cansleep(imx6_pcie->reset_gpio, 0); 313 gpio_set_value_cansleep(imx6_pcie->reset_gpio, 0);
314 msleep(100); 314 msleep(100);
315 gpiod_set_value_cansleep(imx6_pcie->reset_gpio, 1); 315 gpio_set_value_cansleep(imx6_pcie->reset_gpio, 1);
316 } 316 }
317 return 0; 317 return 0;
318 318
@@ -523,6 +523,7 @@ static int __init imx6_pcie_probe(struct platform_device *pdev)
523{ 523{
524 struct imx6_pcie *imx6_pcie; 524 struct imx6_pcie *imx6_pcie;
525 struct pcie_port *pp; 525 struct pcie_port *pp;
526 struct device_node *np = pdev->dev.of_node;
526 struct resource *dbi_base; 527 struct resource *dbi_base;
527 struct device_node *node = pdev->dev.of_node; 528 struct device_node *node = pdev->dev.of_node;
528 int ret; 529 int ret;
@@ -544,8 +545,15 @@ static int __init imx6_pcie_probe(struct platform_device *pdev)
544 return PTR_ERR(pp->dbi_base); 545 return PTR_ERR(pp->dbi_base);
545 546
546 /* Fetch GPIOs */ 547 /* Fetch GPIOs */
547 imx6_pcie->reset_gpio = devm_gpiod_get_optional(&pdev->dev, "reset", 548 imx6_pcie->reset_gpio = of_get_named_gpio(np, "reset-gpio", 0);
548 GPIOD_OUT_LOW); 549 if (gpio_is_valid(imx6_pcie->reset_gpio)) {
550 ret = devm_gpio_request_one(&pdev->dev, imx6_pcie->reset_gpio,
551 GPIOF_OUT_INIT_LOW, "PCIe reset");
552 if (ret) {
553 dev_err(&pdev->dev, "unable to get reset gpio\n");
554 return ret;
555 }
556 }
549 557
550 /* Fetch clocks */ 558 /* Fetch clocks */
551 imx6_pcie->pcie_phy = devm_clk_get(&pdev->dev, "pcie_phy"); 559 imx6_pcie->pcie_phy = devm_clk_get(&pdev->dev, "pcie_phy");