USB: Chipidea: add unified ci13xxx_{add,remove}_device for platform drivers
authorRichard Zhao <richard.zhao@freescale.com>
Sat, 7 Jul 2012 14:56:41 +0000 (22:56 +0800)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Mon, 9 Jul 2012 16:53:44 +0000 (09:53 -0700)
Platform drivers do the similar things to add/remove ci13xxx device, so
create a unified one.

Signed-off-by: Richard Zhao <richard.zhao@freescale.com>
Reviewed-by: Felipe Balbi <balbi@ti.com>
Signed-off-by: Alexander Shishkin <alexander.shishkin@linux.intel.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/usb/chipidea/ci13xxx_msm.c
drivers/usb/chipidea/ci13xxx_pci.c
drivers/usb/chipidea/core.c
include/linux/usb/chipidea.h

index 5a2fe5f..b01feb3 100644 (file)
@@ -58,43 +58,23 @@ 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)
@@ -102,7 +82,7 @@ static int __devexit ci13xxx_msm_remove(struct platform_device *pdev)
        struct platform_device *plat_ci = platform_get_drvdata(pdev);
 
        pm_runtime_disable(&pdev->dev);
-       platform_device_unregister(plat_ci);
+       ci13xxx_remove_device(plat_ci);
 
        return 0;
 }
index cdcac3a..918e149 100644 (file)
@@ -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);
 }
index 9a883bd..8b9d06f 100644 (file)
@@ -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_unregister(pdev);
+}
+EXPORT_SYMBOL_GPL(ci13xxx_remove_device);
+
 static int __devinit ci_hdrc_probe(struct platform_device *pdev)
 {
        struct device   *dev = &pdev->dev;
index d2f7e49..be078f0 100644 (file)
@@ -25,4 +25,11 @@ struct ci13xxx_platform_data {
 /* Default offset of capability registers */
 #define DEF_CAPOFFSET          0x100
 
+/* Add ci13xxx device */
+struct platform_device *ci13xxx_add_device(struct device *dev,
+                       struct resource *res, int nres,
+                       struct ci13xxx_platform_data *platdata);
+/* Remove ci13xxx device */
+void ci13xxx_remove_device(struct platform_device *pdev);
+
 #endif