diff options
Diffstat (limited to 'drivers/base/devcon.c')
| -rw-r--r-- | drivers/base/devcon.c | 51 | 
1 files changed, 32 insertions, 19 deletions
diff --git a/drivers/base/devcon.c b/drivers/base/devcon.c index 09f28479b243..14e2178e09f8 100644 --- a/drivers/base/devcon.c +++ b/drivers/base/devcon.c @@ -12,9 +12,6 @@  static DEFINE_MUTEX(devcon_lock);  static LIST_HEAD(devcon_list); -typedef void *(*devcon_match_fn_t)(struct device_connection *con, int ep, -				   void *data); -  static void *  fwnode_graph_devcon_match(struct fwnode_handle *fwnode, const char *con_id,  			  void *data, devcon_match_fn_t match) @@ -61,6 +58,34 @@ fwnode_devcon_match(struct fwnode_handle *fwnode, const char *con_id,  }  /** + * fwnode_connection_find_match - Find connection from a device node + * @fwnode: Device node with the connection + * @con_id: Identifier for the connection + * @data: Data for the match function + * @match: Function to check and convert the connection description + * + * Find a connection with unique identifier @con_id between @fwnode and another + * device node. @match will be used to convert the connection description to + * data the caller is expecting to be returned. + */ +void *fwnode_connection_find_match(struct fwnode_handle *fwnode, +				   const char *con_id, void *data, +				   devcon_match_fn_t match) +{ +	void *ret; + +	if (!fwnode || !match) +		return NULL; + +	ret = fwnode_graph_devcon_match(fwnode, con_id, data, match); +	if (ret) +		return ret; + +	return fwnode_devcon_match(fwnode, con_id, data, match); +} +EXPORT_SYMBOL_GPL(fwnode_connection_find_match); + +/**   * device_connection_find_match - Find physical connection to a device   * @dev: Device with the connection   * @con_id: Identifier for the connection @@ -83,15 +108,9 @@ void *device_connection_find_match(struct device *dev, const char *con_id,  	if (!match)  		return NULL; -	if (fwnode) { -		ret = fwnode_graph_devcon_match(fwnode, con_id, data, match); -		if (ret) -			return ret; - -		ret = fwnode_devcon_match(fwnode, con_id, data, match); -		if (ret) -			return ret; -	} +	ret = fwnode_connection_find_match(fwnode, con_id, data, match); +	if (ret) +		return ret;  	mutex_lock(&devcon_lock); @@ -133,19 +152,13 @@ static struct bus_type *generic_match_buses[] = {  	NULL,  }; -static int device_fwnode_match(struct device *dev, const 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); +		dev = bus_find_device_by_fwnode(bus, con->fwnode);  		if (dev && !strncmp(dev_name(dev), con->id, strlen(con->id)))  			return dev;  |