staging: mt7621-pci: release gpios after pci initialization
authorSergio Paracuellos <sergio.paracuellos@gmail.com>
Fri, 13 Mar 2020 20:09:12 +0000 (21:09 +0100)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Tue, 17 Mar 2020 11:53:07 +0000 (12:53 +0100)
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

index 3d85ce788f9f9a9596cfa118bcf1d55e4dba0e20..0d9dd14f6becb130cd7ffee331aa54698bd432e8 100644 (file)
@@ -484,6 +484,15 @@ static void mt7621_pcie_reset_ep_deassert(struct mt7621_pcie *pcie)
        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 platform_device *pdev)
        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 platform_device *pdev)
        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 platform_device *pdev)
        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[] = {