xref: /linux/Documentation/devicetree/bindings/mux/mux-controller.yaml (revision 509d3f45847627f4c5cdce004c3ec79262b5239c)
1# SPDX-License-Identifier: GPL-2.0
2%YAML 1.2
3---
4$id: http://devicetree.org/schemas/mux/mux-controller.yaml#
5$schema: http://devicetree.org/meta-schemas/core.yaml#
6
7title: Common multiplexer controller provider
8
9maintainers:
10  - Peter Rosin <peda@axentia.se>
11
12description: |
13  A multiplexer (or mux) controller will have one, or several, consumer devices
14  that uses the mux controller. Thus, a mux controller can possibly control
15  several parallel multiplexers. Presumably there will be at least one
16  multiplexer needed by each consumer, but a single mux controller can of course
17  control several multiplexers for a single consumer.
18
19  A mux controller provides a number of states to its consumers, and the state
20  space is a simple zero-based enumeration. I.e. 0-1 for a 2-way multiplexer,
21  0-7 for an 8-way multiplexer, etc.
22
23  Mux controller nodes
24  --------------------
25
26  Mux controller nodes must specify the number of cells used for the
27  specifier using the '#mux-control-cells' or '#mux-state-cells' property.
28  The value of '#mux-state-cells' will always be one greater than the value
29  of '#mux-control-cells'.
30
31  Optionally, mux controller nodes can also specify the state the mux should
32  have when it is idle. The idle-state property is used for this. If the
33  idle-state is not present, the mux controller is typically left as is when
34  it is idle. For multiplexer chips that expose several mux controllers, the
35  idle-state property is an array with one idle state for each mux controller.
36
37  The special value (-1) may be used to indicate that the mux should be left
38  as is when it is idle. This is the default, but can still be useful for
39  mux controller chips with more than one mux controller, particularly when
40  there is a need to "step past" a mux controller and set some other idle
41  state for a mux controller with a higher index.
42
43  Some mux controllers have the ability to disconnect the input/output of the
44  multiplexer. Using this disconnected high-impedance state as the idle state
45  is indicated with idle state (-2).
46
47  These constants are available in
48
49        #include <dt-bindings/mux/mux.h>
50
51  as MUX_IDLE_AS_IS (-1) and MUX_IDLE_DISCONNECT (-2).
52
53  An example mux controller node look like this (the adg972a chip is a triple
54  4-way multiplexer):
55
56    mux: mux-controller@50 {
57      compatible = "adi,adg792a";
58      reg = <0x50>;
59      #mux-control-cells = <1>;
60
61      idle-state = <MUX_IDLE_DISCONNECT MUX_IDLE_AS_IS 2>;
62    };
63
64select:
65  anyOf:
66    - properties:
67        $nodename:
68          pattern: '^mux-controller'
69    - required:
70        - '#mux-control-cells'
71    - required:
72        - '#mux-state-cells'
73
74properties:
75  $nodename:
76    pattern: '^mux-controller(@.*|-([0-9]|[1-9][0-9]+))?$'
77
78  '#mux-control-cells':
79    enum: [ 0, 1 ]
80
81  '#mux-state-cells':
82    enum: [ 1, 2 ]
83
84  idle-state:
85    $ref: /schemas/types.yaml#/definitions/int32
86    minimum: -2
87
88  idle-states:
89    description: |
90      Mux controller nodes can specify the state the mux should have when it is
91      idle. If the idle-state is not present, the mux controller is typically
92      left as is when it is idle. For multiplexer chips that expose several mux
93      controllers, the idle-state property is an array with one idle state for
94      each mux controller.
95
96      The special value (-1) may be used to indicate that the mux should be left
97      as is when it is idle. This is the default, but can still be useful for
98      mux controller chips with more than one mux controller, particularly when
99      there is a need to "step past" a mux controller and set some other idle
100      state for a mux controller with a higher index.
101
102      Some mux controllers have the ability to disconnect the input/output of the
103      multiplexer. Using this disconnected high-impedance state as the idle state
104      is indicated with idle state (-2).
105    $ref: /schemas/types.yaml#/definitions/int32-array
106    items:
107      minimum: -2
108
109additionalProperties: true
110
111examples:
112  - |
113    #include <dt-bindings/gpio/gpio.h>
114
115    /* One consumer of a 2-way mux controller (one GPIO-line) */
116    mux: mux-controller {
117        compatible = "gpio-mux";
118        #mux-control-cells = <0>;
119
120        mux-gpios = <&pioA 0 GPIO_ACTIVE_HIGH>;
121    };
122
123    adc-mux {
124        compatible = "io-channel-mux";
125        io-channels = <&adc 0>;
126        io-channel-names = "parent";
127
128        mux-controls = <&mux>;
129        mux-control-names = "adc";
130
131        channels = "sync", "in";
132    };
133
134  - |
135    #include <dt-bindings/gpio/gpio.h>
136
137    /*
138     * Two consumers (one for an ADC line and one for an i2c bus) of
139     * parallel 4-way multiplexers controlled by the same two GPIO-lines.
140     */
141    mux2: mux-controller {
142        compatible = "gpio-mux";
143        #mux-control-cells = <0>;
144
145        mux-gpios = <&pioA 0 GPIO_ACTIVE_HIGH>,
146              <&pioA 1 GPIO_ACTIVE_HIGH>;
147    };
148
149    adc-mux {
150        compatible = "io-channel-mux";
151        io-channels = <&adc 0>;
152        io-channel-names = "parent";
153
154        mux-controls = <&mux2>;
155
156        channels = "sync-1", "in", "out", "sync-2";
157    };
158
159    i2c-mux {
160        compatible = "i2c-mux";
161        i2c-parent = <&i2c1>;
162
163        mux-controls = <&mux2>;
164
165        #address-cells = <1>;
166        #size-cells = <0>;
167
168        i2c@0 {
169            reg = <0>;
170            #address-cells = <1>;
171            #size-cells = <0>;
172
173            ssd1307: oled@3c {
174                reg = <0x3c>;
175            };
176        };
177
178        i2c@3 {
179            reg = <3>;
180            #address-cells = <1>;
181            #size-cells = <0>;
182
183            pca9555: pca9555@20 {
184                reg = <0x20>;
185            };
186        };
187    };
188
189  - |
190    #include <dt-bindings/gpio/gpio.h>
191
192    mux1: mux-controller {
193        compatible = "gpio-mux";
194        #mux-state-cells = <1>;
195        mux-gpios = <&exp_som 2 GPIO_ACTIVE_HIGH>;
196    };
197
198    transceiver4: can-phy4 {
199        compatible = "ti,tcan1042";
200        #phy-cells = <0>;
201        max-bitrate = <5000000>;
202        standby-gpios = <&exp_som 7 GPIO_ACTIVE_HIGH>;
203        mux-states = <&mux1 1>;
204    };
205...
206