|
@@ -0,0 +1,62 @@
|
|
|
+From f038380835033e376d89c72516f087254792bbad Mon Sep 17 00:00:00 2001
|
|
|
+From: Martin Schiller <[email protected]>
|
|
|
+Date: Mon, 6 May 2024 09:41:42 +0200
|
|
|
+Subject: [PATCH] MIPS: pci: lantiq: restore reset gpio polarity
|
|
|
+
|
|
|
+Commit 90c2d2eb7ab5 ("MIPS: pci: lantiq: switch to using gpiod API") not
|
|
|
+only switched to the gpiod API, but also inverted / changed the polarity
|
|
|
+of the GPIO.
|
|
|
+
|
|
|
+According to the PCI specification, the RST# pin is an active-low
|
|
|
+signal. However, most of the device trees that have been widely used for
|
|
|
+a long time (mainly in the openWrt project) define this GPIO as
|
|
|
+active-high and the old driver code inverted the signal internally.
|
|
|
+
|
|
|
+Apparently there are actually boards where the reset gpio must be
|
|
|
+operated inverted. For this reason, we cannot use the GPIOD_OUT_LOW/HIGH
|
|
|
+flag for initialization. Instead, we must explicitly set the gpio to
|
|
|
+value 1 in order to take into account any "GPIO_ACTIVE_LOW" flag that
|
|
|
+may have been set.
|
|
|
+
|
|
|
+In order to remain compatible with all these existing device trees, we
|
|
|
+should therefore keep the logic as it was before the commit.
|
|
|
+
|
|
|
+Fixes: 90c2d2eb7ab5 ("MIPS: pci: lantiq: switch to using gpiod API")
|
|
|
+Cc: [email protected]
|
|
|
+Signed-off-by: Martin Schiller <[email protected]>
|
|
|
+---
|
|
|
+ arch/mips/pci/pci-lantiq.c | 8 ++++----
|
|
|
+ 1 file changed, 4 insertions(+), 4 deletions(-)
|
|
|
+
|
|
|
+--- a/arch/mips/pci/pci-lantiq.c
|
|
|
++++ b/arch/mips/pci/pci-lantiq.c
|
|
|
+@@ -124,14 +124,14 @@ static int ltq_pci_startup(struct platfo
|
|
|
+ clk_disable(clk_external);
|
|
|
+
|
|
|
+ /* setup reset gpio used by pci */
|
|
|
+- reset_gpio = devm_gpiod_get_optional(&pdev->dev, "reset",
|
|
|
+- GPIOD_OUT_LOW);
|
|
|
++ reset_gpio = devm_gpiod_get_optional(&pdev->dev, "reset", GPIOD_ASIS);
|
|
|
+ error = PTR_ERR_OR_ZERO(reset_gpio);
|
|
|
+ if (error) {
|
|
|
+ dev_err(&pdev->dev, "failed to request gpio: %d\n", error);
|
|
|
+ return error;
|
|
|
+ }
|
|
|
+ gpiod_set_consumer_name(reset_gpio, "pci_reset");
|
|
|
++ gpiod_direction_output(reset_gpio, 1);
|
|
|
+
|
|
|
+ /* enable auto-switching between PCI and EBU */
|
|
|
+ ltq_pci_w32(0xa, PCI_CR_CLK_CTRL);
|
|
|
+@@ -194,10 +194,10 @@ static int ltq_pci_startup(struct platfo
|
|
|
+
|
|
|
+ /* toggle reset pin */
|
|
|
+ if (reset_gpio) {
|
|
|
+- gpiod_set_value_cansleep(reset_gpio, 1);
|
|
|
++ gpiod_set_value_cansleep(reset_gpio, 0);
|
|
|
+ wmb();
|
|
|
+ mdelay(1);
|
|
|
+- gpiod_set_value_cansleep(reset_gpio, 0);
|
|
|
++ gpiod_set_value_cansleep(reset_gpio, 1);
|
|
|
+ }
|
|
|
+ return 0;
|
|
|
+ }
|