summaryrefslogtreecommitdiff
path: root/arch/arm/plat-mxc
diff options
context:
space:
mode:
authorAnson Huang <b20788@freescale.com>2012-08-19 01:12:59 +0800
committerXinyu Chen <xinyu.chen@freescale.com>2012-08-22 10:26:34 +0800
commit650b501225fe690321c4ef41dc89f8b964a596c8 (patch)
tree6a8cfdd8f967d80ae1464fafeda12505a9614c95 /arch/arm/plat-mxc
parent01e42d4a16bfcb25aa02df6f40344c2d61983baa (diff)
ENGR00220370 [MX6]Fix BUS freq suspend/resume fail in low bus mode
1. BUS freq's set low bus setpoint using delat work, which didn't have mutex lock, so in some scenarios, set high bus freq function can be called at the same time, we need to move mutex lock into these two routine; 2. Using pm notify to make sure bus freq set to high setpoint before supend and restore after resume. 3. Clear build warning. Signed-off-by: Anson Huang <b20788@freescale.com>
Diffstat (limited to 'arch/arm/plat-mxc')
-rwxr-xr-xarch/arm/plat-mxc/cpufreq.c8
-rwxr-xr-xarch/arm/plat-mxc/dvfs_core.c16
2 files changed, 14 insertions, 10 deletions
diff --git a/arch/arm/plat-mxc/cpufreq.c b/arch/arm/plat-mxc/cpufreq.c
index fd285cfce0bc..549f5c5c7ce0 100755
--- a/arch/arm/plat-mxc/cpufreq.c
+++ b/arch/arm/plat-mxc/cpufreq.c
@@ -96,10 +96,12 @@ int set_cpu_freq(int freq)
/*Set the voltage for the GP domain. */
if (freq > org_cpu_rate) {
mutex_lock(&bus_freq_mutex);
- if (low_bus_freq_mode || audio_bus_freq_mode)
+ if (low_bus_freq_mode || audio_bus_freq_mode) {
+ mutex_unlock(&bus_freq_mutex);
set_high_bus_freq(0);
- mutex_unlock(&bus_freq_mutex);
- if (freq == cpu_op_tbl[0].cpu_rate && soc_regulator && pu_regulator) {
+ } else
+ mutex_unlock(&bus_freq_mutex);
+ if (freq == cpu_op_tbl[0].cpu_rate && !IS_ERR(soc_regulator) && !IS_ERR(pu_regulator)) {
ret = regulator_set_voltage(soc_regulator, soc_volt,
soc_volt);
if (ret < 0) {
diff --git a/arch/arm/plat-mxc/dvfs_core.c b/arch/arm/plat-mxc/dvfs_core.c
index 9018b49511cc..a4a15482c71f 100755
--- a/arch/arm/plat-mxc/dvfs_core.c
+++ b/arch/arm/plat-mxc/dvfs_core.c
@@ -647,22 +647,22 @@ static void dvfs_core_work_handler(struct work_struct *work)
mutex_lock(&bus_freq_mutex);
if ((curr_op == cpu_op_nr - 1) && (!low_bus_freq_mode)
&& (low_freq_bus_ready) && !bus_incr) {
- mutex_unlock(&bus_freq_mutex);
if (!minf)
set_cpu_freq(curr_op);
/* If dvfs_core_op is greater than cpu_op_nr, it implies
* we support LPAPM mode for this platform.
*/
if (dvfs_core_op > cpu_op_nr) {
- mutex_lock(&bus_freq_mutex);
set_low_bus_freq();
- mutex_unlock(&bus_freq_mutex);
dvfs_load_config(cpu_op_nr + 1);
}
+ mutex_unlock(&bus_freq_mutex);
} else {
- if (!high_bus_freq_mode)
+ if (!high_bus_freq_mode) {
+ mutex_unlock(&bus_freq_mutex);
set_high_bus_freq(1);
- mutex_unlock(&bus_freq_mutex);
+ } else
+ mutex_unlock(&bus_freq_mutex);
if (!bus_incr)
ret = set_cpu_freq(curr_op);
bus_incr = 0;
@@ -735,9 +735,11 @@ void stop_dvfs(void)
curr_op = 0;
mutex_lock(&bus_freq_mutex);
- if (!high_bus_freq_mode)
+ if (!high_bus_freq_mode) {
+ mutex_unlock(&bus_freq_mutex);
set_high_bus_freq(1);
- mutex_unlock(&bus_freq_mutex);
+ } else
+ mutex_unlock(&bus_freq_mutex);
curr_cpu = clk_get_rate(cpu_clk);
if (curr_cpu != cpu_op_tbl[curr_op].cpu_rate) {