powercap/dtpm_cpu: Use new Energy Model interface to get table
[linux-2.6-microblaze.git] / drivers / powercap / dtpm_cpu.c
index 9193c3b..ee0d1aa 100644 (file)
@@ -42,6 +42,7 @@ static u64 set_pd_power_limit(struct dtpm *dtpm, u64 power_limit)
 {
        struct dtpm_cpu *dtpm_cpu = to_dtpm_cpu(dtpm);
        struct em_perf_domain *pd = em_cpu_get(dtpm_cpu->cpu);
+       struct em_perf_state *table;
        struct cpumask cpus;
        unsigned long freq;
        u64 power;
@@ -50,20 +51,22 @@ static u64 set_pd_power_limit(struct dtpm *dtpm, u64 power_limit)
        cpumask_and(&cpus, cpu_online_mask, to_cpumask(pd->cpus));
        nr_cpus = cpumask_weight(&cpus);
 
+       rcu_read_lock();
+       table = em_perf_state_from_pd(pd);
        for (i = 0; i < pd->nr_perf_states; i++) {
 
-               power = pd->table[i].power * nr_cpus;
+               power = table[i].power * nr_cpus;
 
                if (power > power_limit)
                        break;
        }
 
-       freq = pd->table[i - 1].frequency;
+       freq = table[i - 1].frequency;
+       power_limit = table[i - 1].power * nr_cpus;
+       rcu_read_unlock();
 
        freq_qos_update_request(&dtpm_cpu->qos_req, freq);
 
-       power_limit = pd->table[i - 1].power * nr_cpus;
-
        return power_limit;
 }
 
@@ -87,9 +90,11 @@ static u64 scale_pd_power_uw(struct cpumask *pd_mask, u64 power)
 static u64 get_pd_power_uw(struct dtpm *dtpm)
 {
        struct dtpm_cpu *dtpm_cpu = to_dtpm_cpu(dtpm);
+       struct em_perf_state *table;
        struct em_perf_domain *pd;
        struct cpumask *pd_mask;
        unsigned long freq;
+       u64 power = 0;
        int i;
 
        pd = em_cpu_get(dtpm_cpu->cpu);
@@ -98,33 +103,43 @@ static u64 get_pd_power_uw(struct dtpm *dtpm)
 
        freq = cpufreq_quick_get(dtpm_cpu->cpu);
 
+       rcu_read_lock();
+       table = em_perf_state_from_pd(pd);
        for (i = 0; i < pd->nr_perf_states; i++) {
 
-               if (pd->table[i].frequency < freq)
+               if (table[i].frequency < freq)
                        continue;
 
-               return scale_pd_power_uw(pd_mask, pd->table[i].power);
+               power = scale_pd_power_uw(pd_mask, table[i].power);
+               break;
        }
+       rcu_read_unlock();
 
-       return 0;
+       return power;
 }
 
 static int update_pd_power_uw(struct dtpm *dtpm)
 {
        struct dtpm_cpu *dtpm_cpu = to_dtpm_cpu(dtpm);
        struct em_perf_domain *em = em_cpu_get(dtpm_cpu->cpu);
+       struct em_perf_state *table;
        struct cpumask cpus;
        int nr_cpus;
 
        cpumask_and(&cpus, cpu_online_mask, to_cpumask(em->cpus));
        nr_cpus = cpumask_weight(&cpus);
 
-       dtpm->power_min = em->table[0].power;
+       rcu_read_lock();
+       table = em_perf_state_from_pd(em);
+
+       dtpm->power_min = table[0].power;
        dtpm->power_min *= nr_cpus;
 
-       dtpm->power_max = em->table[em->nr_perf_states - 1].power;
+       dtpm->power_max = table[em->nr_perf_states - 1].power;
        dtpm->power_max *= nr_cpus;
 
+       rcu_read_unlock();
+
        return 0;
 }
 
@@ -180,6 +195,7 @@ static int __dtpm_cpu_setup(int cpu, struct dtpm *parent)
 {
        struct dtpm_cpu *dtpm_cpu;
        struct cpufreq_policy *policy;
+       struct em_perf_state *table;
        struct em_perf_domain *pd;
        char name[CPUFREQ_NAME_LEN];
        int ret = -ENOMEM;
@@ -216,9 +232,12 @@ static int __dtpm_cpu_setup(int cpu, struct dtpm *parent)
        if (ret)
                goto out_kfree_dtpm_cpu;
 
+       rcu_read_lock();
+       table = em_perf_state_from_pd(pd);
        ret = freq_qos_add_request(&policy->constraints,
                                   &dtpm_cpu->qos_req, FREQ_QOS_MAX,
-                                  pd->table[pd->nr_perf_states - 1].frequency);
+                                  table[pd->nr_perf_states - 1].frequency);
+       rcu_read_unlock();
        if (ret)
                goto out_dtpm_unregister;