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