diff options
author | Quinn Jensen <quinn.jensen@freescale.com> | 2007-10-24 21:19:49 -0600 |
---|---|---|
committer | Quinn Jensen <quinn.jensen@freescale.com> | 2007-10-24 21:19:49 -0600 |
commit | 71c0e4127254268045526a6ec4e42d7354cd9a17 (patch) | |
tree | de37d2e7ce02a43aa6be1cdf401af9ef5e9acbd8 /arch | |
parent | 3249e448242f95b02208ae94b76c4576f4c26411 (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.c | 28 |
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(); } |