greybus: arche_platform: Remove child's platform device as part of _remove() fn
authorVaibhav Hiremath <vaibhav.hiremath@linaro.org>
Mon, 28 Dec 2015 14:36:32 +0000 (20:06 +0530)
committerGreg Kroah-Hartman <gregkh@google.com>
Wed, 30 Dec 2015 21:18:32 +0000 (13:18 -0800)
It seems we need to delete platform_dev of all childs explicitly,
in _remove() fn callback of parent driver.
There were some discussions about having of_platform_unpopulate(),
but it never made it to mainline.

https://lkml.org/lkml/2013/7/19/615

There are some drivers which are removing platform_dev explicitly,
as done in this patch.

Note that, without this, multiple insmod-rmmod won't work, as I see
driver probe gets invoked twice and leads to failure of probe.

Signed-off-by: Vaibhav Hiremath <hiremath_vaibhav@projectara.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@google.com>
drivers/staging/greybus/arche-platform.c

index 7d90f5dee1d3a3e135cbed7c67527d6f179b38b6..697180d36accc3af972578ef11154b686775024b 100644 (file)
@@ -149,10 +149,21 @@ static int arche_platform_probe(struct platform_device *pdev)
        return ret;
 }
 
+static int arche_remove_child(struct device *dev, void *unused)
+{
+       struct platform_device *pdev = to_platform_device(dev);
+
+       platform_device_unregister(pdev);
+
+       return 0;
+}
+
 static int arche_platform_remove(struct platform_device *pdev)
 {
        struct arche_platform_drvdata *arche_pdata = platform_get_drvdata(pdev);
 
+       device_for_each_child(&pdev->dev, NULL, arche_remove_child);
+
        if (arche_pdata)
                arche_platform_cleanup(arche_pdata);