mask = m_AUTO_GATING_EN;
val = v_AUTO_GATING_EN(0);
lcdc_msk_reg(lcdc_dev, SYS_CTRL, mask, val);
+ mask = m_DITHER_UP_EN;
+ val = v_DITHER_UP_EN(1);
+ lcdc_msk_reg(lcdc_dev, DSP_CTRL1, mask, val);
lcdc_cfg_done(lcdc_dev);
/*disable win0 to workaround iommu pagefault */
/*if (dev_drv->iommu_enabled) */
{
u32 mask, val;
- rk3368_lcdc_disable_irq(lcdc_dev);
- spin_lock(&lcdc_dev->reg_lock);
- mask = m_WIN0_EN;
- val = v_WIN0_EN(0);
- lcdc_msk_reg(lcdc_dev, WIN0_CTRL0, mask, val);
- lcdc_msk_reg(lcdc_dev, WIN1_CTRL0, mask, val);
-
- mask = m_WIN2_EN | m_WIN2_MST0_EN |
- m_WIN2_MST1_EN |
- m_WIN2_MST2_EN | m_WIN2_MST3_EN;
- val = v_WIN2_EN(0) | v_WIN2_MST0_EN(0) |
- v_WIN2_MST1_EN(0) |
- v_WIN2_MST2_EN(0) | v_WIN2_MST3_EN(0);
- lcdc_msk_reg(lcdc_dev, WIN2_CTRL0, mask, val);
- lcdc_msk_reg(lcdc_dev, WIN3_CTRL0, mask, val);
- lcdc_cfg_done(lcdc_dev);
- spin_unlock(&lcdc_dev->reg_lock);
- mdelay(50);
+ if (lcdc_dev->clk_on) {
+ rk3368_lcdc_disable_irq(lcdc_dev);
+ spin_lock(&lcdc_dev->reg_lock);
+ mask = m_WIN0_EN;
+ val = v_WIN0_EN(0);
+ lcdc_msk_reg(lcdc_dev, WIN0_CTRL0, mask, val);
+ lcdc_msk_reg(lcdc_dev, WIN1_CTRL0, mask, val);
+ mask = m_WIN2_EN | m_WIN2_MST0_EN |
+ m_WIN2_MST1_EN |
+ m_WIN2_MST2_EN | m_WIN2_MST3_EN;
+ val = v_WIN2_EN(0) | v_WIN2_MST0_EN(0) |
+ v_WIN2_MST1_EN(0) |
+ v_WIN2_MST2_EN(0) | v_WIN2_MST3_EN(0);
+ lcdc_msk_reg(lcdc_dev, WIN2_CTRL0, mask, val);
+ lcdc_msk_reg(lcdc_dev, WIN3_CTRL0, mask, val);
+ lcdc_cfg_done(lcdc_dev);
+ spin_unlock(&lcdc_dev->reg_lock);
+ mdelay(50);
+ }
}
static int rk3368_lcdc_post_cfg(struct rk_lcdc_driver *dev_drv)
struct rk_lcdc_win *win)
{
u32 mask, val;
- u16 yrgb_gather_num = 8;
- u16 cbcr_gather_num = 2;
+ u16 yrgb_gather_num = 3;
+ u16 cbcr_gather_num = 1;
switch (win->area[0].format) {
case ARGB888:
case XBGR888:
case ABGR888:
- yrgb_gather_num = 8;
+ yrgb_gather_num = 3;
break;
case RGB888:
case RGB565:
- yrgb_gather_num = 4;
+ yrgb_gather_num = 2;
break;
case YUV444:
case YUV422:
case YUV420:
case YUV420_NV21:
- yrgb_gather_num = 2;
- cbcr_gather_num = 4;
+ yrgb_gather_num = 1;
+ cbcr_gather_num = 2;
break;
default:
dev_err(lcdc_dev->driver.dev, "%s:un supported format!\n",
v_WIN0_CBR_AXI_GATHER_NUM(cbcr_gather_num);
lcdc_msk_reg(lcdc_dev, WIN0_CTRL1 + (win->id * 0x40), mask, val);
} else if ((win->id == 2) || (win->id == 3)) {
- mask = m_WIN0_YRGB_AXI_GATHER_EN | m_WIN0_YRGB_AXI_GATHER_NUM;
- val = v_WIN0_YRGB_AXI_GATHER_EN(1) |
- v_WIN0_YRGB_AXI_GATHER_NUM(yrgb_gather_num);
+ mask = m_WIN2_AXI_GATHER_EN | m_WIN2_AXI_GATHER_NUM;
+ val = v_WIN2_AXI_GATHER_EN(1) |
+ v_WIN2_AXI_GATHER_NUM(yrgb_gather_num);
lcdc_msk_reg(lcdc_dev, WIN2_CTRL1 + ((win->id - 2) * 0x50), mask, val);
} else if (win->id == 4) {
mask = m_HWC_AXI_GATHER_EN | m_HWC_AXI_GATHER_NUM;
break;
case OUT_P888:
face = OUT_P888;
- mask = m_DITHER_DOWN_EN | m_DITHER_UP_EN;
- val = v_DITHER_DOWN_EN(0) | v_DITHER_UP_EN(0);
+ mask = m_DITHER_DOWN_EN;
+ val = v_DITHER_DOWN_EN(0);
lcdc_msk_reg(lcdc_dev, DSP_CTRL1, mask, val);
break;
case OUT_YUV_420:
/*yuv420 output prefer yuv domain overlay */
face = OUT_YUV_420;
dclk_ddr = 1;
- mask = m_DITHER_DOWN_EN | m_DITHER_UP_EN;
- val = v_DITHER_DOWN_EN(0) | v_DITHER_UP_EN(0);
+ mask = m_DITHER_DOWN_EN;
+ val = v_DITHER_DOWN_EN(0);
+ lcdc_msk_reg(lcdc_dev, DSP_CTRL1, mask, val);
+ break;
+ case OUT_S888:
+ face = OUT_S888;
+ mask = m_DITHER_DOWN_EN;
+ val = v_DITHER_DOWN_EN(0);
+ lcdc_msk_reg(lcdc_dev, DSP_CTRL1, mask, val);
+ break;
+ case OUT_S888DUMY:
+ face = OUT_S888DUMY;
+ mask = m_DITHER_DOWN_EN;
+ val = v_DITHER_DOWN_EN(0);
lcdc_msk_reg(lcdc_dev, DSP_CTRL1, mask, val);
break;
default:
val = v_EDP_OUT_EN(1) | v_RGB_OUT_EN(0);
lcdc_msk_reg(lcdc_dev, SYS_CTRL, mask, val);
/*because edp have to sent aaa fmt */
- mask = m_DITHER_DOWN_EN | m_DITHER_UP_EN;
- val = v_DITHER_DOWN_EN(0) | v_DITHER_UP_EN(0);
+ mask = m_DITHER_DOWN_EN;
+ val = v_DITHER_DOWN_EN(0);
mask |= m_EDP_HSYNC_POL | m_EDP_VSYNC_POL |
m_EDP_DEN_POL | m_EDP_DCLK_POL;
struct lcdc_device *lcdc_dev =
container_of(dev_drv, struct lcdc_device, driver);
u32 win_ctrl = 0;
- u32 area_status = 0;
+ u32 area_status = 0, state = 0;
switch (win_id) {
case 0:
case 2:
win_ctrl = lcdc_readl(lcdc_dev, WIN2_CTRL0);
if (area_id == 0)
- area_status = win_ctrl & m_WIN2_MST0_EN;
+ area_status = win_ctrl & (m_WIN2_MST0_EN | m_WIN2_EN);
if (area_id == 1)
area_status = win_ctrl & m_WIN2_MST1_EN;
if (area_id == 2)
case 3:
win_ctrl = lcdc_readl(lcdc_dev, WIN3_CTRL0);
if (area_id == 0)
- area_status = win_ctrl & m_WIN3_MST0_EN;
+ area_status = win_ctrl & (m_WIN3_MST0_EN | m_WIN3_EN);
if (area_id == 1)
area_status = win_ctrl & m_WIN3_MST1_EN;
if (area_id == 2)
pr_err("!!!%s,win[%d]area[%d],unsupport!!!\n",__func__,win_id,area_id);
break;
}
- return area_status;
+
+ state = (area_status > 0) ? 1 : 0;
+ return state;
}
static int rk3368_lcdc_get_area_num(struct rk_lcdc_driver *dev_drv,
flush_kthread_worker(&dev_drv->update_regs_worker);
kthread_stop(dev_drv->update_regs_thread);
rk3368_lcdc_deint(lcdc_dev);
- if (dev_drv->trsm_ops && dev_drv->trsm_ops->disable)
- dev_drv->trsm_ops->disable();
+ /*if (dev_drv->trsm_ops && dev_drv->trsm_ops->disable)
+ dev_drv->trsm_ops->disable();*/
rk3368_lcdc_clk_disable(lcdc_dev);
rk_disp_pwr_disable(dev_drv);