162306a36Sopenharmony_ci# SPDX-License-Identifier: GPL-2.0
262306a36Sopenharmony_ci%YAML 1.2
362306a36Sopenharmony_ci---
462306a36Sopenharmony_ci$id: http://devicetree.org/schemas/i2c/i2c-mux-gpmux.yaml#
562306a36Sopenharmony_ci$schema: http://devicetree.org/meta-schemas/core.yaml#
662306a36Sopenharmony_ci
762306a36Sopenharmony_cititle: General Purpose I2C Bus Mux
862306a36Sopenharmony_ci
962306a36Sopenharmony_cimaintainers:
1062306a36Sopenharmony_ci  - Peter Rosin <peda@axentia.se>
1162306a36Sopenharmony_ci
1262306a36Sopenharmony_cidescription: |+
1362306a36Sopenharmony_ci  This binding describes an I2C bus multiplexer that uses a mux controller
1462306a36Sopenharmony_ci  from the mux subsystem to route the I2C signals.
1562306a36Sopenharmony_ci
1662306a36Sopenharmony_ci                                    .-----.  .-----.
1762306a36Sopenharmony_ci                                    | dev |  | dev |
1862306a36Sopenharmony_ci      .------------.                '-----'  '-----'
1962306a36Sopenharmony_ci      | SoC        |                   |        |
2062306a36Sopenharmony_ci      |            |          .--------+--------'
2162306a36Sopenharmony_ci      |   .------. |  .------+    child bus A, on MUX value set to 0
2262306a36Sopenharmony_ci      |   | I2C  |-|--| Mux  |
2362306a36Sopenharmony_ci      |   '------' |  '--+---+    child bus B, on MUX value set to 1
2462306a36Sopenharmony_ci      |   .------. |     |    '----------+--------+--------.
2562306a36Sopenharmony_ci      |   | MUX- | |     |               |        |        |
2662306a36Sopenharmony_ci      |   | Ctrl |-|-----+            .-----.  .-----.  .-----.
2762306a36Sopenharmony_ci      |   '------' |                  | dev |  | dev |  | dev |
2862306a36Sopenharmony_ci      '------------'                  '-----'  '-----'  '-----'
2962306a36Sopenharmony_ci
3062306a36Sopenharmony_ci
3162306a36Sopenharmony_ciallOf:
3262306a36Sopenharmony_ci  - $ref: /schemas/i2c/i2c-mux.yaml#
3362306a36Sopenharmony_ci
3462306a36Sopenharmony_ciproperties:
3562306a36Sopenharmony_ci  compatible:
3662306a36Sopenharmony_ci    const: i2c-mux
3762306a36Sopenharmony_ci
3862306a36Sopenharmony_ci  i2c-parent:
3962306a36Sopenharmony_ci    $ref: /schemas/types.yaml#/definitions/phandle
4062306a36Sopenharmony_ci    description:
4162306a36Sopenharmony_ci      The phandle of the I2C bus that this multiplexer's master-side port is
4262306a36Sopenharmony_ci      connected to.
4362306a36Sopenharmony_ci
4462306a36Sopenharmony_ci  mux-controls:
4562306a36Sopenharmony_ci    maxItems: 1
4662306a36Sopenharmony_ci    description:
4762306a36Sopenharmony_ci      The mux-controller states are the I2C sub-bus numbers.
4862306a36Sopenharmony_ci
4962306a36Sopenharmony_ci  mux-locked:
5062306a36Sopenharmony_ci    type: boolean
5162306a36Sopenharmony_ci    description: |
5262306a36Sopenharmony_ci      Explicitly allow unrelated I2C transactions on the parent I2C adapter at
5362306a36Sopenharmony_ci      these times:
5462306a36Sopenharmony_ci       - during setup of the multiplexer
5562306a36Sopenharmony_ci       - between setup of the multiplexer and the child bus I2C transaction
5662306a36Sopenharmony_ci       - between the child bus I2C transaction and releasing of the multiplexer
5762306a36Sopenharmony_ci       - during releasing of the multiplexer
5862306a36Sopenharmony_ci
5962306a36Sopenharmony_ci      However, I2C transactions to devices behind all I2C multiplexers connected
6062306a36Sopenharmony_ci      to the same parent adapter that this multiplexer is connected to are blocked
6162306a36Sopenharmony_ci      for the full duration of the complete multiplexed I2C transaction (i.e.
6262306a36Sopenharmony_ci      including the times covered by the above list).
6362306a36Sopenharmony_ci      If mux-locked is not present, the multiplexer is assumed to be parent-locked.
6462306a36Sopenharmony_ci      This means that no unrelated I2C transactions are allowed on the parent I2C
6562306a36Sopenharmony_ci      adapter for the complete multiplexed I2C transaction.
6662306a36Sopenharmony_ci      The properties of mux-locked and parent-locked multiplexers are discussed
6762306a36Sopenharmony_ci      in more detail in Documentation/i2c/i2c-topology.rst.
6862306a36Sopenharmony_ci
6962306a36Sopenharmony_cirequired:
7062306a36Sopenharmony_ci  - compatible
7162306a36Sopenharmony_ci  - i2c-parent
7262306a36Sopenharmony_ci  - mux-controls
7362306a36Sopenharmony_ci
7462306a36Sopenharmony_ciunevaluatedProperties: false
7562306a36Sopenharmony_ci
7662306a36Sopenharmony_ciexamples:
7762306a36Sopenharmony_ci  - |
7862306a36Sopenharmony_ci    #include <dt-bindings/gpio/gpio.h>
7962306a36Sopenharmony_ci    mux: mux-controller {
8062306a36Sopenharmony_ci        compatible = "gpio-mux";
8162306a36Sopenharmony_ci        #mux-control-cells = <0>;
8262306a36Sopenharmony_ci
8362306a36Sopenharmony_ci        mux-gpios = <&pioA 0 GPIO_ACTIVE_HIGH>,
8462306a36Sopenharmony_ci                    <&pioA 1 GPIO_ACTIVE_HIGH>;
8562306a36Sopenharmony_ci    };
8662306a36Sopenharmony_ci
8762306a36Sopenharmony_ci    i2c-mux {
8862306a36Sopenharmony_ci        compatible = "i2c-mux";
8962306a36Sopenharmony_ci        mux-locked;
9062306a36Sopenharmony_ci        i2c-parent = <&i2c1>;
9162306a36Sopenharmony_ci
9262306a36Sopenharmony_ci        mux-controls = <&mux>;
9362306a36Sopenharmony_ci
9462306a36Sopenharmony_ci        #address-cells = <1>;
9562306a36Sopenharmony_ci        #size-cells = <0>;
9662306a36Sopenharmony_ci
9762306a36Sopenharmony_ci        i2c@1 {
9862306a36Sopenharmony_ci            reg = <1>;
9962306a36Sopenharmony_ci            #address-cells = <1>;
10062306a36Sopenharmony_ci            #size-cells = <0>;
10162306a36Sopenharmony_ci
10262306a36Sopenharmony_ci            gpio@20 {
10362306a36Sopenharmony_ci                compatible = "nxp,pca9555";
10462306a36Sopenharmony_ci                gpio-controller;
10562306a36Sopenharmony_ci                #gpio-cells = <2>;
10662306a36Sopenharmony_ci                reg = <0x20>;
10762306a36Sopenharmony_ci            };
10862306a36Sopenharmony_ci        };
10962306a36Sopenharmony_ci
11062306a36Sopenharmony_ci        i2c@3 {
11162306a36Sopenharmony_ci            reg = <3>;
11262306a36Sopenharmony_ci            #address-cells = <1>;
11362306a36Sopenharmony_ci            #size-cells = <0>;
11462306a36Sopenharmony_ci
11562306a36Sopenharmony_ci            gpio@20 {
11662306a36Sopenharmony_ci                compatible = "nxp,pca9555";
11762306a36Sopenharmony_ci                gpio-controller;
11862306a36Sopenharmony_ci                #gpio-cells = <2>;
11962306a36Sopenharmony_ci                reg = <0x20>;
12062306a36Sopenharmony_ci            };
12162306a36Sopenharmony_ci        };
12262306a36Sopenharmony_ci    };
12362306a36Sopenharmony_ci...
124