diff --git a/drivers/amlogic/media/vout/backlight/aml_bl.c b/drivers/amlogic/media/vout/backlight/aml_bl.c index 2d84bdb4916a..437cfc7bdca6 100644 --- a/drivers/amlogic/media/vout/backlight/aml_bl.c +++ b/drivers/amlogic/media/vout/backlight/aml_bl.c @@ -37,6 +37,7 @@ #ifdef CONFIG_AMLOGIC_LCD #include #include +#include #endif #ifdef CONFIG_AMLOGIC_BL_EXTERN #include @@ -3280,8 +3281,15 @@ static const struct of_device_id bl_dt_match_table[] = { static void aml_bl_init_status_update(void) { + struct aml_lcd_drv_s *lcd_drv = aml_lcd_get_driver(); + struct lcd_config_s *pconf; unsigned int state; + pconf = lcd_drv->lcd_config; + + if (pconf->lcd_boot_ctrl->lcd_init_level) + return; + state = bl_vcbus_read(ENCL_VIDEO_EN); if (state == 0) /* default disable lcd & backlight */ return; diff --git a/drivers/amlogic/media/vout/lcd/lcd_tcon.c b/drivers/amlogic/media/vout/lcd/lcd_tcon.c index b2e26713d24a..77e12f96c411 100644 --- a/drivers/amlogic/media/vout/lcd/lcd_tcon.c +++ b/drivers/amlogic/media/vout/lcd/lcd_tcon.c @@ -409,6 +409,7 @@ int lcd_tcon_core_reg_get(unsigned char *buf, unsigned int size) int lcd_tcon_od_set(int flag) { + struct aml_lcd_drv_s *lcd_drv = aml_lcd_get_driver(); unsigned int reg, bit, temp; int ret; @@ -429,6 +430,9 @@ int lcd_tcon_od_set(int flag) } } + if (!(lcd_drv->lcd_status & LCD_STATUS_IF_ON)) + return -1; + reg = lcd_tcon_data->reg_core_od; bit = lcd_tcon_data->bit_od_en; if (lcd_tcon_data->core_reg_width == 8) diff --git a/drivers/amlogic/media/vout/lcd/lcd_vout.c b/drivers/amlogic/media/vout/lcd/lcd_vout.c index b7fc0b071e26..5f035237c08d 100644 --- a/drivers/amlogic/media/vout/lcd/lcd_vout.c +++ b/drivers/amlogic/media/vout/lcd/lcd_vout.c @@ -167,6 +167,7 @@ static struct lcd_boot_ctrl_s lcd_boot_ctrl_config = { .lcd_type = LCD_TYPE_MAX, .lcd_bits = 0, .advanced_flag = 0, + .lcd_init_level = 0, .debug_print_flag = 0, .debug_test_pattern = 0, .debug_para_source = 0, @@ -310,6 +311,12 @@ static void lcd_power_encl_on(void) { mutex_lock(&lcd_vout_mutex); + if (lcd_driver->lcd_status & LCD_STATUS_ENCL_ON) { + LCDPR("%s: on already\n", __func__); + mutex_unlock(&lcd_vout_mutex); + return; + } + lcd_driver->driver_init_pre(); lcd_driver->lcd_status |= LCD_STATUS_ENCL_ON; @@ -336,6 +343,11 @@ static void lcd_power_encl_off(void) { mutex_lock(&lcd_vout_mutex); + if (!(lcd_driver->lcd_status & LCD_STATUS_ENCL_ON)) { + LCDPR("%s: off already\n", __func__); + mutex_unlock(&lcd_vout_mutex); + return; + } lcd_driver->lcd_status &= ~LCD_STATUS_ENCL_ON; lcd_driver->driver_disable_post(); @@ -350,21 +362,21 @@ static void lcd_power_encl_off(void) static void lcd_power_if_on(void) { mutex_lock(&lcd_vout_mutex); - - lcd_driver->power_ctrl(1); - lcd_driver->lcd_status |= LCD_STATUS_IF_ON; + if (!(lcd_driver->lcd_status & LCD_STATUS_IF_ON)) { + lcd_driver->power_ctrl(1); + lcd_driver->lcd_status |= LCD_STATUS_IF_ON; + } lcd_driver->lcd_config->change_flag = 0; - mutex_unlock(&lcd_vout_mutex); } static void lcd_power_if_off(void) { mutex_lock(&lcd_vout_mutex); - - lcd_driver->lcd_status &= ~LCD_STATUS_IF_ON; - lcd_driver->power_ctrl(0); - + if (lcd_driver->lcd_status & LCD_STATUS_IF_ON) { + lcd_driver->lcd_status &= ~LCD_STATUS_IF_ON; + lcd_driver->power_ctrl(0); + } mutex_unlock(&lcd_vout_mutex); } @@ -1056,7 +1068,10 @@ static void lcd_config_default(void) pconf->lcd_basic.v_active = lcd_vcbus_read(ENCL_VIDEO_VAVON_ELINE) - lcd_vcbus_read(ENCL_VIDEO_VAVON_BLINE) + 1; if (lcd_vcbus_read(ENCL_VIDEO_EN)) { - lcd_driver->lcd_status = LCD_STATUS_ON; + if (lcd_boot_ctrl_config.lcd_init_level) + lcd_driver->lcd_status = LCD_STATUS_ENCL_ON; + else + lcd_driver->lcd_status = LCD_STATUS_ON; lcd_resume_flag = 1; } else { lcd_driver->lcd_status = 0; @@ -1590,7 +1605,8 @@ static int __init lcd_boot_ctrl_setup(char *str) lcd_boot_ctrl_config.lcd_type = 0xf & lcd_ctrl; lcd_boot_ctrl_config.lcd_bits = 0xf & (lcd_ctrl >> 4); lcd_boot_ctrl_config.advanced_flag = 0xff & (lcd_ctrl >> 8); - lcd_boot_ctrl_config.debug_print_flag = 0xf & (lcd_ctrl >> 16); + lcd_boot_ctrl_config.lcd_init_level = 0x1 & (lcd_ctrl >> 19); + lcd_boot_ctrl_config.debug_print_flag = 0xf & (lcd_ctrl >> 20); lcd_boot_ctrl_config.debug_test_pattern = 0xf & (lcd_ctrl >> 24); lcd_boot_ctrl_config.debug_para_source = 0x3 & (lcd_ctrl >> 28); lcd_boot_ctrl_config.debug_lcd_mode = 0x3 & (lcd_ctrl >> 30); diff --git a/include/linux/amlogic/media/vout/lcd/lcd_vout.h b/include/linux/amlogic/media/vout/lcd/lcd_vout.h index 641a7ddd5bce..9ad3815b95ab 100644 --- a/include/linux/amlogic/media/vout/lcd/lcd_vout.h +++ b/include/linux/amlogic/media/vout/lcd/lcd_vout.h @@ -425,7 +425,8 @@ struct lcd_boot_ctrl_s { unsigned char lcd_type; //bit[3:0] unsigned char lcd_bits; //bit[7:4] bits:6 or 8 unsigned char advanced_flag; //bit[15:8] - unsigned char debug_print_flag; //bit[19:16] + unsigned char lcd_init_level; //bit[19] + unsigned char debug_print_flag; //bit[23:20] unsigned char debug_test_pattern; //bit[27:24] unsigned char debug_para_source;//bit[29:28] //0:normal, 1:dts, 2:unifykey, 3:TBD