Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit cbc6dc2a authored by Richard Zhao's avatar Richard Zhao Committed by Greg Kroah-Hartman
Browse files

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: default avatarRichard Zhao <richard.zhao@freescale.com>
Reviewed-by: default avatarFelipe Balbi <balbi@ti.com>
Signed-off-by: default avatarAlexander Shishkin <alexander.shishkin@linux.intel.com>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 26c696c6
Loading
Loading
Loading
Loading
+7 −27
Original line number Diff line number Diff line
@@ -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;
}
+6 −28
Original line number Diff line number Diff line
@@ -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);
}
+43 −0
Original line number Diff line number Diff line
@@ -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;
+7 −0
Original line number Diff line number Diff line
@@ -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