diff options
| -rw-r--r-- | drivers/cpufreq/qcom-cpufreq-hw.c | 42 | 
1 files changed, 29 insertions, 13 deletions
| diff --git a/drivers/cpufreq/qcom-cpufreq-hw.c b/drivers/cpufreq/qcom-cpufreq-hw.c index 45dbb5d7fa77..a563f177e23b 100644 --- a/drivers/cpufreq/qcom-cpufreq-hw.c +++ b/drivers/cpufreq/qcom-cpufreq-hw.c @@ -129,9 +129,37 @@ static int qcom_cpufreq_hw_target_index(struct cpufreq_policy *policy,  	return 0;  } +static unsigned long qcom_lmh_get_throttle_freq(struct qcom_cpufreq_data *data) +{ +	unsigned int lval; + +	if (qcom_cpufreq.soc_data->reg_current_vote) +		lval = readl_relaxed(data->base + qcom_cpufreq.soc_data->reg_current_vote) & 0x3ff; +	else +		lval = readl_relaxed(data->base + qcom_cpufreq.soc_data->reg_domain_state) & 0xff; + +	return lval * xo_rate; +} + +/* Get the current frequency of the CPU (after throttling) */  static unsigned int qcom_cpufreq_hw_get(unsigned int cpu)  {  	struct qcom_cpufreq_data *data; +	struct cpufreq_policy *policy; + +	policy = cpufreq_cpu_get_raw(cpu); +	if (!policy) +		return 0; + +	data = policy->driver_data; + +	return qcom_lmh_get_throttle_freq(data) / HZ_PER_KHZ; +} + +/* Get the frequency requested by the cpufreq core for the CPU */ +static unsigned int qcom_cpufreq_get_freq(unsigned int cpu) +{ +	struct qcom_cpufreq_data *data;  	const struct qcom_cpufreq_soc_data *soc_data;  	struct cpufreq_policy *policy;  	unsigned int index; @@ -291,18 +319,6 @@ static void qcom_get_related_cpus(int index, struct cpumask *m)  	}  } -static unsigned long qcom_lmh_get_throttle_freq(struct qcom_cpufreq_data *data) -{ -	unsigned int lval; - -	if (qcom_cpufreq.soc_data->reg_current_vote) -		lval = readl_relaxed(data->base + qcom_cpufreq.soc_data->reg_current_vote) & 0x3ff; -	else -		lval = readl_relaxed(data->base + qcom_cpufreq.soc_data->reg_domain_state) & 0xff; - -	return lval * xo_rate; -} -  static void qcom_lmh_dcvs_notify(struct qcom_cpufreq_data *data)  {  	struct cpufreq_policy *policy = data->policy; @@ -346,7 +362,7 @@ static void qcom_lmh_dcvs_notify(struct qcom_cpufreq_data *data)  	 * If h/w throttled frequency is higher than what cpufreq has requested  	 * for, then stop polling and switch back to interrupt mechanism.  	 */ -	if (throttled_freq >= qcom_cpufreq_hw_get(cpu)) +	if (throttled_freq >= qcom_cpufreq_get_freq(cpu))  		enable_irq(data->throttle_irq);  	else  		mod_delayed_work(system_highpri_wq, &data->throttle_work, | 
