From: hjc Date: Fri, 12 Dec 2014 07:01:28 +0000 (+0800) Subject: rk3368 lcdc: support win mirror and update NO_DUAL mode X-Git-Tag: firefly_0821_release~4240 X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=ccd1badc85bb1083f651ef05e7e8ce82692dc9a0;p=firefly-linux-kernel-4.4.55.git rk3368 lcdc: support win mirror and update NO_DUAL mode Signed-off-by: hjc --- diff --git a/drivers/video/rockchip/rk_fb.c b/drivers/video/rockchip/rk_fb.c old mode 100755 new mode 100644 index 3e0d3c1737d0..f9f89a1cb681 --- a/drivers/video/rockchip/rk_fb.c +++ b/drivers/video/rockchip/rk_fb.c @@ -1561,6 +1561,7 @@ static void rk_fb_update_win(struct rk_lcdc_driver *dev_drv, win->area[i].smem_start = reg_win_data->reg_area_data[i].smem_start; if (inf->disp_mode == DUAL || + inf->disp_mode == NO_DUAL || inf->disp_policy == DISPLAY_POLICY_BOX) { win->area[i].xpos = reg_win_data->reg_area_data[i].xpos; @@ -3138,7 +3139,11 @@ int rk_fb_switch_screen(struct rk_screen *screen, int enable, int lcdc_id) if (enable == 2 /*&& dev_drv->enable*/) return 0; - if (rk_fb->disp_mode == ONE_DUAL) { + if ((rk_fb->disp_mode == ONE_DUAL) || + (rk_fb->disp_mode == NO_DUAL)) { + if ((dev_drv->ops->backlight_close) && + (rk_fb->disp_policy != DISPLAY_POLICY_BOX)) + dev_drv->ops->backlight_close(dev_drv, 1); if (dev_drv->ops->dsp_black) dev_drv->ops->dsp_black(dev_drv, 1); if ((dev_drv->ops->set_screen_scaler) && @@ -3154,7 +3159,8 @@ int rk_fb_switch_screen(struct rk_screen *screen, int enable, int lcdc_id) return 0; /* if used one lcdc to dual disp, no need to close win */ - if (rk_fb->disp_mode == ONE_DUAL) { + if ((rk_fb->disp_mode == ONE_DUAL) || + (rk_fb->disp_mode == NO_DUAL)) { dev_drv->cur_screen = dev_drv->screen0; dev_drv->ops->load_screen(dev_drv, 1); @@ -3171,6 +3177,9 @@ int rk_fb_switch_screen(struct rk_screen *screen, int enable, int lcdc_id) 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); } else if (rk_fb->num_lcdc > 1) { /* If there is more than one lcdc device, we disable the layer which attached to this device */ @@ -3235,6 +3244,10 @@ int rk_fb_switch_screen(struct rk_screen *screen, int enable, int lcdc_id) 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->backlight_close) && + (rk_fb->disp_policy != DISPLAY_POLICY_BOX) && + (rk_fb->disp_mode == ONE_DUAL)) + dev_drv->ops->backlight_close(dev_drv, 0); } return 0; } @@ -3491,7 +3504,7 @@ static int init_lcdc_device_driver(struct rk_fb *rk_fb, dev_drv->screen0 = screen; dev_drv->cur_screen = screen; /* devie use one lcdc + rk61x scaler for dual display */ - if (rk_fb->disp_mode == ONE_DUAL) { + if ((rk_fb->disp_mode == ONE_DUAL) || (rk_fb->disp_mode == NO_DUAL)) { struct rk_screen *screen1 = devm_kzalloc(dev_drv->dev, sizeof(struct rk_screen), diff --git a/include/linux/rk_fb.h b/include/linux/rk_fb.h old mode 100755 new mode 100644 index fbc7642aab24..f20f9978be21 --- a/include/linux/rk_fb.h +++ b/include/linux/rk_fb.h @@ -473,6 +473,7 @@ struct rk_lcdc_drv_ops { int (*set_overscan) (struct rk_lcdc_driver *dev_drv, struct overscan *overscan); int (*dsp_black) (struct rk_lcdc_driver *dev_drv, int enable); + int (*backlight_close)(struct rk_lcdc_driver *dev_drv, int enable); }; struct rk_fb_area_par {