rk fb: add support scaler for one lcdc dual disp
authorzwl <zwl@rockchips.com>
Mon, 28 Jul 2014 14:46:12 +0000 (22:46 +0800)
committerzwl <zwl@rockchips.com>
Mon, 28 Jul 2014 14:46:12 +0000 (22:46 +0800)
drivers/video/rockchip/lcdc/Makefile
drivers/video/rockchip/rk_fb.c
drivers/video/rockchip/transmitter/Makefile
include/linux/rk_fb.h

index 4c96d38d03285e4dbf0d4b22068e09ee3aab40cb..a1c693f63a585dbcc742554d594e0d520240bbc3 100644 (file)
@@ -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
index 2573ab9d3e1eeda193031c7c3900d8ab62946770..4d4a534e7587c07446a30956678e10e6b6b4fbc2 100755 (executable)
@@ -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);
index 0c5f6e57bd27e2d6ee08695ab6ee36a56f49e3bf..63dfbd0ee7c8d875a0f67c5763bc3537478de9ca 100755 (executable)
@@ -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
index da1e03cae33ad908daf8c08d69c368c5a56ecfdc..4abc5e21e2d0267445551795c2f8796734333ead 100755 (executable)
@@ -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);