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-pinctrl.yaml#
562306a36Sopenharmony_ci$schema: http://devicetree.org/meta-schemas/core.yaml#
662306a36Sopenharmony_ci
762306a36Sopenharmony_cititle: Pinctrl-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 pin multiplexing to route the I2C
1462306a36Sopenharmony_ci  signals, and represents the pin multiplexing configuration using the pinctrl device tree
1562306a36Sopenharmony_ci  bindings.
1662306a36Sopenharmony_ci
1762306a36Sopenharmony_ci                                 +-----+  +-----+
1862306a36Sopenharmony_ci                                 | dev |  | dev |
1962306a36Sopenharmony_ci    +------------------------+   +-----+  +-----+
2062306a36Sopenharmony_ci    | SoC                    |      |        |
2162306a36Sopenharmony_ci    |                   /----|------+--------+
2262306a36Sopenharmony_ci    |   +---+   +------+     | child bus A, on first set of pins
2362306a36Sopenharmony_ci    |   |I2C|---|Pinmux|     |
2462306a36Sopenharmony_ci    |   +---+   +------+     | child bus B, on second set of pins
2562306a36Sopenharmony_ci    |                   \----|------+--------+--------+
2662306a36Sopenharmony_ci    |                        |      |        |        |
2762306a36Sopenharmony_ci    +------------------------+  +-----+  +-----+  +-----+
2862306a36Sopenharmony_ci                                | dev |  | dev |  | dev |
2962306a36Sopenharmony_ci                                +-----+  +-----+  +-----+
3062306a36Sopenharmony_ci
3162306a36Sopenharmony_ci  For each named state defined in the pinctrl-names property, an I2C child bus will be created.
3262306a36Sopenharmony_ci  I2C child bus numbers are assigned based on the index into the pinctrl-names property.
3362306a36Sopenharmony_ci
3462306a36Sopenharmony_ci  The only exception is that no bus will be created for a state named "idle". If such a state is
3562306a36Sopenharmony_ci  defined, it must be the last entry in pinctrl-names. For example:
3662306a36Sopenharmony_ci
3762306a36Sopenharmony_ci    pinctrl-names = "ddc", "pta", "idle"  ->  ddc = bus 0, pta = bus 1
3862306a36Sopenharmony_ci    pinctrl-names = "ddc", "idle", "pta"  ->  Invalid ("idle" not last)
3962306a36Sopenharmony_ci    pinctrl-names = "idle", "ddc", "pta"  ->  Invalid ("idle" not last)
4062306a36Sopenharmony_ci
4162306a36Sopenharmony_ci  Whenever an access is made to a device on a child bus, the relevant pinctrl state will be
4262306a36Sopenharmony_ci  programmed into hardware.
4362306a36Sopenharmony_ci
4462306a36Sopenharmony_ci  If an idle state is defined, whenever an access is not being made to a device on a child bus,
4562306a36Sopenharmony_ci  the idle pinctrl state will be programmed into hardware.
4662306a36Sopenharmony_ci
4762306a36Sopenharmony_ci  If an idle state is not defined, the most recently used pinctrl state will be left programmed
4862306a36Sopenharmony_ci  into hardware whenever no access is being made of a device on a child bus.
4962306a36Sopenharmony_ci
5062306a36Sopenharmony_ciproperties:
5162306a36Sopenharmony_ci  compatible:
5262306a36Sopenharmony_ci    const: i2c-mux-pinctrl
5362306a36Sopenharmony_ci
5462306a36Sopenharmony_ci  i2c-parent:
5562306a36Sopenharmony_ci    $ref: /schemas/types.yaml#/definitions/phandle
5662306a36Sopenharmony_ci    description: The phandle of the I2C bus that this multiplexer's master-side port is connected
5762306a36Sopenharmony_ci      to.
5862306a36Sopenharmony_ci
5962306a36Sopenharmony_ciallOf:
6062306a36Sopenharmony_ci  - $ref: i2c-mux.yaml
6162306a36Sopenharmony_ci
6262306a36Sopenharmony_ciunevaluatedProperties: false
6362306a36Sopenharmony_ci
6462306a36Sopenharmony_cirequired:
6562306a36Sopenharmony_ci  - compatible
6662306a36Sopenharmony_ci  - i2c-parent
6762306a36Sopenharmony_ci
6862306a36Sopenharmony_ciexamples:
6962306a36Sopenharmony_ci  - |
7062306a36Sopenharmony_ci    i2cmux {
7162306a36Sopenharmony_ci      compatible = "i2c-mux-pinctrl";
7262306a36Sopenharmony_ci      #address-cells = <1>;
7362306a36Sopenharmony_ci      #size-cells = <0>;
7462306a36Sopenharmony_ci
7562306a36Sopenharmony_ci      i2c-parent = <&i2c1>;
7662306a36Sopenharmony_ci
7762306a36Sopenharmony_ci      pinctrl-names = "ddc", "pta", "idle";
7862306a36Sopenharmony_ci      pinctrl-0 = <&state_i2cmux_ddc>;
7962306a36Sopenharmony_ci      pinctrl-1 = <&state_i2cmux_pta>;
8062306a36Sopenharmony_ci      pinctrl-2 = <&state_i2cmux_idle>;
8162306a36Sopenharmony_ci
8262306a36Sopenharmony_ci      i2c@0 {
8362306a36Sopenharmony_ci        reg = <0>;
8462306a36Sopenharmony_ci        #address-cells = <1>;
8562306a36Sopenharmony_ci        #size-cells = <0>;
8662306a36Sopenharmony_ci
8762306a36Sopenharmony_ci        eeprom@50 {
8862306a36Sopenharmony_ci          compatible = "atmel,24c02";
8962306a36Sopenharmony_ci          reg = <0x50>;
9062306a36Sopenharmony_ci        };
9162306a36Sopenharmony_ci      };
9262306a36Sopenharmony_ci
9362306a36Sopenharmony_ci      i2c@1 {
9462306a36Sopenharmony_ci        reg = <1>;
9562306a36Sopenharmony_ci        #address-cells = <1>;
9662306a36Sopenharmony_ci        #size-cells = <0>;
9762306a36Sopenharmony_ci
9862306a36Sopenharmony_ci        eeprom@50 {
9962306a36Sopenharmony_ci          compatible = "atmel,24c02";
10062306a36Sopenharmony_ci          reg = <0x50>;
10162306a36Sopenharmony_ci        };
10262306a36Sopenharmony_ci      };
10362306a36Sopenharmony_ci    };
104