USB: Chipidea: add unified ci13xxx_{add,remove}_device for platform drivers
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>
This commit is contained in:
parent
26c696c678
commit
cbc6dc2af3
@ -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;
|
||||
}
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -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;
|
||||
|
@ -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
|
||||
|
Loading…
x
Reference in New Issue
Block a user