+static int rk_fb_reg_effect(struct rk_lcdc_driver *dev_drv,
+ struct rk_fb_reg_data *regs,
+ int count)
+{
+ struct rk_fb *rk_fb = platform_get_drvdata(fb_pdev);
+ int i, j, wait_for_vsync = false;
+ unsigned int dsp_addr[5][4];
+ unsigned int area_support[5] = {1, 1, 1, 1, 1};
+ int win_status = 0;
+ u32 temp;
+
+ memset(dsp_addr, 0, sizeof(dsp_addr));
+ if (dev_drv->ops->get_dsp_addr)
+ dev_drv->ops->get_dsp_addr(dev_drv, dsp_addr);
+
+ if (dev_drv->ops->area_support_num)
+ dev_drv->ops->area_support_num(dev_drv, area_support);
+
+ 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;
+
+ for (j = 0;j < RK_WIN_MAX_AREA; j++) {
+ if ((j > 0) && (area_support[i] == 1)) {
+ continue;
+ }
+ temp = dsp_addr[i][j];
+ win_status =
+ dev_drv->ops->get_win_state(dev_drv, i, j);
+ if (dev_drv->win[i]->area[j].state == 1) {
+ u32 new_start =
+ dev_drv->win[i]->area[j].smem_start +
+ dev_drv->win[i]->area[j].y_offset;
+ u32 reg_start = dsp_addr[i][j];
+ 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;
+ }
+ } else if (dev_drv->win[i]->area[j].state == 0) {
+ if (dev_drv->ops->get_win_state) {
+ win_status =
+ dev_drv->ops->get_win_state(dev_drv, i, j);
+ if (win_status)
+ wait_for_vsync = true;
+ }
+ } else {
+ pr_err("!!!win[%d]state:%d,error!!!\n",
+ i, dev_drv->win[i]->state);
+ }
+ printk("win[%d]area[%d]reg_start = 0x%x,state=%d\n",i,j,temp,win_status);
+ }
+ }
+
+ return wait_for_vsync;
+}
+