summaryrefslogtreecommitdiff
path: root/arch
diff options
context:
space:
mode:
authorQuinn Jensen <quinn.jensen@freescale.com>2007-10-24 21:19:49 -0600
committerQuinn Jensen <quinn.jensen@freescale.com>2007-10-24 21:19:49 -0600
commit71c0e4127254268045526a6ec4e42d7354cd9a17 (patch)
treede37d2e7ce02a43aa6be1cdf401af9ef5e9acbd8 /arch
parent3249e448242f95b02208ae94b76c4576f4c26411 (diff)
Bug fix for when processor enters state-retention mode after camera
Bug fix for when processor enters state-retention mode after camera activity on the linux 2.6.22 kernel for the MX31 platform. http://www.bitshrine.org/gpp/linux-2.6.22-mx-Bug-fix-for-when-processor-enters-state-re.patch
Diffstat (limited to 'arch')
-rw-r--r--arch/arm/mach-mx3/mxc_pm.c28
1 files changed, 16 insertions, 12 deletions
diff --git a/arch/arm/mach-mx3/mxc_pm.c b/arch/arm/mach-mx3/mxc_pm.c
index 40d51b69704e..9c58338d928b 100644
--- a/arch/arm/mach-mx3/mxc_pm.c
+++ b/arch/arm/mach-mx3/mxc_pm.c
@@ -39,6 +39,7 @@
#include <asm/arch/dvfs.h>
#include "crm_regs.h"
+#include "../drivers/mxc/ipu/ipu_regs.h"
/* Local defines */
#define FREQ_COMP_TOLERANCE 200 /* tolerance percentage times 100 */
@@ -285,12 +286,11 @@ int mxc_pm_pllscale(long arm_freq, long max_freq, long ip_freq)
*/
void mxc_pm_lowpower(int mode)
{
- unsigned int lpm;
- int enable_flag;
+ unsigned int lpm, ipu_conf;
unsigned long reg;
local_irq_disable();
- enable_flag = 0;
+ ipu_conf = __raw_readl(IPU_CONF);
switch (mode) {
case DOZE_MODE:
@@ -300,17 +300,18 @@ void mxc_pm_lowpower(int mode)
case STOP_MODE:
/* State Retention mode */
lpm = 2;
- /* Disable timer interrupt */
- disable_irq(INT_GPT);
- enable_flag = 1;
+ __raw_writel(INT_GPT, AVIC_INTDISNUM);
+
+ /* work-around for SR mode after camera related test */
+ mxc_clks_enable(CSI_BAUD);
+ __raw_writel(0x51, IPU_CONF);
break;
case DSM_MODE:
/* Deep Sleep Mode */
lpm = 3;
/* Disable timer interrupt */
- disable_irq(INT_GPT);
- enable_flag = 1;
+ __raw_writel(INT_GPT, AVIC_INTDISNUM);
/* Enabled Well Bias
* SBYCS = 0, MCU clock source is disabled*/
mxc_ccm_modify_reg(MXC_CCM_CCMR,
@@ -327,15 +328,18 @@ void mxc_pm_lowpower(int mode)
reg = __raw_readl(MXC_CCM_CCMR);
reg = (reg & (~MXC_CCM_CCMR_LPM_MASK)) | lpm << MXC_CCM_CCMR_LPM_OFFSET;
__raw_writel(reg, MXC_CCM_CCMR);
+
/* Executing CP15 (Wait-for-Interrupt) Instruction */
/* wait for interrupt */
__asm__ __volatile__("mcr p15, 0, r1, c7, c0, 4\n"
"nop\n" "nop\n" "nop\n" "nop\n" "nop\n"::);
- if (enable_flag) {
- /* Enable timer interrupt */
- enable_irq(INT_GPT);
- }
+ /* work-around for SR mode after camera related test */
+ __raw_writel(ipu_conf, IPU_CONF);
+ mxc_clks_disable(CSI_BAUD);
+
+ __raw_writel(INT_GPT, AVIC_INTENNUM);
+
local_irq_enable();
}