Oh, I've got message after sending email. I've got Greg's email address using get_maintainer.pl in your dwc source tree. Thank you. > -----Original Message----- > From: linux-usb-owner@xxxxxxxxxxxxxxx [mailto:linux-usb- > owner@xxxxxxxxxxxxxxx] On Behalf Of Felipe Balbi > Sent: Wednesday, February 15, 2012 6:37 PM > To: Chanho Park > Cc: balbi@xxxxxx; linux-usb@xxxxxxxxxxxxxxx; Kyungmin Park; Greg KH > Subject: Re: usb: dwc3: use devm_xxx functions > > 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 -- To unsubscribe from this list: send the line "unsubscribe linux-usb" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html