aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGrant Likely <grant.likely@secretlab.ca>2013-02-08 04:23:33 -0500
committerGrant Likely <grant.likely@secretlab.ca>2013-02-08 04:23:33 -0500
commitd2f4ec1026fecbef9b72cc899a626516ef3f265f (patch)
tree3b9ed2b015cc714151fba71244f3dbba300cc3ac
parent12514aa0e6c6ca4e03b8a4da557b7d3ee0d91f5d (diff)
parenteb7ccb8184ab36b61fb596bd8d573e22e04d6266 (diff)
Merge branch 'robherring/for-next' from git://sources.calxeda.com/kernel/linux.git
Signed-off-by: Grant Likely <grant.likely@secretlab.ca>
-rw-r--r--Documentation/devicetree/bindings/vendor-prefixes.txt3
-rw-r--r--drivers/of/base.c95
2 files changed, 76 insertions, 22 deletions
diff --git a/Documentation/devicetree/bindings/vendor-prefixes.txt b/Documentation/devicetree/bindings/vendor-prefixes.txt
index 902b1b1f568e..4519dff3f506 100644
--- a/Documentation/devicetree/bindings/vendor-prefixes.txt
+++ b/Documentation/devicetree/bindings/vendor-prefixes.txt
@@ -14,6 +14,7 @@ bosch Bosch Sensortec GmbH
14brcm Broadcom Corporation 14brcm Broadcom Corporation
15cavium Cavium, Inc. 15cavium Cavium, Inc.
16chrp Common Hardware Reference Platform 16chrp Common Hardware Reference Platform
17cirrus Cirrus Logic, Inc.
17cortina Cortina Systems, Inc. 18cortina Cortina Systems, Inc.
18dallas Maxim Integrated Products (formerly Dallas Semiconductor) 19dallas Maxim Integrated Products (formerly Dallas Semiconductor)
19denx Denx Software Engineering 20denx Denx Software Engineering
@@ -42,6 +43,7 @@ powervr PowerVR (deprecated, use img)
42qcom Qualcomm, Inc. 43qcom Qualcomm, Inc.
43ramtron Ramtron International 44ramtron Ramtron International
44realtek Realtek Semiconductor Corp. 45realtek Realtek Semiconductor Corp.
46renesas Renesas Electronics Corporation
45samsung Samsung Semiconductor 47samsung Samsung Semiconductor
46sbs Smart Battery System 48sbs Smart Battery System
47schindler Schindler 49schindler Schindler
@@ -52,6 +54,7 @@ snps Synopsys, Inc.
52st STMicroelectronics 54st STMicroelectronics
53stericsson ST-Ericsson 55stericsson ST-Ericsson
54ti Texas Instruments 56ti Texas Instruments
57toshiba Toshiba Corporation
55via VIA Technologies, Inc. 58via VIA Technologies, Inc.
56wlf Wolfson Microelectronics 59wlf Wolfson Microelectronics
57wm Wondermedia Technologies, Inc. 60wm Wondermedia Technologies, Inc.
diff --git a/drivers/of/base.c b/drivers/of/base.c
index d1bb50719ed7..8b9fa83dc77b 100644
--- a/drivers/of/base.c
+++ b/drivers/of/base.c
@@ -147,16 +147,14 @@ void of_node_put(struct device_node *node)
147EXPORT_SYMBOL(of_node_put); 147EXPORT_SYMBOL(of_node_put);
148#endif /* CONFIG_OF_DYNAMIC */ 148#endif /* CONFIG_OF_DYNAMIC */
149 149
150struct property *of_find_property(const struct device_node *np, 150static struct property *__of_find_property(const struct device_node *np,
151 const char *name, 151 const char *name, int *lenp)
152 int *lenp)
153{ 152{
154 struct property *pp; 153 struct property *pp;
155 154
156 if (!np) 155 if (!np)
157 return NULL; 156 return NULL;
158 157
159 read_lock(&devtree_lock);
160 for (pp = np->properties; pp; pp = pp->next) { 158 for (pp = np->properties; pp; pp = pp->next) {
161 if (of_prop_cmp(pp->name, name) == 0) { 159 if (of_prop_cmp(pp->name, name) == 0) {
162 if (lenp) 160 if (lenp)
@@ -164,6 +162,18 @@ struct property *of_find_property(const struct device_node *np,
164 break; 162 break;
165 } 163 }
166 } 164 }
165
166 return pp;
167}
168
169struct property *of_find_property(const struct device_node *np,
170 const char *name,
171 int *lenp)
172{
173 struct property *pp;
174
175 read_lock(&devtree_lock);
176 pp = __of_find_property(np, name, lenp);
167 read_unlock(&devtree_lock); 177 read_unlock(&devtree_lock);
168 178
169 return pp; 179 return pp;
@@ -197,8 +207,20 @@ EXPORT_SYMBOL(of_find_all_nodes);
197 * Find a property with a given name for a given node 207 * Find a property with a given name for a given node
198 * and return the value. 208 * and return the value.
199 */ 209 */
210static const void *__of_get_property(const struct device_node *np,
211 const char *name, int *lenp)
212{
213 struct property *pp = __of_find_property(np, name, lenp);
214
215 return pp ? pp->value : NULL;
216}
217
218/*
219 * Find a property with a given name for a given node
220 * and return the value.
221 */
200const void *of_get_property(const struct device_node *np, const char *name, 222const void *of_get_property(const struct device_node *np, const char *name,
201 int *lenp) 223 int *lenp)
202{ 224{
203 struct property *pp = of_find_property(np, name, lenp); 225 struct property *pp = of_find_property(np, name, lenp);
204 226
@@ -209,13 +231,13 @@ EXPORT_SYMBOL(of_get_property);
209/** Checks if the given "compat" string matches one of the strings in 231/** Checks if the given "compat" string matches one of the strings in
210 * the device's "compatible" property 232 * the device's "compatible" property
211 */ 233 */
212int of_device_is_compatible(const struct device_node *device, 234static int __of_device_is_compatible(const struct device_node *device,
213 const char *compat) 235 const char *compat)
214{ 236{
215 const char* cp; 237 const char* cp;
216 int cplen, l; 238 int cplen, l;
217 239
218 cp = of_get_property(device, "compatible", &cplen); 240 cp = __of_get_property(device, "compatible", &cplen);
219 if (cp == NULL) 241 if (cp == NULL)
220 return 0; 242 return 0;
221 while (cplen > 0) { 243 while (cplen > 0) {
@@ -228,6 +250,20 @@ int of_device_is_compatible(const struct device_node *device,
228 250
229 return 0; 251 return 0;
230} 252}
253
254/** Checks if the given "compat" string matches one of the strings in
255 * the device's "compatible" property
256 */
257int of_device_is_compatible(const struct device_node *device,
258 const char *compat)
259{
260 int res;
261
262 read_lock(&devtree_lock);
263 res = __of_device_is_compatible(device, compat);
264 read_unlock(&devtree_lock);
265 return res;
266}
231EXPORT_SYMBOL(of_device_is_compatible); 267EXPORT_SYMBOL(of_device_is_compatible);
232 268
233/** 269/**
@@ -501,7 +537,8 @@ struct device_node *of_find_compatible_node(struct device_node *from,
501 if (type 537 if (type
502 && !(np->type && (of_node_cmp(np->type, type) == 0))) 538 && !(np->type && (of_node_cmp(np->type, type) == 0)))
503 continue; 539 continue;
504 if (of_device_is_compatible(np, compatible) && of_node_get(np)) 540 if (__of_device_is_compatible(np, compatible) &&
541 of_node_get(np))
505 break; 542 break;
506 } 543 }
507 of_node_put(from); 544 of_node_put(from);
@@ -545,15 +582,9 @@ out:
545} 582}
546EXPORT_SYMBOL(of_find_node_with_property); 583EXPORT_SYMBOL(of_find_node_with_property);
547 584
548/** 585static
549 * of_match_node - Tell if an device_node has a matching of_match structure 586const struct of_device_id *__of_match_node(const struct of_device_id *matches,
550 * @matches: array of of device match structures to search in 587 const struct device_node *node)
551 * @node: the of device structure to match against
552 *
553 * Low level utility function used by device matching.
554 */
555const struct of_device_id *of_match_node(const struct of_device_id *matches,
556 const struct device_node *node)
557{ 588{
558 if (!matches) 589 if (!matches)
559 return NULL; 590 return NULL;
@@ -567,14 +598,32 @@ const struct of_device_id *of_match_node(const struct of_device_id *matches,
567 match &= node->type 598 match &= node->type
568 && !strcmp(matches->type, node->type); 599 && !strcmp(matches->type, node->type);
569 if (matches->compatible[0]) 600 if (matches->compatible[0])
570 match &= of_device_is_compatible(node, 601 match &= __of_device_is_compatible(node,
571 matches->compatible); 602 matches->compatible);
572 if (match) 603 if (match)
573 return matches; 604 return matches;
574 matches++; 605 matches++;
575 } 606 }
576 return NULL; 607 return NULL;
577} 608}
609
610/**
611 * of_match_node - Tell if an device_node has a matching of_match structure
612 * @matches: array of of device match structures to search in
613 * @node: the of device structure to match against
614 *
615 * Low level utility function used by device matching.
616 */
617const struct of_device_id *of_match_node(const struct of_device_id *matches,
618 const struct device_node *node)
619{
620 const struct of_device_id *match;
621
622 read_lock(&devtree_lock);
623 match = __of_match_node(matches, node);
624 read_unlock(&devtree_lock);
625 return match;
626}
578EXPORT_SYMBOL(of_match_node); 627EXPORT_SYMBOL(of_match_node);
579 628
580/** 629/**
@@ -595,6 +644,7 @@ struct device_node *of_find_matching_node_and_match(struct device_node *from,
595 const struct of_device_id **match) 644 const struct of_device_id **match)
596{ 645{
597 struct device_node *np; 646 struct device_node *np;
647 const struct of_device_id *m;
598 648
599 if (match) 649 if (match)
600 *match = NULL; 650 *match = NULL;
@@ -602,9 +652,10 @@ struct device_node *of_find_matching_node_and_match(struct device_node *from,
602 read_lock(&devtree_lock); 652 read_lock(&devtree_lock);
603 np = from ? from->allnext : of_allnodes; 653 np = from ? from->allnext : of_allnodes;
604 for (; np; np = np->allnext) { 654 for (; np; np = np->allnext) {
605 if (of_match_node(matches, np) && of_node_get(np)) { 655 m = __of_match_node(matches, np);
656 if (m && of_node_get(np)) {
606 if (match) 657 if (match)
607 *match = matches; 658 *match = m;
608 break; 659 break;
609 } 660 }
610 } 661 }