vout: optimize display mode changing flow
authorEvoke Zhang <evoke.zhang@amlogic.com>
Thu, 8 Mar 2018 06:59:49 +0000 (14:59 +0800)
committerJianxin Pan <jianxin.pan@amlogic.com>
Fri, 9 Mar 2018 05:27:30 +0000 (21:27 -0800)
PD#161389: vout: optimize display mode changing flow

Change-Id: I29fadc879d1915917ffe19e3a4fa08ae36f36fd8
Signed-off-by: Evoke Zhang <evoke.zhang@amlogic.com>
drivers/amlogic/media/vout/lcd/lcd_tablet/lcd_tablet.c
drivers/amlogic/media/vout/lcd/lcd_tv/lcd_tv.c
drivers/amlogic/media/vout/vout_serve/vout_func.c

index be574e3..eed2c32 100644 (file)
@@ -83,26 +83,29 @@ static int lcd_set_current_vmode(enum vmode_e mode)
        int ret = 0;
        struct aml_lcd_drv_s *lcd_drv = aml_lcd_get_driver();
 
-       mutex_lock(&lcd_vout_mutex);
+       mutex_lock(&lcd_drv->power_mutex);
 
        if (!(mode & VMODE_INIT_BIT_MASK)) {
-               if (VMODE_LCD == (mode & VMODE_MODE_BIT_MASK)) {
-                       lcd_drv->driver_init_pre();
-                       ret = lcd_drv->driver_init();
-               } else {
+               if (VMODE_LCD == (mode & VMODE_MODE_BIT_MASK))
+                       aml_lcd_notifier_call_chain(LCD_EVENT_POWER_ON, NULL);
+               else
                        ret = -EINVAL;
-               }
        } else
                lcd_clk_gate_switch(1);
 
-       mutex_unlock(&lcd_vout_mutex);
+       mutex_unlock(&lcd_drv->power_mutex);
        return ret;
 }
 
 static int lcd_vout_disable(enum vmode_e cur_vmod)
 {
-       aml_lcd_notifier_call_chain(LCD_EVENT_IF_POWER_OFF, NULL);
+       struct aml_lcd_drv_s *lcd_drv = aml_lcd_get_driver();
+
+       mutex_lock(&lcd_drv->power_mutex);
+       aml_lcd_notifier_call_chain(LCD_EVENT_POWER_OFF, NULL);
        LCDPR("%s finished\n", __func__);
+       mutex_unlock(&lcd_drv->power_mutex);
+
        return 0;
 }
 
index aaeda21..6e789f4 100644 (file)
@@ -284,7 +284,7 @@ static int lcd_set_current_vmode(enum vmode_e mode)
                LCDPR("vout_serve bypass\n");
                return 0;
        }
-       mutex_lock(&lcd_vout_mutex);
+       mutex_lock(&lcd_drv->power_mutex);
 
        /* do not change mode value here, for bit mask is useful */
        lcd_vmode_vinfo_update(mode & VMODE_MODE_BIT_MASK);
@@ -292,7 +292,9 @@ static int lcd_set_current_vmode(enum vmode_e mode)
        if (!(mode & VMODE_INIT_BIT_MASK)) {
                switch (mode & VMODE_MODE_BIT_MASK) {
                case VMODE_LCD:
+                       mutex_lock(&lcd_vout_mutex);
                        ret = lcd_drv->driver_change();
+                       mutex_unlock(&lcd_vout_mutex);
                        break;
                default:
                        ret = -EINVAL;
@@ -300,7 +302,7 @@ static int lcd_set_current_vmode(enum vmode_e mode)
        } else
                lcd_clk_gate_switch(1);
 
-       mutex_unlock(&lcd_vout_mutex);
+       mutex_unlock(&lcd_drv->power_mutex);
        return ret;
 }
 
index 35766b0..099e1a4 100644 (file)
@@ -121,8 +121,8 @@ static inline int vout_func_check_state(int index, unsigned int state,
 static void vout_func_update_viu(int index, struct vout_server_s *p_server)
 {
        struct vinfo_s *vinfo = NULL;
-       unsigned int mux_bit = 0, mux_sel = 3;
-       unsigned int clk_bit = 0, clk_sel = 0;
+       unsigned int mux_bit = 0xff, mux_sel = VIU_MUX_MAX;
+       unsigned int clk_bit = 0xff, clk_sel = 0;
 
        if (p_server->op.get_vinfo)
                vinfo = p_server->op.get_vinfo();
@@ -157,8 +157,12 @@ static void vout_func_update_viu(int index, struct vout_server_s *p_server)
                break;
        }
 
-       vout_func_vcbus_setb(VPU_VIU_VENC_MUX_CTRL, mux_sel, mux_bit, 2);
-       vout_func_vcbus_setb(VPU_VENCX_CLK_CTRL, clk_sel, clk_bit, 1);
+       if (mux_bit < 0xff) {
+               vout_func_vcbus_setb(VPU_VIU_VENC_MUX_CTRL,
+                               mux_sel, mux_bit, 2);
+       }
+       if (clk_bit < 0xff)
+               vout_func_vcbus_setb(VPU_VENCX_CLK_CTRL, clk_sel, clk_bit, 1);
 
 #if 0
        VOUTPR("%s: %d, mux_sel=%d, clk_sel=%d\n",
@@ -193,8 +197,6 @@ int vout_func_set_current_vmode(int index, enum vmode_e mode)
 
                if (p_server->op.vmode_is_supported(mode) == true) {
                        p_module->curr_vout_server = p_server;
-                       vout_func_update_viu(index, p_server);
-                       ret = p_server->op.set_vmode(mode);
                        if (p_server->op.set_state)
                                p_server->op.set_state(index);
                } else {
@@ -207,6 +209,8 @@ int vout_func_set_current_vmode(int index, enum vmode_e mode)
                                p_server->op.clr_state(index);
                }
        }
+       vout_func_update_viu(index, p_module->curr_vout_server);
+       ret = p_module->curr_vout_server->op.set_vmode(mode);
 
        mutex_unlock(&vout_mutex);