video: rockchip: fb: add function for vop pwm config done
authorHuang Jiachai <hjc@rock-chips.com>
Tue, 23 Aug 2016 03:11:46 +0000 (11:11 +0800)
committerHuang, Tao <huangtao@rock-chips.com>
Wed, 24 Aug 2016 11:27:08 +0000 (19:27 +0800)
Change-Id: I80350293c644fc0db1f613b3de14e34b7f3bc0f2
Signed-off-by: Huang Jiachai <hjc@rock-chips.com>
drivers/video/rockchip/rk_fb.c
include/linux/rk_fb.h

index a66afcbec54739717fa972132252aed55beb8275..e047ea22304706ae4c5b14728fd4f117f5a7e58f 100644 (file)
@@ -644,6 +644,34 @@ char *get_format_string(enum data_format format, char *fmt)
        return fmt;
 }
 
+int rk_fb_set_vop_pwm(void)
+{
+       int i = 0;
+       struct rk_fb *inf = NULL;
+       struct rk_lcdc_driver *dev_drv = NULL;
+
+       if (likely(fb_pdev))
+               inf = platform_get_drvdata(fb_pdev);
+       else
+               return -1;
+
+       for (i = 0; i < inf->num_lcdc; i++) {
+               if (inf->lcdc_dev_drv[i]->cabc_mode == 1) {
+                       dev_drv = inf->lcdc_dev_drv[i];
+                       break;
+               }
+       }
+
+       if (!dev_drv)
+               return -1;
+
+       mutex_lock(&dev_drv->win_config);
+       dev_drv->ops->cfg_done(dev_drv);
+       mutex_unlock(&dev_drv->win_config);
+
+       return 0;
+}
+
 /*
  * this is for hdmi
  * name: lcdc device name ,lcdc0 , lcdc1
@@ -1899,16 +1927,15 @@ static void rk_fb_update_reg(struct rk_lcdc_driver *dev_drv,
                }
        }
 
+       mutex_lock(&dev_drv->win_config);
        for (i = 0; i < dev_drv->lcdc_win_num; i++) {
                win = dev_drv->win[i];
                win_data = rk_fb_get_win_data(regs, i);
                if (win_data) {
-                       mutex_lock(&dev_drv->win_config);
                        rk_fb_update_win(dev_drv, win, win_data);
                        win->state = 1;
                        dev_drv->ops->set_par(dev_drv, i);
                        dev_drv->ops->pan_display(dev_drv, i);
-                       mutex_unlock(&dev_drv->win_config);
                } else {
                        win->z_order = -1;
                        win->state = 0;
@@ -1940,6 +1967,7 @@ static void rk_fb_update_reg(struct rk_lcdc_driver *dev_drv,
                dev_drv->ops->cfg_done(dev_drv);
        else
                sw_sync_timeline_inc(dev_drv->timeline, 1);
+       mutex_unlock(&dev_drv->win_config);
 
        do {
                timestamp = dev_drv->vsync_info.timestamp;
index 60952abc916522d3cfd47e6e4ca32ccdfbc55d44..302330efb29a045e022d962dbad5450a3ac50d05 100755 (executable)
@@ -800,6 +800,7 @@ extern int rk_fb_register(struct rk_lcdc_driver *dev_drv,
 extern int rk_fb_unregister(struct rk_lcdc_driver *dev_drv);
 extern struct rk_lcdc_driver *rk_get_lcdc_drv(char *name);
 extern int rk_fb_get_extern_screen(struct rk_screen *screen);
+extern int rk_fb_set_vop_pwm(void);
 extern int rk_fb_get_prmry_screen( struct rk_screen *screen);
 extern int rk_fb_set_prmry_screen(struct rk_screen *screen);
 extern u32 rk_fb_get_prmry_screen_pixclock(void);