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