[PATCH v2] PCI: dra7xx: Fix reset behaviour

From: Luca Ceresoli
Date: Mon May 31 2021 - 05:06:30 EST


The PCIe PERSTn reset pin is active low and should be asserted, then
deasserted.

The current implementation only drives the pin once in "HIGH" position,
thus presumably it was intended to deassert the pin. This has two problems:

1) it assumes the pin was asserted by other means before loading the
driver
2) it has the wrong polarity, since "HIGH" means "active", and the pin is
presumably configured as active low coherently with the PCIe
convention, thus it is driven physically to 0, keeping the device
under reset unless the pin is configured as active high.

Fix both problems by:

1) keeping devm_gpiod_get_optional(dev, NULL, GPIOD_OUT_HIGH) as is, but
assuming the pin is correctly configured as "active low" this now
becomes a reset assertion
2) adding gpiod_set_value(reset, 0) after a delay to deassert reset

Fixes: 78bdcad05ea1 ("PCI: dra7xx: Add support to make GPIO drive PERST# line")
Signed-off-by: Luca Ceresoli <luca@xxxxxxxxxxxxxxxx>

---

Changes v1 -> v2:
- No changes to the patch
- Reword commit message according to suggestions from Bjorn Helgaas (from
another patchset)
- Add Fixes: tag
---
drivers/pci/controller/dwc/pci-dra7xx.c | 2 ++
1 file changed, 2 insertions(+)

diff --git a/drivers/pci/controller/dwc/pci-dra7xx.c b/drivers/pci/controller/dwc/pci-dra7xx.c
index cb5d4c245ff6..11f392b7a9a2 100644
--- a/drivers/pci/controller/dwc/pci-dra7xx.c
+++ b/drivers/pci/controller/dwc/pci-dra7xx.c
@@ -801,6 +801,8 @@ static int dra7xx_pcie_probe(struct platform_device *pdev)
dev_err(&pdev->dev, "gpio request failed, ret %d\n", ret);
goto err_gpio;
}
+ usleep_range(1000, 2000);
+ gpiod_set_value(reset, 0);

reg = dra7xx_pcie_readl(dra7xx, PCIECTRL_DRA7XX_CONF_DEVICE_CMD);
reg &= ~LTSSM_EN;
--
2.25.1