summaryrefslogtreecommitdiff
path: root/drivers
diff options
context:
space:
mode:
authorXinyu Chen <xinyu.chen@freescale.com>2012-11-08 10:49:53 +0800
committerXinyu Chen <xinyu.chen@freescale.com>2012-11-08 10:54:23 +0800
commitc7415c69455051f70bea913480f245809809029b (patch)
tree89af28a74ee6097dbeb4fdb9e8ecc58bebb54f51 /drivers
parentac758db7a1ff13fbde98f4f3d1d2ac2c77780ccf (diff)
ENGR00230203 VPU: System hang after resume from suspend during video playback
Make VPU driver only recover the reg and running state only VPU being used Signed-off-by: guoyin.chen <guoyin.chen@freescale.com>
Diffstat (limited to 'drivers')
-rw-r--r--drivers/mxc/vpu/mxc_vpu.c66
1 files changed, 35 insertions, 31 deletions
diff --git a/drivers/mxc/vpu/mxc_vpu.c b/drivers/mxc/vpu/mxc_vpu.c
index f473fdf681ba..2a1b2cd0685c 100644
--- a/drivers/mxc/vpu/mxc_vpu.c
+++ b/drivers/mxc/vpu/mxc_vpu.c
@@ -868,40 +868,44 @@ static int vpu_resume(struct platform_device *pdev)
goto recover_clk;
}
- /* Restore registers */
- for (i = 0; i < 64; i++)
- WRITE_REG(regBk[i], BIT_CODE_BUF_ADDR + (i * 4));
-
- WRITE_REG(0x0, BIT_RESET_CTRL);
- WRITE_REG(0x0, BIT_CODE_RUN);
- /* MX6 RTL has a bug not to init MBC_SET_SUBBLK_EN on reset */
- WRITE_REG(0x0, MBC_SET_SUBBLK_EN);
-
/*
- * Re-load boot code, from the codebuffer in external RAM.
- * Thankfully, we only need 4096 bytes, same for all platforms.
+ * Only recover vpu if it is been using.
+ * If not been used, vpu will be reinited in user space lib.
*/
- for (i = 0; i < 2048; i += 4) {
- data = p[(i / 2) + 1];
- data_hi = (data >> 16) & 0xFFFF;
- data_lo = data & 0xFFFF;
- WRITE_REG((i << 16) | data_hi, BIT_CODE_DOWN);
- WRITE_REG(((i + 1) << 16) | data_lo,
- BIT_CODE_DOWN);
-
- data = p[i / 2];
- data_hi = (data >> 16) & 0xFFFF;
- data_lo = data & 0xFFFF;
- WRITE_REG(((i + 2) << 16) | data_hi,
- BIT_CODE_DOWN);
- WRITE_REG(((i + 3) << 16) | data_lo,
- BIT_CODE_DOWN);
- }
+ if (open_count > 0) {
+ /* Restore registers */
+ for (i = 0; i < 64; i++)
+ WRITE_REG(regBk[i], BIT_CODE_BUF_ADDR + (i * 4));
+
+ WRITE_REG(0x0, BIT_RESET_CTRL);
+ WRITE_REG(0x0, BIT_CODE_RUN);
+
+ /*
+ * Re-load boot code, from the codebuffer in external RAM.
+ * Thankfully, we only need 4096 bytes, same for all platforms.
+ */
+ for (i = 0; i < 2048; i += 4) {
+ data = p[(i / 2) + 1];
+ data_hi = (data >> 16) & 0xFFFF;
+ data_lo = data & 0xFFFF;
+ WRITE_REG((i << 16) | data_hi, BIT_CODE_DOWN);
+ WRITE_REG(((i + 1) << 16) | data_lo,
+ BIT_CODE_DOWN);
+
+ data = p[i / 2];
+ data_hi = (data >> 16) & 0xFFFF;
+ data_lo = data & 0xFFFF;
+ WRITE_REG(((i + 2) << 16) | data_hi,
+ BIT_CODE_DOWN);
+ WRITE_REG(((i + 3) << 16) | data_lo,
+ BIT_CODE_DOWN);
+ }
- WRITE_REG(0x1, BIT_BUSY_FLAG);
- WRITE_REG(0x1, BIT_CODE_RUN);
- while (READ_REG(BIT_BUSY_FLAG))
- ;
+ WRITE_REG(0x1, BIT_BUSY_FLAG);
+ WRITE_REG(0x1, BIT_CODE_RUN);
+ while (READ_REG(BIT_BUSY_FLAG))
+ ;
+ }
clk_disable(vpu_clk);
}