1# Copyright (c) 2018-2019 Linaro
2# Copyright (c) 2019 Nordic Semiconductor ASA
3#
4# SPDX-License-Identifier: Apache-2.0
5
6import inspect
7import os
8import pickle
9import sys
10from pathlib import Path
11
12ZEPHYR_BASE = str(Path(__file__).resolve().parents[2])
13sys.path.insert(0, os.path.join(ZEPHYR_BASE, "scripts", "dts",
14                                "python-devicetree", "src"))
15
16# Types we support
17# 'string', 'int', 'hex', 'bool'
18
19doc_mode = os.environ.get('KCONFIG_DOC_MODE') == "1"
20
21if not doc_mode:
22    EDT_PICKLE = os.environ.get("EDT_PICKLE")
23
24    # The "if" handles a missing dts.
25    if EDT_PICKLE is not None and os.path.isfile(EDT_PICKLE):
26        with open(EDT_PICKLE, 'rb') as f:
27            edt = pickle.load(f)
28            edtlib = inspect.getmodule(edt)
29    else:
30        edt = None
31
32
33def _warn(kconf, msg):
34    print("{}:{}: WARNING: {}".format(kconf.filename, kconf.linenr, msg))
35
36
37def _dt_units_to_scale(unit):
38    if not unit:
39        return 0
40    if unit in {'k', 'K'}:
41        return 10
42    if unit in {'m', 'M'}:
43        return 20
44    if unit in {'g', 'G'}:
45        return 30
46    if unit in {'kb', 'Kb'}:
47        return 13
48    if unit in {'mb', 'Mb'}:
49        return 23
50    if unit in {'gb', 'Gb'}:
51        return 33
52
53
54def dt_chosen_label(kconf, _, chosen):
55    """
56    This function takes a 'chosen' property and treats that property as a path
57    to an EDT node.  If it finds an EDT node, it will look to see if that node
58    has a "label" property and return the value of that "label". If not, we
59    return the node's name in the devicetree.
60    """
61    if doc_mode or edt is None:
62        return ""
63
64    node = edt.chosen_node(chosen)
65    if not node:
66        return ""
67
68    if "label" not in node.props:
69        return node.name
70
71    return node.props["label"].val
72
73
74def dt_chosen_enabled(kconf, _, chosen):
75    """
76    This function returns "y" if /chosen contains a property named 'chosen'
77    that points to an enabled node, and "n" otherwise
78    """
79    if doc_mode or edt is None:
80        return "n"
81
82    node = edt.chosen_node(chosen)
83    return "y" if node and node.status == "okay" else "n"
84
85
86def dt_chosen_path(kconf, _, chosen):
87    """
88    This function takes a /chosen node property and returns the path
89    to the node in the property value, or the empty string.
90    """
91    if doc_mode or edt is None:
92        return "n"
93
94    node = edt.chosen_node(chosen)
95
96    return node.path if node else ""
97
98def dt_chosen_has_compat(kconf, _, chosen, compat):
99    """
100    This function takes a /chosen node property and returns 'y' if the
101    chosen node has the provided compatible string 'compat'
102    """
103    if doc_mode or edt is None:
104        return "n"
105
106    node = edt.chosen_node(chosen)
107
108    if node is None:
109        return "n"
110
111    if compat in node.compats:
112        return "y"
113
114    return "n"
115
116def dt_node_enabled(kconf, name, node):
117    """
118    This function is used to test if a node is enabled (has status
119    'okay') or not.
120
121    The 'node' argument is a string which is either a path or an
122    alias, or both, depending on 'name'.
123
124    If 'name' is 'dt_path_enabled', 'node' is an alias or a path. If
125    'name' is 'dt_alias_enabled, 'node' is an alias.
126    """
127
128    if doc_mode or edt is None:
129        return "n"
130
131    if name == "dt_alias_enabled":
132        if node.startswith("/"):
133            # EDT.get_node() works with either aliases or paths. If we
134            # are specifically being asked about an alias, reject paths.
135            return "n"
136    else:
137        # Make sure this is being called appropriately.
138        assert name == "dt_path_enabled"
139
140    try:
141        node = edt.get_node(node)
142    except edtlib.EDTError:
143        return "n"
144
145    return "y" if node and node.status == "okay" else "n"
146
147
148def dt_nodelabel_enabled(kconf, _, label):
149    """
150    This function is like dt_node_enabled(), but the 'label' argument
151    should be a node label, like "foo" is here:
152
153       foo: some-node { ... };
154    """
155    if doc_mode or edt is None:
156        return "n"
157
158    node = edt.label2node.get(label)
159
160    return "y" if node and node.status == "okay" else "n"
161
162
163def _node_reg_addr(node, index, unit):
164    if not node:
165        return 0
166
167    if not node.regs:
168        return 0
169
170    if int(index) >= len(node.regs):
171        return 0
172
173    if node.regs[int(index)].addr is None:
174        return 0
175
176    return node.regs[int(index)].addr >> _dt_units_to_scale(unit)
177
178
179def _node_reg_size(node, index, unit):
180    if not node:
181        return 0
182
183    if not node.regs:
184        return 0
185
186    if int(index) >= len(node.regs):
187        return 0
188
189    if node.regs[int(index)].size is None:
190        return 0
191
192    return node.regs[int(index)].size >> _dt_units_to_scale(unit)
193
194
195def _node_int_prop(node, prop, unit=None):
196    """
197    This function takes a 'node' and  will look to see if that 'node' has a
198    property called 'prop' and if that 'prop' is an integer type will return
199    the value of the property 'prop' as either a string int or string hex
200    value, if not we return 0.
201
202    The function will divide the value based on 'unit':
203        None        No division
204        'k' or 'K'  divide by 1024 (1 << 10)
205        'm' or 'M'  divide by 1,048,576 (1 << 20)
206        'g' or 'G'  divide by 1,073,741,824 (1 << 30)
207        'kb' or 'Kb'  divide by 8192 (1 << 13)
208        'mb' or 'Mb'  divide by 8,388,608 (1 << 23)
209        'gb' or 'Gb'  divide by 8,589,934,592 (1 << 33)
210    """
211    if not node:
212        return 0
213
214    if prop not in node.props:
215        return 0
216
217    if node.props[prop].type != "int":
218        return 0
219
220    return node.props[prop].val >> _dt_units_to_scale(unit)
221
222
223def _node_array_prop(node, prop, index=0, unit=None):
224    """
225    This function takes a 'node' and  will look to see if that 'node' has a
226    property called 'prop' and if that 'prop' is an array type will return
227    the value of the property 'prop' at the given 'index' as either a string int
228    or string hex value. If the property 'prop' is not found or the given 'index'
229    is out of range it will return 0.
230
231    The function will divide the value based on 'unit':
232        None        No division
233        'k' or 'K'  divide by 1024 (1 << 10)
234        'm' or 'M'  divide by 1,048,576 (1 << 20)
235        'g' or 'G'  divide by 1,073,741,824 (1 << 30)
236    """
237    if not node:
238        return 0
239
240    if prop not in node.props:
241        return 0
242    if node.props[prop].type != "array":
243        return 0
244    if int(index) >= len(node.props[prop].val):
245        return 0
246    return node.props[prop].val[int(index)] >> _dt_units_to_scale(unit)
247
248
249def _dt_chosen_reg_addr(kconf, chosen, index=0, unit=None):
250    """
251    This function takes a 'chosen' property and treats that property as a path
252    to an EDT node.  If it finds an EDT node, it will look to see if that
253    node has a register at the given 'index' and return the address value of
254    that reg, if not we return 0.
255
256    The function will divide the value based on 'unit':
257        None        No division
258        'k' or 'K'  divide by 1024 (1 << 10)
259        'm' or 'M'  divide by 1,048,576 (1 << 20)
260        'g' or 'G'  divide by 1,073,741,824 (1 << 30)
261        'kb' or 'Kb'  divide by 8192 (1 << 13)
262        'mb' or 'Mb'  divide by 8,388,608 (1 << 23)
263        'gb' or 'Gb'  divide by 8,589,934,592 (1 << 33)
264    """
265    if doc_mode or edt is None:
266        return 0
267
268    node = edt.chosen_node(chosen)
269
270    return _node_reg_addr(node, index, unit)
271
272
273def _dt_chosen_reg_size(kconf, chosen, index=0, unit=None):
274    """
275    This function takes a 'chosen' property and treats that property as a path
276    to an EDT node.  If it finds an EDT node, it will look to see if that node
277    has a register at the given 'index' and return the size value of that reg,
278    if not we return 0.
279
280    The function will divide the value based on 'unit':
281        None        No division
282        'k' or 'K'  divide by 1024 (1 << 10)
283        'm' or 'M'  divide by 1,048,576 (1 << 20)
284        'g' or 'G'  divide by 1,073,741,824 (1 << 30)
285        'kb' or 'Kb'  divide by 8192 (1 << 13)
286        'mb' or 'Mb'  divide by 8,388,608 (1 << 23)
287        'gb' or 'Gb'  divide by 8,589,934,592 (1 << 33)
288    """
289    if doc_mode or edt is None:
290        return 0
291
292    node = edt.chosen_node(chosen)
293
294    return _node_reg_size(node, index, unit)
295
296
297def dt_chosen_reg(kconf, name, chosen, index=0, unit=None):
298    """
299    This function just routes to the proper function and converts
300    the result to either a string int or string hex value.
301    """
302    if name == "dt_chosen_reg_size_int":
303        return str(_dt_chosen_reg_size(kconf, chosen, index, unit))
304    if name == "dt_chosen_reg_size_hex":
305        return hex(_dt_chosen_reg_size(kconf, chosen, index, unit))
306    if name == "dt_chosen_reg_addr_int":
307        return str(_dt_chosen_reg_addr(kconf, chosen, index, unit))
308    if name == "dt_chosen_reg_addr_hex":
309        return hex(_dt_chosen_reg_addr(kconf, chosen, index, unit))
310
311
312def _dt_node_reg_addr(kconf, path, index=0, unit=None):
313    """
314    This function takes a 'path' and looks for an EDT node at that path. If it
315    finds an EDT node, it will look to see if that node has a register at the
316    given 'index' and return the address value of that reg, if not we return 0.
317
318    The function will divide the value based on 'unit':
319        None        No division
320        'k' or 'K'  divide by 1024 (1 << 10)
321        'm' or 'M'  divide by 1,048,576 (1 << 20)
322        'g' or 'G'  divide by 1,073,741,824 (1 << 30)
323        'kb' or 'Kb'  divide by 8192 (1 << 13)
324        'mb' or 'Mb'  divide by 8,388,608 (1 << 23)
325        'gb' or 'Gb'  divide by 8,589,934,592 (1 << 33)
326    """
327    if doc_mode or edt is None:
328        return 0
329
330    try:
331        node = edt.get_node(path)
332    except edtlib.EDTError:
333        return 0
334
335    return _node_reg_addr(node, index, unit)
336
337
338def _dt_node_reg_size(kconf, path, index=0, unit=None):
339    """
340    This function takes a 'path' and looks for an EDT node at that path. If it
341    finds an EDT node, it will look to see if that node has a register at the
342    given 'index' and return the size value of that reg, if not we return 0.
343
344    The function will divide the value based on 'unit':
345        None        No division
346        'k' or 'K'  divide by 1024 (1 << 10)
347        'm' or 'M'  divide by 1,048,576 (1 << 20)
348        'g' or 'G'  divide by 1,073,741,824 (1 << 30)
349        'kb' or 'Kb'  divide by 8192 (1 << 13)
350        'mb' or 'Mb'  divide by 8,388,608 (1 << 23)
351        'gb' or 'Gb'  divide by 8,589,934,592 (1 << 33)
352    """
353    if doc_mode or edt is None:
354        return 0
355
356    try:
357        node = edt.get_node(path)
358    except edtlib.EDTError:
359        return 0
360
361    return _node_reg_size(node, index, unit)
362
363
364def dt_node_reg(kconf, name, path, index=0, unit=None):
365    """
366    This function just routes to the proper function and converts
367    the result to either a string int or string hex value.
368    """
369    if name == "dt_node_reg_size_int":
370        return str(_dt_node_reg_size(kconf, path, index, unit))
371    if name == "dt_node_reg_size_hex":
372        return hex(_dt_node_reg_size(kconf, path, index, unit))
373    if name == "dt_node_reg_addr_int":
374        return str(_dt_node_reg_addr(kconf, path, index, unit))
375    if name == "dt_node_reg_addr_hex":
376        return hex(_dt_node_reg_addr(kconf, path, index, unit))
377
378def _dt_node_bool_prop_generic(node_search_function, search_arg, prop):
379    """
380    This function takes the 'node_search_function' and uses it to search for
381    a node with 'search_arg' and if node exists, checks if 'prop' exists
382    inside the node and is a boolean, if it is true, returns "y".
383    Otherwise, it returns "n".
384    """
385    try:
386        node = node_search_function(search_arg)
387    except edtlib.EDTError:
388        return "n"
389
390    if node is None:
391        return "n"
392
393    if prop not in node.props:
394        return "n"
395
396    if node.props[prop].type != "boolean":
397        return "n"
398
399    if node.props[prop].val:
400        return "y"
401
402    return "n"
403
404def dt_node_bool_prop(kconf, _, path, prop):
405    """
406    This function takes a 'path' and looks for an EDT node at that path. If it
407    finds an EDT node, it will look to see if that node has a boolean property
408    by the name of 'prop'.  If the 'prop' exists it will return "y" otherwise
409    we return "n".
410    """
411    if doc_mode or edt is None:
412        return "n"
413
414    return _dt_node_bool_prop_generic(edt.get_node, path, prop)
415
416def dt_nodelabel_bool_prop(kconf, _, label, prop):
417    """
418    This function takes a 'label' and looks for an EDT node with that label.
419    If it finds an EDT node, it will look to see if that node has a boolean
420    property by the name of 'prop'.  If the 'prop' exists it will return "y"
421    otherwise we return "n".
422    """
423    if doc_mode or edt is None:
424        return "n"
425
426    return _dt_node_bool_prop_generic(edt.label2node.get, label, prop)
427
428def dt_chosen_bool_prop(kconf, _, chosen, prop):
429    """
430    This function takes a /chosen node property named 'chosen', and
431    looks for the chosen node. If that node exists and has a boolean
432    property 'prop', it returns "y". Otherwise, it returns "n".
433    """
434    if doc_mode or edt is None:
435        return "n"
436
437    return _dt_node_bool_prop_generic(edt.chosen_node, chosen, prop)
438
439def _dt_node_has_prop_generic(node_search_function, search_arg, prop):
440    """
441    This function takes the 'node_search_function' and uses it to search for
442    a node with 'search_arg' and if node exists, then checks if 'prop'
443    exists inside the node and returns "y". Otherwise, it returns "n".
444    """
445    try:
446        node = node_search_function(search_arg)
447    except edtlib.EDTError:
448        return "n"
449
450    if node is None:
451        return "n"
452
453    if prop in node.props:
454        return "y"
455
456    return "n"
457
458def dt_node_has_prop(kconf, _, path, prop):
459    """
460    This function takes a 'path' and looks for an EDT node at that path. If it
461    finds an EDT node, it will look to see if that node has a property
462    by the name of 'prop'.  If the 'prop' exists it will return "y" otherwise
463    it returns "n".
464    """
465    if doc_mode or edt is None:
466        return "n"
467
468    return _dt_node_has_prop_generic(edt.get_node, path, prop)
469
470def dt_nodelabel_has_prop(kconf, _, label, prop):
471    """
472    This function takes a 'label' and looks for an EDT node with that label.
473    If it finds an EDT node, it will look to see if that node has a property
474    by the name of 'prop'.  If the 'prop' exists it will return "y" otherwise
475    it returns "n".
476    """
477    if doc_mode or edt is None:
478        return "n"
479
480    return _dt_node_has_prop_generic(edt.label2node.get, label, prop)
481
482def dt_node_int_prop(kconf, name, path, prop, unit=None):
483    """
484    This function takes a 'path' and property name ('prop') looks for an EDT
485    node at that path. If it finds an EDT node, it will look to see if that
486    node has a property called 'prop' and if that 'prop' is an integer type
487    will return the value of the property 'prop' as either a string int or
488    string hex value, if not we return 0.
489
490    The function will divide the value based on 'unit':
491        None        No division
492        'k' or 'K'  divide by 1024 (1 << 10)
493        'm' or 'M'  divide by 1,048,576 (1 << 20)
494        'g' or 'G'  divide by 1,073,741,824 (1 << 30)
495        'kb' or 'Kb'  divide by 8192 (1 << 13)
496        'mb' or 'Mb'  divide by 8,388,608 (1 << 23)
497        'gb' or 'Gb'  divide by 8,589,934,592 (1 << 33)
498    """
499    if doc_mode or edt is None:
500        return "0"
501
502    try:
503        node = edt.get_node(path)
504    except edtlib.EDTError:
505        return "0"
506
507    if name == "dt_node_int_prop_int":
508        return str(_node_int_prop(node, prop, unit))
509    if name == "dt_node_int_prop_hex":
510        return hex(_node_int_prop(node, prop, unit))
511
512
513def dt_node_array_prop(kconf, name, path, prop, index, unit=None):
514    """
515    This function takes a 'path', property name ('prop') and index ('index')
516    and looks for an EDT node at that path. If it finds an EDT node, it will
517    look to see if that node has a property called 'prop' and if that 'prop'
518    is an array type will return the value of the property 'prop' at the given
519    'index' as either a string int or string hex value. If not found we return 0.
520
521    The function will divide the value based on 'unit':
522        None        No division
523        'k' or 'K'  divide by 1024 (1 << 10)
524        'm' or 'M'  divide by 1,048,576 (1 << 20)
525        'g' or 'G'  divide by 1,073,741,824 (1 << 30)
526    """
527    if doc_mode or edt is None:
528        return "0"
529
530    try:
531        node = edt.get_node(path)
532    except edtlib.EDTError:
533        return "0"
534    if name == "dt_node_array_prop_int":
535        return str(_node_array_prop(node, prop, index, unit))
536    if name == "dt_node_array_prop_hex":
537        return hex(_node_array_prop(node, prop, index, unit))
538
539
540def dt_node_str_prop_equals(kconf, _, path, prop, val):
541    """
542    This function takes a 'path' and property name ('prop') looks for an EDT
543    node at that path. If it finds an EDT node, it will look to see if that
544    node has a property 'prop' of type string. If that 'prop' is equal to 'val'
545    it will return "y" otherwise return "n".
546    """
547
548    if doc_mode or edt is None:
549        return "n"
550
551    try:
552        node = edt.get_node(path)
553    except edtlib.EDTError:
554        return "n"
555
556    if prop not in node.props:
557        return "n"
558
559    if node.props[prop].type != "string":
560        return "n"
561
562    if node.props[prop].val == val:
563        return "y"
564
565    return "n"
566
567
568def dt_has_compat(kconf, _, compat):
569    """
570    This function takes a 'compat' and returns "y" if any compatible node
571    can be found in the EDT, otherwise it returns "n".
572    """
573    if doc_mode or edt is None:
574        return "n"
575
576    return "y" if compat in edt.compat2nodes else "n"
577
578
579def dt_compat_enabled(kconf, _, compat):
580    """
581    This function takes a 'compat' and returns "y" if we find a status "okay"
582    compatible node in the EDT otherwise we return "n"
583    """
584    if doc_mode or edt is None:
585        return "n"
586
587    return "y" if compat in edt.compat2okay else "n"
588
589
590def dt_compat_on_bus(kconf, _, compat, bus):
591    """
592    This function takes a 'compat' and returns "y" if we find an "enabled"
593    compatible node in the EDT which is on bus 'bus'. It returns "n" otherwise.
594    """
595    if doc_mode or edt is None:
596        return "n"
597
598    if compat in edt.compat2okay:
599        for node in edt.compat2okay[compat]:
600            if node.on_buses is not None and bus in node.on_buses:
601                return "y"
602
603    return "n"
604
605
606def dt_nodelabel_has_compat(kconf, _, label, compat):
607    """
608    This function takes a 'label' and looks for an EDT node with that label.
609    If it finds such node, it returns "y" if this node is compatible with
610    the provided 'compat'. Otherwise, it return "n" .
611    """
612    if doc_mode or edt is None:
613        return "n"
614
615    node = edt.label2node.get(label)
616
617    if node and compat in node.compats:
618        return "y"
619
620    return "n"
621
622def dt_node_has_compat(kconf, _, path, compat):
623    """
624    This function takes a 'path' and looks for an EDT node at that path. If it
625    finds an EDT node, it returns "y" if this node is compatible with
626    the provided 'compat'. Otherwise, it return "n" .
627    """
628
629    if doc_mode or edt is None:
630        return "n"
631
632    try:
633        node = edt.get_node(path)
634    except edtlib.EDTError:
635        return "n"
636
637    if node and compat in node.compats:
638        return "y"
639
640    return "n"
641
642def dt_nodelabel_enabled_with_compat(kconf, _, label, compat):
643    """
644    This function takes a 'label' and returns "y" if an "enabled" node with
645    such label can be found in the EDT and that node is compatible with the
646    provided 'compat', otherwise it returns "n".
647    """
648    if doc_mode or edt is None:
649        return "n"
650
651    if compat in edt.compat2okay:
652        for node in edt.compat2okay[compat]:
653            if label in node.labels:
654                return "y"
655
656    return "n"
657
658
659def dt_nodelabel_array_prop_has_val(kconf, _, label, prop, val):
660    """
661    This function looks for a node with node label 'label'.
662    If the node exists, it checks if the node node has a property
663    'prop' with type "array". If so, and the property contains
664    an element equal to the integer 'val', it returns "y".
665    Otherwise, it returns "n".
666    """
667    if doc_mode or edt is None:
668        return "n"
669
670    node = edt.label2node.get(label)
671
672    if not node or (prop not in node.props) or (node.props[prop].type != "array"):
673        return "n"
674    else:
675        return "y" if int(val, base=0) in node.props[prop].val else "n"
676
677
678def dt_nodelabel_path(kconf, _, label):
679    """
680    This function takes a node label (not a label property) and
681    returns the path to the node which has that label, or an empty
682    string if there is no such node.
683    """
684    if doc_mode or edt is None:
685        return ""
686
687    node = edt.label2node.get(label)
688
689    return node.path if node else ""
690
691def dt_node_parent(kconf, _, path):
692    """
693    This function takes a 'path' and looks for an EDT node at that path. If it
694    finds an EDT node, it will look for the parent of that node. If the parent
695    exists, it will return the path to that parent. Otherwise, an empty string
696    will be returned.
697    """
698    if doc_mode or edt is None:
699        return ""
700
701    try:
702        node = edt.get_node(path)
703    except edtlib.EDTError:
704        return ""
705
706    if node is None:
707        return ""
708
709    return node.parent.path if node.parent else ""
710
711def dt_gpio_hogs_enabled(kconf, _):
712    """
713    Return "y" if any GPIO hog node is enabled. Otherwise, return "n".
714    """
715    if doc_mode or edt is None:
716        return "n"
717
718    for node in edt.nodes:
719        if node.gpio_hogs and node.status == "okay":
720            return "y"
721
722    return "n"
723
724def shields_list_contains(kconf, _, shield):
725    """
726    Return "n" if cmake environment variable 'SHIELD_AS_LIST' doesn't exist.
727    Return "y" if 'shield' is present list obtained after 'SHIELD_AS_LIST'
728    has been split using ";" as a separator and "n" otherwise.
729    """
730    try:
731        list = os.environ['SHIELD_AS_LIST']
732    except KeyError:
733        return "n"
734
735    return "y" if shield in list.split(";") else "n"
736
737
738# Keys in this dict are the function names as they appear
739# in Kconfig files. The values are tuples in this form:
740#
741#       (python_function, minimum_number_of_args, maximum_number_of_args)
742#
743# Each python function is given a kconf object and its name in the
744# Kconfig file, followed by arguments from the Kconfig file.
745#
746# See the kconfiglib documentation for more details.
747functions = {
748        "dt_has_compat": (dt_has_compat, 1, 1),
749        "dt_compat_enabled": (dt_compat_enabled, 1, 1),
750        "dt_compat_on_bus": (dt_compat_on_bus, 2, 2),
751        "dt_chosen_label": (dt_chosen_label, 1, 1),
752        "dt_chosen_enabled": (dt_chosen_enabled, 1, 1),
753        "dt_chosen_path": (dt_chosen_path, 1, 1),
754        "dt_chosen_has_compat": (dt_chosen_has_compat, 2, 2),
755        "dt_path_enabled": (dt_node_enabled, 1, 1),
756        "dt_alias_enabled": (dt_node_enabled, 1, 1),
757        "dt_nodelabel_enabled": (dt_nodelabel_enabled, 1, 1),
758        "dt_nodelabel_enabled_with_compat": (dt_nodelabel_enabled_with_compat, 2, 2),
759        "dt_chosen_reg_addr_int": (dt_chosen_reg, 1, 3),
760        "dt_chosen_reg_addr_hex": (dt_chosen_reg, 1, 3),
761        "dt_chosen_reg_size_int": (dt_chosen_reg, 1, 3),
762        "dt_chosen_reg_size_hex": (dt_chosen_reg, 1, 3),
763        "dt_node_reg_addr_int": (dt_node_reg, 1, 3),
764        "dt_node_reg_addr_hex": (dt_node_reg, 1, 3),
765        "dt_node_reg_size_int": (dt_node_reg, 1, 3),
766        "dt_node_reg_size_hex": (dt_node_reg, 1, 3),
767        "dt_node_bool_prop": (dt_node_bool_prop, 2, 2),
768        "dt_nodelabel_bool_prop": (dt_nodelabel_bool_prop, 2, 2),
769        "dt_chosen_bool_prop": (dt_chosen_bool_prop, 2, 2),
770        "dt_node_has_prop": (dt_node_has_prop, 2, 2),
771        "dt_nodelabel_has_prop": (dt_nodelabel_has_prop, 2, 2),
772        "dt_node_int_prop_int": (dt_node_int_prop, 2, 3),
773        "dt_node_int_prop_hex": (dt_node_int_prop, 2, 3),
774        "dt_node_array_prop_int": (dt_node_array_prop, 3, 4),
775        "dt_node_array_prop_hex": (dt_node_array_prop, 3, 4),
776        "dt_node_str_prop_equals": (dt_node_str_prop_equals, 3, 3),
777        "dt_nodelabel_has_compat": (dt_nodelabel_has_compat, 2, 2),
778        "dt_node_has_compat": (dt_node_has_compat, 2, 2),
779        "dt_nodelabel_path": (dt_nodelabel_path, 1, 1),
780        "dt_node_parent": (dt_node_parent, 1, 1),
781        "dt_nodelabel_array_prop_has_val": (dt_nodelabel_array_prop_has_val, 3, 3),
782        "dt_gpio_hogs_enabled": (dt_gpio_hogs_enabled, 0, 0),
783        "shields_list_contains": (shields_list_contains, 1, 1),
784}
785