static unsigned int bL_cpufreq_set_rate(u32 cpu, u32 old_cluster, u32 new_cluster, u32 rate) { u32 new_rate, prev_rate; int ret; bool bLs = is_bL_switching_enabled(); mutex_lock(&cluster_lock[new_cluster]); if (bLs) { prev_rate = per_cpu(cpu_last_req_freq, cpu); per_cpu(cpu_last_req_freq, cpu) = rate; per_cpu(physical_cluster, cpu) = new_cluster; new_rate = find_cluster_maxfreq(new_cluster); new_rate = ACTUAL_FREQ(new_cluster, new_rate); } else { new_rate = rate; } pr_debug("%s: cpu: %d, old cluster: %d, new cluster: %d, freq: %d\n", __func__, cpu, old_cluster, new_cluster, new_rate); ret = clk_set_rate(clk[new_cluster], new_rate * 1000); if (WARN_ON(ret)) { pr_err("clk_set_rate failed: %d, new cluster: %d\n", ret, new_cluster); if (bLs) { per_cpu(cpu_last_req_freq, cpu) = prev_rate; per_cpu(physical_cluster, cpu) = old_cluster; } mutex_unlock(&cluster_lock[new_cluster]); return ret; } mutex_unlock(&cluster_lock[new_cluster]); /* Recalc freq for old cluster when switching clusters */ if (old_cluster != new_cluster) { pr_debug("%s: cpu: %d, old cluster: %d, new cluster: %d\n", __func__, cpu, old_cluster, new_cluster); /* Switch cluster */ bL_switch_request(cpu, new_cluster); mutex_lock(&cluster_lock[old_cluster]); /* Set freq of old cluster if there are cpus left on it */ new_rate = find_cluster_maxfreq(old_cluster); new_rate = ACTUAL_FREQ(old_cluster, new_rate); if (new_rate) { pr_debug("%s: Updating rate of old cluster: %d, to freq: %d\n", __func__, old_cluster, new_rate); if (clk_set_rate(clk[old_cluster], new_rate * 1000)) pr_err("%s: clk_set_rate failed: %d, old cluster: %d\n", __func__, ret, old_cluster); } mutex_unlock(&cluster_lock[old_cluster]); } return 0; }
static unsigned int bL_cpufreq_set_rate(u32 cpu, u32 old_cluster, u32 new_cluster, u32 rate) { u32 new_rate, prev_rate; int ret; bool bLs = is_bL_switching_enabled(); mutex_lock(&cluster_lock[new_cluster]); if (bLs) { prev_rate = per_cpu(cpu_last_req_freq, cpu); per_cpu(cpu_last_req_freq, cpu) = rate; per_cpu(physical_cluster, cpu) = new_cluster; new_rate = find_cluster_maxfreq(new_cluster); new_rate = ACTUAL_FREQ(new_cluster, new_rate); } else { new_rate = rate; } pr_debug("%s: cpu: %d, old cluster: %d, new cluster: %d, freq: %d\n", __func__, cpu, old_cluster, new_cluster, new_rate); ret = clk_set_rate(clk[new_cluster], new_rate * 1000); if (!ret) { /* * FIXME: clk_set_rate hasn't returned an error here however it * may be that clk_change_rate failed due to hardware or * firmware issues and wasn't able to report that due to the * current design of the clk core layer. To work around this * problem we will read back the clock rate and check it is * correct. This needs to be removed once clk core is fixed. */ if (clk_get_rate(clk[new_cluster]) != new_rate * 1000) ret = -EIO; } if (WARN_ON(ret)) { pr_err("clk_set_rate failed: %d, new cluster: %d\n", ret, new_cluster); if (bLs) { per_cpu(cpu_last_req_freq, cpu) = prev_rate; per_cpu(physical_cluster, cpu) = old_cluster; } mutex_unlock(&cluster_lock[new_cluster]); return ret; } mutex_unlock(&cluster_lock[new_cluster]); /* Recalc freq for old cluster when switching clusters */ if (old_cluster != new_cluster) { pr_debug("%s: cpu: %d, old cluster: %d, new cluster: %d\n", __func__, cpu, old_cluster, new_cluster); /* Switch cluster */ bL_switch_request(cpu, new_cluster); mutex_lock(&cluster_lock[old_cluster]); /* Set freq of old cluster if there are cpus left on it */ new_rate = find_cluster_maxfreq(old_cluster); new_rate = ACTUAL_FREQ(old_cluster, new_rate); if (new_rate) { pr_debug("%s: Updating rate of old cluster: %d, to freq: %d\n", __func__, old_cluster, new_rate); if (clk_set_rate(clk[old_cluster], new_rate * 1000)) pr_err("%s: clk_set_rate failed: %d, old cluster: %d\n", __func__, ret, old_cluster); } mutex_unlock(&cluster_lock[old_cluster]); } return 0; }
static unsigned int bL_cpufreq_set_rate(u32 cpu, u32 old_cluster, u32 new_cluster, u32 rate) { u32 new_rate, prev_rate; int ret; bool bLs = is_bL_switching_enabled(); mutex_lock(&cluster_lock[new_cluster]); if (bLs) { prev_rate = per_cpu(cpu_last_req_freq, cpu); per_cpu(cpu_last_req_freq, cpu) = rate; per_cpu(physical_cluster, cpu) = new_cluster; new_rate = find_cluster_maxfreq(new_cluster); new_rate = ACTUAL_FREQ(new_cluster, new_rate); } else { new_rate = rate; } pr_debug("%s: cpu: %d, old cluster: %d, new cluster: %d, freq: %d\n", __func__, cpu, old_cluster, new_cluster, new_rate); ret = clk_set_rate(clk[new_cluster], new_rate * 1000); if (WARN_ON(ret)) { pr_err("clk_set_rate failed: %d, new cluster: %d\n", ret, new_cluster); if (bLs) { per_cpu(cpu_last_req_freq, cpu) = prev_rate; per_cpu(physical_cluster, cpu) = old_cluster; } mutex_unlock(&cluster_lock[new_cluster]); return ret; } mutex_unlock(&cluster_lock[new_cluster]); /* Recalc freq for old cluster when switching clusters */ if (old_cluster != new_cluster) { pr_debug("%s: cpu: %d, old cluster: %d, new cluster: %d\n", __func__, cpu, old_cluster, new_cluster); /* Switch cluster */ bL_switch_request(cpu, new_cluster); mutex_lock(&cluster_lock[old_cluster]); /* Set freq of old cluster if there are cpus left on it */ new_rate = find_cluster_maxfreq(old_cluster); new_rate = ACTUAL_FREQ(old_cluster, new_rate); if (new_rate) { pr_debug("%s: Updating rate of old cluster: %d, to freq: %d\n", __func__, old_cluster, new_rate); if (clk_set_rate(clk[old_cluster], new_rate * 1000)) pr_err("%s: clk_set_rate failed: %d, old cluster: %d\n", __func__, ret, old_cluster); } mutex_unlock(&cluster_lock[old_cluster]); } /* * FIXME: clk_set_rate has to handle the case where clk_change_rate * can fail due to hardware or firmware issues. Until the clk core * layer is fixed, we can check here. In most of the cases we will * be reading only the cached value anyway. This needs to be removed * once clk core is fixed. */ if (bL_cpufreq_get_rate(cpu) != new_rate) return -EIO; return 0; }