Hi Thomas,
Please see my comments inline.
On 09.01.2014 16:59, Thomas Abraham wrote:
[snip]
@@ -69,12 +71,26 @@ static int cpu0_set_target(struct cpufreq_policy *policy,
unsigned int index)
new_freq / 1000, volt ? volt / 1000 : -1);
/* scaling up? scale voltage before frequency */
- if (!IS_ERR(cpu_reg) && new_freq > old_freq) {
+ if (!IS_ERR(cpu_reg) && new_freq > old_freq &&
+ new_freq >= safe_frequency) {
ret = regulator_set_voltage_tol(cpu_reg, volt, tol);
if (ret) {
pr_err("failed to scale voltage up: %d\n", ret);
return ret;
}
+ } else if (!IS_ERR(cpu_reg) && old_freq < safe_frequency) {
+ /*
+ * the scaled up voltage level for the new_freq is lower
+ * than the safe voltage level. so set safe_voltage
+ * as the intermediate voltage level and revert it
+ * back after the frequency has been changed.
+ */
+ ret = regulator_set_voltage(cpu_reg, safe_voltage,
+ safe_voltage);
Shouldn't the tolerance be used here as well?
+ if (ret) {
+ pr_err("failed to set safe voltage: %d\n", ret);
+ return ret;
+ }
}
ret = clk_set_rate(cpu_clk, freq_exact);
@@ -94,6 +110,19 @@ static int cpu0_set_target(struct cpufreq_policy *policy,
unsigned int index)
}
}
+ /*
+ * if safe voltage was applied during voltage scale up, then set
+ * the correct target voltage now.
+ */
+ if (!IS_ERR(cpu_reg) && new_freq > old_freq &&
+ new_freq < safe_frequency) {
+ ret = regulator_set_voltage_tol(cpu_reg, volt, tol);
+ if (ret) {
+ pr_err("failed to scale voltage up: %d\n", ret);
+ return ret;
+ }
+ }
+
I believe that it would be enough to reuse the if block of scaling down
instead of repeating the same code, just the condition must be slightly
modified:
- /* scaling down? scale voltage after frequency */
- if (!IS_ERR(cpu_reg) && new_freq < old_freq) {
+ /*
+ * scaling down or below safe frequency?
+ * scale voltage after frequency
+ */
+ if (!IS_ERR(cpu_reg)
+ && (new_freq < old_freq || new_freq < safe_frequency)) {
Best regards,
Tomasz
--
To unsubscribe from this list: send the line "unsubscribe linux-samsung-soc" in
the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html