aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/pci/controller/pcie-cadence.c
diff options
context:
space:
mode:
authorAlan Douglas <adouglas@cadence.com>2018-09-28 06:51:18 -0400
committerLorenzo Pieralisi <lorenzo.pieralisi@arm.com>2018-09-28 11:08:56 -0400
commitaa77e55d48124d0d78456eabf872fffb5decdbe1 (patch)
tree88a63265c0c233e7318aff387f75a68c389ec733 /drivers/pci/controller/pcie-cadence.c
parent7876320f88802b22d4e2daf7eb027dd14175a0f8 (diff)
PCI: cadence: Correct probe behaviour when failing to get PHY
Test the correct value to see whether the PHY get failed. Use devm_phy_get() instead of devm_phy_optional_get(), since it is only called if phy name is given in devicetree and so should exist. If failure when getting or linking PHY, put any PHYs which were already got and unlink them. Fixes: dfb80534692ddc5b ("PCI: cadence: Add generic PHY support to host and EP drivers") Reported-by: Colin King <colin.king@canonical.com> Signed-off-by: Alan Douglas <adouglas@cadence.com> Signed-off-by: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>
Diffstat (limited to 'drivers/pci/controller/pcie-cadence.c')
-rw-r--r--drivers/pci/controller/pcie-cadence.c20
1 files changed, 12 insertions, 8 deletions
diff --git a/drivers/pci/controller/pcie-cadence.c b/drivers/pci/controller/pcie-cadence.c
index 86f1b002c846..5865512ee61c 100644
--- a/drivers/pci/controller/pcie-cadence.c
+++ b/drivers/pci/controller/pcie-cadence.c
@@ -190,14 +190,16 @@ int cdns_pcie_init_phy(struct device *dev, struct cdns_pcie *pcie)
190 190
191 for (i = 0; i < phy_count; i++) { 191 for (i = 0; i < phy_count; i++) {
192 of_property_read_string_index(np, "phy-names", i, &name); 192 of_property_read_string_index(np, "phy-names", i, &name);
193 phy[i] = devm_phy_optional_get(dev, name); 193 phy[i] = devm_phy_get(dev, name);
194 if (IS_ERR(phy)) 194 if (IS_ERR(phy[i])) {
195 return PTR_ERR(phy); 195 ret = PTR_ERR(phy[i]);
196 196 goto err_phy;
197 }
197 link[i] = device_link_add(dev, &phy[i]->dev, DL_FLAG_STATELESS); 198 link[i] = device_link_add(dev, &phy[i]->dev, DL_FLAG_STATELESS);
198 if (!link[i]) { 199 if (!link[i]) {
200 devm_phy_put(dev, phy[i]);
199 ret = -EINVAL; 201 ret = -EINVAL;
200 goto err_link; 202 goto err_phy;
201 } 203 }
202 } 204 }
203 205
@@ -207,13 +209,15 @@ int cdns_pcie_init_phy(struct device *dev, struct cdns_pcie *pcie)
207 209
208 ret = cdns_pcie_enable_phy(pcie); 210 ret = cdns_pcie_enable_phy(pcie);
209 if (ret) 211 if (ret)
210 goto err_link; 212 goto err_phy;
211 213
212 return 0; 214 return 0;
213 215
214err_link: 216err_phy:
215 while (--i >= 0) 217 while (--i >= 0) {
216 device_link_del(link[i]); 218 device_link_del(link[i]);
219 devm_phy_put(dev, phy[i]);
220 }
217 221
218 return ret; 222 return ret;
219} 223}