Commit b8092861 authored by Sekhar Nori's avatar Sekhar Nori Committed by David S. Miller

net/davinci_emac: use devres APIs

Use devres APIs where possible to simplify error handling
in driver probe.

While at it, also rename the goto targets in error path to
introduce some consistency in how they are named.
Signed-off-by: default avatarSekhar Nori <nsekhar@ti.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent dbbd136c
...@@ -1865,21 +1865,18 @@ static int davinci_emac_probe(struct platform_device *pdev) ...@@ -1865,21 +1865,18 @@ static int davinci_emac_probe(struct platform_device *pdev)
/* obtain emac clock from kernel */ /* obtain emac clock from kernel */
emac_clk = clk_get(&pdev->dev, NULL); emac_clk = devm_clk_get(&pdev->dev, NULL);
if (IS_ERR(emac_clk)) { if (IS_ERR(emac_clk)) {
dev_err(&pdev->dev, "failed to get EMAC clock\n"); dev_err(&pdev->dev, "failed to get EMAC clock\n");
return -EBUSY; return -EBUSY;
} }
emac_bus_frequency = clk_get_rate(emac_clk); emac_bus_frequency = clk_get_rate(emac_clk);
clk_put(emac_clk);
/* TODO: Probe PHY here if possible */ /* TODO: Probe PHY here if possible */
ndev = alloc_etherdev(sizeof(struct emac_priv)); ndev = alloc_etherdev(sizeof(struct emac_priv));
if (!ndev) { if (!ndev)
rc = -ENOMEM; return -ENOMEM;
goto no_ndev;
}
platform_set_drvdata(pdev, ndev); platform_set_drvdata(pdev, ndev);
priv = netdev_priv(ndev); priv = netdev_priv(ndev);
...@@ -1893,7 +1890,7 @@ static int davinci_emac_probe(struct platform_device *pdev) ...@@ -1893,7 +1890,7 @@ static int davinci_emac_probe(struct platform_device *pdev)
if (!pdata) { if (!pdata) {
dev_err(&pdev->dev, "no platform data\n"); dev_err(&pdev->dev, "no platform data\n");
rc = -ENODEV; rc = -ENODEV;
goto probe_quit; goto no_pdata;
} }
/* MAC addr and PHY mask , RMII enable info from platform_data */ /* MAC addr and PHY mask , RMII enable info from platform_data */
...@@ -1913,23 +1910,23 @@ static int davinci_emac_probe(struct platform_device *pdev) ...@@ -1913,23 +1910,23 @@ static int davinci_emac_probe(struct platform_device *pdev)
if (!res) { if (!res) {
dev_err(&pdev->dev,"error getting res\n"); dev_err(&pdev->dev,"error getting res\n");
rc = -ENOENT; rc = -ENOENT;
goto probe_quit; goto no_pdata;
} }
priv->emac_base_phys = res->start + pdata->ctrl_reg_offset; priv->emac_base_phys = res->start + pdata->ctrl_reg_offset;
size = resource_size(res); size = resource_size(res);
if (!request_mem_region(res->start, size, ndev->name)) { if (!devm_request_mem_region(&pdev->dev, res->start,
size, ndev->name)) {
dev_err(&pdev->dev, "failed request_mem_region() for regs\n"); dev_err(&pdev->dev, "failed request_mem_region() for regs\n");
rc = -ENXIO; rc = -ENXIO;
goto probe_quit; goto no_pdata;
} }
priv->remap_addr = ioremap(res->start, size); priv->remap_addr = devm_ioremap(&pdev->dev, res->start, size);
if (!priv->remap_addr) { if (!priv->remap_addr) {
dev_err(&pdev->dev, "unable to map IO\n"); dev_err(&pdev->dev, "unable to map IO\n");
rc = -ENOMEM; rc = -ENOMEM;
release_mem_region(res->start, size); goto no_pdata;
goto probe_quit;
} }
priv->emac_base = priv->remap_addr + pdata->ctrl_reg_offset; priv->emac_base = priv->remap_addr + pdata->ctrl_reg_offset;
ndev->base_addr = (unsigned long)priv->remap_addr; ndev->base_addr = (unsigned long)priv->remap_addr;
...@@ -1962,7 +1959,7 @@ static int davinci_emac_probe(struct platform_device *pdev) ...@@ -1962,7 +1959,7 @@ static int davinci_emac_probe(struct platform_device *pdev)
if (!priv->dma) { if (!priv->dma) {
dev_err(&pdev->dev, "error initializing DMA\n"); dev_err(&pdev->dev, "error initializing DMA\n");
rc = -ENOMEM; rc = -ENOMEM;
goto no_dma; goto no_pdata;
} }
priv->txchan = cpdma_chan_create(priv->dma, tx_chan_num(EMAC_DEF_TX_CH), priv->txchan = cpdma_chan_create(priv->dma, tx_chan_num(EMAC_DEF_TX_CH),
...@@ -1971,14 +1968,14 @@ static int davinci_emac_probe(struct platform_device *pdev) ...@@ -1971,14 +1968,14 @@ static int davinci_emac_probe(struct platform_device *pdev)
emac_rx_handler); emac_rx_handler);
if (WARN_ON(!priv->txchan || !priv->rxchan)) { if (WARN_ON(!priv->txchan || !priv->rxchan)) {
rc = -ENOMEM; rc = -ENOMEM;
goto no_irq_res; goto no_cpdma_chan;
} }
res = platform_get_resource(pdev, IORESOURCE_IRQ, 0); res = platform_get_resource(pdev, IORESOURCE_IRQ, 0);
if (!res) { if (!res) {
dev_err(&pdev->dev, "error getting irq res\n"); dev_err(&pdev->dev, "error getting irq res\n");
rc = -ENOENT; rc = -ENOENT;
goto no_irq_res; goto no_cpdma_chan;
} }
ndev->irq = res->start; ndev->irq = res->start;
...@@ -2000,7 +1997,7 @@ static int davinci_emac_probe(struct platform_device *pdev) ...@@ -2000,7 +1997,7 @@ static int davinci_emac_probe(struct platform_device *pdev)
if (rc) { if (rc) {
dev_err(&pdev->dev, "error in register_netdev\n"); dev_err(&pdev->dev, "error in register_netdev\n");
rc = -ENODEV; rc = -ENODEV;
goto no_irq_res; goto no_cpdma_chan;
} }
...@@ -2015,20 +2012,14 @@ static int davinci_emac_probe(struct platform_device *pdev) ...@@ -2015,20 +2012,14 @@ static int davinci_emac_probe(struct platform_device *pdev)
return 0; return 0;
no_irq_res: no_cpdma_chan:
if (priv->txchan) if (priv->txchan)
cpdma_chan_destroy(priv->txchan); cpdma_chan_destroy(priv->txchan);
if (priv->rxchan) if (priv->rxchan)
cpdma_chan_destroy(priv->rxchan); cpdma_chan_destroy(priv->rxchan);
cpdma_ctlr_destroy(priv->dma); cpdma_ctlr_destroy(priv->dma);
no_dma: no_pdata:
res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
release_mem_region(res->start, resource_size(res));
iounmap(priv->remap_addr);
probe_quit:
free_netdev(ndev); free_netdev(ndev);
no_ndev:
return rc; return rc;
} }
...@@ -2041,14 +2032,12 @@ static int davinci_emac_probe(struct platform_device *pdev) ...@@ -2041,14 +2032,12 @@ static int davinci_emac_probe(struct platform_device *pdev)
*/ */
static int davinci_emac_remove(struct platform_device *pdev) static int davinci_emac_remove(struct platform_device *pdev)
{ {
struct resource *res;
struct net_device *ndev = platform_get_drvdata(pdev); struct net_device *ndev = platform_get_drvdata(pdev);
struct emac_priv *priv = netdev_priv(ndev); struct emac_priv *priv = netdev_priv(ndev);
dev_notice(&ndev->dev, "DaVinci EMAC: davinci_emac_remove()\n"); dev_notice(&ndev->dev, "DaVinci EMAC: davinci_emac_remove()\n");
platform_set_drvdata(pdev, NULL); platform_set_drvdata(pdev, NULL);
res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
if (priv->txchan) if (priv->txchan)
cpdma_chan_destroy(priv->txchan); cpdma_chan_destroy(priv->txchan);
...@@ -2056,10 +2045,7 @@ static int davinci_emac_remove(struct platform_device *pdev) ...@@ -2056,10 +2045,7 @@ static int davinci_emac_remove(struct platform_device *pdev)
cpdma_chan_destroy(priv->rxchan); cpdma_chan_destroy(priv->rxchan);
cpdma_ctlr_destroy(priv->dma); cpdma_ctlr_destroy(priv->dma);
release_mem_region(res->start, resource_size(res));
unregister_netdev(ndev); unregister_netdev(ndev);
iounmap(priv->remap_addr);
free_netdev(ndev); free_netdev(ndev);
return 0; return 0;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment