forked from Qortal/Brooklyn
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
135 lines
3.3 KiB
135 lines
3.3 KiB
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.yaml 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"; |
|
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.
|
|
|