Loading Documentation/devicetree/bindings/opp/opp.txt +53 −1 Original line number Diff line number Diff line Loading @@ -65,7 +65,9 @@ Required properties: - OPP nodes: One or more OPP nodes describing voltage-current-frequency combinations. Their name isn't significant but their phandle can be used to reference an OPP. reference an OPP. These are mandatory except for the case where the OPP table is present only to indicate dependency between devices using the opp-shared property. Optional properties: - opp-shared: Indicates that device nodes using this OPP Table Node's phandle Loading Loading @@ -568,3 +570,53 @@ Example 6: opp-microvolt-<name>, opp-microamp-<name>: }; }; }; 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"; reg = <0x0 0x100>; next-level-cache = <&A53_L2>; clocks = <&dvfs_controller 0>; operating-points-v2 = <&cpu_opp0_table>; }; cpu@1 { compatible = "arm,cortex-a53"; reg = <0x0 0x101>; next-level-cache = <&A53_L2>; clocks = <&dvfs_controller 1>; operating-points-v2 = <&cpu_opp0_table>; }; cpu@2 { compatible = "arm,cortex-a53"; reg = <0x0 0x102>; next-level-cache = <&A53_L2>; clocks = <&dvfs_controller 2>; operating-points-v2 = <&cpu_opp1_table>; }; cpu@3 { compatible = "arm,cortex-a53"; reg = <0x0 0x103>; next-level-cache = <&A53_L2>; clocks = <&dvfs_controller 3>; operating-points-v2 = <&cpu_opp1_table>; }; }; cpu_opp0_table: opp0_table { compatible = "operating-points-v2"; opp-shared; }; cpu_opp1_table: opp1_table { compatible = "operating-points-v2"; opp-shared; }; }; drivers/opp/of.c +5 −2 Original line number Diff line number Diff line Loading @@ -170,7 +170,8 @@ static void _opp_table_alloc_required_tables(struct opp_table *opp_table, /* Traversing the first OPP node is all we need */ np = of_get_next_available_child(opp_np, NULL); if (!np) { dev_err(dev, "Empty OPP table\n"); dev_warn(dev, "Empty OPP table\n"); return; } Loading Loading @@ -378,7 +379,9 @@ int dev_pm_opp_of_find_icc_paths(struct device *dev, struct icc_path **paths; ret = _bandwidth_supported(dev, opp_table); if (ret <= 0) if (ret == -EINVAL) return 0; /* Empty OPP table is a valid corner-case, let's not fail */ else if (ret <= 0) return ret; ret = 0; Loading Loading
Documentation/devicetree/bindings/opp/opp.txt +53 −1 Original line number Diff line number Diff line Loading @@ -65,7 +65,9 @@ Required properties: - OPP nodes: One or more OPP nodes describing voltage-current-frequency combinations. Their name isn't significant but their phandle can be used to reference an OPP. reference an OPP. These are mandatory except for the case where the OPP table is present only to indicate dependency between devices using the opp-shared property. Optional properties: - opp-shared: Indicates that device nodes using this OPP Table Node's phandle Loading Loading @@ -568,3 +570,53 @@ Example 6: opp-microvolt-<name>, opp-microamp-<name>: }; }; }; 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"; reg = <0x0 0x100>; next-level-cache = <&A53_L2>; clocks = <&dvfs_controller 0>; operating-points-v2 = <&cpu_opp0_table>; }; cpu@1 { compatible = "arm,cortex-a53"; reg = <0x0 0x101>; next-level-cache = <&A53_L2>; clocks = <&dvfs_controller 1>; operating-points-v2 = <&cpu_opp0_table>; }; cpu@2 { compatible = "arm,cortex-a53"; reg = <0x0 0x102>; next-level-cache = <&A53_L2>; clocks = <&dvfs_controller 2>; operating-points-v2 = <&cpu_opp1_table>; }; cpu@3 { compatible = "arm,cortex-a53"; reg = <0x0 0x103>; next-level-cache = <&A53_L2>; clocks = <&dvfs_controller 3>; operating-points-v2 = <&cpu_opp1_table>; }; }; cpu_opp0_table: opp0_table { compatible = "operating-points-v2"; opp-shared; }; cpu_opp1_table: opp1_table { compatible = "operating-points-v2"; opp-shared; }; };
drivers/opp/of.c +5 −2 Original line number Diff line number Diff line Loading @@ -170,7 +170,8 @@ static void _opp_table_alloc_required_tables(struct opp_table *opp_table, /* Traversing the first OPP node is all we need */ np = of_get_next_available_child(opp_np, NULL); if (!np) { dev_err(dev, "Empty OPP table\n"); dev_warn(dev, "Empty OPP table\n"); return; } Loading Loading @@ -378,7 +379,9 @@ int dev_pm_opp_of_find_icc_paths(struct device *dev, struct icc_path **paths; ret = _bandwidth_supported(dev, opp_table); if (ret <= 0) if (ret == -EINVAL) return 0; /* Empty OPP table is a valid corner-case, let's not fail */ else if (ret <= 0) return ret; ret = 0; Loading