118-net-macb-unprepare-clocks-in-case-of-failure.patch 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. From 9692c07ee8bf8f68b74d553d861d092e33264781 Mon Sep 17 00:00:00 2001
  2. From: Claudiu Beznea <[email protected]>
  3. Date: Wed, 9 Dec 2020 15:03:35 +0200
  4. Subject: [PATCH 118/247] net: macb: unprepare clocks in case of failure
  5. Unprepare clocks in case of any failure in fu540_c000_clk_init().
  6. Fixes: c218ad559020 ("macb: Add support for SiFive FU540-C000")
  7. Signed-off-by: Claudiu Beznea <[email protected]>
  8. Signed-off-by: David S. Miller <[email protected]>
  9. ---
  10. drivers/net/ethernet/cadence/macb_main.c | 24 ++++++++++++++++++------
  11. 1 file changed, 18 insertions(+), 6 deletions(-)
  12. --- a/drivers/net/ethernet/cadence/macb_main.c
  13. +++ b/drivers/net/ethernet/cadence/macb_main.c
  14. @@ -4335,8 +4335,10 @@ static int fu540_c000_clk_init(struct pl
  15. return err;
  16. mgmt = devm_kzalloc(&pdev->dev, sizeof(*mgmt), GFP_KERNEL);
  17. - if (!mgmt)
  18. - return -ENOMEM;
  19. + if (!mgmt) {
  20. + err = -ENOMEM;
  21. + goto err_disable_clks;
  22. + }
  23. init.name = "sifive-gemgxl-mgmt";
  24. init.ops = &fu540_c000_ops;
  25. @@ -4347,16 +4349,26 @@ static int fu540_c000_clk_init(struct pl
  26. mgmt->hw.init = &init;
  27. *tx_clk = devm_clk_register(&pdev->dev, &mgmt->hw);
  28. - if (IS_ERR(*tx_clk))
  29. - return PTR_ERR(*tx_clk);
  30. + if (IS_ERR(*tx_clk)) {
  31. + err = PTR_ERR(*tx_clk);
  32. + goto err_disable_clks;
  33. + }
  34. err = clk_prepare_enable(*tx_clk);
  35. - if (err)
  36. + if (err) {
  37. dev_err(&pdev->dev, "failed to enable tx_clk (%u)\n", err);
  38. - else
  39. + *tx_clk = NULL;
  40. + goto err_disable_clks;
  41. + } else {
  42. dev_info(&pdev->dev, "Registered clk switch '%s'\n", init.name);
  43. + }
  44. return 0;
  45. +
  46. +err_disable_clks:
  47. + macb_clks_disable(*pclk, *hclk, *tx_clk, *rx_clk, *tsu_clk);
  48. +
  49. + return err;
  50. }
  51. static int fu540_c000_init(struct platform_device *pdev)