Commit 107a84e6 authored by Thierry Reding's avatar Thierry Reding Committed by Rob Herring

of: match by compatible property first

When matching devices against an OF device ID table, the first string of
the compatible property that is listed in the table should match,
regardless of its position in the table.

Cc: Grant Likely <grant.likely@secretlab.ca>
Cc: Rob Herring <rob.herring@calxeda.com>
Cc: devicetree-discuss@lists.ozlabs.org
Signed-off-by: default avatarThierry Reding <thierry.reding@avionic-design.de>
Signed-off-by: default avatarRob Herring <rob.herring@calxeda.com>
parent d44115f2
...@@ -511,6 +511,22 @@ struct device_node *of_find_node_with_property(struct device_node *from, ...@@ -511,6 +511,22 @@ struct device_node *of_find_node_with_property(struct device_node *from,
} }
EXPORT_SYMBOL(of_find_node_with_property); EXPORT_SYMBOL(of_find_node_with_property);
static const struct of_device_id *of_match_compat(const struct of_device_id *matches,
const char *compat)
{
while (matches->name[0] || matches->type[0] || matches->compatible[0]) {
const char *cp = matches->compatible;
int len = strlen(cp);
if (len > 0 && of_compat_cmp(compat, cp, len) == 0)
return matches;
matches++;
}
return NULL;
}
/** /**
* of_match_node - Tell if an device_node has a matching of_match structure * of_match_node - Tell if an device_node has a matching of_match structure
* @matches: array of of device match structures to search in * @matches: array of of device match structures to search in
...@@ -521,9 +537,18 @@ EXPORT_SYMBOL(of_find_node_with_property); ...@@ -521,9 +537,18 @@ EXPORT_SYMBOL(of_find_node_with_property);
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)
{ {
struct property *prop;
const char *cp;
if (!matches) if (!matches)
return NULL; return NULL;
of_property_for_each_string(node, "compatible", prop, cp) {
const struct of_device_id *match = of_match_compat(matches, cp);
if (match)
return match;
}
while (matches->name[0] || matches->type[0] || matches->compatible[0]) { while (matches->name[0] || matches->type[0] || matches->compatible[0]) {
int match = 1; int match = 1;
if (matches->name[0]) if (matches->name[0])
...@@ -532,10 +557,7 @@ const struct of_device_id *of_match_node(const struct of_device_id *matches, ...@@ -532,10 +557,7 @@ const struct of_device_id *of_match_node(const struct of_device_id *matches,
if (matches->type[0]) if (matches->type[0])
match &= node->type match &= node->type
&& !strcmp(matches->type, node->type); && !strcmp(matches->type, node->type);
if (matches->compatible[0]) if (match && !matches->compatible[0])
match &= of_device_is_compatible(node,
matches->compatible);
if (match)
return matches; return matches;
matches++; matches++;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment