# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) %YAML 1.2 --- $id: http://devicetree.org/schemas/opp/opp-v2.yaml# $schema: http://devicetree.org/meta-schemas/core.yaml# title: Generic OPP (Operating Performance Points) Bindings maintainers: - Viresh Kumar allOf: - $ref: opp-v2-base.yaml# properties: compatible: const: operating-points-v2 unevaluatedProperties: false examples: - | /* * Example 1: Single cluster Dual-core ARM cortex A9, switch DVFS states * together. */ cpus { #address-cells = <1>; #size-cells = <0>; cpu@0 { compatible = "arm,cortex-a9"; device_type = "cpu"; reg = <0>; next-level-cache = <&L2>; clocks = <&clk_controller 0>; clock-names = "cpu"; cpu-supply = <&cpu_supply0>; operating-points-v2 = <&cpu0_opp_table0>; }; cpu@1 { compatible = "arm,cortex-a9"; device_type = "cpu"; reg = <1>; next-level-cache = <&L2>; clocks = <&clk_controller 0>; clock-names = "cpu"; cpu-supply = <&cpu_supply0>; operating-points-v2 = <&cpu0_opp_table0>; }; }; cpu0_opp_table0: opp-table { compatible = "operating-points-v2"; opp-shared; opp-1000000000 { opp-hz = /bits/ 64 <1000000000>; opp-microvolt = <975000 970000 985000>; opp-microamp = <70000>; clock-latency-ns = <300000>; opp-suspend; }; opp-1100000000 { opp-hz = /bits/ 64 <1100000000>; opp-microvolt = <1000000 980000 1010000>; opp-microamp = <80000>; clock-latency-ns = <310000>; }; opp-1200000000 { opp-hz = /bits/ 64 <1200000000>; opp-microvolt = <1025000>; clock-latency-ns = <290000>; turbo-mode; }; }; - | /* * Example 2: Single cluster, Quad-core Qualcom-krait, switches DVFS states * independently. */ cpus { #address-cells = <1>; #size-cells = <0>; cpu@0 { compatible = "qcom,krait"; device_type = "cpu"; reg = <0>; next-level-cache = <&L2>; clocks = <&clk_controller 0>; clock-names = "cpu"; cpu-supply = <&cpu_supply0>; operating-points-v2 = <&cpu_opp_table>; }; cpu@1 { compatible = "qcom,krait"; device_type = "cpu"; reg = <1>; next-level-cache = <&L2>; clocks = <&clk_controller 1>; clock-names = "cpu"; cpu-supply = <&cpu_supply1>; operating-points-v2 = <&cpu_opp_table>; }; cpu@2 { compatible = "qcom,krait"; device_type = "cpu"; reg = <2>; next-level-cache = <&L2>; clocks = <&clk_controller 2>; clock-names = "cpu"; cpu-supply = <&cpu_supply2>; operating-points-v2 = <&cpu_opp_table>; }; cpu@3 { compatible = "qcom,krait"; device_type = "cpu"; reg = <3>; next-level-cache = <&L2>; clocks = <&clk_controller 3>; clock-names = "cpu"; cpu-supply = <&cpu_supply3>; operating-points-v2 = <&cpu_opp_table>; }; }; cpu_opp_table: opp-table { compatible = "operating-points-v2"; /* * Missing opp-shared property means CPUs switch DVFS states * independently. */ opp-1000000000 { opp-hz = /bits/ 64 <1000000000>; opp-microvolt = <975000 970000 985000>; opp-microamp = <70000>; clock-latency-ns = <300000>; opp-suspend; }; opp-1100000000 { opp-hz = /bits/ 64 <1100000000>; opp-microvolt = <1000000 980000 1010000>; opp-microamp = <80000>; clock-latency-ns = <310000>; }; opp-1200000000 { opp-hz = /bits/ 64 <1200000000>; opp-microvolt = <1025000>; opp-microamp = <90000>; lock-latency-ns = <290000>; turbo-mode; }; }; - | /* * Example 3: Dual-cluster, Dual-core per cluster. CPUs within a cluster switch * DVFS state together. */ cpus { #address-cells = <1>; #size-cells = <0>; cpu@0 { compatible = "arm,cortex-a7"; device_type = "cpu"; reg = <0>; next-level-cache = <&L2>; clocks = <&clk_controller 0>; clock-names = "cpu"; cpu-supply = <&cpu_supply0>; operating-points-v2 = <&cluster0_opp>; }; cpu@1 { compatible = "arm,cortex-a7"; device_type = "cpu"; reg = <1>; next-level-cache = <&L2>; clocks = <&clk_controller 0>; clock-names = "cpu"; cpu-supply = <&cpu_supply0>; operating-points-v2 = <&cluster0_opp>; }; cpu@100 { compatible = "arm,cortex-a15"; device_type = "cpu"; reg = <100>; next-level-cache = <&L2>; clocks = <&clk_controller 1>; clock-names = "cpu"; cpu-supply = <&cpu_supply1>; operating-points-v2 = <&cluster1_opp>; }; cpu@101 { compatible = "arm,cortex-a15"; device_type = "cpu"; reg = <101>; next-level-cache = <&L2>; clocks = <&clk_controller 1>; clock-names = "cpu"; cpu-supply = <&cpu_supply1>; operating-points-v2 = <&cluster1_opp>; }; }; cluster0_opp: opp-table-0 { compatible = "operating-points-v2"; opp-shared; opp-1000000000 { opp-hz = /bits/ 64 <1000000000>; opp-microvolt = <975000 970000 985000>; opp-microamp = <70000>; clock-latency-ns = <300000>; opp-suspend; }; opp-1100000000 { opp-hz = /bits/ 64 <1100000000>; opp-microvolt = <1000000 980000 1010000>; opp-microamp = <80000>; clock-latency-ns = <310000>; }; opp-1200000000 { opp-hz = /bits/ 64 <1200000000>; opp-microvolt = <1025000>; opp-microamp = <90000>; clock-latency-ns = <290000>; turbo-mode; }; }; cluster1_opp: opp-table-1 { compatible = "operating-points-v2"; opp-shared; opp-1300000000 { opp-hz = /bits/ 64 <1300000000>; opp-microvolt = <1050000 1045000 1055000>; opp-microamp = <95000>; clock-latency-ns = <400000>; opp-suspend; }; opp-1400000000 { opp-hz = /bits/ 64 <1400000000>; opp-microvolt = <1075000>; opp-microamp = <100000>; clock-latency-ns = <400000>; }; opp-1500000000 { opp-hz = /bits/ 64 <1500000000>; opp-microvolt = <1100000 1010000 1110000>; opp-microamp = <95000>; clock-latency-ns = <400000>; turbo-mode; }; }; - | /* Example 4: Handling multiple regulators */ cpus { #address-cells = <1>; #size-cells = <0>; cpu@0 { compatible = "foo,cpu-type"; device_type = "cpu"; reg = <0>; vcc0-supply = <&cpu_supply0>; vcc1-supply = <&cpu_supply1>; vcc2-supply = <&cpu_supply2>; operating-points-v2 = <&cpu0_opp_table4>; }; }; cpu0_opp_table4: opp-table-0 { compatible = "operating-points-v2"; opp-shared; opp-1000000000 { opp-hz = /bits/ 64 <1000000000>; opp-microvolt = <970000>, /* Supply 0 */ <960000>, /* Supply 1 */ <960000>; /* Supply 2 */ opp-microamp = <70000>, /* Supply 0 */ <70000>, /* Supply 1 */ <70000>; /* Supply 2 */ clock-latency-ns = <300000>; }; /* OR */ opp-1000000001 { opp-hz = /bits/ 64 <1000000001>; opp-microvolt = <975000 970000 985000>, /* Supply 0 */ <965000 960000 975000>, /* Supply 1 */ <965000 960000 975000>; /* Supply 2 */ opp-microamp = <70000>, /* Supply 0 */ <70000>, /* Supply 1 */ <70000>; /* Supply 2 */ clock-latency-ns = <300000>; }; /* OR */ opp-1000000002 { opp-hz = /bits/ 64 <1000000002>; opp-microvolt = <975000 970000 985000>, /* Supply 0 */ <965000 960000 975000>, /* Supply 1 */ <965000 960000 975000>; /* Supply 2 */ opp-microamp = <70000>, /* Supply 0 */ <0>, /* Supply 1 doesn't need this */ <70000>; /* Supply 2 */ clock-latency-ns = <300000>; }; }; - | /* * Example 5: opp-supported-hw * (example: three level hierarchy of versions: cuts, substrate and process) */ cpus { #address-cells = <1>; #size-cells = <0>; cpu@0 { compatible = "arm,cortex-a7"; device_type = "cpu"; reg = <0>; cpu-supply = <&cpu_supply>; operating-points-v2 = <&cpu0_opp_table_slow>; }; }; cpu0_opp_table_slow: opp-table { compatible = "operating-points-v2"; opp-shared; opp-600000000 { /* * Supports all substrate and process versions for 0xF * cuts, i.e. only first four cuts. */ opp-supported-hw = <0xF 0xFFFFFFFF 0xFFFFFFFF>; opp-hz = /bits/ 64 <600000000>; }; opp-800000000 { /* * Supports: * - cuts: only one, 6th cut (represented by 6th bit). * - substrate: supports 16 different substrate versions * - process: supports 9 different process versions */ opp-supported-hw = <0x20 0xff0000ff 0x0000f4f0>; opp-hz = /bits/ 64 <800000000>; }; opp-900000000 { /* * Supports: * - All cuts and substrate where process version is 0x2. * - All cuts and process where substrate version is 0x2. */ opp-supported-hw = <0xFFFFFFFF 0xFFFFFFFF 0x02>, <0xFFFFFFFF 0x01 0xFFFFFFFF>; opp-hz = /bits/ 64 <900000000>; }; }; - | /* * Example 6: opp-microvolt-, opp-microamp-: * (example: device with two possible microvolt ranges: slow and fast) */ cpus { #address-cells = <1>; #size-cells = <0>; cpu@0 { compatible = "arm,cortex-a7"; device_type = "cpu"; reg = <0>; operating-points-v2 = <&cpu0_opp_table6>; }; }; cpu0_opp_table6: opp-table-0 { compatible = "operating-points-v2"; opp-shared; opp-1000000000 { opp-hz = /bits/ 64 <1000000000>; opp-microvolt-slow = <915000 900000 925000>; opp-microvolt-fast = <975000 970000 985000>; opp-microamp-slow = <70000>; opp-microamp-fast = <71000>; }; opp-1200000000 { opp-hz = /bits/ 64 <1200000000>; opp-microvolt-slow = <915000 900000 925000>, /* Supply vcc0 */ <925000 910000 935000>; /* Supply vcc1 */ opp-microvolt-fast = <975000 970000 985000>, /* Supply vcc0 */ <965000 960000 975000>; /* Supply vcc1 */ opp-microamp = <70000>; /* Will be used for both slow/fast */ }; }; - | /* * Example 7: Single cluster Quad-core ARM cortex A53, OPP points from firmware, * distinct clock controls but two sets of clock/voltage/current lines. */ cpus { #address-cells = <2>; #size-cells = <0>; cpu@0 { compatible = "arm,cortex-a53"; device_type = "cpu"; reg = <0x0 0x100>; next-level-cache = <&A53_L2>; clocks = <&dvfs_controller 0>; operating-points-v2 = <&cpu_opp0_table>; }; cpu@1 { compatible = "arm,cortex-a53"; device_type = "cpu"; reg = <0x0 0x101>; next-level-cache = <&A53_L2>; clocks = <&dvfs_controller 1>; operating-points-v2 = <&cpu_opp0_table>; }; cpu@2 { compatible = "arm,cortex-a53"; device_type = "cpu"; reg = <0x0 0x102>; next-level-cache = <&A53_L2>; clocks = <&dvfs_controller 2>; operating-points-v2 = <&cpu_opp1_table>; }; cpu@3 { compatible = "arm,cortex-a53"; device_type = "cpu"; reg = <0x0 0x103>; next-level-cache = <&A53_L2>; clocks = <&dvfs_controller 3>; operating-points-v2 = <&cpu_opp1_table>; }; }; cpu_opp0_table: opp-table-0 { compatible = "operating-points-v2"; opp-shared; }; cpu_opp1_table: opp-table-1 { compatible = "operating-points-v2"; opp-shared; }; ...