mirror of
https://github.com/hardkernel/linux.git
synced 2026-06-08 20:07:46 +09:00
Merge "lcd: add lcd_ctrl bootargs for lcd driver control [2/2]" into amlogic-4.9-dev
This commit is contained in:
@@ -188,6 +188,16 @@ static struct lcd_power_ctrl_s lcd_power_config = {
|
||||
},
|
||||
};
|
||||
|
||||
static struct lcd_boot_ctrl_s lcd_boot_ctrl_config = {
|
||||
.lcd_type = LCD_TYPE_MAX,
|
||||
.lcd_bits = 0,
|
||||
.advanced_flag = 0,
|
||||
.debug_print_flag = 0,
|
||||
.debug_test_pattern = 0,
|
||||
.debug_para_source = 0,
|
||||
.debug_lcd_mode = 0,
|
||||
};
|
||||
|
||||
/* index 0: valid flag */
|
||||
static unsigned int vlock_param[LCD_VLOCK_PARAM_NUM] = {0};
|
||||
|
||||
@@ -228,6 +238,7 @@ static struct lcd_config_s lcd_config_dft = {
|
||||
.vlock_param = vlock_param,
|
||||
},
|
||||
.lcd_power = &lcd_power_config,
|
||||
.lcd_boot_ctrl = &lcd_boot_ctrl_config,
|
||||
.pinmux_flag = 0xff,
|
||||
.change_flag = 0,
|
||||
.retry_enable_flag = 0,
|
||||
@@ -1222,13 +1233,27 @@ static int lcd_config_probe(struct platform_device *pdev)
|
||||
lcd_driver->res_tcon_irq = NULL;
|
||||
|
||||
/* lcd driver assign */
|
||||
ret = of_property_read_string(lcd_driver->dev->of_node, "mode", &str);
|
||||
if (ret) {
|
||||
str = "none";
|
||||
LCDERR("failed to get mode\n");
|
||||
return -1;
|
||||
switch (lcd_boot_ctrl_config.debug_lcd_mode) {
|
||||
case 1:
|
||||
LCDPR("debug_lcd_mode: 1,tv mode\n");
|
||||
lcd_driver->lcd_mode = LCD_MODE_TV;
|
||||
break;
|
||||
case 2:
|
||||
LCDPR("debug_lcd_mode: 2,tablet mode\n");
|
||||
lcd_driver->lcd_mode = LCD_MODE_TABLET;
|
||||
break;
|
||||
default:
|
||||
ret = of_property_read_string(lcd_driver->dev->of_node,
|
||||
"mode", &str);
|
||||
if (ret) {
|
||||
str = "none";
|
||||
LCDERR("failed to get mode\n");
|
||||
return -1;
|
||||
}
|
||||
lcd_driver->lcd_mode = lcd_mode_str_to_mode(str);
|
||||
break;
|
||||
}
|
||||
lcd_driver->lcd_mode = lcd_mode_str_to_mode(str);
|
||||
|
||||
ret = of_property_read_u32(lcd_driver->dev->of_node,
|
||||
"fr_auto_policy", &val);
|
||||
if (ret) {
|
||||
@@ -1238,14 +1263,29 @@ static int lcd_config_probe(struct platform_device *pdev)
|
||||
} else {
|
||||
lcd_driver->fr_auto_policy = (unsigned char)val;
|
||||
}
|
||||
ret = of_property_read_u32(lcd_driver->dev->of_node, "key_valid", &val);
|
||||
if (ret) {
|
||||
if (lcd_debug_print_flag)
|
||||
LCDPR("failed to get key_valid\n");
|
||||
|
||||
switch (lcd_boot_ctrl_config.debug_para_source) {
|
||||
case 1:
|
||||
LCDPR("debug_para_source: 1,dts\n");
|
||||
lcd_driver->lcd_key_valid = 0;
|
||||
} else {
|
||||
lcd_driver->lcd_key_valid = (unsigned char)val;
|
||||
break;
|
||||
case 2:
|
||||
LCDPR("debug_para_source: 2,unifykey\n");
|
||||
lcd_driver->lcd_key_valid = 1;
|
||||
break;
|
||||
default:
|
||||
ret = of_property_read_u32(lcd_driver->dev->of_node,
|
||||
"key_valid", &val);
|
||||
if (ret) {
|
||||
if (lcd_debug_print_flag)
|
||||
LCDPR("failed to get key_valid\n");
|
||||
lcd_driver->lcd_key_valid = 0;
|
||||
} else {
|
||||
lcd_driver->lcd_key_valid = (unsigned char)val;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
LCDPR("detect mode: %s, fr_auto_policy: %d, key_valid: %d\n",
|
||||
str, lcd_driver->fr_auto_policy, lcd_driver->lcd_key_valid);
|
||||
|
||||
@@ -1280,7 +1320,7 @@ static int lcd_config_probe(struct platform_device *pdev)
|
||||
|
||||
lcd_driver->lcd_info = &lcd_vinfo;
|
||||
lcd_driver->lcd_config = &lcd_config_dft;
|
||||
lcd_driver->lcd_test_state = 0;
|
||||
lcd_driver->lcd_test_state = lcd_boot_ctrl_config.debug_test_pattern;
|
||||
lcd_driver->lcd_test_flag = 0;
|
||||
lcd_driver->lcd_mute_state = 0;
|
||||
lcd_driver->lcd_mute_flag = 0;
|
||||
@@ -1312,6 +1352,26 @@ static int lcd_config_probe(struct platform_device *pdev)
|
||||
}
|
||||
}
|
||||
|
||||
if (lcd_driver->lcd_config->lcd_basic.lcd_type == LCD_TYPE_MAX) {
|
||||
switch (lcd_boot_ctrl_config.lcd_type) {
|
||||
case LCD_TTL:
|
||||
lcd_driver->lcd_config->lcd_basic.lcd_bits =
|
||||
lcd_boot_ctrl_config.lcd_bits;
|
||||
lcd_driver->lcd_config->lcd_control.ttl_config->sync_valid =
|
||||
lcd_boot_ctrl_config.advanced_flag;
|
||||
lcd_ttl_pinmux_set(1);
|
||||
break;
|
||||
case LCD_VBYONE:
|
||||
lcd_vbyone_pinmux_set(1);
|
||||
break;
|
||||
case LCD_MLVDS:
|
||||
case LCD_P2P:
|
||||
lcd_tcon_pinmux_set(1);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -1427,11 +1487,8 @@ static int lcd_probe(struct platform_device *pdev)
|
||||
const struct of_device_id *match;
|
||||
int ret = 0;
|
||||
|
||||
#ifdef LCD_DEBUG_INFO
|
||||
lcd_debug_print_flag = 1;
|
||||
#else
|
||||
lcd_debug_print_flag = 0;
|
||||
#endif
|
||||
lcd_debug_print_flag = lcd_boot_ctrl_config.debug_print_flag;
|
||||
|
||||
lcd_driver = kmalloc(sizeof(struct aml_lcd_drv_s), GFP_KERNEL);
|
||||
if (!lcd_driver) {
|
||||
LCDERR("%s: lcd driver no enough memory\n", __func__);
|
||||
@@ -1598,7 +1655,36 @@ static int __init lcd_panel_type_para_setup(char *str)
|
||||
LCDPR("panel_type: %s\n", lcd_propname);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int __init lcd_boot_ctrl_setup(char *str)
|
||||
{
|
||||
//struct lcd_boot_ctrl_s *lcd_boot_ctrl = lcd_config_dft.lcd_boot_ctrl;
|
||||
|
||||
int ret = 0;
|
||||
unsigned int lcd_ctrl = 0;
|
||||
|
||||
if (str == NULL)
|
||||
return -EINVAL;
|
||||
|
||||
ret = kstrtouint(str, 16, &lcd_ctrl);
|
||||
if (ret) {
|
||||
LCDERR("%s:invalid data\n", __func__);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
LCDPR("lcd_ctrl: 0x%08x\n", lcd_ctrl);
|
||||
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.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);
|
||||
return 0;
|
||||
}
|
||||
|
||||
__setup("panel_type=", lcd_panel_type_para_setup);
|
||||
__setup("lcd_ctrl=", lcd_boot_ctrl_setup);
|
||||
|
||||
MODULE_DESCRIPTION("Meson LCD Panel Driver");
|
||||
MODULE_LICENSE("GPL");
|
||||
|
||||
@@ -434,6 +434,18 @@ struct lcd_power_ctrl_s {
|
||||
int power_off_step_max; /* internal use for debug */
|
||||
};
|
||||
|
||||
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 debug_test_pattern; //bit[27:24]
|
||||
unsigned char debug_para_source;//bit[29:28]
|
||||
//0:normal, 1:dts, 2:unifykey, 3:TBD
|
||||
unsigned char debug_lcd_mode; //bit[31:30]
|
||||
//0:normal, 1:tv, 2:tablet, 3:TBD
|
||||
};
|
||||
|
||||
#define LCD_ENABLE_RETRY_MAX 3
|
||||
struct lcd_config_s {
|
||||
char *lcd_propname;
|
||||
@@ -444,6 +456,7 @@ struct lcd_config_s {
|
||||
struct lcd_optical_info_s optical_info;
|
||||
struct lcd_control_config_s lcd_control;
|
||||
struct lcd_power_ctrl_s *lcd_power;
|
||||
struct lcd_boot_ctrl_s *lcd_boot_ctrl;
|
||||
struct pinctrl *pin;
|
||||
unsigned char pinmux_flag;
|
||||
unsigned char change_flag;
|
||||
|
||||
Reference in New Issue
Block a user