aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/of/base.c
diff options
context:
space:
mode:
authorKevin Hao <haokexin@gmail.com>2014-02-18 02:57:29 -0500
committerGrant Likely <grant.likely@linaro.org>2014-02-18 17:32:09 -0500
commit71c5498eed06b5ac4325a525ed83aeed3e9a250a (patch)
treeeb4ed428ce97129e7245c26d0acf05c2a9eb9536 /drivers/of/base.c
parent60f76eab19e3903e810bdc3ec846c158efcd2e21 (diff)
Revert "of: search the best compatible match first in __of_match_node()"
This reverts commit 06b29e76a74b2373e6f8b5a7938b3630b9ae98b2. As pointed out by Grant Likely, we should also take the type and name into account when searching the best compatible match. That means the match with compatible, type and name should be better than the match just with the same compatible string. So revert this and we will implement another method to find the best match entry. Signed-off-by: Kevin Hao <haokexin@gmail.com> Signed-off-by: Grant Likely <grant.likely@linaro.org>
Diffstat (limited to 'drivers/of/base.c')
-rw-r--r--drivers/of/base.c43
1 files changed, 1 insertions, 42 deletions
diff --git a/drivers/of/base.c b/drivers/of/base.c
index 10b51106c854..ba195fbce4c6 100644
--- a/drivers/of/base.c
+++ b/drivers/of/base.c
@@ -730,49 +730,13 @@ out:
730} 730}
731EXPORT_SYMBOL(of_find_node_with_property); 731EXPORT_SYMBOL(of_find_node_with_property);
732 732
733static const struct of_device_id *
734of_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
763static 733static
764const struct of_device_id *__of_match_node(const struct of_device_id *matches, 734const struct of_device_id *__of_match_node(const struct of_device_id *matches,
765 const struct device_node *node) 735 const struct device_node *node)
766{ 736{
767 const struct of_device_id *m;
768
769 if (!matches) 737 if (!matches)
770 return NULL; 738 return NULL;
771 739
772 m = of_match_compatible(matches, node);
773 if (m)
774 return m;
775
776 while (matches->name[0] || matches->type[0] || matches->compatible[0]) { 740 while (matches->name[0] || matches->type[0] || matches->compatible[0]) {
777 int match = 1; 741 int match = 1;
778 if (matches->name[0]) 742 if (matches->name[0])
@@ -796,12 +760,7 @@ const struct of_device_id *__of_match_node(const struct of_device_id *matches,
796 * @matches: array of of device match structures to search in 760 * @matches: array of of device match structures to search in
797 * @node: the of device structure to match against 761 * @node: the of device structure to match against
798 * 762 *
799 * Low level utility function used by device matching. We have two ways 763 * Low level utility function used by device matching.
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.
805 */ 764 */
806const struct of_device_id *of_match_node(const struct of_device_id *matches, 765const struct of_device_id *of_match_node(const struct of_device_id *matches,
807 const struct device_node *node) 766 const struct device_node *node)