From: Weiming Liu Date: Fri, 9 Mar 2018 08:24:57 +0000 (+0800) Subject: lcd: fix lcd_resume without panel display mode mistake X-Git-Tag: khadas-vims-v0.9.6-release~2332 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=d5ab425596529e923ed5d4dfcf12506b2d64f278;p=platform%2Fkernel%2Flinux-amlogic.git lcd: fix lcd_resume without panel display mode mistake PD#156734: lcd: fix lcd_resume without panel display mode mistake Change-Id: I2f41dba8fd777cf6748a3b3fe7f2b7922a12591d Signed-off-by: Weiming Liu --- diff --git a/drivers/amlogic/media/vout/lcd/lcd_tablet/lcd_tablet.c b/drivers/amlogic/media/vout/lcd/lcd_tablet/lcd_tablet.c index eed2c32..e2c185e 100644 --- a/drivers/amlogic/media/vout/lcd/lcd_tablet/lcd_tablet.c +++ b/drivers/amlogic/media/vout/lcd/lcd_tablet/lcd_tablet.c @@ -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; diff --git a/drivers/amlogic/media/vout/lcd/lcd_tv/lcd_tv.c b/drivers/amlogic/media/vout/lcd/lcd_tv/lcd_tv.c index 6e789f4..695e3e4 100644 --- a/drivers/amlogic/media/vout/lcd/lcd_tv/lcd_tv.c +++ b/drivers/amlogic/media/vout/lcd/lcd_tv/lcd_tv.c @@ -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; diff --git a/drivers/amlogic/media/vout/lcd/lcd_vout.c b/drivers/amlogic/media/vout/lcd/lcd_vout.c index 4ea46df..81d0406 100644 --- a/drivers/amlogic/media/vout/lcd/lcd_vout.c +++ b/drivers/amlogic/media/vout/lcd/lcd_vout.c @@ -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) { diff --git a/include/linux/amlogic/media/vout/lcd/lcd_vout.h b/include/linux/amlogic/media/vout/lcd/lcd_vout.h index 8fb5e88..bc2d89d 100644 --- a/include/linux/amlogic/media/vout/lcd/lcd_vout.h +++ b/include/linux/amlogic/media/vout/lcd/lcd_vout.h @@ -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 {