summaryrefslogtreecommitdiff
path: root/drivers
diff options
context:
space:
mode:
authorKrzysztof Kozlowski <[email protected]>2026-03-12 20:26:05 +0100
committerFabio Estevam <[email protected]>2026-04-02 09:05:06 -0300
commit97979e894ba14d67e926322f4f770e3591a3e53c (patch)
treeed261dc05aecfa5f8a5960cba84c40e5d0308332 /drivers
parent98cf83d81617f489d7ff7bf78d33e693e2799254 (diff)
pci: imx: Properly support upstream Linux reset-gpios property
The driver requests explicitly "reset-gpio" property, not the one with "gpios" suffix but upstream Linux kernel deprecated it in 2021. Existing upstream Linux kernel DTS is being changed to "reset-gpios" property, thus update the driver to read that one too. Note that driver is probably broken already, because it parsed GPIO in standard way respecting the flags and on top of that applied the "reset-gpio-active-high" flag, thus "reset-gpio ACTIVE_LOW" with the "reset-gpio-active-high" property would be double inverted. Signed-off-by: Krzysztof Kozlowski <[email protected]>
Diffstat (limited to 'drivers')
-rw-r--r--drivers/pci/pcie_imx.c22
1 files changed, 19 insertions, 3 deletions
diff --git a/drivers/pci/pcie_imx.c b/drivers/pci/pcie_imx.c
index 11c4ccbfc55..8d853ecf2c2 100644
--- a/drivers/pci/pcie_imx.c
+++ b/drivers/pci/pcie_imx.c
@@ -728,15 +728,31 @@ static int imx_pcie_dm_write_config(struct udevice *dev, pci_dev_t bdf,
static int imx_pcie_dm_probe(struct udevice *dev)
{
struct imx_pcie_priv *priv = dev_get_priv(dev);
+ int ret;
#if CONFIG_IS_ENABLED(DM_REGULATOR)
device_get_supply_regulator(dev, "vpcie-supply", &priv->vpcie);
#endif
/* if PERST# valid from dt then assert it */
- gpio_request_by_name(dev, "reset-gpio", 0, &priv->reset_gpio,
- GPIOD_IS_OUT);
- priv->reset_active_high = dev_read_bool(dev, "reset-gpio-active-high");
+ ret = gpio_request_by_name(dev, "reset-gpio", 0, &priv->reset_gpio,
+ GPIOD_IS_OUT);
+ if (!ret) {
+ /*
+ * Legacy property, invert assert logic based on
+ * reset-gpio-active-high. This won't work if flags are not
+ * matching the reset-gpio-active-high.
+ */
+ priv->reset_active_high = dev_read_bool(dev, "reset-gpio-active-high");
+ } else {
+ /*
+ * Linux kernel upstream property, assert active level based on
+ * GPIO flags, thus leave priv->reset_active_high=0.
+ */
+ gpio_request_by_name(dev, "reset-gpios", 0, &priv->reset_gpio,
+ GPIOD_IS_OUT);
+ }
+
if (dm_gpio_is_valid(&priv->reset_gpio)) {
dm_gpio_set_value(&priv->reset_gpio,
priv->reset_active_high ? 0 : 1);