Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 44493062 authored by Heikki Krogerus's avatar Heikki Krogerus Committed by Greg Kroah-Hartman
Browse files

device connection: Add fwnode_connection_find_match()



The fwnode_connection_find_match() function is exactly the
same as device_connection_find_match(), except it takes
struct fwnode_handle as parameter instead of struct device.
That allows locating device connections before the device
entries have been created.

Signed-off-by: default avatarHeikki Krogerus <heikki.krogerus@linux.intel.com>
Signed-off-by: default avatarChunfeng Yun <chunfeng.yun@mediatek.com>
Link: https://lore.kernel.org/r/1567070558-29417-7-git-send-email-chunfeng.yun@mediatek.com


Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 97760765
Loading
Loading
Loading
Loading
+31 −12
Original line number Diff line number Diff line
@@ -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)
@@ -60,6 +57,34 @@ fwnode_devcon_match(struct fwnode_handle *fwnode, const char *con_id,
	return NULL;
}

/**
 * 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
@@ -83,16 +108,10 @@ 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);
	ret = fwnode_connection_find_match(fwnode, con_id, data, match);
	if (ret)
		return ret;

		ret = fwnode_devcon_match(fwnode, con_id, data, match);
		if (ret)
			return ret;
	}

	mutex_lock(&devcon_lock);

	list_for_each_entry(con, &devcon_list, list) {
+7 −3
Original line number Diff line number Diff line
@@ -781,10 +781,14 @@ struct device_connection {
	struct list_head	list;
};

typedef void *(*devcon_match_fn_t)(struct device_connection *con, int ep,
				   void *data);

void *fwnode_connection_find_match(struct fwnode_handle *fwnode,
				   const char *con_id, void *data,
				   devcon_match_fn_t match);
void *device_connection_find_match(struct device *dev, const char *con_id,
				void *data,
				void *(*match)(struct device_connection *con,
					       int ep, void *data));
				   void *data, devcon_match_fn_t match);

struct device *device_connection_find(struct device *dev, const char *con_id);