mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-18 01:34:14 +08:00
net: sun4i-emac: Properly free resources on probe failure and remove
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 <hdegoede@redhat.com> Acked-by: Maxime Ripard <maxime.ripard@free-electrons.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
e754ec69ab
commit
104eb270e6
@ -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(&pdev->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(&pdev->dev, "Error couldn't enable clock (%d)\n", ret);
|
||||
goto out_iounmap;
|
||||
}
|
||||
|
||||
ret = sunxi_sram_claim(&pdev->dev);
|
||||
if (ret) {
|
||||
dev_err(&pdev->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(&pdev->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(&pdev->dev);
|
||||
clk_disable_unprepare(db->clk);
|
||||
iounmap(db->membase);
|
||||
free_netdev(ndev);
|
||||
|
||||
dev_dbg(&pdev->dev, "released and freed device\n");
|
||||
|
Loading…
Reference in New Issue
Block a user