Commit 2e81122d authored by Andy Shevchenko's avatar Andy Shevchenko Committed by Bjorn Helgaas

PCI: imx6: Convert to use agnostic GPIO API

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.comSigned-off-by: default avatarAndy Shevchenko <andriy.shevchenko@linux.intel.com>
Signed-off-by: default avatarKrzysztof Wilczyński <kwilczynski@kernel.org>
Signed-off-by: default avatarBjorn Helgaas <bhelgaas@google.com>
Reviewed-by: default avatarFrank Li <Frank.Li@nxp.com>
Reviewed-by: default avatarLinus Walleij <linus.walleij@linaro.org>
Reviewed-by: default avatarManivannan Sadhasivam <manivannan.sadhasivam@linaro.org>
parent 050a5e4b
...@@ -11,14 +11,13 @@ ...@@ -11,14 +11,13 @@
#include <linux/bitfield.h> #include <linux/bitfield.h>
#include <linux/clk.h> #include <linux/clk.h>
#include <linux/delay.h> #include <linux/delay.h>
#include <linux/gpio.h> #include <linux/gpio/consumer.h>
#include <linux/kernel.h> #include <linux/kernel.h>
#include <linux/mfd/syscon.h> #include <linux/mfd/syscon.h>
#include <linux/mfd/syscon/imx6q-iomuxc-gpr.h> #include <linux/mfd/syscon/imx6q-iomuxc-gpr.h>
#include <linux/mfd/syscon/imx7-iomuxc-gpr.h> #include <linux/mfd/syscon/imx7-iomuxc-gpr.h>
#include <linux/module.h> #include <linux/module.h>
#include <linux/of.h> #include <linux/of.h>
#include <linux/of_gpio.h>
#include <linux/of_address.h> #include <linux/of_address.h>
#include <linux/pci.h> #include <linux/pci.h>
#include <linux/platform_device.h> #include <linux/platform_device.h>
...@@ -107,8 +106,7 @@ struct imx6_pcie_drvdata { ...@@ -107,8 +106,7 @@ struct imx6_pcie_drvdata {
struct imx6_pcie { struct imx6_pcie {
struct dw_pcie *pci; struct dw_pcie *pci;
int reset_gpio; struct gpio_desc *reset_gpiod;
bool gpio_active_high;
bool link_is_up; bool link_is_up;
struct clk_bulk_data clks[IMX6_PCIE_MAX_CLKS]; struct clk_bulk_data clks[IMX6_PCIE_MAX_CLKS];
struct regmap *iomuxc_gpr; struct regmap *iomuxc_gpr;
...@@ -721,9 +719,7 @@ static void imx6_pcie_assert_core_reset(struct imx6_pcie *imx6_pcie) ...@@ -721,9 +719,7 @@ static void imx6_pcie_assert_core_reset(struct imx6_pcie *imx6_pcie)
} }
/* Some boards don't have PCIe reset GPIO. */ /* Some boards don't have PCIe reset GPIO. */
if (gpio_is_valid(imx6_pcie->reset_gpio)) gpiod_set_value_cansleep(imx6_pcie->reset_gpiod, 1);
gpio_set_value_cansleep(imx6_pcie->reset_gpio,
imx6_pcie->gpio_active_high);
} }
static int imx6_pcie_deassert_core_reset(struct imx6_pcie *imx6_pcie) 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) ...@@ -771,10 +767,9 @@ static int imx6_pcie_deassert_core_reset(struct imx6_pcie *imx6_pcie)
} }
/* Some boards don't have PCIe reset GPIO. */ /* Some boards don't have PCIe reset GPIO. */
if (gpio_is_valid(imx6_pcie->reset_gpio)) { if (imx6_pcie->reset_gpiod) {
msleep(100); msleep(100);
gpio_set_value_cansleep(imx6_pcie->reset_gpio, gpiod_set_value_cansleep(imx6_pcie->reset_gpiod, 0);
!imx6_pcie->gpio_active_high);
/* Wait for 100ms after PERST# deassertion (PCIe r5.0, 6.6.1) */ /* Wait for 100ms after PERST# deassertion (PCIe r5.0, 6.6.1) */
msleep(100); msleep(100);
} }
...@@ -1285,22 +1280,11 @@ static int imx6_pcie_probe(struct platform_device *pdev) ...@@ -1285,22 +1280,11 @@ static int imx6_pcie_probe(struct platform_device *pdev)
return PTR_ERR(pci->dbi_base); return PTR_ERR(pci->dbi_base);
/* Fetch GPIOs */ /* Fetch GPIOs */
imx6_pcie->reset_gpio = of_get_named_gpio(node, "reset-gpio", 0); imx6_pcie->reset_gpiod = devm_gpiod_get_optional(dev, "reset", GPIOD_OUT_HIGH);
imx6_pcie->gpio_active_high = of_property_read_bool(node, if (IS_ERR(imx6_pcie->reset_gpiod))
"reset-gpio-active-high"); return dev_err_probe(dev, PTR_ERR(imx6_pcie->reset_gpiod),
if (gpio_is_valid(imx6_pcie->reset_gpio)) { "unable to get reset gpio\n");
ret = devm_gpio_request_one(dev, imx6_pcie->reset_gpio, gpiod_set_consumer_name(imx6_pcie->reset_gpiod, "PCIe reset");
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;
}
if (imx6_pcie->drvdata->clks_cnt >= IMX6_PCIE_MAX_CLKS) if (imx6_pcie->drvdata->clks_cnt >= IMX6_PCIE_MAX_CLKS)
return dev_err_probe(dev, -ENOMEM, "clks_cnt is too big\n"); return dev_err_probe(dev, -ENOMEM, "clks_cnt is too big\n");
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment