| From foo@baz Sun Jun 17 12:07:33 CEST 2018 |
| From: Maxime Chevallier <maxime.chevallier@bootlin.com> |
| Date: Wed, 25 Apr 2018 20:21:16 +0200 |
| Subject: net: mvpp2: Fix clk error path in mvpp2_probe |
| |
| From: Maxime Chevallier <maxime.chevallier@bootlin.com> |
| |
| [ Upstream commit 45f972adb7f4db2d7f02af728ccd104113336074 ] |
| |
| When clk_prepare_enable fails for the axi_clk, the mg_clk isn't properly |
| cleaned up. Add another jump label to handle that case, and make sure we |
| jump to it in the later error cases. |
| |
| Fixes: 4792ea04bcd0 ("net: mvpp2: Fix clock resource by adding an optional bus clock") |
| Signed-off-by: Maxime Chevallier <maxime.chevallier@bootlin.com> |
| Acked-by: Gregory CLEMENT <gregory.clement@bootlin.com> |
| Signed-off-by: David S. Miller <davem@davemloft.net> |
| Signed-off-by: Sasha Levin <alexander.levin@microsoft.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| --- |
| drivers/net/ethernet/marvell/mvpp2.c | 15 ++++++++------- |
| 1 file changed, 8 insertions(+), 7 deletions(-) |
| |
| --- a/drivers/net/ethernet/marvell/mvpp2.c |
| +++ b/drivers/net/ethernet/marvell/mvpp2.c |
| @@ -8332,12 +8332,12 @@ static int mvpp2_probe(struct platform_d |
| if (IS_ERR(priv->axi_clk)) { |
| err = PTR_ERR(priv->axi_clk); |
| if (err == -EPROBE_DEFER) |
| - goto err_gop_clk; |
| + goto err_mg_clk; |
| priv->axi_clk = NULL; |
| } else { |
| err = clk_prepare_enable(priv->axi_clk); |
| if (err < 0) |
| - goto err_gop_clk; |
| + goto err_mg_clk; |
| } |
| |
| /* Get system's tclk rate */ |
| @@ -8351,7 +8351,7 @@ static int mvpp2_probe(struct platform_d |
| if (priv->hw_version == MVPP22) { |
| err = dma_set_mask(&pdev->dev, MVPP2_DESC_DMA_MASK); |
| if (err) |
| - goto err_mg_clk; |
| + goto err_axi_clk; |
| /* Sadly, the BM pools all share the same register to |
| * store the high 32 bits of their address. So they |
| * must all have the same high 32 bits, which forces |
| @@ -8359,14 +8359,14 @@ static int mvpp2_probe(struct platform_d |
| */ |
| err = dma_set_coherent_mask(&pdev->dev, DMA_BIT_MASK(32)); |
| if (err) |
| - goto err_mg_clk; |
| + goto err_axi_clk; |
| } |
| |
| /* Initialize network controller */ |
| err = mvpp2_init(pdev, priv); |
| if (err < 0) { |
| dev_err(&pdev->dev, "failed to initialize controller\n"); |
| - goto err_mg_clk; |
| + goto err_axi_clk; |
| } |
| |
| /* Initialize ports */ |
| @@ -8379,7 +8379,7 @@ static int mvpp2_probe(struct platform_d |
| if (priv->port_count == 0) { |
| dev_err(&pdev->dev, "no ports enabled\n"); |
| err = -ENODEV; |
| - goto err_mg_clk; |
| + goto err_axi_clk; |
| } |
| |
| /* Statistics must be gathered regularly because some of them (like |
| @@ -8407,8 +8407,9 @@ err_port_probe: |
| mvpp2_port_remove(priv->port_list[i]); |
| i++; |
| } |
| -err_mg_clk: |
| +err_axi_clk: |
| clk_disable_unprepare(priv->axi_clk); |
| +err_mg_clk: |
| if (priv->hw_version == MVPP22) |
| clk_disable_unprepare(priv->mg_clk); |
| err_gop_clk: |