From: Heikki Krogerus Date: Wed, 13 Feb 2019 07:45:56 +0000 (+0300) Subject: device connection: Prepare support for firmware described connections X-Git-Tag: v5.4-rc1~1507^2~36 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=80e04837a40f6f1c8e93437be3f772c967a41d2f;p=platform%2Fkernel%2Flinux-rpi.git 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 Reviewed-by: Andy Shevchenko Reviewed-by: Jun Li Tested-by: Jun Li Signed-off-by: Heikki Krogerus Signed-off-by: Greg Kroah-Hartman --- diff --git a/drivers/base/devcon.c b/drivers/base/devcon.c index d427e80..858b8d2 100644 --- a/drivers/base/devcon.c +++ b/drivers/base/devcon.c @@ -75,12 +75,36 @@ static struct bus_type *generic_match_buses[] = { NULL, }; +static int device_fwnode_match(struct device *dev, void *fwnode) +{ + return dev_fwnode(dev) == fwnode; +} + +static void *device_connection_fwnode_match(struct device_connection *con) +{ + struct bus_type *bus; + struct device *dev; + + for (bus = generic_match_buses[0]; bus; bus++) { + dev = bus_find_device(bus, NULL, (void *)con->fwnode, + device_fwnode_match); + if (dev && !strncmp(dev_name(dev), con->id, strlen(con->id))) + return dev; + + put_device(dev); + } + return NULL; +} + /* This tries to find the device from the most common bus types by name. */ static void *generic_match(struct device_connection *con, int ep, void *data) { struct bus_type *bus; struct device *dev; + if (con->fwnode) + return device_connection_fwnode_match(con); + for (bus = generic_match_buses[0]; bus; bus++) { dev = bus_find_device_by_name(bus, NULL, con->endpoint[ep]); if (dev)