ath79: do not build TP-Link tiny images by default
[oweals/openwrt.git] / target / linux / ramips / patches-5.4 / 0104-staging-mt7621-pci-release-gpios-after-pci-initializ.patch
1 From 4d6a758f2cd2122a7d895f913854c13da62ba6df Mon Sep 17 00:00:00 2001
2 From: Sergio Paracuellos <sergio.paracuellos@gmail.com>
3 Date: Fri, 13 Mar 2020 21:09:12 +0100
4 Subject: [PATCH] staging: mt7621-pci: release gpios after pci initialization
5
6 R3G's LEDs fail to initialize because one of them uses GPIO8
7 Hence, release the GPIO resources after PCIe initialization
8 and properly release also in driver error path.
9
10 Signed-off-by: Sergio Paracuellos <sergio.paracuellos@gmail.com>
11 Link: https://lore.kernel.org/r/20200313200913.24321-6-sergio.paracuellos@gmail.com
12 Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
13 ---
14  drivers/staging/mt7621-pci/pci-mt7621.c | 23 ++++++++++++++++++-----
15  1 file changed, 18 insertions(+), 5 deletions(-)
16
17 --- a/drivers/staging/mt7621-pci/pci-mt7621.c
18 +++ b/drivers/staging/mt7621-pci/pci-mt7621.c
19 @@ -484,6 +484,15 @@ static void mt7621_pcie_reset_ep_deasser
20         mdelay(PERST_DELAY_MS);
21  }
22  
23 +static void mt7621_pcie_release_gpios(struct mt7621_pcie *pcie)
24 +{
25 +       struct mt7621_pcie_port *port;
26 +
27 +       list_for_each_entry(port, &pcie->ports, list)
28 +               if (port->gpio_rst)
29 +                       gpiod_put(port->gpio_rst);
30 +}
31 +
32  static void mt7621_pcie_init_ports(struct mt7621_pcie *pcie)
33  {
34         struct device *dev = pcie->dev;
35 @@ -683,7 +692,8 @@ static int mt7621_pci_probe(struct platf
36         err = mt7621_pcie_init_virtual_bridges(pcie);
37         if (err) {
38                 dev_err(dev, "Nothing is connected in virtual bridges. Exiting...");
39 -               return 0;
40 +               err = 0;
41 +               goto out_release_gpios;
42         }
43  
44         mt7621_pcie_enable_ports(pcie);
45 @@ -691,7 +701,7 @@ static int mt7621_pci_probe(struct platf
46         err = mt7621_pci_parse_request_of_pci_ranges(pcie);
47         if (err) {
48                 dev_err(dev, "Error requesting pci resources from ranges");
49 -               return err;
50 +               goto out_release_gpios;
51         }
52  
53         setup_cm_memory_region(pcie);
54 @@ -699,16 +709,19 @@ static int mt7621_pci_probe(struct platf
55         err = mt7621_pcie_request_resources(pcie, &res);
56         if (err) {
57                 dev_err(dev, "Error requesting resources\n");
58 -               return err;
59 +               goto out_release_gpios;
60         }
61  
62         err = mt7621_pcie_register_host(bridge, &res);
63         if (err) {
64                 dev_err(dev, "Error registering host\n");
65 -               return err;
66 +               goto out_release_gpios;
67         }
68  
69 -       return 0;
70 +out_release_gpios:
71 +       mt7621_pcie_release_gpios(pcie);
72 +
73 +       return err;
74  }
75  
76  static const struct of_device_id mt7621_pci_ids[] = {