Commit 102162db authored by James Clark's avatar James Clark Committed by Suzuki K Poulose
Browse files

coresight: Simplify connection fixup mechanism



There is some duplication between coresight_fixup_device_conns() and
coresight_fixup_orphan_conns(). They both do the same thing except for
the fact that coresight_fixup_orphan_conns() can't handle iterating over
itself.

By making it able to handle fixing up it's own connections the other
function can be removed.

Reviewed-by: default avatarMike Leach <mike.leach@linaro.org>
Signed-off-by: default avatarJames Clark <james.clark@arm.com>
Signed-off-by: default avatarSuzuki K Poulose <suzuki.poulose@arm.com>
Link: https://lore.kernel.org/r/20230425143542.2305069-9-james.clark@arm.com
parent 4e8fe7e5
Loading
Loading
Loading
Loading
+32 −52
Original line number Diff line number Diff line
@@ -1316,32 +1316,37 @@ static int coresight_orphan_match(struct device *dev, void *data)
{
	int i, ret = 0;
	bool still_orphan = false;
	struct coresight_device *csdev, *i_csdev;
	struct coresight_device *dst_csdev = data;
	struct coresight_device *src_csdev = to_coresight_device(dev);
	struct coresight_connection *conn;

	csdev = data;
	i_csdev = to_coresight_device(dev);

	/* No need to check oneself */
	if (csdev == i_csdev)
		return 0;
	bool fixup_self = (src_csdev == dst_csdev);

	/* Move on to another component if no connection is orphan */
	if (!i_csdev->orphan)
	if (!src_csdev->orphan)
		return 0;
	/*
	 * Circle throuch all the connection of that component.  If we find
	 * an orphan connection whose name matches @csdev, link it.
	 * Circle through all the connections of that component.  If we find
	 * an orphan connection whose name matches @dst_csdev, link it.
	 */
	for (i = 0; i < i_csdev->pdata->nr_outconns; i++) {
		conn = i_csdev->pdata->out_conns[i];
	for (i = 0; i < src_csdev->pdata->nr_outconns; i++) {
		conn = src_csdev->pdata->out_conns[i];

		/* Skip the port if it's already connected. */
		if (conn->dest_dev)
			continue;

		/*
		 * If we are at the "new" device, which triggered this search,
		 * we must find the remote device from the fwnode in the
		 * connection.
		 */
		if (fixup_self)
			dst_csdev = coresight_find_csdev_by_fwnode(
				conn->dest_fwnode);

		/* We have found at least one orphan connection */
		if (conn->dest_dev == NULL) {
		/* Does it match this newly added device? */
			if (conn->dest_fwnode == csdev->dev.fwnode) {
				ret = coresight_make_links(i_csdev,
							   conn, csdev);
		if (dst_csdev && conn->dest_fwnode == dst_csdev->dev.fwnode) {
			ret = coresight_make_links(src_csdev, conn, dst_csdev);
			if (ret)
				return ret;
		} else {
@@ -1349,9 +1354,8 @@ static int coresight_orphan_match(struct device *dev, void *data)
			still_orphan = true;
		}
	}
	}

	i_csdev->orphan = still_orphan;
	src_csdev->orphan = still_orphan;

	/*
	 * Returning '0' in case we didn't encounter any error,
@@ -1366,28 +1370,6 @@ static int coresight_fixup_orphan_conns(struct coresight_device *csdev)
			 csdev, coresight_orphan_match);
}


static int coresight_fixup_device_conns(struct coresight_device *csdev)
{
	int i, ret = 0;

	for (i = 0; i < csdev->pdata->nr_outconns; i++) {
		struct coresight_connection *conn = csdev->pdata->out_conns[i];

		conn->dest_dev =
			coresight_find_csdev_by_fwnode(conn->dest_fwnode);
		if (conn->dest_dev && conn->dest_dev->has_conns_grp) {
			ret = coresight_make_links(csdev, conn, conn->dest_dev);
			if (ret)
				break;
		} else {
			csdev->orphan = true;
		}
	}

	return ret;
}

static int coresight_remove_match(struct device *dev, void *data)
{
	int i;
@@ -1595,7 +1577,7 @@ struct coresight_device *coresight_register(struct coresight_desc *desc)
	csdev->subtype = desc->subtype;
	csdev->ops = desc->ops;
	csdev->access = desc->access;
	csdev->orphan = false;
	csdev->orphan = true;

	csdev->dev.type = &coresight_dev_type[desc->type];
	csdev->dev.groups = desc->groups;
@@ -1645,8 +1627,6 @@ struct coresight_device *coresight_register(struct coresight_desc *desc)
	registered = true;

	ret = coresight_create_conns_sysfs_group(csdev);
	if (!ret)
		ret = coresight_fixup_device_conns(csdev);
	if (!ret)
		ret = coresight_fixup_orphan_conns(csdev);