1 Pinctrl-based I2C Bus DeMux
2
3 This binding describes an I2C bus demultiplexer that uses pin multiplexing to
4 route the I2C signals, and represents the pin multiplexing configuration using
5 the pinctrl device tree bindings. This may be used to select one I2C IP core at
6 runtime which may have a better feature set for a given task than another I2C
7 IP core on the SoC. The most simple example is to fall back to GPIO bitbanging
8 if 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
23 Required 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
30 Furthermore, I2C mux properties and child nodes. See i2c-mux.yaml in this
31 directory.
32
33 Example:
34
35 Here is a snipplet for a bus to be demuxed. It contains various i2c clients for
36 HDMI, 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
99 And 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
129 Please 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.
Cache object: 14e7cd3da2dcecd1ef4b4a191bf9e00c
|