mirror of https://gitee.com/openkylin/linux.git
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: Michal Simek <michal.simek@xilinx.com> Acked-by: Arnd Bergmann <arnd@arndb.de> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
15dd16c233
commit
7a3e2585f2
|
@ -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;
|
||||||
*/
|
*/
|
||||||
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)
|
||||||
|
|
||||||
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)
|
||||||
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)
|
||||||
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)
|
||||||
(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)
|
||||||
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;
|
||||||
|
|
Loading…
Reference in New Issue