From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1754256AbbI1Xy3 (ORCPT ); Mon, 28 Sep 2015 19:54:29 -0400 Received: from gabe.freedesktop.org ([131.252.210.177]:52713 "EHLO gabe.freedesktop.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753409AbbI1Xy0 (ORCPT ); Mon, 28 Sep 2015 19:54:26 -0400 From: Eric Anholt To: dri-devel@lists.freedesktop.org Cc: linux-kernel@vger.kernel.org, David Airlie , Greg Kroah-Hartman , Inki Dae , Joonyoung Shim , Seung-Woo Kim , Kyungmin Park , Eric Anholt Subject: [PATCH 1/2] component: Make a "match_add all devices matching my drivers" helper. Date: Mon, 28 Sep 2015 16:54:08 -0700 Message-Id: <1443484449-31868-1-git-send-email-eric@anholt.net> X-Mailer: git-send-email 2.1.4 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org 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 --- 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 #include #include +#include #include 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