diff options
author | Grant Likely <grant.likely@secretlab.ca> | 2010-10-30 11:49:09 -0400 |
---|---|---|
committer | Grant Likely <grant.likely@secretlab.ca> | 2011-01-01 15:03:25 -0500 |
commit | a4f740cf33f7f6c164bbde3c0cdbcc77b0c4997c (patch) | |
tree | 62d061939000c65d91cf760a51509d388270f4c9 /drivers/of | |
parent | 73930a85cf38d72851305fcf640c07b4c13aa405 (diff) |
of/flattree: Add of_flat_dt_match() helper function
This patch adds of_flat_dt_match() which tests a node for
compatibility with a list of values and converts the relevant powerpc
platform code to use it. This approach simplifies the board support
code a bit.
Signed-off-by: Grant Likely <grant.likely@secretlab.ca>
Reviewed-by: Stephen Neuendorffer <stephen.neuendorffer@xilinx.com>
Diffstat (limited to 'drivers/of')
-rw-r--r-- | drivers/of/fdt.c | 37 |
1 files changed, 35 insertions, 2 deletions
diff --git a/drivers/of/fdt.c b/drivers/of/fdt.c index 8a90ee42071a..c787c3d95c60 100644 --- a/drivers/of/fdt.c +++ b/drivers/of/fdt.c | |||
@@ -78,19 +78,23 @@ void *of_fdt_get_property(struct boot_param_header *blob, | |||
78 | * @blob: A device tree blob | 78 | * @blob: A device tree blob |
79 | * @node: node to test | 79 | * @node: node to test |
80 | * @compat: compatible string to compare with compatible list. | 80 | * @compat: compatible string to compare with compatible list. |
81 | * | ||
82 | * On match, returns a non-zero value with smaller values returned for more | ||
83 | * specific compatible values. | ||
81 | */ | 84 | */ |
82 | int of_fdt_is_compatible(struct boot_param_header *blob, | 85 | int of_fdt_is_compatible(struct boot_param_header *blob, |
83 | unsigned long node, const char *compat) | 86 | unsigned long node, const char *compat) |
84 | { | 87 | { |
85 | const char *cp; | 88 | const char *cp; |
86 | unsigned long cplen, l; | 89 | unsigned long cplen, l, score = 0; |
87 | 90 | ||
88 | cp = of_fdt_get_property(blob, node, "compatible", &cplen); | 91 | cp = of_fdt_get_property(blob, node, "compatible", &cplen); |
89 | if (cp == NULL) | 92 | if (cp == NULL) |
90 | return 0; | 93 | return 0; |
91 | while (cplen > 0) { | 94 | while (cplen > 0) { |
95 | score++; | ||
92 | if (of_compat_cmp(cp, compat, strlen(compat)) == 0) | 96 | if (of_compat_cmp(cp, compat, strlen(compat)) == 0) |
93 | return 1; | 97 | return score; |
94 | l = strlen(cp) + 1; | 98 | l = strlen(cp) + 1; |
95 | cp += l; | 99 | cp += l; |
96 | cplen -= l; | 100 | cplen -= l; |
@@ -99,6 +103,27 @@ int of_fdt_is_compatible(struct boot_param_header *blob, | |||
99 | return 0; | 103 | return 0; |
100 | } | 104 | } |
101 | 105 | ||
106 | /** | ||
107 | * of_fdt_match - Return true if node matches a list of compatible values | ||
108 | */ | ||
109 | int of_fdt_match(struct boot_param_header *blob, unsigned long node, | ||
110 | const char **compat) | ||
111 | { | ||
112 | unsigned int tmp, score = 0; | ||
113 | |||
114 | if (!compat) | ||
115 | return 0; | ||
116 | |||
117 | while (*compat) { | ||
118 | tmp = of_fdt_is_compatible(blob, node, *compat); | ||
119 | if (tmp && (score == 0 || (tmp < score))) | ||
120 | score = tmp; | ||
121 | compat++; | ||
122 | } | ||
123 | |||
124 | return score; | ||
125 | } | ||
126 | |||
102 | static void *unflatten_dt_alloc(unsigned long *mem, unsigned long size, | 127 | static void *unflatten_dt_alloc(unsigned long *mem, unsigned long size, |
103 | unsigned long align) | 128 | unsigned long align) |
104 | { | 129 | { |
@@ -511,6 +536,14 @@ int __init of_flat_dt_is_compatible(unsigned long node, const char *compat) | |||
511 | return of_fdt_is_compatible(initial_boot_params, node, compat); | 536 | return of_fdt_is_compatible(initial_boot_params, node, compat); |
512 | } | 537 | } |
513 | 538 | ||
539 | /** | ||
540 | * of_flat_dt_match - Return true if node matches a list of compatible values | ||
541 | */ | ||
542 | int __init of_flat_dt_match(unsigned long node, const char **compat) | ||
543 | { | ||
544 | return of_fdt_match(initial_boot_params, node, compat); | ||
545 | } | ||
546 | |||
514 | #ifdef CONFIG_BLK_DEV_INITRD | 547 | #ifdef CONFIG_BLK_DEV_INITRD |
515 | /** | 548 | /** |
516 | * early_init_dt_check_for_initrd - Decode initrd location from flat tree | 549 | * early_init_dt_check_for_initrd - Decode initrd location from flat tree |