1Pinctrl-based I2C Bus DeMux 2 3This binding describes an I2C bus demultiplexer that uses pin multiplexing to 4route the I2C signals, and represents the pin multiplexing configuration using 5the pinctrl device tree bindings. This may be used to select one I2C IP core at 6runtime which may have a better feature set for a given task than another I2C 7IP core on the SoC. The most simple example is to fall back to GPIO bitbanging 8if your current runtime configuration hits an errata of the internal IP core. 9 10 +-------------------------------+ 11 | SoC | 12 | | +-----+ +-----+ 13 | +------------+ | | dev | | dev | 14 | |I2C IP Core1|--\ | +-----+ +-----+ 15 | +------------+ \-------+ | | | 16 | |Pinctrl|--|------+--------+ 17 | +------------+ +-------+ | 18 | |I2C IP Core2|--/ | 19 | +------------+ | 20 | | 21 +-------------------------------+ 22 23Required properties: 24- compatible: "i2c-demux-pinctrl" 25- i2c-parent: List of phandles of I2C masters available for selection. The first 26 one will be used as default. 27- i2c-bus-name: The name of this bus. Also needed as pinctrl-name for the I2C 28 parents. 29 30Furthermore, I2C mux properties and child nodes. See i2c-mux.yaml in this 31directory. 32 33Example: 34 35Here is a snipplet for a bus to be demuxed. It contains various i2c clients for 36HDMI, so the bus is named "i2c-hdmi": 37 38 i2chdmi: i2c@8 { 39 40 compatible = "i2c-demux-pinctrl"; 41 i2c-parent = <&gpioi2c>, <&iic2>, <&i2c2>; 42 i2c-bus-name = "i2c-hdmi"; 43 #address-cells = <1>; 44 #size-cells = <0>; 45 46 ak4643: sound-codec@12 { 47 compatible = "asahi-kasei,ak4643"; 48 49 #sound-dai-cells = <0>; 50 reg = <0x12>; 51 }; 52 53 composite-in@20 { 54 compatible = "adi,adv7180"; 55 reg = <0x20>; 56 remote = <&vin1>; 57 58 port { 59 adv7180: endpoint { 60 bus-width = <8>; 61 remote-endpoint = <&vin1ep0>; 62 }; 63 }; 64 }; 65 66 hdmi@39 { 67 compatible = "adi,adv7511w"; 68 reg = <0x39>; 69 interrupt-parent = <&gpio1>; 70 interrupts = <15 IRQ_TYPE_LEVEL_LOW>; 71 72 adi,input-depth = <8>; 73 adi,input-colorspace = "rgb"; 74 adi,input-clock = "1x"; 75 adi,input-style = <1>; 76 adi,input-justification = "evenly"; 77 78 ports { 79 #address-cells = <1>; 80 #size-cells = <0>; 81 82 port@0 { 83 reg = <0>; 84 adv7511_in: endpoint { 85 remote-endpoint = <&du_out_lvds0>; 86 }; 87 }; 88 89 port@1 { 90 reg = <1>; 91 adv7511_out: endpoint { 92 remote-endpoint = <&hdmi_con>; 93 }; 94 }; 95 }; 96 }; 97 }; 98 99And for clarification, here are the snipplets for the i2c-parents: 100 101 gpioi2c: i2c@9 { 102 #address-cells = <1>; 103 #size-cells = <0>; 104 compatible = "i2c-gpio"; 105 gpios = <&gpio5 6 GPIO_ACTIVE_HIGH /* sda */ 106 &gpio5 5 GPIO_ACTIVE_HIGH /* scl */ 107 >; 108 i2c-gpio,delay-us = <5>; 109 }; 110 111... 112 113&i2c2 { 114 pinctrl-0 = <&i2c2_pins>; 115 pinctrl-names = "i2c-hdmi"; 116 117 clock-frequency = <100000>; 118}; 119 120... 121 122&iic2 { 123 pinctrl-0 = <&iic2_pins>; 124 pinctrl-names = "i2c-hdmi"; 125 126 clock-frequency = <100000>; 127}; 128 129Please note: 130 131- pinctrl properties for the parent I2C controllers need a pinctrl state 132 with the same name as i2c-bus-name, not "default"! 133 134- the i2c masters must have their status "disabled". This driver will 135 enable them at runtime when needed. 136