From: Huang Jiachai Date: Mon, 21 Mar 2016 07:11:42 +0000 (+0800) Subject: video: rockchip: lcdc: 3368: update for FBDC X-Git-Tag: firefly_0821_release~3038 X-Git-Url: http://plrg.eecs.uci.edu/git/?a=commitdiff_plain;h=a9cdb49f36a153b1e947a89647c7a53bf0a89cfe;p=firefly-linux-kernel-4.4.55.git video: rockchip: lcdc: 3368: update for FBDC FBDC state |= win[i]->area[0]->fbdc_en; Change-Id: I2ddfdea66061ad67b876369c130b8cfa6e3bda55 Signed-off-by: Huang Jiachai --- diff --git a/drivers/video/rockchip/lcdc/rk3368_lcdc.c b/drivers/video/rockchip/lcdc/rk3368_lcdc.c index e82087313e16..3f5bb2667557 100644 --- a/drivers/video/rockchip/lcdc/rk3368_lcdc.c +++ b/drivers/video/rockchip/lcdc/rk3368_lcdc.c @@ -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;