diff options
author | Rafael J. Wysocki <rafael.j.wysocki@intel.com> | 2015-06-22 08:23:44 -0400 |
---|---|---|
committer | Rafael J. Wysocki <rafael.j.wysocki@intel.com> | 2015-06-22 08:23:44 -0400 |
commit | 1af858fdd2aa4107ff4e1c9fc1b23929d16a7491 (patch) | |
tree | f2de1adaf5887228a198eb6dce04443b603795b0 | |
parent | a8269d36a880c016f202260420d9abe6ef061ace (diff) | |
parent | 9f20d6815c6c537980b8a8fcb1a172c0b95bd99f (diff) |
Merge branch 'pm-opp'
* pm-opp:
PM / OPP: Add binding for 'opp-suspend'
PM / OPP: Allow multiple OPP tables to be passed via DT
PM / OPP: Add new bindings to address shortcomings of existing bindings
-rw-r--r-- | Documentation/devicetree/bindings/power/opp.txt | 448 |
1 files changed, 444 insertions, 4 deletions
diff --git a/Documentation/devicetree/bindings/power/opp.txt b/Documentation/devicetree/bindings/power/opp.txt index 74499e5033fc..0d5e7c978121 100644 --- a/Documentation/devicetree/bindings/power/opp.txt +++ b/Documentation/devicetree/bindings/power/opp.txt | |||
@@ -1,8 +1,19 @@ | |||
1 | * Generic OPP Interface | 1 | Generic OPP (Operating Performance Points) Bindings |
2 | ---------------------------------------------------- | ||
2 | 3 | ||
3 | SoCs have a standard set of tuples consisting of frequency and | 4 | Devices work at voltage-current-frequency combinations and some implementations |
4 | voltage pairs that the device will support per voltage domain. These | 5 | have the liberty of choosing these. These combinations are called Operating |
5 | are called Operating Performance Points or OPPs. | 6 | Performance Points aka OPPs. This document defines bindings for these OPPs |
7 | applicable across wide range of devices. For illustration purpose, this document | ||
8 | uses CPU as a device. | ||
9 | |||
10 | This document contain multiple versions of OPP binding and only one of them | ||
11 | should be used per device. | ||
12 | |||
13 | Binding 1: operating-points | ||
14 | ============================ | ||
15 | |||
16 | This binding only supports voltage-frequency pairs. | ||
6 | 17 | ||
7 | Properties: | 18 | Properties: |
8 | - operating-points: An array of 2-tuples items, and each item consists | 19 | - operating-points: An array of 2-tuples items, and each item consists |
@@ -23,3 +34,432 @@ cpu@0 { | |||
23 | 198000 850000 | 34 | 198000 850000 |
24 | >; | 35 | >; |
25 | }; | 36 | }; |
37 | |||
38 | |||
39 | Binding 2: operating-points-v2 | ||
40 | ============================ | ||
41 | |||
42 | * Property: operating-points-v2 | ||
43 | |||
44 | Devices supporting OPPs must set their "operating-points-v2" property with | ||
45 | phandle to a OPP table in their DT node. The OPP core will use this phandle to | ||
46 | find the operating points for the device. | ||
47 | |||
48 | Devices may want to choose OPP tables at runtime and so can provide a list of | ||
49 | phandles here. But only *one* of them should be chosen at runtime. This must be | ||
50 | accompanied by a corresponding "operating-points-names" property, to uniquely | ||
51 | identify the OPP tables. | ||
52 | |||
53 | If required, this can be extended for SoC vendor specfic bindings. Such bindings | ||
54 | should be documented as Documentation/devicetree/bindings/power/<vendor>-opp.txt | ||
55 | and should have a compatible description like: "operating-points-v2-<vendor>". | ||
56 | |||
57 | Optional properties: | ||
58 | - operating-points-names: Names of OPP tables (required if multiple OPP | ||
59 | tables are present), to uniquely identify them. The same list must be present | ||
60 | for all the CPUs which are sharing clock/voltage rails and hence the OPP | ||
61 | tables. | ||
62 | |||
63 | * OPP Table Node | ||
64 | |||
65 | This describes the OPPs belonging to a device. This node can have following | ||
66 | properties: | ||
67 | |||
68 | Required properties: | ||
69 | - compatible: Allow OPPs to express their compatibility. It should be: | ||
70 | "operating-points-v2". | ||
71 | |||
72 | - OPP nodes: One or more OPP nodes describing voltage-current-frequency | ||
73 | combinations. Their name isn't significant but their phandle can be used to | ||
74 | reference an OPP. | ||
75 | |||
76 | Optional properties: | ||
77 | - opp-shared: Indicates that device nodes using this OPP Table Node's phandle | ||
78 | switch their DVFS state together, i.e. they share clock/voltage/current lines. | ||
79 | Missing property means devices have independent clock/voltage/current lines, | ||
80 | but they share OPP tables. | ||
81 | |||
82 | - status: Marks the OPP table enabled/disabled. | ||
83 | |||
84 | |||
85 | * OPP Node | ||
86 | |||
87 | This defines voltage-current-frequency combinations along with other related | ||
88 | properties. | ||
89 | |||
90 | Required properties: | ||
91 | - opp-hz: Frequency in Hz | ||
92 | |||
93 | Optional properties: | ||
94 | - opp-microvolt: voltage in micro Volts. | ||
95 | |||
96 | A single regulator's voltage is specified with an array of size one or three. | ||
97 | Single entry is for target voltage and three entries are for <target min max> | ||
98 | voltages. | ||
99 | |||
100 | Entries for multiple regulators must be present in the same order as | ||
101 | regulators are specified in device's DT node. | ||
102 | |||
103 | - opp-microamp: The maximum current drawn by the device in microamperes | ||
104 | considering system specific parameters (such as transients, process, aging, | ||
105 | maximum operating temperature range etc.) as necessary. This may be used to | ||
106 | set the most efficient regulator operating mode. | ||
107 | |||
108 | Should only be set if opp-microvolt is set for the OPP. | ||
109 | |||
110 | Entries for multiple regulators must be present in the same order as | ||
111 | regulators are specified in device's DT node. If this property isn't required | ||
112 | for few regulators, then this should be marked as zero for them. If it isn't | ||
113 | required for any regulator, then this property need not be present. | ||
114 | |||
115 | - clock-latency-ns: Specifies the maximum possible transition latency (in | ||
116 | nanoseconds) for switching to this OPP from any other OPP. | ||
117 | |||
118 | - turbo-mode: Marks the OPP to be used only for turbo modes. Turbo mode is | ||
119 | available on some platforms, where the device can run over its operating | ||
120 | frequency for a short duration of time limited by the device's power, current | ||
121 | and thermal limits. | ||
122 | |||
123 | - opp-suspend: Marks the OPP to be used during device suspend. Only one OPP in | ||
124 | the table should have this. | ||
125 | |||
126 | - status: Marks the node enabled/disabled. | ||
127 | |||
128 | Example 1: Single cluster Dual-core ARM cortex A9, switch DVFS states together. | ||
129 | |||
130 | / { | ||
131 | cpus { | ||
132 | #address-cells = <1>; | ||
133 | #size-cells = <0>; | ||
134 | |||
135 | cpu@0 { | ||
136 | compatible = "arm,cortex-a9"; | ||
137 | reg = <0>; | ||
138 | next-level-cache = <&L2>; | ||
139 | clocks = <&clk_controller 0>; | ||
140 | clock-names = "cpu"; | ||
141 | cpu-supply = <&cpu_supply0>; | ||
142 | operating-points-v2 = <&cpu0_opp_table>; | ||
143 | }; | ||
144 | |||
145 | cpu@1 { | ||
146 | compatible = "arm,cortex-a9"; | ||
147 | reg = <1>; | ||
148 | next-level-cache = <&L2>; | ||
149 | clocks = <&clk_controller 0>; | ||
150 | clock-names = "cpu"; | ||
151 | cpu-supply = <&cpu_supply0>; | ||
152 | operating-points-v2 = <&cpu0_opp_table>; | ||
153 | }; | ||
154 | }; | ||
155 | |||
156 | cpu0_opp_table: opp_table0 { | ||
157 | compatible = "operating-points-v2"; | ||
158 | opp-shared; | ||
159 | |||
160 | opp00 { | ||
161 | opp-hz = <1000000000>; | ||
162 | opp-microvolt = <970000 975000 985000>; | ||
163 | opp-microamp = <70000>; | ||
164 | clock-latency-ns = <300000>; | ||
165 | opp-suspend; | ||
166 | }; | ||
167 | opp01 { | ||
168 | opp-hz = <1100000000>; | ||
169 | opp-microvolt = <980000 1000000 1010000>; | ||
170 | opp-microamp = <80000>; | ||
171 | clock-latency-ns = <310000>; | ||
172 | }; | ||
173 | opp02 { | ||
174 | opp-hz = <1200000000>; | ||
175 | opp-microvolt = <1025000>; | ||
176 | clock-latency-ns = <290000>; | ||
177 | turbo-mode; | ||
178 | }; | ||
179 | }; | ||
180 | }; | ||
181 | |||
182 | Example 2: Single cluster, Quad-core Qualcom-krait, switches DVFS states | ||
183 | independently. | ||
184 | |||
185 | / { | ||
186 | cpus { | ||
187 | #address-cells = <1>; | ||
188 | #size-cells = <0>; | ||
189 | |||
190 | cpu@0 { | ||
191 | compatible = "qcom,krait"; | ||
192 | reg = <0>; | ||
193 | next-level-cache = <&L2>; | ||
194 | clocks = <&clk_controller 0>; | ||
195 | clock-names = "cpu"; | ||
196 | cpu-supply = <&cpu_supply0>; | ||
197 | operating-points-v2 = <&cpu_opp_table>; | ||
198 | }; | ||
199 | |||
200 | cpu@1 { | ||
201 | compatible = "qcom,krait"; | ||
202 | reg = <1>; | ||
203 | next-level-cache = <&L2>; | ||
204 | clocks = <&clk_controller 1>; | ||
205 | clock-names = "cpu"; | ||
206 | cpu-supply = <&cpu_supply1>; | ||
207 | operating-points-v2 = <&cpu_opp_table>; | ||
208 | }; | ||
209 | |||
210 | cpu@2 { | ||
211 | compatible = "qcom,krait"; | ||
212 | reg = <2>; | ||
213 | next-level-cache = <&L2>; | ||
214 | clocks = <&clk_controller 2>; | ||
215 | clock-names = "cpu"; | ||
216 | cpu-supply = <&cpu_supply2>; | ||
217 | operating-points-v2 = <&cpu_opp_table>; | ||
218 | }; | ||
219 | |||
220 | cpu@3 { | ||
221 | compatible = "qcom,krait"; | ||
222 | reg = <3>; | ||
223 | next-level-cache = <&L2>; | ||
224 | clocks = <&clk_controller 3>; | ||
225 | clock-names = "cpu"; | ||
226 | cpu-supply = <&cpu_supply3>; | ||
227 | operating-points-v2 = <&cpu_opp_table>; | ||
228 | }; | ||
229 | }; | ||
230 | |||
231 | cpu_opp_table: opp_table { | ||
232 | compatible = "operating-points-v2"; | ||
233 | |||
234 | /* | ||
235 | * Missing opp-shared property means CPUs switch DVFS states | ||
236 | * independently. | ||
237 | */ | ||
238 | |||
239 | opp00 { | ||
240 | opp-hz = <1000000000>; | ||
241 | opp-microvolt = <970000 975000 985000>; | ||
242 | opp-microamp = <70000>; | ||
243 | clock-latency-ns = <300000>; | ||
244 | opp-suspend; | ||
245 | }; | ||
246 | opp01 { | ||
247 | opp-hz = <1100000000>; | ||
248 | opp-microvolt = <980000 1000000 1010000>; | ||
249 | opp-microamp = <80000>; | ||
250 | clock-latency-ns = <310000>; | ||
251 | }; | ||
252 | opp02 { | ||
253 | opp-hz = <1200000000>; | ||
254 | opp-microvolt = <1025000>; | ||
255 | opp-microamp = <90000; | ||
256 | lock-latency-ns = <290000>; | ||
257 | turbo-mode; | ||
258 | }; | ||
259 | }; | ||
260 | }; | ||
261 | |||
262 | Example 3: Dual-cluster, Dual-core per cluster. CPUs within a cluster switch | ||
263 | DVFS state together. | ||
264 | |||
265 | / { | ||
266 | cpus { | ||
267 | #address-cells = <1>; | ||
268 | #size-cells = <0>; | ||
269 | |||
270 | cpu@0 { | ||
271 | compatible = "arm,cortex-a7"; | ||
272 | reg = <0>; | ||
273 | next-level-cache = <&L2>; | ||
274 | clocks = <&clk_controller 0>; | ||
275 | clock-names = "cpu"; | ||
276 | cpu-supply = <&cpu_supply0>; | ||
277 | operating-points-v2 = <&cluster0_opp>; | ||
278 | }; | ||
279 | |||
280 | cpu@1 { | ||
281 | compatible = "arm,cortex-a7"; | ||
282 | reg = <1>; | ||
283 | next-level-cache = <&L2>; | ||
284 | clocks = <&clk_controller 0>; | ||
285 | clock-names = "cpu"; | ||
286 | cpu-supply = <&cpu_supply0>; | ||
287 | operating-points-v2 = <&cluster0_opp>; | ||
288 | }; | ||
289 | |||
290 | cpu@100 { | ||
291 | compatible = "arm,cortex-a15"; | ||
292 | reg = <100>; | ||
293 | next-level-cache = <&L2>; | ||
294 | clocks = <&clk_controller 1>; | ||
295 | clock-names = "cpu"; | ||
296 | cpu-supply = <&cpu_supply1>; | ||
297 | operating-points-v2 = <&cluster1_opp>; | ||
298 | }; | ||
299 | |||
300 | cpu@101 { | ||
301 | compatible = "arm,cortex-a15"; | ||
302 | reg = <101>; | ||
303 | next-level-cache = <&L2>; | ||
304 | clocks = <&clk_controller 1>; | ||
305 | clock-names = "cpu"; | ||
306 | cpu-supply = <&cpu_supply1>; | ||
307 | operating-points-v2 = <&cluster1_opp>; | ||
308 | }; | ||
309 | }; | ||
310 | |||
311 | cluster0_opp: opp_table0 { | ||
312 | compatible = "operating-points-v2"; | ||
313 | opp-shared; | ||
314 | |||
315 | opp00 { | ||
316 | opp-hz = <1000000000>; | ||
317 | opp-microvolt = <970000 975000 985000>; | ||
318 | opp-microamp = <70000>; | ||
319 | clock-latency-ns = <300000>; | ||
320 | opp-suspend; | ||
321 | }; | ||
322 | opp01 { | ||
323 | opp-hz = <1100000000>; | ||
324 | opp-microvolt = <980000 1000000 1010000>; | ||
325 | opp-microamp = <80000>; | ||
326 | clock-latency-ns = <310000>; | ||
327 | }; | ||
328 | opp02 { | ||
329 | opp-hz = <1200000000>; | ||
330 | opp-microvolt = <1025000>; | ||
331 | opp-microamp = <90000>; | ||
332 | clock-latency-ns = <290000>; | ||
333 | turbo-mode; | ||
334 | }; | ||
335 | }; | ||
336 | |||
337 | cluster1_opp: opp_table1 { | ||
338 | compatible = "operating-points-v2"; | ||
339 | opp-shared; | ||
340 | |||
341 | opp10 { | ||
342 | opp-hz = <1300000000>; | ||
343 | opp-microvolt = <1045000 1050000 1055000>; | ||
344 | opp-microamp = <95000>; | ||
345 | clock-latency-ns = <400000>; | ||
346 | opp-suspend; | ||
347 | }; | ||
348 | opp11 { | ||
349 | opp-hz = <1400000000>; | ||
350 | opp-microvolt = <1075000>; | ||
351 | opp-microamp = <100000>; | ||
352 | clock-latency-ns = <400000>; | ||
353 | }; | ||
354 | opp12 { | ||
355 | opp-hz = <1500000000>; | ||
356 | opp-microvolt = <1010000 1100000 1110000>; | ||
357 | opp-microamp = <95000>; | ||
358 | clock-latency-ns = <400000>; | ||
359 | turbo-mode; | ||
360 | }; | ||
361 | }; | ||
362 | }; | ||
363 | |||
364 | Example 4: Handling multiple regulators | ||
365 | |||
366 | / { | ||
367 | cpus { | ||
368 | cpu@0 { | ||
369 | compatible = "arm,cortex-a7"; | ||
370 | ... | ||
371 | |||
372 | cpu-supply = <&cpu_supply0>, <&cpu_supply1>, <&cpu_supply2>; | ||
373 | operating-points-v2 = <&cpu0_opp_table>; | ||
374 | }; | ||
375 | }; | ||
376 | |||
377 | cpu0_opp_table: opp_table0 { | ||
378 | compatible = "operating-points-v2"; | ||
379 | opp-shared; | ||
380 | |||
381 | opp00 { | ||
382 | opp-hz = <1000000000>; | ||
383 | opp-microvolt = <970000>, /* Supply 0 */ | ||
384 | <960000>, /* Supply 1 */ | ||
385 | <960000>; /* Supply 2 */ | ||
386 | opp-microamp = <70000>, /* Supply 0 */ | ||
387 | <70000>, /* Supply 1 */ | ||
388 | <70000>; /* Supply 2 */ | ||
389 | clock-latency-ns = <300000>; | ||
390 | }; | ||
391 | |||
392 | /* OR */ | ||
393 | |||
394 | opp00 { | ||
395 | opp-hz = <1000000000>; | ||
396 | opp-microvolt = <970000 975000 985000>, /* Supply 0 */ | ||
397 | <960000 965000 975000>, /* Supply 1 */ | ||
398 | <960000 965000 975000>; /* Supply 2 */ | ||
399 | opp-microamp = <70000>, /* Supply 0 */ | ||
400 | <70000>, /* Supply 1 */ | ||
401 | <70000>; /* Supply 2 */ | ||
402 | clock-latency-ns = <300000>; | ||
403 | }; | ||
404 | |||
405 | /* OR */ | ||
406 | |||
407 | opp00 { | ||
408 | opp-hz = <1000000000>; | ||
409 | opp-microvolt = <970000 975000 985000>, /* Supply 0 */ | ||
410 | <960000 965000 975000>, /* Supply 1 */ | ||
411 | <960000 965000 975000>; /* Supply 2 */ | ||
412 | opp-microamp = <70000>, /* Supply 0 */ | ||
413 | <0>, /* Supply 1 doesn't need this */ | ||
414 | <70000>; /* Supply 2 */ | ||
415 | clock-latency-ns = <300000>; | ||
416 | }; | ||
417 | }; | ||
418 | }; | ||
419 | |||
420 | Example 5: Multiple OPP tables | ||
421 | |||
422 | / { | ||
423 | cpus { | ||
424 | cpu@0 { | ||
425 | compatible = "arm,cortex-a7"; | ||
426 | ... | ||
427 | |||
428 | cpu-supply = <&cpu_supply> | ||
429 | operating-points-v2 = <&cpu0_opp_table_slow>, <&cpu0_opp_table_fast>; | ||
430 | operating-points-names = "slow", "fast"; | ||
431 | }; | ||
432 | }; | ||
433 | |||
434 | cpu0_opp_table_slow: opp_table_slow { | ||
435 | compatible = "operating-points-v2"; | ||
436 | status = "okay"; | ||
437 | opp-shared; | ||
438 | |||
439 | opp00 { | ||
440 | opp-hz = <600000000>; | ||
441 | ... | ||
442 | }; | ||
443 | |||
444 | opp01 { | ||
445 | opp-hz = <800000000>; | ||
446 | ... | ||
447 | }; | ||
448 | }; | ||
449 | |||
450 | cpu0_opp_table_fast: opp_table_fast { | ||
451 | compatible = "operating-points-v2"; | ||
452 | status = "okay"; | ||
453 | opp-shared; | ||
454 | |||
455 | opp10 { | ||
456 | opp-hz = <1000000000>; | ||
457 | ... | ||
458 | }; | ||
459 | |||
460 | opp11 { | ||
461 | opp-hz = <1100000000>; | ||
462 | ... | ||
463 | }; | ||
464 | }; | ||
465 | }; | ||