lcd: fix lcd_resume without panel display mode mistake
authorWeiming Liu <weiming.liu@amlogic.com>
Fri, 9 Mar 2018 08:24:57 +0000 (16:24 +0800)
committerJianxin Pan <jianxin.pan@amlogic.com>
Tue, 13 Mar 2018 08:14:59 +0000 (00:14 -0800)
PD#156734: lcd: fix lcd_resume without panel display mode mistake

Change-Id: I2f41dba8fd777cf6748a3b3fe7f2b7922a12591d
Signed-off-by: Weiming Liu <weiming.liu@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/lcd/lcd_vout.c
include/linux/amlogic/media/vout/lcd/lcd_vout.h

index eed2c32..e2c185e 100644 (file)
@@ -93,7 +93,9 @@ static int lcd_set_current_vmode(enum vmode_e mode)
        } else
                lcd_clk_gate_switch(1);
 
+       lcd_drv->lcd_status |= LCD_STATUS_VMODE_ACTIVE;
        mutex_unlock(&lcd_drv->power_mutex);
+
        return ret;
 }
 
@@ -102,6 +104,7 @@ static int lcd_vout_disable(enum vmode_e cur_vmod)
        struct aml_lcd_drv_s *lcd_drv = aml_lcd_get_driver();
 
        mutex_lock(&lcd_drv->power_mutex);
+       lcd_drv->lcd_status &= ~LCD_STATUS_VMODE_ACTIVE;
        aml_lcd_notifier_call_chain(LCD_EVENT_POWER_OFF, NULL);
        LCDPR("%s finished\n", __func__);
        mutex_unlock(&lcd_drv->power_mutex);
@@ -326,6 +329,9 @@ static int lcd_resume(void)
 {
        struct aml_lcd_drv_s *lcd_drv = aml_lcd_get_driver();
 
+       if ((lcd_drv->lcd_status & LCD_STATUS_VMODE_ACTIVE) == 0)
+               return 0;
+
        if (lcd_resume_flag)
                return 0;
 
index 6e789f4..695e3e4 100644 (file)
@@ -302,6 +302,8 @@ static int lcd_set_current_vmode(enum vmode_e mode)
        } else
                lcd_clk_gate_switch(1);
 
+       lcd_drv->lcd_status |= LCD_STATUS_VMODE_ACTIVE;
+
        mutex_unlock(&lcd_drv->power_mutex);
        return ret;
 }
@@ -326,6 +328,10 @@ static int lcd_vmode_is_supported(enum vmode_e mode)
 
 static int lcd_vout_disable(enum vmode_e cur_vmod)
 {
+       struct aml_lcd_drv_s *lcd_drv = aml_lcd_get_driver();
+
+       lcd_drv->lcd_status &= ~LCD_STATUS_VMODE_ACTIVE;
+
        return 0;
 }
 
@@ -554,6 +560,9 @@ static int lcd_resume(void)
 {
        struct aml_lcd_drv_s *lcd_drv = aml_lcd_get_driver();
 
+       if ((lcd_drv->lcd_status & LCD_STATUS_VMODE_ACTIVE) == 0)
+               return 0;
+
        if (lcd_resume_flag)
                return 0;
 
index 4ea46df..81d0406 100644 (file)
@@ -1048,6 +1048,9 @@ static int lcd_remove(struct platform_device *pdev)
 
 static int lcd_resume(struct platform_device *pdev)
 {
+       if ((lcd_driver->lcd_status & LCD_STATUS_VMODE_ACTIVE) == 0)
+               return 0;
+
        if (lcd_driver->lcd_resume_type) {
                lcd_resume_flag = 1;
                if (lcd_driver->workqueue) {
index 8fb5e88..bc2d89d 100644 (file)
@@ -384,6 +384,7 @@ struct lcd_duration_s {
 
 #define LCD_STATUS_IF_ON      (1 << 0)
 #define LCD_STATUS_ENCL_ON    (1 << 1)
+#define LCD_STATUS_VMODE_ACTIVE  (1 << 2)
 #define LCD_STATUS_ON         (LCD_STATUS_IF_ON | LCD_STATUS_ENCL_ON)
 
 struct aml_lcd_drv_s {