1# SPDX-License-Identifier: GPL-2.0-only OR BSD-2-Clause
2%YAML 1.2
3---
4$id: http://devicetree.org/schemas/cpufreq/cpufreq-qcom-hw.yaml#
5$schema: http://devicetree.org/meta-schemas/core.yaml#
6
7title: Qualcomm Technologies, Inc. CPUFREQ
8
9maintainers:
10  - Manivannan Sadhasivam <manivannan.sadhasivam@linaro.org>
11
12description: |
13
14  CPUFREQ HW is a hardware engine used by some Qualcomm Technologies, Inc. (QTI)
15  SoCs to manage frequency in hardware. It is capable of controlling frequency
16  for multiple clusters.
17
18properties:
19  compatible:
20    oneOf:
21      - description: v1 of CPUFREQ HW
22        items:
23          - enum:
24              - qcom,qcm2290-cpufreq-hw
25              - qcom,sc7180-cpufreq-hw
26              - qcom,sdm845-cpufreq-hw
27              - qcom,sm6115-cpufreq-hw
28              - qcom,sm6350-cpufreq-hw
29              - qcom,sm8150-cpufreq-hw
30          - const: qcom,cpufreq-hw
31
32      - description: v2 of CPUFREQ HW (EPSS)
33        items:
34          - enum:
35              - qcom,qdu1000-cpufreq-epss
36              - qcom,sa8775p-cpufreq-epss
37              - qcom,sc7280-cpufreq-epss
38              - qcom,sc8280xp-cpufreq-epss
39              - qcom,sm6375-cpufreq-epss
40              - qcom,sm8250-cpufreq-epss
41              - qcom,sm8350-cpufreq-epss
42              - qcom,sm8450-cpufreq-epss
43              - qcom,sm8550-cpufreq-epss
44          - const: qcom,cpufreq-epss
45
46  reg:
47    minItems: 1
48    items:
49      - description: Frequency domain 0 register region
50      - description: Frequency domain 1 register region
51      - description: Frequency domain 2 register region
52      - description: Frequency domain 3 register region
53
54  reg-names:
55    minItems: 1
56    items:
57      - const: freq-domain0
58      - const: freq-domain1
59      - const: freq-domain2
60      - const: freq-domain3
61
62  clocks:
63    items:
64      - description: XO Clock
65      - description: GPLL0 Clock
66
67  clock-names:
68    items:
69      - const: xo
70      - const: alternate
71
72  interrupts:
73    minItems: 1
74    maxItems: 4
75
76  interrupt-names:
77    minItems: 1
78    items:
79      - const: dcvsh-irq-0
80      - const: dcvsh-irq-1
81      - const: dcvsh-irq-2
82      - const: dcvsh-irq-3
83
84  '#freq-domain-cells':
85    const: 1
86
87  '#clock-cells':
88    const: 1
89
90required:
91  - compatible
92  - reg
93  - clocks
94  - clock-names
95  - '#freq-domain-cells'
96
97additionalProperties: false
98
99allOf:
100  - if:
101      properties:
102        compatible:
103          contains:
104            enum:
105              - qcom,qcm2290-cpufreq-hw
106    then:
107      properties:
108        reg:
109          minItems: 1
110          maxItems: 1
111
112        reg-names:
113          minItems: 1
114          maxItems: 1
115
116        interrupts:
117          minItems: 1
118          maxItems: 1
119
120        interrupt-names:
121          minItems: 1
122
123  - if:
124      properties:
125        compatible:
126          contains:
127            enum:
128              - qcom,qdu1000-cpufreq-epss
129              - qcom,sc7180-cpufreq-hw
130              - qcom,sc8280xp-cpufreq-epss
131              - qcom,sdm845-cpufreq-hw
132              - qcom,sm6115-cpufreq-hw
133              - qcom,sm6350-cpufreq-hw
134              - qcom,sm6375-cpufreq-epss
135    then:
136      properties:
137        reg:
138          minItems: 2
139          maxItems: 2
140
141        reg-names:
142          minItems: 2
143          maxItems: 2
144
145        interrupts:
146          minItems: 2
147          maxItems: 2
148
149        interrupt-names:
150          minItems: 2
151
152  - if:
153      properties:
154        compatible:
155          contains:
156            enum:
157              - qcom,sc7280-cpufreq-epss
158              - qcom,sm8250-cpufreq-epss
159              - qcom,sm8350-cpufreq-epss
160              - qcom,sm8450-cpufreq-epss
161              - qcom,sm8550-cpufreq-epss
162    then:
163      properties:
164        reg:
165          minItems: 3
166          maxItems: 3
167
168        reg-names:
169          minItems: 3
170          maxItems: 3
171
172        interrupts:
173          minItems: 3
174          maxItems: 3
175
176        interrupt-names:
177          minItems: 3
178
179  - if:
180      properties:
181        compatible:
182          contains:
183            enum:
184              - qcom,sm8150-cpufreq-hw
185    then:
186      properties:
187        reg:
188          minItems: 3
189          maxItems: 3
190
191        reg-names:
192          minItems: 3
193          maxItems: 3
194
195        # On some SoCs the Prime core shares the LMH irq with Big cores
196        interrupts:
197          minItems: 2
198          maxItems: 2
199
200        interrupt-names:
201          minItems: 2
202
203
204examples:
205  - |
206    #include <dt-bindings/clock/qcom,gcc-sdm845.h>
207    #include <dt-bindings/clock/qcom,rpmh.h>
208
209    // Example 1: Dual-cluster, Quad-core per cluster. CPUs within a cluster
210    // switch DCVS state together.
211    cpus {
212      #address-cells = <2>;
213      #size-cells = <0>;
214
215      CPU0: cpu@0 {
216        device_type = "cpu";
217        compatible = "qcom,kryo385";
218        reg = <0x0 0x0>;
219        enable-method = "psci";
220        next-level-cache = <&L2_0>;
221        qcom,freq-domain = <&cpufreq_hw 0>;
222        clocks = <&cpufreq_hw 0>;
223        L2_0: l2-cache {
224          compatible = "cache";
225          cache-unified;
226          cache-level = <2>;
227          next-level-cache = <&L3_0>;
228          L3_0: l3-cache {
229            compatible = "cache";
230            cache-unified;
231            cache-level = <3>;
232          };
233        };
234      };
235
236      CPU1: cpu@100 {
237        device_type = "cpu";
238        compatible = "qcom,kryo385";
239        reg = <0x0 0x100>;
240        enable-method = "psci";
241        next-level-cache = <&L2_100>;
242        qcom,freq-domain = <&cpufreq_hw 0>;
243        clocks = <&cpufreq_hw 0>;
244        L2_100: l2-cache {
245          compatible = "cache";
246          cache-unified;
247          cache-level = <2>;
248          next-level-cache = <&L3_0>;
249        };
250      };
251
252      CPU2: cpu@200 {
253        device_type = "cpu";
254        compatible = "qcom,kryo385";
255        reg = <0x0 0x200>;
256        enable-method = "psci";
257        next-level-cache = <&L2_200>;
258        qcom,freq-domain = <&cpufreq_hw 0>;
259        clocks = <&cpufreq_hw 0>;
260        L2_200: l2-cache {
261          compatible = "cache";
262          cache-unified;
263          cache-level = <2>;
264          next-level-cache = <&L3_0>;
265        };
266      };
267
268      CPU3: cpu@300 {
269        device_type = "cpu";
270        compatible = "qcom,kryo385";
271        reg = <0x0 0x300>;
272        enable-method = "psci";
273        next-level-cache = <&L2_300>;
274        qcom,freq-domain = <&cpufreq_hw 0>;
275        clocks = <&cpufreq_hw 0>;
276        L2_300: l2-cache {
277          compatible = "cache";
278          cache-unified;
279          cache-level = <2>;
280          next-level-cache = <&L3_0>;
281        };
282      };
283
284      CPU4: cpu@400 {
285        device_type = "cpu";
286        compatible = "qcom,kryo385";
287        reg = <0x0 0x400>;
288        enable-method = "psci";
289        next-level-cache = <&L2_400>;
290        qcom,freq-domain = <&cpufreq_hw 1>;
291        clocks = <&cpufreq_hw 1>;
292        L2_400: l2-cache {
293          compatible = "cache";
294          cache-unified;
295          cache-level = <2>;
296          next-level-cache = <&L3_0>;
297        };
298      };
299
300      CPU5: cpu@500 {
301        device_type = "cpu";
302        compatible = "qcom,kryo385";
303        reg = <0x0 0x500>;
304        enable-method = "psci";
305        next-level-cache = <&L2_500>;
306        qcom,freq-domain = <&cpufreq_hw 1>;
307        clocks = <&cpufreq_hw 1>;
308        L2_500: l2-cache {
309          compatible = "cache";
310          cache-unified;
311          cache-level = <2>;
312          next-level-cache = <&L3_0>;
313        };
314      };
315
316      CPU6: cpu@600 {
317        device_type = "cpu";
318        compatible = "qcom,kryo385";
319        reg = <0x0 0x600>;
320        enable-method = "psci";
321        next-level-cache = <&L2_600>;
322        qcom,freq-domain = <&cpufreq_hw 1>;
323        clocks = <&cpufreq_hw 1>;
324        L2_600: l2-cache {
325          compatible = "cache";
326          cache-unified;
327          cache-level = <2>;
328          next-level-cache = <&L3_0>;
329        };
330      };
331
332      CPU7: cpu@700 {
333        device_type = "cpu";
334        compatible = "qcom,kryo385";
335        reg = <0x0 0x700>;
336        enable-method = "psci";
337        next-level-cache = <&L2_700>;
338        qcom,freq-domain = <&cpufreq_hw 1>;
339        clocks = <&cpufreq_hw 1>;
340        L2_700: l2-cache {
341          compatible = "cache";
342          cache-unified;
343          cache-level = <2>;
344          next-level-cache = <&L3_0>;
345        };
346      };
347    };
348
349    soc {
350      #address-cells = <1>;
351      #size-cells = <1>;
352
353      cpufreq@17d43000 {
354        compatible = "qcom,sdm845-cpufreq-hw", "qcom,cpufreq-hw";
355        reg = <0x17d43000 0x1400>, <0x17d45800 0x1400>;
356        reg-names = "freq-domain0", "freq-domain1";
357
358        clocks = <&rpmhcc RPMH_CXO_CLK>, <&gcc GPLL0>;
359        clock-names = "xo", "alternate";
360
361        #freq-domain-cells = <1>;
362        #clock-cells = <1>;
363      };
364    };
365...
366