diff options
-rw-r--r-- | drivers/of/base.c | 30 |
1 files changed, 26 insertions, 4 deletions
diff --git a/drivers/of/base.c b/drivers/of/base.c index d9bfd49b1935..eada3f4ef801 100644 --- a/drivers/of/base.c +++ b/drivers/of/base.c | |||
@@ -511,6 +511,22 @@ out: | |||
511 | } | 511 | } |
512 | EXPORT_SYMBOL(of_find_node_with_property); | 512 | EXPORT_SYMBOL(of_find_node_with_property); |
513 | 513 | ||
514 | static const struct of_device_id *of_match_compat(const struct of_device_id *matches, | ||
515 | const char *compat) | ||
516 | { | ||
517 | while (matches->name[0] || matches->type[0] || matches->compatible[0]) { | ||
518 | const char *cp = matches->compatible; | ||
519 | int len = strlen(cp); | ||
520 | |||
521 | if (len > 0 && of_compat_cmp(compat, cp, len) == 0) | ||
522 | return matches; | ||
523 | |||
524 | matches++; | ||
525 | } | ||
526 | |||
527 | return NULL; | ||
528 | } | ||
529 | |||
514 | /** | 530 | /** |
515 | * of_match_node - Tell if an device_node has a matching of_match structure | 531 | * of_match_node - Tell if an device_node has a matching of_match structure |
516 | * @matches: array of of device match structures to search in | 532 | * @matches: array of of device match structures to search in |
@@ -521,9 +537,18 @@ EXPORT_SYMBOL(of_find_node_with_property); | |||
521 | const struct of_device_id *of_match_node(const struct of_device_id *matches, | 537 | const struct of_device_id *of_match_node(const struct of_device_id *matches, |
522 | const struct device_node *node) | 538 | const struct device_node *node) |
523 | { | 539 | { |
540 | struct property *prop; | ||
541 | const char *cp; | ||
542 | |||
524 | if (!matches) | 543 | if (!matches) |
525 | return NULL; | 544 | return NULL; |
526 | 545 | ||
546 | of_property_for_each_string(node, "compatible", prop, cp) { | ||
547 | const struct of_device_id *match = of_match_compat(matches, cp); | ||
548 | if (match) | ||
549 | return match; | ||
550 | } | ||
551 | |||
527 | while (matches->name[0] || matches->type[0] || matches->compatible[0]) { | 552 | while (matches->name[0] || matches->type[0] || matches->compatible[0]) { |
528 | int match = 1; | 553 | int match = 1; |
529 | if (matches->name[0]) | 554 | if (matches->name[0]) |
@@ -532,10 +557,7 @@ const struct of_device_id *of_match_node(const struct of_device_id *matches, | |||
532 | if (matches->type[0]) | 557 | if (matches->type[0]) |
533 | match &= node->type | 558 | match &= node->type |
534 | && !strcmp(matches->type, node->type); | 559 | && !strcmp(matches->type, node->type); |
535 | if (matches->compatible[0]) | 560 | if (match && !matches->compatible[0]) |
536 | match &= of_device_is_compatible(node, | ||
537 | matches->compatible); | ||
538 | if (match) | ||
539 | return matches; | 561 | return matches; |
540 | matches++; | 562 | matches++; |
541 | } | 563 | } |