Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 7a3e2585 authored by Michal Simek's avatar Michal Simek Committed by David S. Miller
Browse files

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: default avatarMichal Simek <michal.simek@xilinx.com>
Acked-by: default avatarArnd Bergmann <arnd@arndb.de>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 15dd16c2
Loading
Loading
Loading
Loading
+22 −45
Original line number Original line Diff line number Diff line
@@ -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;