video: rockchip: lcdc: 3368: update for FBDC
authorHuang Jiachai <hjc@rock-chips.com>
Mon, 21 Mar 2016 07:11:42 +0000 (15:11 +0800)
committerHuang, Tao <huangtao@rock-chips.com>
Wed, 23 Mar 2016 06:36:05 +0000 (14:36 +0800)
FBDC state |= win[i]->area[0]->fbdc_en;

Change-Id: I2ddfdea66061ad67b876369c130b8cfa6e3bda55
Signed-off-by: Huang Jiachai <hjc@rock-chips.com>
drivers/video/rockchip/lcdc/rk3368_lcdc.c

index e82087313e16baf531f2ea9f6544e8d07f34c63a..3f5bb2667557d89735494f86196e8827003c0395 100644 (file)
@@ -951,11 +951,14 @@ static int rk3368_fbdc_reg_update(struct rk_lcdc_driver *dev_drv, int win_id)
        struct rk_lcdc_win *win = dev_drv->win[win_id];
        u32 mask, val;
 
-       mask = m_IFBDC_CTRL_FBDC_EN | m_IFBDC_CTRL_FBDC_COR_EN |
+       if (lcdc_dev->soc_type != VOP_FULL_RK3368) {
+               pr_err("soc: 0x%08x not support FBDC\n", lcdc_dev->soc_type);
+               return 0;
+       }
+       mask = m_IFBDC_CTRL_FBDC_COR_EN |
            m_IFBDC_CTRL_FBDC_WIN_SEL | m_IFBDC_CTRL_FBDC_ROTATION_MODE |
            m_IFBDC_CTRL_FBDC_FMT | m_IFBDC_CTRL_WIDTH_RATIO;
-       val = v_IFBDC_CTRL_FBDC_EN(win->area[0].fbdc_en) |
-           v_IFBDC_CTRL_FBDC_COR_EN(win->area[0].fbdc_cor_en) |
+       val = v_IFBDC_CTRL_FBDC_COR_EN(win->area[0].fbdc_cor_en) |
            v_IFBDC_CTRL_FBDC_WIN_SEL(win->id) |
            v_IFBDC_CTRL_FBDC_ROTATION_MODE((win->xmirror &&
                                             win->ymirror) << 1) |
@@ -1001,6 +1004,10 @@ static int rk3368_init_fbdc_config(struct rk_lcdc_driver *dev_drv, int win_id)
                return 0;
        }
 
+       if (lcdc_dev->soc_type != VOP_FULL_RK3368) {
+               pr_err("soc: 0x%08x not support FBDC\n", lcdc_dev->soc_type);
+               return 0;
+       }
        switch (win->area[0].fmt_cfg) {
        case VOP_FORMAT_ARGB888:
                fbdc_dsp_width_ratio = 0;
@@ -1213,13 +1220,8 @@ static int rk3368_win_0_1_reg_update(struct rk_lcdc_driver *dev_drv, int win_id)
        if (win->state == 1) {
                rk3368_lcdc_csc_mode(lcdc_dev, win);
                rk3368_lcdc_axi_gather_cfg(lcdc_dev, win);
-               if (win->area[0].fbdc_en) {
+               if (win->area[0].fbdc_en)
                        rk3368_fbdc_reg_update(&lcdc_dev->driver, win_id);
-               } else {
-                       mask = m_IFBDC_CTRL_FBDC_EN;
-                       val = v_IFBDC_CTRL_FBDC_EN(0);
-                       lcdc_msk_reg(lcdc_dev, IFBDC_CTRL, mask, val);
-               }
                mask = m_WIN0_EN | m_WIN0_DATA_FMT | m_WIN0_FMT_10 |
                        m_WIN0_LB_MODE | m_WIN0_RB_SWAP | m_WIN0_X_MIRROR |
                        m_WIN0_Y_MIRROR | m_WIN0_CSC_MODE | m_WIN0_UV_SWAP;
@@ -1324,13 +1326,8 @@ static int rk3368_win_2_3_reg_update(struct rk_lcdc_driver *dev_drv, int win_id)
        if (win->state == 1) {
                rk3368_lcdc_csc_mode(lcdc_dev, win);
                rk3368_lcdc_axi_gather_cfg(lcdc_dev, win);
-               if (win->area[0].fbdc_en) {
+               if (win->area[0].fbdc_en)
                        rk3368_fbdc_reg_update(&lcdc_dev->driver, win_id);
-               } else {
-                       mask = m_IFBDC_CTRL_FBDC_EN;
-                       val = v_IFBDC_CTRL_FBDC_EN(0);
-                       lcdc_msk_reg(lcdc_dev, IFBDC_CTRL, mask, val);
-               }
 
                mask = m_WIN2_EN | m_WIN2_CSC_MODE;
                val = v_WIN2_EN(1) | v_WIN1_CSC_MODE(win->csc_mode);
@@ -4133,7 +4130,7 @@ static int rk3368_lcdc_config_done(struct rk_lcdc_driver *dev_drv)
        struct lcdc_device *lcdc_dev =
            container_of(dev_drv, struct lcdc_device, driver);
        int i;
-       unsigned int mask, val;
+       unsigned int mask, val, fbdc_en = 0;
        struct rk_lcdc_win *win = NULL;
        u32 line_scane_num, dsp_vs_st_f1;
 
@@ -4155,6 +4152,7 @@ static int rk3368_lcdc_config_done(struct rk_lcdc_driver *dev_drv)
                     v_STANDBY_EN(lcdc_dev->standby));
        for (i = 0; i < 4; i++) {
                win = dev_drv->win[i];
+               fbdc_en |= win->area[0].fbdc_en;
                if ((win->state == 0) && (win->last_state == 1)) {
                        switch (win->id) {
                        case 0:
@@ -4200,6 +4198,11 @@ static int rk3368_lcdc_config_done(struct rk_lcdc_driver *dev_drv)
                }
                win->last_state = win->state;
        }
+       if (lcdc_dev->soc_type == VOP_FULL_RK3368) {
+               mask = m_IFBDC_CTRL_FBDC_EN;
+               val = v_IFBDC_CTRL_FBDC_EN(fbdc_en);
+               lcdc_msk_reg(lcdc_dev, IFBDC_CTRL, mask, val);
+       }
        lcdc_cfg_done(lcdc_dev);
        spin_unlock(&lcdc_dev->reg_lock);
        return 0;