PM / AVS: rockchip-cpu-avs: use a new way to get cluster id
authorFinley Xiao <finley.xiao@rock-chips.com>
Sun, 25 Dec 2016 02:48:34 +0000 (10:48 +0800)
committerHuang, Tao <huangtao@rock-chips.com>
Mon, 26 Dec 2016 09:48:20 +0000 (17:48 +0800)
The returned value of topology_physical_package_id is socket id
on ARM32 system(for example, RK3288), it's not like the cluster id
on ARM64 system(for example, RK3366), so use a new way.

Change-Id: I5b2cdfdcdaa56c71df394caa2588f6e83931a293
Signed-off-by: Finley Xiao <finley.xiao@rock-chips.com>
drivers/power/avs/rockchip-cpu-avs.c

index fc0bf2a4b299f100947496679e42854b59aabdb1..93a1720dc37880591dc0b5a11d30725567531882 100644 (file)
@@ -54,6 +54,7 @@ struct rockchip_cpu_avs {
        struct cluster_info *cluster;
        struct notifier_block cpufreq_notify;
        unsigned int check_done[MAX_CLUSTERS];
+       struct cpumask allowed_cpus[MAX_CLUSTERS];
 };
 
 #define notifier_to_avs(_n) container_of(_n, struct rockchip_cpu_avs, \
@@ -107,11 +108,28 @@ static int rockchip_cpu_avs_notifier(struct notifier_block *nb,
        int i, id, cpu = policy->cpu;
        int ret;
 
+       if (event == CPUFREQ_CREATE_POLICY) {
+               for (id = 0; id < MAX_CLUSTERS; id++) {
+                       if (cpumask_test_cpu(policy->cpu,
+                                            &avs->allowed_cpus[id]))
+                               break;
+                       if (cpumask_empty(&avs->allowed_cpus[id])) {
+                               cpumask_copy(&avs->allowed_cpus[id],
+                                            policy->related_cpus);
+                               break;
+                       }
+               }
+               goto out;
+       }
+
        if (event != CPUFREQ_START)
                goto out;
 
-       id = topology_physical_package_id(cpu);
-       if (id < 0 || id >= MAX_CLUSTERS) {
+       for (id = 0; id < MAX_CLUSTERS; id++) {
+               if (cpumask_test_cpu(cpu, &avs->allowed_cpus[id]))
+                       break;
+       }
+       if (id == MAX_CLUSTERS) {
                pr_err("cpu%d invalid cluster id\n", cpu);
                goto out;
        }