]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
PCI: imx6: Convert to use agnostic GPIO API
authorAndy Shevchenko <andriy.shevchenko@linux.intel.com>
Mon, 6 May 2024 14:20:40 +0000 (17:20 +0300)
committerBjorn Helgaas <bhelgaas@google.com>
Tue, 28 May 2024 16:15:08 +0000 (11:15 -0500)
The of_gpio.h legacy API is going to be removed. In preparation for that,
convert the driver to the agnostic API.

[kwilczynski: commit log]
Link: https://lore.kernel.org/linux-pci/20240506142142.4042810-5-andriy.shevchenko@linux.intel.com
Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
Signed-off-by: Krzysztof WilczyƄski <kwilczynski@kernel.org>
Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
Reviewed-by: Frank Li <Frank.Li@nxp.com>
Reviewed-by: Linus Walleij <linus.walleij@linaro.org>
Reviewed-by: Manivannan Sadhasivam <manivannan.sadhasivam@linaro.org>
drivers/pci/controller/dwc/pci-imx6.c

index 917c69edee1d54199cdf19106af61d9578359159..62a4994c55019d05cc02f052ff8e62a6672973a3 100644 (file)
 #include <linux/bitfield.h>
 #include <linux/clk.h>
 #include <linux/delay.h>
-#include <linux/gpio.h>
+#include <linux/gpio/consumer.h>
 #include <linux/kernel.h>
 #include <linux/mfd/syscon.h>
 #include <linux/mfd/syscon/imx6q-iomuxc-gpr.h>
 #include <linux/mfd/syscon/imx7-iomuxc-gpr.h>
 #include <linux/module.h>
 #include <linux/of.h>
-#include <linux/of_gpio.h>
 #include <linux/of_address.h>
 #include <linux/pci.h>
 #include <linux/platform_device.h>
@@ -107,8 +106,7 @@ struct imx6_pcie_drvdata {
 
 struct imx6_pcie {
        struct dw_pcie          *pci;
-       int                     reset_gpio;
-       bool                    gpio_active_high;
+       struct gpio_desc        *reset_gpiod;
        bool                    link_is_up;
        struct clk_bulk_data    clks[IMX6_PCIE_MAX_CLKS];
        struct regmap           *iomuxc_gpr;
@@ -721,9 +719,7 @@ static void imx6_pcie_assert_core_reset(struct imx6_pcie *imx6_pcie)
        }
 
        /* Some boards don't have PCIe reset GPIO. */
-       if (gpio_is_valid(imx6_pcie->reset_gpio))
-               gpio_set_value_cansleep(imx6_pcie->reset_gpio,
-                                       imx6_pcie->gpio_active_high);
+       gpiod_set_value_cansleep(imx6_pcie->reset_gpiod, 1);
 }
 
 static int imx6_pcie_deassert_core_reset(struct imx6_pcie *imx6_pcie)
@@ -771,10 +767,9 @@ static int imx6_pcie_deassert_core_reset(struct imx6_pcie *imx6_pcie)
        }
 
        /* Some boards don't have PCIe reset GPIO. */
-       if (gpio_is_valid(imx6_pcie->reset_gpio)) {
+       if (imx6_pcie->reset_gpiod) {
                msleep(100);
-               gpio_set_value_cansleep(imx6_pcie->reset_gpio,
-                                       !imx6_pcie->gpio_active_high);
+               gpiod_set_value_cansleep(imx6_pcie->reset_gpiod, 0);
                /* Wait for 100ms after PERST# deassertion (PCIe r5.0, 6.6.1) */
                msleep(100);
        }
@@ -1285,22 +1280,11 @@ static int imx6_pcie_probe(struct platform_device *pdev)
                return PTR_ERR(pci->dbi_base);
 
        /* Fetch GPIOs */
-       imx6_pcie->reset_gpio = of_get_named_gpio(node, "reset-gpio", 0);
-       imx6_pcie->gpio_active_high = of_property_read_bool(node,
-                                               "reset-gpio-active-high");
-       if (gpio_is_valid(imx6_pcie->reset_gpio)) {
-               ret = devm_gpio_request_one(dev, imx6_pcie->reset_gpio,
-                               imx6_pcie->gpio_active_high ?
-                                       GPIOF_OUT_INIT_HIGH :
-                                       GPIOF_OUT_INIT_LOW,
-                               "PCIe reset");
-               if (ret) {
-                       dev_err(dev, "unable to get reset gpio\n");
-                       return ret;
-               }
-       } else if (imx6_pcie->reset_gpio == -EPROBE_DEFER) {
-               return imx6_pcie->reset_gpio;
-       }
+       imx6_pcie->reset_gpiod = devm_gpiod_get_optional(dev, "reset", GPIOD_OUT_HIGH);
+       if (IS_ERR(imx6_pcie->reset_gpiod))
+               return dev_err_probe(dev, PTR_ERR(imx6_pcie->reset_gpiod),
+                                    "unable to get reset gpio\n");
+       gpiod_set_consumer_name(imx6_pcie->reset_gpiod, "PCIe reset");
 
        if (imx6_pcie->drvdata->clks_cnt >= IMX6_PCIE_MAX_CLKS)
                return dev_err_probe(dev, -ENOMEM, "clks_cnt is too big\n");