| # 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: |
| - properties: |
| $nodename: |
| pattern: '^mux-controller' |
| - required: |
| - '#mux-control-cells' |
| - required: |
| - '#mux-state-cells' |
| |
| properties: |
| $nodename: |
| pattern: '^mux-controller(@.*|-[0-9a-f]+)?$' |
| |
| '#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>; |
| }; |
| ... |