aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/base/devcon.c
diff options
context:
space:
mode:
authorHeikki Krogerus <heikki.krogerus@linux.intel.com>2019-02-13 02:45:56 -0500
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2019-02-14 04:52:25 -0500
commit80e04837a40f6f1c8e93437be3f772c967a41d2f (patch)
treed5307091273f36e9ba62182dd5b8e5f58a37765b /drivers/base/devcon.c
parent393cd68d0dd3cbaacd8b1ee571d4105a170cf856 (diff)
device connection: Prepare support for firmware described connections
When the connections are defined in firmware, struct device_connection will have the fwnode member pointing to the device node (struct fwnode_handle) of the requested device. The endpoint member for the device names will not be used at all in that case. Acked-by: Hans de Goede <hdegoede@redhat.com> Reviewed-by: Andy Shevchenko <andy.shevchenko@gmail.com> Reviewed-by: Jun Li <jun.li@nxp.com> Tested-by: Jun Li <jun.li@nxp.com> Signed-off-by: Heikki Krogerus <heikki.krogerus@linux.intel.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Diffstat (limited to 'drivers/base/devcon.c')
-rw-r--r--drivers/base/devcon.c24
1 files changed, 24 insertions, 0 deletions
diff --git a/drivers/base/devcon.c b/drivers/base/devcon.c
index d427e806cd73..858b8d2f6ef8 100644
--- a/drivers/base/devcon.c
+++ b/drivers/base/devcon.c
@@ -75,12 +75,36 @@ static struct bus_type *generic_match_buses[] = {
75 NULL, 75 NULL,
76}; 76};
77 77
78static int device_fwnode_match(struct device *dev, void *fwnode)
79{
80 return dev_fwnode(dev) == fwnode;
81}
82
83static void *device_connection_fwnode_match(struct device_connection *con)
84{
85 struct bus_type *bus;
86 struct device *dev;
87
88 for (bus = generic_match_buses[0]; bus; bus++) {
89 dev = bus_find_device(bus, NULL, (void *)con->fwnode,
90 device_fwnode_match);
91 if (dev && !strncmp(dev_name(dev), con->id, strlen(con->id)))
92 return dev;
93
94 put_device(dev);
95 }
96 return NULL;
97}
98
78/* This tries to find the device from the most common bus types by name. */ 99/* This tries to find the device from the most common bus types by name. */
79static void *generic_match(struct device_connection *con, int ep, void *data) 100static void *generic_match(struct device_connection *con, int ep, void *data)
80{ 101{
81 struct bus_type *bus; 102 struct bus_type *bus;
82 struct device *dev; 103 struct device *dev;
83 104
105 if (con->fwnode)
106 return device_connection_fwnode_match(con);
107
84 for (bus = generic_match_buses[0]; bus; bus++) { 108 for (bus = generic_match_buses[0]; bus; bus++) {
85 dev = bus_find_device_by_name(bus, NULL, con->endpoint[ep]); 109 dev = bus_find_device_by_name(bus, NULL, con->endpoint[ep]);
86 if (dev) 110 if (dev)