136 lines
3.3 KiB
Plaintext
136 lines
3.3 KiB
Plaintext
|
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.
|