The body of the loop is taken from the exynos driver. It appears to also be useful in msm, and I've used it in vc4. Signed-off-by: Eric Anholt <eric@xxxxxxxxxx> --- This is separated from converting exynos to use it, to let it land separately and not have to sync between trees. drivers/base/component.c | 40 ++++++++++++++++++++++++++++++++++++++++ include/linux/component.h | 5 +++++ 2 files changed, 45 insertions(+) diff --git a/drivers/base/component.c b/drivers/base/component.c index f748430..08167a3 100644 --- a/drivers/base/component.c +++ b/drivers/base/component.c @@ -16,6 +16,7 @@ #include <linux/list.h> #include <linux/module.h> #include <linux/mutex.h> +#include <linux/platform_device.h> #include <linux/slab.h> struct component_match { @@ -283,6 +284,45 @@ void component_match_add(struct device *dev, struct component_match **matchptr, } EXPORT_SYMBOL(component_match_add); +static int compare_dev(struct device *dev, void *data) +{ + return dev == (struct device *)data; +} + +/** + * component_match_add_platform_drivers - For each driver passed in, + * finds each device that probed with it and adds it as a component + * driver to the match list. + * @dev: master device for the components + * @match: pointer to the match structure pointer. For the first + * component_match_add(), this should be a pointer to a NULL + * pointer, which will get filled in by the call. + * @drivers: array of platform drivers whose devices should all be + * added to the match + * @count: number of platform drivers to match + */ +void component_match_add_platform_drivers(struct device *dev, + struct component_match **match, + struct platform_driver *const *drivers, + int count) +{ + int i; + + for (i = 0; i < count; i++) { + struct device_driver *drv = &drivers[i]->driver; + struct device *p = NULL, *d; + + while ((d = bus_find_device(&platform_bus_type, p, drv, + (void *)platform_bus_type.match))) { + put_device(p); + component_match_add(dev, match, compare_dev, d); + p = d; + } + put_device(p); + } +} +EXPORT_SYMBOL_GPL(component_match_add_platform_drivers); + int component_master_add_with_match(struct device *dev, const struct component_master_ops *ops, struct component_match *match) diff --git a/include/linux/component.h b/include/linux/component.h index c00dcc3..2d74420 100644 --- a/include/linux/component.h +++ b/include/linux/component.h @@ -2,6 +2,7 @@ #define COMPONENT_H struct device; +struct platform_driver; struct component_ops { int (*bind)(struct device *, struct device *, void *); @@ -35,5 +36,9 @@ int component_master_add_with_match(struct device *, const struct component_master_ops *, struct component_match *); void component_match_add(struct device *, struct component_match **, int (*compare)(struct device *, void *), void *compare_data); +void component_match_add_platform_drivers(struct device *dev, + struct component_match **match, + struct platform_driver *const *drivers, + int count); #endif -- 2.1.4 _______________________________________________ dri-devel mailing list dri-devel@xxxxxxxxxxxxxxxxxxxxx http://lists.freedesktop.org/mailman/listinfo/dri-devel