提交 7a3e2585 编写于 作者: M Michal Simek 提交者: David S. Miller

net: emaclite: Use platform resource table

Read data directly from platform recource table
and do not use of_irq_to_resource().
Also use devm_request_and_ioremap() for probe
functions simplification.
Signed-off-by: NMichal Simek <michal.simek@xilinx.com>
Acked-by: NArnd Bergmann <arnd@arndb.de>
Signed-off-by: NDavid S. Miller <davem@davemloft.net>
上级 15dd16c2
...@@ -1074,13 +1074,14 @@ static int xemaclite_send(struct sk_buff *orig_skb, struct net_device *dev) ...@@ -1074,13 +1074,14 @@ static int xemaclite_send(struct sk_buff *orig_skb, struct net_device *dev)
* This function un maps the IO region of the Emaclite device and frees the net * This function un maps the IO region of the Emaclite device and frees the net
* device. * device.
*/ */
static void xemaclite_remove_ndev(struct net_device *ndev) static void xemaclite_remove_ndev(struct net_device *ndev,
struct platform_device *pdev)
{ {
if (ndev) { if (ndev) {
struct net_local *lp = netdev_priv(ndev); struct net_local *lp = netdev_priv(ndev);
if (lp->base_addr) if (lp->base_addr)
iounmap((void __iomem __force *) (lp->base_addr)); devm_iounmap(&pdev->dev, lp->base_addr);
free_netdev(ndev); free_netdev(ndev);
} }
} }
...@@ -1126,8 +1127,7 @@ static struct net_device_ops xemaclite_netdev_ops; ...@@ -1126,8 +1127,7 @@ static struct net_device_ops xemaclite_netdev_ops;
*/ */
static int xemaclite_of_probe(struct platform_device *ofdev) static int xemaclite_of_probe(struct platform_device *ofdev)
{ {
struct resource r_irq; /* Interrupt resources */ struct resource *res;
struct resource r_mem; /* IO mem resources */
struct net_device *ndev = NULL; struct net_device *ndev = NULL;
struct net_local *lp = NULL; struct net_local *lp = NULL;
struct device *dev = &ofdev->dev; struct device *dev = &ofdev->dev;
...@@ -1137,20 +1137,6 @@ static int xemaclite_of_probe(struct platform_device *ofdev) ...@@ -1137,20 +1137,6 @@ static int xemaclite_of_probe(struct platform_device *ofdev)
dev_info(dev, "Device Tree Probing\n"); dev_info(dev, "Device Tree Probing\n");
/* Get iospace for the device */
rc = of_address_to_resource(ofdev->dev.of_node, 0, &r_mem);
if (rc) {
dev_err(dev, "invalid address\n");
return rc;
}
/* Get IRQ for the device */
rc = of_irq_to_resource(ofdev->dev.of_node, 0, &r_irq);
if (!rc) {
dev_err(dev, "no IRQ found\n");
return rc;
}
/* Create an ethernet device instance */ /* Create an ethernet device instance */
ndev = alloc_etherdev(sizeof(struct net_local)); ndev = alloc_etherdev(sizeof(struct net_local));
if (!ndev) if (!ndev)
...@@ -1159,29 +1145,25 @@ static int xemaclite_of_probe(struct platform_device *ofdev) ...@@ -1159,29 +1145,25 @@ static int xemaclite_of_probe(struct platform_device *ofdev)
dev_set_drvdata(dev, ndev); dev_set_drvdata(dev, ndev);
SET_NETDEV_DEV(ndev, &ofdev->dev); SET_NETDEV_DEV(ndev, &ofdev->dev);
ndev->irq = r_irq.start;
ndev->mem_start = r_mem.start;
ndev->mem_end = r_mem.end;
lp = netdev_priv(ndev); lp = netdev_priv(ndev);
lp->ndev = ndev; lp->ndev = ndev;
if (!request_mem_region(ndev->mem_start, /* Get IRQ for the device */
ndev->mem_end - ndev->mem_start + 1, res = platform_get_resource(ofdev, IORESOURCE_IRQ, 0);
DRIVER_NAME)) { if (!res) {
dev_err(dev, "Couldn't lock memory region at %p\n", dev_err(dev, "no IRQ found\n");
(void *)ndev->mem_start); goto error;
rc = -EBUSY;
goto error2;
} }
/* Get the virtual base address for the device */ ndev->irq = res->start;
lp->base_addr = ioremap(r_mem.start, resource_size(&r_mem));
if (NULL == lp->base_addr) { res = platform_get_resource(ofdev, IORESOURCE_MEM, 0);
dev_err(dev, "EmacLite: Could not allocate iomem\n"); lp->base_addr = devm_request_and_ioremap(&ofdev->dev, res);
rc = -EIO; if (!lp->base_addr)
goto error1; goto error;
}
ndev->mem_start = res->start;
ndev->mem_end = res->end;
spin_lock_init(&lp->reset_lock); spin_lock_init(&lp->reset_lock);
lp->next_tx_buf_to_use = 0x0; lp->next_tx_buf_to_use = 0x0;
...@@ -1219,7 +1201,7 @@ static int xemaclite_of_probe(struct platform_device *ofdev) ...@@ -1219,7 +1201,7 @@ static int xemaclite_of_probe(struct platform_device *ofdev)
if (rc) { if (rc) {
dev_err(dev, dev_err(dev,
"Cannot register network device, aborting\n"); "Cannot register network device, aborting\n");
goto error1; goto error;
} }
dev_info(dev, dev_info(dev,
...@@ -1228,11 +1210,8 @@ static int xemaclite_of_probe(struct platform_device *ofdev) ...@@ -1228,11 +1210,8 @@ static int xemaclite_of_probe(struct platform_device *ofdev)
(unsigned int __force)lp->base_addr, ndev->irq); (unsigned int __force)lp->base_addr, ndev->irq);
return 0; return 0;
error1: error:
release_mem_region(ndev->mem_start, resource_size(&r_mem)); xemaclite_remove_ndev(ndev, ofdev);
error2:
xemaclite_remove_ndev(ndev);
return rc; return rc;
} }
...@@ -1267,9 +1246,7 @@ static int xemaclite_of_remove(struct platform_device *of_dev) ...@@ -1267,9 +1246,7 @@ static int xemaclite_of_remove(struct platform_device *of_dev)
of_node_put(lp->phy_node); of_node_put(lp->phy_node);
lp->phy_node = NULL; lp->phy_node = NULL;
release_mem_region(ndev->mem_start, ndev->mem_end-ndev->mem_start + 1); xemaclite_remove_ndev(ndev, of_dev);
xemaclite_remove_ndev(ndev);
dev_set_drvdata(dev, NULL); dev_set_drvdata(dev, NULL);
return 0; return 0;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册