diff options
author | Heikki Krogerus <heikki.krogerus@linux.intel.com> | 2019-02-13 02:45:56 -0500 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2019-02-14 04:52:25 -0500 |
commit | 80e04837a40f6f1c8e93437be3f772c967a41d2f (patch) | |
tree | d5307091273f36e9ba62182dd5b8e5f58a37765b /drivers/base/devcon.c | |
parent | 393cd68d0dd3cbaacd8b1ee571d4105a170cf856 (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.c | 24 |
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 | ||
78 | static int device_fwnode_match(struct device *dev, void *fwnode) | ||
79 | { | ||
80 | return dev_fwnode(dev) == fwnode; | ||
81 | } | ||
82 | |||
83 | static 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. */ |
79 | static void *generic_match(struct device_connection *con, int ep, void *data) | 100 | static 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) |