Re: [PATCH] net: sun4i-emac: Properly free resources on probe failure and remove

2015-09-24 Thread Maxime Ripard
On Wed, Sep 23, 2015 at 11:39:16AM +0200, Hans de Goede wrote:
> Fix sun4i-emac not releasing the following resources:
> -iomapped memory not released on probe-failure nor on remove
> -clock not getting disabled on probe-failure nor on remove
> -sram not being released on remove
> 
> And while at it also add error checking to the clk_prepare_enable call
> done on probe.
> 
> Signed-off-by: Hans de Goede 

Acked-by: Maxime Ripard 

Thanks!
Maxime

-- 
Maxime Ripard, Free Electrons
Embedded Linux, Kernel and Android engineering
http://free-electrons.com


signature.asc
Description: Digital signature


[PATCH] net: sun4i-emac: Properly free resources on probe failure and remove

2015-09-23 Thread Hans de Goede
Fix sun4i-emac not releasing the following resources:
-iomapped memory not released on probe-failure nor on remove
-clock not getting disabled on probe-failure nor on remove
-sram not being released on remove

And while at it also add error checking to the clk_prepare_enable call
done on probe.

Signed-off-by: Hans de Goede 
---
 drivers/net/ethernet/allwinner/sun4i-emac.c | 20 
 1 file changed, 16 insertions(+), 4 deletions(-)

diff --git a/drivers/net/ethernet/allwinner/sun4i-emac.c 
b/drivers/net/ethernet/allwinner/sun4i-emac.c
index 48ce83e..8d50314 100644
--- a/drivers/net/ethernet/allwinner/sun4i-emac.c
+++ b/drivers/net/ethernet/allwinner/sun4i-emac.c
@@ -847,21 +847,25 @@ static int emac_probe(struct platform_device *pdev)
if (ndev->irq == -ENXIO) {
netdev_err(ndev, "No irq resource\n");
ret = ndev->irq;
-   goto out;
+   goto out_iounmap;
}
 
db->clk = devm_clk_get(>dev, NULL);
if (IS_ERR(db->clk)) {
ret = PTR_ERR(db->clk);
-   goto out;
+   goto out_iounmap;
}
 
-   clk_prepare_enable(db->clk);
+   ret = clk_prepare_enable(db->clk);
+   if (ret) {
+   dev_err(>dev, "Error couldn't enable clock (%d)\n", ret);
+   goto out_iounmap;
+   }
 
ret = sunxi_sram_claim(>dev);
if (ret) {
dev_err(>dev, "Error couldn't map SRAM to device\n");
-   goto out;
+   goto out_clk_disable_unprepare;
}
 
db->phy_node = of_parse_phandle(np, "phy", 0);
@@ -910,6 +914,10 @@ static int emac_probe(struct platform_device *pdev)
 
 out_release_sram:
sunxi_sram_release(>dev);
+out_clk_disable_unprepare:
+   clk_disable_unprepare(db->clk);
+out_iounmap:
+   iounmap(db->membase);
 out:
dev_err(db->dev, "not found (%d).\n", ret);
 
@@ -921,8 +929,12 @@ out:
 static int emac_remove(struct platform_device *pdev)
 {
struct net_device *ndev = platform_get_drvdata(pdev);
+   struct emac_board_info *db = netdev_priv(ndev);
 
unregister_netdev(ndev);
+   sunxi_sram_release(>dev);
+   clk_disable_unprepare(db->clk);
+   iounmap(db->membase);
free_netdev(ndev);
 
dev_dbg(>dev, "released and freed device\n");
-- 
2.5.0

--
To unsubscribe from this list: send the line "unsubscribe netdev" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html