diff options
author | Alexey Khoroshilov <khoroshilov@ispras.ru> | 2017-12-15 16:52:39 -0500 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2017-12-18 15:09:42 -0500 |
commit | ab14436065c8066c265540312742390d6d07ddd2 (patch) | |
tree | 8c4804240dd25a9bcd3e809af7094dfdbeb28f59 | |
parent | 6623c0fba10ef45b64ca213ad5dec926f37fa9a0 (diff) |
net: phy: xgene: disable clk on error paths
There are several error paths in xgene_mdio_probe(),
where clk is left undisabled. The patch fixes them.
Found by Linux Driver Verification project (linuxtesting.org).
Signed-off-by: Alexey Khoroshilov <khoroshilov@ispras.ru>
Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r-- | drivers/net/phy/mdio-xgene.c | 21 |
1 files changed, 15 insertions, 6 deletions
diff --git a/drivers/net/phy/mdio-xgene.c b/drivers/net/phy/mdio-xgene.c index bfd3090fb055..07c6048200c6 100644 --- a/drivers/net/phy/mdio-xgene.c +++ b/drivers/net/phy/mdio-xgene.c | |||
@@ -194,8 +194,11 @@ static int xgene_mdio_reset(struct xgene_mdio_pdata *pdata) | |||
194 | } | 194 | } |
195 | 195 | ||
196 | ret = xgene_enet_ecc_init(pdata); | 196 | ret = xgene_enet_ecc_init(pdata); |
197 | if (ret) | 197 | if (ret) { |
198 | if (pdata->dev->of_node) | ||
199 | clk_disable_unprepare(pdata->clk); | ||
198 | return ret; | 200 | return ret; |
201 | } | ||
199 | xgene_gmac_reset(pdata); | 202 | xgene_gmac_reset(pdata); |
200 | 203 | ||
201 | return 0; | 204 | return 0; |
@@ -388,8 +391,10 @@ static int xgene_mdio_probe(struct platform_device *pdev) | |||
388 | return ret; | 391 | return ret; |
389 | 392 | ||
390 | mdio_bus = mdiobus_alloc(); | 393 | mdio_bus = mdiobus_alloc(); |
391 | if (!mdio_bus) | 394 | if (!mdio_bus) { |
392 | return -ENOMEM; | 395 | ret = -ENOMEM; |
396 | goto out_clk; | ||
397 | } | ||
393 | 398 | ||
394 | mdio_bus->name = "APM X-Gene MDIO bus"; | 399 | mdio_bus->name = "APM X-Gene MDIO bus"; |
395 | 400 | ||
@@ -418,7 +423,7 @@ static int xgene_mdio_probe(struct platform_device *pdev) | |||
418 | mdio_bus->phy_mask = ~0; | 423 | mdio_bus->phy_mask = ~0; |
419 | ret = mdiobus_register(mdio_bus); | 424 | ret = mdiobus_register(mdio_bus); |
420 | if (ret) | 425 | if (ret) |
421 | goto out; | 426 | goto out_mdiobus; |
422 | 427 | ||
423 | acpi_walk_namespace(ACPI_TYPE_DEVICE, ACPI_HANDLE(dev), 1, | 428 | acpi_walk_namespace(ACPI_TYPE_DEVICE, ACPI_HANDLE(dev), 1, |
424 | acpi_register_phy, NULL, mdio_bus, NULL); | 429 | acpi_register_phy, NULL, mdio_bus, NULL); |
@@ -426,16 +431,20 @@ static int xgene_mdio_probe(struct platform_device *pdev) | |||
426 | } | 431 | } |
427 | 432 | ||
428 | if (ret) | 433 | if (ret) |
429 | goto out; | 434 | goto out_mdiobus; |
430 | 435 | ||
431 | pdata->mdio_bus = mdio_bus; | 436 | pdata->mdio_bus = mdio_bus; |
432 | xgene_mdio_status = true; | 437 | xgene_mdio_status = true; |
433 | 438 | ||
434 | return 0; | 439 | return 0; |
435 | 440 | ||
436 | out: | 441 | out_mdiobus: |
437 | mdiobus_free(mdio_bus); | 442 | mdiobus_free(mdio_bus); |
438 | 443 | ||
444 | out_clk: | ||
445 | if (dev->of_node) | ||
446 | clk_disable_unprepare(pdata->clk); | ||
447 | |||
439 | return ret; | 448 | return ret; |
440 | } | 449 | } |
441 | 450 | ||