| /* |
| * Copyright (c) 2019, Nordic Semiconductor |
| * |
| * SPDX-License-Identifier: BSD-3-Clause |
| */ |
| |
| // Used by testedtlib.py |
| |
| /dts-v1/; |
| |
| / { |
| // |
| // Interrupts |
| // |
| |
| interrupt-parent-test { |
| controller { |
| compatible = "interrupt-three-cell"; |
| #interrupt-cells = <3>; |
| interrupt-controller; |
| }; |
| node { |
| interrupts = <1 2 3 4 5 6>; |
| interrupt-names = "foo", "bar"; |
| interrupt-parent = <&{/interrupt-parent-test/controller}>; |
| }; |
| }; |
| interrupts-extended-test { |
| controller-0 { |
| compatible = "interrupt-one-cell"; |
| #interrupt-cells = <1>; |
| interrupt-controller; |
| }; |
| controller-1 { |
| compatible = "interrupt-two-cell"; |
| #interrupt-cells = <2>; |
| interrupt-controller; |
| }; |
| controller-2 { |
| compatible = "interrupt-three-cell"; |
| #interrupt-cells = <3>; |
| interrupt-controller; |
| }; |
| node { |
| interrupts-extended = < |
| &{/interrupts-extended-test/controller-0} 1 |
| &{/interrupts-extended-test/controller-1} 2 3 |
| &{/interrupts-extended-test/controller-2} 4 5 6>; |
| }; |
| }; |
| interrupt-map-test { |
| #address-cells = <2>; |
| #size-cells = <0>; |
| |
| controller-0 { |
| compatible = "interrupt-one-cell"; |
| #address-cells = <1>; |
| #interrupt-cells = <1>; |
| interrupt-controller; |
| }; |
| controller-1 { |
| compatible = "interrupt-two-cell"; |
| #address-cells = <2>; |
| #interrupt-cells = <2>; |
| interrupt-controller; |
| }; |
| controller-2 { |
| compatible = "interrupt-three-cell"; |
| #address-cells = <3>; |
| #interrupt-cells = <3>; |
| interrupt-controller; |
| }; |
| nexus { |
| #interrupt-cells = <2>; |
| interrupt-map = < |
| 0 0 0 0 &{/interrupt-map-test/controller-0} 0 0 |
| 0 0 0 1 &{/interrupt-map-test/controller-1} 0 0 0 1 |
| 0 0 0 2 &{/interrupt-map-test/controller-2} 0 0 0 0 0 2 |
| 0 1 0 0 &{/interrupt-map-test/controller-0} 0 3 |
| 0 1 0 1 &{/interrupt-map-test/controller-1} 0 0 0 4 |
| 0 1 0 2 &{/interrupt-map-test/controller-2} 0 0 0 0 0 5>; |
| }; |
| node@0 { |
| reg = <0 0>; |
| interrupts = <0 0 0 1 0 2>; |
| interrupt-parent = <&{/interrupt-map-test/nexus}>; |
| }; |
| node@1 { |
| reg = <0 1>; |
| interrupts-extended = < |
| &{/interrupt-map-test/nexus} 0 0 |
| &{/interrupt-map-test/nexus} 0 1 |
| &{/interrupt-map-test/nexus} 0 2>; |
| }; |
| }; |
| interrupt-map-bitops-test { |
| #address-cells = <2>; |
| #size-cells = <0>; |
| |
| controller { |
| compatible = "interrupt-two-cell"; |
| #address-cells = <0>; |
| #interrupt-cells = <2>; |
| interrupt-controller; |
| }; |
| nexus { |
| #interrupt-cells = <2>; |
| interrupt-map = < |
| 6 6 6 6 &{/interrupt-map-bitops-test/controller} 2 1 |
| >; |
| interrupt-map-mask = <0xE 0x7 0xE 0x7>; |
| // Not specified in the DT spec., but shows up due to |
| // common code with GPIO. Might as well test it here. |
| interrupt-map-pass-thru = <1 2 3 3>; |
| }; |
| // Child unit specifier: 00000007 0000000E 00000007 0000000E |
| // Mask: 0000000E 00000007 0000000E 00000007 |
| // Pass-thru: 00000001 00000002 00000003 00000003 |
| node@70000000E { |
| reg = <0x7 0xE>; |
| interrupt-parent = <&{/interrupt-map-bitops-test/nexus}>; |
| interrupts = <0x7 0xE>; |
| }; |
| }; |
| |
| // |
| // GPIOS |
| // |
| |
| gpio-test { |
| controller-1 { |
| compatible = "gpio-two-cell"; |
| #gpio-cells = <2>; |
| gpio-controller; |
| }; |
| node { |
| gpios = <&{/gpio-test/controller-0} 1 |
| &{/gpio-test/controller-1} 2 3>; |
| foo-gpios = <&{/gpio-test/controller-1} 4 5>; |
| bar-gpios = <&{/gpio-test/controller-1} 6 7>; |
| }; |
| // Putting this controller last gives us some coverage for ordering |
| // issues during initialization |
| controller-0 { |
| compatible = "gpio-one-cell"; |
| #gpio-cells = <1>; |
| gpio-controller; |
| }; |
| }; |
| |
| // |
| // Clocks |
| // |
| |
| clock-test { |
| fixed-clock { |
| // 'fixed-clock' is currently special-cased in the code |
| compatible = "fixed-clock"; |
| #clock-cells = <0>; |
| clock-frequency = <123>; |
| }; |
| clock-1 { |
| compatible = "clock-one-cell"; |
| #clock-cells = <1>; |
| }; |
| clock-2 { |
| compatible = "clock-two-cell"; |
| #clock-cells = <2>; |
| }; |
| node { |
| clocks = <&{/clock-test/fixed-clock} |
| &{/clock-test/clock-1} 1 |
| &{/clock-test/clock-2} 1 2>; |
| clock-names = "fixed", "one-cell", "two-cell"; |
| }; |
| }; |
| |
| // |
| // PWMs |
| // |
| |
| pwm-test { |
| pwm-0 { |
| compatible = "pwm-zero-cell"; |
| #pwm-cells = <0>; |
| }; |
| pwm-1 { |
| compatible = "pwm-one-cell"; |
| #pwm-cells = <1>; |
| }; |
| node { |
| pwms = <&{/pwm-test/pwm-0} |
| &{/pwm-test/pwm-1} 1>; |
| pwm-names = "zero-cell", "one-cell"; |
| }; |
| }; |
| |
| // |
| // IO channels |
| // |
| |
| // Lots of common code with PWMs and clocks, so just test the basics |
| io-channel-test { |
| io-channel { |
| compatible = "io-channel"; |
| #io-channel-cells = <1>; |
| }; |
| node { |
| io-channels = <&{/io-channel-test/io-channel} 1>; |
| io-channel-names = "io-channel"; |
| }; |
| }; |
| |
| // |
| // 'reg' |
| // |
| |
| reg-zero-address-cells { |
| #address-cells = <0>; |
| #size-cells = <1>; |
| |
| node { |
| reg = <1 2>; |
| }; |
| }; |
| reg-zero-size-cells { |
| #address-cells = <1>; |
| #size-cells = <0>; |
| |
| node { |
| reg = <1 2>; |
| }; |
| }; |
| // Use implied #size-cells = <1> |
| reg-ranges { |
| #address-cells = <2>; |
| |
| parent { |
| #address-cells = <1>; |
| ranges = <1 0xA 0xB 1 /* 1 -> 0xA 0xB */ |
| 2 0xC 0xD 2 /* 2..3 -> 0xC 0xD */ |
| 4 0xE 0xF 1 /* 4 -> 0xE 0xF */ |
| >; |
| |
| node { |
| reg = <5 1 /* Matches no range */ |
| 4 1 /* Matches third range */ |
| 3 1 /* Matches second range */ |
| 2 1 /* Matches second range */ |
| 1 1 /* Matches first range */ |
| 0 1 /* Matches no range */ |
| >; |
| }; |
| }; |
| }; |
| // Build up <3 2 1> address with nested 'ranges' |
| reg-nested-ranges { |
| #address-cells = <3>; |
| |
| grandparent { |
| #address-cells = <2>; |
| #size-cells = <2>; |
| ranges = <0 0 3 0 0 2 2>; |
| |
| parent { |
| #address-cells = <1>; |
| ranges = <0 2 0 2>; |
| |
| node { |
| reg = <1 1>; |
| }; |
| }; |
| }; |
| }; |
| |
| // |
| // !include in bindings |
| // |
| |
| binding-include { |
| compatible = "binding-include-test"; |
| foo = <0>; |
| bar = <1>; |
| baz = <2>; |
| }; |
| |
| // |
| // For testing Device.props (derived from 'properties:' in the binding) |
| // |
| |
| props { |
| compatible = "props"; |
| existent-boolean; |
| int = <1>; |
| array = <1 2 3>; |
| uint8-array = [ 12 34 ]; |
| string = "foo"; |
| string-array = "foo", "bar", "baz"; |
| phandle-ref = < &{/props/node} >; |
| // Does not appear in the binding, so won't create an entry in |
| // Device.props |
| not-speced = <0>; |
| |
| node { |
| }; |
| }; |
| |
| // |
| // Parent with 'sub-node:' in binding |
| // |
| |
| parent-with-sub-node { |
| compatible = "parent-with-sub-node"; |
| node { |
| foo = <1>; |
| bar = <2>; |
| not-speced = <0>; |
| }; |
| }; |
| }; |