| Pinctrl-based I2C Bus DeMux |
| |
| This binding describes an I2C bus demultiplexer that uses pin multiplexing to |
| route the I2C signals, and represents the pin multiplexing configuration using |
| the pinctrl device tree bindings. This may be used to select one I2C IP core at |
| runtime which may have a better feature set for a given task than another I2C |
| IP core on the SoC. The most simple example is to fall back to GPIO bitbanging |
| if your current runtime configuration hits an errata of the internal IP core. |
| |
| +-------------------------------+ |
| | SoC | |
| | | +-----+ +-----+ |
| | +------------+ | | dev | | dev | |
| | |I2C IP Core1|--\ | +-----+ +-----+ |
| | +------------+ \-------+ | | | |
| | |Pinctrl|--|------+--------+ |
| | +------------+ +-------+ | |
| | |I2C IP Core2|--/ | |
| | +------------+ | |
| | | |
| +-------------------------------+ |
| |
| Required properties: |
| - compatible: "i2c-demux-pinctrl" |
| - i2c-parent: List of phandles of I2C masters available for selection. The first |
| one will be used as default. |
| - i2c-bus-name: The name of this bus. Also needed as pinctrl-name for the I2C |
| parents. |
| |
| Furthermore, I2C mux properties and child nodes. See i2c-mux.txt in this |
| directory. |
| |
| Example: |
| |
| Here is a snipplet for a bus to be demuxed. It contains various i2c clients for |
| HDMI, so the bus is named "i2c-hdmi": |
| |
| i2chdmi: i2c@8 { |
| |
| compatible = "i2c-demux-pinctrl"; |
| i2c-parent = <&gpioi2c>, <&iic2>, <&i2c2>; |
| i2c-bus-name = "i2c-hdmi"; |
| #address-cells = <1>; |
| #size-cells = <0>; |
| |
| ak4643: sound-codec@12 { |
| compatible = "asahi-kasei,ak4643"; |
| |
| #sound-dai-cells = <0>; |
| reg = <0x12>; |
| }; |
| |
| composite-in@20 { |
| compatible = "adi,adv7180"; |
| reg = <0x20>; |
| remote = <&vin1>; |
| |
| port { |
| adv7180: endpoint { |
| bus-width = <8>; |
| remote-endpoint = <&vin1ep0>; |
| }; |
| }; |
| }; |
| |
| hdmi@39 { |
| compatible = "adi,adv7511w"; |
| reg = <0x39>; |
| interrupt-parent = <&gpio1>; |
| interrupts = <15 IRQ_TYPE_LEVEL_LOW>; |
| |
| adi,input-depth = <8>; |
| adi,input-colorspace = "rgb"; |
| adi,input-clock = "1x"; |
| adi,input-style = <1>; |
| adi,input-justification = "evenly"; |
| |
| ports { |
| #address-cells = <1>; |
| #size-cells = <0>; |
| |
| port@0 { |
| reg = <0>; |
| adv7511_in: endpoint { |
| remote-endpoint = <&du_out_lvds0>; |
| }; |
| }; |
| |
| port@1 { |
| reg = <1>; |
| adv7511_out: endpoint { |
| remote-endpoint = <&hdmi_con>; |
| }; |
| }; |
| }; |
| }; |
| }; |
| |
| And for clarification, here are the snipplets for the i2c-parents: |
| |
| gpioi2c: i2c@9 { |
| #address-cells = <1>; |
| #size-cells = <0>; |
| compatible = "i2c-gpio"; |
| status = "disabled"; |
| gpios = <&gpio5 6 GPIO_ACTIVE_HIGH /* sda */ |
| &gpio5 5 GPIO_ACTIVE_HIGH /* scl */ |
| >; |
| i2c-gpio,delay-us = <5>; |
| }; |
| |
| ... |
| |
| &i2c2 { |
| pinctrl-0 = <&i2c2_pins>; |
| pinctrl-names = "i2c-hdmi"; |
| |
| clock-frequency = <100000>; |
| }; |
| |
| ... |
| |
| &iic2 { |
| pinctrl-0 = <&iic2_pins>; |
| pinctrl-names = "i2c-hdmi"; |
| |
| clock-frequency = <100000>; |
| }; |
| |
| Please note: |
| |
| - pinctrl properties for the parent I2C controllers need a pinctrl state |
| with the same name as i2c-bus-name, not "default"! |
| |
| - the i2c masters must have their status "disabled". This driver will |
| enable them at runtime when needed. |