| # 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 <viresh.kumar@linaro.org> |
| |
| 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-<name>, opp-microamp-<name>: |
| * (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; |
| }; |
| ... |