Signed-off-by: Peter Rosin <peda@xxxxxxxxxx> --- .../devicetree/bindings/misc/mux-controller.txt | 106 +++++++++++++++++++++ .../devicetree/bindings/misc/mux-gpio.txt | 78 +++++++++++++++ MAINTAINERS | 5 + 3 files changed, 189 insertions(+) create mode 100644 Documentation/devicetree/bindings/misc/mux-controller.txt create mode 100644 Documentation/devicetree/bindings/misc/mux-gpio.txt diff --git a/Documentation/devicetree/bindings/misc/mux-controller.txt b/Documentation/devicetree/bindings/misc/mux-controller.txt new file mode 100644 index 000000000000..8e0733f60a37 --- /dev/null +++ b/Documentation/devicetree/bindings/misc/mux-controller.txt @@ -0,0 +1,106 @@ +Common multiplexer controller bindings + +A mux controller will have one, or several, consumer devices that uses the +mux controller. Thus, a mux controller can possibly control several +parallel multiplexers. If there are several consumer devices, the node for +a mux controller will have one child node for each consumer of the multiplexer +controller. If there is only one consumer of the mux controller, the mux +controller node can be the child (with node name 'mux-controller') of the +consumer node. + +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. + +Example: + + /* + * One consumer of a 2-way multiplexer controller by one GPIO-line, + * with the multiplexer controller as a child node. + */ + adc-mux { + compatible = "iio-mux"; + io-channels = <&adc 0>; + io-channel-names = "parent"; + + #address-cells = <1>; + #size-cells = <0>; + + mux-controller { + compatible = "mux-gpio"; + + mux-gpios = <&pioA 0 GPIO_ACTIVE_HIGH>; + }; + + sync-1@0 { + reg = <0>; + }; + + in@1 { + reg = <1>; + }; + }; + + /* + * 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. + */ + mux { + compatible = "mux-gpio"; + + mux-gpios = <&pioA 0 GPIO_ACTIVE_HIGH>, + <&pioA 1 GPIO_ACTIVE_HIGH>; + + adc-mux { + compatible = "iio-mux"; + io-channels = <&adc 0>; + io-channel-names = "parent"; + + #address-cells = <1>; + #size-cells = <0>; + + sync-1@0 { + reg = <0>; + }; + + in@1 { + reg = <1>; + }; + + out@2 { + reg = <2>; + }; + + sync-2@3 { + reg = <3>; + }; + }; + + i2c-mux { + compatible = "i2c-mux-simple,mux-locked"; + i2c-parent = <&i2c1>; + + #address-cells = <1>; + #size-cells = <0>; + + i2c@0 { + reg = <0>; + #address-cells = <1>; + #size-cells = <0>; + + ssd1307: oled@3c { + /* ... */ + }; + }; + + i2c@3 { + reg = <3>; + #address-cells = <1>; + #size-cells = <0>; + + pca9555: pca9555@20 { + /* ... */ + }; + }; + }; + }; diff --git a/Documentation/devicetree/bindings/misc/mux-gpio.txt b/Documentation/devicetree/bindings/misc/mux-gpio.txt new file mode 100644 index 000000000000..23b87913f4b3 --- /dev/null +++ b/Documentation/devicetree/bindings/misc/mux-gpio.txt @@ -0,0 +1,78 @@ +GPIO-based multiplexer controller bindings + +Define what GPIO pins are used to control a multiplexer. Or several +multiplexers, if the same pins control more than one multiplexer. + +Required properties: +- compatible : "mux-gpio" +- mux-gpios : list of gpios used to control the multiplexer, least + significant bit first. +* Standard mux-controller bindings as decribed in mux-controller.txt + +Optional properties: +- idle-state : if present, the state the mux will have when idle. + +The multiplexer state is defined as the number represented by the +multiplexer GPIO pins, where the first pin is the least significant +bit. And active pin is a binary 1, an inactive pin is a binary 0. + +Example: + mux { + compatible = "mux-gpio"; + + mux-gpios = <&pioA 0 GPIO_ACTIVE_HIGH>, + <&pioA 1 GPIO_ACTIVE_HIGH>; + + adc { + compatible = "iio-mux"; + io-channels = <&adc 0>; + io-channel-names = "parent"; + + #address-cells = <1>; + #size-cells = <0>; + + sync-1@0 { + reg = <0>; + }; + + in@1 { + reg = <1>; + }; + + out@2 { + reg = <2>; + }; + + sync-2@3 { + reg = <3>; + }; + }; + + i2c-mux { + compatible = "i2c-mux-simple,mux-locked"; + i2c-parent = <&i2c1>; + + #address-cells = <1>; + #size-cells = <0>; + + i2c@0 { + reg = <0>; + #address-cells = <1>; + #size-cells = <0>; + + ssd1307: oled@3c { + /* ... */ + }; + }; + + i2c@3 { + reg = <3>; + #address-cells = <1>; + #size-cells = <0>; + + pca9555: pca9555@20 { + /* ... */ + }; + }; + }; + }; diff --git a/MAINTAINERS b/MAINTAINERS index 4ebcd8df29d2..35869ed0a50e 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -8402,6 +8402,11 @@ S: Orphan F: drivers/mmc/host/mmc_spi.c F: include/linux/spi/mmc_spi.h +MULTIPLEXER SUBSYSTEM +M: Peter Rosin <peda@xxxxxxxxxx> +S: Maintained +F: Documentation/devicetree/bindings/misc/mux-* + MULTISOUND SOUND DRIVER M: Andrew Veliath <andrewtv@xxxxxxx> S: Maintained -- 2.1.4 -- To unsubscribe from this list: send the line "unsubscribe linux-i2c" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html