On Thu, Jun 21, 2012 at 02:41:08PM +0800, Richard Zhao wrote: > Platform drivers do the similar things to add/remove ci13xxx device, so > create a unified one. > > Signed-off-by: Richard Zhao <richard.zhao@xxxxxxxxxxxxx> > Reviewed-by: Felipe Balbi <balbi@xxxxxx> > Signed-off-by: Alexander Shishkin <alexander.shishkin@xxxxxxxxxxxxxxx> > --- > drivers/usb/chipidea/ci13xxx_msm.c | 34 ++++++---------------------- > drivers/usb/chipidea/ci13xxx_pci.c | 34 +++++----------------------- > drivers/usb/chipidea/core.c | 43 ++++++++++++++++++++++++++++++++++++ > include/linux/usb/chipidea.h | 7 ++++++ > 4 files changed, 63 insertions(+), 55 deletions(-) > > diff --git a/drivers/usb/chipidea/ci13xxx_msm.c b/drivers/usb/chipidea/ci13xxx_msm.c > index a7dd9f1..92bfe36 100644 > --- a/drivers/usb/chipidea/ci13xxx_msm.c > +++ b/drivers/usb/chipidea/ci13xxx_msm.c > @@ -58,50 +58,30 @@ static struct ci13xxx_platform_data ci13xxx_msm_platdata = { > static int __devinit ci13xxx_msm_probe(struct platform_device *pdev) > { > struct platform_device *plat_ci; > - int ret; > > dev_dbg(&pdev->dev, "ci13xxx_msm_probe\n"); > > - plat_ci = platform_device_alloc("ci_hdrc", -1); > - if (!plat_ci) { > - dev_err(&pdev->dev, "can't allocate ci_hdrc platform device\n"); > - return -ENOMEM; > + plat_ci = ci13xxx_add_device(&pdev->dev, > + pdev->resource, pdev->num_resources, > + &ci13xxx_msm_platdata); > + if (IS_ERR(plat_ci)) { > + dev_err(&pdev->dev, "ci13xxx_add_device failed!\n"); > + return PTR_ERR(plat_ci); > } > > - ret = platform_device_add_resources(plat_ci, pdev->resource, > - pdev->num_resources); > - if (ret) { > - dev_err(&pdev->dev, "can't add resources to platform device\n"); > - goto put_platform; > - } > - > - ret = platform_device_add_data(plat_ci, &ci13xxx_msm_platdata, > - sizeof(ci13xxx_msm_platdata)); > - if (ret) > - goto put_platform; > - > - ret = platform_device_add(plat_ci); > - if (ret) > - goto put_platform; > - > platform_set_drvdata(pdev, plat_ci); > > pm_runtime_no_callbacks(&pdev->dev); > pm_runtime_enable(&pdev->dev); > > return 0; > - > -put_platform: > - platform_device_put(plat_ci); > - > - return ret; > } > > static int __devexit ci13xxx_msm_remove(struct platform_device *pdev) > { > struct platform_device *plat_ci = platform_get_drvdata(pdev); > > - platform_device_unregister(plat_ci); > + ci13xxx_remove_device(plat_ci); > > return 0; > } > diff --git a/drivers/usb/chipidea/ci13xxx_pci.c b/drivers/usb/chipidea/ci13xxx_pci.c > index cdcac3a..918e149 100644 > --- a/drivers/usb/chipidea/ci13xxx_pci.c > +++ b/drivers/usb/chipidea/ci13xxx_pci.c > @@ -75,13 +75,6 @@ static int __devinit ci13xxx_pci_probe(struct pci_dev *pdev, > pci_set_master(pdev); > pci_try_set_mwi(pdev); > > - plat_ci = platform_device_alloc("ci_hdrc", -1); > - if (!plat_ci) { > - dev_err(&pdev->dev, "can't allocate ci_hdrc platform device\n"); > - retval = -ENOMEM; > - goto disable_device; > - } > - > memset(res, 0, sizeof(res)); > res[0].start = pci_resource_start(pdev, 0); > res[0].end = pci_resource_end(pdev, 0); > @@ -89,32 +82,17 @@ static int __devinit ci13xxx_pci_probe(struct pci_dev *pdev, > res[1].start = pdev->irq; > res[1].flags = IORESOURCE_IRQ; > > - retval = platform_device_add_resources(plat_ci, res, nres); > - if (retval) { > - dev_err(&pdev->dev, "can't add resources to platform device\n"); > - goto put_platform; > + plat_ci = ci13xxx_add_device(&pdev->dev, res, nres, platdata); > + if (IS_ERR(plat_ci)) { > + dev_err(&pdev->dev, "ci13xxx_add_device failed!\n"); > + retval = PTR_ERR(plat_ci); > + goto disable_device; > } > > - retval = platform_device_add_data(plat_ci, platdata, sizeof(*platdata)); > - if (retval) > - goto put_platform; > - > - dma_set_coherent_mask(&plat_ci->dev, pdev->dev.coherent_dma_mask); > - plat_ci->dev.dma_mask = pdev->dev.dma_mask; > - plat_ci->dev.dma_parms = pdev->dev.dma_parms; > - plat_ci->dev.parent = &pdev->dev; > - > pci_set_drvdata(pdev, plat_ci); > > - retval = platform_device_add(plat_ci); > - if (retval) > - goto put_platform; > - > return 0; > > - put_platform: > - pci_set_drvdata(pdev, NULL); > - platform_device_put(plat_ci); > disable_device: > pci_disable_device(pdev); > done: > @@ -133,7 +111,7 @@ static void __devexit ci13xxx_pci_remove(struct pci_dev *pdev) > { > struct platform_device *plat_ci = pci_get_drvdata(pdev); > > - platform_device_unregister(plat_ci); > + ci13xxx_remove_device(plat_ci); > pci_set_drvdata(pdev, NULL); > pci_disable_device(pdev); > } > diff --git a/drivers/usb/chipidea/core.c b/drivers/usb/chipidea/core.c > index 9a883bd..8eccd1b 100644 > --- a/drivers/usb/chipidea/core.c > +++ b/drivers/usb/chipidea/core.c > @@ -332,6 +332,49 @@ static irqreturn_t ci_irq(int irq, void *data) > return ci->role == CI_ROLE_END ? ret : ci_role(ci)->irq(ci); > } > > +struct platform_device *ci13xxx_add_device(struct device *dev, > + struct resource *res, int nres, > + struct ci13xxx_platform_data *platdata) > +{ > + struct platform_device *pdev; > + int ret; > + > + /* FIXME: find a way to choose id */ > + pdev = platform_device_alloc("ci_hdrc", -1); > + if (!pdev) > + return ERR_PTR(-ENOMEM); > + > + pdev->dev.parent = dev; > + pdev->dev.dma_mask = dev->dma_mask; > + pdev->dev.dma_parms = dev->dma_parms; > + dma_set_coherent_mask(&pdev->dev, dev->coherent_dma_mask); > + > + ret = platform_device_add_resources(pdev, res, nres); > + if (ret) > + goto err; > + > + ret = platform_device_add_data(pdev, platdata, sizeof(*platdata)); > + if (ret) > + goto err; > + > + ret = platform_device_add(pdev); > + if (ret) > + goto err; > + > + return pdev; > + > +err: > + platform_device_put(pdev); > + return ERR_PTR(ret); > +} > +EXPORT_SYMBOL_GPL(ci13xxx_add_device); > + > +void ci13xxx_remove_device(struct platform_device *pdev) > +{ > + platform_device_put(pdev); It's supposed to be platform_device_unregister(pdev); Thanks Richard > +} > +EXPORT_SYMBOL_GPL(ci13xxx_remove_device); -- 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