From 1061576f9897f205cbd78ce71576675ba16cb8cb Mon Sep 17 00:00:00 2001 From: hjc Date: Mon, 1 Jun 2015 18:26:02 +0800 Subject: [PATCH] rk fb: 2 pixel align for interlace and xact offset Signed-off-by: hjc --- drivers/video/rockchip/rk_fb.c | 27 ++++++++++++++++++++------- include/linux/rk_fb.h | 4 ++-- 2 files changed, 22 insertions(+), 9 deletions(-) diff --git a/drivers/video/rockchip/rk_fb.c b/drivers/video/rockchip/rk_fb.c index ce3a90bce7ba..307c95349cd3 100755 --- a/drivers/video/rockchip/rk_fb.c +++ b/drivers/video/rockchip/rk_fb.c @@ -1843,8 +1843,10 @@ static void rk_fb_update_reg(struct rk_lcdc_driver *dev_drv, win->state = 0; #if defined(CONFIG_ROCKCHIP_IOMMU) if (dev_drv->iommu_enabled) { - for (j = 0; j < 4; j++) + for (j = 0; j < 4; j++) { g_now_config_addr[i][j] = 0; + g_now_config_state[i][j] = 0; + } } #endif } @@ -1931,6 +1933,9 @@ static void rk_fb_update_regs_handler(struct kthread_work *work) static int rk_fb_check_config_var(struct rk_fb_area_par *area_par, struct rk_screen *screen) { + if (area_par->phy_addr > 0) + pr_err("%s[%d], phy_addr = 0x%x\n", + __func__, __LINE__, area_par->phy_addr); if ((area_par->x_offset + area_par->xact > area_par->xvir) || (area_par->xact <= 0) || (area_par->yact <= 0) || (area_par->xvir <= 0) || (area_par->yvir <= 0)) { @@ -2173,6 +2178,18 @@ static int rk_fb_set_win_buffer(struct fb_info *info, (fb_data_fmt == FBDC_ARGB_888) || (fb_data_fmt == FBDC_ABGR_888) || (fb_data_fmt == ABGR888)) ? 1 : 0; + /*act_height should be 2 pix align for interlace output*/ + if (win_par->area_par[i].yact % 2 == 1) { + win_par->area_par[i].yact -= 1; + win_par->area_par[i].ysize -= 1; + } + + /* buf offset should be 2 pix align*/ + if (win_par->area_par[i].x_offset % 2 == 1) { + win_par->area_par[i].x_offset += 1; + win_par->area_par[i].xact -= 1; + } + /* visiable pos in panel */ reg_win_data->reg_area_data[i].xpos = win_par->area_par[i].xpos; reg_win_data->reg_area_data[i].ypos = win_par->area_par[i].ypos; @@ -2185,11 +2202,6 @@ static int rk_fb_set_win_buffer(struct fb_info *info, reg_win_data->reg_area_data[i].xact = win_par->area_par[i].xact; reg_win_data->reg_area_data[i].yact = win_par->area_par[i].yact; - /*act_height should be 2 pix align for interlace output*/ - if ((screen->mode.vmode == FB_VMODE_INTERLACED) && - (reg_win_data->reg_area_data[i].yact % 2 == 1)) - reg_win_data->reg_area_data[i].yact -= 1; - xoffset = win_par->area_par[i].x_offset; /* buf offset */ yoffset = win_par->area_par[i].y_offset; reg_win_data->reg_area_data[i].xoff = xoffset; @@ -2376,7 +2388,8 @@ static int rk_fb_set_win_config(struct fb_info *info, for (i = 0; i < 4; i++) { for (j = 0; j < 4; j++) { - if (win_data->win_par[i].area_par[j].ion_fd > 0) + if ((win_data->win_par[i].area_par[j].ion_fd > 0) || + (win_data->win_par[i].area_par[j].phy_addr > 0)) ret += rk_fb_check_config_var( &win_data->win_par[i].area_par[j], screen); diff --git a/include/linux/rk_fb.h b/include/linux/rk_fb.h index 694332df1354..386a124b1889 100755 --- a/include/linux/rk_fb.h +++ b/include/linux/rk_fb.h @@ -562,8 +562,8 @@ struct rk_fb_reg_area_data { }; struct rk_fb_reg_win_data { - u8 win_id; - u8 z_order; /*win sel layer*/ + int win_id; + int z_order; /*win sel layer*/ u32 area_num; /*maybe two region have the same dma buff,*/ u32 area_buf_num; /*so area_num maybe not equal to area_buf_num*/ u8 alpha_en; -- 2.34.1