diff options
-rw-r--r-- | drivers/of/base.c | 43 |
1 files changed, 42 insertions, 1 deletions
diff --git a/drivers/of/base.c b/drivers/of/base.c index ba195fbce4c6..10b51106c854 100644 --- a/drivers/of/base.c +++ b/drivers/of/base.c | |||
@@ -730,13 +730,49 @@ out: | |||
730 | } | 730 | } |
731 | EXPORT_SYMBOL(of_find_node_with_property); | 731 | EXPORT_SYMBOL(of_find_node_with_property); |
732 | 732 | ||
733 | static const struct of_device_id * | ||
734 | of_match_compatible(const struct of_device_id *matches, | ||
735 | const struct device_node *node) | ||
736 | { | ||
737 | const char *cp; | ||
738 | int cplen, l; | ||
739 | const struct of_device_id *m; | ||
740 | |||
741 | cp = __of_get_property(node, "compatible", &cplen); | ||
742 | while (cp && (cplen > 0)) { | ||
743 | m = matches; | ||
744 | while (m->name[0] || m->type[0] || m->compatible[0]) { | ||
745 | /* Only match for the entries without type and name */ | ||
746 | if (m->name[0] || m->type[0] || | ||
747 | of_compat_cmp(m->compatible, cp, | ||
748 | strlen(m->compatible))) | ||
749 | m++; | ||
750 | else | ||
751 | return m; | ||
752 | } | ||
753 | |||
754 | /* Get node's next compatible string */ | ||
755 | l = strlen(cp) + 1; | ||
756 | cp += l; | ||
757 | cplen -= l; | ||
758 | } | ||
759 | |||
760 | return NULL; | ||
761 | } | ||
762 | |||
733 | static | 763 | static |
734 | const struct of_device_id *__of_match_node(const struct of_device_id *matches, | 764 | const struct of_device_id *__of_match_node(const struct of_device_id *matches, |
735 | const struct device_node *node) | 765 | const struct device_node *node) |
736 | { | 766 | { |
767 | const struct of_device_id *m; | ||
768 | |||
737 | if (!matches) | 769 | if (!matches) |
738 | return NULL; | 770 | return NULL; |
739 | 771 | ||
772 | m = of_match_compatible(matches, node); | ||
773 | if (m) | ||
774 | return m; | ||
775 | |||
740 | while (matches->name[0] || matches->type[0] || matches->compatible[0]) { | 776 | while (matches->name[0] || matches->type[0] || matches->compatible[0]) { |
741 | int match = 1; | 777 | int match = 1; |
742 | if (matches->name[0]) | 778 | if (matches->name[0]) |
@@ -760,7 +796,12 @@ const struct of_device_id *__of_match_node(const struct of_device_id *matches, | |||
760 | * @matches: array of of device match structures to search in | 796 | * @matches: array of of device match structures to search in |
761 | * @node: the of device structure to match against | 797 | * @node: the of device structure to match against |
762 | * | 798 | * |
763 | * Low level utility function used by device matching. | 799 | * Low level utility function used by device matching. We have two ways |
800 | * of matching: | ||
801 | * - Try to find the best compatible match by comparing each compatible | ||
802 | * string of device node with all the given matches respectively. | ||
803 | * - If the above method failed, then try to match the compatible by using | ||
804 | * __of_device_is_compatible() besides the match in type and name. | ||
764 | */ | 805 | */ |
765 | const struct of_device_id *of_match_node(const struct of_device_id *matches, | 806 | const struct of_device_id *of_match_node(const struct of_device_id *matches, |
766 | const struct device_node *node) | 807 | const struct device_node *node) |