From 5456670f056726d2cea50c10aeabe0131df51407 Mon Sep 17 00:00:00 2001 From: hjc Date: Thu, 9 Apr 2015 11:31:27 +0800 Subject: [PATCH] rk fb: ignore frame when in hdmi switch or set error config Signed-off-by: hjc --- drivers/video/rockchip/rk_fb.c | 67 ++++++++++++++++++++++------------ include/linux/rk_fb.h | 3 +- 2 files changed, 45 insertions(+), 25 deletions(-) diff --git a/drivers/video/rockchip/rk_fb.c b/drivers/video/rockchip/rk_fb.c index d12ca7c1f1fe..f16052c2f1ad 100644 --- a/drivers/video/rockchip/rk_fb.c +++ b/drivers/video/rockchip/rk_fb.c @@ -61,7 +61,7 @@ #define H_USE_FENCE 1 /* #define FB_ROATE_BY_KERNEL 1 */ -static int hdmi_switch_complete; +static int hdmi_switch_state; static struct platform_device *fb_pdev; #if defined(CONFIG_FB_MIRRORING) @@ -1591,7 +1591,7 @@ static void rk_fb_update_win(struct rk_lcdc_driver *dev_drv, primary_screen.mode.yres; /* recalc display size if set hdmi scaler when at ONE_DUAL mode */ - if (inf->disp_mode == ONE_DUAL && hdmi_switch_complete) { + if (inf->disp_mode == ONE_DUAL && hdmi_switch_state) { if (cur_screen->xsize > 0 && cur_screen->xsize <= cur_screen->mode.xres) { win->area[i].xpos = @@ -1705,6 +1705,8 @@ static void rk_fb_update_reg(struct rk_lcdc_driver *dev_drv, } } dev_drv->ops->ovl_mgr(dev_drv, 0, 1); + if (dev_drv->ops->dsp_black) + dev_drv->ops->dsp_black(dev_drv, 0); dev_drv->ops->cfg_done(dev_drv); do { @@ -1936,7 +1938,7 @@ static int rk_fb_set_win_buffer(struct fb_info *info, reg_win_data->mirror_en = win_par->mirror_en; for (i = 0; i < reg_win_data->area_num; i++) { - rk_fb_check_config_var(&win_par->area_par[i], screen); + /*rk_fb_check_config_var(&win_par->area_par[i], screen);*/ fb_data_fmt = rk_fb_data_fmt(win_par->area_par[i].data_format, 0); reg_win_data->reg_area_data[i].data_format = fb_data_fmt; @@ -2144,10 +2146,27 @@ static int rk_fb_set_win_config(struct fb_info *info, #endif int ret = 0, i, j = 0; int list_is_empty = 0; - - if (dev_drv->suspend_flag) { + struct rk_screen *screen = dev_drv->cur_screen; + + for (i = 0; i < 4; i++) { + for (j = 0; j < 4; j++) { + if (win_data->win_par[i].area_par[j].ion_fd > 0) + ret += rk_fb_check_config_var( + &win_data->win_par[i].area_par[j], + screen); + } + } + if ((dev_drv->suspend_flag) || (dev_drv->hdmi_switch) || (ret < 0)) { dev_drv->timeline_max++; sw_sync_timeline_inc(dev_drv->timeline, 1); + if (dev_drv->suspend_flag) + pr_err("suspend_flag=%d\n", dev_drv->suspend_flag); + else if (dev_drv->hdmi_switch) + pr_err("hdmi switch = %d\n", dev_drv->hdmi_switch); + else + pr_err("error config ,ignore\n"); + for (j = 0; j < RK_MAX_BUF_NUM; j++) + win_data->rel_fence_fd[j] = -1; return 0; } @@ -2158,14 +2177,7 @@ static int rk_fb_set_win_config(struct fb_info *info, return ret; } -/* - regs->post_cfg.xpos = win_data->post_cfg.xpos; - regs->post_cfg.ypos = win_data->post_cfg.ypos; - regs->post_cfg.xsize = win_data->post_cfg.xsize; - regs->post_cfg.ysize = win_data->post_cfg.xsize; -*/ - - for (i = 0; i < dev_drv->lcdc_win_num; i++) { + for (i = 0,j = 0; i < dev_drv->lcdc_win_num; i++) { if (win_data->win_par[i].win_id < dev_drv->lcdc_win_num) { if (rk_fb_set_win_buffer(info, &win_data->win_par[i], ®s->reg_win_data[j])) @@ -3124,7 +3136,6 @@ int rk_fb_switch_screen(struct rk_screen *screen, int enable, int lcdc_id) if (unlikely(!rk_fb) || unlikely(!screen)) return -ENODEV; - hdmi_switch_complete = 0; /* get lcdc driver */ sprintf(name, "lcdc%d", lcdc_id); if (rk_fb->disp_mode != DUAL) @@ -3145,7 +3156,8 @@ int rk_fb_switch_screen(struct rk_screen *screen, int enable, int lcdc_id) dev_drv->id); if (enable == 2 /*&& dev_drv->enable*/) return 0; - + hdmi_switch_state = 0; + dev_drv->hdmi_switch = 1; if ((rk_fb->disp_mode == ONE_DUAL) || (rk_fb->disp_mode == NO_DUAL)) { if ((dev_drv->ops->backlight_close) && @@ -3162,8 +3174,10 @@ int rk_fb_switch_screen(struct rk_screen *screen, int enable, int lcdc_id) dev_drv->uboot_logo = 0; if (!enable) { /* if screen type is different, we do not disable lcdc. */ - if (dev_drv->cur_screen->type != screen->type) + if (dev_drv->cur_screen->type != screen->type) { + dev_drv->hdmi_switch = 0; return 0; + } /* if used one lcdc to dual disp, no need to close win */ if ((rk_fb->disp_mode == ONE_DUAL) || @@ -3179,12 +3193,12 @@ int rk_fb_switch_screen(struct rk_screen *screen, int enable, int lcdc_id) (dev_drv->cur_screen->mode.xres << 8) + (dev_drv->cur_screen->mode.yres << 20); mutex_lock(&dev_drv->win_config); - info->fbops->fb_set_par(info); - info->fbops->fb_pan_display(&info->var, info); + /*info->fbops->fb_set_par(info); + info->fbops->fb_pan_display(&info->var, info);*/ mutex_unlock(&dev_drv->win_config); - if (dev_drv->ops->dsp_black) - dev_drv->ops->dsp_black(dev_drv, 0); + /*if (dev_drv->ops->dsp_black) + dev_drv->ops->dsp_black(dev_drv, 0);*/ if ((dev_drv->ops->backlight_close) && (rk_fb->disp_policy != DISPLAY_POLICY_BOX)) dev_drv->ops->backlight_close(dev_drv, 0); @@ -3199,7 +3213,8 @@ int rk_fb_switch_screen(struct rk_screen *screen, int enable, int lcdc_id) } } - hdmi_switch_complete = 0; + hdmi_switch_state = 0; + dev_drv->hdmi_switch = 0; return 0; } else { if (dev_drv->screen1) @@ -3236,6 +3251,7 @@ int rk_fb_switch_screen(struct rk_screen *screen, int enable, int lcdc_id) } mutex_lock(&dev_drv->win_config); + info->var.yoffset = 0; info->fbops->fb_set_par(info); info->fbops->fb_pan_display(&info->var, info); mutex_unlock(&dev_drv->win_config); @@ -3245,13 +3261,14 @@ int rk_fb_switch_screen(struct rk_screen *screen, int enable, int lcdc_id) }else { dev_drv->uboot_logo = 0; } - hdmi_switch_complete = 1; + hdmi_switch_state = 1; + dev_drv->hdmi_switch = 0; if ((rk_fb->disp_mode == ONE_DUAL) || (rk_fb->disp_mode == NO_DUAL)) { if ((dev_drv->ops->set_screen_scaler) && (rk_fb->disp_mode == ONE_DUAL)) dev_drv->ops->set_screen_scaler(dev_drv, dev_drv->screen0, 1); - if (dev_drv->ops->dsp_black) - dev_drv->ops->dsp_black(dev_drv, 0); + /*if (dev_drv->ops->dsp_black) + dev_drv->ops->dsp_black(dev_drv, 0);*/ if ((dev_drv->ops->backlight_close) && (rk_fb->disp_policy != DISPLAY_POLICY_BOX) && (rk_fb->disp_mode == ONE_DUAL)) @@ -3282,7 +3299,9 @@ int rk_fb_disp_scale(u8 scale_x, u8 scale_y, u8 lcdc_id) if (primary_screen.type == SCREEN_HDMI) { return 0; } + pr_err("fuck not be hear--%s\n",__func__); + return 0; sprintf(name, "lcdc%d", lcdc_id); if (inf->disp_mode == DUAL) { diff --git a/include/linux/rk_fb.h b/include/linux/rk_fb.h index 7caa56a065ec..0355def79a2d 100644 --- a/include/linux/rk_fb.h +++ b/include/linux/rk_fb.h @@ -648,7 +648,8 @@ struct rk_lcdc_driver { int bcsh_init_status; bool cabc_pwm_pol; u8 reserved_fb; - + /*1:hdmi switch uncomplete,0:complete*/ + bool hdmi_switch; void *trace_buf; }; -- 2.34.1