rk fb: update fb config done info.
authorhjc <hjc@rock-chips.com>
Mon, 8 Dec 2014 03:53:47 +0000 (11:53 +0800)
committerhjc <hjc@rock-chips.com>
Mon, 8 Dec 2014 09:06:57 +0000 (17:06 +0800)
       this commit depend on hwc update,
       including the following directory:

       hardware/rk29/hwcomposer_rga/
       hardware/rk29/libgralloc_ump/
       hardware/libhardware/

drivers/video/rockchip/lcdc/rk3036_lcdc.c
drivers/video/rockchip/lcdc/rk312x_lcdc.c
drivers/video/rockchip/lcdc/rk3188_lcdc.c
drivers/video/rockchip/lcdc/rk3288_lcdc.c
drivers/video/rockchip/lcdc/rk3288_lcdc.h
drivers/video/rockchip/rk_fb.c
drivers/video/rockchip/rkfb_sysfs.c
include/dt-bindings/rkfb/rk_fb.h
include/linux/rk_fb.h

index aeb0b353af5b678a91aebe0b3efa277a180b0350..da1b70bc5efd2bde0b0ebaf5d205ab91e8922a63 100755 (executable)
@@ -180,8 +180,8 @@ static int rk3036_lcdc_alpha_cfg(struct lcdc_device *lcdc_dev)
 {
        int win0_top = 0;
        u32 mask, val;
-       enum data_format win0_format = lcdc_dev->driver.win[0]->format;
-       enum data_format win1_format = lcdc_dev->driver.win[1]->format;
+       enum data_format win0_format = lcdc_dev->driver.win[0]->area[0].format;
+       enum data_format win1_format = lcdc_dev->driver.win[1]->area[0].format;
 
        int win0_alpha_en = ((win0_format == ARGB888) ||
                                (win0_format == ABGR888)) ? 1 : 0;
@@ -252,8 +252,8 @@ static void lcdc_layer_update_regs(struct lcdc_device *lcdc_dev,
                if (win->id == 0) {
                        mask = m_WIN0_EN | m_WIN0_FORMAT | m_WIN0_RB_SWAP;
                        val = v_WIN0_EN(win->state) |
-                             v_WIN0_FORMAT(win->fmt_cfg) |
-                             v_WIN0_RB_SWAP(win->swap_rb);
+                             v_WIN0_FORMAT(win->area[0].fmt_cfg) |
+                             v_WIN0_RB_SWAP(win->area[0].swap_rb);
                        lcdc_msk_reg(lcdc_dev, SYS_CTRL, mask, val);
                        lcdc_writel(lcdc_dev, WIN0_SCL_FACTOR_YRGB,
                                    v_X_SCL_FACTOR(win->scale_yrgb_x) |
@@ -282,8 +282,8 @@ static void lcdc_layer_update_regs(struct lcdc_device *lcdc_dev,
                } else if (win->id == 1) {
                        mask = m_WIN1_EN | m_WIN1_FORMAT | m_WIN1_RB_SWAP;
                        val = v_WIN1_EN(win->state) |
-                             v_WIN1_FORMAT(win->fmt_cfg) |
-                             v_WIN1_RB_SWAP(win->swap_rb);
+                             v_WIN1_FORMAT(win->area[0].fmt_cfg) |
+                             v_WIN1_RB_SWAP(win->area[0].swap_rb);
                        lcdc_msk_reg(lcdc_dev, SYS_CTRL, mask, val);
                        lcdc_writel(lcdc_dev, WIN1_SCL_FACTOR_YRGB,
                                    v_X_SCL_FACTOR(win->scale_yrgb_x) |
@@ -823,35 +823,35 @@ static int rk3036_lcdc_set_par(struct rk_lcdc_driver *dev_drv, int win_id)
        win->scale_yrgb_x = calscale(win->area[0].xact, win->post_cfg.xsize);
        win->scale_yrgb_y = calscale(win->area[0].yact, win->post_cfg.ysize);
 
-       switch (win->format) {
+       switch (win->area[0].format) {
        case ARGB888:
-               win->fmt_cfg = VOP_FORMAT_ARGB888;
-               win->swap_rb = 0;
+               win->area[0].fmt_cfg = VOP_FORMAT_ARGB888;
+               win->area[0].swap_rb = 0;
                break;
        case XBGR888:
-               win->fmt_cfg = VOP_FORMAT_ARGB888;
-               win->swap_rb = 1;
+               win->area[0].fmt_cfg = VOP_FORMAT_ARGB888;
+               win->area[0].swap_rb = 1;
                break;
        case ABGR888:
-               win->fmt_cfg = VOP_FORMAT_ARGB888;
-               win->swap_rb = 1;
+               win->area[0].fmt_cfg = VOP_FORMAT_ARGB888;
+               win->area[0].swap_rb = 1;
                break;
        case RGB888:
-               win->fmt_cfg = VOP_FORMAT_RGB888;
-               win->swap_rb = 0;
+               win->area[0].fmt_cfg = VOP_FORMAT_RGB888;
+               win->area[0].swap_rb = 0;
                break;
        case RGB565:
-               win->fmt_cfg = VOP_FORMAT_RGB565;
-               win->swap_rb = 0;
+               win->area[0].fmt_cfg = VOP_FORMAT_RGB565;
+               win->area[0].swap_rb = 0;
                break;
        case YUV444:
                if (win_id == 0) {
-                       win->fmt_cfg = VOP_FORMAT_YCBCR444;
+                       win->area[0].fmt_cfg = VOP_FORMAT_YCBCR444;
                        win->scale_cbcr_x = calscale(win->area[0].xact,
                                                     win->post_cfg.xsize);
                        win->scale_cbcr_y = calscale(win->area[0].yact,
                                                     win->post_cfg.ysize);
-                       win->swap_rb = 0;
+                       win->area[0].swap_rb = 0;
                } else {
                        dev_err(lcdc_dev->driver.dev,
                                "%s:un supported format!\n",
@@ -860,12 +860,12 @@ static int rk3036_lcdc_set_par(struct rk_lcdc_driver *dev_drv, int win_id)
                break;
        case YUV422:
                if (win_id == 0) {
-                       win->fmt_cfg = VOP_FORMAT_YCBCR422;
+                       win->area[0].fmt_cfg = VOP_FORMAT_YCBCR422;
                        win->scale_cbcr_x = calscale((win->area[0].xact / 2),
                                                     win->post_cfg.xsize);
                        win->scale_cbcr_y = calscale(win->area[0].yact,
                                                     win->post_cfg.ysize);
-                       win->swap_rb = 0;
+                       win->area[0].swap_rb = 0;
                } else {
                        dev_err(lcdc_dev->driver.dev,
                                "%s:un supported format!\n",
@@ -874,12 +874,12 @@ static int rk3036_lcdc_set_par(struct rk_lcdc_driver *dev_drv, int win_id)
                break;
        case YUV420:
                if (win_id == 0) {
-                       win->fmt_cfg = VOP_FORMAT_YCBCR420;
+                       win->area[0].fmt_cfg = VOP_FORMAT_YCBCR420;
                        win->scale_cbcr_x = calscale(win->area[0].xact / 2,
                                                     win->post_cfg.xsize);
                        win->scale_cbcr_y = calscale(win->area[0].yact / 2,
                                                     win->post_cfg.ysize);
-                       win->swap_rb = 0;
+                       win->area[0].swap_rb = 0;
                } else {
                        dev_err(lcdc_dev->driver.dev,
                                "%s:un supported format!\n",
@@ -896,7 +896,7 @@ static int rk3036_lcdc_set_par(struct rk_lcdc_driver *dev_drv, int win_id)
        DBG(2, "lcdc%d>>%s\n"
                ">>format:%s>>>xact:%d>>yact:%d>>xsize:%d>>ysize:%d\n"
                ">>xvir:%d>>yvir:%d>>xpos:%d>>ypos:%d>>\n", lcdc_dev->id,
-               __func__, get_format_string(win->format, fmt),
+               __func__, get_format_string(win->area[0].format, fmt),
                win->area[0].xact, win->area[0].yact, win->post_cfg.xsize,
                win->post_cfg.ysize, win->area[0].xvir, win->area[0].yvir,
                win->post_cfg.xpos, win->post_cfg.ypos);
@@ -1487,7 +1487,7 @@ static ssize_t rk3036_lcdc_get_disp_info(struct rk_lcdc_driver *dev_drv,
        }
 
        size = snprintf(buf, PAGE_SIZE, "win%d: %s\n", win_id,
-                       get_format_string(win->format, fmt));
+                       get_format_string(win->area[0].format, fmt));
        size += snprintf(buf + size, PAGE_SIZE - size,
                         "      xact %d yact %d xvir %d yvir %d\n",
                win->area[0].xact, win->area[0].yact,
index 258177ba482189a21ad8a547d0f3f6e61cf21dd2..82347910f19af88cca8cf7162fc65b3cb3e124d0 100755 (executable)
@@ -285,8 +285,8 @@ static int rk312x_lcdc_alpha_cfg(struct lcdc_device *lcdc_dev)
 {
        int win0_top = 0;
        u32 mask, val;
-       enum data_format win0_format = lcdc_dev->driver.win[0]->format;
-       enum data_format win1_format = lcdc_dev->driver.win[1]->format;
+       enum data_format win0_format = lcdc_dev->driver.win[0]->area[0].format;
+       enum data_format win1_format = lcdc_dev->driver.win[1]->area[0].format;
 
        int win0_alpha_en = ((win0_format == ARGB888) ||
                                (win0_format == ABGR888)) ? 1 : 0;
@@ -367,7 +367,7 @@ static void lcdc_layer_csc_mode(struct lcdc_device *lcdc_dev,
        struct rk_screen *screen = dev_drv->cur_screen;
 
        if (dev_drv->overlay_mode == VOP_YUV_DOMAIN) {
-               switch (win->fmt_cfg) {
+               switch (win->area[0].fmt_cfg) {
                case VOP_FORMAT_ARGB888:
                case VOP_FORMAT_RGB888:
                case VOP_FORMAT_RGB565:
@@ -389,7 +389,7 @@ static void lcdc_layer_csc_mode(struct lcdc_device *lcdc_dev,
                                     v_WIN1_CSC_MODE(win->csc_mode));
                }
        } else if (dev_drv->overlay_mode == VOP_RGB_DOMAIN) {
-               switch (win->fmt_cfg) {
+               switch (win->area[0].fmt_cfg) {
                case VOP_FORMAT_YCBCR420:
                        if (win->id  == 0) {
                                win->csc_mode = VOP_Y2R_CSC_MPEG;
@@ -418,8 +418,8 @@ static void lcdc_layer_update_regs(struct lcdc_device *lcdc_dev,
                if (win->id == 0) {
                        mask = m_WIN0_EN | m_WIN0_FORMAT | m_WIN0_RB_SWAP;
                        val = v_WIN0_EN(win->state) |
-                               v_WIN0_FORMAT(win->fmt_cfg) |
-                               v_WIN0_RB_SWAP(win->swap_rb);
+                               v_WIN0_FORMAT(win->area[0].fmt_cfg) |
+                               v_WIN0_RB_SWAP(win->area[0].swap_rb);
                        lcdc_msk_reg(lcdc_dev, SYS_CTRL, mask, val);
                        lcdc_writel(lcdc_dev, WIN0_SCL_FACTOR_YRGB,
                                    v_X_SCL_FACTOR(win->scale_yrgb_x) |
@@ -449,8 +449,8 @@ static void lcdc_layer_update_regs(struct lcdc_device *lcdc_dev,
                } else if (win->id == 1) {
                        mask = m_WIN1_EN | m_WIN1_FORMAT | m_WIN1_RB_SWAP;
                        val = v_WIN1_EN(win->state) |
-                                       v_WIN1_FORMAT(win->fmt_cfg) |
-                                       v_WIN1_RB_SWAP(win->swap_rb);
+                                       v_WIN1_FORMAT(win->area[0].fmt_cfg) |
+                                       v_WIN1_RB_SWAP(win->area[0].swap_rb);
                        lcdc_msk_reg(lcdc_dev, SYS_CTRL, mask, val);
                        /* rk312x unsupport win1 scale */
                        if (lcdc_dev->soc_type == VOP_RK3036) {
@@ -1482,35 +1482,35 @@ static int rk312x_lcdc_set_par(struct rk_lcdc_driver *dev_drv, int win_id)
        win->scale_yrgb_x = CalScale(win->area[0].xact, win->area[0].xsize);
        win->scale_yrgb_y = CalScale(win->area[0].yact, win->area[0].ysize);
 
-       switch (win->format) {
+       switch (win->area[0].format) {
        case ARGB888:
-               win->fmt_cfg = VOP_FORMAT_ARGB888;
-               win->swap_rb = 0;
+               win->area[0].fmt_cfg = VOP_FORMAT_ARGB888;
+               win->area[0].swap_rb = 0;
                break;
        case XBGR888:
-               win->fmt_cfg = VOP_FORMAT_ARGB888;
-               win->swap_rb = 1;
+               win->area[0].fmt_cfg = VOP_FORMAT_ARGB888;
+               win->area[0].swap_rb = 1;
                break;
        case ABGR888:
-               win->fmt_cfg = VOP_FORMAT_ARGB888;
-               win->swap_rb = 1;
+               win->area[0].fmt_cfg = VOP_FORMAT_ARGB888;
+               win->area[0].swap_rb = 1;
                break;
        case RGB888:
-               win->fmt_cfg = VOP_FORMAT_RGB888;
-               win->swap_rb = 0;
+               win->area[0].fmt_cfg = VOP_FORMAT_RGB888;
+               win->area[0].swap_rb = 0;
                break;
        case RGB565:
-               win->fmt_cfg = VOP_FORMAT_RGB565;
-               win->swap_rb = 0;
+               win->area[0].fmt_cfg = VOP_FORMAT_RGB565;
+               win->area[0].swap_rb = 0;
                break;
        case YUV444:
                if (win_id == 0) {
-                       win->fmt_cfg = VOP_FORMAT_YCBCR444;
+                       win->area[0].fmt_cfg = VOP_FORMAT_YCBCR444;
                        win->scale_cbcr_x =
                            CalScale(win->area[0].xact, win->area[0].xsize);
                        win->scale_cbcr_y =
                            CalScale(win->area[0].yact, win->area[0].ysize);
-                       win->swap_rb = 0;
+                       win->area[0].swap_rb = 0;
                } else {
                        dev_err(lcdc_dev->driver.dev,
                                "%s:un supported format!\n", __func__);
@@ -1518,12 +1518,12 @@ static int rk312x_lcdc_set_par(struct rk_lcdc_driver *dev_drv, int win_id)
                break;
        case YUV422:
                if (win_id == 0) {
-                       win->fmt_cfg = VOP_FORMAT_YCBCR422;
+                       win->area[0].fmt_cfg = VOP_FORMAT_YCBCR422;
                        win->scale_cbcr_x = CalScale((win->area[0].xact / 2),
                                            win->area[0].xsize);
                        win->scale_cbcr_y =
                            CalScale(win->area[0].yact, win->area[0].ysize);
-                       win->swap_rb = 0;
+                       win->area[0].swap_rb = 0;
                } else {
                        dev_err(lcdc_dev->driver.dev,
                                "%s:un supported format!\n", __func__);
@@ -1531,12 +1531,12 @@ static int rk312x_lcdc_set_par(struct rk_lcdc_driver *dev_drv, int win_id)
                break;
        case YUV420:
                if (win_id == 0) {
-                       win->fmt_cfg = VOP_FORMAT_YCBCR420;
+                       win->area[0].fmt_cfg = VOP_FORMAT_YCBCR420;
                        win->scale_cbcr_x =
                            CalScale(win->area[0].xact / 2, win->area[0].xsize);
                        win->scale_cbcr_y =
                            CalScale(win->area[0].yact / 2, win->area[0].ysize);
-                       win->swap_rb = 0;
+                       win->area[0].swap_rb = 0;
                } else {
                        dev_err(lcdc_dev->driver.dev,
                                "%s:un supported format!\n", __func__);
@@ -1552,7 +1552,7 @@ static int rk312x_lcdc_set_par(struct rk_lcdc_driver *dev_drv, int win_id)
        DBG(1,
            "lcdc%d>>%s\n>>format:%s>>>xact:%d>>yact:%d>>xsize:%d>>ysize:%d\n"
            ">>xvir:%d>>yvir:%d>>xpos:%d>>ypos:%d>>\n", lcdc_dev->id, __func__,
-           get_format_string(win->format, fmt), win->area[0].xact,
+           get_format_string(win->area[0].format, fmt), win->area[0].xact,
            win->area[0].yact, win->area[0].xsize, win->area[0].ysize,
            win->area[0].xvir, win->area[0].yvir, win->area[0].xpos,
            win->area[0].ypos);
index ff2dcb638a2ccde49c2a806e86cba1391f1cc016..b1eb96793a4bafcb6df2f07502b809b7209f3e4a 100755 (executable)
@@ -173,10 +173,10 @@ static void rk3188_lcdc_read_reg_defalut_cfg(struct lcdc_device
                                lcdc_dev->atv_layer_cnt = win0->state;
                        else
                                lcdc_dev->atv_layer_cnt = win1->state;
-                       win0->swap_rb = (value & m_WIN0_RB_SWAP) >> 15;
-                       win1->swap_rb = (value & m_WIN1_RB_SWAP) >> 19;
-                       win0->fmt_cfg = (value & m_WIN0_FORMAT) >> 3;
-                       win1->fmt_cfg = (value & m_WIN1_FORMAT) >> 6;
+                       win0->area[0].swap_rb = (value & m_WIN0_RB_SWAP) >> 15;
+                       win1->area[0].swap_rb = (value & m_WIN1_RB_SWAP) >> 19;
+                       win0->area[0].fmt_cfg = (value & m_WIN0_FORMAT) >> 3;
+                       win1->area[0].fmt_cfg = (value & m_WIN1_FORMAT) >> 6;
                        break;
                case WIN0_SCL_FACTOR_YRGB:
                        win0->scale_yrgb_x = (value >> 0) & 0xffff;
@@ -325,8 +325,8 @@ static int rk3188_lcdc_alpha_cfg(struct lcdc_device *lcdc_dev)
 {
        int win0_top = 0;
        u32 mask, val;
-       enum data_format win0_format = lcdc_dev->driver.win[0]->format;
-       enum data_format win1_format = lcdc_dev->driver.win[1]->format;
+       enum data_format win0_format = lcdc_dev->driver.win[0]->area[0].format;
+       enum data_format win1_format = lcdc_dev->driver.win[1]->area[0].format;
 
        int win0_alpha_en = ((win0_format == ARGB888)
                             || (win0_format == ABGR888)) ? 1 : 0;
@@ -376,15 +376,16 @@ static int rk3188_lcdc_reg_update(struct rk_lcdc_driver *dev_drv)
                             m_WIN0_EN | m_WIN1_EN | m_WIN0_RB_SWAP |
                             m_WIN1_RB_SWAP,
                             v_WIN0_EN(win0->state) | v_WIN1_EN(win1->state) |
-                            v_WIN0_RB_SWAP(win0->swap_rb) |
-                            v_WIN1_RB_SWAP(win1->swap_rb));
+                            v_WIN0_RB_SWAP(win0->area[0].swap_rb) |
+                            v_WIN1_RB_SWAP(win1->area[0].swap_rb));
                lcdc_writel(lcdc_dev, WIN0_SCL_FACTOR_YRGB,
                            v_X_SCL_FACTOR(win0->scale_yrgb_x) |
                            v_Y_SCL_FACTOR(win0->scale_yrgb_y));
                lcdc_writel(lcdc_dev, WIN0_SCL_FACTOR_CBR,
                            v_X_SCL_FACTOR(win0->scale_cbcr_x) |
                            v_Y_SCL_FACTOR(win0->scale_cbcr_y));
-               lcdc_msk_reg(lcdc_dev, SYS_CTRL, m_WIN0_FORMAT, v_WIN0_FORMAT(win0->fmt_cfg));
+               lcdc_msk_reg(lcdc_dev, SYS_CTRL, m_WIN0_FORMAT,
+                            v_WIN0_FORMAT(win0->area[0].fmt_cfg));
                lcdc_writel(lcdc_dev, WIN0_ACT_INFO, v_ACT_WIDTH(win0->area[0].xact) |
                            v_ACT_HEIGHT(win0->area[0].yact));
                lcdc_writel(lcdc_dev, WIN0_DSP_ST, v_DSP_STX(win0->area[0].dsp_stx) |
@@ -399,9 +400,10 @@ static int rk3188_lcdc_reg_update(struct rk_lcdc_driver *dev_drv)
                            v_DSP_HEIGHT(win1->area[0].ysize));
                lcdc_writel(lcdc_dev, WIN1_DSP_ST, v_DSP_STX(win1->area[0].dsp_stx) |
                            v_DSP_STY(win1->area[0].dsp_sty));
-               lcdc_msk_reg(lcdc_dev, WIN_VIR, m_WIN1_VIR, ((win1->area[0].y_vir_stride)&0x1fff)<<16);
+               lcdc_msk_reg(lcdc_dev, WIN_VIR, m_WIN1_VIR,
+                            ((win1->area[0].y_vir_stride)&0x1fff)<<16);
                lcdc_msk_reg(lcdc_dev, SYS_CTRL, m_WIN1_FORMAT,
-                            v_WIN1_FORMAT(win1->fmt_cfg));
+                            v_WIN1_FORMAT(win1->area[0].fmt_cfg));
                lcdc_writel(lcdc_dev, WIN1_MST, win1->area[0].y_addr);
                rk3188_lcdc_alpha_cfg(lcdc_dev);
                lcdc_cfg_done(lcdc_dev);
@@ -758,7 +760,7 @@ static int win0_set_par(struct lcdc_device *lcdc_dev,
 
        ScaleYrgbX = CalScale(xact, win->area[0].xsize);
        ScaleYrgbY = CalScale(yact, win->area[0].ysize);
-       switch (win->format) {
+       switch (win->area[0].format) {
        case ARGB888:
        case XBGR888:
        case ABGR888:
@@ -793,7 +795,7 @@ static int win0_set_par(struct lcdc_device *lcdc_dev,
 
        DBG(1, "lcdc%d>>%s\n>>format:%s>>>xact:%d>>yact:%d>>xsize:%d>>ysize:%d\n"
                ">>xvir:%d>>yvir:%d>>xpos:%d>>ypos:%d>>\n", lcdc_dev->id,
-               __func__, get_format_string(win->format, fmt), xact,
+               __func__, get_format_string(win->area[0].format, fmt), xact,
                yact, win->area[0].xsize, win->area[0].ysize, xvir, yvir, xpos, ypos);
 
        spin_lock(&lcdc_dev->reg_lock);
@@ -802,28 +804,28 @@ static int win0_set_par(struct lcdc_device *lcdc_dev,
        win->scale_yrgb_y = ScaleYrgbY;
        win->scale_cbcr_x = ScaleCbrX;
        win->scale_cbcr_y = ScaleCbrY;
-       win->fmt_cfg = fmt_cfg;
+       win->area[0].fmt_cfg = fmt_cfg;
        win->area[0].dsp_stx = xpos;
        win->area[0].dsp_sty = ypos;
        
-       switch (win->format) {
+       switch (win->area[0].format) {
        case XBGR888:
        case ABGR888:
-               win->swap_rb = 1;
+               win->area[0].swap_rb = 1;
                break;
        case ARGB888:
-               win->swap_rb = 0;
+               win->area[0].swap_rb = 0;
                break;
        case RGB888:
-               win->swap_rb = 0;
+               win->area[0].swap_rb = 0;
                break;
        case RGB565:
-               win->swap_rb = 0;
+               win->area[0].swap_rb = 0;
                break;
        case YUV422:
        case YUV420:
        case YUV444:
-               win->swap_rb = 0;
+               win->area[0].swap_rb = 0;
                break;
        default:
                dev_err(lcdc_dev->driver.dev,
@@ -842,7 +844,8 @@ static int win0_set_par(struct lcdc_device *lcdc_dev,
                                                v_DSP_HEIGHT(win->area[0].ysize));
                lcdc_msk_reg(lcdc_dev, WIN_VIR, m_WIN0_VIR, v_WIN0_VIR_VAL(win->area[0].y_vir_stride));
                lcdc_msk_reg(lcdc_dev, SYS_CTRL, m_WIN0_EN | m_WIN0_RB_SWAP,
-                               v_WIN0_EN(win->state) | v_WIN0_RB_SWAP(win->swap_rb));
+                            v_WIN0_EN(win->state) |
+                            v_WIN0_RB_SWAP(win->area[0].swap_rb));
                lcdc_msk_reg(lcdc_dev, WIN0_COLOR_KEY, m_COLOR_KEY_EN, v_COLOR_KEY_EN(0));
        }
        spin_unlock(&lcdc_dev->reg_lock);
@@ -866,45 +869,48 @@ static int win1_set_par(struct lcdc_device *lcdc_dev,
 
        DBG(1, "lcdc%d>>%s>>format:%s>>>xact:%d>>yact:%d>>xsize:%d>>ysize:%d\n"
                ">>xvir:%d>>yvir:%d>>xpos:%d>>ypos:%d>>\n", lcdc_dev->id,
-               __func__, get_format_string(win->format, fmt), xact, yact,
-               win->area[0].xsize, win->area[0].ysize, xvir, yvir, xpos, ypos);
+               __func__, get_format_string(win->area[0].format, fmt),
+               xact, yact, win->area[0].xsize, win->area[0].ysize,
+               xvir, yvir, xpos, ypos);
 
        spin_lock(&lcdc_dev->reg_lock);
        win->area[0].dsp_stx = xpos;
        win->area[0].dsp_sty = ypos;
-       switch (win->format) {
+       switch (win->area[0].format) {
        case XBGR888:
        case ABGR888:
                fmt_cfg = 0;
-               win->swap_rb = 1;
+               win->area[0].swap_rb = 1;
                break;
        case ARGB888:
                fmt_cfg = 0;
-               win->swap_rb = 0;
+               win->area[0].swap_rb = 0;
 
                break;
        case RGB888:
                fmt_cfg = 1;
-               win->swap_rb = 0;
+               win->area[0].swap_rb = 0;
                break;
        case RGB565:
                fmt_cfg = 2;
-               win->swap_rb = 0;
+               win->area[0].swap_rb = 0;
                break;
        default:
                dev_err(lcdc_dev->driver.dev,
                        "%s:un supported format!\n", __func__);
                break;
        }
-       win->fmt_cfg = fmt_cfg;
+       win->area[0].fmt_cfg = fmt_cfg;
        if (likely(lcdc_dev->clk_on)) {
                lcdc_writel(lcdc_dev, WIN1_DSP_INFO,v_DSP_WIDTH(win->area[0].xsize) |
                                                        v_DSP_HEIGHT(win->area[0].ysize));
                lcdc_writel(lcdc_dev, WIN1_DSP_ST,v_DSP_STX(xpos) | v_DSP_STY(ypos));
                lcdc_msk_reg(lcdc_dev, SYS_CTRL, m_WIN1_EN | m_WIN1_RB_SWAP,
-                               v_WIN1_EN(win->state) | v_WIN1_RB_SWAP(win->swap_rb));
+                            v_WIN1_EN(win->state) |
+                            v_WIN1_RB_SWAP(win->area[0].swap_rb));
                lcdc_msk_reg(lcdc_dev, SYS_CTRL,m_WIN1_FORMAT, v_WIN1_FORMAT(fmt_cfg));
-               lcdc_msk_reg(lcdc_dev, WIN_VIR, m_WIN1_VIR, ((win->area[0].y_vir_stride)&0x1fff)<<16);  
+               lcdc_msk_reg(lcdc_dev, WIN_VIR, m_WIN1_VIR,
+                            ((win->area[0].y_vir_stride)&0x1fff)<<16);
        }
        spin_unlock(&lcdc_dev->reg_lock);
 
index a6b405e4294c3c78a5cf66b8eb7a2ccdf692962f..d2431abffef1f434301d391c6c754212e41aba74 100755 (executable)
@@ -312,22 +312,23 @@ static void lcdc_read_reg_defalut_cfg(struct lcdc_device *lcdc_dev)
                                break;
                        case WIN0_CTRL0:
                                win0->state = val & m_WIN0_EN;
-                               win0->fmt_cfg = (val & m_WIN0_DATA_FMT) >> 1;
+                               win0->area[0].fmt_cfg =
+                                       (val & m_WIN0_DATA_FMT) >> 1;
                                win0->fmt_10 = (val & m_WIN0_FMT_10) >> 4;
-                               win0->format = win0->fmt_cfg;
+                               win0->area[0].format = win0->area[0].fmt_cfg;
                                break;
                        case WIN0_VIR:
                                win0->area[0].y_vir_stride =
                                        val & m_WIN0_VIR_STRIDE;
                                win0->area[0].uv_vir_stride =
                                        (val & m_WIN0_VIR_STRIDE_UV) >> 16;
-                               if (win0->format == ARGB888)
+                               if (win0->area[0].format == ARGB888)
                                        win0->area[0].xvir =
                                                win0->area[0].y_vir_stride;
-                               else if (win0->format == RGB888)
+                               else if (win0->area[0].format == RGB888)
                                        win0->area[0].xvir =
                                                win0->area[0].y_vir_stride * 4 / 3;
-                               else if (win0->format == RGB565)
+                               else if (win0->area[0].format == RGB565)
                                        win0->area[0].xvir =
                                                2 * win0->area[0].y_vir_stride;
                                else /* YUV */
@@ -376,6 +377,7 @@ static int rk3288_lcdc_pre_init(struct rk_lcdc_driver *dev_drv)
 
        /*backup reg config at uboot*/
        lcdc_read_reg_defalut_cfg(lcdc_dev);
+       v = 0;
 #ifndef CONFIG_RK_FPGA
        if (lcdc_dev->pwr18 == true) {
                v = 0x00010001; /*bit14: 1,1.8v;0,3.3v*/
@@ -580,7 +582,8 @@ static int rk3288_lcdc_alpha_cfg(struct rk_lcdc_driver *dev_drv,int win_id)
        u32 mask, val;
        int ppixel_alpha,global_alpha;
        u32 src_alpha_ctl,dst_alpha_ctl;
-       ppixel_alpha = ((win->format == ARGB888)||(win->format == ABGR888)) ? 1 : 0;
+       ppixel_alpha = ((win->area[0].format == ARGB888) ||
+                       (win->area[0].format == ABGR888)) ? 1 : 0;
        global_alpha = (win->g_alpha_val == 0) ? 0 : 1; 
        alpha_config.src_global_alpha_val = win->g_alpha_val;
        win->alpha_mode = AB_SRC_OVER;
@@ -765,10 +768,11 @@ static int rk3288_win_0_1_reg_update(struct rk_lcdc_driver *dev_drv,int win_id)
        if(win->state == 1){
                mask =  m_WIN0_EN | m_WIN0_DATA_FMT | m_WIN0_FMT_10 |
                        m_WIN0_LB_MODE | m_WIN0_RB_SWAP;
-               val  =  v_WIN0_EN(win->state) | v_WIN0_DATA_FMT(win->fmt_cfg) |
+               val  =  v_WIN0_EN(win->state) |
+                       v_WIN0_DATA_FMT(win->area[0].fmt_cfg) |
                        v_WIN0_FMT_10(win->fmt_10) | 
                        v_WIN0_LB_MODE(win->win_lb_mode) | 
-                       v_WIN0_RB_SWAP(win->swap_rb);
+                       v_WIN0_RB_SWAP(win->area[0].swap_rb);
                lcdc_msk_reg(lcdc_dev, WIN0_CTRL0+off, mask,val);       
        
                mask =  m_WIN0_BIC_COE_SEL |
@@ -850,8 +854,9 @@ static int rk3288_win_2_3_reg_update(struct rk_lcdc_driver *dev_drv,int win_id)
        
        if(win->state == 1){
                mask =  m_WIN2_EN | m_WIN2_DATA_FMT | m_WIN2_RB_SWAP;
-               val  =  v_WIN2_EN(1) | v_WIN2_DATA_FMT(win->fmt_cfg) |
-                       v_WIN2_RB_SWAP(win->swap_rb);   
+               val  =  v_WIN2_EN(1) |
+                       v_WIN2_DATA_FMT(win->area[0].fmt_cfg) |
+                       v_WIN2_RB_SWAP(win->area[0].swap_rb);
                lcdc_msk_reg(lcdc_dev,WIN2_CTRL0+off,mask,val);
                /*area 0*/
                if(win->area[0].state == 1){
@@ -1206,7 +1211,8 @@ static int rk3288_load_screen(struct rk_lcdc_driver *dev_drv, bool initscreen)
        }
        spin_unlock(&lcdc_dev->reg_lock);
        rk3288_lcdc_set_dclk(dev_drv);
-       if (dev_drv->trsm_ops && dev_drv->trsm_ops->enable)
+       if (screen->type != SCREEN_HDMI && dev_drv->trsm_ops &&
+           dev_drv->trsm_ops->enable)
                dev_drv->trsm_ops->enable();
        if (screen->init)
                screen->init();
@@ -1597,8 +1603,7 @@ static int rk3288_lcdc_cal_scl_fac(struct rk_lcdc_win *win)
        yrgb_srcH = srcH;
        yrgb_dstW = dstW;
        yrgb_dstH = dstH;
-       if ((yrgb_dstW >= yrgb_srcW*8) || (yrgb_dstH >= yrgb_srcH*8) ||
-               (yrgb_dstW*8 <= yrgb_srcW) || (yrgb_dstH*8 <= yrgb_srcH)) {
+       if ((yrgb_dstW*8 <= yrgb_srcW) || (yrgb_dstH*8 <= yrgb_srcH)) {
                pr_err("ERROR: yrgb scale exceed 8,"
                       "srcW=%d,srcH=%d,dstW=%d,dstH=%d\n",
                       yrgb_srcW,yrgb_srcH,yrgb_dstW,yrgb_dstH);
@@ -1620,7 +1625,7 @@ static int rk3288_lcdc_cal_scl_fac(struct rk_lcdc_win *win)
        }
 
        /*cbcr scl mode*/
-       switch (win->format) {
+       switch (win->area[0].format) {
        case YUV422:
        case YUV422_A:  
                cbcr_srcW = srcW/2;
@@ -1654,8 +1659,7 @@ static int rk3288_lcdc_cal_scl_fac(struct rk_lcdc_win *win)
                break;
        }               
        if (yuv_fmt) {
-               if ((cbcr_dstW >= cbcr_srcW*8) || (cbcr_dstH >= cbcr_srcH*8) ||
-                       (cbcr_dstW*8 <= cbcr_srcW)||(cbcr_dstH*8 <= cbcr_srcH)) {
+               if ((cbcr_dstW*8 <= cbcr_srcW) || (cbcr_dstH*8 <= cbcr_srcH)) {
                        pr_err("ERROR: cbcr scale exceed 8,"
                       "srcW=%d,srcH=%d,dstW=%d,dstH=%d\n",
                       cbcr_srcW,cbcr_srcH,cbcr_dstW,cbcr_dstH);
@@ -1686,14 +1690,17 @@ static int rk3288_lcdc_cal_scl_fac(struct rk_lcdc_win *win)
                win->cbr_hor_scl_mode,win->cbr_ver_scl_mode);
 
     /*line buffer mode*/
-       if((win->format == YUV422) || (win->format == YUV420) || (win->format == YUV422_A) || (win->format == YUV420_A)){
-               if(win->cbr_hor_scl_mode == SCALE_DOWN){
+       if ((win->area[0].format == YUV422) ||
+           (win->area[0].format == YUV420) ||
+           (win->area[0].format == YUV422_A) ||
+           (win->area[0].format == YUV420_A)) {
+               if (win->cbr_hor_scl_mode == SCALE_DOWN) {
                        if ((cbcr_dstW > 3840) || (cbcr_dstW == 0)) {
                                pr_err("ERROR cbcr_dstW = %d\n",cbcr_dstW);                
-                       }else if(cbcr_dstW > 2560){
+                       } else if (cbcr_dstW > 2560) {
                                win->win_lb_mode = LB_RGB_3840X2;
-                       }else if(cbcr_dstW > 1920){
-                               if(win->yrgb_hor_scl_mode == SCALE_DOWN){
+                       } else if (cbcr_dstW > 1920) {
+                               if (win->yrgb_hor_scl_mode == SCALE_DOWN) {
                                        if(yrgb_dstW > 3840){
                                                pr_err("ERROR yrgb_dst_width exceeds 3840\n");
                                        }else if(yrgb_dstW > 2560){
@@ -1703,13 +1710,13 @@ static int rk3288_lcdc_cal_scl_fac(struct rk_lcdc_win *win)
                                        }else{
                                                pr_err("ERROR never run here!yrgb_dstW<1920 ==> cbcr_dstW>1920\n");
                                        }
-                               }
-                       }else if(cbcr_dstW > 1280){
+                               }
+                       } else if (cbcr_dstW > 1280) {
                                win->win_lb_mode = LB_YUV_3840X5;
-                       }else{
+                       } else {
                                win->win_lb_mode = LB_YUV_2560X8;
                        }            
-               } else { /*SCALE_UP or SCALE_NONE*/
+               } else { /*SCALE_UP or SCALE_NONE*/
                        if ((cbcr_srcW > 3840) || (cbcr_srcW == 0)) {
                                pr_err("ERROR cbcr_srcW = %d\n",cbcr_srcW);
                        }else if(cbcr_srcW > 2560){                
@@ -1989,7 +1996,7 @@ static int win0_set_par(struct lcdc_device *lcdc_dev,
                        struct rk_screen *screen, struct rk_lcdc_win *win)
 {
        u32 xact,yact,xvir, yvir,xpos, ypos;
-       u8 fmt_cfg = 0;
+       u8 fmt_cfg = 0, swap_rb;
        char fmt[9] = "NULL";
 
        xpos = win->area[0].xpos + screen->mode.left_margin + screen->mode.hsync_len;
@@ -1998,55 +2005,55 @@ static int win0_set_par(struct lcdc_device *lcdc_dev,
        spin_lock(&lcdc_dev->reg_lock);
        if(likely(lcdc_dev->clk_on)){
                rk3288_lcdc_cal_scl_fac(win);/*fac,lb,gt2,gt4*/
-               switch (win->format){
+               switch (win->area[0].format) {
                case ARGB888:
                        fmt_cfg = 0;
-                       win->swap_rb = 0;
+                       swap_rb = 0;
                        win->fmt_10 = 0;
                        break;
                case XBGR888:
                case ABGR888:
                        fmt_cfg = 0;
-                       win->swap_rb = 1;
+                       swap_rb = 1;
                        win->fmt_10 = 0;
                        break;
                case RGB888:
                        fmt_cfg = 1;
-                       win->swap_rb = 0;
+                       swap_rb = 0;
                        win->fmt_10 = 0;
                        break;
                case RGB565:
                        fmt_cfg = 2;
-                       win->swap_rb = 0;
+                       swap_rb = 0;
                        win->fmt_10 = 0;
                        break;
                case YUV422:
                        fmt_cfg = 5;
-                       win->swap_rb = 0;
+                       swap_rb = 0;
                        win->fmt_10 = 0;
                        break;
                case YUV420:    
                        fmt_cfg = 4;
-                       win->swap_rb = 0;
+                       swap_rb = 0;
                        win->fmt_10 = 0;
                        break;
                case YUV444:    
                        fmt_cfg = 6;
-                       win->swap_rb = 0;
+                       swap_rb = 0;
                        win->fmt_10 = 0;
                case YUV422_A:
                        fmt_cfg = 5;
-                       win->swap_rb = 0;
+                       swap_rb = 0;
                        win->fmt_10 = 1;
                        break;
                case YUV420_A:  
                        fmt_cfg = 4;
-                       win->swap_rb = 0;
+                       swap_rb = 0;
                        win->fmt_10 = 1;
                        break;
                case YUV444_A:  
                        fmt_cfg = 6;
-                       win->swap_rb = 0;
+                       swap_rb = 0;
                        win->fmt_10 = 1;
                        break;
                default:
@@ -2054,7 +2061,8 @@ static int win0_set_par(struct lcdc_device *lcdc_dev,
                                __func__);
                        break;
                }
-               win->fmt_cfg = fmt_cfg;
+               win->area[0].fmt_cfg = fmt_cfg;
+               win->area[0].swap_rb = swap_rb;
                win->area[0].dsp_stx = xpos;
                win->area[0].dsp_sty = ypos;
                xact = win->area[0].xact;
@@ -2067,7 +2075,7 @@ static int win0_set_par(struct lcdc_device *lcdc_dev,
 
        DBG(1, "lcdc%d>>%s\n>>format:%s>>>xact:%d>>yact:%d>>xsize:%d>>ysize:%d\n"
                ">>xvir:%d>>yvir:%d>>xpos:%d>>ypos:%d>>\n", lcdc_dev->id,
-               __func__, get_format_string(win->format, fmt), xact,
+               __func__, get_format_string(win->area[0].format, fmt), xact,
                yact, win->area[0].xsize, win->area[0].ysize, xvir, yvir, xpos, ypos);
        return 0;
 
@@ -2076,66 +2084,66 @@ static int win0_set_par(struct lcdc_device *lcdc_dev,
 static int win1_set_par(struct lcdc_device *lcdc_dev,
                        struct rk_screen *screen, struct rk_lcdc_win *win)
 {
-       u32 xact,yact,xvir, yvir,xpos, ypos;
-       u8 fmt_cfg = 0;
+       u32 xact, yact, xvir, yvir, xpos, ypos;
+       u8 fmt_cfg = 0, swap_rb;
        char fmt[9] = "NULL";
 
        xpos = win->area[0].xpos + screen->mode.left_margin + screen->mode.hsync_len;
        ypos = win->area[0].ypos + screen->mode.upper_margin + screen->mode.vsync_len;
 
        spin_lock(&lcdc_dev->reg_lock);
-       if(likely(lcdc_dev->clk_on)){
+       if (likely(lcdc_dev->clk_on)) {
                rk3288_lcdc_cal_scl_fac(win);/*fac,lb,gt2,gt4*/
-               switch (win->format){
+               switch (win->area[0].format) {
                case ARGB888:
                        fmt_cfg = 0;
-                       win->swap_rb = 0;
+                       swap_rb = 0;
                        win->fmt_10 = 0;
                        break;
                case XBGR888:
                case ABGR888:
                        fmt_cfg = 0;
-                       win->swap_rb = 1;
+                       swap_rb = 1;
                        win->fmt_10 = 0;
                        break;
                case RGB888:
                        fmt_cfg = 1;
-                       win->swap_rb = 0;
+                       swap_rb = 0;
                        win->fmt_10 = 0;
                        break;
                case RGB565:
                        fmt_cfg = 2;
-                       win->swap_rb = 0;
+                       swap_rb = 0;
                        win->fmt_10 = 0;
                        break;
                case YUV422:
                        fmt_cfg = 5;
-                       win->swap_rb = 0;
+                       swap_rb = 0;
                        win->fmt_10 = 0;
                        break;
                case YUV420:
                        fmt_cfg = 4;
-                       win->swap_rb = 0;
+                       swap_rb = 0;
                        win->fmt_10 = 0;
                        break;
                case YUV444:
                        fmt_cfg = 6;
-                       win->swap_rb = 0;
+                       swap_rb = 0;
                        win->fmt_10 = 0;
                        break;
                case YUV422_A:
                        fmt_cfg = 5;
-                       win->swap_rb = 0;
+                       swap_rb = 0;
                        win->fmt_10 = 1;
                        break;
                case YUV420_A:  
                        fmt_cfg = 4;
-                       win->swap_rb = 0;
+                       swap_rb = 0;
                        win->fmt_10 = 1;
                        break;
                case YUV444_A:  
                        fmt_cfg = 6;
-                       win->swap_rb = 0;
+                       swap_rb = 0;
                        win->fmt_10 = 1;
                        break;                  
                default:
@@ -2143,7 +2151,8 @@ static int win1_set_par(struct lcdc_device *lcdc_dev,
                                __func__);
                        break;
                }
-               win->fmt_cfg = fmt_cfg;
+               win->area[0].fmt_cfg = fmt_cfg;
+               win->area[0].swap_rb = swap_rb;
                win->area[0].dsp_stx = xpos;
                win->area[0].dsp_sty = ypos;
                xact = win->area[0].xact;
@@ -2156,7 +2165,7 @@ static int win1_set_par(struct lcdc_device *lcdc_dev,
 
        DBG(1, "lcdc%d>>%s\n>>format:%s>>>xact:%d>>yact:%d>>xsize:%d>>ysize:%d\n"
                ">>xvir:%d>>yvir:%d>>xpos:%d>>ypos:%d>>\n", lcdc_dev->id,
-               __func__, get_format_string(win->format, fmt), xact,
+               __func__, get_format_string(win->area[0].format, fmt), xact,
                yact, win->area[0].xsize, win->area[0].ysize, xvir, yvir, xpos, ypos);
        return 0;
 
@@ -2166,28 +2175,28 @@ static int win2_set_par(struct lcdc_device *lcdc_dev,
                        struct rk_screen *screen, struct rk_lcdc_win *win)
 {
        int i;
-       u8 fmt_cfg;
+       u8 fmt_cfg, swap_rb;
 
        spin_lock(&lcdc_dev->reg_lock);
-       if(likely(lcdc_dev->clk_on)){
-               for(i=0;i<win->area_num;i++){
-                       switch (win->format){
+       if (likely(lcdc_dev->clk_on)) {
+               for (i = 0; i < win->area_num; i++) {
+                       switch (win->area[i].format) {
                        case ARGB888:
                                fmt_cfg = 0;
-                               win->swap_rb = 0;
+                               swap_rb = 0;
                                break;
                        case XBGR888:
                        case ABGR888:
                                fmt_cfg = 0;
-                               win->swap_rb = 1;
+                               swap_rb = 1;
                                break;
                        case RGB888:
                                fmt_cfg = 1;
-                               win->swap_rb = 0;
+                               swap_rb = 0;
                                break;
                        case RGB565:
                                fmt_cfg = 2;
-                               win->swap_rb = 0;               
+                               swap_rb = 0;
                                break;
                        default:
                                dev_err(lcdc_dev->driver.dev, 
@@ -2195,7 +2204,8 @@ static int win2_set_par(struct lcdc_device *lcdc_dev,
                                        __func__);
                                break;
                        }                       
-                       win->fmt_cfg = fmt_cfg;
+                       win->area[i].fmt_cfg = fmt_cfg;
+                       win->area[i].swap_rb = swap_rb;
                        win->area[i].dsp_stx = win->area[i].xpos + 
                                screen->mode.left_margin +
                                screen->mode.hsync_len;
@@ -2222,28 +2232,28 @@ static int win3_set_par(struct lcdc_device *lcdc_dev,
 
 {
        int i;
-       u8 fmt_cfg;
+       u8 fmt_cfg, swap_rb;
 
        spin_lock(&lcdc_dev->reg_lock);
-       if(likely(lcdc_dev->clk_on)){
-               for(i=0;i<win->area_num;i++){
-                       switch (win->format){
+       if (likely(lcdc_dev->clk_on)) {
+               for (i = 0; i < win->area_num; i++) {
+                       switch (win->area[i].format) {
                        case ARGB888:
                                fmt_cfg = 0;
-                               win->swap_rb = 0;
+                               swap_rb = 0;
                                break;
                        case XBGR888:
                        case ABGR888:
                                fmt_cfg = 0;
-                               win->swap_rb = 1;
+                               swap_rb = 1;
                                break;
                        case RGB888:
                                fmt_cfg = 1;
-                               win->swap_rb = 0;
+                               swap_rb = 0;
                                break;
                        case RGB565:
                                fmt_cfg = 2;
-                               win->swap_rb = 0;               
+                               swap_rb = 0;
                                break;
                        default:
                                dev_err(lcdc_dev->driver.dev, 
@@ -2251,7 +2261,8 @@ static int win3_set_par(struct lcdc_device *lcdc_dev,
                                        __func__);
                                break;
                        }                       
-                       win->fmt_cfg = fmt_cfg;
+                       win->area[i].fmt_cfg = fmt_cfg;
+                       win->area[i].swap_rb = swap_rb;
                        win->area[i].dsp_stx = win->area[i].xpos + 
                                screen->mode.left_margin +
                                screen->mode.hsync_len;
index bda23eec97f92d99690823432c5dd93d25452335..29372aef5b97de72ecb0584e7108dee8c27f9cb9 100755 (executable)
 
 #define HWC_MST                        (0x0158)
 #define HWC_DSP_ST                     (0x015c)
-#define v_HWC_DSP_XST3(x)              (((x)&0x1fff)<<0)
-#define v_HWC_DSP_YST3(x)              (((x)&0x1fff)<<16)
-#define m_HWC_DSP_XST3                 (0x1fff<<0)
-#define m_HWC_DSP_YST3                 (0x1fff<<16)
+#define v_HWC_DSP_XST(x)               (((x)&0x1fff)<<0)
+#define v_HWC_DSP_YST(x)               (((x)&0x1fff)<<16)
+#define m_HWC_DSP_XST                  (0x1fff<<0)
+#define m_HWC_DSP_YST                  (0x1fff<<16)
 
 #define HWC_SRC_ALPHA_CTRL             (0x0160)
 #define v_HWC_SRC_ALPHA_EN(x)          (((x)&1)<<0)
@@ -1350,8 +1350,8 @@ struct alpha_config{
 
 struct lcdc_cabc_mode {
        u32 pixel_num;                  /* pixel precent number */
-       char stage_up;                  /* up stride */
-       char stage_down;                /* down stride */
+       u16 stage_up;                   /* up stride */
+       u16 stage_down;         /* down stride */
 };
 
 static inline void lcdc_writel(struct lcdc_device *lcdc_dev,u32 offset,u32 v)
index 530f2089ac982cb0f888ad3510fdb7e045cf00a6..78b4b869567586b9313aa1fe32d7961314df60b8 100755 (executable)
@@ -830,6 +830,10 @@ static int get_extend_fb_id(struct fb_info *info)
                fb_id = 2;
        else if (!strcmp(id, "fb3") && (dev_drv->lcdc_win_num > 3))
                fb_id = 3;
+       else if (!strcmp(id, "fb4") && (dev_drv->lcdc_win_num > 4))
+               fb_id = 4;
+       else
+               dev_err(dev_drv->dev, "get_extend_fb_id info error\n");
        return fb_id;
 }
 
@@ -1042,7 +1046,7 @@ static void rga_win_check(struct rk_lcdc_win *dst_win,
 {
        int format = 0;
 
-       format = get_rga_format(src_win->format);
+       format = get_rga_format(src_win->area[0].format);
        /* width and height must be even number */
        if (format >= RK_FORMAT_YCbCr_422_SP &&
            format <= RK_FORMAT_YCrCb_420_P) {
@@ -1056,7 +1060,7 @@ static void rga_win_check(struct rk_lcdc_win *dst_win,
        if (src_win->area[0].yvir < src_win->area[0].yact)
                src_win->area[0].yvir = src_win->area[0].yact;
 
-       format = get_rga_format(dst_win->format);
+       format = get_rga_format(dst_win->area[0].format);
        if (format >= RK_FORMAT_YCbCr_422_SP &&
            format <= RK_FORMAT_YCrCb_420_P) {
                if ((dst_win->area[0].xact % 2) != 0)
@@ -1136,7 +1140,7 @@ static void win_copy_by_rga(struct rk_lcdc_win *dst_win,
 
        Rga_Request.src.vir_w = src_win->area[0].xvir;
        Rga_Request.src.vir_h = src_win->area[0].yvir;
-       Rga_Request.src.format = get_rga_format(src_win->format);
+       Rga_Request.src.format = get_rga_format(src_win->area[0].format);
        Rga_Request.src.act_w = src_win->area[0].xact;
        Rga_Request.src.act_h = src_win->area[0].yact;
        Rga_Request.src.x_offset = 0;
@@ -1144,7 +1148,7 @@ static void win_copy_by_rga(struct rk_lcdc_win *dst_win,
 
        Rga_Request.dst.vir_w = dst_win->area[0].xvir;
        Rga_Request.dst.vir_h = dst_win->area[0].yvir;
-       Rga_Request.dst.format = get_rga_format(dst_win->format);
+       Rga_Request.dst.format = get_rga_format(dst_win->area[0].format);
 
        Rga_Request.clip.xmin = 0;
        Rga_Request.clip.xmax = dst_win->area[0].xact - 1;
@@ -1209,9 +1213,9 @@ static int rk_fb_rotate(struct fb_info *dst_info,
        return 0;
 }
 
-static int rk_fb_win_rotate(struct rk_lcdc_win *dst_win,
-                           struct rk_lcdc_win *src_win,
-                           u16 rotate, int iommu_en)
+static int __maybe_unused rk_fb_win_rotate(struct rk_lcdc_win *dst_win,
+                                           struct rk_lcdc_win *src_win,
+                                           u16 rotate, int iommu_en)
 {
 #if defined(CONFIG_ROCKCHIP_RGA) || defined(CONFIG_ROCKCHIP_RGA2)
        win_copy_by_rga(dst_win, src_win, rotate, iommu_en);
@@ -1242,7 +1246,7 @@ static int rk_fb_set_ext_win_buffer(struct rk_lcdc_win *ext_win,
        if (rk_fb->disp_mode != DUAL || ext_info == NULL)
                return 0;
 
-       switch (ext_win->format) {
+       switch (ext_win->area[0].format) {
         case YUV422:
         case YUV420:
         case YUV444:
@@ -1376,13 +1380,13 @@ static int rk_fb_pan_display(struct fb_var_screeninfo *var,
                extend_win = extend_dev_drv->win[extend_win_id];
        }
 
-       pixel_width = rk_fb_pixel_width(win->format);
+       pixel_width = rk_fb_pixel_width(win->area[0].format);
        vir_width_bit = pixel_width * xvir;
        /* pixel_width = byte_num * 8 */
        stride_32bit_1 = ALIGN_N_TIMES(vir_width_bit, 32) / 8;
        stride_32bit_2 = ALIGN_N_TIMES(vir_width_bit * 2, 32) / 8;
 
-       switch (win->format) {
+       switch (win->area[0].format) {
        case YUV422:
        case YUV422_A:
                is_pic_yuv = 1;
@@ -1490,6 +1494,9 @@ static int rk_fb_pan_display(struct fb_var_screeninfo *var,
                video_data_to_mirroring(info, NULL);
 #endif
        dev_drv->ops->cfg_done(dev_drv);
+       /*msleep(1000);
+       dev_drv->ops->dump_reg(dev_drv);
+       while(1);*/
        return 0;
 }
 
@@ -1662,15 +1669,19 @@ static int rk_fb_update_ext_win(struct rk_lcdc_driver *ext_dev_drv,
        }
 
        ext_win->area[0].state = win->area[0].state;
+       ext_win->area[0].format = win->area[0].format;
        ext_win->area_num = win->area_num;
-       ext_win->format = win->format;
        ext_win->fmt_10 = win->fmt_10;
        ext_win->z_order = win->z_order;
        ext_win->alpha_en = win->alpha_en;
        ext_win->alpha_mode = win->alpha_mode;
        ext_win->g_alpha_val = win->g_alpha_val;
+       ext_win->mirror_en = win->mirror_en;
+       ext_win->area[0].fbdc_en = win->area[0].fbdc_en;
+       ext_win->area[0].fbdc_cor_en = win->area[0].fbdc_cor_en;
+       ext_win->area[0].fbdc_data_format = win->area[0].fbdc_data_format;
 
-       switch (ext_win->format) {
+       switch (ext_win->area[0].format) {
        case YUV422:
        case YUV420:
        case YUV444:
@@ -1690,7 +1701,7 @@ static int rk_fb_update_ext_win(struct rk_lcdc_driver *ext_dev_drv,
                ext_win->area[0].xvir = win->area[0].yact;
                ext_win->area[0].yvir = win->area[0].xact;
 
-               pixel_width = rk_fb_pixel_width(ext_win->format);
+               pixel_width = rk_fb_pixel_width(ext_win->area[0].format);
                vir_width_bit = pixel_width * ext_win->area[0].xvir;
                y_stride = ALIGN_N_TIMES(vir_width_bit, 32) / 8;
                ext_win->area[0].y_vir_stride = y_stride >> 2;
@@ -1786,14 +1797,12 @@ static void rk_fb_update_win(struct rk_lcdc_driver *dev_drv,
         rk_fb_get_prmry_screen(&primary_screen);
 
        win->area_num = reg_win_data->area_num;
-       win->format = reg_win_data->data_format;
        win->id = reg_win_data->win_id;
        win->z_order = reg_win_data->z_order;
 
        if (reg_win_data->reg_area_data[0].smem_start > 0) {
                win->state = 1;
                win->area_num = reg_win_data->area_num;
-               win->format = reg_win_data->data_format;
                win->id = reg_win_data->win_id;
                win->z_order = reg_win_data->z_order;
                win->area[0].uv_vir_stride =
@@ -1804,8 +1813,17 @@ static void rk_fb_update_win(struct rk_lcdc_driver *dev_drv,
                win->alpha_en = reg_win_data->alpha_en;
                win->alpha_mode = reg_win_data->alpha_mode;
                win->g_alpha_val = reg_win_data->g_alpha_val;
+               win->mirror_en = reg_win_data->mirror_en;
+               win->area[0].fbdc_en =
+                       reg_win_data->reg_area_data[0].fbdc_en;
+               win->area[0].fbdc_cor_en =
+                       reg_win_data->reg_area_data[0].fbdc_cor_en;
+               win->area[0].fbdc_data_format =
+                       reg_win_data->reg_area_data[0].fbdc_data_format;
                for (i = 0; i < RK_WIN_MAX_AREA; i++) {
                        if (reg_win_data->reg_area_data[i].smem_start > 0) {
+                               win->area[i].format =
+                                       reg_win_data->reg_area_data[i].data_format;
                                if (inf->disp_policy != DISPLAY_POLICY_BOX)
                                        win->area[i].ion_hdl =
                                        reg_win_data->reg_area_data[i].ion_handle;
@@ -1866,6 +1884,10 @@ static void rk_fb_update_win(struct rk_lcdc_driver *dev_drv,
                                    reg_win_data->reg_area_data[i].xvir;
                                win->area[i].yvir =
                                    reg_win_data->reg_area_data[i].yvir;
+                               win->area[i].xoff =
+                                   reg_win_data->reg_area_data[i].xoff;
+                               win->area[i].yoff =
+                                   reg_win_data->reg_area_data[i].yoff;
                                win->area[i].y_offset =
                                    reg_win_data->reg_area_data[i].y_offset;
                                win->area[i].y_vir_stride =
@@ -1905,8 +1927,10 @@ static void rk_fb_update_reg(struct rk_lcdc_driver *dev_drv,
        struct rk_lcdc_win *win;
        ktime_t timestamp = dev_drv->vsync_info.timestamp;
        struct rk_fb *rk_fb = platform_get_drvdata(fb_pdev);
+#if defined(CONFIG_RK_HDMI)
        struct rk_lcdc_driver *ext_dev_drv;
        struct rk_lcdc_win *ext_win;
+#endif
        struct rk_fb_reg_win_data *win_data;
        bool wait_for_vsync;
        int count = 100;
@@ -1929,8 +1953,8 @@ static void rk_fb_update_reg(struct rk_lcdc_driver *dev_drv,
                win_data = rk_fb_get_win_data(regs, i);
                if (win_data) {
                        if (rk_fb->disp_policy == DISPLAY_POLICY_BOX &&
-                           (win_data->data_format == YUV420 ||
-                            win_data->data_format == YUV420_A))
+                           (win_data->reg_area_data[0].data_format == YUV420 ||
+                            win_data->reg_area_data[0].data_format == YUV420_A))
                                continue;
                        mutex_lock(&dev_drv->win_config);
                        rk_fb_update_win(dev_drv, win, win_data);
@@ -1952,6 +1976,7 @@ static void rk_fb_update_reg(struct rk_lcdc_driver *dev_drv,
        dev_drv->ops->ovl_mgr(dev_drv, 0, 1);
        if (rk_fb->disp_policy == DISPLAY_POLICY_BOX)
                dev_drv->ops->cfg_done(dev_drv);
+#if defined(CONFIG_RK_HDMI)
        if ((rk_fb->disp_mode == DUAL)
            && (hdmi_get_hotplug() == HDMI_HPD_ACTIVED)
            && hdmi_switch_complete) {
@@ -1990,6 +2015,7 @@ static void rk_fb_update_reg(struct rk_lcdc_driver *dev_drv,
                ext_dev_drv->ops->cfg_done(ext_dev_drv);
        }
 ext_win_exit:
+#endif
        dev_drv->ops->cfg_done(dev_drv);
 
        do {
@@ -1997,6 +2023,7 @@ ext_win_exit:
                timeout = wait_event_interruptible_timeout(dev_drv->vsync_info.wait,
                                ktime_compare(dev_drv->vsync_info.timestamp, timestamp) > 0,
                                msecs_to_jiffies(25));
+#if defined(CONFIG_RK_HDMI)
                if ((rk_fb->disp_mode == DUAL) &&
                    (hdmi_get_hotplug() == HDMI_HPD_ACTIVED) &&
                    hdmi_switch_complete) {
@@ -2009,14 +2036,14 @@ ext_win_exit:
                                        ktime_compare(ext_dev_drv->vsync_info.timestamp, timestamp) > 0,
                                        msecs_to_jiffies(25));
                }
-
+#endif
                dev_drv->ops->get_dsp_addr(dev_drv, dsp_addr);
                wait_for_vsync = false;
                for (i = 0; i < dev_drv->lcdc_win_num; i++) {
                        if (dev_drv->win[i]->state == 1) {
                                if (rk_fb->disp_policy == DISPLAY_POLICY_BOX &&
-                                   (dev_drv->win[i]->format == YUV420 ||
-                                    dev_drv->win[i]->format == YUV420_A ||
+                                   (dev_drv->win[i]->area[0].format == YUV420 ||
+                                    dev_drv->win[i]->area[0].format == YUV420_A ||
                                     !strcmp(dev_drv->win[i]->name, "hwc"))) {
                                        continue;
                                } else {
@@ -2133,7 +2160,7 @@ static int rk_fb_set_win_buffer(struct fb_info *info,
        struct rk_lcdc_driver *dev_drv = fb_par->lcdc_drv;
        struct rk_screen *screen = dev_drv->cur_screen;
         struct rk_screen primary_screen;
-       struct fb_info *fbi = rk_fb->fb[0];
+       struct fb_info *fbi;
        int i, ion_fd, acq_fence_fd;
        u32 xvir, yvir;
        u32 xoffset, yoffset;
@@ -2164,9 +2191,8 @@ static int rk_fb_set_win_buffer(struct fb_info *info,
                                    ion_import_dma_buf(rk_fb->ion_client,
                                                       ion_fd);
                                if (IS_ERR(hdl)) {
-                                       pr_info
-                                           ("%s: Could not import handle: %d\n",
-                                            __func__, (int)hdl);
+                                       pr_info("%s: Could not import handle:"
+                                               " %ld\n", __func__, (long)hdl);
                                        /*return -EINVAL; */
                                        break;
                                }
@@ -2216,16 +2242,6 @@ static int rk_fb_set_win_buffer(struct fb_info *info,
                            sync_fence_fdget(win_par->area_par[i].acq_fence_fd);
                }
        }
-       fb_data_fmt = rk_fb_data_fmt(win_par->data_format, 0);
-       reg_win_data->data_format = fb_data_fmt;
-       pixel_width = rk_fb_pixel_width(fb_data_fmt);
-
-       ppixel_a = ((fb_data_fmt == ARGB888) ||
-                   (fb_data_fmt == ABGR888)) ? 1 : 0;
-       global_a = (win_par->g_alpha_val == 0) ? 0 : 1;
-       reg_win_data->alpha_en = ppixel_a | global_a;
-       reg_win_data->g_alpha_val = win_par->g_alpha_val;
-       reg_win_data->alpha_mode = win_par->alpha_mode;
        if (reg_win_data->reg_area_data[0].smem_start > 0) {
                reg_win_data->z_order = win_par->z_order;
                reg_win_data->win_id = win_par->win_id;
@@ -2235,11 +2251,24 @@ static int rk_fb_set_win_buffer(struct fb_info *info,
        }
 
        rk_fb_get_prmry_screen(&primary_screen);
+       reg_win_data->mirror_en = win_par->mirror_en;
+       reg_win_data->reg_area_data[0].fbdc_en = win_par->area_par[0].fbdc_en;
+       reg_win_data->reg_area_data[0].fbdc_cor_en =
+               win_par->area_par[0].fbdc_cor_en;
+       reg_win_data->reg_area_data[0].fbdc_data_format =
+               win_par->area_par[0].fbdc_data_format;
        for (i = 0; i < reg_win_data->area_num; i++) {
                if (rk_fb->disp_policy == DISPLAY_POLICY_BOX)
                        rk_fb_check_config_var(&win_par->area_par[i], screen);
                else
                        rk_fb_check_config_var(&win_par->area_par[i], &primary_screen);
+
+               fb_data_fmt = rk_fb_data_fmt(win_par->area_par[i].data_format, 0);
+               reg_win_data->reg_area_data[i].data_format = fb_data_fmt;
+               pixel_width = rk_fb_pixel_width(fb_data_fmt);
+
+               ppixel_a |= ((fb_data_fmt == ARGB888) ||
+                            (fb_data_fmt == ABGR888)) ? 1 : 0;
                /* 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;
@@ -2254,6 +2283,9 @@ static int rk_fb_set_win_buffer(struct fb_info *info,
 
                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;
+               reg_win_data->reg_area_data[i].yoff = yoffset;
+
                xvir = win_par->area_par[i].xvir;
                reg_win_data->reg_area_data[i].xvir = xvir;
                yvir = win_par->area_par[i].yvir;
@@ -2272,7 +2304,7 @@ static int rk_fb_set_win_buffer(struct fb_info *info,
                 * reg_win_data->reg_area_data[i].y_offset =
                 *              yoffset*stride+xoffset*pixel_width/8;
                 */
-               if (screen->y_mirror == 1) {
+               if ((screen->y_mirror == 1) || (reg_win_data->mirror_en)) {
                        if (screen->interlace == 1) {
                                reg_win_data->reg_area_data[i].y_offset =
                                    yoffset * stride * 2 +
@@ -2296,6 +2328,12 @@ static int rk_fb_set_win_buffer(struct fb_info *info,
                        }
                }
        }
+
+       global_a = (win_par->g_alpha_val == 0) ? 0 : 1;
+       reg_win_data->alpha_en = ppixel_a | global_a;
+       reg_win_data->g_alpha_val = win_par->g_alpha_val;
+       reg_win_data->alpha_mode = win_par->alpha_mode;
+
        switch (fb_data_fmt) {
        case YUV422:
        case YUV422_A:
@@ -2334,7 +2372,7 @@ static int rk_fb_set_win_buffer(struct fb_info *info,
                reg_win_data->reg_area_data[0].cbr_start =
                    reg_win_data->reg_area_data[0].smem_start + xvir * yvir;
                reg_win_data->reg_area_data[0].uv_vir_stride = uv_stride >> 2;
-               if (screen->y_mirror == 1) {
+               if ((screen->y_mirror == 1) || (reg_win_data->mirror_en)) {
                        if (screen->interlace == 1) {
                                reg_win_data->reg_area_data[0].c_offset =
                                    uv_y_off * uv_stride * 2 +
@@ -2919,9 +2957,9 @@ static ssize_t rk_fb_read(struct fb_info *info, char __user *buf,
                win = dev_drv->win[win_id];
 
        /* only read the current frame buffer */
-       if (win->format == RGB565) {
+       if (win->area[0].format == RGB565) {
                total_size = win->area[0].y_vir_stride * win->area[0].yact << 1;
-       } else if (win->format == YUV420) {
+       } else if (win->area[0].format == YUV420) {
                total_size =
                    (win->area[0].y_vir_stride * win->area[0].yact * 6);
        } else {
@@ -2984,7 +3022,7 @@ static ssize_t rk_fb_write(struct fb_info *info, const char __user *buf,
                win = dev_drv->win[win_id];
 
        /* write the current frame buffer */
-       if (win->format == RGB565)
+       if (win->area[0].format == RGB565)
                total_size = win->area[0].xact * win->area[0].yact << 1;
        else
                total_size = win->area[0].xact * win->area[0].yact << 2;
@@ -3258,7 +3296,7 @@ static int rk_fb_set_par(struct fb_info *info)
                }
        }
 
-       win->format = fb_data_fmt;
+       win->area[0].format = fb_data_fmt;
        win->area[0].y_vir_stride = stride >> 2;
        win->area[0].uv_vir_stride = uv_stride >> 2;
        win->area[0].xpos = xpos;
@@ -3269,15 +3307,17 @@ static int rk_fb_set_par(struct fb_info *info)
        win->area[0].yact = var->yres;
        win->area[0].xvir = var->xres_virtual;  /* virtual resolution  stride --->LCDC_WINx_VIR */
        win->area[0].yvir = var->yres_virtual;
+       win->area[0].xoff = xoffset;
+       win->area[0].yoff = yoffset;
 
        win->area_num = 1;
        win->alpha_mode = 4;    /* AB_SRC_OVER; */
-       win->alpha_en = ((win->format == ARGB888) ||
-                        (win->format == ABGR888)) ? 1 : 0;
+       win->alpha_en = ((win->area[0].format == ARGB888) ||
+                        (win->area[0].format == ABGR888)) ? 1 : 0;
        win->g_alpha_val = 0;
 
        if (rk_fb->disp_policy == DISPLAY_POLICY_BOX &&
-           (win->format == YUV420 || win->format == YUV420_A))
+           (win->area[0].format == YUV420 || win->area[0].format == YUV420_A))
            win->state = 1;
        if (rk_fb->disp_mode == DUAL) {
                if (extend_win->state && hdmi_switch_complete) {
@@ -3527,6 +3567,9 @@ int rk_fb_switch_screen(struct rk_screen *screen, int enable, int lcdc_id)
                        dev_drv->ops->dsp_black(dev_drv, 1);
                if (dev_drv->ops->set_screen_scaler)
                        dev_drv->ops->set_screen_scaler(dev_drv, dev_drv->screen0, 0);
+       } else if ((rk_fb->disp_mode == NO_DUAL) && (enable)) {
+               if (dev_drv->ops->dsp_black)
+                       dev_drv->ops->dsp_black(dev_drv, 1);
        }
 
        if (!enable) {
@@ -3535,7 +3578,8 @@ int rk_fb_switch_screen(struct rk_screen *screen, int enable, int lcdc_id)
                        return 0;
 
                /* if used one lcdc to dual disp, no need to close win */
-               if (rk_fb->disp_mode == ONE_DUAL) {
+               if ((rk_fb->disp_mode == ONE_DUAL) ||
+                   (rk_fb->disp_mode == NO_DUAL)) {
                        dev_drv->cur_screen = dev_drv->screen0;
                        dev_drv->ops->load_screen(dev_drv, 1);
 
@@ -3597,7 +3641,8 @@ int rk_fb_switch_screen(struct rk_screen *screen, int enable, int lcdc_id)
                                        info->var.activate |= FB_ACTIVATE_FORCE;
                                        if (rk_fb->disp_mode == DUAL) {
                                                rk_fb_update_ext_info(info, pmy_info, 1);
-                                       } else if (rk_fb->disp_mode == ONE_DUAL) {
+                                       } else if ((rk_fb->disp_mode == ONE_DUAL) ||
+                                                  (rk_fb->disp_mode == NO_DUAL)) {
                                                info->var.grayscale &= 0xff;
                                                info->var.grayscale |=
                                                        (dev_drv->cur_screen->xsize << 8) +
index 07d8ab6d6b53a415ad6130af1ce435163293073b..cf9f8c9b7a1f647dca03290b38ce4dbc4b62dc9e 100755 (executable)
@@ -233,7 +233,8 @@ static ssize_t set_dump_info(struct device *dev, struct device_attribute *attr,
                for (j = 0; j < RK_WIN_MAX_AREA; j++) {
                        win_data = &front_regs->reg_win_data[i];
                        if (dump_win(rk_fb, &win_data->reg_area_data[j],
-                                    win_data->data_format, i, j, is_img))
+                                    win_data->reg_area_data[i].data_format,i,
+                                    j, is_img))
                                continue;
                }
        }
index 65190b00f8e55f408ad57b03d304370160175bce..36268e43b5aeb86087216cec0151c3b8eb127cc9 100755 (executable)
@@ -17,6 +17,7 @@
 #define OUT_CCIR656         6
 #define OUT_S888            8
 #define OUT_S888DUMY        12
+#define OUT_YUV_420        14
 #define OUT_P16BPP4         24
 #define OUT_D888_P666       0x21       //18bit screen,connect to lcdc D2~D7, D10~D15, D18~D23
 #define OUT_D888_P565       0x22
@@ -57,7 +58,8 @@
 #define FB0_WIN0_FB1_WIN2_FB2_WIN1     120
 #define FB0_WIN0_FB1_WIN1_FB2_WIN2     210
 #define FB0_WIN1_FB1_WIN0_FB2_WIN2     201
-#define FB0_WIN0_FB1_WIN1_FB2_WIN2_FB3_WIN3    3210
+#define FB0_WIN0_FB1_WIN1_FB2_WIN2_FB3_WIN3        3210
+#define FB0_WIN0_FB1_WIN1_FB2_WIN2_FB3_WIN3_FB4_HWC 43210
 
 #define DISPLAY_POLICY_SDK     0
 #define DISPLAY_POLICY_BOX     1
index e9b7fedd2bcf2ed3a7a3ca6e86901a5d607e6aae..e6331e8b234e79567bdeafb3b096de371730bcc1 100755 (executable)
 #include <linux/kthread.h>
 
 
-#define RK30_MAX_LCDC_SUPPORT  4
-#define RK30_MAX_LAYER_SUPPORT 4
-#define RK_MAX_FB_SUPPORT       4
+#define RK30_MAX_LCDC_SUPPORT  2
+#define RK30_MAX_LAYER_SUPPORT 5
+#define RK_MAX_FB_SUPPORT       5
 #define RK_WIN_MAX_AREA                4
-#define RK_MAX_BUF_NUM         10
+#define RK_MAX_BUF_NUM         11
 
 #define FB0_IOCTL_STOP_TIMER_FLUSH             0x6001
 #define FB0_IOCTL_SET_PANEL                            0x6002
@@ -127,6 +127,7 @@ extern bool rk_fb_poll_wait_frame_complete(void);
 #define OUT_CCIR656         6
 #define OUT_S888            8
 #define OUT_S888DUMY        12
+#define OUT_YUV_420        14
 #define OUT_RGB_AAA        15
 #define OUT_P16BPP4         24
 #define OUT_D888_P666       0x21       //18bit screen,connect to lcdc D2~D7, D10~D15, D18~D23
@@ -293,7 +294,7 @@ typedef enum _TRSP_MODE {
        TRSP_INVAL
 } TRSP_MODE;
 
-struct rk_lcdc_post_cfg{
+struct rk_lcdc_post_cfg {
        u32 xpos;
        u32 ypos;
        u32 xsize;
@@ -309,18 +310,23 @@ struct rk_lcdc_bcsh {
        u16 cos_hue;
 };
 
-struct rk_lcdc_win_area{
+struct rk_lcdc_win_area {
        bool state;
+       enum data_format format;
+       u8 fmt_cfg;
+       u8 swap_rb;
        u32 y_offset;           /*yuv/rgb offset  -->LCDC_WINx_YRGB_MSTx*/
        u32 c_offset;           /*cb cr offset--->LCDC_WINx_CBR_MSTx*/
-       u32 xpos;               /*start point in panel  --->LCDC_WINx_DSP_ST*/
-       u32 ypos;
+       u16 xpos;               /*start point in panel  --->LCDC_WINx_DSP_ST*/
+       u16 ypos;
        u16 xsize;              /* display window width/height  -->LCDC_WINx_DSP_INFO*/
        u16 ysize;
        u16 xact;               /*origin display window size -->LCDC_WINx_ACT_INFO*/
        u16 yact;
        u16 xvir;               /*virtual width/height     -->LCDC_WINx_VIR*/
        u16 yvir;
+       u16 xoff;               /*mem offset*/
+       u16 yoff;
        unsigned long smem_start;
        unsigned long cbr_start;        /*Cbr memory start address*/
 #if defined(CONFIG_ION_ROCKCHIP)
@@ -328,13 +334,26 @@ struct rk_lcdc_win_area{
                int dma_buf_fd;
                struct dma_buf *dma_buf;
 #endif
-       u32 dsp_stx;
-       u32 dsp_sty;
-       u32 y_vir_stride;
-       u32 uv_vir_stride;
+       u16 dsp_stx;
+       u16 dsp_sty;
+       u16 y_vir_stride;
+       u16 uv_vir_stride;
        u32 y_addr;
        u32 uv_addr;
 
+       u8  fbdc_en;
+       u8  fbdc_cor_en;
+       u8  fbdc_data_format;
+       u8  fbdc_dsp_width_ratio;
+       u8  fbdc_fmt_cfg;
+       u16 fbdc_mb_vir_width;
+       u16 fbdc_mb_vir_height;
+       u16 fbdc_mb_width;
+       u16 fbdc_mb_height;
+       u16 fbdc_mb_xst;
+       u16 fbdc_mb_yst;
+       u16 fbdc_num_tiles;
+       u16 fbdc_cmp_index_init;
 };
 
 
@@ -344,11 +363,8 @@ struct rk_lcdc_win {
        bool state;             /*on or off*/
        bool last_state;                /*on or off*/
        u32 pseudo_pal[16];
-       enum data_format format;
        int z_order;            /*win sel layer*/
-       u8 fmt_cfg;
-       u8 fmt_10;;
-       u8 swap_rb;
+       u8 fmt_10;
        u32 reserved;
        u32 area_num;
        u32 scale_yrgb_x;
@@ -376,8 +392,9 @@ struct rk_lcdc_win {
        u8 vsd_cbr_gt2;
 
        u8 alpha_en;
-       u32 alpha_mode;
-       u32 g_alpha_val;
+       u8 alpha_mode;
+       u16 g_alpha_val;
+       u8  mirror_en;
        u32 color_key_val;
        u8 csc_mode;
 
@@ -444,55 +461,64 @@ struct rk_lcdc_drv_ops {
 };
 
 struct rk_fb_area_par {
-       int ion_fd;
+       u8  data_format;        /*layer data fmt*/
+       short ion_fd;
        unsigned long phy_addr;
-       int acq_fence_fd;
-       u32 x_offset;
-       u32 y_offset;
-       u32 xpos;               /*start point in panel  --->LCDC_WINx_DSP_ST*/
-       u32 ypos;
-       u32 xsize;              /* display window width/height  -->LCDC_WINx_DSP_INFO*/
-       u32 ysize;
-       u32 xact;               /*origin display window size -->LCDC_WINx_ACT_INFO*/
-       u32 yact;
-       u32 xvir;               /*virtual width/height     -->LCDC_WINx_VIR*/
-       u32 yvir;
+       short acq_fence_fd;
+       u16  x_offset;
+       u16  y_offset;
+       u16 xpos;       /*start point in panel  --->LCDC_WINx_DSP_ST*/
+       u16 ypos;
+       u16 xsize;      /* display window width/height  -->LCDC_WINx_DSP_INFO*/
+       u16 ysize;
+       u16 xact;       /*origin display window size -->LCDC_WINx_ACT_INFO*/
+       u16 yact;
+       u16 xvir;       /*virtual width/height     -->LCDC_WINx_VIR*/
+       u16 yvir;
+       u8  fbdc_en;
+       u8  fbdc_cor_en;
+       u8  fbdc_data_format;
+       u16 reserved0;
+       u32 reserved1;
 };
 
 
 struct rk_fb_win_par {
-       u8 data_format;        /*layer data fmt*/
-       u8 win_id;
-       u8 z_order;             /*win sel layer*/
+       u8  win_id;
+       u8  z_order;            /*win sel layer*/
+       u8  alpha_mode;
+       u16 g_alpha_val;
+       u8  mirror_en;
        struct rk_fb_area_par area_par[RK_WIN_MAX_AREA];
-       u32 alpha_mode;
-       u32 g_alpha_val;
+       u32 reserved0;
 };
 
 struct rk_fb_win_cfg_data {
-       int ret_fence_fd;
-       int rel_fence_fd[RK_MAX_BUF_NUM];
+       u8  wait_fs;
+       short ret_fence_fd;
+       short rel_fence_fd[RK_MAX_BUF_NUM];
        struct  rk_fb_win_par win_par[RK30_MAX_LAYER_SUPPORT];
        struct  rk_lcdc_post_cfg post_cfg;
-       u8      wait_fs;
-       //u8      fence_begin;
 };
 
 struct rk_fb_reg_area_data {
        struct sync_fence *acq_fence;
+       u8 data_format;        /*layer data fmt*/
        u8  index_buf;          /*judge if the buffer is index*/
        u32 y_offset;           /*yuv/rgb offset  -->LCDC_WINx_YRGB_MSTx*/
        u32 c_offset;           /*cb cr offset--->LCDC_WINx_CBR_MSTx*/
        u32 y_vir_stride;
        u32 uv_vir_stride;
-       u32 xpos;               /*start point in panel  --->LCDC_WINx_DSP_ST*/
-       u32 ypos;
+       u16 xpos;               /*start point in panel  --->LCDC_WINx_DSP_ST*/
+       u16 ypos;
        u16 xsize;              /* display window width/height  -->LCDC_WINx_DSP_INFO*/
        u16 ysize;
        u16 xact;               /*origin display window size -->LCDC_WINx_ACT_INFO*/
        u16 yact;
        u16 xvir;               /*virtual width/height     -->LCDC_WINx_VIR*/
        u16 yvir;
+       u16 xoff;               /*mem offset*/
+       u16 yoff;
        unsigned long smem_start;
        unsigned long cbr_start;        /*Cbr memory start address*/
        u32 line_length;        
@@ -502,38 +528,38 @@ struct rk_fb_reg_area_data {
        struct dma_buf_attachment *attachment;
        struct sg_table *sg_table;
        dma_addr_t dma_addr;
-#endif 
+#endif
+       u8  fbdc_en;
+       u8  fbdc_cor_en;
+       u8  fbdc_data_format;
 };
 
 struct rk_fb_reg_win_data {
-       u8 data_format;        /*layer data fmt*/
        u8 win_id;
        u8 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;
-       u32 alpha_mode;
-       u32 g_alpha_val;
-       u32 color_key_val;
+       u8 alpha_mode;
+       u16 g_alpha_val;
+       u8  mirror_en;
 
        struct rk_fb_reg_area_data reg_area_data[RK_WIN_MAX_AREA];
 };
 
 struct rk_fb_reg_data {
        struct list_head list;
-       int     win_num;
-       int     buf_num;
-       int     acq_num;
+       int    win_num;
+       int    buf_num;
+       int    acq_num;
        struct rk_fb_reg_win_data reg_win_data[RK30_MAX_LAYER_SUPPORT];
        struct rk_lcdc_post_cfg post_cfg;
-       //struct sync_fence *acq_fence[RK_MAX_BUF_NUM];
-       //int     fence_wait_begin;
 };
 
 struct rk_lcdc_driver {
        char name[6];
-       int id;
-       int prop;
+       int  id;
+       int  prop;
        struct device *dev;
 
        struct rk_lcdc_win *win[RK_MAX_FB_SUPPORT];
@@ -550,11 +576,12 @@ struct rk_lcdc_driver {
        u16 overlay_mode;
        u16 output_color;
 
-       u16 fb_win_map;
+       u16  fb_win_map;
        char fb0_win_id;
        char fb1_win_id;
        char fb2_win_id;
        char fb3_win_id;
+       char fb4_win_id;
        
        char mmu_dts_name[40];
        struct device *mmu_dev;