ar71xx: ag71xx: make use of managed dev API simplifying code
Backport of a4eef43a12 ("ath79: ag71xx: replace alloc_etherdev with devm_alloc_etherdev")
combined with the initial changes from John Crispin.
Simplifies the code a lot by using the Managed dev API.
Signed-off-by: Koen Vandeputte <koen.vandeputte@ncentric.com>
			
			
This commit is contained in:
		| @@ -1305,26 +1305,26 @@ static int ag71xx_probe(struct platform_device *pdev) | |||||||
| 	pdata = pdev->dev.platform_data; | 	pdata = pdev->dev.platform_data; | ||||||
| 	if (!pdata) { | 	if (!pdata) { | ||||||
| 		dev_err(&pdev->dev, "no platform data specified\n"); | 		dev_err(&pdev->dev, "no platform data specified\n"); | ||||||
| 		err = -ENXIO; | 		return -ENXIO; | ||||||
| 		goto err_out; |  | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	if (pdata->mii_bus_dev == NULL && pdata->phy_mask) { | 	if (pdata->mii_bus_dev == NULL && pdata->phy_mask) { | ||||||
| 		dev_err(&pdev->dev, "no MII bus device specified\n"); | 		dev_err(&pdev->dev, "no MII bus device specified\n"); | ||||||
| 		err = -EINVAL; | 		return -EINVAL; | ||||||
| 		goto err_out; |  | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	dev = alloc_etherdev(sizeof(*ag)); | 	dev = devm_alloc_etherdev(&pdev->dev, sizeof(*ag)); | ||||||
| 	if (!dev) { | 	if (!dev) | ||||||
| 		dev_err(&pdev->dev, "alloc_etherdev failed\n"); | 		return -ENOMEM; | ||||||
| 		err = -ENOMEM; |  | ||||||
| 		goto err_out; |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	if (!pdata->max_frame_len || !pdata->desc_pktlen_mask) | 	if (!pdata->max_frame_len || !pdata->desc_pktlen_mask) | ||||||
| 		return -EINVAL; | 		return -EINVAL; | ||||||
|  |  | ||||||
|  | 	res = platform_get_resource(pdev, IORESOURCE_MEM, 0); | ||||||
|  | 	if (!res) | ||||||
|  | 		return -EINVAL; | ||||||
|  |  | ||||||
| 	SET_NETDEV_DEV(dev, &pdev->dev); | 	SET_NETDEV_DEV(dev, &pdev->dev); | ||||||
|  |  | ||||||
| 	ag = netdev_priv(dev); | 	ag = netdev_priv(dev); | ||||||
| @@ -1337,24 +1337,20 @@ static int ag71xx_probe(struct platform_device *pdev) | |||||||
| 	res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "mac_base"); | 	res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "mac_base"); | ||||||
| 	if (!res) { | 	if (!res) { | ||||||
| 		dev_err(&pdev->dev, "no mac_base resource found\n"); | 		dev_err(&pdev->dev, "no mac_base resource found\n"); | ||||||
| 		err = -ENXIO; | 		return -ENXIO; | ||||||
| 		goto err_out; |  | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	ag->mac_base = ioremap_nocache(res->start, res->end - res->start + 1); | 	ag->mac_base = devm_ioremap_nocache(&pdev->dev, res->start, | ||||||
| 	if (!ag->mac_base) { | 					    res->end - res->start + 1); | ||||||
| 		dev_err(&pdev->dev, "unable to ioremap mac_base\n"); | 	if (!ag->mac_base) | ||||||
| 		err = -ENOMEM; | 		return -ENOMEM; | ||||||
| 		goto err_free_dev; |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	dev->irq = platform_get_irq(pdev, 0); | 	dev->irq = platform_get_irq(pdev, 0); | ||||||
| 	err = request_irq(dev->irq, ag71xx_interrupt, | 	err = devm_request_irq(&pdev->dev, dev->irq, ag71xx_interrupt, | ||||||
| 			  0x0, | 			       0x0, dev_name(&pdev->dev), dev); | ||||||
| 			  dev->name, dev); |  | ||||||
| 	if (err) { | 	if (err) { | ||||||
| 		dev_err(&pdev->dev, "unable to request IRQ %d\n", dev->irq); | 		dev_err(&pdev->dev, "unable to request IRQ %d\n", dev->irq); | ||||||
| 		goto err_unmap_base; | 		return err; | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	dev->base_addr = (unsigned long)ag->mac_base; | 	dev->base_addr = (unsigned long)ag->mac_base; | ||||||
| @@ -1379,11 +1375,12 @@ static int ag71xx_probe(struct platform_device *pdev) | |||||||
| 	} | 	} | ||||||
| 	ag->tx_ring.order = ag71xx_ring_size_order(tx_size); | 	ag->tx_ring.order = ag71xx_ring_size_order(tx_size); | ||||||
|  |  | ||||||
| 	ag->stop_desc = dma_alloc_coherent(NULL, | 	ag->stop_desc = dmam_alloc_coherent(&pdev->dev, | ||||||
| 		sizeof(struct ag71xx_desc), &ag->stop_desc_dma, GFP_KERNEL); | 					sizeof(struct ag71xx_desc), | ||||||
|  | 					&ag->stop_desc_dma, GFP_KERNEL); | ||||||
|  |  | ||||||
| 	if (!ag->stop_desc) | 	if (!ag->stop_desc) | ||||||
| 		goto err_free_irq; | 		return -ENOMEM; | ||||||
|  |  | ||||||
| 	ag->stop_desc->data = 0; | 	ag->stop_desc->data = 0; | ||||||
| 	ag->stop_desc->ctrl = 0; | 	ag->stop_desc->ctrl = 0; | ||||||
| @@ -1403,7 +1400,7 @@ static int ag71xx_probe(struct platform_device *pdev) | |||||||
|  |  | ||||||
| 	err = ag71xx_phy_connect(ag); | 	err = ag71xx_phy_connect(ag); | ||||||
| 	if (err) | 	if (err) | ||||||
| 		goto err_free_desc; | 		return err; | ||||||
|  |  | ||||||
| 	err = ag71xx_debugfs_init(ag); | 	err = ag71xx_debugfs_init(ag); | ||||||
| 	if (err) | 	if (err) | ||||||
| @@ -1414,7 +1411,9 @@ static int ag71xx_probe(struct platform_device *pdev) | |||||||
| 	err = register_netdev(dev); | 	err = register_netdev(dev); | ||||||
| 	if (err) { | 	if (err) { | ||||||
| 		dev_err(&pdev->dev, "unable to register net device\n"); | 		dev_err(&pdev->dev, "unable to register net device\n"); | ||||||
| 		goto err_debugfs_exit; | 		platform_set_drvdata(pdev, NULL); | ||||||
|  | 		ag71xx_debugfs_exit(ag); | ||||||
|  | 		goto err_phy_disconnect; | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	pr_info("%s: Atheros AG71xx at 0x%08lx, irq %d, mode:%s\n", | 	pr_info("%s: Atheros AG71xx at 0x%08lx, irq %d, mode:%s\n", | ||||||
| @@ -1423,40 +1422,24 @@ static int ag71xx_probe(struct platform_device *pdev) | |||||||
|  |  | ||||||
| 	return 0; | 	return 0; | ||||||
|  |  | ||||||
| err_debugfs_exit: |  | ||||||
| 	ag71xx_debugfs_exit(ag); |  | ||||||
| err_phy_disconnect: | err_phy_disconnect: | ||||||
| 	ag71xx_phy_disconnect(ag); | 	ag71xx_phy_disconnect(ag); | ||||||
| err_free_desc: |  | ||||||
| 	dma_free_coherent(NULL, sizeof(struct ag71xx_desc), ag->stop_desc, |  | ||||||
| 			  ag->stop_desc_dma); |  | ||||||
| err_free_irq: |  | ||||||
| 	free_irq(dev->irq, dev); |  | ||||||
| err_unmap_base: |  | ||||||
| 	iounmap(ag->mac_base); |  | ||||||
| err_free_dev: |  | ||||||
| 	kfree(dev); |  | ||||||
| err_out: |  | ||||||
| 	platform_set_drvdata(pdev, NULL); |  | ||||||
| 	return err; | 	return err; | ||||||
| } | } | ||||||
|  |  | ||||||
| static int ag71xx_remove(struct platform_device *pdev) | static int ag71xx_remove(struct platform_device *pdev) | ||||||
| { | { | ||||||
| 	struct net_device *dev = platform_get_drvdata(pdev); | 	struct net_device *dev = platform_get_drvdata(pdev); | ||||||
|  | 	struct ag71xx *ag; | ||||||
|  |  | ||||||
| 	if (dev) { | 	if (!dev) | ||||||
| 		struct ag71xx *ag = netdev_priv(dev); | 		return 0; | ||||||
|  |  | ||||||
|  | 	ag = netdev_priv(dev); | ||||||
| 	ag71xx_debugfs_exit(ag); | 	ag71xx_debugfs_exit(ag); | ||||||
| 	ag71xx_phy_disconnect(ag); | 	ag71xx_phy_disconnect(ag); | ||||||
| 	unregister_netdev(dev); | 	unregister_netdev(dev); | ||||||
| 		free_irq(dev->irq, dev); |  | ||||||
| 		iounmap(ag->mac_base); |  | ||||||
| 		kfree(dev); |  | ||||||
| 	platform_set_drvdata(pdev, NULL); | 	platform_set_drvdata(pdev, NULL); | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	return 0; | 	return 0; | ||||||
| } | } | ||||||
|  |  | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 Koen Vandeputte
					Koen Vandeputte