Re: usb: dwc3: use devm_xxx functions

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Greg's mail has changed.

On Wed, Feb 15, 2012 at 06:27:55PM +0900, Chanho Park wrote:
> This patch enables to use devm_xxx functions during probing driver.
> The devm_xxx series functions are able to release resource when the
> driver is detatched. We can remove several codes to release resources
> in the probe function.
> 
> Signed-off-by: Chanho Park <chanho61.park@xxxxxxxxxxx>
> Signed-off-by: Kyungmin Park <kyungmin.park@xxxxxxxxxxx>
> ---
>  drivers/usb/dwc3/core.c      |   84 ++++++++++++++++++-----------------------
>  drivers/usb/dwc3/dwc3-omap.c |   85 ++++++++++++++++-------------------------
>  drivers/usb/dwc3/dwc3-pci.c  |   46 ++++++++++------------
>  3 files changed, 90 insertions(+), 125 deletions(-)
> 
> diff --git a/drivers/usb/dwc3/core.c b/drivers/usb/dwc3/core.c
> index d119a1f..c181f3e 100644
> --- a/drivers/usb/dwc3/core.c
> +++ b/drivers/usb/dwc3/core.c
> @@ -408,6 +408,7 @@ static int __devinit dwc3_probe(struct platform_device *pdev)
>  	struct device_node	*node = pdev->dev.of_node;
>  	struct resource		*res;
>  	struct dwc3		*dwc;
> +	struct device		*dev = &pdev->dev;
>  
>  	int			ret = -ENOMEM;
>  	int			irq;
> @@ -417,39 +418,39 @@ static int __devinit dwc3_probe(struct platform_device *pdev)
>  
>  	u8			mode;
>  
> -	mem = kzalloc(sizeof(*dwc) + DWC3_ALIGN_MASK, GFP_KERNEL);
> +	mem = devm_kzalloc(dev, sizeof(*dwc) + DWC3_ALIGN_MASK, GFP_KERNEL);
>  	if (!mem) {
> -		dev_err(&pdev->dev, "not enough memory\n");
> -		goto err0;
> +		dev_err(dev, "not enough memory\n");
> +		return -ENOMEM;
>  	}
>  	dwc = PTR_ALIGN(mem, DWC3_ALIGN_MASK + 1);
>  	dwc->mem = mem;
>  
>  	res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
>  	if (!res) {
> -		dev_err(&pdev->dev, "missing resource\n");
> -		goto err1;
> +		dev_err(dev, "missing resource\n");
> +		return -ENODEV;
>  	}
>  
>  	dwc->res = res;
>  
> -	res = request_mem_region(res->start, resource_size(res),
> -			dev_name(&pdev->dev));
> +	res = devm_request_mem_region(dev, res->start, resource_size(res),
> +			dev_name(dev));
>  	if (!res) {
> -		dev_err(&pdev->dev, "can't request mem region\n");
> -		goto err1;
> +		dev_err(dev, "can't request mem region\n");
> +		return -ENOMEM;
>  	}
>  
> -	regs = ioremap(res->start, resource_size(res));
> +	regs = devm_ioremap(dev, res->start, resource_size(res));
>  	if (!regs) {
> -		dev_err(&pdev->dev, "ioremap failed\n");
> -		goto err2;
> +		dev_err(dev, "ioremap failed\n");
> +		return -ENOMEM;
>  	}
>  
>  	irq = platform_get_irq(pdev, 0);
>  	if (irq < 0) {
> -		dev_err(&pdev->dev, "missing IRQ\n");
> -		goto err3;
> +		dev_err(dev, "missing IRQ\n");
> +		return -ENODEV;
>  	}
>  
>  	spin_lock_init(&dwc->lock);
> @@ -457,7 +458,7 @@ static int __devinit dwc3_probe(struct platform_device *pdev)
>  
>  	dwc->regs	= regs;
>  	dwc->regs_size	= resource_size(res);
> -	dwc->dev	= &pdev->dev;
> +	dwc->dev	= dev;
>  	dwc->irq	= irq;
>  
>  	if (!strncmp("super", maximum_speed, 5))
> @@ -474,14 +475,14 @@ static int __devinit dwc3_probe(struct platform_device *pdev)
>  	if (of_get_property(node, "tx-fifo-resize", NULL))
>  		dwc->needs_fifo_resize = true;
>  
> -	pm_runtime_enable(&pdev->dev);
> -	pm_runtime_get_sync(&pdev->dev);
> -	pm_runtime_forbid(&pdev->dev);
> +	pm_runtime_enable(dev);
> +	pm_runtime_get_sync(dev);
> +	pm_runtime_forbid(dev);
>  
>  	ret = dwc3_core_init(dwc);
>  	if (ret) {
> -		dev_err(&pdev->dev, "failed to initialize core\n");
> -		goto err3;
> +		dev_err(dev, "failed to initialize core\n");
> +		return ret;
>  	}
>  
>  	mode = DWC3_MODE(dwc->hwparams.hwparams0);
> @@ -491,49 +492,49 @@ static int __devinit dwc3_probe(struct platform_device *pdev)
>  		dwc3_set_mode(dwc, DWC3_GCTL_PRTCAP_DEVICE);
>  		ret = dwc3_gadget_init(dwc);
>  		if (ret) {
> -			dev_err(&pdev->dev, "failed to initialize gadget\n");
> -			goto err4;
> +			dev_err(dev, "failed to initialize gadget\n");
> +			goto err1;
>  		}
>  		break;
>  	case DWC3_MODE_HOST:
>  		dwc3_set_mode(dwc, DWC3_GCTL_PRTCAP_HOST);
>  		ret = dwc3_host_init(dwc);
>  		if (ret) {
> -			dev_err(&pdev->dev, "failed to initialize host\n");
> -			goto err4;
> +			dev_err(dev, "failed to initialize host\n");
> +			goto err1;
>  		}
>  		break;
>  	case DWC3_MODE_DRD:
>  		dwc3_set_mode(dwc, DWC3_GCTL_PRTCAP_OTG);
>  		ret = dwc3_host_init(dwc);
>  		if (ret) {
> -			dev_err(&pdev->dev, "failed to initialize host\n");
> -			goto err4;
> +			dev_err(dev, "failed to initialize host\n");
> +			goto err1;
>  		}
>  
>  		ret = dwc3_gadget_init(dwc);
>  		if (ret) {
> -			dev_err(&pdev->dev, "failed to initialize gadget\n");
> -			goto err4;
> +			dev_err(dev, "failed to initialize gadget\n");
> +			goto err1;
>  		}
>  		break;
>  	default:
> -		dev_err(&pdev->dev, "Unsupported mode of operation %d\n", mode);
> -		goto err4;
> +		dev_err(dev, "Unsupported mode of operation %d\n", mode);
> +		goto err1;
>  	}
>  	dwc->mode = mode;
>  
>  	ret = dwc3_debugfs_init(dwc);
>  	if (ret) {
> -		dev_err(&pdev->dev, "failed to initialize debugfs\n");
> -		goto err5;
> +		dev_err(dev, "failed to initialize debugfs\n");
> +		goto err2;
>  	}
>  
> -	pm_runtime_allow(&pdev->dev);
> +	pm_runtime_allow(dev);
>  
>  	return 0;
>  
> -err5:
> +err2:
>  	switch (mode) {
>  	case DWC3_MODE_DEVICE:
>  		dwc3_gadget_exit(dwc);
> @@ -550,19 +551,9 @@ err5:
>  		break;
>  	}
>  
> -err4:
> -	dwc3_core_exit(dwc);
> -
> -err3:
> -	iounmap(regs);
> -
> -err2:
> -	release_mem_region(res->start, resource_size(res));
> -
>  err1:
> -	kfree(dwc->mem);
> +	dwc3_core_exit(dwc);
>  
> -err0:
>  	return ret;
>  }
>  
> @@ -595,9 +586,6 @@ static int __devexit dwc3_remove(struct platform_device *pdev)
>  	}
>  
>  	dwc3_core_exit(dwc);
> -	release_mem_region(res->start, resource_size(res));
> -	iounmap(dwc->regs);
> -	kfree(dwc->mem);
>  
>  	return 0;
>  }
> diff --git a/drivers/usb/dwc3/dwc3-omap.c b/drivers/usb/dwc3/dwc3-omap.c
> index 64e29c3..f2e6b05 100644
> --- a/drivers/usb/dwc3/dwc3-omap.c
> +++ b/drivers/usb/dwc3/dwc3-omap.c
> @@ -203,6 +203,7 @@ static int __devinit dwc3_omap_probe(struct platform_device *pdev)
>  	struct platform_device	*dwc3;
>  	struct dwc3_omap	*omap;
>  	struct resource		*res;
> +	struct device		*dev = &pdev->dev;
>  
>  	int			devid;
>  	int			size;
> @@ -215,59 +216,57 @@ static int __devinit dwc3_omap_probe(struct platform_device *pdev)
>  	void __iomem		*base;
>  	void			*context;
>  
> -	omap = kzalloc(sizeof(*omap), GFP_KERNEL);
> +	omap = devm_kzalloc(dev, sizeof(*omap), GFP_KERNEL);
>  	if (!omap) {
> -		dev_err(&pdev->dev, "not enough memory\n");
> -		goto err0;
> +		dev_err(dev, "not enough memory\n");
> +		return -ENOMEM;
>  	}
>  
>  	platform_set_drvdata(pdev, omap);
>  
>  	irq = platform_get_irq(pdev, 1);
>  	if (irq < 0) {
> -		dev_err(&pdev->dev, "missing IRQ resource\n");
> -		ret = -EINVAL;
> -		goto err1;
> +		dev_err(dev, "missing IRQ resource\n");
> +		return -EINVAL;
>  	}
>  
>  	res = platform_get_resource(pdev, IORESOURCE_MEM, 1);
>  	if (!res) {
> -		dev_err(&pdev->dev, "missing memory base resource\n");
> -		ret = -EINVAL;
> -		goto err1;
> +		dev_err(dev, "missing memory base resource\n");
> +		return -EINVAL;
>  	}
>  
> -	base = ioremap_nocache(res->start, resource_size(res));
> +	base = devm_ioremap_nocache(dev, res->start, resource_size(res));
>  	if (!base) {
> -		dev_err(&pdev->dev, "ioremap failed\n");
> -		goto err1;
> +		dev_err(dev, "ioremap failed\n");
> +		return -ENOMEM;
>  	}
>  
>  	devid = dwc3_get_device_id();
>  	if (devid < 0)
> -		goto err2;
> +		return -ENODEV;
>  
>  	dwc3 = platform_device_alloc("dwc3", devid);
>  	if (!dwc3) {
> -		dev_err(&pdev->dev, "couldn't allocate dwc3 device\n");
> -		goto err3;
> +		dev_err(dev, "couldn't allocate dwc3 device\n");
> +		goto err1;
>  	}
>  
> -	context = kzalloc(resource_size(res), GFP_KERNEL);
> +	context = devm_kzalloc(dev, resource_size(res), GFP_KERNEL);
>  	if (!context) {
> -		dev_err(&pdev->dev, "couldn't allocate dwc3 context memory\n");
> -		goto err4;
> +		dev_err(dev, "couldn't allocate dwc3 context memory\n");
> +		goto err2;
>  	}
>  
>  	spin_lock_init(&omap->lock);
> -	dma_set_coherent_mask(&dwc3->dev, pdev->dev.coherent_dma_mask);
> +	dma_set_coherent_mask(&dwc3->dev, dev->coherent_dma_mask);
>  
> -	dwc3->dev.parent = &pdev->dev;
> -	dwc3->dev.dma_mask = pdev->dev.dma_mask;
> -	dwc3->dev.dma_parms = pdev->dev.dma_parms;
> +	dwc3->dev.parent = dev;
> +	dwc3->dev.dma_mask = dev->dma_mask;
> +	dwc3->dev.dma_parms = dev->dma_parms;
>  	omap->resource_size = resource_size(res);
>  	omap->context	= context;
> -	omap->dev	= &pdev->dev;
> +	omap->dev	= dev;
>  	omap->irq	= irq;
>  	omap->base	= base;
>  	omap->dwc3	= dwc3;
> @@ -279,7 +278,7 @@ static int __devinit dwc3_omap_probe(struct platform_device *pdev)
>  		reg |= *utmi_mode;
>  	} else {
>  		if (!pdata) {
> -			dev_dbg(&pdev->dev, "missing platform data\n");
> +			dev_dbg(dev, "missing platform data\n");
>  		} else {
>  			switch (pdata->utmi_mode) {
>  			case DWC3_OMAP_UTMI_MODE_SW:
> @@ -289,7 +288,7 @@ static int __devinit dwc3_omap_probe(struct platform_device *pdev)
>  				reg &= ~USBOTGSS_UTMI_OTG_STATUS_SW_MODE;
>  				break;
>  			default:
> -				dev_dbg(&pdev->dev, "UNKNOWN utmi mode %d\n",
> +				dev_dbg(dev, "UNKNOWN utmi mode %d\n",
>  						pdata->utmi_mode);
>  			}
>  		}
> @@ -310,12 +309,12 @@ static int __devinit dwc3_omap_probe(struct platform_device *pdev)
>  
>  	dwc3_writel(omap->base, USBOTGSS_SYSCONFIG, reg);
>  
> -	ret = request_irq(omap->irq, dwc3_omap_interrupt, 0,
> +	ret = devm_request_irq(dev, omap->irq, dwc3_omap_interrupt, 0,
>  			"dwc3-omap", omap);
>  	if (ret) {
> -		dev_err(&pdev->dev, "failed to request IRQ #%d --> %d\n",
> +		dev_err(dev, "failed to request IRQ #%d --> %d\n",
>  				omap->irq, ret);
> -		goto err5;
> +		goto err2;
>  	}
>  
>  	/* enable all IRQs */
> @@ -337,37 +336,24 @@ static int __devinit dwc3_omap_probe(struct platform_device *pdev)
>  	ret = platform_device_add_resources(dwc3, pdev->resource,
>  			pdev->num_resources);
>  	if (ret) {
> -		dev_err(&pdev->dev, "couldn't add resources to dwc3 device\n");
> -		goto err6;
> +		dev_err(dev, "couldn't add resources to dwc3 device\n");
> +		goto err2;
>  	}
>  
>  	ret = platform_device_add(dwc3);
>  	if (ret) {
> -		dev_err(&pdev->dev, "failed to register dwc3 device\n");
> -		goto err6;
> +		dev_err(dev, "failed to register dwc3 device\n");
> +		goto err2;
>  	}
>  
>  	return 0;
>  
> -err6:
> -	free_irq(omap->irq, omap);
> -
> -err5:
> -	kfree(omap->context);
> -
> -err4:
> -	platform_device_put(dwc3);
> -
> -err3:
> -	dwc3_put_device_id(devid);
> -
>  err2:
> -	iounmap(base);
> +	platform_device_put(dwc3);
>  
>  err1:
> -	kfree(omap);
> +	dwc3_put_device_id(devid);
>  
> -err0:
>  	return ret;
>  }
>  
> @@ -378,11 +364,6 @@ static int __devexit dwc3_omap_remove(struct platform_device *pdev)
>  	platform_device_unregister(omap->dwc3);
>  
>  	dwc3_put_device_id(omap->dwc3->id);
> -	free_irq(omap->irq, omap);
> -	iounmap(omap->base);
> -
> -	kfree(omap->context);
> -	kfree(omap);
>  
>  	return 0;
>  }
> diff --git a/drivers/usb/dwc3/dwc3-pci.c b/drivers/usb/dwc3/dwc3-pci.c
> index 64e1f7c..05d3a3e 100644
> --- a/drivers/usb/dwc3/dwc3-pci.c
> +++ b/drivers/usb/dwc3/dwc3-pci.c
> @@ -61,19 +61,20 @@ static int __devinit dwc3_pci_probe(struct pci_dev *pci,
>  	struct dwc3_pci		*glue;
>  	int			ret = -ENOMEM;
>  	int			devid;
> +	struct device		*dev = &pci->dev;
>  
> -	glue = kzalloc(sizeof(*glue), GFP_KERNEL);
> +	glue = devm_kzalloc(dev, sizeof(*glue), GFP_KERNEL);
>  	if (!glue) {
> -		dev_err(&pci->dev, "not enough memory\n");
> -		goto err0;
> +		dev_err(dev, "not enough memory\n");
> +		return -ENOMEM;
>  	}
>  
> -	glue->dev	= &pci->dev;
> +	glue->dev	= dev;
>  
>  	ret = pci_enable_device(pci);
>  	if (ret) {
> -		dev_err(&pci->dev, "failed to enable pci device\n");
> -		goto err1;
> +		dev_err(dev, "failed to enable pci device\n");
> +		return -ENODEV;
>  	}
>  
>  	pci_set_power_state(pci, PCI_D0);
> @@ -81,12 +82,12 @@ static int __devinit dwc3_pci_probe(struct pci_dev *pci,
>  
>  	devid = dwc3_get_device_id();
>  	if (devid < 0)
> -		goto err2;
> +		goto err1;
>  
>  	dwc3 = platform_device_alloc("dwc3", devid);
>  	if (!dwc3) {
> -		dev_err(&pci->dev, "couldn't allocate dwc3 device\n");
> -		goto err3;
> +		dev_err(dev, "couldn't allocate dwc3 device\n");
> +		goto err1;
>  	}
>  
>  	memset(res, 0x00, sizeof(struct resource) * ARRAY_SIZE(res));
> @@ -102,41 +103,37 @@ static int __devinit dwc3_pci_probe(struct pci_dev *pci,
>  
>  	ret = platform_device_add_resources(dwc3, res, ARRAY_SIZE(res));
>  	if (ret) {
> -		dev_err(&pci->dev, "couldn't add resources to dwc3 device\n");
> -		goto err4;
> +		dev_err(dev, "couldn't add resources to dwc3 device\n");
> +		goto err2;
>  	}
>  
>  	pci_set_drvdata(pci, glue);
>  
> -	dma_set_coherent_mask(&dwc3->dev, pci->dev.coherent_dma_mask);
> +	dma_set_coherent_mask(&dwc3->dev, dev->coherent_dma_mask);
>  
> -	dwc3->dev.dma_mask = pci->dev.dma_mask;
> -	dwc3->dev.dma_parms = pci->dev.dma_parms;
> -	dwc3->dev.parent = &pci->dev;
> +	dwc3->dev.dma_mask = dev->dma_mask;
> +	dwc3->dev.dma_parms = dev->dma_parms;
> +	dwc3->dev.parent = dev;
>  	glue->dwc3	= dwc3;
>  
>  	ret = platform_device_add(dwc3);
>  	if (ret) {
> -		dev_err(&pci->dev, "failed to register dwc3 device\n");
> -		goto err4;
> +		dev_err(dev, "failed to register dwc3 device\n");
> +		goto err3;
>  	}
>  
>  	return 0;
>  
> -err4:
> +err3:
>  	pci_set_drvdata(pci, NULL);
>  	platform_device_put(dwc3);
>  
> -err3:
> -	dwc3_put_device_id(devid);
> -
>  err2:
> -	pci_disable_device(pci);
> +	dwc3_put_device_id(devid);
>  
>  err1:
> -	kfree(glue);
> +	pci_disable_device(pci);
>  
> -err0:
>  	return ret;
>  }
>  
> @@ -148,7 +145,6 @@ static void __devexit dwc3_pci_remove(struct pci_dev *pci)
>  	platform_device_unregister(glue->dwc3);
>  	pci_set_drvdata(pci, NULL);
>  	pci_disable_device(pci);
> -	kfree(glue);
>  }
>  
>  static DEFINE_PCI_DEVICE_TABLE(dwc3_pci_id_table) = {
> -- 
> 1.7.5.4
> 

-- 
balbi

Attachment: signature.asc
Description: Digital signature


[Index of Archives]     [Linux Media]     [Linux Input]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]     [Old Linux USB Devel Archive]

  Powered by Linux