]> www.infradead.org Git - users/dwmw2/linux.git/commitdiff
cpufreq: qcom: Don't add frequencies without an OPP
authorMatthias Kaehlcke <mka@chromium.org>
Tue, 15 Sep 2020 17:10:54 +0000 (10:10 -0700)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 29 Oct 2020 09:11:21 +0000 (10:11 +0100)
[ Upstream commit bc9b9c5ab9d8d16157737db539929d57562926e9 ]

The driver currently adds all frequencies from the hardware LUT to
the cpufreq table, regardless of whether the corresponding OPP
exists. This prevents devices from disabling certain OPPs through
the device tree and can result in CPU frequencies for which the
interconnect bandwidth can't be adjusted. Only add frequencies
with an OPP entry.

Fixes: 55538fbc79e9 ("cpufreq: qcom: Read voltage LUT and populate OPP")
Signed-off-by: Matthias Kaehlcke <mka@chromium.org>
Signed-off-by: Viresh Kumar <viresh.kumar@linaro.org>
Signed-off-by: Sasha Levin <sashal@kernel.org>
drivers/cpufreq/qcom-cpufreq-hw.c

index 3fb044b907a83424408b80520593ec3125554fe6..47b7d394d2abb76ea0a3c87c7a5c34c7f1ae8a91 100644 (file)
@@ -177,10 +177,15 @@ static int qcom_cpufreq_hw_read_lut(struct device *cpu_dev,
                        freq = cpu_hw_rate / 1000;
 
                if (freq != prev_freq && core_count != LUT_TURBO_IND) {
-                       table[i].frequency = freq;
-                       qcom_cpufreq_update_opp(cpu_dev, freq, volt);
-                       dev_dbg(cpu_dev, "index=%d freq=%d, core_count %d\n", i,
+                       if (!qcom_cpufreq_update_opp(cpu_dev, freq, volt)) {
+                               table[i].frequency = freq;
+                               dev_dbg(cpu_dev, "index=%d freq=%d, core_count %d\n", i,
                                freq, core_count);
+                       } else {
+                               dev_warn(cpu_dev, "failed to update OPP for freq=%d\n", freq);
+                               table[i].frequency = CPUFREQ_ENTRY_INVALID;
+                       }
+
                } else if (core_count == LUT_TURBO_IND) {
                        table[i].frequency = CPUFREQ_ENTRY_INVALID;
                }
@@ -197,9 +202,13 @@ static int qcom_cpufreq_hw_read_lut(struct device *cpu_dev,
                         * as the boost frequency
                         */
                        if (prev->frequency == CPUFREQ_ENTRY_INVALID) {
-                               prev->frequency = prev_freq;
-                               prev->flags = CPUFREQ_BOOST_FREQ;
-                               qcom_cpufreq_update_opp(cpu_dev, prev_freq, volt);
+                               if (!qcom_cpufreq_update_opp(cpu_dev, prev_freq, volt)) {
+                                       prev->frequency = prev_freq;
+                                       prev->flags = CPUFREQ_BOOST_FREQ;
+                               } else {
+                                       dev_warn(cpu_dev, "failed to update OPP for freq=%d\n",
+                                                freq);
+                               }
                        }
 
                        break;