xref: /linux/Documentation/devicetree/bindings/i2c/i2c-demux-pinctrl.yaml (revision a1ff5a7d78a036d6c2178ee5acd6ba4946243800)
14411a2ccSGeert Uytterhoeven# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
24411a2ccSGeert Uytterhoeven%YAML 1.2
34411a2ccSGeert Uytterhoeven---
44411a2ccSGeert Uytterhoeven$id: http://devicetree.org/schemas/i2c/i2c-demux-pinctrl.yaml#
54411a2ccSGeert Uytterhoeven$schema: http://devicetree.org/meta-schemas/core.yaml#
64411a2ccSGeert Uytterhoeven
74411a2ccSGeert Uytterhoeventitle: Pinctrl-based I2C Bus Demultiplexer
84411a2ccSGeert Uytterhoeven
94411a2ccSGeert Uytterhoevenmaintainers:
104411a2ccSGeert Uytterhoeven  - Wolfram Sang <wsa+renesas@sang-engineering.com>
114411a2ccSGeert Uytterhoeven
124411a2ccSGeert Uytterhoevendescription: |
134411a2ccSGeert Uytterhoeven  This binding describes an I2C bus demultiplexer that uses pin multiplexing to
144411a2ccSGeert Uytterhoeven  route the I2C signals, and represents the pin multiplexing configuration
154411a2ccSGeert Uytterhoeven  using the pinctrl device tree bindings.  This may be used to select one I2C
164411a2ccSGeert Uytterhoeven  IP core at runtime which may have a better feature set for a given task than
174411a2ccSGeert Uytterhoeven  another I2C IP core on the SoC.  The most simple example is to fall back to
184411a2ccSGeert Uytterhoeven  GPIO bitbanging if your current runtime configuration hits an errata of the
194411a2ccSGeert Uytterhoeven  internal IP core.
204411a2ccSGeert Uytterhoeven
214411a2ccSGeert Uytterhoeven      +-------------------------------+
224411a2ccSGeert Uytterhoeven      | SoC                           |
234411a2ccSGeert Uytterhoeven      |                               |   +-----+  +-----+
244411a2ccSGeert Uytterhoeven      |   +------------+              |   | dev |  | dev |
254411a2ccSGeert Uytterhoeven      |   |I2C IP Core1|--\           |   +-----+  +-----+
264411a2ccSGeert Uytterhoeven      |   +------------+   \-------+  |      |        |
274411a2ccSGeert Uytterhoeven      |                    |Pinctrl|--|------+--------+
284411a2ccSGeert Uytterhoeven      |   +------------+   +-------+  |
294411a2ccSGeert Uytterhoeven      |   |I2C IP Core2|--/           |
304411a2ccSGeert Uytterhoeven      |   +------------+              |
314411a2ccSGeert Uytterhoeven      |                               |
324411a2ccSGeert Uytterhoeven      +-------------------------------+
334411a2ccSGeert Uytterhoeven
344411a2ccSGeert UytterhoevenallOf:
354411a2ccSGeert Uytterhoeven  - $ref: /schemas/i2c/i2c-controller.yaml#
364411a2ccSGeert Uytterhoeven
374411a2ccSGeert Uytterhoevenproperties:
384411a2ccSGeert Uytterhoeven  compatible:
394411a2ccSGeert Uytterhoeven    const: i2c-demux-pinctrl
404411a2ccSGeert Uytterhoeven
414411a2ccSGeert Uytterhoeven  i2c-parent:
424411a2ccSGeert Uytterhoeven    $ref: /schemas/types.yaml#/definitions/phandle-array
43*91f9a47dSRob Herring    items:
44*91f9a47dSRob Herring      maxItems: 1
454411a2ccSGeert Uytterhoeven    description:
464411a2ccSGeert Uytterhoeven      List of phandles of I2C masters available for selection.  The first one
474411a2ccSGeert Uytterhoeven      will be used as default.
484411a2ccSGeert Uytterhoeven
494411a2ccSGeert Uytterhoeven  i2c-bus-name:
504411a2ccSGeert Uytterhoeven    $ref: /schemas/types.yaml#/definitions/string
514411a2ccSGeert Uytterhoeven    description:
524411a2ccSGeert Uytterhoeven      The name of this bus.  Also needed as pinctrl-name for the I2C parents.
534411a2ccSGeert Uytterhoeven
544411a2ccSGeert Uytterhoevenrequired:
554411a2ccSGeert Uytterhoeven  - compatible
564411a2ccSGeert Uytterhoeven  - i2c-parent
574411a2ccSGeert Uytterhoeven  - i2c-bus-name
584411a2ccSGeert Uytterhoeven
594411a2ccSGeert UytterhoevenunevaluatedProperties: false
604411a2ccSGeert Uytterhoeven
614411a2ccSGeert Uytterhoevenexamples:
624411a2ccSGeert Uytterhoeven  - |
634411a2ccSGeert Uytterhoeven    #include <dt-bindings/gpio/gpio.h>
644411a2ccSGeert Uytterhoeven    #include <dt-bindings/interrupt-controller/irq.h>
654411a2ccSGeert Uytterhoeven
664411a2ccSGeert Uytterhoeven    gpioi2c2: i2c-9 {
674411a2ccSGeert Uytterhoeven        #address-cells = <1>;
684411a2ccSGeert Uytterhoeven        #size-cells = <0>;
694411a2ccSGeert Uytterhoeven        compatible = "i2c-gpio";
704411a2ccSGeert Uytterhoeven        scl-gpios = <&gpio5 5 (GPIO_ACTIVE_HIGH | GPIO_OPEN_DRAIN)>;
714411a2ccSGeert Uytterhoeven        sda-gpios = <&gpio5 6 (GPIO_ACTIVE_HIGH | GPIO_OPEN_DRAIN)>;
724411a2ccSGeert Uytterhoeven        i2c-gpio,delay-us = <5>;
734411a2ccSGeert Uytterhoeven
744411a2ccSGeert Uytterhoeven        // The I2C controller must have its status "disabled".  The I2C bus
754411a2ccSGeert Uytterhoeven        // demultiplexer will enable it at runtime when needed.
764411a2ccSGeert Uytterhoeven        status = "disabled";
774411a2ccSGeert Uytterhoeven    };
784411a2ccSGeert Uytterhoeven
794411a2ccSGeert Uytterhoeven    iic2: i2c@e6520000 {
804411a2ccSGeert Uytterhoeven        reg = <0xe6520000 0x425>;
814411a2ccSGeert Uytterhoeven        pinctrl-0 = <&iic2_pins>;
824411a2ccSGeert Uytterhoeven        // The pinctrl property for the parent I2C controller needs a pinctrl
834411a2ccSGeert Uytterhoeven        // state with the same name as i2c-bus-name in the I2C bus demultiplexer
844411a2ccSGeert Uytterhoeven        // node, not "default"!
854411a2ccSGeert Uytterhoeven        pinctrl-names = "i2c-hdmi";
864411a2ccSGeert Uytterhoeven
874411a2ccSGeert Uytterhoeven        clock-frequency = <100000>;
884411a2ccSGeert Uytterhoeven
894411a2ccSGeert Uytterhoeven        // The I2C controller must have its status "disabled".  The I2C bus
904411a2ccSGeert Uytterhoeven        // demultiplexer will enable it at runtime when needed.
914411a2ccSGeert Uytterhoeven        status = "disabled";
924411a2ccSGeert Uytterhoeven    };
934411a2ccSGeert Uytterhoeven
944411a2ccSGeert Uytterhoeven    i2c2: i2c@e6530000 {
954411a2ccSGeert Uytterhoeven        reg = <0 0xe6530000 0 0x40>;
964411a2ccSGeert Uytterhoeven        pinctrl-0 = <&i2c2_pins>;
974411a2ccSGeert Uytterhoeven        // The pinctrl property for the parent I2C controller needs a pinctrl
984411a2ccSGeert Uytterhoeven        // state with the same name as i2c-bus-name in the I2C bus demultiplexer
994411a2ccSGeert Uytterhoeven        // node, not "default"!
1004411a2ccSGeert Uytterhoeven        pinctrl-names = "i2c-hdmi";
1014411a2ccSGeert Uytterhoeven
1024411a2ccSGeert Uytterhoeven        clock-frequency = <100000>;
1034411a2ccSGeert Uytterhoeven
1044411a2ccSGeert Uytterhoeven        // The I2C controller must have its status "disabled".  The I2C bus
1054411a2ccSGeert Uytterhoeven        // demultiplexer will enable it at runtime when needed.
1064411a2ccSGeert Uytterhoeven        status = "disabled";
1074411a2ccSGeert Uytterhoeven    };
1084411a2ccSGeert Uytterhoeven
1094411a2ccSGeert Uytterhoeven    // Example for a bus to be demuxed.  It contains various I2C clients for
1104411a2ccSGeert Uytterhoeven    // HDMI, so the bus is named "i2c-hdmi":
1114411a2ccSGeert Uytterhoeven    i2chdmi: i2c-mux3 {
1124411a2ccSGeert Uytterhoeven        compatible = "i2c-demux-pinctrl";
1134411a2ccSGeert Uytterhoeven        i2c-parent = <&iic2>, <&i2c2>, <&gpioi2c2>;
1144411a2ccSGeert Uytterhoeven        i2c-bus-name = "i2c-hdmi";
1154411a2ccSGeert Uytterhoeven        #address-cells = <1>;
1164411a2ccSGeert Uytterhoeven        #size-cells = <0>;
1174411a2ccSGeert Uytterhoeven
1184411a2ccSGeert Uytterhoeven        ak4643: codec@12 {
1194411a2ccSGeert Uytterhoeven            compatible = "asahi-kasei,ak4643";
1204411a2ccSGeert Uytterhoeven            #sound-dai-cells = <0>;
1214411a2ccSGeert Uytterhoeven            reg = <0x12>;
1224411a2ccSGeert Uytterhoeven        };
1234411a2ccSGeert Uytterhoeven
1244411a2ccSGeert Uytterhoeven        composite-in@20 {
1254411a2ccSGeert Uytterhoeven            compatible = "adi,adv7180";
1264411a2ccSGeert Uytterhoeven            reg = <0x20>;
1274411a2ccSGeert Uytterhoeven
1284411a2ccSGeert Uytterhoeven            port {
1294411a2ccSGeert Uytterhoeven                adv7180: endpoint {
1304411a2ccSGeert Uytterhoeven                    bus-width = <8>;
1314411a2ccSGeert Uytterhoeven                    remote-endpoint = <&vin1ep0>;
1324411a2ccSGeert Uytterhoeven                };
1334411a2ccSGeert Uytterhoeven            };
1344411a2ccSGeert Uytterhoeven        };
1354411a2ccSGeert Uytterhoeven
1364411a2ccSGeert Uytterhoeven        hdmi@39 {
1374411a2ccSGeert Uytterhoeven            compatible = "adi,adv7511w";
1384411a2ccSGeert Uytterhoeven            reg = <0x39>;
1394411a2ccSGeert Uytterhoeven            interrupt-parent = <&gpio1>;
1404411a2ccSGeert Uytterhoeven            interrupts = <15 IRQ_TYPE_LEVEL_LOW>;
1414411a2ccSGeert Uytterhoeven            clocks = <&cec_clock>;
1424411a2ccSGeert Uytterhoeven            clock-names = "cec";
1434411a2ccSGeert Uytterhoeven
1444411a2ccSGeert Uytterhoeven            avdd-supply = <&fixedregulator1v8>;
1454411a2ccSGeert Uytterhoeven            dvdd-supply = <&fixedregulator1v8>;
1464411a2ccSGeert Uytterhoeven            pvdd-supply = <&fixedregulator1v8>;
1474411a2ccSGeert Uytterhoeven            dvdd-3v-supply = <&fixedregulator3v3>;
1484411a2ccSGeert Uytterhoeven            bgvdd-supply = <&fixedregulator1v8>;
1494411a2ccSGeert Uytterhoeven
1504411a2ccSGeert Uytterhoeven            adi,input-depth = <8>;
1514411a2ccSGeert Uytterhoeven            adi,input-colorspace = "rgb";
1524411a2ccSGeert Uytterhoeven            adi,input-clock = "1x";
1534411a2ccSGeert Uytterhoeven
1544411a2ccSGeert Uytterhoeven            ports {
1554411a2ccSGeert Uytterhoeven                #address-cells = <1>;
1564411a2ccSGeert Uytterhoeven                #size-cells = <0>;
1574411a2ccSGeert Uytterhoeven
1584411a2ccSGeert Uytterhoeven                port@0 {
1594411a2ccSGeert Uytterhoeven                    reg = <0>;
1604411a2ccSGeert Uytterhoeven                    adv7511_in: endpoint {
1614411a2ccSGeert Uytterhoeven                        remote-endpoint = <&lvds0_out>;
1624411a2ccSGeert Uytterhoeven                    };
1634411a2ccSGeert Uytterhoeven                };
1644411a2ccSGeert Uytterhoeven
1654411a2ccSGeert Uytterhoeven                port@1 {
1664411a2ccSGeert Uytterhoeven                    reg = <1>;
1674411a2ccSGeert Uytterhoeven                    adv7511_out: endpoint {
1684411a2ccSGeert Uytterhoeven                        remote-endpoint = <&hdmi_con_out>;
1694411a2ccSGeert Uytterhoeven                    };
1704411a2ccSGeert Uytterhoeven                };
1714411a2ccSGeert Uytterhoeven            };
1724411a2ccSGeert Uytterhoeven        };
1734411a2ccSGeert Uytterhoeven    };
174