]> Pileus Git - ~andy/linux/blobdiff - drivers/net/ethernet/ti/davinci_emac.c
net: davinci: emac: Convert to devm_* api
[~andy/linux] / drivers / net / ethernet / ti / davinci_emac.c
index 72300bc9e3783842ef3608be24f0f33d2ed0f69b..7a66f9c331597e81719742bea4c414079b346c08 100644 (file)
@@ -1037,7 +1037,7 @@ static void emac_rx_handler(void *token, int len, int status)
 
 recycle:
        ret = cpdma_chan_submit(priv->rxchan, skb, skb->data,
-                       skb_tailroom(skb), 0, GFP_KERNEL);
+                       skb_tailroom(skb), 0);
 
        WARN_ON(ret == -ENOMEM);
        if (unlikely(ret < 0))
@@ -1092,7 +1092,7 @@ static int emac_dev_xmit(struct sk_buff *skb, struct net_device *ndev)
        skb_tx_timestamp(skb);
 
        ret_code = cpdma_chan_submit(priv->txchan, skb, skb->data, skb->len,
-                                    0, GFP_KERNEL);
+                                    0);
        if (unlikely(ret_code != 0)) {
                if (netif_msg_tx_err(priv) && net_ratelimit())
                        dev_err(emac_dev, "DaVinci EMAC: desc submit failed");
@@ -1438,7 +1438,7 @@ static int emac_poll(struct napi_struct *napi, int budget)
  * Polled functionality used by netconsole and others in non interrupt mode
  *
  */
-void emac_poll_controller(struct net_device *ndev)
+static void emac_poll_controller(struct net_device *ndev)
 {
        struct emac_priv *priv = netdev_priv(ndev);
 
@@ -1532,7 +1532,7 @@ static int emac_dev_open(struct net_device *ndev)
        struct device *emac_dev = &ndev->dev;
        u32 cnt;
        struct resource *res;
-       int q, m, ret;
+       int ret;
        int i = 0;
        int k = 0;
        struct emac_priv *priv = netdev_priv(ndev);
@@ -1558,7 +1558,7 @@ static int emac_dev_open(struct net_device *ndev)
                        break;
 
                ret = cpdma_chan_submit(priv->rxchan, skb, skb->data,
-                                       skb_tailroom(skb), 0, GFP_KERNEL);
+                                       skb_tailroom(skb), 0);
                if (WARN_ON(ret < 0))
                        break;
        }
@@ -1567,8 +1567,9 @@ static int emac_dev_open(struct net_device *ndev)
 
        while ((res = platform_get_resource(priv->pdev, IORESOURCE_IRQ, k))) {
                for (i = res->start; i <= res->end; i++) {
-                       if (request_irq(i, emac_irq, IRQF_DISABLED,
-                                       ndev->name, ndev))
+                       if (devm_request_irq(&priv->pdev->dev, i, emac_irq,
+                                            IRQF_DISABLED,
+                                            ndev->name, ndev))
                                goto rollback;
                }
                k++;
@@ -1641,15 +1642,7 @@ static int emac_dev_open(struct net_device *ndev)
 
 rollback:
 
-       dev_err(emac_dev, "DaVinci EMAC: request_irq() failed");
-
-       for (q = k; k >= 0; k--) {
-               for (m = i; m >= res->start; m--)
-                       free_irq(m, ndev);
-               res = platform_get_resource(priv->pdev, IORESOURCE_IRQ, k-1);
-               m = res->end;
-       }
-
+       dev_err(emac_dev, "DaVinci EMAC: devm_request_irq() failed");
        ret = -EBUSY;
 err:
        pm_runtime_put(&priv->pdev->dev);
@@ -1667,9 +1660,6 @@ err:
  */
 static int emac_dev_stop(struct net_device *ndev)
 {
-       struct resource *res;
-       int i = 0;
-       int irq_num;
        struct emac_priv *priv = netdev_priv(ndev);
        struct device *emac_dev = &ndev->dev;
 
@@ -1685,13 +1675,6 @@ static int emac_dev_stop(struct net_device *ndev)
        if (priv->phydev)
                phy_disconnect(priv->phydev);
 
-       /* Free IRQ */
-       while ((res = platform_get_resource(priv->pdev, IORESOURCE_IRQ, i))) {
-               for (irq_num = res->start; irq_num <= res->end; irq_num++)
-                       free_irq(irq_num, priv->ndev);
-               i++;
-       }
-
        if (netif_msg_drv(priv))
                dev_notice(emac_dev, "DaVinci EMAC: %s stopped\n", ndev->name);
 
@@ -1856,7 +1839,7 @@ static int davinci_emac_probe(struct platform_device *pdev)
        struct resource *res;
        struct net_device *ndev;
        struct emac_priv *priv;
-       unsigned long size, hw_ram_addr;
+       unsigned long hw_ram_addr;
        struct emac_platform_data *pdata;
        struct device *emac_dev;
        struct cpdma_params dma_params;
@@ -1865,21 +1848,18 @@ static int davinci_emac_probe(struct platform_device *pdev)
 
 
        /* 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)) {
                dev_err(&pdev->dev, "failed to get EMAC clock\n");
                return -EBUSY;
        }
        emac_bus_frequency = clk_get_rate(emac_clk);
-       clk_put(emac_clk);
 
        /* TODO: Probe PHY here if possible */
 
        ndev = alloc_etherdev(sizeof(struct emac_priv));
-       if (!ndev) {
-               rc = -ENOMEM;
-               goto no_ndev;
-       }
+       if (!ndev)
+               return -ENOMEM;
 
        platform_set_drvdata(pdev, ndev);
        priv = netdev_priv(ndev);
@@ -1893,7 +1873,7 @@ static int davinci_emac_probe(struct platform_device *pdev)
        if (!pdata) {
                dev_err(&pdev->dev, "no platform data\n");
                rc = -ENODEV;
-               goto probe_quit;
+               goto no_pdata;
        }
 
        /* MAC addr and PHY mask , RMII enable info from platform_data */
@@ -1910,26 +1890,12 @@ static int davinci_emac_probe(struct platform_device *pdev)
        emac_dev = &ndev->dev;
        /* Get EMAC platform data */
        res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
-       if (!res) {
-               dev_err(&pdev->dev,"error getting res\n");
-               rc = -ENOENT;
-               goto probe_quit;
-       }
-
        priv->emac_base_phys = res->start + pdata->ctrl_reg_offset;
-       size = resource_size(res);
-       if (!request_mem_region(res->start, size, ndev->name)) {
-               dev_err(&pdev->dev, "failed request_mem_region() for regs\n");
-               rc = -ENXIO;
-               goto probe_quit;
-       }
-
-       priv->remap_addr = ioremap(res->start, size);
-       if (!priv->remap_addr) {
+       priv->remap_addr = devm_ioremap_resource(&pdev->dev, res);
+       if (IS_ERR(priv->remap_addr)) {
                dev_err(&pdev->dev, "unable to map IO\n");
-               rc = -ENOMEM;
-               release_mem_region(res->start, size);
-               goto probe_quit;
+               rc = PTR_ERR(priv->remap_addr);
+               goto no_pdata;
        }
        priv->emac_base = priv->remap_addr + pdata->ctrl_reg_offset;
        ndev->base_addr = (unsigned long)priv->remap_addr;
@@ -1962,7 +1928,7 @@ static int davinci_emac_probe(struct platform_device *pdev)
        if (!priv->dma) {
                dev_err(&pdev->dev, "error initializing DMA\n");
                rc = -ENOMEM;
-               goto no_dma;
+               goto no_pdata;
        }
 
        priv->txchan = cpdma_chan_create(priv->dma, tx_chan_num(EMAC_DEF_TX_CH),
@@ -1971,14 +1937,14 @@ static int davinci_emac_probe(struct platform_device *pdev)
                                       emac_rx_handler);
        if (WARN_ON(!priv->txchan || !priv->rxchan)) {
                rc = -ENOMEM;
-               goto no_irq_res;
+               goto no_cpdma_chan;
        }
 
        res = platform_get_resource(pdev, IORESOURCE_IRQ, 0);
        if (!res) {
                dev_err(&pdev->dev, "error getting irq res\n");
                rc = -ENOENT;
-               goto no_irq_res;
+               goto no_cpdma_chan;
        }
        ndev->irq = res->start;
 
@@ -2000,7 +1966,7 @@ static int davinci_emac_probe(struct platform_device *pdev)
        if (rc) {
                dev_err(&pdev->dev, "error in register_netdev\n");
                rc = -ENODEV;
-               goto no_irq_res;
+               goto no_cpdma_chan;
        }
 
 
@@ -2015,20 +1981,14 @@ static int davinci_emac_probe(struct platform_device *pdev)
 
        return 0;
 
-no_irq_res:
+no_cpdma_chan:
        if (priv->txchan)
                cpdma_chan_destroy(priv->txchan);
        if (priv->rxchan)
                cpdma_chan_destroy(priv->rxchan);
        cpdma_ctlr_destroy(priv->dma);
-no_dma:
-       res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
-       release_mem_region(res->start, resource_size(res));
-       iounmap(priv->remap_addr);
-
-probe_quit:
+no_pdata:
        free_netdev(ndev);
-no_ndev:
        return rc;
 }
 
@@ -2041,25 +2001,18 @@ no_ndev:
  */
 static int davinci_emac_remove(struct platform_device *pdev)
 {
-       struct resource *res;
        struct net_device *ndev = platform_get_drvdata(pdev);
        struct emac_priv *priv = netdev_priv(ndev);
 
        dev_notice(&ndev->dev, "DaVinci EMAC: davinci_emac_remove()\n");
 
-       platform_set_drvdata(pdev, NULL);
-       res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
-
        if (priv->txchan)
                cpdma_chan_destroy(priv->txchan);
        if (priv->rxchan)
                cpdma_chan_destroy(priv->rxchan);
        cpdma_ctlr_destroy(priv->dma);
 
-       release_mem_region(res->start, resource_size(res));
-
        unregister_netdev(ndev);
-       iounmap(priv->remap_addr);
        free_netdev(ndev);
 
        return 0;