Merge tag 'tegra-for-4.8-i2c' of git://git.kernel.org/pub/scm/linux/kernel/git/tegra...
[cascardo/linux.git] / Documentation / devicetree / bindings / i2c / i2c-demux-pinctrl.txt
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.txt 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                 status = "disabled";
106                 gpios = <&gpio5 6 GPIO_ACTIVE_HIGH /* sda */
107                          &gpio5 5 GPIO_ACTIVE_HIGH /* scl */
108                         >;
109                 i2c-gpio,delay-us = <5>;
110         };
111
112 ...
113
114 &i2c2   {
115         pinctrl-0 = <&i2c2_pins>;
116         pinctrl-names = "i2c-hdmi";
117
118         clock-frequency = <100000>;
119 };
120
121 ...
122
123 &iic2   {
124         pinctrl-0 = <&iic2_pins>;
125         pinctrl-names = "i2c-hdmi";
126
127         clock-frequency = <100000>;
128 };
129
130 Please note:
131
132 - pinctrl properties for the parent I2C controllers need a pinctrl state
133   with the same name as i2c-bus-name, not "default"!
134
135 - the i2c masters must have their status "disabled". This driver will
136   enable them at runtime when needed.