From 34046f2bc32cfe66b9f0f8b18fa05fe50ca63796 Mon Sep 17 00:00:00 2001 From: zsq Date: Fri, 30 Mar 2012 02:04:23 -0800 Subject: [PATCH] fix rgb / yuv switch rga sync error bug --- drivers/video/rockchip/rga/rga_drv.c | 11 ++++++----- drivers/video/rockchip/rga/rga_mmu_info.c | 9 ++++----- drivers/video/rockchip/rga/rga_reg_info.c | 4 ++-- 3 files changed, 12 insertions(+), 12 deletions(-) diff --git a/drivers/video/rockchip/rga/rga_drv.c b/drivers/video/rockchip/rga/rga_drv.c index 1449156d9208..0e413e477c21 100755 --- a/drivers/video/rockchip/rga/rga_drv.c +++ b/drivers/video/rockchip/rga/rga_drv.c @@ -71,8 +71,6 @@ ktime_t rga_start; ktime_t rga_end; -dev_t rga_devi; - struct rga_drvdata { struct miscdevice miscdev; struct device dev; @@ -596,7 +594,6 @@ static void rga_try_set_reg(uint32_t num) /* All CMD finish int */ rga_write(0x1<<10, RGA_INT); - #if RGA_TEST_TIME rga_start = ktime_get(); @@ -712,7 +709,7 @@ static int rga_blit_sync(rga_session *session, struct rga_req *req) sah = req->src.act_h; daw = req->dst.act_w; dah = req->dst.act_h; - + #if RGA_TEST printk("src.yrgb_addr = %.8x, src.uv_addr = %.8x, src.v_addr = %.8x\n", @@ -761,8 +758,10 @@ static int rga_blit_sync(rga_session *session, struct rga_req *req) //rga_power_on(); atomic_set(®->int_enable, 1); rga_try_set_reg(num); - + ret_timeout = wait_event_interruptible_timeout(session->wait, atomic_read(&session->done), RGA_TIMEOUT_DELAY); + + rga_soft_reset(); if (unlikely(ret_timeout< 0)) { pr_err("pid %d wait task ret %d\n", session->pid, ret_timeout); @@ -922,6 +921,8 @@ static irqreturn_t rga_irq(int irq, void *dev_id) printk(" INT ERROR RGA is not idle!\n"); rga_soft_reset(); } + + rga_soft_reset(); spin_lock(&rga_service.lock); do diff --git a/drivers/video/rockchip/rga/rga_mmu_info.c b/drivers/video/rockchip/rga/rga_mmu_info.c index f172aebbb470..d9f4af01fa8d 100755 --- a/drivers/video/rockchip/rga/rga_mmu_info.c +++ b/drivers/video/rockchip/rga/rga_mmu_info.c @@ -18,6 +18,7 @@ #include "rga_mmu_info.h" extern rga_service_info rga_service; +extern int mmu_buff_temp[1024]; #define KERNEL_SPACE_VALID 0xc0000000 @@ -416,7 +417,7 @@ static int rga_mmu_info_BitBlt_mode(struct rga_reg *reg, struct rga_req *req) break; } - MMU_Base = (uint32_t *)kmalloc(AllSize * sizeof(uint32_t), GFP_KERNEL); + MMU_Base = (uint32_t *)kmalloc(AllSize * sizeof(uint32_t), GFP_KERNEL); if(MMU_Base == NULL) { pr_err("RGA MMU malloc MMU_Base point failed\n"); status = RGA_MALLOC_ERROR; @@ -428,15 +429,13 @@ static int rga_mmu_info_BitBlt_mode(struct rga_reg *reg, struct rga_req *req) } if(req->src.yrgb_addr < KERNEL_SPACE_VALID) - { - + { ret = rga_MapUserMemory(&pages[CMDMemSize], &MMU_Base[CMDMemSize], SrcStart, SrcMemSize); if (ret < 0) { pr_err("rga map src memory failed\n"); status = ret; break; - } - + } } else { diff --git a/drivers/video/rockchip/rga/rga_reg_info.c b/drivers/video/rockchip/rga/rga_reg_info.c index 65595ee1e4e7..fe50ef0b1da5 100755 --- a/drivers/video/rockchip/rga/rga_reg_info.c +++ b/drivers/video/rockchip/rga/rga_reg_info.c @@ -1421,8 +1421,8 @@ RGA_set_mmu_ctrl_reg_info(u8 *base, const struct rga_req *msg) reg = *RGA_MMU_CTRL_ADDR; reg = ((reg & (~m_RGA_MMU_CTRL_PAGE_TABLE_SIZE)) | s_RGA_MMU_CTRL_PAGE_TABLE_SIZE(TLB_size)); reg = ((reg & (~m_RGA_MMU_CTRL_MMU_ENABLE)) | s_RGA_MMU_CTRL_MMU_ENABLE(mmu_enable)); - reg = ((reg & (~m_RGA_MMU_CTRL_SRC_FLUSH)) | s_RGA_MMU_CTRL_SRC_FLUSH(src_flag)); - reg = ((reg & (~m_RGA_MMU_CTRL_DST_FLUSH)) | s_RGA_MMU_CTRL_DST_FLUSH(dst_flag)); + reg = ((reg & (~m_RGA_MMU_CTRL_SRC_FLUSH)) | s_RGA_MMU_CTRL_SRC_FLUSH(1)); + reg = ((reg & (~m_RGA_MMU_CTRL_DST_FLUSH)) | s_RGA_MMU_CTRL_DST_FLUSH(1)); reg = ((reg & (~m_RGA_MMU_CTRL_CMD_CHAN_FLUSH)) | s_RGA_MMU_CTRL_CMD_CHAN_FLUSH(CMD_flag)); *RGA_MMU_CTRL_ADDR = reg; -- 2.34.1