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