diff options
Diffstat (limited to 'drivers')
| -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) |
