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