Add PERST# signal handling via I2C GPIO expander for AMD Versal2 MDB PCIe Root Port. Signed-off-by: Sai Krishna Musham <sai.krishna.musham@xxxxxxx> --- drivers/pci/controller/dwc/pcie-amd-mdb.c | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/drivers/pci/controller/dwc/pcie-amd-mdb.c b/drivers/pci/controller/dwc/pcie-amd-mdb.c index 4eb2a4e8189d..4eea53e9e197 100644 --- a/drivers/pci/controller/dwc/pcie-amd-mdb.c +++ b/drivers/pci/controller/dwc/pcie-amd-mdb.c @@ -18,6 +18,7 @@ #include <linux/resource.h> #include <linux/types.h> +#include "../../pci.h" #include "pcie-designware.h" #define AMD_MDB_TLP_IR_STATUS_MISC 0x4C0 @@ -408,6 +409,7 @@ static int amd_mdb_add_pcie_port(struct amd_mdb_pcie *pcie, struct dw_pcie *pci = &pcie->pci; struct dw_pcie_rp *pp = &pci->pp; struct device *dev = &pdev->dev; + struct gpio_desc *reset_gpio; int err; pcie->slcr = devm_platform_ioremap_resource_byname(pdev, "slcr"); @@ -426,6 +428,24 @@ static int amd_mdb_add_pcie_port(struct amd_mdb_pcie *pcie, pp->ops = &amd_mdb_pcie_host_ops; + /* Request the GPIO for PCIe reset signal and assert */ + reset_gpio = devm_gpiod_get_optional(dev, "reset", GPIOD_OUT_HIGH); + if (IS_ERR(reset_gpio)) { + if (PTR_ERR(reset_gpio) == -EPROBE_DEFER) + return -EPROBE_DEFER; + dev_err(dev, "Failed to request reset GPIO\n"); + return PTR_ERR(reset_gpio); + } + + if (reset_gpio) { + /* Controller specific delay */ + udelay(50); + + /* Deassert the reset signal */ + gpiod_set_value_cansleep(reset_gpio, 0); + mdelay(PCIE_T_RRS_READY_MS); + } + err = dw_pcie_host_init(pp); if (err) { dev_err(dev, "Failed to initialize host, err=%d\n", err); -- 2.31.1