1# SPDX-License-Identifier: GPL-2.0 OR BSD-2-Clause
2%YAML 1.2
3---
4$id: http://devicetree.org/schemas/i2c/qcom,i2c-cci.yaml#
5$schema: http://devicetree.org/meta-schemas/core.yaml#
6
7title: Qualcomm Camera Control Interface (CCI) I2C controller
8
9maintainers:
10  - Loic Poulain <loic.poulain@linaro.org>
11  - Robert Foss <robert.foss@linaro.org>
12
13properties:
14  compatible:
15    oneOf:
16      - enum:
17          - qcom,msm8226-cci
18          - qcom,msm8974-cci
19          - qcom,msm8996-cci
20
21      - items:
22          - enum:
23              - qcom,msm8916-cci
24          - const: qcom,msm8226-cci # CCI v1
25
26      - items:
27          - enum:
28              - qcom,sdm845-cci
29              - qcom,sm6350-cci
30              - qcom,sm8250-cci
31              - qcom,sm8450-cci
32          - const: qcom,msm8996-cci # CCI v2
33
34  "#address-cells":
35    const: 1
36
37  "#size-cells":
38    const: 0
39
40  clocks:
41    minItems: 3
42    maxItems: 6
43
44  clock-names:
45    minItems: 3
46    maxItems: 6
47
48  interrupts:
49    maxItems: 1
50
51  power-domains:
52    maxItems: 1
53
54  reg:
55    maxItems: 1
56
57patternProperties:
58  "^i2c-bus@[01]$":
59    $ref: /schemas/i2c/i2c-controller.yaml#
60    unevaluatedProperties: false
61
62    properties:
63      reg:
64        maxItems: 1
65
66      clock-frequency:
67        default: 100000
68
69required:
70  - compatible
71  - clock-names
72  - clocks
73  - interrupts
74  - reg
75
76allOf:
77  - if:
78      properties:
79        compatible:
80          contains:
81            enum:
82              - qcom,msm8996-cci
83    then:
84      required:
85        - power-domains
86
87  - if:
88      properties:
89        compatible:
90          contains:
91            enum:
92              - qcom,msm8226-cci
93              - qcom,msm8916-cci
94    then:
95      properties:
96        i2c-bus@1: false
97
98  - if:
99      properties:
100        compatible:
101          oneOf:
102            - contains:
103                enum:
104                  - qcom,msm8974-cci
105
106            - const: qcom,msm8226-cci
107    then:
108      properties:
109        clocks:
110          maxItems: 3
111        clock-names:
112          items:
113            - const: camss_top_ahb
114            - const: cci_ahb
115            - const: cci
116
117  - if:
118      properties:
119        compatible:
120          oneOf:
121            - contains:
122                enum:
123                  - qcom,msm8916-cci
124
125            - const: qcom,msm8996-cci
126    then:
127      properties:
128        clocks:
129          maxItems: 4
130        clock-names:
131          items:
132            - const: camss_top_ahb
133            - const: cci_ahb
134            - const: cci
135            - const: camss_ahb
136
137  - if:
138      properties:
139        compatible:
140          contains:
141            enum:
142              - qcom,sdm845-cci
143              - qcom,sm6350-cci
144    then:
145      properties:
146        clocks:
147          minItems: 6
148        clock-names:
149          items:
150            - const: camnoc_axi
151            - const: soc_ahb
152            - const: slow_ahb_src
153            - const: cpas_ahb
154            - const: cci
155            - const: cci_src
156
157  - if:
158      properties:
159        compatible:
160          contains:
161            enum:
162              - qcom,sm8250-cci
163              - qcom,sm8450-cci
164    then:
165      properties:
166        clocks:
167          minItems: 5
168          maxItems: 5
169        clock-names:
170          items:
171            - const: camnoc_axi
172            - const: slow_ahb_src
173            - const: cpas_ahb
174            - const: cci
175            - const: cci_src
176
177additionalProperties: false
178
179examples:
180  - |
181    #include <dt-bindings/clock/qcom,camcc-sdm845.h>
182    #include <dt-bindings/gpio/gpio.h>
183    #include <dt-bindings/interrupt-controller/arm-gic.h>
184
185    cci@ac4a000 {
186        reg = <0x0ac4a000 0x4000>;
187        compatible = "qcom,sdm845-cci", "qcom,msm8996-cci";
188        #address-cells = <1>;
189        #size-cells = <0>;
190
191        interrupts = <GIC_SPI 460 IRQ_TYPE_EDGE_RISING>;
192        power-domains = <&clock_camcc TITAN_TOP_GDSC>;
193
194        clocks = <&clock_camcc CAM_CC_CAMNOC_AXI_CLK>,
195                 <&clock_camcc CAM_CC_SOC_AHB_CLK>,
196                 <&clock_camcc CAM_CC_SLOW_AHB_CLK_SRC>,
197                 <&clock_camcc CAM_CC_CPAS_AHB_CLK>,
198                 <&clock_camcc CAM_CC_CCI_CLK>,
199                 <&clock_camcc CAM_CC_CCI_CLK_SRC>;
200        clock-names = "camnoc_axi",
201                      "soc_ahb",
202                      "slow_ahb_src",
203                      "cpas_ahb",
204                      "cci",
205                      "cci_src";
206
207        assigned-clocks = <&clock_camcc CAM_CC_CAMNOC_AXI_CLK>,
208                          <&clock_camcc CAM_CC_CCI_CLK>;
209        assigned-clock-rates = <80000000>,
210                               <37500000>;
211
212        pinctrl-names = "default", "sleep";
213        pinctrl-0 = <&cci0_default &cci1_default>;
214        pinctrl-1 = <&cci0_sleep &cci1_sleep>;
215
216        i2c-bus@0 {
217            reg = <0>;
218            clock-frequency = <1000000>;
219            #address-cells = <1>;
220            #size-cells = <0>;
221
222            camera@10 {
223                compatible = "ovti,ov8856";
224                reg = <0x10>;
225
226                reset-gpios = <&tlmm 9 GPIO_ACTIVE_LOW>;
227                pinctrl-names = "default";
228                pinctrl-0 = <&cam0_default>;
229
230                clocks = <&clock_camcc CAM_CC_MCLK0_CLK>;
231                clock-names = "xvclk";
232                clock-frequency = <19200000>;
233
234                dovdd-supply = <&vreg_lvs1a_1p8>;
235                avdd-supply = <&cam0_avdd_2v8>;
236                dvdd-supply = <&cam0_dvdd_1v2>;
237
238                port {
239                    ov8856_ep: endpoint {
240                        link-frequencies = /bits/ 64 <360000000 180000000>;
241                        data-lanes = <1 2 3 4>;
242                        remote-endpoint = <&csiphy0_ep>;
243                    };
244                };
245            };
246        };
247
248        cci_i2c1: i2c-bus@1 {
249            reg = <1>;
250            clock-frequency = <1000000>;
251            #address-cells = <1>;
252            #size-cells = <0>;
253
254            camera@60 {
255                compatible = "ovti,ov7251";
256                reg = <0x60>;
257
258                enable-gpios = <&tlmm 21 GPIO_ACTIVE_HIGH>;
259                pinctrl-names = "default";
260                pinctrl-0 = <&cam3_default>;
261
262                clocks = <&clock_camcc CAM_CC_MCLK3_CLK>;
263                clock-names = "xclk";
264                clock-frequency = <24000000>;
265
266                vdddo-supply = <&vreg_lvs1a_1p8>;
267                vdda-supply = <&cam3_avdd_2v8>;
268
269                port {
270                    ov7251_ep: endpoint {
271                        data-lanes = <0 1>;
272                        link-frequencies = /bits/ 64 <240000000 319200000>;
273                        remote-endpoint = <&csiphy3_ep>;
274                    };
275                };
276            };
277        };
278    };
279