|
@@ -149,6 +149,19 @@ bL_cpufreq_set_rate(u32 cpu, u32 old_cluster, u32 new_cluster, u32 rate)
|
|
|
__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);
|
|
@@ -189,15 +202,6 @@ bL_cpufreq_set_rate(u32 cpu, u32 old_cluster, u32 new_cluster, u32 rate)
|
|
|
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;
|
|
|
}
|
|
|
|