| # SPDX-License-Identifier: GPL-2.0 | |
| %YAML 1.2 | |
| --- | |
| $id: http://devicetree.org/schemas/mux/mux-controller.yaml# | |
| $schema: http://devicetree.org/meta-schemas/core.yaml# | |
| title: Common multiplexer controller provider | |
| maintainers: | |
| - Peter Rosin <peda@axentia.se> | |
| description: | | |
| A multiplexer (or mux) controller will have one, or several, consumer devices | |
| that uses the mux controller. Thus, a mux controller can possibly control | |
| several parallel multiplexers. Presumably there will be at least one | |
| multiplexer needed by each consumer, but a single mux controller can of course | |
| control several multiplexers for a single consumer. | |
| A mux controller provides a number of states to its consumers, and the state | |
| space is a simple zero-based enumeration. I.e. 0-1 for a 2-way multiplexer, | |
| 0-7 for an 8-way multiplexer, etc. | |
| Mux controller nodes | |
| -------------------- | |
| Mux controller nodes must specify the number of cells used for the | |
| specifier using the '#mux-control-cells' or '#mux-state-cells' property. | |
| The value of '#mux-state-cells' will always be one greater than the value | |
| of '#mux-control-cells'. | |
| Optionally, mux controller nodes can also specify the state the mux should | |
| have when it is idle. The idle-state property is used for this. If the | |
| idle-state is not present, the mux controller is typically left as is when | |
| it is idle. For multiplexer chips that expose several mux controllers, the | |
| idle-state property is an array with one idle state for each mux controller. | |
| The special value (-1) may be used to indicate that the mux should be left | |
| as is when it is idle. This is the default, but can still be useful for | |
| mux controller chips with more than one mux controller, particularly when | |
| there is a need to "step past" a mux controller and set some other idle | |
| state for a mux controller with a higher index. | |
| Some mux controllers have the ability to disconnect the input/output of the | |
| multiplexer. Using this disconnected high-impedance state as the idle state | |
| is indicated with idle state (-2). | |
| These constants are available in | |
| #include <dt-bindings/mux/mux.h> | |
| as MUX_IDLE_AS_IS (-1) and MUX_IDLE_DISCONNECT (-2). | |
| An example mux controller node look like this (the adg972a chip is a triple | |
| 4-way multiplexer): | |
| mux: mux-controller@50 { | |
| compatible = "adi,adg792a"; | |
| reg = <0x50>; | |
| #mux-control-cells = <1>; | |
| idle-state = <MUX_IDLE_DISCONNECT MUX_IDLE_AS_IS 2>; | |
| }; | |
| select: | |
| anyOf: | |
| - required: | |
| - '#mux-control-cells' | |
| - required: | |
| - '#mux-state-cells' | |
| properties: | |
| '#mux-control-cells': | |
| enum: [ 0, 1 ] | |
| '#mux-state-cells': | |
| enum: [ 1, 2 ] | |
| idle-state: | |
| $ref: /schemas/types.yaml#/definitions/int32 | |
| minimum: -2 | |
| idle-states: | |
| description: | | |
| Mux controller nodes can specify the state the mux should have when it is | |
| idle. If the idle-state is not present, the mux controller is typically | |
| left as is when it is idle. For multiplexer chips that expose several mux | |
| controllers, the idle-state property is an array with one idle state for | |
| each mux controller. | |
| The special value (-1) may be used to indicate that the mux should be left | |
| as is when it is idle. This is the default, but can still be useful for | |
| mux controller chips with more than one mux controller, particularly when | |
| there is a need to "step past" a mux controller and set some other idle | |
| state for a mux controller with a higher index. | |
| Some mux controllers have the ability to disconnect the input/output of the | |
| multiplexer. Using this disconnected high-impedance state as the idle state | |
| is indicated with idle state (-2). | |
| $ref: /schemas/types.yaml#/definitions/int32-array | |
| items: | |
| minimum: -2 | |
| additionalProperties: true | |
| examples: | |
| - | | |
| #include <dt-bindings/gpio/gpio.h> | |
| /* One consumer of a 2-way mux controller (one GPIO-line) */ | |
| mux: mux-controller { | |
| compatible = "gpio-mux"; | |
| #mux-control-cells = <0>; | |
| mux-gpios = <&pioA 0 GPIO_ACTIVE_HIGH>; | |
| }; | |
| adc-mux { | |
| compatible = "io-channel-mux"; | |
| io-channels = <&adc 0>; | |
| io-channel-names = "parent"; | |
| mux-controls = <&mux>; | |
| mux-control-names = "adc"; | |
| channels = "sync", "in"; | |
| }; | |
| - | | |
| #include <dt-bindings/gpio/gpio.h> | |
| /* | |
| * Two consumers (one for an ADC line and one for an i2c bus) of | |
| * parallel 4-way multiplexers controlled by the same two GPIO-lines. | |
| */ | |
| mux2: mux-controller { | |
| compatible = "gpio-mux"; | |
| #mux-control-cells = <0>; | |
| mux-gpios = <&pioA 0 GPIO_ACTIVE_HIGH>, | |
| <&pioA 1 GPIO_ACTIVE_HIGH>; | |
| }; | |
| adc-mux { | |
| compatible = "io-channel-mux"; | |
| io-channels = <&adc 0>; | |
| io-channel-names = "parent"; | |
| mux-controls = <&mux2>; | |
| channels = "sync-1", "in", "out", "sync-2"; | |
| }; | |
| i2c-mux { | |
| compatible = "i2c-mux"; | |
| i2c-parent = <&i2c1>; | |
| mux-controls = <&mux2>; | |
| #address-cells = <1>; | |
| #size-cells = <0>; | |
| i2c@0 { | |
| reg = <0>; | |
| #address-cells = <1>; | |
| #size-cells = <0>; | |
| ssd1307: oled@3c { | |
| reg = <0x3c>; | |
| }; | |
| }; | |
| i2c@3 { | |
| reg = <3>; | |
| #address-cells = <1>; | |
| #size-cells = <0>; | |
| pca9555: pca9555@20 { | |
| reg = <0x20>; | |
| }; | |
| }; | |
| }; | |
| - | | |
| #include <dt-bindings/gpio/gpio.h> | |
| mux1: mux-controller { | |
| compatible = "gpio-mux"; | |
| #mux-state-cells = <1>; | |
| mux-gpios = <&exp_som 2 GPIO_ACTIVE_HIGH>; | |
| }; | |
| transceiver4: can-phy4 { | |
| compatible = "ti,tcan1042"; | |
| #phy-cells = <0>; | |
| max-bitrate = <5000000>; | |
| standby-gpios = <&exp_som 7 GPIO_ACTIVE_HIGH>; | |
| mux-states = <&mux1 1>; | |
| }; | |
| ... |