diff options
-rw-r--r-- | dtc-parser.y | 12 | ||||
-rwxr-xr-x | tests/run_tests.sh | 2 | ||||
-rw-r--r-- | tests/test_tree1_label_noderef.dts | 55 |
3 files changed, 69 insertions, 0 deletions
diff --git a/dtc-parser.y b/dtc-parser.y index ea57e0a..5a897e3 100644 --- a/dtc-parser.y +++ b/dtc-parser.y @@ -140,6 +140,18 @@ devicetree: { $$ = merge_nodes($1, $3); } + + | devicetree DT_LABEL DT_REF nodedef + { + struct node *target = get_node_by_ref($1, $3); + + add_label(&target->labels, $2); + if (target) + merge_nodes(target, $4); + else + ERROR(&@3, "Label or path %s not found", $3); + $$ = $1; + } | devicetree DT_REF nodedef { struct node *target = get_node_by_ref($1, $2); diff --git a/tests/run_tests.sh b/tests/run_tests.sh index c5856d9..5331856 100755 --- a/tests/run_tests.sh +++ b/tests/run_tests.sh @@ -399,6 +399,8 @@ dtc_tests () { tree1_tests dtc_tree1_merge.test.dtb test_tree1.dtb run_dtc_test -I dts -O dtb -o dtc_tree1_merge_labelled.test.dtb test_tree1_merge_labelled.dts tree1_tests dtc_tree1_merge_labelled.test.dtb test_tree1.dtb + run_dtc_test -I dts -O dtb -o dtc_tree1_label_noderef.test.dtb test_tree1_label_noderef.dts + run_test dtbs_equal_unordered dtc_tree1_label_noderef.test.dtb test_tree1.dtb run_dtc_test -I dts -O dtb -o multilabel_merge.test.dtb multilabel_merge.dts run_test references multilabel.test.dtb run_test dtbs_equal_ordered multilabel.test.dtb multilabel_merge.test.dtb diff --git a/tests/test_tree1_label_noderef.dts b/tests/test_tree1_label_noderef.dts new file mode 100644 index 0000000..b2b194c --- /dev/null +++ b/tests/test_tree1_label_noderef.dts @@ -0,0 +1,55 @@ +/dts-v1/; + +/memreserve/ 0xdeadbeef00000000 0x100000; +/memreserve/ 123456789 010000; + +/ { + compatible = "test_tree1"; + prop-int = <0xdeadbeef>; + prop-int64 = /bits/ 64 <0xdeadbeef01abcdef>; + prop-str = "hello world"; + #address-cells = <1>; + #size-cells = <0>; + + subnode@1 { + compatible = "subnode1"; + reg = <1>; + prop-int = [deadbeef]; + + subsubnode { + compatible = "subsubnode1", "subsubnode"; + prop-int = <0xdeadbeef>; + }; + + ss1 { + }; + }; + + subnode@2 { + reg = <2>; + linux,phandle = <0x2000>; + prop-int = <123456789>; + #address-cells = <1>; + #size-cells = <0>; + + ssn0: subsubnode@0 { + phandle = <0x2001>; + prop-int = <0xbad>; + }; + + ss2 { + }; + }; +}; + +/* Add label to a noderef */ +ssn1: &ssn0 { + reg = <0>; + prop-int = <123456789>; +}; + +/* Use the new label for merging */ +&ssn1 { + prop-int = <0726746425>; + compatible = "subsubnode2", "subsubnode"; +}; |