xref: /linux/Documentation/devicetree/bindings/i2c/i2c-mux-gpio.yaml (revision fc114c75680da73c3815512d880f69cecc9a9b87)
1f91030edSThierry Reding# SPDX-License-Identifier: GPL-2.0-only
2f91030edSThierry Reding%YAML 1.2
3f91030edSThierry Reding---
4f91030edSThierry Reding$id: http://devicetree.org/schemas/i2c/i2c-mux-gpio.yaml#
5f91030edSThierry Reding$schema: http://devicetree.org/meta-schemas/core.yaml#
6f91030edSThierry Reding
7f91030edSThierry Redingtitle: GPIO-based I2C Bus Mux
8f91030edSThierry Reding
9f91030edSThierry Redingmaintainers:
10f91030edSThierry Reding  - Wolfram Sang <wsa@kernel.org>
11f91030edSThierry Reding
12f91030edSThierry Redingdescription: |
13f91030edSThierry Reding  This binding describes an I2C bus multiplexer that uses GPIOs to route the I2C signals.
14f91030edSThierry Reding
15f91030edSThierry Reding                                  +-----+  +-----+
16f91030edSThierry Reding                                  | dev |  | dev |
17f91030edSThierry Reding    +------------+                +-----+  +-----+
18f91030edSThierry Reding    | SoC        |                   |        |
19f91030edSThierry Reding    |            |          /--------+--------+
20f91030edSThierry Reding    |   +------+ |  +------+    child bus A, on GPIO value set to 0
21f91030edSThierry Reding    |   | I2C  |-|--| Mux  |
22f91030edSThierry Reding    |   +------+ |  +--+---+    child bus B, on GPIO value set to 1
23f91030edSThierry Reding    |            |     |    \----------+--------+--------+
24f91030edSThierry Reding    |   +------+ |     |               |        |        |
25f91030edSThierry Reding    |   | GPIO |-|-----+            +-----+  +-----+  +-----+
26f91030edSThierry Reding    |   +------+ |                  | dev |  | dev |  | dev |
27f91030edSThierry Reding    +------------+                  +-----+  +-----+  +-----+
28f91030edSThierry Reding
29f91030edSThierry Reding  For each I2C child node, an I2C child bus will be created. They will be numbered based on their
30f91030edSThierry Reding  order in the device tree.
31f91030edSThierry Reding
32f91030edSThierry Reding  Whenever an access is made to a device on a child bus, the value set in the relevant node's reg
33f91030edSThierry Reding  property will be output using the list of GPIOs, the first in the list holding the least-
34f91030edSThierry Reding  significant value.
35f91030edSThierry Reding
36f91030edSThierry Reding  If an idle state is defined, using the idle-state (optional) property, whenever an access is not
37f91030edSThierry Reding  being made to a device on a child bus, the GPIOs will be set according to the idle value.
38f91030edSThierry Reding
39f91030edSThierry Reding  If an idle state is not defined, the most recently used value will be left programmed into
40f91030edSThierry Reding  hardware whenever no access is being made to a device on a child bus.
41f91030edSThierry Reding
42f91030edSThierry Redingproperties:
43f91030edSThierry Reding  compatible:
44f91030edSThierry Reding    const: i2c-mux-gpio
45f91030edSThierry Reding
46f91030edSThierry Reding  i2c-parent:
47f91030edSThierry Reding    description: phandle of the I2C bus that this multiplexer's master-side port is connected to
48*fc114c75SRob Herring    $ref: /schemas/types.yaml#/definitions/phandle
49f91030edSThierry Reding
50f91030edSThierry Reding  mux-gpios:
51f91030edSThierry Reding    description: list of GPIOs used to control the muxer
52f91030edSThierry Reding    minItems: 1
53f91030edSThierry Reding    maxItems: 4  # Should be enough
54f91030edSThierry Reding
55f91030edSThierry Reding  idle-state:
56f91030edSThierry Reding    description: Value to set the muxer to when idle. When no value is given, it defaults to the
57f91030edSThierry Reding      last value used.
58*fc114c75SRob Herring    $ref: /schemas/types.yaml#/definitions/uint32
59f91030edSThierry Reding
60f91030edSThierry RedingallOf:
61f91030edSThierry Reding  - $ref: i2c-mux.yaml
62f91030edSThierry Reding
63f91030edSThierry RedingunevaluatedProperties: false
64f91030edSThierry Reding
65f91030edSThierry Redingrequired:
66f91030edSThierry Reding  - compatible
67f91030edSThierry Reding  - i2c-parent
68f91030edSThierry Reding  - mux-gpios
69f91030edSThierry Reding
70f91030edSThierry Redingexamples:
71f91030edSThierry Reding  - |
72f91030edSThierry Reding    i2cmux {
73f91030edSThierry Reding      compatible = "i2c-mux-gpio";
74f91030edSThierry Reding      #address-cells = <1>;
75f91030edSThierry Reding      #size-cells = <0>;
76f91030edSThierry Reding      mux-gpios = <&gpio1 22 0>, <&gpio1 23 0>;
77f91030edSThierry Reding      i2c-parent = <&i2c1>;
78f91030edSThierry Reding
79f91030edSThierry Reding      i2c@1 {
80f91030edSThierry Reding        reg = <1>;
81f91030edSThierry Reding        #address-cells = <1>;
82f91030edSThierry Reding        #size-cells = <0>;
83f91030edSThierry Reding
84f91030edSThierry Reding        ssd1307: oled@3c {
85f91030edSThierry Reding          compatible = "solomon,ssd1307fb-i2c";
86f91030edSThierry Reding          reg = <0x3c>;
87f91030edSThierry Reding          pwms = <&pwm 4 3000>;
88f91030edSThierry Reding          reset-gpios = <&gpio2 7 1>;
89f91030edSThierry Reding        };
90f91030edSThierry Reding      };
91f91030edSThierry Reding
92f91030edSThierry Reding      i2c@3 {
93f91030edSThierry Reding        reg = <3>;
94f91030edSThierry Reding        #address-cells = <1>;
95f91030edSThierry Reding        #size-cells = <0>;
96f91030edSThierry Reding
97f91030edSThierry Reding        pca9555: pca9555@20 {
98f91030edSThierry Reding          compatible = "nxp,pca9555";
99f91030edSThierry Reding          gpio-controller;
100f91030edSThierry Reding          #gpio-cells = <2>;
101f91030edSThierry Reding          reg = <0x20>;
102f91030edSThierry Reding        };
103f91030edSThierry Reding      };
104f91030edSThierry Reding    };
105