1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20#include <linux/ctype.h>
21#include <linux/cpu.h>
22#include <linux/module.h>
23#include <linux/of.h>
24#include <linux/spinlock.h>
25#include <linux/slab.h>
26#include <linux/proc_fs.h>
27
28#include "of_private.h"
29
30LIST_HEAD(aliases_lookup);
31
32struct device_node *of_allnodes;
33EXPORT_SYMBOL(of_allnodes);
34struct device_node *of_chosen;
35struct device_node *of_aliases;
36static struct device_node *of_stdout;
37
38DEFINE_MUTEX(of_aliases_mutex);
39
40
41
42
43DEFINE_RAW_SPINLOCK(devtree_lock);
44
45int of_n_addr_cells(struct device_node *np)
46{
47 const __be32 *ip;
48
49 do {
50 if (np->parent)
51 np = np->parent;
52 ip = of_get_property(np, "#address-cells", NULL);
53 if (ip)
54 return be32_to_cpup(ip);
55 } while (np->parent);
56
57 return OF_ROOT_NODE_ADDR_CELLS_DEFAULT;
58}
59EXPORT_SYMBOL(of_n_addr_cells);
60
61int of_n_size_cells(struct device_node *np)
62{
63 const __be32 *ip;
64
65 do {
66 if (np->parent)
67 np = np->parent;
68 ip = of_get_property(np, "#size-cells", NULL);
69 if (ip)
70 return be32_to_cpup(ip);
71 } while (np->parent);
72
73 return OF_ROOT_NODE_SIZE_CELLS_DEFAULT;
74}
75EXPORT_SYMBOL(of_n_size_cells);
76
77#ifdef CONFIG_NUMA
78int __weak of_node_to_nid(struct device_node *np)
79{
80 return numa_node_id();
81}
82#endif
83
84#if defined(CONFIG_OF_DYNAMIC)
85
86
87
88
89
90
91
92struct device_node *of_node_get(struct device_node *node)
93{
94 if (node)
95 kref_get(&node->kref);
96 return node;
97}
98EXPORT_SYMBOL(of_node_get);
99
100static inline struct device_node *kref_to_device_node(struct kref *kref)
101{
102 return container_of(kref, struct device_node, kref);
103}
104
105
106
107
108
109
110
111
112static void of_node_release(struct kref *kref)
113{
114 struct device_node *node = kref_to_device_node(kref);
115 struct property *prop = node->properties;
116
117
118 if (!of_node_check_flag(node, OF_DETACHED)) {
119 pr_err("ERROR: Bad of_node_put() on %s\n", node->full_name);
120 dump_stack();
121 kref_init(&node->kref);
122 return;
123 }
124
125 if (!of_node_check_flag(node, OF_DYNAMIC))
126 return;
127
128 while (prop) {
129 struct property *next = prop->next;
130 kfree(prop->name);
131 kfree(prop->value);
132 kfree(prop);
133 prop = next;
134
135 if (!prop) {
136 prop = node->deadprops;
137 node->deadprops = NULL;
138 }
139 }
140 kfree(node->full_name);
141 kfree(node->data);
142 kfree(node);
143}
144
145
146
147
148
149
150
151void of_node_put(struct device_node *node)
152{
153 if (node)
154 kref_put(&node->kref, of_node_release);
155}
156EXPORT_SYMBOL(of_node_put);
157#endif
158
159static struct property *__of_find_property(const struct device_node *np,
160 const char *name, int *lenp)
161{
162 struct property *pp;
163
164 if (!np)
165 return NULL;
166
167 for (pp = np->properties; pp; pp = pp->next) {
168 if (of_prop_cmp(pp->name, name) == 0) {
169 if (lenp)
170 *lenp = pp->length;
171 break;
172 }
173 }
174
175 return pp;
176}
177
178struct property *of_find_property(const struct device_node *np,
179 const char *name,
180 int *lenp)
181{
182 struct property *pp;
183 unsigned long flags;
184
185 raw_spin_lock_irqsave(&devtree_lock, flags);
186 pp = __of_find_property(np, name, lenp);
187 raw_spin_unlock_irqrestore(&devtree_lock, flags);
188
189 return pp;
190}
191EXPORT_SYMBOL(of_find_property);
192
193
194
195
196
197
198
199
200
201struct device_node *of_find_all_nodes(struct device_node *prev)
202{
203 struct device_node *np;
204 unsigned long flags;
205
206 raw_spin_lock_irqsave(&devtree_lock, flags);
207 np = prev ? prev->allnext : of_allnodes;
208 for (; np != NULL; np = np->allnext)
209 if (of_node_get(np))
210 break;
211 of_node_put(prev);
212 raw_spin_unlock_irqrestore(&devtree_lock, flags);
213 return np;
214}
215EXPORT_SYMBOL(of_find_all_nodes);
216
217
218
219
220
221static const void *__of_get_property(const struct device_node *np,
222 const char *name, int *lenp)
223{
224 struct property *pp = __of_find_property(np, name, lenp);
225
226 return pp ? pp->value : NULL;
227}
228
229
230
231
232
233const void *of_get_property(const struct device_node *np, const char *name,
234 int *lenp)
235{
236 struct property *pp = of_find_property(np, name, lenp);
237
238 return pp ? pp->value : NULL;
239}
240EXPORT_SYMBOL(of_get_property);
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256bool __weak arch_match_cpu_phys_id(int cpu, u64 phys_id)
257{
258 return (u32)phys_id == cpu;
259}
260
261
262
263
264
265
266static bool __of_find_n_match_cpu_property(struct device_node *cpun,
267 const char *prop_name, int cpu, unsigned int *thread)
268{
269 const __be32 *cell;
270 int ac, prop_len, tid;
271 u64 hwid;
272
273 ac = of_n_addr_cells(cpun);
274 cell = of_get_property(cpun, prop_name, &prop_len);
275 if (!cell || !ac)
276 return false;
277 prop_len /= sizeof(*cell) * ac;
278 for (tid = 0; tid < prop_len; tid++) {
279 hwid = of_read_number(cell, ac);
280 if (arch_match_cpu_phys_id(cpu, hwid)) {
281 if (thread)
282 *thread = tid;
283 return true;
284 }
285 cell += ac;
286 }
287 return false;
288}
289
290
291
292
293
294
295
296bool __weak arch_find_n_match_cpu_physical_id(struct device_node *cpun,
297 int cpu, unsigned int *thread)
298{
299
300
301
302
303 if (IS_ENABLED(CONFIG_PPC) &&
304 __of_find_n_match_cpu_property(cpun,
305 "ibm,ppc-interrupt-server#s",
306 cpu, thread))
307 return true;
308
309 if (__of_find_n_match_cpu_property(cpun, "reg", cpu, thread))
310 return true;
311
312 return false;
313}
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333struct device_node *of_get_cpu_node(int cpu, unsigned int *thread)
334{
335 struct device_node *cpun;
336
337 for_each_node_by_type(cpun, "cpu") {
338 if (arch_find_n_match_cpu_physical_id(cpun, cpu, thread))
339 return cpun;
340 }
341 return NULL;
342}
343EXPORT_SYMBOL(of_get_cpu_node);
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375static int __of_device_is_compatible(const struct device_node *device,
376 const char *compat, const char *type, const char *name)
377{
378 struct property *prop;
379 const char *cp;
380 int index = 0, score = 0;
381
382
383 if (compat && compat[0]) {
384 prop = __of_find_property(device, "compatible", NULL);
385 for (cp = of_prop_next_string(prop, NULL); cp;
386 cp = of_prop_next_string(prop, cp), index++) {
387 if (of_compat_cmp(cp, compat, strlen(compat)) == 0) {
388 score = INT_MAX/2 - (index << 2);
389 break;
390 }
391 }
392 if (!score)
393 return 0;
394 }
395
396
397 if (type && type[0]) {
398 if (!device->type || of_node_cmp(type, device->type))
399 return 0;
400 score += 2;
401 }
402
403
404 if (name && name[0]) {
405 if (!device->name || of_node_cmp(name, device->name))
406 return 0;
407 score++;
408 }
409
410 return score;
411}
412
413
414
415
416int of_device_is_compatible(const struct device_node *device,
417 const char *compat)
418{
419 unsigned long flags;
420 int res;
421
422 raw_spin_lock_irqsave(&devtree_lock, flags);
423 res = __of_device_is_compatible(device, compat, NULL, NULL);
424 raw_spin_unlock_irqrestore(&devtree_lock, flags);
425 return res;
426}
427EXPORT_SYMBOL(of_device_is_compatible);
428
429
430
431
432
433
434
435
436int of_machine_is_compatible(const char *compat)
437{
438 struct device_node *root;
439 int rc = 0;
440
441 root = of_find_node_by_path("/");
442 if (root) {
443 rc = of_device_is_compatible(root, compat);
444 of_node_put(root);
445 }
446 return rc;
447}
448EXPORT_SYMBOL(of_machine_is_compatible);
449
450
451
452
453
454
455
456
457
458static int __of_device_is_available(const struct device_node *device)
459{
460 const char *status;
461 int statlen;
462
463 if (!device)
464 return 0;
465
466 status = __of_get_property(device, "status", &statlen);
467 if (status == NULL)
468 return 1;
469
470 if (statlen > 0) {
471 if (!strcmp(status, "okay") || !strcmp(status, "ok"))
472 return 1;
473 }
474
475 return 0;
476}
477
478
479
480
481
482
483
484
485
486int of_device_is_available(const struct device_node *device)
487{
488 unsigned long flags;
489 int res;
490
491 raw_spin_lock_irqsave(&devtree_lock, flags);
492 res = __of_device_is_available(device);
493 raw_spin_unlock_irqrestore(&devtree_lock, flags);
494 return res;
495
496}
497EXPORT_SYMBOL(of_device_is_available);
498
499
500
501
502
503
504
505
506struct device_node *of_get_parent(const struct device_node *node)
507{
508 struct device_node *np;
509 unsigned long flags;
510
511 if (!node)
512 return NULL;
513
514 raw_spin_lock_irqsave(&devtree_lock, flags);
515 np = of_node_get(node->parent);
516 raw_spin_unlock_irqrestore(&devtree_lock, flags);
517 return np;
518}
519EXPORT_SYMBOL(of_get_parent);
520
521
522
523
524
525
526
527
528
529
530
531
532struct device_node *of_get_next_parent(struct device_node *node)
533{
534 struct device_node *parent;
535 unsigned long flags;
536
537 if (!node)
538 return NULL;
539
540 raw_spin_lock_irqsave(&devtree_lock, flags);
541 parent = of_node_get(node->parent);
542 of_node_put(node);
543 raw_spin_unlock_irqrestore(&devtree_lock, flags);
544 return parent;
545}
546EXPORT_SYMBOL(of_get_next_parent);
547
548
549
550
551
552
553
554
555
556struct device_node *of_get_next_child(const struct device_node *node,
557 struct device_node *prev)
558{
559 struct device_node *next;
560 unsigned long flags;
561
562 raw_spin_lock_irqsave(&devtree_lock, flags);
563 next = prev ? prev->sibling : node->child;
564 for (; next; next = next->sibling)
565 if (of_node_get(next))
566 break;
567 of_node_put(prev);
568 raw_spin_unlock_irqrestore(&devtree_lock, flags);
569 return next;
570}
571EXPORT_SYMBOL(of_get_next_child);
572
573
574
575
576
577
578
579
580
581struct device_node *of_get_next_available_child(const struct device_node *node,
582 struct device_node *prev)
583{
584 struct device_node *next;
585 unsigned long flags;
586
587 raw_spin_lock_irqsave(&devtree_lock, flags);
588 next = prev ? prev->sibling : node->child;
589 for (; next; next = next->sibling) {
590 if (!__of_device_is_available(next))
591 continue;
592 if (of_node_get(next))
593 break;
594 }
595 of_node_put(prev);
596 raw_spin_unlock_irqrestore(&devtree_lock, flags);
597 return next;
598}
599EXPORT_SYMBOL(of_get_next_available_child);
600
601
602
603
604
605
606
607
608
609
610
611
612struct device_node *of_get_child_by_name(const struct device_node *node,
613 const char *name)
614{
615 struct device_node *child;
616
617 for_each_child_of_node(node, child)
618 if (child->name && (of_node_cmp(child->name, name) == 0))
619 break;
620 return child;
621}
622EXPORT_SYMBOL(of_get_child_by_name);
623
624
625
626
627
628
629
630
631struct device_node *of_find_node_by_path(const char *path)
632{
633 struct device_node *np = of_allnodes;
634 unsigned long flags;
635
636 raw_spin_lock_irqsave(&devtree_lock, flags);
637 for (; np; np = np->allnext) {
638 if (np->full_name && (of_node_cmp(np->full_name, path) == 0)
639 && of_node_get(np))
640 break;
641 }
642 raw_spin_unlock_irqrestore(&devtree_lock, flags);
643 return np;
644}
645EXPORT_SYMBOL(of_find_node_by_path);
646
647
648
649
650
651
652
653
654
655
656
657
658struct device_node *of_find_node_by_name(struct device_node *from,
659 const char *name)
660{
661 struct device_node *np;
662 unsigned long flags;
663
664 raw_spin_lock_irqsave(&devtree_lock, flags);
665 np = from ? from->allnext : of_allnodes;
666 for (; np; np = np->allnext)
667 if (np->name && (of_node_cmp(np->name, name) == 0)
668 && of_node_get(np))
669 break;
670 of_node_put(from);
671 raw_spin_unlock_irqrestore(&devtree_lock, flags);
672 return np;
673}
674EXPORT_SYMBOL(of_find_node_by_name);
675
676
677
678
679
680
681
682
683
684
685
686
687
688struct device_node *of_find_node_by_type(struct device_node *from,
689 const char *type)
690{
691 struct device_node *np;
692 unsigned long flags;
693
694 raw_spin_lock_irqsave(&devtree_lock, flags);
695 np = from ? from->allnext : of_allnodes;
696 for (; np; np = np->allnext)
697 if (np->type && (of_node_cmp(np->type, type) == 0)
698 && of_node_get(np))
699 break;
700 of_node_put(from);
701 raw_spin_unlock_irqrestore(&devtree_lock, flags);
702 return np;
703}
704EXPORT_SYMBOL(of_find_node_by_type);
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720struct device_node *of_find_compatible_node(struct device_node *from,
721 const char *type, const char *compatible)
722{
723 struct device_node *np;
724 unsigned long flags;
725
726 raw_spin_lock_irqsave(&devtree_lock, flags);
727 np = from ? from->allnext : of_allnodes;
728 for (; np; np = np->allnext) {
729 if (__of_device_is_compatible(np, compatible, type, NULL) &&
730 of_node_get(np))
731 break;
732 }
733 of_node_put(from);
734 raw_spin_unlock_irqrestore(&devtree_lock, flags);
735 return np;
736}
737EXPORT_SYMBOL(of_find_compatible_node);
738
739
740
741
742
743
744
745
746
747
748
749
750
751struct device_node *of_find_node_with_property(struct device_node *from,
752 const char *prop_name)
753{
754 struct device_node *np;
755 struct property *pp;
756 unsigned long flags;
757
758 raw_spin_lock_irqsave(&devtree_lock, flags);
759 np = from ? from->allnext : of_allnodes;
760 for (; np; np = np->allnext) {
761 for (pp = np->properties; pp; pp = pp->next) {
762 if (of_prop_cmp(pp->name, prop_name) == 0) {
763 of_node_get(np);
764 goto out;
765 }
766 }
767 }
768out:
769 of_node_put(from);
770 raw_spin_unlock_irqrestore(&devtree_lock, flags);
771 return np;
772}
773EXPORT_SYMBOL(of_find_node_with_property);
774
775static
776const struct of_device_id *__of_match_node(const struct of_device_id *matches,
777 const struct device_node *node)
778{
779 const struct of_device_id *best_match = NULL;
780 int score, best_score = 0;
781
782 if (!matches)
783 return NULL;
784
785 for (; matches->name[0] || matches->type[0] || matches->compatible[0]; matches++) {
786 score = __of_device_is_compatible(node, matches->compatible,
787 matches->type, matches->name);
788 if (score > best_score) {
789 best_match = matches;
790 best_score = score;
791 }
792 }
793
794 return best_match;
795}
796
797
798
799
800
801
802
803
804const struct of_device_id *of_match_node(const struct of_device_id *matches,
805 const struct device_node *node)
806{
807 const struct of_device_id *match;
808 unsigned long flags;
809
810 raw_spin_lock_irqsave(&devtree_lock, flags);
811 match = __of_match_node(matches, node);
812 raw_spin_unlock_irqrestore(&devtree_lock, flags);
813 return match;
814}
815EXPORT_SYMBOL(of_match_node);
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830struct device_node *of_find_matching_node_and_match(struct device_node *from,
831 const struct of_device_id *matches,
832 const struct of_device_id **match)
833{
834 struct device_node *np;
835 const struct of_device_id *m;
836 unsigned long flags;
837
838 if (match)
839 *match = NULL;
840
841 raw_spin_lock_irqsave(&devtree_lock, flags);
842 np = from ? from->allnext : of_allnodes;
843 for (; np; np = np->allnext) {
844 m = __of_match_node(matches, np);
845 if (m && of_node_get(np)) {
846 if (match)
847 *match = m;
848 break;
849 }
850 }
851 of_node_put(from);
852 raw_spin_unlock_irqrestore(&devtree_lock, flags);
853 return np;
854}
855EXPORT_SYMBOL(of_find_matching_node_and_match);
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870int of_modalias_node(struct device_node *node, char *modalias, int len)
871{
872 const char *compatible, *p;
873 int cplen;
874
875 compatible = of_get_property(node, "compatible", &cplen);
876 if (!compatible || strlen(compatible) > cplen)
877 return -ENODEV;
878 p = strchr(compatible, ',');
879 strlcpy(modalias, p ? p + 1 : compatible, len);
880 return 0;
881}
882EXPORT_SYMBOL_GPL(of_modalias_node);
883
884
885
886
887
888
889
890
891struct device_node *of_find_node_by_phandle(phandle handle)
892{
893 struct device_node *np;
894 unsigned long flags;
895
896 raw_spin_lock_irqsave(&devtree_lock, flags);
897 for (np = of_allnodes; np; np = np->allnext)
898 if (np->phandle == handle)
899 break;
900 of_node_get(np);
901 raw_spin_unlock_irqrestore(&devtree_lock, flags);
902 return np;
903}
904EXPORT_SYMBOL(of_find_node_by_phandle);
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919static void *of_find_property_value_of_size(const struct device_node *np,
920 const char *propname, u32 len)
921{
922 struct property *prop = of_find_property(np, propname, NULL);
923
924 if (!prop)
925 return ERR_PTR(-EINVAL);
926 if (!prop->value)
927 return ERR_PTR(-ENODATA);
928 if (len > prop->length)
929 return ERR_PTR(-EOVERFLOW);
930
931 return prop->value;
932}
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949int of_property_read_u32_index(const struct device_node *np,
950 const char *propname,
951 u32 index, u32 *out_value)
952{
953 const u32 *val = of_find_property_value_of_size(np, propname,
954 ((index + 1) * sizeof(*out_value)));
955
956 if (IS_ERR(val))
957 return PTR_ERR(val);
958
959 *out_value = be32_to_cpup(((__be32 *)val) + index);
960 return 0;
961}
962EXPORT_SYMBOL_GPL(of_property_read_u32_index);
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982int of_property_read_u8_array(const struct device_node *np,
983 const char *propname, u8 *out_values, size_t sz)
984{
985 const u8 *val = of_find_property_value_of_size(np, propname,
986 (sz * sizeof(*out_values)));
987
988 if (IS_ERR(val))
989 return PTR_ERR(val);
990
991 while (sz--)
992 *out_values++ = *val++;
993 return 0;
994}
995EXPORT_SYMBOL_GPL(of_property_read_u8_array);
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015int of_property_read_u16_array(const struct device_node *np,
1016 const char *propname, u16 *out_values, size_t sz)
1017{
1018 const __be16 *val = of_find_property_value_of_size(np, propname,
1019 (sz * sizeof(*out_values)));
1020
1021 if (IS_ERR(val))
1022 return PTR_ERR(val);
1023
1024 while (sz--)
1025 *out_values++ = be16_to_cpup(val++);
1026 return 0;
1027}
1028EXPORT_SYMBOL_GPL(of_property_read_u16_array);
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046int of_property_read_u32_array(const struct device_node *np,
1047 const char *propname, u32 *out_values,
1048 size_t sz)
1049{
1050 const __be32 *val = of_find_property_value_of_size(np, propname,
1051 (sz * sizeof(*out_values)));
1052
1053 if (IS_ERR(val))
1054 return PTR_ERR(val);
1055
1056 while (sz--)
1057 *out_values++ = be32_to_cpup(val++);
1058 return 0;
1059}
1060EXPORT_SYMBOL_GPL(of_property_read_u32_array);
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075int of_property_read_u64(const struct device_node *np, const char *propname,
1076 u64 *out_value)
1077{
1078 const __be32 *val = of_find_property_value_of_size(np, propname,
1079 sizeof(*out_value));
1080
1081 if (IS_ERR(val))
1082 return PTR_ERR(val);
1083
1084 *out_value = of_read_number(val, 2);
1085 return 0;
1086}
1087EXPORT_SYMBOL_GPL(of_property_read_u64);
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104int of_property_read_string(struct device_node *np, const char *propname,
1105 const char **out_string)
1106{
1107 struct property *prop = of_find_property(np, propname, NULL);
1108 if (!prop)
1109 return -EINVAL;
1110 if (!prop->value)
1111 return -ENODATA;
1112 if (strnlen(prop->value, prop->length) >= prop->length)
1113 return -EILSEQ;
1114 *out_string = prop->value;
1115 return 0;
1116}
1117EXPORT_SYMBOL_GPL(of_property_read_string);
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137int of_property_read_string_index(struct device_node *np, const char *propname,
1138 int index, const char **output)
1139{
1140 struct property *prop = of_find_property(np, propname, NULL);
1141 int i = 0;
1142 size_t l = 0, total = 0;
1143 const char *p;
1144
1145 if (!prop)
1146 return -EINVAL;
1147 if (!prop->value)
1148 return -ENODATA;
1149 if (strnlen(prop->value, prop->length) >= prop->length)
1150 return -EILSEQ;
1151
1152 p = prop->value;
1153
1154 for (i = 0; total < prop->length; total += l, p += l) {
1155 l = strlen(p) + 1;
1156 if (i++ == index) {
1157 *output = p;
1158 return 0;
1159 }
1160 }
1161 return -ENODATA;
1162}
1163EXPORT_SYMBOL_GPL(of_property_read_string_index);
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174int of_property_match_string(struct device_node *np, const char *propname,
1175 const char *string)
1176{
1177 struct property *prop = of_find_property(np, propname, NULL);
1178 size_t l;
1179 int i;
1180 const char *p, *end;
1181
1182 if (!prop)
1183 return -EINVAL;
1184 if (!prop->value)
1185 return -ENODATA;
1186
1187 p = prop->value;
1188 end = p + prop->length;
1189
1190 for (i = 0; p < end; i++, p += l) {
1191 l = strlen(p) + 1;
1192 if (p + l > end)
1193 return -EILSEQ;
1194 pr_debug("comparing %s with %s\n", string, p);
1195 if (strcmp(string, p) == 0)
1196 return i;
1197 }
1198 return -ENODATA;
1199}
1200EXPORT_SYMBOL_GPL(of_property_match_string);
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214int of_property_count_strings(struct device_node *np, const char *propname)
1215{
1216 struct property *prop = of_find_property(np, propname, NULL);
1217 int i = 0;
1218 size_t l = 0, total = 0;
1219 const char *p;
1220
1221 if (!prop)
1222 return -EINVAL;
1223 if (!prop->value)
1224 return -ENODATA;
1225 if (strnlen(prop->value, prop->length) >= prop->length)
1226 return -EILSEQ;
1227
1228 p = prop->value;
1229
1230 for (i = 0; total < prop->length; total += l, p += l, i++)
1231 l = strlen(p) + 1;
1232
1233 return i;
1234}
1235EXPORT_SYMBOL_GPL(of_property_count_strings);
1236
1237void of_print_phandle_args(const char *msg, const struct of_phandle_args *args)
1238{
1239 int i;
1240 printk("%s %s", msg, of_node_full_name(args->np));
1241 for (i = 0; i < args->args_count; i++)
1242 printk(i ? ",%08x" : ":%08x", args->args[i]);
1243 printk("\n");
1244}
1245
1246static int __of_parse_phandle_with_args(const struct device_node *np,
1247 const char *list_name,
1248 const char *cells_name,
1249 int cell_count, int index,
1250 struct of_phandle_args *out_args)
1251{
1252 const __be32 *list, *list_end;
1253 int rc = 0, size, cur_index = 0;
1254 uint32_t count = 0;
1255 struct device_node *node = NULL;
1256 phandle phandle;
1257
1258
1259 list = of_get_property(np, list_name, &size);
1260 if (!list)
1261 return -ENOENT;
1262 list_end = list + size / sizeof(*list);
1263
1264
1265 while (list < list_end) {
1266 rc = -EINVAL;
1267 count = 0;
1268
1269
1270
1271
1272
1273 phandle = be32_to_cpup(list++);
1274 if (phandle) {
1275
1276
1277
1278
1279
1280
1281
1282
1283
1284 if (cells_name || cur_index == index) {
1285 node = of_find_node_by_phandle(phandle);
1286 if (!node) {
1287 pr_err("%s: could not find phandle\n",
1288 np->full_name);
1289 goto err;
1290 }
1291 }
1292
1293 if (cells_name) {
1294 if (of_property_read_u32(node, cells_name,
1295 &count)) {
1296 pr_err("%s: could not get %s for %s\n",
1297 np->full_name, cells_name,
1298 node->full_name);
1299 goto err;
1300 }
1301 } else {
1302 count = cell_count;
1303 }
1304
1305
1306
1307
1308
1309 if (list + count > list_end) {
1310 pr_err("%s: arguments longer than property\n",
1311 np->full_name);
1312 goto err;
1313 }
1314 }
1315
1316
1317
1318
1319
1320
1321
1322 rc = -ENOENT;
1323 if (cur_index == index) {
1324 if (!phandle)
1325 goto err;
1326
1327 if (out_args) {
1328 int i;
1329 if (WARN_ON(count > MAX_PHANDLE_ARGS))
1330 count = MAX_PHANDLE_ARGS;
1331 out_args->np = node;
1332 out_args->args_count = count;
1333 for (i = 0; i < count; i++)
1334 out_args->args[i] = be32_to_cpup(list++);
1335 } else {
1336 of_node_put(node);
1337 }
1338
1339
1340 return 0;
1341 }
1342
1343 of_node_put(node);
1344 node = NULL;
1345 list += count;
1346 cur_index++;
1347 }
1348
1349
1350
1351
1352
1353
1354
1355 rc = index < 0 ? cur_index : -ENOENT;
1356 err:
1357 if (node)
1358 of_node_put(node);
1359 return rc;
1360}
1361
1362
1363
1364
1365
1366
1367
1368
1369
1370
1371
1372struct device_node *of_parse_phandle(const struct device_node *np,
1373 const char *phandle_name, int index)
1374{
1375 struct of_phandle_args args;
1376
1377 if (index < 0)
1378 return NULL;
1379
1380 if (__of_parse_phandle_with_args(np, phandle_name, NULL, 0,
1381 index, &args))
1382 return NULL;
1383
1384 return args.np;
1385}
1386EXPORT_SYMBOL(of_parse_phandle);
1387
1388
1389
1390
1391
1392
1393
1394
1395
1396
1397
1398
1399
1400
1401
1402
1403
1404
1405
1406
1407
1408
1409
1410
1411
1412
1413
1414
1415
1416
1417
1418
1419
1420int of_parse_phandle_with_args(const struct device_node *np, const char *list_name,
1421 const char *cells_name, int index,
1422 struct of_phandle_args *out_args)
1423{
1424 if (index < 0)
1425 return -EINVAL;
1426 return __of_parse_phandle_with_args(np, list_name, cells_name, 0,
1427 index, out_args);
1428}
1429EXPORT_SYMBOL(of_parse_phandle_with_args);
1430
1431
1432
1433
1434
1435
1436
1437
1438
1439
1440
1441
1442
1443
1444
1445
1446
1447
1448
1449
1450
1451
1452
1453
1454
1455
1456
1457
1458
1459
1460
1461int of_parse_phandle_with_fixed_args(const struct device_node *np,
1462 const char *list_name, int cell_count,
1463 int index, struct of_phandle_args *out_args)
1464{
1465 if (index < 0)
1466 return -EINVAL;
1467 return __of_parse_phandle_with_args(np, list_name, NULL, cell_count,
1468 index, out_args);
1469}
1470EXPORT_SYMBOL(of_parse_phandle_with_fixed_args);
1471
1472
1473
1474
1475
1476
1477
1478
1479
1480
1481
1482
1483
1484
1485
1486
1487int of_count_phandle_with_args(const struct device_node *np, const char *list_name,
1488 const char *cells_name)
1489{
1490 return __of_parse_phandle_with_args(np, list_name, cells_name, 0, -1,
1491 NULL);
1492}
1493EXPORT_SYMBOL(of_count_phandle_with_args);
1494
1495#if defined(CONFIG_OF_DYNAMIC)
1496static int of_property_notify(int action, struct device_node *np,
1497 struct property *prop)
1498{
1499 struct of_prop_reconfig pr;
1500
1501 pr.dn = np;
1502 pr.prop = prop;
1503 return of_reconfig_notify(action, &pr);
1504}
1505#else
1506static int of_property_notify(int action, struct device_node *np,
1507 struct property *prop)
1508{
1509 return 0;
1510}
1511#endif
1512
1513
1514
1515
1516int of_add_property(struct device_node *np, struct property *prop)
1517{
1518 struct property **next;
1519 unsigned long flags;
1520 int rc;
1521
1522 rc = of_property_notify(OF_RECONFIG_ADD_PROPERTY, np, prop);
1523 if (rc)
1524 return rc;
1525
1526 prop->next = NULL;
1527 raw_spin_lock_irqsave(&devtree_lock, flags);
1528 next = &np->properties;
1529 while (*next) {
1530 if (strcmp(prop->name, (*next)->name) == 0) {
1531
1532 raw_spin_unlock_irqrestore(&devtree_lock, flags);
1533 return -1;
1534 }
1535 next = &(*next)->next;
1536 }
1537 *next = prop;
1538 raw_spin_unlock_irqrestore(&devtree_lock, flags);
1539
1540#ifdef CONFIG_PROC_DEVICETREE
1541
1542 if (np->pde)
1543 proc_device_tree_add_prop(np->pde, prop);
1544#endif
1545
1546 return 0;
1547}
1548
1549
1550
1551
1552
1553
1554
1555
1556
1557int of_remove_property(struct device_node *np, struct property *prop)
1558{
1559 struct property **next;
1560 unsigned long flags;
1561 int found = 0;
1562 int rc;
1563
1564 rc = of_property_notify(OF_RECONFIG_REMOVE_PROPERTY, np, prop);
1565 if (rc)
1566 return rc;
1567
1568 raw_spin_lock_irqsave(&devtree_lock, flags);
1569 next = &np->properties;
1570 while (*next) {
1571 if (*next == prop) {
1572
1573 *next = prop->next;
1574 prop->next = np->deadprops;
1575 np->deadprops = prop;
1576 found = 1;
1577 break;
1578 }
1579 next = &(*next)->next;
1580 }
1581 raw_spin_unlock_irqrestore(&devtree_lock, flags);
1582
1583 if (!found)
1584 return -ENODEV;
1585
1586#ifdef CONFIG_PROC_DEVICETREE
1587
1588 if (np->pde)
1589 proc_device_tree_remove_prop(np->pde, prop);
1590#endif
1591
1592 return 0;
1593}
1594
1595
1596
1597
1598
1599
1600
1601
1602
1603
1604int of_update_property(struct device_node *np, struct property *newprop)
1605{
1606 struct property **next, *oldprop;
1607 unsigned long flags;
1608 int rc, found = 0;
1609
1610 rc = of_property_notify(OF_RECONFIG_UPDATE_PROPERTY, np, newprop);
1611 if (rc)
1612 return rc;
1613
1614 if (!newprop->name)
1615 return -EINVAL;
1616
1617 oldprop = of_find_property(np, newprop->name, NULL);
1618 if (!oldprop)
1619 return of_add_property(np, newprop);
1620
1621 raw_spin_lock_irqsave(&devtree_lock, flags);
1622 next = &np->properties;
1623 while (*next) {
1624 if (*next == oldprop) {
1625
1626 newprop->next = oldprop->next;
1627 *next = newprop;
1628 oldprop->next = np->deadprops;
1629 np->deadprops = oldprop;
1630 found = 1;
1631 break;
1632 }
1633 next = &(*next)->next;
1634 }
1635 raw_spin_unlock_irqrestore(&devtree_lock, flags);
1636
1637 if (!found)
1638 return -ENODEV;
1639
1640#ifdef CONFIG_PROC_DEVICETREE
1641
1642 if (np->pde)
1643 proc_device_tree_update_prop(np->pde, newprop, oldprop);
1644#endif
1645
1646 return 0;
1647}
1648
1649#if defined(CONFIG_OF_DYNAMIC)
1650
1651
1652
1653
1654
1655
1656
1657
1658static BLOCKING_NOTIFIER_HEAD(of_reconfig_chain);
1659
1660int of_reconfig_notifier_register(struct notifier_block *nb)
1661{
1662 return blocking_notifier_chain_register(&of_reconfig_chain, nb);
1663}
1664EXPORT_SYMBOL_GPL(of_reconfig_notifier_register);
1665
1666int of_reconfig_notifier_unregister(struct notifier_block *nb)
1667{
1668 return blocking_notifier_chain_unregister(&of_reconfig_chain, nb);
1669}
1670EXPORT_SYMBOL_GPL(of_reconfig_notifier_unregister);
1671
1672int of_reconfig_notify(unsigned long action, void *p)
1673{
1674 int rc;
1675
1676 rc = blocking_notifier_call_chain(&of_reconfig_chain, action, p);
1677 return notifier_to_errno(rc);
1678}
1679
1680#ifdef CONFIG_PROC_DEVICETREE
1681static void of_add_proc_dt_entry(struct device_node *dn)
1682{
1683 struct proc_dir_entry *ent;
1684
1685 ent = proc_mkdir(strrchr(dn->full_name, '/') + 1, dn->parent->pde);
1686 if (ent)
1687 proc_device_tree_add_node(dn, ent);
1688}
1689#else
1690static void of_add_proc_dt_entry(struct device_node *dn)
1691{
1692 return;
1693}
1694#endif
1695
1696
1697
1698
1699int of_attach_node(struct device_node *np)
1700{
1701 unsigned long flags;
1702 int rc;
1703
1704 rc = of_reconfig_notify(OF_RECONFIG_ATTACH_NODE, np);
1705 if (rc)
1706 return rc;
1707
1708 raw_spin_lock_irqsave(&devtree_lock, flags);
1709 np->sibling = np->parent->child;
1710 np->allnext = of_allnodes;
1711 np->parent->child = np;
1712 of_allnodes = np;
1713 raw_spin_unlock_irqrestore(&devtree_lock, flags);
1714
1715 of_add_proc_dt_entry(np);
1716 return 0;
1717}
1718
1719#ifdef CONFIG_PROC_DEVICETREE
1720static void of_remove_proc_dt_entry(struct device_node *dn)
1721{
1722 proc_remove(dn->pde);
1723}
1724#else
1725static void of_remove_proc_dt_entry(struct device_node *dn)
1726{
1727 return;
1728}
1729#endif
1730
1731
1732
1733
1734
1735
1736
1737int of_detach_node(struct device_node *np)
1738{
1739 struct device_node *parent;
1740 unsigned long flags;
1741 int rc = 0;
1742
1743 rc = of_reconfig_notify(OF_RECONFIG_DETACH_NODE, np);
1744 if (rc)
1745 return rc;
1746
1747 raw_spin_lock_irqsave(&devtree_lock, flags);
1748
1749 if (of_node_check_flag(np, OF_DETACHED)) {
1750
1751 raw_spin_unlock_irqrestore(&devtree_lock, flags);
1752 return rc;
1753 }
1754
1755 parent = np->parent;
1756 if (!parent) {
1757 raw_spin_unlock_irqrestore(&devtree_lock, flags);
1758 return rc;
1759 }
1760
1761 if (of_allnodes == np)
1762 of_allnodes = np->allnext;
1763 else {
1764 struct device_node *prev;
1765 for (prev = of_allnodes;
1766 prev->allnext != np;
1767 prev = prev->allnext)
1768 ;
1769 prev->allnext = np->allnext;
1770 }
1771
1772 if (parent->child == np)
1773 parent->child = np->sibling;
1774 else {
1775 struct device_node *prevsib;
1776 for (prevsib = np->parent->child;
1777 prevsib->sibling != np;
1778 prevsib = prevsib->sibling)
1779 ;
1780 prevsib->sibling = np->sibling;
1781 }
1782
1783 of_node_set_flag(np, OF_DETACHED);
1784 raw_spin_unlock_irqrestore(&devtree_lock, flags);
1785
1786 of_remove_proc_dt_entry(np);
1787 return rc;
1788}
1789#endif
1790
1791static void of_alias_add(struct alias_prop *ap, struct device_node *np,
1792 int id, const char *stem, int stem_len)
1793{
1794 ap->np = np;
1795 ap->id = id;
1796 strncpy(ap->stem, stem, stem_len);
1797 ap->stem[stem_len] = 0;
1798 list_add_tail(&ap->link, &aliases_lookup);
1799 pr_debug("adding DT alias:%s: stem=%s id=%i node=%s\n",
1800 ap->alias, ap->stem, ap->id, of_node_full_name(np));
1801}
1802
1803
1804
1805
1806
1807
1808
1809
1810
1811
1812
1813void of_alias_scan(void * (*dt_alloc)(u64 size, u64 align))
1814{
1815 struct property *pp;
1816
1817 of_chosen = of_find_node_by_path("/chosen");
1818 if (of_chosen == NULL)
1819 of_chosen = of_find_node_by_path("/chosen@0");
1820
1821 if (of_chosen) {
1822 const char *name;
1823
1824 name = of_get_property(of_chosen, "linux,stdout-path", NULL);
1825 if (name)
1826 of_stdout = of_find_node_by_path(name);
1827 }
1828
1829 of_aliases = of_find_node_by_path("/aliases");
1830 if (!of_aliases)
1831 return;
1832
1833 for_each_property_of_node(of_aliases, pp) {
1834 const char *start = pp->name;
1835 const char *end = start + strlen(start);
1836 struct device_node *np;
1837 struct alias_prop *ap;
1838 int id, len;
1839
1840
1841 if (!strcmp(pp->name, "name") ||
1842 !strcmp(pp->name, "phandle") ||
1843 !strcmp(pp->name, "linux,phandle"))
1844 continue;
1845
1846 np = of_find_node_by_path(pp->value);
1847 if (!np)
1848 continue;
1849
1850
1851
1852 while (isdigit(*(end-1)) && end > start)
1853 end--;
1854 len = end - start;
1855
1856 if (kstrtoint(end, 10, &id) < 0)
1857 continue;
1858
1859
1860 ap = dt_alloc(sizeof(*ap) + len + 1, 4);
1861 if (!ap)
1862 continue;
1863 memset(ap, 0, sizeof(*ap) + len + 1);
1864 ap->alias = start;
1865 of_alias_add(ap, np, id, start, len);
1866 }
1867}
1868
1869
1870
1871
1872
1873
1874
1875
1876
1877int of_alias_get_id(struct device_node *np, const char *stem)
1878{
1879 struct alias_prop *app;
1880 int id = -ENODEV;
1881
1882 mutex_lock(&of_aliases_mutex);
1883 list_for_each_entry(app, &aliases_lookup, link) {
1884 if (strcmp(app->stem, stem) != 0)
1885 continue;
1886
1887 if (np == app->np) {
1888 id = app->id;
1889 break;
1890 }
1891 }
1892 mutex_unlock(&of_aliases_mutex);
1893
1894 return id;
1895}
1896EXPORT_SYMBOL_GPL(of_alias_get_id);
1897
1898const __be32 *of_prop_next_u32(struct property *prop, const __be32 *cur,
1899 u32 *pu)
1900{
1901 const void *curv = cur;
1902
1903 if (!prop)
1904 return NULL;
1905
1906 if (!cur) {
1907 curv = prop->value;
1908 goto out_val;
1909 }
1910
1911 curv += sizeof(*cur);
1912 if (curv >= prop->value + prop->length)
1913 return NULL;
1914
1915out_val:
1916 *pu = be32_to_cpup(curv);
1917 return curv;
1918}
1919EXPORT_SYMBOL_GPL(of_prop_next_u32);
1920
1921const char *of_prop_next_string(struct property *prop, const char *cur)
1922{
1923 const void *curv = cur;
1924
1925 if (!prop)
1926 return NULL;
1927
1928 if (!cur)
1929 return prop->value;
1930
1931 curv += strlen(cur) + 1;
1932 if (curv >= prop->value + prop->length)
1933 return NULL;
1934
1935 return curv;
1936}
1937EXPORT_SYMBOL_GPL(of_prop_next_string);
1938
1939
1940
1941
1942
1943
1944
1945
1946int of_device_is_stdout_path(struct device_node *dn)
1947{
1948 if (!of_stdout)
1949 return false;
1950
1951 return of_stdout == dn;
1952}
1953EXPORT_SYMBOL_GPL(of_device_is_stdout_path);
1954
1955
1956
1957
1958
1959
1960
1961
1962
1963struct device_node *of_find_next_cache_node(const struct device_node *np)
1964{
1965 struct device_node *child;
1966 const phandle *handle;
1967
1968 handle = of_get_property(np, "l2-cache", NULL);
1969 if (!handle)
1970 handle = of_get_property(np, "next-level-cache", NULL);
1971
1972 if (handle)
1973 return of_find_node_by_phandle(be32_to_cpup(handle));
1974
1975
1976
1977
1978 if (!strcmp(np->type, "cpu"))
1979 for_each_child_of_node(np, child)
1980 if (!strcmp(child->type, "cache"))
1981 return child;
1982
1983 return NULL;
1984}
1985