2017-02-24 16:20 GMT+01:00 Rob Herring robh+dt@kernel.org:
On Fri, Feb 24, 2017 at 9:13 AM, Benjamin Gaignard benjamin.gaignard@linaro.org wrote:
2017-02-24 15:17 GMT+01:00 Rob Herring robh+dt@kernel.org:
On Fri, Feb 17, 2017 at 8:31 AM, Benjamin Gaignard benjamin.gaignard@linaro.org wrote:
Lost of calls to of_platform_populate() are not unbalanced by a call
s/Lost/Lots/
to of_platform_depopulate(). This create issues while drivers are bind/unbind.
In way to solve those issues is to add devm_of_platform_populate() which will call of_platform_depopulate() when the device is unbound from the bus.
One complication is of_platform_populate is designed to be called multiple times. We call it with the default match table and then platforms can call it again with a custom match table for example.
I do not plan to use it every where but only in some drivers probe() to avoid adding goto to call of_platform_depopulate() for each error cases which may occur after calling populate.
Signed-off-by: Benjamin Gaignard benjamin.gaignard@linaro.org
drivers/of/platform.c | 77 +++++++++++++++++++++++++++++++++++++++++++++ include/linux/of_platform.h | 20 ++++++++++++ 2 files changed, 97 insertions(+)
diff --git a/drivers/of/platform.c b/drivers/of/platform.c index b8064bc..3dbebf7 100644 --- a/drivers/of/platform.c +++ b/drivers/of/platform.c @@ -571,6 +571,83 @@ void of_platform_depopulate(struct device *parent) } EXPORT_SYMBOL_GPL(of_platform_depopulate);
+static void devm_of_platform_populate_release(struct device *dev, void *res) +{
of_platform_depopulate(*(struct device **)res);
+}
+/**
- devm_of_platform_populate() - Populate platform_devices from device tree data
- @dev: device that requested to populate from device tree data
- @root: parent of the first level to probe or NULL for the root of the tree
- @matches: match table, NULL to use the default
NULL is no match table, not the default which means only populate immediate children.
I have copy of_platform_populate() description... I replace it by: @matches: match table (could be NULL)
- @lookup: auxdata table for matching id and platform_data with device nodes
- @parent: parent to hook devices from, NULL for toplevel
I think this needs to be a bit different args as the use is limited. root and parent must not be NULL. dev should be the same as parent. lookup was for legacy, so drop that.
So function prototype will become: int devm_of_platform_populate(struct device *dev, struct device_node *root, const struct of_device_id *matches)
I just noticed something else too. dev->of_node should equal root I think, so we can get rid of root param.
match parameter is very often set to NULL since this function will have a limited scope why not also remove it and only keep dev ?
Rob