You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
77 lines
2.3 KiB
Diff
77 lines
2.3 KiB
Diff
4 years ago
|
From 4d6a758f2cd2122a7d895f913854c13da62ba6df Mon Sep 17 00:00:00 2001
|
||
|
From: Sergio Paracuellos <sergio.paracuellos@gmail.com>
|
||
|
Date: Fri, 13 Mar 2020 21:09:12 +0100
|
||
|
Subject: [PATCH] staging: mt7621-pci: release gpios after pci initialization
|
||
|
|
||
|
R3G's LEDs fail to initialize because one of them uses GPIO8
|
||
|
Hence, release the GPIO resources after PCIe initialization
|
||
|
and properly release also in driver error path.
|
||
|
|
||
|
Signed-off-by: Sergio Paracuellos <sergio.paracuellos@gmail.com>
|
||
|
Link: https://lore.kernel.org/r/20200313200913.24321-6-sergio.paracuellos@gmail.com
|
||
|
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||
|
---
|
||
|
drivers/staging/mt7621-pci/pci-mt7621.c | 23 ++++++++++++++++++-----
|
||
|
1 file changed, 18 insertions(+), 5 deletions(-)
|
||
|
|
||
|
--- a/drivers/staging/mt7621-pci/pci-mt7621.c
|
||
|
+++ b/drivers/staging/mt7621-pci/pci-mt7621.c
|
||
|
@@ -484,6 +484,15 @@ static void mt7621_pcie_reset_ep_deasser
|
||
|
mdelay(PERST_DELAY_MS);
|
||
|
}
|
||
|
|
||
|
+static void mt7621_pcie_release_gpios(struct mt7621_pcie *pcie)
|
||
|
+{
|
||
|
+ struct mt7621_pcie_port *port;
|
||
|
+
|
||
|
+ list_for_each_entry(port, &pcie->ports, list)
|
||
|
+ if (port->gpio_rst)
|
||
|
+ gpiod_put(port->gpio_rst);
|
||
|
+}
|
||
|
+
|
||
|
static void mt7621_pcie_init_ports(struct mt7621_pcie *pcie)
|
||
|
{
|
||
|
struct device *dev = pcie->dev;
|
||
|
@@ -683,7 +692,8 @@ static int mt7621_pci_probe(struct platf
|
||
|
err = mt7621_pcie_init_virtual_bridges(pcie);
|
||
|
if (err) {
|
||
|
dev_err(dev, "Nothing is connected in virtual bridges. Exiting...");
|
||
|
- return 0;
|
||
|
+ err = 0;
|
||
|
+ goto out_release_gpios;
|
||
|
}
|
||
|
|
||
|
mt7621_pcie_enable_ports(pcie);
|
||
|
@@ -691,7 +701,7 @@ static int mt7621_pci_probe(struct platf
|
||
|
err = mt7621_pci_parse_request_of_pci_ranges(pcie);
|
||
|
if (err) {
|
||
|
dev_err(dev, "Error requesting pci resources from ranges");
|
||
|
- return err;
|
||
|
+ goto out_release_gpios;
|
||
|
}
|
||
|
|
||
|
setup_cm_memory_region(pcie);
|
||
|
@@ -699,16 +709,19 @@ static int mt7621_pci_probe(struct platf
|
||
|
err = mt7621_pcie_request_resources(pcie, &res);
|
||
|
if (err) {
|
||
|
dev_err(dev, "Error requesting resources\n");
|
||
|
- return err;
|
||
|
+ goto out_release_gpios;
|
||
|
}
|
||
|
|
||
|
err = mt7621_pcie_register_host(bridge, &res);
|
||
|
if (err) {
|
||
|
dev_err(dev, "Error registering host\n");
|
||
|
- return err;
|
||
|
+ goto out_release_gpios;
|
||
|
}
|
||
|
|
||
|
- return 0;
|
||
|
+out_release_gpios:
|
||
|
+ mt7621_pcie_release_gpios(pcie);
|
||
|
+
|
||
|
+ return err;
|
||
|
}
|
||
|
|
||
|
static const struct of_device_id mt7621_pci_ids[] = {
|