static int rk312x_lcdc_get_win_state(struct rk_lcdc_driver *dev_drv, int win_id)
{
- return 0;
+ struct lcdc_device *lcdc_dev =
+ container_of(dev_drv, struct lcdc_device, driver);
+ int win_status = 0;
+
+ if (win_id == 0)
+ win_status = lcdc_read_bit(lcdc_dev, SYS_CTRL, m_WIN0_EN);
+ else if (win_id == 1)
+ win_status = lcdc_read_bit(lcdc_dev, SYS_CTRL, m_WIN1_EN);
+ else
+ pr_err("!!!%s,win_id :%d,unsupport!!!\n",__func__,win_id);
+
+ return win_status;
}
static int rk312x_lcdc_ovl_mgr(struct rk_lcdc_driver *dev_drv, int swap,
static int rk3288_lcdc_get_win_state(struct rk_lcdc_driver *dev_drv, int win_id)
{
- return 0;
+ struct lcdc_device *lcdc_dev =
+ container_of(dev_drv, struct lcdc_device, driver);
+ int win_status = 0;
+ if (win_id == 0)
+ win_status = lcdc_read_bit(lcdc_dev, WIN0_CTRL0, m_WIN0_EN);
+ else if (win_id == 1)
+ win_status = lcdc_read_bit(lcdc_dev, WIN1_CTRL0, m_WIN1_EN);
+ else if (win_id == 2)
+ win_status = lcdc_read_bit(lcdc_dev, WIN2_CTRL0, m_WIN2_EN);
+ else if (win_id == 3)
+ win_status = lcdc_read_bit(lcdc_dev, WIN3_CTRL0, m_WIN3_EN);
+ else if (win_id == 4)
+ win_status = lcdc_read_bit(lcdc_dev, HWC_CTRL0, m_HWC_EN);
+ else
+ pr_err("!!!%s,win_id :%d,unsupport!!!\n",__func__,win_id);
+
+ return win_status;
}
/*overlay will be do at regupdate*/
int count = 100;
unsigned int dsp_addr[4];
long timeout;
+ int win_status = 0;
/* acq_fence wait */
for (i = 0; i < regs->win_num; i++) {
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 (rk_fb->disp_policy == DISPLAY_POLICY_BOX &&
+ (!strcmp(dev_drv->win[i]->name, "hwc")))
+ continue;
if (dev_drv->win[i]->state == 1) {
- if (rk_fb->disp_policy == DISPLAY_POLICY_BOX &&
- (!strcmp(dev_drv->win[i]->name, "hwc"))) {
+ u32 new_start =
+ dev_drv->win[i]->area[0].smem_start +
+ dev_drv->win[i]->area[0].y_offset;
+ u32 reg_start = dsp_addr[i];
+
+ if ((rk_fb->disp_policy ==
+ DISPLAY_POLICY_BOX) &&
+ (dev_drv->suspend_flag))
continue;
- } else {
- u32 new_start =
- dev_drv->win[i]->area[0].smem_start +
- dev_drv->win[i]->area[0].y_offset;
- u32 reg_start = dsp_addr[i];
-
- if ((rk_fb->disp_policy ==
- DISPLAY_POLICY_BOX) &&
- (dev_drv->suspend_flag))
- continue;
- if (unlikely(new_start != reg_start)) {
- wait_for_vsync = true;
- dev_info(dev_drv->dev,
- "win%d:new_addr:0x%08x cur_addr:0x%08x--%d\n",
- i, new_start, reg_start, 101 - count);
- break;
- }
+ if (unlikely(new_start != reg_start)) {
+ wait_for_vsync = true;
+ dev_info(dev_drv->dev,
+ "win%d:new_addr:0x%08x cur_addr:0x%08x--%d\n",
+ i, new_start, reg_start, 101 - count);
+ break;
}
+ } else if (dev_drv->win[i]->state == 0) {
+ if (dev_drv->ops->get_win_state) {
+ win_status =
+ dev_drv->ops->get_win_state(dev_drv, i);
+ if (win_status)
+ wait_for_vsync = true;
+ }
+ } else {
+ pr_err("!!!win[%d]state:%d,error!!!\n",
+ i, dev_drv->win[i]->state);
}
}
} while (wait_for_vsync && count--);