162306a36Sopenharmony_ci# SPDX-License-Identifier: GPL-2.0-only
262306a36Sopenharmony_ci%YAML 1.2
362306a36Sopenharmony_ci---
462306a36Sopenharmony_ci$id: http://devicetree.org/schemas/i2c/i2c-mux-gpio.yaml#
562306a36Sopenharmony_ci$schema: http://devicetree.org/meta-schemas/core.yaml#
662306a36Sopenharmony_ci
762306a36Sopenharmony_cititle: GPIO-based I2C Bus Mux
862306a36Sopenharmony_ci
962306a36Sopenharmony_cimaintainers:
1062306a36Sopenharmony_ci  - Wolfram Sang <wsa@kernel.org>
1162306a36Sopenharmony_ci
1262306a36Sopenharmony_cidescription: |
1362306a36Sopenharmony_ci  This binding describes an I2C bus multiplexer that uses GPIOs to route the I2C signals.
1462306a36Sopenharmony_ci
1562306a36Sopenharmony_ci                                  +-----+  +-----+
1662306a36Sopenharmony_ci                                  | dev |  | dev |
1762306a36Sopenharmony_ci    +------------+                +-----+  +-----+
1862306a36Sopenharmony_ci    | SoC        |                   |        |
1962306a36Sopenharmony_ci    |            |          /--------+--------+
2062306a36Sopenharmony_ci    |   +------+ |  +------+    child bus A, on GPIO value set to 0
2162306a36Sopenharmony_ci    |   | I2C  |-|--| Mux  |
2262306a36Sopenharmony_ci    |   +------+ |  +--+---+    child bus B, on GPIO value set to 1
2362306a36Sopenharmony_ci    |            |     |    \----------+--------+--------+
2462306a36Sopenharmony_ci    |   +------+ |     |               |        |        |
2562306a36Sopenharmony_ci    |   | GPIO |-|-----+            +-----+  +-----+  +-----+
2662306a36Sopenharmony_ci    |   +------+ |                  | dev |  | dev |  | dev |
2762306a36Sopenharmony_ci    +------------+                  +-----+  +-----+  +-----+
2862306a36Sopenharmony_ci
2962306a36Sopenharmony_ci  For each I2C child node, an I2C child bus will be created. They will be numbered based on their
3062306a36Sopenharmony_ci  order in the device tree.
3162306a36Sopenharmony_ci
3262306a36Sopenharmony_ci  Whenever an access is made to a device on a child bus, the value set in the relevant node's reg
3362306a36Sopenharmony_ci  property will be output using the list of GPIOs, the first in the list holding the least-
3462306a36Sopenharmony_ci  significant value.
3562306a36Sopenharmony_ci
3662306a36Sopenharmony_ci  If an idle state is defined, using the idle-state (optional) property, whenever an access is not
3762306a36Sopenharmony_ci  being made to a device on a child bus, the GPIOs will be set according to the idle value.
3862306a36Sopenharmony_ci
3962306a36Sopenharmony_ci  If an idle state is not defined, the most recently used value will be left programmed into
4062306a36Sopenharmony_ci  hardware whenever no access is being made to a device on a child bus.
4162306a36Sopenharmony_ci
4262306a36Sopenharmony_ciproperties:
4362306a36Sopenharmony_ci  compatible:
4462306a36Sopenharmony_ci    const: i2c-mux-gpio
4562306a36Sopenharmony_ci
4662306a36Sopenharmony_ci  i2c-parent:
4762306a36Sopenharmony_ci    description: phandle of the I2C bus that this multiplexer's master-side port is connected to
4862306a36Sopenharmony_ci    $ref: /schemas/types.yaml#/definitions/phandle
4962306a36Sopenharmony_ci
5062306a36Sopenharmony_ci  mux-gpios:
5162306a36Sopenharmony_ci    description: list of GPIOs used to control the muxer
5262306a36Sopenharmony_ci    minItems: 1
5362306a36Sopenharmony_ci    maxItems: 4  # Should be enough
5462306a36Sopenharmony_ci
5562306a36Sopenharmony_ci  idle-state:
5662306a36Sopenharmony_ci    description: Value to set the muxer to when idle. When no value is given, it defaults to the
5762306a36Sopenharmony_ci      last value used.
5862306a36Sopenharmony_ci    $ref: /schemas/types.yaml#/definitions/uint32
5962306a36Sopenharmony_ci
6062306a36Sopenharmony_ciallOf:
6162306a36Sopenharmony_ci  - $ref: i2c-mux.yaml
6262306a36Sopenharmony_ci
6362306a36Sopenharmony_ciunevaluatedProperties: false
6462306a36Sopenharmony_ci
6562306a36Sopenharmony_cirequired:
6662306a36Sopenharmony_ci  - compatible
6762306a36Sopenharmony_ci  - i2c-parent
6862306a36Sopenharmony_ci  - mux-gpios
6962306a36Sopenharmony_ci
7062306a36Sopenharmony_ciexamples:
7162306a36Sopenharmony_ci  - |
7262306a36Sopenharmony_ci    i2cmux {
7362306a36Sopenharmony_ci      compatible = "i2c-mux-gpio";
7462306a36Sopenharmony_ci      #address-cells = <1>;
7562306a36Sopenharmony_ci      #size-cells = <0>;
7662306a36Sopenharmony_ci      mux-gpios = <&gpio1 22 0>, <&gpio1 23 0>;
7762306a36Sopenharmony_ci      i2c-parent = <&i2c1>;
7862306a36Sopenharmony_ci
7962306a36Sopenharmony_ci      i2c@1 {
8062306a36Sopenharmony_ci        reg = <1>;
8162306a36Sopenharmony_ci        #address-cells = <1>;
8262306a36Sopenharmony_ci        #size-cells = <0>;
8362306a36Sopenharmony_ci
8462306a36Sopenharmony_ci        ssd1307: oled@3c {
8562306a36Sopenharmony_ci          compatible = "solomon,ssd1307fb-i2c";
8662306a36Sopenharmony_ci          reg = <0x3c>;
8762306a36Sopenharmony_ci          pwms = <&pwm 4 3000>;
8862306a36Sopenharmony_ci          reset-gpios = <&gpio2 7 1>;
8962306a36Sopenharmony_ci        };
9062306a36Sopenharmony_ci      };
9162306a36Sopenharmony_ci
9262306a36Sopenharmony_ci      i2c@3 {
9362306a36Sopenharmony_ci        reg = <3>;
9462306a36Sopenharmony_ci        #address-cells = <1>;
9562306a36Sopenharmony_ci        #size-cells = <0>;
9662306a36Sopenharmony_ci
9762306a36Sopenharmony_ci        pca9555: pca9555@20 {
9862306a36Sopenharmony_ci          compatible = "nxp,pca9555";
9962306a36Sopenharmony_ci          gpio-controller;
10062306a36Sopenharmony_ci          #gpio-cells = <2>;
10162306a36Sopenharmony_ci          reg = <0x20>;
10262306a36Sopenharmony_ci        };
10362306a36Sopenharmony_ci      };
10462306a36Sopenharmony_ci    };
105