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;
        }
 }
 
-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;
         * 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,