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

Commit 4e8ca6ee authored by Kevin Hao's avatar Kevin Hao Committed by Rob Herring
Browse files

Revert "OF: base: match each node compatible against all given matches first"



This reverts commit 10535314.
Stephen Chivers reported this is broken as we will get a match
entry '.type = "serial"' instead of the '.compatible = "ns16550"'
in the following scenario:
	serial0: serial@4500 {
		compatible = "fsl,ns16550", "ns16550";
	}

	struct of_device_id of_platform_serial_table[] = {
		{ .compatible = "ns8250",   .data = (void *)PORT_8250, },
		{ .compatible = "ns16450",  .data = (void *)PORT_16450, },
		{ .compatible = "ns16550a", .data = (void *)PORT_16550A, },
		{ .compatible = "ns16550",  .data = (void *)PORT_16550, },
		{ .compatible = "ns16750",  .data = (void *)PORT_16750, },
		{ .compatible = "ns16850",  .data = (void *)PORT_16850, },
		...
		{ .type = "serial",         .data = (void *)PORT_UNKNOWN, },
		{ /* end of list */ },
	};

So just revert this patch, we will use another implementation to find
the best compatible match in a follow-on patch.

Reported-by: default avatarStephen N Chivers <schivers@csc.com.au>
Cc: Sebastian Hesselbarth <sebastian.hesselbarth@gmail.com>
Signed-off-by: default avatarKevin Hao <haokexin@gmail.com>
Signed-off-by: default avatarRob Herring <robh@kernel.org>
parent 860a445c
Loading
Loading
Loading
Loading
+16 −37
Original line number Original line Diff line number Diff line
@@ -734,42 +734,24 @@ static
const struct of_device_id *__of_match_node(const struct of_device_id *matches,
const struct of_device_id *__of_match_node(const struct of_device_id *matches,
					   const struct device_node *node)
					   const struct device_node *node)
{
{
	const char *cp;
	int cplen, l;

	if (!matches)
	if (!matches)
		return NULL;
		return NULL;


	cp = __of_get_property(node, "compatible", &cplen);
	while (matches->name[0] || matches->type[0] || matches->compatible[0]) {
	do {
		const struct of_device_id *m = matches;

		/* Check against matches with current compatible string */
		while (m->name[0] || m->type[0] || m->compatible[0]) {
		int match = 1;
		int match = 1;
			if (m->name[0])
		if (matches->name[0])
			match &= node->name
			match &= node->name
					&& !strcmp(m->name, node->name);
				&& !strcmp(matches->name, node->name);
			if (m->type[0])
		if (matches->type[0])
			match &= node->type
			match &= node->type
					&& !strcmp(m->type, node->type);
				&& !strcmp(matches->type, node->type);
			if (m->compatible[0])
		if (matches->compatible[0])
				match &= cp
			match &= __of_device_is_compatible(node,
					&& !of_compat_cmp(m->compatible, cp,
							   matches->compatible);
							strlen(m->compatible));
		if (match)
		if (match)
				return m;
			return matches;
			m++;
		matches++;
	}
	}

		/* Get node's next compatible string */ 
		if (cp) {
			l = strlen(cp) + 1;
			cp += l;
			cplen -= l;
		}
	} while (cp && (cplen > 0));

	return NULL;
	return NULL;
}
}


@@ -778,10 +760,7 @@ const struct of_device_id *__of_match_node(const struct of_device_id *matches,
 *	@matches:	array of of device match structures to search in
 *	@matches:	array of of device match structures to search in
 *	@node:		the of device structure to match against
 *	@node:		the of device structure to match against
 *
 *
 *	Low level utility function used by device matching. Matching order
 *	Low level utility function used by device matching.
 *	is to compare each of the node's compatibles with all given matches
 *	first. This implies node's compatible is sorted from specific to
 *	generic while matches can be in any order.
 */
 */
const struct of_device_id *of_match_node(const struct of_device_id *matches,
const struct of_device_id *of_match_node(const struct of_device_id *matches,
					 const struct device_node *node)
					 const struct device_node *node)