rk fb: 2 pixel align for interlace and xact offset
authorhjc <hjc@rock-chips.com>
Mon, 1 Jun 2015 10:26:02 +0000 (18:26 +0800)
committerhjc <hjc@rock-chips.com>
Wed, 3 Jun 2015 03:29:37 +0000 (11:29 +0800)
Signed-off-by: hjc <hjc@rock-chips.com>
drivers/video/rockchip/rk_fb.c
include/linux/rk_fb.h

index ce3a90bce7ba1f7e3addb7ad07aae618767f10b4..307c95349cd323c10001da61a3da90a1c433e893 100755 (executable)
@@ -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);
index 694332df135423a752ff2af4922ca86ddaa78449..386a124b18890ea7e4c0a358f4d5bb6e451b5081 100755 (executable)
@@ -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;