From: Radivoje Jovanovic <radivoje.jovano...@intel.com>

there is no need to keep local state variable. if another driver
changes the policy under our feet the cpu_cooling driver will
have the wrong state. Get current state from the policy directly instead

Signed-off-by: Radivoje Jovanovic <radivoje.jovano...@intel.com>
---
 drivers/thermal/cpu_cooling.c | 27 ++++++++++++++++++---------
 1 file changed, 18 insertions(+), 9 deletions(-)

diff --git a/drivers/thermal/cpu_cooling.c b/drivers/thermal/cpu_cooling.c
index 6509c61..94ba2da 100644
--- a/drivers/thermal/cpu_cooling.c
+++ b/drivers/thermal/cpu_cooling.c
@@ -66,8 +66,6 @@ struct power_table {
  *     registered.
  * @cool_dev: thermal_cooling_device pointer to keep track of the
  *     registered cooling device.
- * @cpufreq_state: integer value representing the current state of cpufreq
- *     cooling devices.
  * @cpufreq_val: integer value representing the absolute value of the clipped
  *     frequency.
  * @max_level: maximum cooling level. One less than total number of valid
@@ -90,7 +88,6 @@ struct power_table {
 struct cpufreq_cooling_device {
        int id;
        struct thermal_cooling_device *cool_dev;
-       unsigned int cpufreq_state;
        unsigned int cpufreq_val;
        unsigned int max_level;
        unsigned int *freq_table;       /* In descending order */
@@ -486,10 +483,19 @@ static int cpufreq_get_cur_state(struct 
thermal_cooling_device *cdev,
                                 unsigned long *state)
 {
        struct cpufreq_cooling_device *cpufreq_device = cdev->devdata;
-
-       *state = cpufreq_device->cpufreq_state;
-
-       return 0;
+       struct cpufreq_policy policy;
+       struct cpumask *mask = &cpufreq_device->allowed_cpus;
+       unsigned int cpu = cpumask_any(mask);
+       unsigned int cur_state;
+
+       if (!cpufreq_get_policy(&policy, cpu)) {
+                       cur_state = get_level(cpufreq_device, policy.max);
+                       if (cur_state != THERMAL_CSTATE_INVALID) {
+                               *state = cur_state;
+                               return 0;
+                       }
+       }
+       return -EINVAL;
 }
 
 /**
@@ -508,17 +514,20 @@ static int cpufreq_set_cur_state(struct 
thermal_cooling_device *cdev,
        struct cpufreq_cooling_device *cpufreq_device = cdev->devdata;
        unsigned int cpu = cpumask_any(&cpufreq_device->allowed_cpus);
        unsigned int clip_freq;
+       unsigned long cur_state;
 
        /* Request state should be less than max_level */
        if (WARN_ON(state > cpufreq_device->max_level))
                return -EINVAL;
 
+       if (cpufreq_get_cur_state(cpufreq_device->cool_dev, &cur_state))
+               return -EINVAL;
+
        /* Check if the old cooling action is same as new cooling action */
-       if (cpufreq_device->cpufreq_state == state)
+       if (cur_state == state)
                return 0;
 
        clip_freq = cpufreq_device->freq_table[state];
-       cpufreq_device->cpufreq_state = state;
        cpufreq_device->cpufreq_val = clip_freq;
 
        cpufreq_update_policy(cpu);
-- 
1.9.1

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Reply via email to