1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21#define pr_fmt(fmt) "OF: " fmt
22
23#include <linux/console.h>
24#include <linux/ctype.h>
25#include <linux/cpu.h>
26#include <linux/module.h>
27#include <linux/of.h>
28#include <linux/of_graph.h>
29#include <linux/spinlock.h>
30#include <linux/slab.h>
31#include <linux/string.h>
32#include <linux/proc_fs.h>
33
34#include "of_private.h"
35
36LIST_HEAD(aliases_lookup);
37
38struct device_node *of_root;
39EXPORT_SYMBOL(of_root);
40struct device_node *of_chosen;
41struct device_node *of_aliases;
42struct device_node *of_stdout;
43static const char *of_stdout_options;
44
45struct kset *of_kset;
46
47
48
49
50
51
52
53DEFINE_MUTEX(of_mutex);
54
55
56
57
58DEFINE_RAW_SPINLOCK(devtree_lock);
59
60int of_n_addr_cells(struct device_node *np)
61{
62 const __be32 *ip;
63
64 do {
65 if (np->parent)
66 np = np->parent;
67 ip = of_get_property(np, "#address-cells", NULL);
68 if (ip)
69 return be32_to_cpup(ip);
70 } while (np->parent);
71
72 return OF_ROOT_NODE_ADDR_CELLS_DEFAULT;
73}
74EXPORT_SYMBOL(of_n_addr_cells);
75
76int of_n_size_cells(struct device_node *np)
77{
78 const __be32 *ip;
79
80 do {
81 if (np->parent)
82 np = np->parent;
83 ip = of_get_property(np, "#size-cells", NULL);
84 if (ip)
85 return be32_to_cpup(ip);
86 } while (np->parent);
87
88 return OF_ROOT_NODE_SIZE_CELLS_DEFAULT;
89}
90EXPORT_SYMBOL(of_n_size_cells);
91
92#ifdef CONFIG_NUMA
93int __weak of_node_to_nid(struct device_node *np)
94{
95 return NUMA_NO_NODE;
96}
97#endif
98
99#ifndef CONFIG_OF_DYNAMIC
100static void of_node_release(struct kobject *kobj)
101{
102
103}
104#endif
105
106struct kobj_type of_node_ktype = {
107 .release = of_node_release,
108};
109
110static ssize_t of_node_property_read(struct file *filp, struct kobject *kobj,
111 struct bin_attribute *bin_attr, char *buf,
112 loff_t offset, size_t count)
113{
114 struct property *pp = container_of(bin_attr, struct property, attr);
115 return memory_read_from_buffer(buf, count, &offset, pp->value, pp->length);
116}
117
118
119static const char *safe_name(struct kobject *kobj, const char *orig_name)
120{
121 const char *name = orig_name;
122 struct kernfs_node *kn;
123 int i = 0;
124
125
126 while (i < 16 && (kn = sysfs_get_dirent(kobj->sd, name))) {
127 sysfs_put(kn);
128 if (name != orig_name)
129 kfree(name);
130 name = kasprintf(GFP_KERNEL, "%s#%i", orig_name, ++i);
131 }
132
133 if (name == orig_name) {
134 name = kstrdup(orig_name, GFP_KERNEL);
135 } else {
136 pr_warn("Duplicate name in %s, renamed to \"%s\"\n",
137 kobject_name(kobj), name);
138 }
139 return name;
140}
141
142int __of_add_property_sysfs(struct device_node *np, struct property *pp)
143{
144 int rc;
145
146
147 bool secure = strncmp(pp->name, "security-", 9) == 0;
148
149 if (!IS_ENABLED(CONFIG_SYSFS))
150 return 0;
151
152 if (!of_kset || !of_node_is_attached(np))
153 return 0;
154
155 sysfs_bin_attr_init(&pp->attr);
156 pp->attr.attr.name = safe_name(&np->kobj, pp->name);
157 pp->attr.attr.mode = secure ? S_IRUSR : S_IRUGO;
158 pp->attr.size = secure ? 0 : pp->length;
159 pp->attr.read = of_node_property_read;
160
161 rc = sysfs_create_bin_file(&np->kobj, &pp->attr);
162 WARN(rc, "error adding attribute %s to node %s\n", pp->name, np->full_name);
163 return rc;
164}
165
166int __of_attach_node_sysfs(struct device_node *np)
167{
168 const char *name;
169 struct kobject *parent;
170 struct property *pp;
171 int rc;
172
173 if (!IS_ENABLED(CONFIG_SYSFS))
174 return 0;
175
176 if (!of_kset)
177 return 0;
178
179 np->kobj.kset = of_kset;
180 if (!np->parent) {
181
182 name = safe_name(&of_kset->kobj, "base");
183 parent = NULL;
184 } else {
185 name = safe_name(&np->parent->kobj, kbasename(np->full_name));
186 parent = &np->parent->kobj;
187 }
188 if (!name)
189 return -ENOMEM;
190 rc = kobject_add(&np->kobj, parent, "%s", name);
191 kfree(name);
192 if (rc)
193 return rc;
194
195 for_each_property_of_node(np, pp)
196 __of_add_property_sysfs(np, pp);
197
198 return 0;
199}
200
201void __init of_core_init(void)
202{
203 struct device_node *np;
204
205
206 mutex_lock(&of_mutex);
207 of_kset = kset_create_and_add("devicetree", NULL, firmware_kobj);
208 if (!of_kset) {
209 mutex_unlock(&of_mutex);
210 pr_err("failed to register existing nodes\n");
211 return;
212 }
213 for_each_of_allnodes(np)
214 __of_attach_node_sysfs(np);
215 mutex_unlock(&of_mutex);
216
217
218 if (of_root)
219 proc_symlink("device-tree", NULL, "/sys/firmware/devicetree/base");
220}
221
222static struct property *__of_find_property(const struct device_node *np,
223 const char *name, int *lenp)
224{
225 struct property *pp;
226
227 if (!np)
228 return NULL;
229
230 for (pp = np->properties; pp; pp = pp->next) {
231 if (of_prop_cmp(pp->name, name) == 0) {
232 if (lenp)
233 *lenp = pp->length;
234 break;
235 }
236 }
237
238 return pp;
239}
240
241struct property *of_find_property(const struct device_node *np,
242 const char *name,
243 int *lenp)
244{
245 struct property *pp;
246 unsigned long flags;
247
248 raw_spin_lock_irqsave(&devtree_lock, flags);
249 pp = __of_find_property(np, name, lenp);
250 raw_spin_unlock_irqrestore(&devtree_lock, flags);
251
252 return pp;
253}
254EXPORT_SYMBOL(of_find_property);
255
256struct device_node *__of_find_all_nodes(struct device_node *prev)
257{
258 struct device_node *np;
259 if (!prev) {
260 np = of_root;
261 } else if (prev->child) {
262 np = prev->child;
263 } else {
264
265 np = prev;
266 while (np->parent && !np->sibling)
267 np = np->parent;
268 np = np->sibling;
269 }
270 return np;
271}
272
273
274
275
276
277
278
279
280
281struct device_node *of_find_all_nodes(struct device_node *prev)
282{
283 struct device_node *np;
284 unsigned long flags;
285
286 raw_spin_lock_irqsave(&devtree_lock, flags);
287 np = __of_find_all_nodes(prev);
288 of_node_get(np);
289 of_node_put(prev);
290 raw_spin_unlock_irqrestore(&devtree_lock, flags);
291 return np;
292}
293EXPORT_SYMBOL(of_find_all_nodes);
294
295
296
297
298
299const void *__of_get_property(const struct device_node *np,
300 const char *name, int *lenp)
301{
302 struct property *pp = __of_find_property(np, name, lenp);
303
304 return pp ? pp->value : NULL;
305}
306
307
308
309
310
311const void *of_get_property(const struct device_node *np, const char *name,
312 int *lenp)
313{
314 struct property *pp = of_find_property(np, name, lenp);
315
316 return pp ? pp->value : NULL;
317}
318EXPORT_SYMBOL(of_get_property);
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334bool __weak arch_match_cpu_phys_id(int cpu, u64 phys_id)
335{
336 return (u32)phys_id == cpu;
337}
338
339
340
341
342
343
344static bool __of_find_n_match_cpu_property(struct device_node *cpun,
345 const char *prop_name, int cpu, unsigned int *thread)
346{
347 const __be32 *cell;
348 int ac, prop_len, tid;
349 u64 hwid;
350
351 ac = of_n_addr_cells(cpun);
352 cell = of_get_property(cpun, prop_name, &prop_len);
353 if (!cell || !ac)
354 return false;
355 prop_len /= sizeof(*cell) * ac;
356 for (tid = 0; tid < prop_len; tid++) {
357 hwid = of_read_number(cell, ac);
358 if (arch_match_cpu_phys_id(cpu, hwid)) {
359 if (thread)
360 *thread = tid;
361 return true;
362 }
363 cell += ac;
364 }
365 return false;
366}
367
368
369
370
371
372
373
374bool __weak arch_find_n_match_cpu_physical_id(struct device_node *cpun,
375 int cpu, unsigned int *thread)
376{
377
378
379
380
381 if (IS_ENABLED(CONFIG_PPC) &&
382 __of_find_n_match_cpu_property(cpun,
383 "ibm,ppc-interrupt-server#s",
384 cpu, thread))
385 return true;
386
387 return __of_find_n_match_cpu_property(cpun, "reg", cpu, thread);
388}
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409struct device_node *of_get_cpu_node(int cpu, unsigned int *thread)
410{
411 struct device_node *cpun;
412
413 for_each_node_by_type(cpun, "cpu") {
414 if (arch_find_n_match_cpu_physical_id(cpun, cpu, thread))
415 return cpun;
416 }
417 return NULL;
418}
419EXPORT_SYMBOL(of_get_cpu_node);
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451static int __of_device_is_compatible(const struct device_node *device,
452 const char *compat, const char *type, const char *name)
453{
454 struct property *prop;
455 const char *cp;
456 int index = 0, score = 0;
457
458
459 if (compat && compat[0]) {
460 prop = __of_find_property(device, "compatible", NULL);
461 for (cp = of_prop_next_string(prop, NULL); cp;
462 cp = of_prop_next_string(prop, cp), index++) {
463 if (of_compat_cmp(cp, compat, strlen(compat)) == 0) {
464 score = INT_MAX/2 - (index << 2);
465 break;
466 }
467 }
468 if (!score)
469 return 0;
470 }
471
472
473 if (type && type[0]) {
474 if (!device->type || of_node_cmp(type, device->type))
475 return 0;
476 score += 2;
477 }
478
479
480 if (name && name[0]) {
481 if (!device->name || of_node_cmp(name, device->name))
482 return 0;
483 score++;
484 }
485
486 return score;
487}
488
489
490
491
492int of_device_is_compatible(const struct device_node *device,
493 const char *compat)
494{
495 unsigned long flags;
496 int res;
497
498 raw_spin_lock_irqsave(&devtree_lock, flags);
499 res = __of_device_is_compatible(device, compat, NULL, NULL);
500 raw_spin_unlock_irqrestore(&devtree_lock, flags);
501 return res;
502}
503EXPORT_SYMBOL(of_device_is_compatible);
504
505
506
507
508
509int of_device_compatible_match(struct device_node *device,
510 const char *const *compat)
511{
512 unsigned int tmp, score = 0;
513
514 if (!compat)
515 return 0;
516
517 while (*compat) {
518 tmp = of_device_is_compatible(device, *compat);
519 if (tmp > score)
520 score = tmp;
521 compat++;
522 }
523
524 return score;
525}
526
527
528
529
530
531
532
533
534int of_machine_is_compatible(const char *compat)
535{
536 struct device_node *root;
537 int rc = 0;
538
539 root = of_find_node_by_path("/");
540 if (root) {
541 rc = of_device_is_compatible(root, compat);
542 of_node_put(root);
543 }
544 return rc;
545}
546EXPORT_SYMBOL(of_machine_is_compatible);
547
548
549
550
551
552
553
554
555
556static bool __of_device_is_available(const struct device_node *device)
557{
558 const char *status;
559 int statlen;
560
561 if (!device)
562 return false;
563
564 status = __of_get_property(device, "status", &statlen);
565 if (status == NULL)
566 return true;
567
568 if (statlen > 0) {
569 if (!strcmp(status, "okay") || !strcmp(status, "ok"))
570 return true;
571 }
572
573 return false;
574}
575
576
577
578
579
580
581
582
583
584bool of_device_is_available(const struct device_node *device)
585{
586 unsigned long flags;
587 bool res;
588
589 raw_spin_lock_irqsave(&devtree_lock, flags);
590 res = __of_device_is_available(device);
591 raw_spin_unlock_irqrestore(&devtree_lock, flags);
592 return res;
593
594}
595EXPORT_SYMBOL(of_device_is_available);
596
597
598
599
600
601
602
603
604
605
606
607
608
609bool of_device_is_big_endian(const struct device_node *device)
610{
611 if (of_property_read_bool(device, "big-endian"))
612 return true;
613 if (IS_ENABLED(CONFIG_CPU_BIG_ENDIAN) &&
614 of_property_read_bool(device, "native-endian"))
615 return true;
616 return false;
617}
618EXPORT_SYMBOL(of_device_is_big_endian);
619
620
621
622
623
624
625
626
627struct device_node *of_get_parent(const struct device_node *node)
628{
629 struct device_node *np;
630 unsigned long flags;
631
632 if (!node)
633 return NULL;
634
635 raw_spin_lock_irqsave(&devtree_lock, flags);
636 np = of_node_get(node->parent);
637 raw_spin_unlock_irqrestore(&devtree_lock, flags);
638 return np;
639}
640EXPORT_SYMBOL(of_get_parent);
641
642
643
644
645
646
647
648
649
650
651
652
653struct device_node *of_get_next_parent(struct device_node *node)
654{
655 struct device_node *parent;
656 unsigned long flags;
657
658 if (!node)
659 return NULL;
660
661 raw_spin_lock_irqsave(&devtree_lock, flags);
662 parent = of_node_get(node->parent);
663 of_node_put(node);
664 raw_spin_unlock_irqrestore(&devtree_lock, flags);
665 return parent;
666}
667EXPORT_SYMBOL(of_get_next_parent);
668
669static struct device_node *__of_get_next_child(const struct device_node *node,
670 struct device_node *prev)
671{
672 struct device_node *next;
673
674 if (!node)
675 return NULL;
676
677 next = prev ? prev->sibling : node->child;
678 for (; next; next = next->sibling)
679 if (of_node_get(next))
680 break;
681 of_node_put(prev);
682 return next;
683}
684#define __for_each_child_of_node(parent, child) \
685 for (child = __of_get_next_child(parent, NULL); child != NULL; \
686 child = __of_get_next_child(parent, child))
687
688
689
690
691
692
693
694
695
696
697struct device_node *of_get_next_child(const struct device_node *node,
698 struct device_node *prev)
699{
700 struct device_node *next;
701 unsigned long flags;
702
703 raw_spin_lock_irqsave(&devtree_lock, flags);
704 next = __of_get_next_child(node, prev);
705 raw_spin_unlock_irqrestore(&devtree_lock, flags);
706 return next;
707}
708EXPORT_SYMBOL(of_get_next_child);
709
710
711
712
713
714
715
716
717
718struct device_node *of_get_next_available_child(const struct device_node *node,
719 struct device_node *prev)
720{
721 struct device_node *next;
722 unsigned long flags;
723
724 if (!node)
725 return NULL;
726
727 raw_spin_lock_irqsave(&devtree_lock, flags);
728 next = prev ? prev->sibling : node->child;
729 for (; next; next = next->sibling) {
730 if (!__of_device_is_available(next))
731 continue;
732 if (of_node_get(next))
733 break;
734 }
735 of_node_put(prev);
736 raw_spin_unlock_irqrestore(&devtree_lock, flags);
737 return next;
738}
739EXPORT_SYMBOL(of_get_next_available_child);
740
741
742
743
744
745
746
747
748
749
750
751
752struct device_node *of_get_child_by_name(const struct device_node *node,
753 const char *name)
754{
755 struct device_node *child;
756
757 for_each_child_of_node(node, child)
758 if (child->name && (of_node_cmp(child->name, name) == 0))
759 break;
760 return child;
761}
762EXPORT_SYMBOL(of_get_child_by_name);
763
764static struct device_node *__of_find_node_by_path(struct device_node *parent,
765 const char *path)
766{
767 struct device_node *child;
768 int len;
769
770 len = strcspn(path, "/:");
771 if (!len)
772 return NULL;
773
774 __for_each_child_of_node(parent, child) {
775 const char *name = strrchr(child->full_name, '/');
776 if (WARN(!name, "malformed device_node %s\n", child->full_name))
777 continue;
778 name++;
779 if (strncmp(path, name, len) == 0 && (strlen(name) == len))
780 return child;
781 }
782 return NULL;
783}
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803struct device_node *of_find_node_opts_by_path(const char *path, const char **opts)
804{
805 struct device_node *np = NULL;
806 struct property *pp;
807 unsigned long flags;
808 const char *separator = strchr(path, ':');
809
810 if (opts)
811 *opts = separator ? separator + 1 : NULL;
812
813 if (strcmp(path, "/") == 0)
814 return of_node_get(of_root);
815
816
817 if (*path != '/') {
818 int len;
819 const char *p = separator;
820
821 if (!p)
822 p = strchrnul(path, '/');
823 len = p - path;
824
825
826 if (!of_aliases)
827 return NULL;
828
829 for_each_property_of_node(of_aliases, pp) {
830 if (strlen(pp->name) == len && !strncmp(pp->name, path, len)) {
831 np = of_find_node_by_path(pp->value);
832 break;
833 }
834 }
835 if (!np)
836 return NULL;
837 path = p;
838 }
839
840
841 raw_spin_lock_irqsave(&devtree_lock, flags);
842 if (!np)
843 np = of_node_get(of_root);
844 while (np && *path == '/') {
845 path++;
846 np = __of_find_node_by_path(np, path);
847 path = strchrnul(path, '/');
848 if (separator && separator < path)
849 break;
850 }
851 raw_spin_unlock_irqrestore(&devtree_lock, flags);
852 return np;
853}
854EXPORT_SYMBOL(of_find_node_opts_by_path);
855
856
857
858
859
860
861
862
863
864
865
866
867struct device_node *of_find_node_by_name(struct device_node *from,
868 const char *name)
869{
870 struct device_node *np;
871 unsigned long flags;
872
873 raw_spin_lock_irqsave(&devtree_lock, flags);
874 for_each_of_allnodes_from(from, np)
875 if (np->name && (of_node_cmp(np->name, name) == 0)
876 && of_node_get(np))
877 break;
878 of_node_put(from);
879 raw_spin_unlock_irqrestore(&devtree_lock, flags);
880 return np;
881}
882EXPORT_SYMBOL(of_find_node_by_name);
883
884
885
886
887
888
889
890
891
892
893
894
895
896struct device_node *of_find_node_by_type(struct device_node *from,
897 const char *type)
898{
899 struct device_node *np;
900 unsigned long flags;
901
902 raw_spin_lock_irqsave(&devtree_lock, flags);
903 for_each_of_allnodes_from(from, np)
904 if (np->type && (of_node_cmp(np->type, type) == 0)
905 && of_node_get(np))
906 break;
907 of_node_put(from);
908 raw_spin_unlock_irqrestore(&devtree_lock, flags);
909 return np;
910}
911EXPORT_SYMBOL(of_find_node_by_type);
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927struct device_node *of_find_compatible_node(struct device_node *from,
928 const char *type, const char *compatible)
929{
930 struct device_node *np;
931 unsigned long flags;
932
933 raw_spin_lock_irqsave(&devtree_lock, flags);
934 for_each_of_allnodes_from(from, np)
935 if (__of_device_is_compatible(np, compatible, type, NULL) &&
936 of_node_get(np))
937 break;
938 of_node_put(from);
939 raw_spin_unlock_irqrestore(&devtree_lock, flags);
940 return np;
941}
942EXPORT_SYMBOL(of_find_compatible_node);
943
944
945
946
947
948
949
950
951
952
953
954
955
956struct device_node *of_find_node_with_property(struct device_node *from,
957 const char *prop_name)
958{
959 struct device_node *np;
960 struct property *pp;
961 unsigned long flags;
962
963 raw_spin_lock_irqsave(&devtree_lock, flags);
964 for_each_of_allnodes_from(from, np) {
965 for (pp = np->properties; pp; pp = pp->next) {
966 if (of_prop_cmp(pp->name, prop_name) == 0) {
967 of_node_get(np);
968 goto out;
969 }
970 }
971 }
972out:
973 of_node_put(from);
974 raw_spin_unlock_irqrestore(&devtree_lock, flags);
975 return np;
976}
977EXPORT_SYMBOL(of_find_node_with_property);
978
979static
980const struct of_device_id *__of_match_node(const struct of_device_id *matches,
981 const struct device_node *node)
982{
983 const struct of_device_id *best_match = NULL;
984 int score, best_score = 0;
985
986 if (!matches)
987 return NULL;
988
989 for (; matches->name[0] || matches->type[0] || matches->compatible[0]; matches++) {
990 score = __of_device_is_compatible(node, matches->compatible,
991 matches->type, matches->name);
992 if (score > best_score) {
993 best_match = matches;
994 best_score = score;
995 }
996 }
997
998 return best_match;
999}
1000
1001
1002
1003
1004
1005
1006
1007
1008const struct of_device_id *of_match_node(const struct of_device_id *matches,
1009 const struct device_node *node)
1010{
1011 const struct of_device_id *match;
1012 unsigned long flags;
1013
1014 raw_spin_lock_irqsave(&devtree_lock, flags);
1015 match = __of_match_node(matches, node);
1016 raw_spin_unlock_irqrestore(&devtree_lock, flags);
1017 return match;
1018}
1019EXPORT_SYMBOL(of_match_node);
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034struct device_node *of_find_matching_node_and_match(struct device_node *from,
1035 const struct of_device_id *matches,
1036 const struct of_device_id **match)
1037{
1038 struct device_node *np;
1039 const struct of_device_id *m;
1040 unsigned long flags;
1041
1042 if (match)
1043 *match = NULL;
1044
1045 raw_spin_lock_irqsave(&devtree_lock, flags);
1046 for_each_of_allnodes_from(from, np) {
1047 m = __of_match_node(matches, np);
1048 if (m && of_node_get(np)) {
1049 if (match)
1050 *match = m;
1051 break;
1052 }
1053 }
1054 of_node_put(from);
1055 raw_spin_unlock_irqrestore(&devtree_lock, flags);
1056 return np;
1057}
1058EXPORT_SYMBOL(of_find_matching_node_and_match);
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073int of_modalias_node(struct device_node *node, char *modalias, int len)
1074{
1075 const char *compatible, *p;
1076 int cplen;
1077
1078 compatible = of_get_property(node, "compatible", &cplen);
1079 if (!compatible || strlen(compatible) > cplen)
1080 return -ENODEV;
1081 p = strchr(compatible, ',');
1082 strlcpy(modalias, p ? p + 1 : compatible, len);
1083 return 0;
1084}
1085EXPORT_SYMBOL_GPL(of_modalias_node);
1086
1087
1088
1089
1090
1091
1092
1093
1094struct device_node *of_find_node_by_phandle(phandle handle)
1095{
1096 struct device_node *np;
1097 unsigned long flags;
1098
1099 if (!handle)
1100 return NULL;
1101
1102 raw_spin_lock_irqsave(&devtree_lock, flags);
1103 for_each_of_allnodes(np)
1104 if (np->phandle == handle)
1105 break;
1106 of_node_get(np);
1107 raw_spin_unlock_irqrestore(&devtree_lock, flags);
1108 return np;
1109}
1110EXPORT_SYMBOL(of_find_node_by_phandle);
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124int of_property_count_elems_of_size(const struct device_node *np,
1125 const char *propname, int elem_size)
1126{
1127 struct property *prop = of_find_property(np, propname, NULL);
1128
1129 if (!prop)
1130 return -EINVAL;
1131 if (!prop->value)
1132 return -ENODATA;
1133
1134 if (prop->length % elem_size != 0) {
1135 pr_err("size of %s in node %s is not a multiple of %d\n",
1136 propname, np->full_name, elem_size);
1137 return -EINVAL;
1138 }
1139
1140 return prop->length / elem_size;
1141}
1142EXPORT_SYMBOL_GPL(of_property_count_elems_of_size);
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159static void *of_find_property_value_of_size(const struct device_node *np,
1160 const char *propname, u32 min, u32 max, size_t *len)
1161{
1162 struct property *prop = of_find_property(np, propname, NULL);
1163
1164 if (!prop)
1165 return ERR_PTR(-EINVAL);
1166 if (!prop->value)
1167 return ERR_PTR(-ENODATA);
1168 if (prop->length < min)
1169 return ERR_PTR(-EOVERFLOW);
1170 if (max && prop->length > max)
1171 return ERR_PTR(-EOVERFLOW);
1172
1173 if (len)
1174 *len = prop->length;
1175
1176 return prop->value;
1177}
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194int of_property_read_u32_index(const struct device_node *np,
1195 const char *propname,
1196 u32 index, u32 *out_value)
1197{
1198 const u32 *val = of_find_property_value_of_size(np, propname,
1199 ((index + 1) * sizeof(*out_value)),
1200 0,
1201 NULL);
1202
1203 if (IS_ERR(val))
1204 return PTR_ERR(val);
1205
1206 *out_value = be32_to_cpup(((__be32 *)val) + index);
1207 return 0;
1208}
1209EXPORT_SYMBOL_GPL(of_property_read_u32_index);
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233int of_property_read_variable_u8_array(const struct device_node *np,
1234 const char *propname, u8 *out_values,
1235 size_t sz_min, size_t sz_max)
1236{
1237 size_t sz, count;
1238 const u8 *val = of_find_property_value_of_size(np, propname,
1239 (sz_min * sizeof(*out_values)),
1240 (sz_max * sizeof(*out_values)),
1241 &sz);
1242
1243 if (IS_ERR(val))
1244 return PTR_ERR(val);
1245
1246 if (!sz_max)
1247 sz = sz_min;
1248 else
1249 sz /= sizeof(*out_values);
1250
1251 count = sz;
1252 while (count--)
1253 *out_values++ = *val++;
1254
1255 return sz;
1256}
1257EXPORT_SYMBOL_GPL(of_property_read_variable_u8_array);
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281int of_property_read_variable_u16_array(const struct device_node *np,
1282 const char *propname, u16 *out_values,
1283 size_t sz_min, size_t sz_max)
1284{
1285 size_t sz, count;
1286 const __be16 *val = of_find_property_value_of_size(np, propname,
1287 (sz_min * sizeof(*out_values)),
1288 (sz_max * sizeof(*out_values)),
1289 &sz);
1290
1291 if (IS_ERR(val))
1292 return PTR_ERR(val);
1293
1294 if (!sz_max)
1295 sz = sz_min;
1296 else
1297 sz /= sizeof(*out_values);
1298
1299 count = sz;
1300 while (count--)
1301 *out_values++ = be16_to_cpup(val++);
1302
1303 return sz;
1304}
1305EXPORT_SYMBOL_GPL(of_property_read_variable_u16_array);
1306
1307
1308
1309
1310
1311
1312
1313
1314
1315
1316
1317
1318
1319
1320
1321
1322
1323
1324
1325
1326int of_property_read_variable_u32_array(const struct device_node *np,
1327 const char *propname, u32 *out_values,
1328 size_t sz_min, size_t sz_max)
1329{
1330 size_t sz, count;
1331 const __be32 *val = of_find_property_value_of_size(np, propname,
1332 (sz_min * sizeof(*out_values)),
1333 (sz_max * sizeof(*out_values)),
1334 &sz);
1335
1336 if (IS_ERR(val))
1337 return PTR_ERR(val);
1338
1339 if (!sz_max)
1340 sz = sz_min;
1341 else
1342 sz /= sizeof(*out_values);
1343
1344 count = sz;
1345 while (count--)
1346 *out_values++ = be32_to_cpup(val++);
1347
1348 return sz;
1349}
1350EXPORT_SYMBOL_GPL(of_property_read_variable_u32_array);
1351
1352
1353
1354
1355
1356
1357
1358
1359
1360
1361
1362
1363
1364
1365int of_property_read_u64(const struct device_node *np, const char *propname,
1366 u64 *out_value)
1367{
1368 const __be32 *val = of_find_property_value_of_size(np, propname,
1369 sizeof(*out_value),
1370 0,
1371 NULL);
1372
1373 if (IS_ERR(val))
1374 return PTR_ERR(val);
1375
1376 *out_value = of_read_number(val, 2);
1377 return 0;
1378}
1379EXPORT_SYMBOL_GPL(of_property_read_u64);
1380
1381
1382
1383
1384
1385
1386
1387
1388
1389
1390
1391
1392
1393
1394
1395
1396
1397
1398
1399
1400int of_property_read_variable_u64_array(const struct device_node *np,
1401 const char *propname, u64 *out_values,
1402 size_t sz_min, size_t sz_max)
1403{
1404 size_t sz, count;
1405 const __be32 *val = of_find_property_value_of_size(np, propname,
1406 (sz_min * sizeof(*out_values)),
1407 (sz_max * sizeof(*out_values)),
1408 &sz);
1409
1410 if (IS_ERR(val))
1411 return PTR_ERR(val);
1412
1413 if (!sz_max)
1414 sz = sz_min;
1415 else
1416 sz /= sizeof(*out_values);
1417
1418 count = sz;
1419 while (count--) {
1420 *out_values++ = of_read_number(val, 2);
1421 val += 2;
1422 }
1423
1424 return sz;
1425}
1426EXPORT_SYMBOL_GPL(of_property_read_variable_u64_array);
1427
1428
1429
1430
1431
1432
1433
1434
1435
1436
1437
1438
1439
1440
1441
1442
1443int of_property_read_string(const struct device_node *np, const char *propname,
1444 const char **out_string)
1445{
1446 const struct property *prop = of_find_property(np, propname, NULL);
1447 if (!prop)
1448 return -EINVAL;
1449 if (!prop->value)
1450 return -ENODATA;
1451 if (strnlen(prop->value, prop->length) >= prop->length)
1452 return -EILSEQ;
1453 *out_string = prop->value;
1454 return 0;
1455}
1456EXPORT_SYMBOL_GPL(of_property_read_string);
1457
1458
1459
1460
1461
1462
1463
1464
1465
1466
1467int of_property_match_string(const struct device_node *np, const char *propname,
1468 const char *string)
1469{
1470 const struct property *prop = of_find_property(np, propname, NULL);
1471 size_t l;
1472 int i;
1473 const char *p, *end;
1474
1475 if (!prop)
1476 return -EINVAL;
1477 if (!prop->value)
1478 return -ENODATA;
1479
1480 p = prop->value;
1481 end = p + prop->length;
1482
1483 for (i = 0; p < end; i++, p += l) {
1484 l = strnlen(p, end - p) + 1;
1485 if (p + l > end)
1486 return -EILSEQ;
1487 pr_debug("comparing %s with %s\n", string, p);
1488 if (strcmp(string, p) == 0)
1489 return i;
1490 }
1491 return -ENODATA;
1492}
1493EXPORT_SYMBOL_GPL(of_property_match_string);
1494
1495
1496
1497
1498
1499
1500
1501
1502
1503
1504
1505
1506int of_property_read_string_helper(const struct device_node *np,
1507 const char *propname, const char **out_strs,
1508 size_t sz, int skip)
1509{
1510 const struct property *prop = of_find_property(np, propname, NULL);
1511 int l = 0, i = 0;
1512 const char *p, *end;
1513
1514 if (!prop)
1515 return -EINVAL;
1516 if (!prop->value)
1517 return -ENODATA;
1518 p = prop->value;
1519 end = p + prop->length;
1520
1521 for (i = 0; p < end && (!out_strs || i < skip + sz); i++, p += l) {
1522 l = strnlen(p, end - p) + 1;
1523 if (p + l > end)
1524 return -EILSEQ;
1525 if (out_strs && i >= skip)
1526 *out_strs++ = p;
1527 }
1528 i -= skip;
1529 return i <= 0 ? -ENODATA : i;
1530}
1531EXPORT_SYMBOL_GPL(of_property_read_string_helper);
1532
1533void of_print_phandle_args(const char *msg, const struct of_phandle_args *args)
1534{
1535 int i;
1536 printk("%s %s", msg, of_node_full_name(args->np));
1537 for (i = 0; i < args->args_count; i++)
1538 printk(i ? ",%08x" : ":%08x", args->args[i]);
1539 printk("\n");
1540}
1541
1542int of_phandle_iterator_init(struct of_phandle_iterator *it,
1543 const struct device_node *np,
1544 const char *list_name,
1545 const char *cells_name,
1546 int cell_count)
1547{
1548 const __be32 *list;
1549 int size;
1550
1551 memset(it, 0, sizeof(*it));
1552
1553 list = of_get_property(np, list_name, &size);
1554 if (!list)
1555 return -ENOENT;
1556
1557 it->cells_name = cells_name;
1558 it->cell_count = cell_count;
1559 it->parent = np;
1560 it->list_end = list + size / sizeof(*list);
1561 it->phandle_end = list;
1562 it->cur = list;
1563
1564 return 0;
1565}
1566
1567int of_phandle_iterator_next(struct of_phandle_iterator *it)
1568{
1569 uint32_t count = 0;
1570
1571 if (it->node) {
1572 of_node_put(it->node);
1573 it->node = NULL;
1574 }
1575
1576 if (!it->cur || it->phandle_end >= it->list_end)
1577 return -ENOENT;
1578
1579 it->cur = it->phandle_end;
1580
1581
1582 it->phandle = be32_to_cpup(it->cur++);
1583
1584 if (it->phandle) {
1585
1586
1587
1588
1589
1590 it->node = of_find_node_by_phandle(it->phandle);
1591
1592 if (it->cells_name) {
1593 if (!it->node) {
1594 pr_err("%s: could not find phandle\n",
1595 it->parent->full_name);
1596 goto err;
1597 }
1598
1599 if (of_property_read_u32(it->node, it->cells_name,
1600 &count)) {
1601 pr_err("%s: could not get %s for %s\n",
1602 it->parent->full_name,
1603 it->cells_name,
1604 it->node->full_name);
1605 goto err;
1606 }
1607 } else {
1608 count = it->cell_count;
1609 }
1610
1611
1612
1613
1614
1615 if (it->cur + count > it->list_end) {
1616 pr_err("%s: arguments longer than property\n",
1617 it->parent->full_name);
1618 goto err;
1619 }
1620 }
1621
1622 it->phandle_end = it->cur + count;
1623 it->cur_count = count;
1624
1625 return 0;
1626
1627err:
1628 if (it->node) {
1629 of_node_put(it->node);
1630 it->node = NULL;
1631 }
1632
1633 return -EINVAL;
1634}
1635
1636int of_phandle_iterator_args(struct of_phandle_iterator *it,
1637 uint32_t *args,
1638 int size)
1639{
1640 int i, count;
1641
1642 count = it->cur_count;
1643
1644 if (WARN_ON(size < count))
1645 count = size;
1646
1647 for (i = 0; i < count; i++)
1648 args[i] = be32_to_cpup(it->cur++);
1649
1650 return count;
1651}
1652
1653static int __of_parse_phandle_with_args(const struct device_node *np,
1654 const char *list_name,
1655 const char *cells_name,
1656 int cell_count, int index,
1657 struct of_phandle_args *out_args)
1658{
1659 struct of_phandle_iterator it;
1660 int rc, cur_index = 0;
1661
1662
1663 of_for_each_phandle(&it, rc, np, list_name, cells_name, cell_count) {
1664
1665
1666
1667
1668
1669
1670 rc = -ENOENT;
1671 if (cur_index == index) {
1672 if (!it.phandle)
1673 goto err;
1674
1675 if (out_args) {
1676 int c;
1677
1678 c = of_phandle_iterator_args(&it,
1679 out_args->args,
1680 MAX_PHANDLE_ARGS);
1681 out_args->np = it.node;
1682 out_args->args_count = c;
1683 } else {
1684 of_node_put(it.node);
1685 }
1686
1687
1688 return 0;
1689 }
1690
1691 cur_index++;
1692 }
1693
1694
1695
1696
1697
1698
1699
1700 err:
1701 of_node_put(it.node);
1702 return rc;
1703}
1704
1705
1706
1707
1708
1709
1710
1711
1712
1713
1714
1715struct device_node *of_parse_phandle(const struct device_node *np,
1716 const char *phandle_name, int index)
1717{
1718 struct of_phandle_args args;
1719
1720 if (index < 0)
1721 return NULL;
1722
1723 if (__of_parse_phandle_with_args(np, phandle_name, NULL, 0,
1724 index, &args))
1725 return NULL;
1726
1727 return args.np;
1728}
1729EXPORT_SYMBOL(of_parse_phandle);
1730
1731
1732
1733
1734
1735
1736
1737
1738
1739
1740
1741
1742
1743
1744
1745
1746
1747
1748
1749
1750
1751
1752
1753
1754
1755
1756
1757
1758
1759
1760
1761
1762
1763int of_parse_phandle_with_args(const struct device_node *np, const char *list_name,
1764 const char *cells_name, int index,
1765 struct of_phandle_args *out_args)
1766{
1767 if (index < 0)
1768 return -EINVAL;
1769 return __of_parse_phandle_with_args(np, list_name, cells_name, 0,
1770 index, out_args);
1771}
1772EXPORT_SYMBOL(of_parse_phandle_with_args);
1773
1774
1775
1776
1777
1778
1779
1780
1781
1782
1783
1784
1785
1786
1787
1788
1789
1790
1791
1792
1793
1794
1795
1796
1797
1798
1799
1800
1801
1802
1803
1804int of_parse_phandle_with_fixed_args(const struct device_node *np,
1805 const char *list_name, int cell_count,
1806 int index, struct of_phandle_args *out_args)
1807{
1808 if (index < 0)
1809 return -EINVAL;
1810 return __of_parse_phandle_with_args(np, list_name, NULL, cell_count,
1811 index, out_args);
1812}
1813EXPORT_SYMBOL(of_parse_phandle_with_fixed_args);
1814
1815
1816
1817
1818
1819
1820
1821
1822
1823
1824
1825
1826
1827
1828
1829
1830int of_count_phandle_with_args(const struct device_node *np, const char *list_name,
1831 const char *cells_name)
1832{
1833 struct of_phandle_iterator it;
1834 int rc, cur_index = 0;
1835
1836 rc = of_phandle_iterator_init(&it, np, list_name, cells_name, 0);
1837 if (rc)
1838 return rc;
1839
1840 while ((rc = of_phandle_iterator_next(&it)) == 0)
1841 cur_index += 1;
1842
1843 if (rc != -ENOENT)
1844 return rc;
1845
1846 return cur_index;
1847}
1848EXPORT_SYMBOL(of_count_phandle_with_args);
1849
1850
1851
1852
1853int __of_add_property(struct device_node *np, struct property *prop)
1854{
1855 struct property **next;
1856
1857 prop->next = NULL;
1858 next = &np->properties;
1859 while (*next) {
1860 if (strcmp(prop->name, (*next)->name) == 0)
1861
1862 return -EEXIST;
1863
1864 next = &(*next)->next;
1865 }
1866 *next = prop;
1867
1868 return 0;
1869}
1870
1871
1872
1873
1874int of_add_property(struct device_node *np, struct property *prop)
1875{
1876 unsigned long flags;
1877 int rc;
1878
1879 mutex_lock(&of_mutex);
1880
1881 raw_spin_lock_irqsave(&devtree_lock, flags);
1882 rc = __of_add_property(np, prop);
1883 raw_spin_unlock_irqrestore(&devtree_lock, flags);
1884
1885 if (!rc)
1886 __of_add_property_sysfs(np, prop);
1887
1888 mutex_unlock(&of_mutex);
1889
1890 if (!rc)
1891 of_property_notify(OF_RECONFIG_ADD_PROPERTY, np, prop, NULL);
1892
1893 return rc;
1894}
1895
1896int __of_remove_property(struct device_node *np, struct property *prop)
1897{
1898 struct property **next;
1899
1900 for (next = &np->properties; *next; next = &(*next)->next) {
1901 if (*next == prop)
1902 break;
1903 }
1904 if (*next == NULL)
1905 return -ENODEV;
1906
1907
1908 *next = prop->next;
1909 prop->next = np->deadprops;
1910 np->deadprops = prop;
1911
1912 return 0;
1913}
1914
1915void __of_sysfs_remove_bin_file(struct device_node *np, struct property *prop)
1916{
1917 sysfs_remove_bin_file(&np->kobj, &prop->attr);
1918 kfree(prop->attr.attr.name);
1919}
1920
1921void __of_remove_property_sysfs(struct device_node *np, struct property *prop)
1922{
1923 if (!IS_ENABLED(CONFIG_SYSFS))
1924 return;
1925
1926
1927 if (of_kset && of_node_is_attached(np))
1928 __of_sysfs_remove_bin_file(np, prop);
1929}
1930
1931
1932
1933
1934
1935
1936
1937
1938
1939int of_remove_property(struct device_node *np, struct property *prop)
1940{
1941 unsigned long flags;
1942 int rc;
1943
1944 if (!prop)
1945 return -ENODEV;
1946
1947 mutex_lock(&of_mutex);
1948
1949 raw_spin_lock_irqsave(&devtree_lock, flags);
1950 rc = __of_remove_property(np, prop);
1951 raw_spin_unlock_irqrestore(&devtree_lock, flags);
1952
1953 if (!rc)
1954 __of_remove_property_sysfs(np, prop);
1955
1956 mutex_unlock(&of_mutex);
1957
1958 if (!rc)
1959 of_property_notify(OF_RECONFIG_REMOVE_PROPERTY, np, prop, NULL);
1960
1961 return rc;
1962}
1963
1964int __of_update_property(struct device_node *np, struct property *newprop,
1965 struct property **oldpropp)
1966{
1967 struct property **next, *oldprop;
1968
1969 for (next = &np->properties; *next; next = &(*next)->next) {
1970 if (of_prop_cmp((*next)->name, newprop->name) == 0)
1971 break;
1972 }
1973 *oldpropp = oldprop = *next;
1974
1975 if (oldprop) {
1976
1977 newprop->next = oldprop->next;
1978 *next = newprop;
1979 oldprop->next = np->deadprops;
1980 np->deadprops = oldprop;
1981 } else {
1982
1983 newprop->next = NULL;
1984 *next = newprop;
1985 }
1986
1987 return 0;
1988}
1989
1990void __of_update_property_sysfs(struct device_node *np, struct property *newprop,
1991 struct property *oldprop)
1992{
1993 if (!IS_ENABLED(CONFIG_SYSFS))
1994 return;
1995
1996
1997 if (!of_kset)
1998 return;
1999
2000 if (oldprop)
2001 __of_sysfs_remove_bin_file(np, oldprop);
2002 __of_add_property_sysfs(np, newprop);
2003}
2004
2005
2006
2007
2008
2009
2010
2011
2012
2013
2014int of_update_property(struct device_node *np, struct property *newprop)
2015{
2016 struct property *oldprop;
2017 unsigned long flags;
2018 int rc;
2019
2020 if (!newprop->name)
2021 return -EINVAL;
2022
2023 mutex_lock(&of_mutex);
2024
2025 raw_spin_lock_irqsave(&devtree_lock, flags);
2026 rc = __of_update_property(np, newprop, &oldprop);
2027 raw_spin_unlock_irqrestore(&devtree_lock, flags);
2028
2029 if (!rc)
2030 __of_update_property_sysfs(np, newprop, oldprop);
2031
2032 mutex_unlock(&of_mutex);
2033
2034 if (!rc)
2035 of_property_notify(OF_RECONFIG_UPDATE_PROPERTY, np, newprop, oldprop);
2036
2037 return rc;
2038}
2039
2040static void of_alias_add(struct alias_prop *ap, struct device_node *np,
2041 int id, const char *stem, int stem_len)
2042{
2043 ap->np = np;
2044 ap->id = id;
2045 strncpy(ap->stem, stem, stem_len);
2046 ap->stem[stem_len] = 0;
2047 list_add_tail(&ap->link, &aliases_lookup);
2048 pr_debug("adding DT alias:%s: stem=%s id=%i node=%s\n",
2049 ap->alias, ap->stem, ap->id, of_node_full_name(np));
2050}
2051
2052
2053
2054
2055
2056
2057
2058
2059
2060
2061
2062void of_alias_scan(void * (*dt_alloc)(u64 size, u64 align))
2063{
2064 struct property *pp;
2065
2066 of_aliases = of_find_node_by_path("/aliases");
2067 of_chosen = of_find_node_by_path("/chosen");
2068 if (of_chosen == NULL)
2069 of_chosen = of_find_node_by_path("/chosen@0");
2070
2071 if (of_chosen) {
2072
2073 const char *name = of_get_property(of_chosen, "stdout-path", NULL);
2074 if (!name)
2075 name = of_get_property(of_chosen, "linux,stdout-path", NULL);
2076 if (IS_ENABLED(CONFIG_PPC) && !name)
2077 name = of_get_property(of_aliases, "stdout", NULL);
2078 if (name)
2079 of_stdout = of_find_node_opts_by_path(name, &of_stdout_options);
2080 }
2081
2082 if (!of_aliases)
2083 return;
2084
2085 for_each_property_of_node(of_aliases, pp) {
2086 const char *start = pp->name;
2087 const char *end = start + strlen(start);
2088 struct device_node *np;
2089 struct alias_prop *ap;
2090 int id, len;
2091
2092
2093 if (!strcmp(pp->name, "name") ||
2094 !strcmp(pp->name, "phandle") ||
2095 !strcmp(pp->name, "linux,phandle"))
2096 continue;
2097
2098 np = of_find_node_by_path(pp->value);
2099 if (!np)
2100 continue;
2101
2102
2103
2104 while (isdigit(*(end-1)) && end > start)
2105 end--;
2106 len = end - start;
2107
2108 if (kstrtoint(end, 10, &id) < 0)
2109 continue;
2110
2111
2112 ap = dt_alloc(sizeof(*ap) + len + 1, 4);
2113 if (!ap)
2114 continue;
2115 memset(ap, 0, sizeof(*ap) + len + 1);
2116 ap->alias = start;
2117 of_alias_add(ap, np, id, start, len);
2118 }
2119}
2120
2121
2122
2123
2124
2125
2126
2127
2128
2129int of_alias_get_id(struct device_node *np, const char *stem)
2130{
2131 struct alias_prop *app;
2132 int id = -ENODEV;
2133
2134 mutex_lock(&of_mutex);
2135 list_for_each_entry(app, &aliases_lookup, link) {
2136 if (strcmp(app->stem, stem) != 0)
2137 continue;
2138
2139 if (np == app->np) {
2140 id = app->id;
2141 break;
2142 }
2143 }
2144 mutex_unlock(&of_mutex);
2145
2146 return id;
2147}
2148EXPORT_SYMBOL_GPL(of_alias_get_id);
2149
2150
2151
2152
2153
2154
2155
2156
2157int of_alias_get_highest_id(const char *stem)
2158{
2159 struct alias_prop *app;
2160 int id = -ENODEV;
2161
2162 mutex_lock(&of_mutex);
2163 list_for_each_entry(app, &aliases_lookup, link) {
2164 if (strcmp(app->stem, stem) != 0)
2165 continue;
2166
2167 if (app->id > id)
2168 id = app->id;
2169 }
2170 mutex_unlock(&of_mutex);
2171
2172 return id;
2173}
2174EXPORT_SYMBOL_GPL(of_alias_get_highest_id);
2175
2176const __be32 *of_prop_next_u32(struct property *prop, const __be32 *cur,
2177 u32 *pu)
2178{
2179 const void *curv = cur;
2180
2181 if (!prop)
2182 return NULL;
2183
2184 if (!cur) {
2185 curv = prop->value;
2186 goto out_val;
2187 }
2188
2189 curv += sizeof(*cur);
2190 if (curv >= prop->value + prop->length)
2191 return NULL;
2192
2193out_val:
2194 *pu = be32_to_cpup(curv);
2195 return curv;
2196}
2197EXPORT_SYMBOL_GPL(of_prop_next_u32);
2198
2199const char *of_prop_next_string(struct property *prop, const char *cur)
2200{
2201 const void *curv = cur;
2202
2203 if (!prop)
2204 return NULL;
2205
2206 if (!cur)
2207 return prop->value;
2208
2209 curv += strlen(cur) + 1;
2210 if (curv >= prop->value + prop->length)
2211 return NULL;
2212
2213 return curv;
2214}
2215EXPORT_SYMBOL_GPL(of_prop_next_string);
2216
2217
2218
2219
2220
2221
2222
2223
2224
2225
2226
2227bool of_console_check(struct device_node *dn, char *name, int index)
2228{
2229 if (!dn || dn != of_stdout || console_set_on_cmdline)
2230 return false;
2231 return !add_preferred_console(name, index,
2232 kstrdup(of_stdout_options, GFP_KERNEL));
2233}
2234EXPORT_SYMBOL_GPL(of_console_check);
2235
2236
2237
2238
2239
2240
2241
2242
2243
2244struct device_node *of_find_next_cache_node(const struct device_node *np)
2245{
2246 struct device_node *child;
2247 const phandle *handle;
2248
2249 handle = of_get_property(np, "l2-cache", NULL);
2250 if (!handle)
2251 handle = of_get_property(np, "next-level-cache", NULL);
2252
2253 if (handle)
2254 return of_find_node_by_phandle(be32_to_cpup(handle));
2255
2256
2257
2258
2259 if (!strcmp(np->type, "cpu"))
2260 for_each_child_of_node(np, child)
2261 if (!strcmp(child->type, "cache"))
2262 return child;
2263
2264 return NULL;
2265}
2266
2267
2268
2269
2270
2271
2272
2273
2274int of_graph_parse_endpoint(const struct device_node *node,
2275 struct of_endpoint *endpoint)
2276{
2277 struct device_node *port_node = of_get_parent(node);
2278
2279 WARN_ONCE(!port_node, "%s(): endpoint %s has no parent node\n",
2280 __func__, node->full_name);
2281
2282 memset(endpoint, 0, sizeof(*endpoint));
2283
2284 endpoint->local_node = node;
2285
2286
2287
2288
2289 of_property_read_u32(port_node, "reg", &endpoint->port);
2290 of_property_read_u32(node, "reg", &endpoint->id);
2291
2292 of_node_put(port_node);
2293
2294 return 0;
2295}
2296EXPORT_SYMBOL(of_graph_parse_endpoint);
2297
2298
2299
2300
2301
2302
2303
2304
2305
2306struct device_node *of_graph_get_port_by_id(struct device_node *parent, u32 id)
2307{
2308 struct device_node *node, *port;
2309
2310 node = of_get_child_by_name(parent, "ports");
2311 if (node)
2312 parent = node;
2313
2314 for_each_child_of_node(parent, port) {
2315 u32 port_id = 0;
2316
2317 if (of_node_cmp(port->name, "port") != 0)
2318 continue;
2319 of_property_read_u32(port, "reg", &port_id);
2320 if (id == port_id)
2321 break;
2322 }
2323
2324 of_node_put(node);
2325
2326 return port;
2327}
2328EXPORT_SYMBOL(of_graph_get_port_by_id);
2329
2330
2331
2332
2333
2334
2335
2336
2337
2338struct device_node *of_graph_get_next_endpoint(const struct device_node *parent,
2339 struct device_node *prev)
2340{
2341 struct device_node *endpoint;
2342 struct device_node *port;
2343
2344 if (!parent)
2345 return NULL;
2346
2347
2348
2349
2350
2351
2352 if (!prev) {
2353 struct device_node *node;
2354
2355 node = of_get_child_by_name(parent, "ports");
2356 if (node)
2357 parent = node;
2358
2359 port = of_get_child_by_name(parent, "port");
2360 of_node_put(node);
2361
2362 if (!port) {
2363 pr_err("graph: no port node found in %s\n",
2364 parent->full_name);
2365 return NULL;
2366 }
2367 } else {
2368 port = of_get_parent(prev);
2369 if (WARN_ONCE(!port, "%s(): endpoint %s has no parent node\n",
2370 __func__, prev->full_name))
2371 return NULL;
2372 }
2373
2374 while (1) {
2375
2376
2377
2378
2379
2380 endpoint = of_get_next_child(port, prev);
2381 if (endpoint) {
2382 of_node_put(port);
2383 return endpoint;
2384 }
2385
2386
2387 prev = NULL;
2388
2389 do {
2390 port = of_get_next_child(parent, port);
2391 if (!port)
2392 return NULL;
2393 } while (of_node_cmp(port->name, "port"));
2394 }
2395}
2396EXPORT_SYMBOL(of_graph_get_next_endpoint);
2397
2398
2399
2400
2401
2402
2403
2404
2405
2406
2407
2408struct device_node *of_graph_get_endpoint_by_regs(
2409 const struct device_node *parent, int port_reg, int reg)
2410{
2411 struct of_endpoint endpoint;
2412 struct device_node *node = NULL;
2413
2414 for_each_endpoint_of_node(parent, node) {
2415 of_graph_parse_endpoint(node, &endpoint);
2416 if (((port_reg == -1) || (endpoint.port == port_reg)) &&
2417 ((reg == -1) || (endpoint.id == reg)))
2418 return node;
2419 }
2420
2421 return NULL;
2422}
2423EXPORT_SYMBOL(of_graph_get_endpoint_by_regs);
2424
2425
2426
2427
2428
2429
2430
2431
2432struct device_node *of_graph_get_remote_port_parent(
2433 const struct device_node *node)
2434{
2435 struct device_node *np;
2436 unsigned int depth;
2437
2438
2439 np = of_parse_phandle(node, "remote-endpoint", 0);
2440
2441
2442 for (depth = 3; depth && np; depth--) {
2443 np = of_get_next_parent(np);
2444 if (depth == 2 && of_node_cmp(np->name, "ports"))
2445 break;
2446 }
2447 return np;
2448}
2449EXPORT_SYMBOL(of_graph_get_remote_port_parent);
2450
2451
2452
2453
2454
2455
2456
2457
2458struct device_node *of_graph_get_remote_port(const struct device_node *node)
2459{
2460 struct device_node *np;
2461
2462
2463 np = of_parse_phandle(node, "remote-endpoint", 0);
2464 if (!np)
2465 return NULL;
2466 return of_get_next_parent(np);
2467}
2468EXPORT_SYMBOL(of_graph_get_remote_port);
2469