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: /schemas/i2c/i2c-controller.yaml#
36
37properties:
38  compatible:
39    const: i2c-demux-pinctrl
40
41  i2c-parent:
42    $ref: /schemas/types.yaml#/definitions/phandle-array
43    items:
44      maxItems: 1
45    description:
46      List of phandles of I2C masters available for selection.  The first one
47      will be used as default.
48
49  i2c-bus-name:
50    $ref: /schemas/types.yaml#/definitions/string
51    description:
52      The name of this bus.  Also needed as pinctrl-name for the I2C parents.
53
54required:
55  - compatible
56  - i2c-parent
57  - i2c-bus-name
58
59unevaluatedProperties: false
60
61examples:
62  - |
63    #include <dt-bindings/gpio/gpio.h>
64    #include <dt-bindings/interrupt-controller/irq.h>
65
66    gpioi2c2: i2c-9 {
67        #address-cells = <1>;
68        #size-cells = <0>;
69        compatible = "i2c-gpio";
70        scl-gpios = <&gpio5 5 (GPIO_ACTIVE_HIGH | GPIO_OPEN_DRAIN)>;
71        sda-gpios = <&gpio5 6 (GPIO_ACTIVE_HIGH | GPIO_OPEN_DRAIN)>;
72        i2c-gpio,delay-us = <5>;
73
74        // The I2C controller must have its status "disabled".  The I2C bus
75        // demultiplexer will enable it at runtime when needed.
76        status = "disabled";
77    };
78
79    iic2: i2c@e6520000 {
80        reg = <0xe6520000 0x425>;
81        pinctrl-0 = <&iic2_pins>;
82        // The pinctrl property for the parent I2C controller needs a pinctrl
83        // state with the same name as i2c-bus-name in the I2C bus demultiplexer
84        // node, not "default"!
85        pinctrl-names = "i2c-hdmi";
86
87        clock-frequency = <100000>;
88
89        // The I2C controller must have its status "disabled".  The I2C bus
90        // demultiplexer will enable it at runtime when needed.
91        status = "disabled";
92    };
93
94    i2c2: i2c@e6530000 {
95        reg = <0 0xe6530000 0 0x40>;
96        pinctrl-0 = <&i2c2_pins>;
97        // The pinctrl property for the parent I2C controller needs a pinctrl
98        // state with the same name as i2c-bus-name in the I2C bus demultiplexer
99        // node, not "default"!
100        pinctrl-names = "i2c-hdmi";
101
102        clock-frequency = <100000>;
103
104        // The I2C controller must have its status "disabled".  The I2C bus
105        // demultiplexer will enable it at runtime when needed.
106        status = "disabled";
107    };
108
109    // Example for a bus to be demuxed.  It contains various I2C clients for
110    // HDMI, so the bus is named "i2c-hdmi":
111    i2chdmi: i2c-mux3 {
112            compatible = "i2c-demux-pinctrl";
113            i2c-parent = <&iic2>, <&i2c2>, <&gpioi2c2>;
114            i2c-bus-name = "i2c-hdmi";
115            #address-cells = <1>;
116            #size-cells = <0>;
117
118            ak4643: codec@12 {
119                    compatible = "asahi-kasei,ak4643";
120                    #sound-dai-cells = <0>;
121                    reg = <0x12>;
122            };
123
124            composite-in@20 {
125                    compatible = "adi,adv7180";
126                    reg = <0x20>;
127
128                    port {
129                            adv7180: endpoint {
130                                    bus-width = <8>;
131                                    remote-endpoint = <&vin1ep0>;
132                            };
133                    };
134            };
135
136            hdmi@39 {
137                    compatible = "adi,adv7511w";
138                    reg = <0x39>;
139                    interrupt-parent = <&gpio1>;
140                    interrupts = <15 IRQ_TYPE_LEVEL_LOW>;
141                    clocks = <&cec_clock>;
142                    clock-names = "cec";
143
144                    avdd-supply = <&fixedregulator1v8>;
145                    dvdd-supply = <&fixedregulator1v8>;
146                    pvdd-supply = <&fixedregulator1v8>;
147                    dvdd-3v-supply = <&fixedregulator3v3>;
148                    bgvdd-supply = <&fixedregulator1v8>;
149
150                    adi,input-depth = <8>;
151                    adi,input-colorspace = "rgb";
152                    adi,input-clock = "1x";
153
154                    ports {
155                            #address-cells = <1>;
156                            #size-cells = <0>;
157
158                            port@0 {
159                                    reg = <0>;
160                                    adv7511_in: endpoint {
161                                            remote-endpoint = <&lvds0_out>;
162                                    };
163                            };
164
165                            port@1 {
166                                    reg = <1>;
167                                    adv7511_out: endpoint {
168                                            remote-endpoint = <&hdmi_con_out>;
169                                    };
170                            };
171                    };
172            };
173    };
174