diff options
author | Xinyu Chen <xinyu.chen@freescale.com> | 2012-11-08 10:49:53 +0800 |
---|---|---|
committer | Xinyu Chen <xinyu.chen@freescale.com> | 2012-11-08 10:54:23 +0800 |
commit | c7415c69455051f70bea913480f245809809029b (patch) | |
tree | 89af28a74ee6097dbeb4fdb9e8ecc58bebb54f51 /drivers | |
parent | ac758db7a1ff13fbde98f4f3d1d2ac2c77780ccf (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.c | 66 |
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); } |