From: zwl Date: Mon, 28 Jul 2014 14:46:12 +0000 (+0800) Subject: rk fb: add support scaler for one lcdc dual disp X-Git-Tag: firefly_0821_release~4916^2~137 X-Git-Url: http://plrg.eecs.uci.edu/git/?a=commitdiff_plain;h=f3edddc359dc876a429b06430e72a26dfd4d1792;p=firefly-linux-kernel-4.4.55.git rk fb: add support scaler for one lcdc dual disp --- diff --git a/drivers/video/rockchip/lcdc/Makefile b/drivers/video/rockchip/lcdc/Makefile index 4c96d38d0328..a1c693f63a58 100644 --- a/drivers/video/rockchip/lcdc/Makefile +++ b/drivers/video/rockchip/lcdc/Makefile @@ -3,4 +3,4 @@ obj-$(CONFIG_LCDC_RK2928) += rk2928_lcdc.o obj-$(CONFIG_LCDC_RK3066B) += rk3066b_lcdc.o obj-$(CONFIG_LCDC_RK3188) += rk3188_lcdc.o obj-$(CONFIG_LCDC_RK3288) += rk3288_lcdc.o -obj-$(CONFIG_LCDC_RK3036) += rk3036_lcdc.o +obj-$(CONFIG_LCDC_RK3036) += rk312x_lcdc.o diff --git a/drivers/video/rockchip/rk_fb.c b/drivers/video/rockchip/rk_fb.c index 2573ab9d3e1e..4d4a534e7587 100755 --- a/drivers/video/rockchip/rk_fb.c +++ b/drivers/video/rockchip/rk_fb.c @@ -606,6 +606,22 @@ int rk_fb_set_prmry_screen_status(int status) return 0; } +static int rk_fb_set_screen_scaler(struct rk_screen *screen, bool enable) +{ + struct rk_lcdc_driver *dev_drv = rk_get_prmry_lcdc_drv(); + + if(unlikely(!dev_drv) || unlikely(!screen)) + return -1; + if (!enable) + return 0; + + rk_fb_set_prmry_screen_status(SCREEN_PREPARE_DDR_CHANGE); + if (dev_drv->ops->set_screen_scaler) + dev_drv->ops->set_screen_scaler(dev_drv, screen, enable); + rk_fb_set_prmry_screen_status(SCREEN_UNPREPARE_DDR_CHANGE); + return 0; +} + static struct rk_lcdc_driver *rk_get_extend_lcdc_drv(void) { struct rk_fb *inf = NULL; @@ -3176,6 +3192,9 @@ int rk_fb_switch_screen(struct rk_screen *screen, int enable, int lcdc_id) if (rk_fb->disp_mode != DUAL) { dev_drv = rk_fb->lcdc_dev_drv[0]; + if (dev_drv->trsm_ops && dev_drv->trsm_ops->disable) + dev_drv->trsm_ops->disable(); + rk_disp_pwr_disable(dev_drv); } else { for (i = 0; i < rk_fb->num_lcdc; i++) { if (rk_fb->lcdc_dev_drv[i]->prop == EXTEND) { @@ -3275,19 +3294,27 @@ int rk_fb_switch_screen(struct rk_screen *screen, int enable, int lcdc_id) hdmi_switch_complete = enable; info->fbops->fb_pan_display(hdmi_var, info); - /* info->fbops->fb_ioctl(info, RK_FBIOSET_CONFIG_DONE, 0); */ if (dev_drv->screen1) { if (dev_drv->screen0->sscreen_set) { + /* dev_drv->ops->blank(dev_drv, 0, FB_BLANK_NORMAL); msleep(100); + */ dev_drv->screen0->sscreen_set(dev_drv->screen0, enable); + /* dev_drv->ops->blank(dev_drv, 0, FB_BLANK_UNBLANK); + */ } } - /* - if (rk_fb->disp_mode != DUAL) - rk29_backlight_set(1); - */ + + info->fbops->fb_ioctl(info, RK_FBIOSET_CONFIG_DONE, 0); + + if (rk_fb->disp_mode != DUAL) { + /* rk29_backlight_set(1); */ + rk_disp_pwr_enable(dev_drv); + if (dev_drv->trsm_ops && dev_drv->trsm_ops->enable) + dev_drv->trsm_ops->enable(); + } return 0; } #endif @@ -3570,6 +3597,7 @@ static int init_lcdc_device_driver(struct rk_fb *rk_fb, screen1->screen_id = 1; screen1->lcdc_id = 1; dev_drv->screen1 = screen1; + dev_drv->screen0->sscreen_set = rk_fb_set_screen_scaler; } sprintf(dev_drv->name, "lcdc%d", dev_drv->id); init_lcdc_win(dev_drv, def_win); diff --git a/drivers/video/rockchip/transmitter/Makefile b/drivers/video/rockchip/transmitter/Makefile index 0c5f6e57bd27..63dfbd0ee7c8 100755 --- a/drivers/video/rockchip/transmitter/Makefile +++ b/drivers/video/rockchip/transmitter/Makefile @@ -5,7 +5,7 @@ obj-$(CONFIG_RK2928_LVDS) += rk2928_lvds.o obj-$(CONFIG_RK3026_LVDS) += rk3026_lvds.o obj-$(CONFIG_RK610_LVDS) += rk610_lcd.o obj-$(CONFIG_RK616_LVDS) += rk616_lvds.o -obj-$(CONFIG_RK32_LVDS) += rk32_lvds.o +obj-$(CONFIG_RK32_LVDS) += rk31xx_lvds.o obj-$(CONFIG_DP_ANX6345) += dp_anx6345.o obj-$(CONFIG_DP501) += dp501.o obj-$(CONFIG_RK32_DP) += rk32_dp.o rk32_dp_reg.o diff --git a/include/linux/rk_fb.h b/include/linux/rk_fb.h index da1e03cae33a..4abc5e21e2d0 100755 --- a/include/linux/rk_fb.h +++ b/include/linux/rk_fb.h @@ -434,6 +434,7 @@ struct rk_lcdc_drv_ops { int (*get_dsp_bcsh_hue) (struct rk_lcdc_driver *dev_drv,bcsh_hue_mode mode); int (*get_dsp_bcsh_bcs)(struct rk_lcdc_driver *dev_drv,bcsh_bcs_mode mode); int (*open_bcsh)(struct rk_lcdc_driver *dev_drv, bool open); + int (*set_screen_scaler) (struct rk_lcdc_driver *dev_drv, struct rk_screen *screen, bool enable); int (*dump_reg) (struct rk_lcdc_driver * dev_drv); int (*mmu_en) (struct rk_lcdc_driver * dev_drv); int (*cfg_done) (struct rk_lcdc_driver * dev_drv);