Commit e544a074 authored by Linus Torvalds's avatar Linus Torvalds

Merge tag 'pm-6.2-rc8' of git://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm

Pull power management fix from Rafael Wysocki:
 "Fix the incorrect value returned by cpufreq driver's ->get() callback
  for Qualcomm platforms (Douglas Anderson)"

* tag 'pm-6.2-rc8' of git://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm:
  cpufreq: qcom-hw: Fix cpufreq_driver->get() for non-LMH systems
parents 35674e78 918c5765
...@@ -143,40 +143,42 @@ static unsigned long qcom_lmh_get_throttle_freq(struct qcom_cpufreq_data *data) ...@@ -143,40 +143,42 @@ static unsigned long qcom_lmh_get_throttle_freq(struct qcom_cpufreq_data *data)
return lval * xo_rate; return lval * xo_rate;
} }
/* Get the current frequency of the CPU (after throttling) */ /* Get the frequency requested by the cpufreq core for the CPU */
static unsigned int qcom_cpufreq_hw_get(unsigned int cpu) static unsigned int qcom_cpufreq_get_freq(unsigned int cpu)
{ {
struct qcom_cpufreq_data *data; struct qcom_cpufreq_data *data;
const struct qcom_cpufreq_soc_data *soc_data;
struct cpufreq_policy *policy; struct cpufreq_policy *policy;
unsigned int index;
policy = cpufreq_cpu_get_raw(cpu); policy = cpufreq_cpu_get_raw(cpu);
if (!policy) if (!policy)
return 0; return 0;
data = policy->driver_data; data = policy->driver_data;
soc_data = qcom_cpufreq.soc_data;
return qcom_lmh_get_throttle_freq(data) / HZ_PER_KHZ; index = readl_relaxed(data->base + soc_data->reg_perf_state);
index = min(index, LUT_MAX_ENTRIES - 1);
return policy->freq_table[index].frequency;
} }
/* Get the frequency requested by the cpufreq core for the CPU */ static unsigned int qcom_cpufreq_hw_get(unsigned int cpu)
static unsigned int qcom_cpufreq_get_freq(unsigned int cpu)
{ {
struct qcom_cpufreq_data *data; struct qcom_cpufreq_data *data;
const struct qcom_cpufreq_soc_data *soc_data;
struct cpufreq_policy *policy; struct cpufreq_policy *policy;
unsigned int index;
policy = cpufreq_cpu_get_raw(cpu); policy = cpufreq_cpu_get_raw(cpu);
if (!policy) if (!policy)
return 0; return 0;
data = policy->driver_data; data = policy->driver_data;
soc_data = qcom_cpufreq.soc_data;
index = readl_relaxed(data->base + soc_data->reg_perf_state); if (data->throttle_irq >= 0)
index = min(index, LUT_MAX_ENTRIES - 1); return qcom_lmh_get_throttle_freq(data) / HZ_PER_KHZ;
return policy->freq_table[index].frequency; return qcom_cpufreq_get_freq(cpu);
} }
static unsigned int qcom_cpufreq_hw_fast_switch(struct cpufreq_policy *policy, static unsigned int qcom_cpufreq_hw_fast_switch(struct cpufreq_policy *policy,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment