1# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
2%YAML 1.2
3---
4$id: http://devicetree.org/schemas/i2c/i2c-demux-pinctrl.yaml#
5$schema: http://devicetree.org/meta-schemas/core.yaml#
6
7title: Pinctrl-based I2C Bus Demultiplexer
8
9maintainers:
10  - Wolfram Sang <wsa+renesas@sang-engineering.com>
11
12description: |
13  This binding describes an I2C bus demultiplexer that uses pin multiplexing to
14  route the I2C signals, and represents the pin multiplexing configuration
15  using the pinctrl device tree bindings.  This may be used to select one I2C
16  IP core at runtime which may have a better feature set for a given task than
17  another I2C IP core on the SoC.  The most simple example is to fall back to
18  GPIO bitbanging if your current runtime configuration hits an errata of the
19  internal IP core.
20
21      +-------------------------------+
22      | SoC                           |
23      |                               |   +-----+  +-----+
24      |   +------------+              |   | dev |  | dev |
25      |   |I2C IP Core1|--\           |   +-----+  +-----+
26      |   +------------+   \-------+  |      |        |
27      |                    |Pinctrl|--|------+--------+
28      |   +------------+   +-------+  |
29      |   |I2C IP Core2|--/           |
30      |   +------------+              |
31      |                               |
32      +-------------------------------+
33
34allOf:
35  - $ref: i2c-mux.yaml
36  - $ref: /schemas/i2c/i2c-controller.yaml#
37
38properties:
39  compatible:
40    const: i2c-demux-pinctrl
41
42  i2c-parent:
43    $ref: /schemas/types.yaml#/definitions/phandle-array
44    description:
45      List of phandles of I2C masters available for selection.  The first one
46      will be used as default.
47
48  i2c-bus-name:
49    $ref: /schemas/types.yaml#/definitions/string
50    description:
51      The name of this bus.  Also needed as pinctrl-name for the I2C parents.
52
53required:
54  - compatible
55  - i2c-parent
56  - i2c-bus-name
57
58unevaluatedProperties: false
59
60examples:
61  - |
62    #include <dt-bindings/gpio/gpio.h>
63    #include <dt-bindings/interrupt-controller/irq.h>
64
65    gpioi2c2: i2c-9 {
66        #address-cells = <1>;
67        #size-cells = <0>;
68        compatible = "i2c-gpio";
69        scl-gpios = <&gpio5 5 (GPIO_ACTIVE_HIGH | GPIO_OPEN_DRAIN)>;
70        sda-gpios = <&gpio5 6 (GPIO_ACTIVE_HIGH | GPIO_OPEN_DRAIN)>;
71        i2c-gpio,delay-us = <5>;
72
73        // The I2C controller must have its status "disabled".  The I2C bus
74        // demultiplexer will enable it at runtime when needed.
75        status = "disabled";
76    };
77
78    iic2: i2c@e6520000 {
79        reg = <0xe6520000 0x425>;
80        pinctrl-0 = <&iic2_pins>;
81        // The pinctrl property for the parent I2C controller needs a pinctrl
82        // state with the same name as i2c-bus-name in the I2C bus demultiplexer
83        // node, not "default"!
84        pinctrl-names = "i2c-hdmi";
85
86        clock-frequency = <100000>;
87
88        // The I2C controller must have its status "disabled".  The I2C bus
89        // demultiplexer will enable it at runtime when needed.
90        status = "disabled";
91    };
92
93    i2c2: i2c@e6530000 {
94        reg = <0 0xe6530000 0 0x40>;
95        pinctrl-0 = <&i2c2_pins>;
96        // The pinctrl property for the parent I2C controller needs a pinctrl
97        // state with the same name as i2c-bus-name in the I2C bus demultiplexer
98        // node, not "default"!
99        pinctrl-names = "i2c-hdmi";
100
101        clock-frequency = <100000>;
102
103        // The I2C controller must have its status "disabled".  The I2C bus
104        // demultiplexer will enable it at runtime when needed.
105        status = "disabled";
106    };
107
108    // Example for a bus to be demuxed.  It contains various I2C clients for
109    // HDMI, so the bus is named "i2c-hdmi":
110    i2chdmi: i2c-mux3 {
111            compatible = "i2c-demux-pinctrl";
112            i2c-parent = <&iic2>, <&i2c2>, <&gpioi2c2>;
113            i2c-bus-name = "i2c-hdmi";
114            #address-cells = <1>;
115            #size-cells = <0>;
116
117            ak4643: codec@12 {
118                    compatible = "asahi-kasei,ak4643";
119                    #sound-dai-cells = <0>;
120                    reg = <0x12>;
121            };
122
123            composite-in@20 {
124                    compatible = "adi,adv7180";
125                    reg = <0x20>;
126
127                    port {
128                            adv7180: endpoint {
129                                    bus-width = <8>;
130                                    remote-endpoint = <&vin1ep0>;
131                            };
132                    };
133            };
134
135            hdmi@39 {
136                    compatible = "adi,adv7511w";
137                    reg = <0x39>;
138                    interrupt-parent = <&gpio1>;
139                    interrupts = <15 IRQ_TYPE_LEVEL_LOW>;
140                    clocks = <&cec_clock>;
141                    clock-names = "cec";
142
143                    avdd-supply = <&fixedregulator1v8>;
144                    dvdd-supply = <&fixedregulator1v8>;
145                    pvdd-supply = <&fixedregulator1v8>;
146                    dvdd-3v-supply = <&fixedregulator3v3>;
147                    bgvdd-supply = <&fixedregulator1v8>;
148
149                    adi,input-depth = <8>;
150                    adi,input-colorspace = "rgb";
151                    adi,input-clock = "1x";
152
153                    ports {
154                            #address-cells = <1>;
155                            #size-cells = <0>;
156
157                            port@0 {
158                                    reg = <0>;
159                                    adv7511_in: endpoint {
160                                            remote-endpoint = <&lvds0_out>;
161                                    };
162                            };
163
164                            port@1 {
165                                    reg = <1>;
166                                    adv7511_out: endpoint {
167                                            remote-endpoint = <&hdmi_con_out>;
168                                    };
169                            };
170                    };
171            };
172    };
173