Revert "OF: base: match each node compatible against all given matches first"
This reverts commit 105353145e
.
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: Stephen N Chivers <schivers@csc.com.au>
Cc: Sebastian Hesselbarth <sebastian.hesselbarth@gmail.com>
Signed-off-by: Kevin Hao <haokexin@gmail.com>
Signed-off-by: Rob Herring <robh@kernel.org>
This commit is contained in:
parent
860a445c25
commit
4e8ca6ee3a
1 changed files with 16 additions and 37 deletions
|
@ -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 {
|
int match = 1;
|
||||||
const struct of_device_id *m = matches;
|
if (matches->name[0])
|
||||||
|
match &= node->name
|
||||||
/* Check against matches with current compatible string */
|
&& !strcmp(matches->name, node->name);
|
||||||
while (m->name[0] || m->type[0] || m->compatible[0]) {
|
if (matches->type[0])
|
||||||
int match = 1;
|
match &= node->type
|
||||||
if (m->name[0])
|
&& !strcmp(matches->type, node->type);
|
||||||
match &= node->name
|
if (matches->compatible[0])
|
||||||
&& !strcmp(m->name, node->name);
|
match &= __of_device_is_compatible(node,
|
||||||
if (m->type[0])
|
matches->compatible);
|
||||||
match &= node->type
|
if (match)
|
||||||
&& !strcmp(m->type, node->type);
|
return matches;
|
||||||
if (m->compatible[0])
|
matches++;
|
||||||
match &= cp
|
}
|
||||||
&& !of_compat_cmp(m->compatible, cp,
|
|
||||||
strlen(m->compatible));
|
|
||||||
if (match)
|
|
||||||
return m;
|
|
||||||
m++;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* 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)
|
||||||
|
|
Loading…
Add table
Reference in a new issue