Commit fde77779 authored by Heikki Krogerus's avatar Heikki Krogerus Committed by Rafael J. Wysocki
Browse files

device connection: Find connections also by checking the references



We can also use this API to find named references that the
device nodes have by using fwnode_property_get_reference_args()
function.

Signed-off-by: default avatarHeikki Krogerus <heikki.krogerus@linux.intel.com>
Tested-by: default avatarHans de Goede <hdegoede@redhat.com>
Signed-off-by: default avatarRafael J. Wysocki <rafael.j.wysocki@intel.com>
parent 83b34afb
Loading
Loading
Loading
Loading
+26 −0
Original line number Diff line number Diff line
@@ -38,6 +38,28 @@ fwnode_graph_devcon_match(struct fwnode_handle *fwnode, const char *con_id,
	return NULL;
}

static void *
fwnode_devcon_match(struct fwnode_handle *fwnode, const char *con_id,
		    void *data, devcon_match_fn_t match)
{
	struct device_connection con = { };
	void *ret;
	int i;

	for (i = 0; ; i++) {
		con.fwnode = fwnode_find_reference(fwnode, con_id, i);
		if (IS_ERR(con.fwnode))
			break;

		ret = match(&con, -1, data);
		fwnode_handle_put(con.fwnode);
		if (ret)
			return ret;
	}

	return NULL;
}

/**
 * device_connection_find_match - Find physical connection to a device
 * @dev: Device with the connection
@@ -65,6 +87,10 @@ void *device_connection_find_match(struct device *dev, const char *con_id,
		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;
	}

	mutex_lock(&devcon_lock);
+1 −1
Original line number Diff line number Diff line
@@ -101,7 +101,7 @@ static void *usb_role_switch_match(struct device_connection *con, int ep,
	struct device *dev;

	if (con->fwnode) {
		if (!fwnode_property_present(con->fwnode, con->id))
		if (con->id && !fwnode_property_present(con->fwnode, con->id))
			return NULL;

		dev = class_find_device(role_class, NULL, con->fwnode,