From 10e12b90654622997c2564b956fefc824b4bc3c5 Mon Sep 17 00:00:00 2001 From: Mason Huo Date: Fri, 8 Sep 2023 18:30:59 +0800 Subject: pci: Add external gpio control for sideband signal For the devkit board, PCIe sideband signals are controled by external gpios, use gpio direct control instead of pinctrl. Signed-off-by: Mason Huo Signed-off-by: Hal Feng --- drivers/pci/pcie_starfive.c | 34 +++++++++++++++++++++++++--------- 1 file changed, 25 insertions(+), 9 deletions(-) diff --git a/drivers/pci/pcie_starfive.c b/drivers/pci/pcie_starfive.c index d02cffe9d4..d8de9a5997 100644 --- a/drivers/pci/pcie_starfive.c +++ b/drivers/pci/pcie_starfive.c @@ -103,6 +103,8 @@ struct starfive_pcie { int atr_table_num; int first_busno; + struct gpio_desc *power_gpio; + struct gpio_desc *reset_gpio; }; static int starfive_pcie_addr_valid(pci_dev_t bdf, int first_busno) @@ -371,22 +373,32 @@ static int starfive_pcie_init_port(struct udevice *dev) goto err_deassert_clk; } -#if CONFIG_IS_ENABLED(TARGET_STARFIVE_EVB) +#if CONFIG_IS_ENABLED(TARGET_STARFIVE_EVB) || CONFIG_IS_ENABLED(TARGET_STARFIVE_DEVKITS) ret = pinctrl_select_state(dev, "power-active"); if (ret) { - dev_err(dev, "Set power-acvtive pinctrl failed: %d\n", ret); - goto err_deassert_reset; + priv->power_gpio = + devm_gpiod_get_optional(dev, "power", GPIOD_IS_OUT); + if (IS_ERR(priv->power_gpio)) { + dev_err(dev, "Get power-acvtive gpio failed: %d\n", ret); + goto err_deassert_reset; + } + dm_gpio_set_value(priv->power_gpio, 1); } #endif ret = pinctrl_select_state(dev, "perst-active"); if (ret) { - dev_err(dev, "Set perst-active pinctrl failed: %d\n", ret); -#if CONFIG_IS_ENABLED(TARGET_STARFIVE_EVB) - goto err_release_power_pin; + priv->reset_gpio = + devm_gpiod_get_optional(dev, "reset", GPIOD_IS_OUT); + if (IS_ERR(priv->reset_gpio)) { + dev_err(dev, "Set perst-active gpio failed: %d\n", ret); +#if CONFIG_IS_ENABLED(TARGET_STARFIVE_EVB) || CONFIG_IS_ENABLED(TARGET_STARFIVE_DEVKITS) + goto err_release_power_pin; #else - goto err_deassert_reset; + goto err_deassert_reset; #endif + } + dm_gpio_set_value(priv->reset_gpio, 1); } /* Disable physical functions except #0 */ @@ -447,13 +459,17 @@ static int starfive_pcie_init_port(struct udevice *dev) mdelay(100); ret = pinctrl_select_state(dev, "perst-default"); if (ret) { - dev_err(dev, "Set perst-default pinctrl failed: %d\n", ret); + if (priv->reset_gpio) { + dm_gpio_set_value(priv->reset_gpio, 0); + return 0; + } else + dev_err(dev, "Set perst-default pinctrl failed: %d\n", ret); return ret; } return 0; -#if CONFIG_IS_ENABLED(TARGET_STARFIVE_EVB) +#if CONFIG_IS_ENABLED(TARGET_STARFIVE_EVB) || CONFIG_IS_ENABLED(TARGET_STARFIVE_DEVKITS) err_release_power_pin: pinctrl_select_state(dev, "power-default"); #endif -- cgit v1.2.3