|
@@ -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");
|