From 7ed9aace4a2af4a2be897785c275475713fb11cd Mon Sep 17 00:00:00 2001 From: Evoke Zhang Date: Wed, 23 May 2018 12:26:41 +0800 Subject: [PATCH] backlight: ldim: optimize get config flow [2/3] PD#166898: backlight: ldim: optimize get config flow also correct local dimming spelling mistake Change-Id: Iea2c7802e9fa55ad2e587126e1281ec9b34113e2 Signed-off-by: Evoke Zhang --- .../boot/dts/amlogic/mesontxlx_r311-panel.dtsi | 24 +- drivers/amlogic/media/vout/backlight/aml_bl.c | 218 ++++-- .../media/vout/backlight/aml_ldim/global_bl.c | 6 +- .../media/vout/backlight/aml_ldim/iw7027_bl.c | 114 +-- .../media/vout/backlight/aml_ldim/ldim_dev_drv.c | 97 ++- .../media/vout/backlight/aml_ldim/ldim_drv.c | 810 +++++++++++++-------- .../media/vout/backlight/aml_ldim/ldim_drv.h | 12 +- .../media/vout/backlight/aml_ldim/ldim_func.c | 195 ++--- drivers/amlogic/media/vout/lcd/lcd_debug.c | 2 +- include/linux/amlogic/media/vout/lcd/aml_bl.h | 4 +- include/linux/amlogic/media/vout/lcd/aml_ldim.h | 23 +- .../linux/amlogic/media/vout/lcd/lcd_unifykey.h | 25 +- 12 files changed, 939 insertions(+), 591 deletions(-) diff --git a/arch/arm64/boot/dts/amlogic/mesontxlx_r311-panel.dtsi b/arch/arm64/boot/dts/amlogic/mesontxlx_r311-panel.dtsi index a2cce58..fce0ec3 100644 --- a/arch/arm64/boot/dts/amlogic/mesontxlx_r311-panel.dtsi +++ b/arch/arm64/boot/dts/amlogic/mesontxlx_r311-panel.dtsi @@ -629,7 +629,7 @@ }; backlight_4{ index = <4>; - bl_name = "backlight_4"; + bl_name = "ldim_iw7027"; bl_level_default_uboot_kernel = <100 100>; bl_level_attr = <255 10 /*max, min*/ 128 128>; /*mid, mid_mapping*/ @@ -642,12 +642,11 @@ * (top, bottom, left or right), *2=uniform(top/bottom, left/right) */ - bl_ldim_mapping = <0 1 2 3 4 5 6 7 8 9>; ldim_dev_index = <2>; }; backlight_5{ index = <5>; - bl_name = "backlight_5"; + bl_name = "ldim_global"; bl_level_default_uboot_kernel = <100 100>; bl_level_attr = <255 10 /*max, min*/ 128 128>; /*mid, mid_mapping*/ @@ -675,7 +674,7 @@ }; }; - local_diming_device { + local_dimming_device { compatible = "amlogic, ldim_dev"; dev_name = "ldim_dev"; status = "okay"; @@ -685,9 +684,9 @@ pinctrl_version = <1>; /* for uboot */ /* pwm port: PWM_A, PWM_B, PWM_C, PWM_D, PWM_E, PWM_F, PWM_VS*/ - ldim_dev-gpios = <&gpio GPIOZ_12 1 - &gpio GPIOZ_6 1 - &gpio GPIOZ_7 1>; + ldim_dev-gpios = <&gpio GPIOZ_12 GPIO_ACTIVE_HIGH + &gpio GPIOZ_6 GPIO_ACTIVE_HIGH + &gpio GPIOZ_7 GPIO_ACTIVE_HIGH>; ldim_dev_gpio_names = "GPIOZ_12","GPIOZ_6","GPIOZ_7"; ldim_dev_0 { @@ -709,15 +708,15 @@ ldim_dev_name = "global"; ldim_pwm_pinmux_sel = "ldim_pwm"; ldim_pwm_port = "PWM_B"; - ldim_pwm_attr = <0 /* pol */ - 200 /*freq(pwm:Hz, pwm_vs:multiple of vs)*/ + ldim_pwm_attr = <1 /* pol */ + 180 /*freq(pwm:Hz, pwm_vs:multiple of vs)*/ 50>;/*duty(%)*/ dim_max_min = <100 20>; /*dim_max, dim_min*/ en_gpio_on_off = <2 /*ldim_dev-gpios index*/ 1 0>; /*on_level, off_level*/ }; ldim_dev_2 { - index = <1>; + index = <2>; type = <1>; /* 0=normal,1=spi,2=i2c */ ldim_dev_name = "iw7027"; ldim_pwm_pinmux_sel = "ldim_pwm_vs"; @@ -737,7 +736,10 @@ lamp_err_gpio = <0xff>; /* ldim_dev-gpios index, 0xff=invalid */ spi_write_check = <0>; /* 0=disable, 1=enable */ + dim_max_min = <0xfff 0x7f>; /* dim_max, dim_min */ + ldim_region_mapping = <0 1 2 3 4 5 6 7 8 9>; + cmd_size = <4>; /* init: (type, data..., delay), * must match cmd_size for every group @@ -753,7 +755,7 @@ 0x00 0x27 0x60 0x00 0x00 0x29 0x00 0x00 0x00 0x2a 0x00 0x00 - /*0x00 0x2b 0x7f 0x00*/ + 0x00 0x2b 0x00 0x00 0x00 0x2c 0x73 0x00 0x00 0x2d 0x37 0x00 0x00 0x31 0x93 0x00 diff --git a/drivers/amlogic/media/vout/backlight/aml_bl.c b/drivers/amlogic/media/vout/backlight/aml_bl.c index d2119ea..e55c2bb 100644 --- a/drivers/amlogic/media/vout/backlight/aml_bl.c +++ b/drivers/amlogic/media/vout/backlight/aml_bl.c @@ -121,12 +121,12 @@ struct bl_method_match_s { }; static struct bl_method_match_s bl_method_match_table[] = { - {"gpio", BL_CTRL_GPIO}, - {"pwm", BL_CTRL_PWM}, - {"pwm_combo", BL_CTRL_PWM_COMBO}, - {"local_diming", BL_CTRL_LOCAL_DIMING}, - {"extern", BL_CTRL_EXTERN}, - {"invalid", BL_CTRL_MAX}, + {"gpio", BL_CTRL_GPIO}, + {"pwm", BL_CTRL_PWM}, + {"pwm_combo", BL_CTRL_PWM_COMBO}, + {"local_dimming", BL_CTRL_LOCAL_DIMMING}, + {"extern", BL_CTRL_EXTERN}, + {"invalid", BL_CTRL_MAX}, }; static char *bl_method_type_to_str(int type) @@ -661,7 +661,7 @@ static void bl_power_on(void) bl_power_en_ctrl(bconf, 1); break; case BL_CTRL_PWM: - if (bconf->pwm_en_sequence_reverse) { + if (bconf->en_sequence_reverse) { /* step 1: power on enable */ bl_power_en_ctrl(bconf, 1); if (bconf->pwm_on_delay > 0) @@ -678,7 +678,7 @@ static void bl_power_on(void) } break; case BL_CTRL_PWM_COMBO: - if (bconf->pwm_en_sequence_reverse) { + if (bconf->en_sequence_reverse) { /* step 1: power on enable */ bl_power_en_ctrl(bconf, 1); if (bconf->pwm_on_delay > 0) @@ -697,44 +697,66 @@ static void bl_power_on(void) } break; #ifdef CONFIG_AMLOGIC_LOCAL_DIMMING - case BL_CTRL_LOCAL_DIMING: - /* step 1: power on enable */ - bl_power_en_ctrl(bconf, 1); - /* step 2: power on ldim */ + case BL_CTRL_LOCAL_DIMMING: ldim_drv = aml_ldim_get_driver(); if (ldim_drv == NULL) { BLERR("no ldim driver\n"); + goto exit_power_on_bl; + } + if (bconf->en_sequence_reverse) { + /* step 1: power on enable */ + bl_power_en_ctrl(bconf, 1); + /* step 2: power on ldim */ + if (ldim_drv->power_on) { + ret = ldim_drv->power_on(); + if (ret) + BLERR("ldim: power on error\n"); + } else { + BLPR("ldim: power on is null\n"); + } } else { + /* step 1: power on ldim */ if (ldim_drv->power_on) { ret = ldim_drv->power_on(); - if (ret) { + if (ret) BLERR("ldim: power on error\n"); - goto exit_power_on_bl; - } } else { BLPR("ldim: power on is null\n"); } + /* step 2: power on enable */ + bl_power_en_ctrl(bconf, 1); } break; #endif #ifdef CONFIG_AMLOGIC_BL_EXTERN case BL_CTRL_EXTERN: - /* step 1: power on enable */ - bl_power_en_ctrl(bconf, 1); - /* step 2: power on bl_extern */ bl_ext = aml_bl_extern_get_driver(); if (bl_ext == NULL) { BLERR("no bl_extern driver\n"); + goto exit_power_on_bl; + } + if (bconf->en_sequence_reverse) { + /* step 1: power on enable */ + bl_power_en_ctrl(bconf, 1); + /* step 2: power on bl_extern */ + if (bl_ext->power_on) { + ret = bl_ext->power_on(); + if (ret) + BLERR("bl_extern: power on error\n"); + } else { + BLERR("bl_extern: power on is null\n"); + } } else { + /* step 1: power on bl_extern */ if (bl_ext->power_on) { ret = bl_ext->power_on(); - if (ret) { + if (ret) BLERR("bl_extern: power on error\n"); - goto exit_power_on_bl; - } } else { BLERR("bl_extern: power on is null\n"); } + /* step 2: power on enable */ + bl_power_en_ctrl(bconf, 1); } break; #endif @@ -775,7 +797,7 @@ static void bl_power_off(void) bl_power_en_ctrl(bconf, 0); break; case BL_CTRL_PWM: - if (bconf->pwm_en_sequence_reverse) { + if (bconf->en_sequence_reverse) { /* step 1: power off pwm */ bl_pwm_ctrl(bconf->bl_pwm, 0); if (bconf->pwm_off_delay > 0) @@ -792,7 +814,7 @@ static void bl_power_off(void) } break; case BL_CTRL_PWM_COMBO: - if (bconf->pwm_en_sequence_reverse) { + if (bconf->en_sequence_reverse) { /* step 1: power off pwm_combo */ bl_pwm_ctrl(bconf->bl_pwm_combo0, 0); bl_pwm_ctrl(bconf->bl_pwm_combo1, 0); @@ -811,12 +833,27 @@ static void bl_power_off(void) } break; #ifdef CONFIG_AMLOGIC_LOCAL_DIMMING - case BL_CTRL_LOCAL_DIMING: - /* step 1: power off ldim */ + case BL_CTRL_LOCAL_DIMMING: ldim_drv = aml_ldim_get_driver(); if (ldim_drv == NULL) { BLERR("no ldim driver\n"); + goto exit_power_off_bl; + } + if (bconf->en_sequence_reverse) { + /* step 1: power off ldim */ + if (ldim_drv->power_off) { + ret = ldim_drv->power_off(); + if (ret) + BLERR("ldim: power off error\n"); + } else { + BLERR("ldim: power off is null\n"); + } + /* step 2: power off enable */ + bl_power_en_ctrl(bconf, 0); } else { + /* step 1: power off enable */ + bl_power_en_ctrl(bconf, 0); + /* step 2: power off ldim */ if (ldim_drv->power_off) { ret = ldim_drv->power_off(); if (ret) @@ -825,17 +862,30 @@ static void bl_power_off(void) BLERR("ldim: power off is null\n"); } } - /* step 2: power off enable */ - bl_power_en_ctrl(bconf, 0); break; #endif #ifdef CONFIG_AMLOGIC_BL_EXTERN case BL_CTRL_EXTERN: - /* step 1: power off bl_extern */ bl_ext = aml_bl_extern_get_driver(); if (bl_ext == NULL) { BLERR("no bl_extern driver\n"); + goto exit_power_off_bl; + } + if (bconf->en_sequence_reverse) { + /* step 1: power off bl_extern */ + if (bl_ext->power_off) { + ret = bl_ext->power_off(); + if (ret) + BLERR("bl_extern: power off error\n"); + } else { + BLERR("bl_extern: power off is null\n"); + } + /* step 2: power off enable */ + bl_power_en_ctrl(bconf, 0); } else { + /* step 1: power off enable */ + bl_power_en_ctrl(bconf, 0); + /* step 2: power off bl_extern */ if (bl_ext->power_off) { ret = bl_ext->power_off(); if (ret) @@ -844,8 +894,6 @@ static void bl_power_off(void) BLERR("bl_extern: power off is null\n"); } } - /* step 2: power off enable */ - bl_power_en_ctrl(bconf, 0); break; #endif default: @@ -857,6 +905,8 @@ static void bl_power_off(void) bl_drv->state &= ~BL_STATE_BL_ON; BLPR("backlight power off\n"); + +exit_power_off_bl: mutex_unlock(&bl_power_mutex); } @@ -1048,7 +1098,7 @@ static void aml_bl_set_level(unsigned int level) } break; #ifdef CONFIG_AMLOGIC_LOCAL_DIMMING - case BL_CTRL_LOCAL_DIMING: + case BL_CTRL_LOCAL_DIMMING: bl_set_level_ldim(level); break; #endif @@ -1204,8 +1254,8 @@ static void aml_bl_config_print(struct bl_config_s *bconf) case BL_CTRL_PWM: BLPR("pwm_on_delay = %dms\n", bconf->pwm_on_delay); BLPR("pwm_off_delay = %dms\n", bconf->pwm_off_delay); - BLPR("pwm_en_sequence_reverse = %d\n", - bconf->pwm_en_sequence_reverse); + BLPR("en_sequence_reverse = %d\n", + bconf->en_sequence_reverse); if (bconf->bl_pwm) { bl_pwm = bconf->bl_pwm; BLPR("pwm_index = %d\n", bl_pwm->index); @@ -1233,8 +1283,8 @@ static void aml_bl_config_print(struct bl_config_s *bconf) case BL_CTRL_PWM_COMBO: BLPR("pwm_on_delay = %dms\n", bconf->pwm_on_delay); BLPR("pwm_off_delay = %dms\n", bconf->pwm_off_delay); - BLPR("pwm_en_sequence_reverse = %d\n", - bconf->pwm_en_sequence_reverse); + BLPR("en_sequence_reverse = %d\n", + bconf->en_sequence_reverse); /* pwm_combo_0 */ if (bconf->bl_pwm_combo0) { bl_pwm = bconf->bl_pwm_combo0; @@ -1464,9 +1514,9 @@ static int aml_bl_config_load_from_dts(struct bl_config_s *bconf, "bl_pwm_en_sequence_reverse", &val); if (ret) { BLPR("don't find bl_pwm_en_sequence_reverse\n"); - bconf->pwm_en_sequence_reverse = 0; + bconf->en_sequence_reverse = 0; } else - bconf->pwm_en_sequence_reverse = val; + bconf->en_sequence_reverse = val; bl_pwm->pwm_duty = bl_pwm->pwm_duty_min; /* init pwm config */ @@ -1591,9 +1641,9 @@ static int aml_bl_config_load_from_dts(struct bl_config_s *bconf, "bl_pwm_en_sequence_reverse", &val); if (ret) { BLPR("don't find bl_pwm_en_sequence_reverse\n"); - bconf->pwm_en_sequence_reverse = 0; + bconf->en_sequence_reverse = 0; } else - bconf->pwm_en_sequence_reverse = val; + bconf->en_sequence_reverse = val; pwm_combo0->pwm_duty = pwm_combo0->pwm_duty_min; pwm_combo1->pwm_duty = pwm_combo1->pwm_duty_min; @@ -1602,19 +1652,21 @@ static int aml_bl_config_load_from_dts(struct bl_config_s *bconf, bl_pwm_config_init(pwm_combo1); break; #ifdef CONFIG_AMLOGIC_LOCAL_DIMMING - case BL_CTRL_LOCAL_DIMING: + case BL_CTRL_LOCAL_DIMMING: bconf->ldim_flag = 1; break; #endif #ifdef CONFIG_AMLOGIC_BL_EXTERN case BL_CTRL_EXTERN: - /* get bl_extern_index from dts */ - ret = of_property_read_u32(child, "bl_extern_index", &bl_para[0]); - if (ret) - BLERR("failed to get bl_extern_index\n"); - else { - bconf->bl_extern_index = bl_para[0]; - BLPR("get bl_extern_index = %d\n", bconf->bl_extern_index); + /* get bl_extern_index from dts */ + ret = of_property_read_u32(child, "bl_extern_index", + &bl_para[0]); + if (ret) { + BLERR("failed to get bl_extern_index\n"); + } else { + bconf->bl_extern_index = bl_para[0]; + BLPR("get bl_extern_index = %d\n", + bconf->bl_extern_index); } break; #endif @@ -1622,6 +1674,14 @@ static int aml_bl_config_load_from_dts(struct bl_config_s *bconf, break; } +#ifdef CONFIG_AMLOGIC_LOCAL_DIMMING + if (bconf->ldim_flag) { + ret = aml_ldim_get_config_dts(child); + if (ret < 0) + return -1; + } +#endif + return 0; } #endif @@ -1770,11 +1830,11 @@ static int aml_bl_config_load_from_unifykey(struct bl_config_s *bconf) bl_pwm->pwm_duty_min = *(p + LCD_UKEY_BL_PWM_DUTY_MIN); if (bl_header.version == 2) - bconf->pwm_en_sequence_reverse = + bconf->en_sequence_reverse = (*(p + LCD_UKEY_BL_CUST_VAL_0) | ((*(p + LCD_UKEY_BL_CUST_VAL_0 + 1)) << 8)); else - bconf->pwm_en_sequence_reverse = 0; + bconf->en_sequence_reverse = 0; bl_pwm->pwm_duty = bl_pwm->pwm_duty_min; bl_pwm_config_init(bl_pwm); @@ -1852,11 +1912,11 @@ static int aml_bl_config_load_from_unifykey(struct bl_config_s *bconf) ((*(p + LCD_UKEY_BL_PWM2_LEVEL_MIN + 1)) << 8)); if (bl_header.version == 2) - bconf->pwm_en_sequence_reverse = (*(p + + bconf->en_sequence_reverse = (*(p + LCD_UKEY_BL_CUST_VAL_0) | ((*(p + LCD_UKEY_BL_CUST_VAL_0 + 1)) << 8)); else - bconf->pwm_en_sequence_reverse = 0; + bconf->en_sequence_reverse = 0; pwm_combo0->pwm_duty = pwm_combo0->pwm_duty_min; pwm_combo1->pwm_duty = pwm_combo1->pwm_duty_min; @@ -1864,7 +1924,7 @@ static int aml_bl_config_load_from_unifykey(struct bl_config_s *bconf) bl_pwm_config_init(pwm_combo1); break; #ifdef CONFIG_AMLOGIC_LOCAL_DIMMING - case BL_CTRL_LOCAL_DIMING: + case BL_CTRL_LOCAL_DIMMING: bconf->ldim_flag = 1; break; #endif @@ -1872,6 +1932,16 @@ static int aml_bl_config_load_from_unifykey(struct bl_config_s *bconf) break; } +#ifdef CONFIG_AMLOGIC_LOCAL_DIMMING + if (bconf->ldim_flag) { + ret = aml_ldim_get_config_unifykey(para); + if (ret < 0) { + kfree(para); + return -1; + } + } +#endif + kfree(para); return 0; } @@ -2003,7 +2073,7 @@ static int aml_bl_config_load(struct bl_config_s *bconf, #ifdef CONFIG_AMLOGIC_LOCAL_DIMMING if (bconf->ldim_flag) - aml_ldim_probe(pdev, load_id); + aml_ldim_probe(pdev); #endif switch (bconf->method) { @@ -2157,7 +2227,7 @@ static int aml_bl_lcd_update_notifier(struct notifier_block *nb, } break; #ifdef CONFIG_AMLOGIC_LOCAL_DIMMING - case BL_CTRL_LOCAL_DIMING: + case BL_CTRL_LOCAL_DIMMING: if (ldim_drv->pwm_vs_update) ldim_drv->pwm_vs_update(); break; @@ -2194,7 +2264,7 @@ static int aml_bl_lcd_test_notifier(struct notifier_block *nb, flag = (int *)data; switch (bl_drv->bconf->method) { #ifdef CONFIG_AMLOGIC_LOCAL_DIMMING - case BL_CTRL_LOCAL_DIMING: + case BL_CTRL_LOCAL_DIMMING: if (ldim_drv->test_ctrl) ldim_drv->test_ctrl(*flag); break; @@ -2295,11 +2365,11 @@ static ssize_t bl_status_read(struct class *class, "pwm_duty_min: %d\n" "pwm_on_delay: %d\n" "pwm_off_delay: %d\n" - "pwm_en_sequence_reverse: %d\n\n", + "en_sequence_reverse: %d\n\n", bl_pwm->pwm_method, bl_pwm->pwm_port, bl_pwm->pwm_freq, bl_pwm->pwm_duty_max, bl_pwm->pwm_duty_min, bconf->pwm_on_delay, bconf->pwm_off_delay, - bconf->pwm_en_sequence_reverse); + bconf->en_sequence_reverse); break; case BL_CTRL_PWM_COMBO: pwm_combo0 = bconf->bl_pwm_combo0; @@ -2321,7 +2391,7 @@ static ssize_t bl_status_read(struct class *class, "pwm_1_duty_min: %d\n" "pwm_on_delay: %d\n" "pwm_off_delay: %d\n" - "pwm_en_sequence_reverse: %d\n\n", + "en_sequence_reverse: %d\n\n", pwm_combo0->level_max, pwm_combo0->level_min, pwm_combo0->pwm_method, pwm_combo0->pwm_port, pwm_combo0->pwm_freq, @@ -2331,10 +2401,10 @@ static ssize_t bl_status_read(struct class *class, pwm_combo1->pwm_freq, pwm_combo1->pwm_duty_max, pwm_combo1->pwm_duty_min, bconf->pwm_on_delay, bconf->pwm_off_delay, - bconf->pwm_en_sequence_reverse); + bconf->en_sequence_reverse); break; #ifdef CONFIG_AMLOGIC_LOCAL_DIMMING - case BL_CTRL_LOCAL_DIMING: + case BL_CTRL_LOCAL_DIMMING: if (ldim_drv->config_print) ldim_drv->config_print(); break; @@ -2397,12 +2467,11 @@ static ssize_t bl_debug_pwm_show(struct class *class, } pwm_get_state(bl_pwm->pwm_data.pwm, &pstate); len += sprintf(buf+len, - "\n" "pwm state:\n" - "period: %d\n" - "duty_cycle: %d\n" - "polarity: %d\n" - "enabled: %d\n", + " period: %d\n" + " duty_cycle: %d\n" + " polarity: %d\n" + " enabled: %d\n", pstate.period, pstate.duty_cycle, pstate.polarity, pstate.enabled); value = bl_cbus_read(bl_drv->data->pwm_reg[ @@ -2461,12 +2530,11 @@ static ssize_t bl_debug_pwm_show(struct class *class, } pwm_get_state(bl_pwm->pwm_data.pwm, &pstate); len += sprintf(buf+len, - "\n" "pwm state:\n" - "period: %d\n" - "duty_cycle: %d\n" - "polarity: %d\n" - "enabled: %d\n", + " period: %d\n" + " duty_cycle: %d\n" + " polarity: %d\n" + " enabled: %d\n", pstate.period, pstate.duty_cycle, pstate.polarity, pstate.enabled); value = bl_cbus_read(bl_drv->data->pwm_reg[ @@ -2493,6 +2561,7 @@ static ssize_t bl_debug_pwm_show(struct class *class, if (bconf->bl_pwm_combo1) { bl_pwm = bconf->bl_pwm_combo1; len += sprintf(buf+len, + "\n" "pwm_1_index: %d\n" "pwm_1_method: %d\n" "pwm_1_port: %d\n" @@ -2519,12 +2588,11 @@ static ssize_t bl_debug_pwm_show(struct class *class, } pwm_get_state(bl_pwm->pwm_data.pwm, &pstate); len += sprintf(buf+len, - "\n" "pwm state:\n" - "period: %d\n" - "duty_cycle: %d\n" - "polarity: %d\n" - "enabled: %d\n", + " period: %d\n" + " duty_cycle: %d\n" + " polarity: %d\n" + " enabled: %d\n", pstate.period, pstate.duty_cycle, pstate.polarity, pstate.enabled); value = bl_cbus_read(bl_drv->data->pwm_reg[ diff --git a/drivers/amlogic/media/vout/backlight/aml_ldim/global_bl.c b/drivers/amlogic/media/vout/backlight/aml_ldim/global_bl.c index f43e21e..4835aed 100644 --- a/drivers/amlogic/media/vout/backlight/aml_ldim/global_bl.c +++ b/drivers/amlogic/media/vout/backlight/aml_ldim/global_bl.c @@ -44,11 +44,11 @@ static int global_hw_init_on(void) { struct aml_ldim_driver_s *ldim_drv = aml_ldim_get_driver(); - ldim_gpio_set(ldim_drv->ldev_conf->en_gpio, - ldim_drv->ldev_conf->en_gpio_on); - mdelay(2); ldim_set_duty_pwm(&(ldim_drv->ldev_conf->pwm_config)); ldim_drv->pinmux_ctrl(ldim_drv->ldev_conf->pinmux_name); + mdelay(2); + ldim_gpio_set(ldim_drv->ldev_conf->en_gpio, + ldim_drv->ldev_conf->en_gpio_on); mdelay(20); return 0; diff --git a/drivers/amlogic/media/vout/backlight/aml_ldim/iw7027_bl.c b/drivers/amlogic/media/vout/backlight/aml_ldim/iw7027_bl.c index 3bea191..14b2496 100644 --- a/drivers/amlogic/media/vout/backlight/aml_ldim/iw7027_bl.c +++ b/drivers/amlogic/media/vout/backlight/aml_ldim/iw7027_bl.c @@ -330,14 +330,10 @@ static int iw7027_spi_dump_dim(char *buf) return len; } -static unsigned int iw7027_get_value(unsigned int level) +static unsigned int dim_max, dim_min; +static inline unsigned int iw7027_get_value(unsigned int level) { - struct aml_ldim_driver_s *ldim_drv = aml_ldim_get_driver(); unsigned int val; - unsigned int dim_max, dim_min; - - dim_max = ldim_drv->ldev_conf->dim_max; - dim_min = ldim_drv->ldev_conf->dim_min; val = dim_min + ((level * (dim_max - dim_min)) / LD_DATA_MAX); @@ -349,6 +345,8 @@ static int iw7027_smr(unsigned short *buf, unsigned char len) int i, j; unsigned int value_flag = 0; unsigned char val[20]; + unsigned short *mapping; + struct aml_ldim_driver_s *ldim_drv = aml_ldim_get_driver(); if (iw7027_on_flag == 0) { if (ldim_debug_print) @@ -369,63 +367,65 @@ static int iw7027_smr(unsigned short *buf, unsigned char len) iw7027_spi_op_flag = 1; + mapping = &ldim_drv->ldev_conf->bl_mapping[0]; + dim_max = ldim_drv->ldev_conf->dim_max; + dim_min = ldim_drv->ldev_conf->dim_min; + for (i = 0; i < 10; i++) value_flag = value_flag || buf[i]; - - if (value_flag) { - if (bl_iw7027->test_mode) { - val[0] = (test_brightness[0] & 0xf00) >> 8; - val[1] = test_brightness[0] & 0xff; - val[2] = (test_brightness[1] & 0xf00) >> 8; - val[3] = test_brightness[1] & 0xff; - val[4] = (test_brightness[2] & 0xf00) >> 8; - val[5] = test_brightness[2] & 0xff; - val[6] = (test_brightness[3] & 0xf00) >> 8; - val[7] = test_brightness[3] & 0xff; - val[8] = (test_brightness[4] & 0xf00) >> 8; - val[9] = test_brightness[4] & 0xff; - val[10] = (test_brightness[5] & 0xf00) >> 8; - val[11] = test_brightness[5] & 0xff; - val[12] = (test_brightness[6] & 0xf00) >> 8; - val[13] = test_brightness[6] & 0xff; - val[14] = (test_brightness[7] & 0xf00) >> 8; - val[15] = test_brightness[7] & 0xff; - val[16] = (test_brightness[8] & 0xf00) >> 8; - val[17] = test_brightness[8] & 0xff; - val[18] = (test_brightness[9] & 0xf00) >> 8; - val[19] = test_brightness[9] & 0xff; - - iw7027_wregs(bl_iw7027->spi, 0x40, val, 20); - } else { - val[0] = ((iw7027_get_value(buf[0])) & 0xf00) >> 8; - val[1] = (iw7027_get_value(buf[0])) & 0xff; - val[2] = ((iw7027_get_value(buf[1])) & 0xf00) >> 8; - val[3] = (iw7027_get_value(buf[1])) & 0xff; - val[4] = ((iw7027_get_value(buf[2])) & 0xf00) >> 8; - val[5] = (iw7027_get_value(buf[2])) & 0xff; - val[6] = ((iw7027_get_value(buf[3])) & 0xf00) >> 8; - val[7] = (iw7027_get_value(buf[3])) & 0xff; - val[8] = ((iw7027_get_value(buf[4])) & 0xf00) >> 8; - val[9] = (iw7027_get_value(buf[4])) & 0xff; - val[10] = ((iw7027_get_value(buf[5])) & 0xf00) >> 8; - val[11] = (iw7027_get_value(buf[5])) & 0xff; - val[12] = ((iw7027_get_value(buf[6])) & 0xf00) >> 8; - val[13] = (iw7027_get_value(buf[6])) & 0xff; - val[14] = ((iw7027_get_value(buf[7])) & 0xf00) >> 8; - val[15] = (iw7027_get_value(buf[7])) & 0xff; - val[16] = ((iw7027_get_value(buf[8])) & 0xf00) >> 8; - val[17] = (iw7027_get_value(buf[8])) & 0xff; - val[18] = ((iw7027_get_value(buf[9])) & 0xf00) >> 8; - val[19] = (iw7027_get_value(buf[9])) & 0xff; - - iw7027_wregs(bl_iw7027->spi, 0x40, val, 20); - } - } else { + if (value_flag == 0) { for (j = 0; j < 20; j++) val[j] = 0; - iw7027_wregs(bl_iw7027->spi, 0x40, val, 20); + goto iw7027_smr_end; } + if (bl_iw7027->test_mode) { + val[0] = (test_brightness[0] & 0xf00) >> 8; + val[1] = test_brightness[0] & 0xff; + val[2] = (test_brightness[1] & 0xf00) >> 8; + val[3] = test_brightness[1] & 0xff; + val[4] = (test_brightness[2] & 0xf00) >> 8; + val[5] = test_brightness[2] & 0xff; + val[6] = (test_brightness[3] & 0xf00) >> 8; + val[7] = test_brightness[3] & 0xff; + val[8] = (test_brightness[4] & 0xf00) >> 8; + val[9] = test_brightness[4] & 0xff; + val[10] = (test_brightness[5] & 0xf00) >> 8; + val[11] = test_brightness[5] & 0xff; + val[12] = (test_brightness[6] & 0xf00) >> 8; + val[13] = test_brightness[6] & 0xff; + val[14] = (test_brightness[7] & 0xf00) >> 8; + val[15] = test_brightness[7] & 0xff; + val[16] = (test_brightness[8] & 0xf00) >> 8; + val[17] = test_brightness[8] & 0xff; + val[18] = (test_brightness[9] & 0xf00) >> 8; + val[19] = test_brightness[9] & 0xff; + } else { + val[0] = ((iw7027_get_value(buf[mapping[0]])) & 0xf00) >> 8; + val[1] = (iw7027_get_value(buf[mapping[0]])) & 0xff; + val[2] = ((iw7027_get_value(buf[mapping[1]])) & 0xf00) >> 8; + val[3] = (iw7027_get_value(buf[mapping[1]])) & 0xff; + val[4] = ((iw7027_get_value(buf[mapping[2]])) & 0xf00) >> 8; + val[5] = (iw7027_get_value(buf[mapping[2]])) & 0xff; + val[6] = ((iw7027_get_value(buf[mapping[3]])) & 0xf00) >> 8; + val[7] = (iw7027_get_value(buf[mapping[3]])) & 0xff; + val[8] = ((iw7027_get_value(buf[mapping[4]])) & 0xf00) >> 8; + val[9] = (iw7027_get_value(buf[mapping[4]])) & 0xff; + val[10] = ((iw7027_get_value(buf[mapping[5]])) & 0xf00) >> 8; + val[11] = (iw7027_get_value(buf[mapping[5]])) & 0xff; + val[12] = ((iw7027_get_value(buf[mapping[6]])) & 0xf00) >> 8; + val[13] = (iw7027_get_value(buf[mapping[6]])) & 0xff; + val[14] = ((iw7027_get_value(buf[mapping[7]])) & 0xf00) >> 8; + val[15] = (iw7027_get_value(buf[mapping[7]])) & 0xff; + val[16] = ((iw7027_get_value(buf[mapping[8]])) & 0xf00) >> 8; + val[17] = (iw7027_get_value(buf[mapping[8]])) & 0xff; + val[18] = ((iw7027_get_value(buf[mapping[9]])) & 0xf00) >> 8; + val[19] = (iw7027_get_value(buf[mapping[9]])) & 0xff; + } + +iw7027_smr_end: + iw7027_wregs(bl_iw7027->spi, 0x40, val, 20); + iw7027_spi_op_flag = 0; return 0; } diff --git a/drivers/amlogic/media/vout/backlight/aml_ldim/ldim_dev_drv.c b/drivers/amlogic/media/vout/backlight/aml_ldim/ldim_dev_drv.c index ac9c056..72a4cb1 100644 --- a/drivers/amlogic/media/vout/backlight/aml_ldim/ldim_dev_drv.c +++ b/drivers/amlogic/media/vout/backlight/aml_ldim/ldim_dev_drv.c @@ -432,8 +432,11 @@ static void ldim_config_print(void) { struct aml_ldim_driver_s *ldim_drv = aml_ldim_get_driver(); struct bl_pwm_config_s *ld_pwm; + int i, n, len = 0; + char *str = NULL; LDIMPR("%s:\n", __func__); + pr_info("valid_flag = %d\n" "dev_index = %d\n", ldim_drv->valid_flag, @@ -446,7 +449,7 @@ static void ldim_config_print(void) "en_gpio_on = %d\n" "en_gpio_off = %d\n" "dim_min = 0x%03x\n" - "dim_max = 0x%03x\n\n", + "dim_max = 0x%03x\n", ldim_drv->ldev_conf->name, ldim_drv->ldev_conf->type, ldim_drv->ldev_conf->en_gpio, @@ -454,6 +457,21 @@ static void ldim_config_print(void) ldim_drv->ldev_conf->en_gpio_off, ldim_drv->ldev_conf->dim_min, ldim_drv->ldev_conf->dim_max); + n = ldim_drv->ldim_conf->row * ldim_drv->ldim_conf->col; + len = (n * 4) + 50; + str = kcalloc(len, sizeof(char), GFP_KERNEL); + if (str == NULL) { + pr_info("%s: buf malloc error\n", __func__); + } else { + len = sprintf(str, "region_mapping:\n "); + for (i = 0; i < n; i++) { + len += sprintf(str+len, "%d,", + ldim_dev_config.bl_mapping[i]); + } + pr_info("%s\n\n", str); + kfree(str); + } + switch (ldim_drv->ldev_conf->type) { case LDIM_DEV_TYPE_SPI: pr_info("spi_modalias = %s\n" @@ -490,9 +508,11 @@ static void ldim_config_print(void) pr_info("pwm_port = %d\n" "pwm_pol = %d\n" "pwm_freq = %d\n" - "pwm_duty = %d%%\n", + "pwm_duty = %d%%\n" + "pwm_pointer = %p\n", ld_pwm->pwm_port, ld_pwm->pwm_method, - ld_pwm->pwm_freq, ld_pwm->pwm_duty); + ld_pwm->pwm_freq, ld_pwm->pwm_duty, + ld_pwm->pwm_data.pwm); } } else { pr_info("device config is null\n"); @@ -504,11 +524,17 @@ static int ldim_dev_get_config_from_dts(struct device_node *np, int index) char ld_propname[20]; struct device_node *child; const char *str; - unsigned int temp[5], val; + unsigned int *temp, val; int i, j; int ret = 0; struct aml_ldim_driver_s *ldim_drv = aml_ldim_get_driver(); + temp = kcalloc(LD_BLKREGNUM, sizeof(unsigned int), GFP_KERNEL); + if (temp == NULL) { + LDIMERR("%s: buf malloc error\n", __func__); + return -1; + } + memset(ldim_dev_config.init_on, 0, LDIM_SPI_INIT_ON_SIZE); memset(ldim_dev_config.init_off, 0, LDIM_SPI_INIT_OFF_SIZE); ldim_dev_config.init_on[0] = 0xff; @@ -520,7 +546,7 @@ static int ldim_dev_get_config_from_dts(struct device_node *np, int index) child = of_get_child_by_name(np, ld_propname); if (child == NULL) { LDIMERR("failed to get %s\n", ld_propname); - return -1; + goto ldim_get_config_err; } ret = of_property_read_string(child, "ldim_dev_name", &str); @@ -570,16 +596,6 @@ static int ldim_dev_get_config_from_dts(struct device_node *np, int index) bl_pwm_config_init(&ldim_dev_config.pwm_config); } - ret = of_property_read_u32_array(child, "dim_max_min", &temp[0], 2); - if (ret) { - LDIMERR("failed to get dim_max_min\n"); - ldim_dev_config.dim_max = 0xfff; - ldim_dev_config.dim_min = 0x7f; - } else { - ldim_dev_config.dim_max = temp[0]; - ldim_dev_config.dim_min = temp[1]; - } - ret = of_property_read_u32_array(child, "en_gpio_on_off", temp, 3); if (ret) { LDIMERR("failed to get en_gpio_on_off\n"); @@ -597,17 +613,40 @@ static int ldim_dev_get_config_from_dts(struct device_node *np, int index) ldim_dev_config.en_gpio_off = temp[2]; } + ret = of_property_read_u32_array(child, "dim_max_min", &temp[0], 2); + if (ret) { + LDIMERR("failed to get dim_max_min\n"); + ldim_dev_config.dim_max = 0xfff; + ldim_dev_config.dim_min = 0x7f; + } else { + ldim_dev_config.dim_max = temp[0]; + ldim_dev_config.dim_min = temp[1]; + } + + val = ldim_drv->ldim_conf->row * ldim_drv->ldim_conf->col; + ret = of_property_read_u32_array(child, "ldim_region_mapping", + &temp[0], val); + if (ret) { + LDIMERR("failed to get ldim_region_mapping\n"); + for (i = 0; i < LD_BLKREGNUM; i++) + ldim_dev_config.bl_mapping[i] = (unsigned short)i; + } else { + for (i = 0; i < val; i++) + ldim_dev_config.bl_mapping[i] = (unsigned short)temp[i]; + } + ret = of_property_read_u32(child, "type", &val); if (ret) { LDIMERR("failed to get type\n"); ldim_dev_config.type = LDIM_DEV_TYPE_NORMAL; } else { ldim_dev_config.type = val; - LDIMPR("type: %d\n", ldim_dev_config.type); + if (ldim_debug_print) + LDIMPR("type: %d\n", ldim_dev_config.type); } if (ldim_dev_config.type >= LDIM_DEV_TYPE_MAX) { LDIMERR("type num is out of support\n"); - return -1; + goto ldim_get_config_err; } switch (ldim_dev_config.type) { @@ -620,7 +659,10 @@ static int ldim_dev_get_config_from_dts(struct device_node *np, int index) LDIMERR("failed to get spi_bus_num\n"); } else { ldim_spi_dev.bus_num = val; - LDIMPR("bus_num: %d\n", ldim_spi_dev.bus_num); + if (ldim_debug_print) { + LDIMPR("spi bus_num: %d\n", + ldim_spi_dev.bus_num); + } } ret = of_property_read_u32(child, "spi_chip_select", &val); @@ -628,7 +670,10 @@ static int ldim_dev_get_config_from_dts(struct device_node *np, int index) LDIMERR("failed to get spi_chip_select\n"); } else { ldim_spi_dev.chip_select = val; - LDIMPR("chip_select: %d\n", ldim_spi_dev.chip_select); + if (ldim_debug_print) { + LDIMPR("spi chip_select: %d\n", + ldim_spi_dev.chip_select); + } } ret = of_property_read_u32(child, "spi_max_frequency", &val); @@ -636,7 +681,10 @@ static int ldim_dev_get_config_from_dts(struct device_node *np, int index) LDIMERR("failed to get spi_chip_select\n"); } else { ldim_spi_dev.max_speed_hz = val; - LDIMPR("max_speed_hz: %d\n", ldim_spi_dev.max_speed_hz); + if (ldim_debug_print) { + LDIMPR("spi max_speed_hz: %d\n", + ldim_spi_dev.max_speed_hz); + } } ret = of_property_read_u32(child, "spi_mode", &val); @@ -644,7 +692,8 @@ static int ldim_dev_get_config_from_dts(struct device_node *np, int index) LDIMERR("failed to get spi_mode\n"); } else { ldim_spi_dev.mode = val; - LDIMPR("mode: %d\n", ldim_spi_dev.mode); + if (ldim_debug_print) + LDIMPR("spi mode: %d\n", ldim_spi_dev.mode); } ret = of_property_read_u32_array(child, "spi_cs_delay", @@ -756,7 +805,13 @@ ldim_get_config_end: default: break; } + + kfree(temp); return 0; + +ldim_get_config_err: + kfree(temp); + return -1; } static int ldim_dev_add_driver(struct ldim_dev_config_s *ldev_conf, int index) diff --git a/drivers/amlogic/media/vout/backlight/aml_ldim/ldim_drv.c b/drivers/amlogic/media/vout/backlight/aml_ldim/ldim_drv.c index 484d14b..c6a8ca2 100644 --- a/drivers/amlogic/media/vout/backlight/aml_ldim/ldim_drv.c +++ b/drivers/amlogic/media/vout/backlight/aml_ldim/ldim_drv.c @@ -66,7 +66,7 @@ struct ldim_dev_s { struct cdev *aml_ldim_cdevp; }; static struct ldim_dev_s ldim_dev; -struct vpu_ldim_param_s vpu_ldim_para; +static struct ldim_param_s ldim_db_para; static unsigned int LDIM_DATA_FROM_DB; static unsigned int print_db_flag; static int ldim_on_flag; @@ -112,14 +112,15 @@ static unsigned long alpha_delta = 255;/* to fix flicker */ static unsigned long boost_gain_neg = 3; static unsigned long Dbprint_lv; static unsigned int bl_remap_curve[16] = { - 436, 479, 551, 651, 780, 938, 1125, 1340, - 1584, 1856, 2158, 2488, 2847, 3234, 3650, 4095 - };/*BL_matrix remap curve*/ + 436, 479, 551, 651, 780, 938, 1125, 1340, + 1584, 1856, 2158, 2488, 2847, 3234, 3650, 4095 +};/*BL_matrix remap curve*/ static unsigned long Sf_bypass, Boost_light_bypass; static unsigned long Lpf_bypass, Ld_remap_bypass; static unsigned long fw_LD_Whist[16] = { 32, 64, 96, 128, 160, 192, 224, 256, - 288, 320, 352, 384, 416, 448, 480, 512}; + 288, 320, 352, 384, 416, 448, 480, 512 +}; #define LD_DATA_MIN 10 static unsigned int ldim_data_min; @@ -138,6 +139,14 @@ static unsigned long avg_gain = LD_DATA_DEPTH; /* 0xfff */ #define ABS(a) ((a < 0) ? (-a):a) #endif +unsigned int ldim_fw_hist_print;/*20180525*/ +module_param(ldim_fw_hist_print, uint, 0664); +MODULE_PARM_DESC(ldim_fw_hist_print, "ldim_fw_hist_print"); + +unsigned int ldim_fw_TF_sum_th = 32760;/*20180530*/ +module_param(ldim_fw_TF_sum_th, uint, 0664); +MODULE_PARM_DESC(ldim_fw_TF_sum_th, "ldim_fw_TF_sum_th"); + static unsigned int ldim_level_update; module_param(ldim_level_update, uint, 0664); MODULE_PARM_DESC(ldim_level_update, "ldim_level_update"); @@ -162,7 +171,7 @@ static unsigned int ldim_blk_row = 1; module_param(ldim_blk_row, uint, 0664); MODULE_PARM_DESC(ldim_blk_row, "ldim_blk_row"); -static unsigned int ldim_blk_col = 8; +static unsigned int ldim_blk_col = 1; module_param(ldim_blk_col, uint, 0664); MODULE_PARM_DESC(ldim_blk_col, "ldim_blk_col"); @@ -192,6 +201,8 @@ static void ldim_bl_remap_curve_print(void); static struct ldim_config_s ldim_config = { .hsize = 3840, .vsize = 2160, + .row = 1, + .col = 1, .bl_mode = 1, }; @@ -339,19 +350,32 @@ static void ldim_bl_remap_curve(int slop_gain) bl_remap_curve[i] = t_bl_remap_curve[i] * 4095 / bl_max; } -void ldim_bl_remap_curve_print(void) +static void ldim_bl_remap_curve_print(void) { - int i = 0; + int i = 0, len; + char *buf; - LDIMPR("%s:\n", __func__); - pr_info("bl_remap_curve:"); + len = 16 * 8 + 20; + buf = kcalloc(len, sizeof(char), GFP_KERNEL); + if (buf == NULL) { + LDIMERR("print buf malloc error\n"); + return; + } + + pr_info("bl_remap_curve:\n"); + len = 0; for (i = 0; i < 16; i++) - pr_info("[%4d]\n", bl_remap_curve[i]); + len += sprintf(buf+len, "\t%4d\n", bl_remap_curve[i]); + pr_info("%s\n", buf); + + kfree(buf); } +#define FW_ALG_DEBUG_PRINT 0 void ld_fw_alg_frm_txlx(struct LDReg *nPRM1, struct FW_DAT *FDat1, unsigned int *max_matrix, unsigned int *hist_matrix) -{ /* Notes, nPRM will be set here in SW algorithm too */ +{ + /* Notes, nPRM will be set here in SW algorithm too */ int dif, blkRow, blkCol, k, m, n; unsigned long sum; int adpt_alp; @@ -371,11 +395,51 @@ void ld_fw_alg_frm_txlx(struct LDReg *nPRM1, struct FW_DAT *FDat1, unsigned int fw_LD_BLEst_ACmode = 1; unsigned int fw_hist_mx; unsigned int SF_sum = 0, TF_sum = 0, dif_sum = 0; + int gain_neg_delta = 0; +#if (FW_ALG_DEBUG_PRINT == 1) + int pr_flag = 0; + unsigned int db_cnt = 0; +#endif fw_LD_ThSF = fw_LD_ThSF_l; fw_LD_ThTF = fw_LD_ThTF_l; tBL_matrix = FDat1->TF_BL_matrix_2; +#if (FW_ALG_DEBUG_PRINT == 1) + /* first 8 frame & every 2 min print*/ + pr_flag = (db_cnt < 8) || (db_cnt % 120 == 0); + if (Dbprint_lv == 1) { + if (pr_flag) { + pr_info("input:\n" + "Vnum = [%4d]\n" + "Hnum = [%4d]\n" + "reg_LD_pic_RowMax = [%4d]\n" + "reg_LD_pic_ColMax = [%4d]\n\n" + "stride(ldim_hist_col) = [%4d]\n\n", + Vnum, Hnum, + nPRM1->reg_LD_pic_RowMax, + nPRM1->reg_LD_pic_ColMax, + ldim_hist_col); + if (ldim_fw_hist_print) { + for (blkRow = 0; blkRow < Vnum; blkRow++) { + for (blkCol = 0; blkCol < Hnum; + blkCol++) { + pr_info("(%d,%d,%d); ", + max_matrix[blkRow*3*stride + + blkCol*3 + 0], + max_matrix[blkRow*3*stride + + blkCol*3 + 1], + max_matrix[blkRow*3*stride + + blkCol*3 + 2]); + } + pr_info("\n"); + } + pr_info("\n\n"); + } + } + } +#endif + /* calculate the current frame */ for (blkRow = 0; blkRow < Vnum; blkRow++) { for (blkCol = 0; blkCol < Hnum; blkCol++) { @@ -401,6 +465,23 @@ void ld_fw_alg_frm_txlx(struct LDReg *nPRM1, struct FW_DAT *FDat1, } } +#if (FW_ALG_DEBUG_PRINT == 1) + if (Dbprint_lv == 1) { + if (pr_flag) { + pr_info("BL_0[%d * %d] info(LD_STA_BIN_NUM: %d): [\n ", + Vnum, Hnum, LD_STA_BIN_NUM); + for (blkRow = 0; blkRow < Vnum; blkRow++) { + for (blkCol = 0; blkCol < Hnum; blkCol++) { + pr_info("(%4d) ", + tBL_matrix[blkRow*Hnum + blkCol]); + } + pr_info(" ;\n "); + } + pr_info(" ]\n\n "); + } + } +#endif + /* Spatial Filter the BackLits */ sum = 0; for (blkRow = 0; blkRow < Vnum; blkRow++) { @@ -428,7 +509,24 @@ void ld_fw_alg_frm_txlx(struct LDReg *nPRM1, struct FW_DAT *FDat1, } } - /* boost the bright region lights a little bit. */ +#if (FW_ALG_DEBUG_PRINT == 1) + if (Dbprint_lv == 1) { + if (pr_flag) { + pr_info("BL_SF[%d * %d] info: [\n ", Vnum, Hnum); + for (blkRow = 0; blkRow < Vnum; blkRow++) { + for (blkCol = 0; blkCol < Hnum; blkCol++) { + pr_info("(%4d) ", + FDat1->SF_BL_matrix[ + blkRow*Hnum + blkCol]); + } + pr_info(" ;\n "); + } + pr_info(" ]\n\n "); + } + } +#endif + + /* boost the bright region lights a little bit. */ avg = ((sum*7/fw_blk_num)>>3); for (blkRow = 0; blkRow < Vnum; blkRow++) { for (blkCol = 0; blkCol < Hnum; blkCol++) { @@ -436,12 +534,24 @@ void ld_fw_alg_frm_txlx(struct LDReg *nPRM1, struct FW_DAT *FDat1, if (dif > 0) FDat1->SF_BL_matrix[blkRow*Hnum + blkCol] += (boost_gain*dif); - if (dif < 0) - FDat1->SF_BL_matrix[blkRow*Hnum + blkCol] += - (boost_gain_neg*dif); + if (dif < 0) { + gain_neg_delta = -boost_gain_neg*dif; + if (FDat1->SF_BL_matrix[blkRow*Hnum + blkCol] > + gain_neg_delta) { + FDat1->SF_BL_matrix[ + blkRow*Hnum + blkCol] -= + gain_neg_delta; + } else { + FDat1->SF_BL_matrix[ + blkRow*Hnum + blkCol] = 0; + } + } if (FDat1->SF_BL_matrix[blkRow*Hnum + blkCol] > 4095) FDat1->SF_BL_matrix[blkRow*Hnum + blkCol] = 4095; + if (FDat1->SF_BL_matrix[blkRow*Hnum + blkCol] < 0) + FDat1->SF_BL_matrix[blkRow*Hnum + blkCol] + = 0; //clip } } for (blkRow = 0; blkRow < Vnum; blkRow++) { @@ -451,7 +561,29 @@ void ld_fw_alg_frm_txlx(struct LDReg *nPRM1, struct FW_DAT *FDat1, } } - /* Temperary filter */ +#if (FW_ALG_DEBUG_PRINT == 1) + if (Dbprint_lv == 1) { + if (pr_flag) { + pr_info("BL_boost_SF [%d * %d] info:\n", + Vnum, Hnum); + pr_info("boost_gain: %ld,%ld:\n" + "luma_avg = %d, SF_sum= %d, TF_sum = %d\n [\n ", + boost_gain, boost_gain_neg, + avg, SF_sum, TF_sum); + for (blkRow = 0; blkRow < Vnum; blkRow++) { + for (blkCol = 0; blkCol < Hnum; blkCol++) { + pr_info("(%4d) ", + FDat1->SF_BL_matrix[ + blkRow*Hnum + blkCol]); + } + pr_info(" ;\n"); + } + pr_info(" ]\n\n"); + } + } +#endif + + /* Temperary filter */ sum = 0; Bmin = 4096; Bmax = 0; for (blkRow = 0; blkRow < Vnum; blkRow++) { for (blkCol = 0; blkCol < Hnum; blkCol++) { @@ -462,7 +594,7 @@ void ld_fw_alg_frm_txlx(struct LDReg *nPRM1, struct FW_DAT *FDat1, blkRow*Hnum + blkCol])); dif_sum = ABS(SF_sum - TF_sum); - if (dif_sum > 32760) + if (dif_sum > ldim_fw_TF_sum_th) alpha = 256-alpha_delta; else alpha = MIN(256, fw_LD_ThTF); @@ -500,6 +632,25 @@ void ld_fw_alg_frm_txlx(struct LDReg *nPRM1, struct FW_DAT *FDat1, Bmax = MAX(Bmax, bl_value); } } + +#if (FW_ALG_DEBUG_PRINT == 1) + if (Dbprint_lv == 1) { + if (pr_flag) { + pr_info("BL_TF(final out)[%d*%d] info(alpha:%ld,): [\n", + Vnum, Hnum, alpha); + for (blkRow = 0; blkRow < Vnum; blkRow++) { + for (blkCol = 0; blkCol < Hnum; blkCol++) { + pr_info("(%4d) ", + FDat1->TF_BL_matrix[ + blkRow*Hnum + blkCol]); + } + pr_info(" ;\n "); + } + pr_info(" ]\n\n "); + } + } +#endif + /* set the DC reduction for the BL_modeling */ if (fw_LD_BLEst_ACmode == 0) nPRM1->reg_BL_matrix_AVG = 0; @@ -1056,50 +1207,50 @@ static void ldim_stts_initial(unsigned int pic_h, unsigned int pic_v, row_start, col_start, BLK_Hnum); } -void ldim_db_load_update(struct LDReg *mLDReg) +static void ldim_db_load_update(struct LDReg *mLDReg) { int i; if (LDIM_DATA_FROM_DB == 1) { LDIMPR("ldim_db_load_update\n"); /* beam model */ - rgb_base = (unsigned long)vpu_ldim_para.rgb_base; - boost_gain = (unsigned long)vpu_ldim_para.boost_gain; - lpf_res = (unsigned long)vpu_ldim_para.lpf_res; - fw_LD_ThSF_l = (unsigned long)vpu_ldim_para.fw_ld_th_sf; + rgb_base = (unsigned long)ldim_db_para.rgb_base; + boost_gain = (unsigned long)ldim_db_para.boost_gain; + lpf_res = (unsigned long)ldim_db_para.lpf_res; + fw_LD_ThSF_l = (unsigned long)ldim_db_para.fw_ld_th_sf; /* beam curve */ - mLDReg->reg_LD_Vgain = vpu_ldim_para.ld_vgain; - mLDReg->reg_LD_Hgain = vpu_ldim_para.ld_hgain; - mLDReg->reg_LD_Litgain = vpu_ldim_para.ld_litgain; + mLDReg->reg_LD_Vgain = ldim_db_para.ld_vgain; + mLDReg->reg_LD_Hgain = ldim_db_para.ld_hgain; + mLDReg->reg_LD_Litgain = ldim_db_para.ld_litgain; - mLDReg->reg_LD_LUT_Vdg_LEXT = vpu_ldim_para.ld_lut_vdg_lext; - mLDReg->reg_LD_LUT_Hdg_LEXT = vpu_ldim_para.ld_lut_hdg_lext; - mLDReg->reg_LD_LUT_VHk_LEXT = vpu_ldim_para.ld_lut_vhk_lext; + mLDReg->reg_LD_LUT_Vdg_LEXT = ldim_db_para.ld_lut_vdg_lext; + mLDReg->reg_LD_LUT_Hdg_LEXT = ldim_db_para.ld_lut_hdg_lext; + mLDReg->reg_LD_LUT_VHk_LEXT = ldim_db_para.ld_lut_vhk_lext; for (i = 0; i < 32; i++) { - mLDReg->reg_LD_LUT_Hdg[i] = vpu_ldim_para.ld_lut_hdg[i]; - mLDReg->reg_LD_LUT_Vdg[i] = vpu_ldim_para.ld_lut_vdg[i]; - mLDReg->reg_LD_LUT_VHk[i] = vpu_ldim_para.ld_lut_vhk[i]; + mLDReg->reg_LD_LUT_Hdg[i] = ldim_db_para.ld_lut_hdg[i]; + mLDReg->reg_LD_LUT_Vdg[i] = ldim_db_para.ld_lut_vdg[i]; + mLDReg->reg_LD_LUT_VHk[i] = ldim_db_para.ld_lut_vhk[i]; } /* beam shape minor adjustment */ for (i = 0; i < 32; i++) { mLDReg->reg_LD_LUT_VHk_pos[i] = - vpu_ldim_para.ld_lut_vhk_pos[i]; + ldim_db_para.ld_lut_vhk_pos[i]; mLDReg->reg_LD_LUT_VHk_neg[i] = - vpu_ldim_para.ld_lut_vhk_neg[i]; + ldim_db_para.ld_lut_vhk_neg[i]; mLDReg->reg_LD_LUT_HHk[i] = - vpu_ldim_para.ld_lut_hhk[i]; + ldim_db_para.ld_lut_hhk[i]; mLDReg->reg_LD_LUT_VHo_pos[i] = - vpu_ldim_para.ld_lut_vho_pos[i]; + ldim_db_para.ld_lut_vho_pos[i]; mLDReg->reg_LD_LUT_VHo_neg[i] = - vpu_ldim_para.ld_lut_vho_neg[i]; + ldim_db_para.ld_lut_vho_neg[i]; } /* remapping */ - /*vpu_ldim_para.lit_idx_th;*/ - /*vpu_ldim_para.comp_gain;*/ + /*ldim_db_para.lit_idx_th;*/ + /*ldim_db_para.comp_gain;*/ } if (print_db_flag == 1) { @@ -1166,7 +1317,12 @@ static void LDIM_Initial_GXTVBB(unsigned int ldim_bl_en, unsigned int data; unsigned int *arrayTmp; - arrayTmp = kmalloc(1536 * sizeof(unsigned int), GFP_KERNEL); + arrayTmp = kcalloc(1536, sizeof(unsigned int), GFP_KERNEL); + if (arrayTmp == NULL) { + LDIMERR("%s malloc error\n", __func__); + return; + } + data = LDIM_RD_32Bits(REG_LD_MISC_CTRL0); data = data & (~(3<<4)); LDIM_WR_32Bits(REG_LD_MISC_CTRL0, data); @@ -1222,38 +1378,38 @@ static void LDIM_Initial_GXTVBB(unsigned int ldim_bl_en, LDIM_WR_BASE_LUT_DRT(REG_LD_MATRIX_BASE, nPRM.BL_matrix, LD_BLKREGNUM); /* LD_FRM_SIZE */ data = ((nPRM.reg_LD_pic_RowMax&0xfff)<<16) | - (nPRM.reg_LD_pic_ColMax&0xfff); + (nPRM.reg_LD_pic_ColMax&0xfff); LDIM_WR_32Bits(REG_LD_FRM_SIZE, data); /* LD_RGB_MOD */ data = ((nPRM.reg_LD_RGBmapping_demo & 0x1) << 19) | - ((nPRM.reg_LD_X_LUT_interp_mode[2] & 0x1) << 18) | - ((nPRM.reg_LD_X_LUT_interp_mode[1] & 0x1) << 17) | - ((nPRM.reg_LD_X_LUT_interp_mode[0] & 0x1) << 16) | - ((nPRM.reg_LD_BkLit_LPFmod & 0x7) << 12) | - ((nPRM.reg_LD_Litshft & 0x7) << 8) | - ((nPRM.reg_LD_BackLit_Xtlk & 0x1) << 7) | - ((nPRM.reg_LD_BkLit_Intmod & 0x1) << 6) | - ((nPRM.reg_LD_BkLUT_Intmod & 0x1) << 5) | - ((nPRM.reg_LD_BkLit_curmod & 0x1) << 4) | - ((nPRM.reg_LD_BackLit_mode & 0x3)); + ((nPRM.reg_LD_X_LUT_interp_mode[2] & 0x1) << 18) | + ((nPRM.reg_LD_X_LUT_interp_mode[1] & 0x1) << 17) | + ((nPRM.reg_LD_X_LUT_interp_mode[0] & 0x1) << 16) | + ((nPRM.reg_LD_BkLit_LPFmod & 0x7) << 12) | + ((nPRM.reg_LD_Litshft & 0x7) << 8) | + ((nPRM.reg_LD_BackLit_Xtlk & 0x1) << 7) | + ((nPRM.reg_LD_BkLit_Intmod & 0x1) << 6) | + ((nPRM.reg_LD_BkLUT_Intmod & 0x1) << 5) | + ((nPRM.reg_LD_BkLit_curmod & 0x1) << 4) | + ((nPRM.reg_LD_BackLit_mode & 0x3)); LDIM_WR_32Bits(REG_LD_RGB_MOD, data); /* LD_BLK_HVNUM */ data = ((nPRM.reg_LD_Reflect_Vnum & 0x7) << 20) | - ((nPRM.reg_LD_Reflect_Hnum & 0x7) << 16) | - ((nPRM.reg_LD_BLK_Vnum & 0x3f) << 8) | - ((nPRM.reg_LD_BLK_Hnum & 0x3f)); + ((nPRM.reg_LD_Reflect_Hnum & 0x7) << 16) | + ((nPRM.reg_LD_BLK_Vnum & 0x3f) << 8) | + ((nPRM.reg_LD_BLK_Hnum & 0x3f)); LDIM_WR_32Bits(REG_LD_BLK_HVNUM, data); /* REG_LD_FRM_HBLAN_VHOLS */ data = ((nPRM.reg_LD_LUT_VHo_LS & 0x7) << 16) | - ((6 & 0x1fff)) ; /*frm_hblank_num */ + ((6 & 0x1fff)) ; /*frm_hblank_num */ LDIM_WR_32Bits(REG_LD_FRM_HBLAN_VHOLS, data); /* LD_HVGAIN */ data = ((nPRM.reg_LD_Vgain & 0xfff) << 16) | - (nPRM.reg_LD_Hgain & 0xfff); + (nPRM.reg_LD_Hgain & 0xfff); LDIM_WR_32Bits(REG_LD_HVGAIN, data); /* LD_LIT_GAIN_COMP */ data = ((nPRM.reg_LD_Litgain & 0xfff) << 16) | - (nPRM.reg_BL_matrix_Compensate & 0xfff); + (nPRM.reg_BL_matrix_Compensate & 0xfff); LDIM_WR_32Bits(REG_LD_LIT_GAIN_COMP, data); /* LD_BKLIT_VLD */ data = 0; @@ -1263,12 +1419,12 @@ static void LDIM_Initial_GXTVBB(unsigned int ldim_bl_en, LDIM_WR_32Bits(REG_LD_BKLIT_VLD, data); /* LD_BKLIT_PARAM */ data = ((nPRM.reg_LD_BkLit_Celnum & 0xff) << 16) | - (nPRM.reg_BL_matrix_AVG & 0xfff); + (nPRM.reg_BL_matrix_AVG & 0xfff); LDIM_WR_32Bits(REG_LD_BKLIT_PARAM, data); /* REG_LD_LUT_XDG_LEXT */ data = ((nPRM.reg_LD_LUT_Vdg_LEXT & 0x3ff) << 20) | - ((nPRM.reg_LD_LUT_VHk_LEXT & 0x3ff) << 10) | - (nPRM.reg_LD_LUT_Hdg_LEXT & 0x3ff); + ((nPRM.reg_LD_LUT_VHk_LEXT & 0x3ff) << 10) | + (nPRM.reg_LD_LUT_Hdg_LEXT & 0x3ff); LDIM_WR_32Bits(REG_LD_LUT_XDG_LEXT, data); /* LD_FRM_RST_POS */ @@ -1280,24 +1436,24 @@ static void LDIM_Initial_GXTVBB(unsigned int ldim_bl_en, /* REG_LD_XLUT_DEMO_ROI_XPOS */ data = ((nPRM.reg_LD_xlut_demo_roi_xend & 0x1fff) << 16) | - (nPRM.reg_LD_xlut_demo_roi_xstart & 0x1fff); + (nPRM.reg_LD_xlut_demo_roi_xstart & 0x1fff); LDIM_WR_32Bits(REG_LD_XLUT_DEMO_ROI_XPOS, data); /* REG_LD_XLUT_DEMO_ROI_YPOS */ data = ((nPRM.reg_LD_xlut_demo_roi_yend & 0x1fff) << 16) | - (nPRM.reg_LD_xlut_demo_roi_ystart & 0x1fff); + (nPRM.reg_LD_xlut_demo_roi_ystart & 0x1fff); LDIM_WR_32Bits(REG_LD_XLUT_DEMO_ROI_YPOS, data); /* REG_LD_XLUT_DEMO_ROI_CTRL */ data = ((nPRM.reg_LD_xlut_oroi_enable & 0x1) << 1) | - (nPRM.reg_LD_xlut_iroi_enable & 0x1); + (nPRM.reg_LD_xlut_iroi_enable & 0x1); LDIM_WR_32Bits(REG_LD_XLUT_DEMO_ROI_CTRL, data); /* REG_LD_MISC_CTRL0 {ram_clk_gate_en,2'h0,ldlut_ram_sel,ram_clk_sel, * reg_hvcnt_bypass,reg_ldim_bl_en,soft_bl_start,reg_soft_rst) */ data = (0 << 1) | (ldim_bl_en << 2) | - (ldim_hvcnt_bypass << 3) | (3 << 4) | (1 << 8); + (ldim_hvcnt_bypass << 3) | (3 << 4) | (1 << 8); /* ldim_param_misc_ctrl0; */ LDIM_WR_32Bits(REG_LD_MISC_CTRL0, data); kfree(arrayTmp); @@ -1345,22 +1501,26 @@ static void LDIM_Initial_TXLX(unsigned int ldim_bl_en, unsigned int data; unsigned int *arrayTmp; - arrayTmp = kmalloc(1536*sizeof(unsigned int), GFP_KERNEL); + arrayTmp = kcalloc(1536, sizeof(unsigned int), GFP_KERNEL); + if (arrayTmp == NULL) { + LDIMERR("%s malloc error\n", __func__); + return; + } /* LD_FRM_SIZE */ data = ((nPRM.reg_LD_pic_RowMax & 0xfff)<<16) | - (nPRM.reg_LD_pic_ColMax & 0xfff); + (nPRM.reg_LD_pic_ColMax & 0xfff); LDIM_WR_32Bits(REG_LD_FRM_SIZE, data); /* LD_RGB_MOD */ - data = ((0 & 0xfff) << 20) | - ((nPRM.reg_LD_RGBmapping_demo & 0x1) << 19) | + data = ((0 & 0xfff) << 20) | + ((nPRM.reg_LD_RGBmapping_demo & 0x1) << 19) | ((nPRM.reg_LD_X_LUT_interp_mode[2] & 0x1) << 18) | ((nPRM.reg_LD_X_LUT_interp_mode[1] & 0x1) << 17) | ((nPRM.reg_LD_X_LUT_interp_mode[0] & 0x1) << 16) | ((0 & 0x1) << 15) | ((nPRM.reg_LD_BkLit_LPFmod & 0x7) << 12) | - ((nPRM.reg_LD_Litshft & 0x7) << 8) | + ((nPRM.reg_LD_Litshft & 0x7) << 8) | ((nPRM.reg_LD_BackLit_Xtlk & 0x1) << 7) | ((nPRM.reg_LD_BkLit_Intmod & 0x1) << 6) | ((nPRM.reg_LD_BkLUT_Intmod & 0x1) << 5) | @@ -1369,15 +1529,15 @@ static void LDIM_Initial_TXLX(unsigned int ldim_bl_en, LDIM_WR_32Bits(REG_LD_RGB_MOD, data); /* LD_BLK_HVNUM */ - data = ((nPRM.reg_LD_Reflect_Vnum & 0x7) << 20) | - ((nPRM.reg_LD_Reflect_Hnum & 0x7) << 16) | - ((nPRM.reg_LD_BLK_Vnum & 0x3f) << 8) | - ((nPRM.reg_LD_BLK_Hnum & 0x3f)); + data = ((nPRM.reg_LD_Reflect_Vnum & 0x7) << 20) | + ((nPRM.reg_LD_Reflect_Hnum & 0x7) << 16) | + ((nPRM.reg_LD_BLK_Vnum & 0x3f) << 8) | + ((nPRM.reg_LD_BLK_Hnum & 0x3f)); LDIM_WR_32Bits(REG_LD_BLK_HVNUM, data); /* LD_HVGAIN */ data = ((nPRM.reg_LD_Vgain & 0xfff) << 16) | - (nPRM.reg_LD_Hgain & 0xfff); + (nPRM.reg_LD_Hgain & 0xfff); LDIM_WR_32Bits(REG_LD_HVGAIN, data); /* LD_BKLIT_VLD */ @@ -1389,12 +1549,12 @@ static void LDIM_Initial_TXLX(unsigned int ldim_bl_en, /* LD_BKLIT_PARAM */ data = ((nPRM.reg_LD_BkLit_Celnum & 0xff) << 16) | - (nPRM.reg_BL_matrix_AVG & 0xfff); + (nPRM.reg_BL_matrix_AVG & 0xfff); LDIM_WR_32Bits(REG_LD_BKLIT_PARAM, data); /* LD_LIT_GAIN_COMP */ data = ((nPRM.reg_LD_Litgain & 0xfff) << 16) | - (nPRM.reg_BL_matrix_Compensate & 0xfff); + (nPRM.reg_BL_matrix_Compensate & 0xfff); LDIM_WR_32Bits(REG_LD_LIT_GAIN_COMP, data); /* LD_FRM_RST_POS */ @@ -1407,22 +1567,22 @@ static void LDIM_Initial_TXLX(unsigned int ldim_bl_en, /* REG_LD_FRM_HBLAN_VHOLS */ data = ((nPRM.reg_LD_LUT_VHo_LS & 0x7) << 16) | - ((6 & 0x1fff)) ; /*frm_hblank_num */ + ((6 & 0x1fff)) ; /*frm_hblank_num */ LDIM_WR_32Bits(REG_LD_FRM_HBLAN_VHOLS, data); /* REG_LD_XLUT_DEMO_ROI_XPOS */ data = ((nPRM.reg_LD_xlut_demo_roi_xend & 0x1fff) << 16) | - (nPRM.reg_LD_xlut_demo_roi_xstart & 0x1fff); + (nPRM.reg_LD_xlut_demo_roi_xstart & 0x1fff); LDIM_WR_32Bits(REG_LD_XLUT_DEMO_ROI_XPOS, data); /* REG_LD_XLUT_DEMO_ROI_YPOS */ data = ((nPRM.reg_LD_xlut_demo_roi_yend & 0x1fff) << 16) | - (nPRM.reg_LD_xlut_demo_roi_ystart & 0x1fff); + (nPRM.reg_LD_xlut_demo_roi_ystart & 0x1fff); LDIM_WR_32Bits(REG_LD_XLUT_DEMO_ROI_YPOS, data); /* REG_LD_XLUT_DEMO_ROI_CTRL */ data = ((nPRM.reg_LD_xlut_oroi_enable & 0x1) << 1) | - (nPRM.reg_LD_xlut_iroi_enable & 0x1); + (nPRM.reg_LD_xlut_iroi_enable & 0x1); LDIM_WR_32Bits(REG_LD_XLUT_DEMO_ROI_CTRL, data); /*LD_BLMAT_RAM_MISC*/ @@ -1477,15 +1637,15 @@ static void LDIM_Initial_TXLX(unsigned int ldim_bl_en, ((nPRM.reg_LD_LUT_Vdg_LEXT_TXLX[i] & 0x3ff) << 20); LDIM_WR_BASE_LUT_DRT(REG_LD_LUT_LEXT_BASE_TXLX, arrayTmp, 8); - /*reg_LD_LUT_Hdg[8][32]: u10*8*32 */ + /*reg_LD_LUT_Hdg[8][32]: u10*8*32*/ LDIM_WR_BASE_LUT(REG_LD_LUT_HDG_BASE_TXLX, nPRM.reg_LD_LUT_Hdg_TXLX[0], 16, 8*32); - /*reg_LD_LUT_Vdg[8][32]: u10*8*32 */ + /*reg_LD_LUT_Vdg[8][32]: u10*8*32*/ LDIM_WR_BASE_LUT(REG_LD_LUT_VDG_BASE_TXLX, nPRM.reg_LD_LUT_Vdg_TXLX[0], 16, 8*32); - /*reg_LD_LUT_VHk[8][32]: u10*8*32 */ + /*reg_LD_LUT_VHk[8][32]: u10*8*32*/ LDIM_WR_BASE_LUT(REG_LD_LUT_VHK_BASE_TXLX, nPRM.reg_LD_LUT_VHk_TXLX[0], 16, 8*32); @@ -1505,8 +1665,8 @@ static void LDIM_Initial_TXLX(unsigned int ldim_bl_en, /*X_lut[3][16][16]*/ LDIM_WR_BASE_LUT_DRT(REG_LD_RGB_LUT_BASE, nPRM.X_lut2[0][0], 3*16*16); data = 0 | (0 << 1) | ((ldim_bl_en & 0x1) << 2) | - (ldim_hvcnt_bypass << 5) | (1 << 8) | - (3 << 9) | (1 << 12); + (ldim_hvcnt_bypass << 5) | (1 << 8) | + (3 << 9) | (1 << 12); LDIM_WR_32Bits(REG_LD_MISC_CTRL0, data); LDIM_Update_Matrix(nPRM.BL_matrix, 16 * 24); @@ -1569,7 +1729,7 @@ static int ldim_release(struct inode *inode, struct file *file) } static long ldim_ioctl(struct file *file, unsigned int cmd, - unsigned long arg) + unsigned long arg) { int ret = 0; @@ -1579,8 +1739,8 @@ static long ldim_ioctl(struct file *file, unsigned int cmd, if (!LDIM_DATA_FROM_DB) return -EINVAL; - if (copy_from_user(&vpu_ldim_para, (void __user *)arg, - sizeof(struct vpu_ldim_param_s))) + if (copy_from_user(&ldim_db_para, (void __user *)arg, + sizeof(struct ldim_param_s))) ret = -EFAULT; break; @@ -1616,26 +1776,43 @@ static const struct file_operations ldim_fops = { static void ldim_dump_histgram(void) { - unsigned int i, j, k; + unsigned int i, j, k, len; unsigned int *p = NULL; + char *buf; + + p = kcalloc(2048, sizeof(unsigned int), GFP_KERNEL); + if (p == NULL) { + LDIMERR("ldim_matrix_t malloc error\n"); + return; + } - p = kmalloc(2048*sizeof(unsigned int), GFP_KERNEL); - if (p == NULL) + len = 16 * 10 + 20; + buf = kcalloc(len, sizeof(char), GFP_KERNEL); + if (buf == NULL) { + LDIMERR("print buf malloc error\n"); + kfree(p); return; + } memcpy(p, ldim_driver.hist_matrix, ldim_hist_row*ldim_hist_col*16*sizeof(unsigned int)); + for (i = 0; i < ldim_hist_row; i++) { + pr_info("%s: row %d:\n", __func__, i); for (j = 0; j < ldim_hist_col; j++) { + len = sprintf(buf, "col %d:\n", j); for (k = 0; k < 16; k++) { - LDIMPR("0x%x\t", + len += sprintf(buf+len, "\t0x%x", *(p+i*16*ldim_hist_col+j*16+k)); + if (k == 7) + len += sprintf(buf+len, "\n"); } - pr_info("\n"); - mdelay(10); + pr_info("%s\n\n", buf); } - pr_info("\n"); + msleep(20); } + + kfree(buf); kfree(p); } @@ -1833,7 +2010,6 @@ static void ldim_update_matrix(unsigned int mode) static void ldim_on_vs_spi(void) { unsigned int size; - unsigned short *mapping; unsigned int i; int ret; @@ -1841,7 +2017,6 @@ static void ldim_on_vs_spi(void) return; size = ldim_blk_row * ldim_blk_col; - mapping = &ldim_config.bl_mapping[0]; if (ldim_func_en) { if (ldim_func_bypass) @@ -1849,20 +2024,17 @@ static void ldim_on_vs_spi(void) if (ldim_test_en) { for (i = 0; i < size; i++) { ldim_driver.local_ldim_matrix[i] = - (unsigned short) - nPRM.BL_matrix[mapping[i]]; + (unsigned short)nPRM.BL_matrix[i]; ldim_driver.ldim_matrix_buf[i] = - ldim_driver.ldim_test_matrix[ - mapping[i]]; + ldim_driver.ldim_test_matrix[i]; } } else { for (i = 0; i < size; i++) { ldim_driver.local_ldim_matrix[i] = - (unsigned short) - nPRM.BL_matrix[mapping[i]]; + (unsigned short)nPRM.BL_matrix[i]; ldim_driver.ldim_matrix_buf[i] = (unsigned short) - (((nPRM.BL_matrix[mapping[i]] * litgain) + (((nPRM.BL_matrix[i] * litgain) + (LD_DATA_MAX / 2)) >> LD_DATA_DEPTH); } } @@ -1875,8 +2047,7 @@ static void ldim_on_vs_spi(void) } for (i = 0; i < size; i++) { ldim_driver.local_ldim_matrix[i] = - (unsigned short) - nPRM.BL_matrix[mapping[i]]; + (unsigned short)nPRM.BL_matrix[i]; ldim_driver.ldim_matrix_buf[i] = (unsigned short)(litgain); } @@ -1918,18 +2089,18 @@ static void ldim_on_vs_arithmetic(void) if (ldim_top_en == 0) return; - local_ldim_hist = kmalloc(ldim_hist_row*ldim_hist_col*16* + local_ldim_hist = kcalloc(ldim_hist_row*ldim_hist_col*16, sizeof(unsigned int), GFP_KERNEL); if (local_ldim_hist == NULL) return; - local_ldim_max = kmalloc(ldim_hist_row*ldim_hist_col* + local_ldim_max = kcalloc(ldim_hist_row*ldim_hist_col, sizeof(unsigned int), GFP_KERNEL); if (local_ldim_max == NULL) { kfree(local_ldim_hist); return; } - local_ldim_max_rgb = kmalloc(ldim_hist_row*ldim_hist_col*3* + local_ldim_max_rgb = kcalloc(ldim_hist_row*ldim_hist_col*3, sizeof(unsigned int), GFP_KERNEL); if (local_ldim_max_rgb == NULL) { kfree(local_ldim_hist); @@ -1973,130 +2144,204 @@ static void ldim_on_vs_arithmetic(void) static void ldim_get_matrix_info_2(void) { - unsigned int i, j; + unsigned int i, j, len; unsigned int *local_ldim_matrix_t = NULL; + char *buf; - LDIMPR("%s:\n", __func__); - local_ldim_matrix_t = kmalloc(ldim_hist_row* - ldim_hist_col*sizeof(unsigned int), GFP_KERNEL); + local_ldim_matrix_t = kcalloc(ldim_hist_row*ldim_hist_col, + sizeof(unsigned int), GFP_KERNEL); if (local_ldim_matrix_t == NULL) { - LDIMERR("ldim_driver local_ldim_matrix_t malloc error\n"); + LDIMERR("ldim_matrix_t malloc error\n"); return; } + + len = ldim_blk_col * 10 + 20; + buf = kcalloc(len, sizeof(char), GFP_KERNEL); + if (buf == NULL) { + LDIMERR("print buf malloc error\n"); + kfree(local_ldim_matrix_t); + return; + } + memcpy(local_ldim_matrix_t, &FDat.TF_BL_matrix[0], ldim_blk_col*ldim_blk_row*sizeof(unsigned int)); + pr_info("%s:\n", __func__); for (i = 0; i < ldim_blk_row; i++) { + len = 0; for (j = 0; j < ldim_blk_col; j++) { - pr_info("0x%x\t", + len += sprintf(buf+len, "\t0x%x", local_ldim_matrix_t[ldim_blk_col*i+j]); } - pr_info("\n"); - mdelay(10); + pr_info("%s\n", buf); + msleep(20); } + + kfree(buf); kfree(local_ldim_matrix_t); } static void ldim_get_matrix_info_3(void) { - unsigned int i, j; + unsigned int i, j, len; unsigned int *local_ldim_matrix_t = NULL; + char *buf; - LDIMPR("%s:\n", __func__); - local_ldim_matrix_t = kmalloc(ldim_hist_row* - ldim_hist_col*sizeof(unsigned int), GFP_KERNEL); + local_ldim_matrix_t = kcalloc(ldim_hist_row*ldim_hist_col, + sizeof(unsigned int), GFP_KERNEL); if (local_ldim_matrix_t == NULL) { - LDIMERR("ldim_driver local_ldim_matrix_t malloc error\n"); + LDIMERR("ldim_matrix_t malloc error\n"); + return; + } + + len = ldim_blk_col * 10 + 20; + buf = kcalloc(len, sizeof(char), GFP_KERNEL); + if (buf == NULL) { + LDIMERR("print buf malloc error\n"); + kfree(local_ldim_matrix_t); return; } + memcpy(local_ldim_matrix_t, &FDat.SF_BL_matrix[0], ldim_blk_col*ldim_blk_row*sizeof(unsigned int)); + pr_info("%s:\n", __func__); for (i = 0; i < ldim_blk_row; i++) { + len = 0; for (j = 0; j < ldim_blk_col; j++) { - pr_info("0x%x\t", + len += sprintf(buf+len, "\t0x%x", local_ldim_matrix_t[ldim_blk_col*i+j]); } - pr_info("\n"); - mdelay(10); + pr_info("%s\n", buf); + msleep(20); } + + kfree(buf); kfree(local_ldim_matrix_t); } static void ldim_get_matrix_info_4(void) { - unsigned int i, j, k; + unsigned int i, j, k, len; unsigned int *local_ldim_matrix_t = NULL; + char *buf; - LDIMPR("%s:\n", __func__); - local_ldim_matrix_t = kmalloc(ldim_hist_row* - ldim_hist_col*16*sizeof(unsigned int), GFP_KERNEL); + local_ldim_matrix_t = kcalloc(ldim_hist_row*ldim_hist_col, + 16*sizeof(unsigned int), GFP_KERNEL); if (local_ldim_matrix_t == NULL) { - LDIMERR("ldim_driver local_ldim_matrix_t malloc error\n"); + LDIMERR("ldim_matrix_t malloc error\n"); return; } + + len = 3 * ldim_blk_col * 10 + 20; + buf = kcalloc(len, sizeof(char), GFP_KERNEL); + if (buf == NULL) { + LDIMERR("print buf malloc error\n"); + kfree(local_ldim_matrix_t); + return; + } + memcpy(local_ldim_matrix_t, &FDat.last_STA1_MaxRGB[0], ldim_blk_col*ldim_blk_row*3*sizeof(unsigned int)); + pr_info("%s:\n", __func__); for (i = 0; i < ldim_blk_row; i++) { + len = 0; for (j = 0; j < ldim_blk_col; j++) { + len += sprintf(buf+len, "\tcol %d:", ldim_blk_col); for (k = 0; k < 3; k++) { - pr_info("0x%x\t", + len += sprintf(buf+len, "\t0x%x", local_ldim_matrix_t[3*ldim_blk_col*i+j*3+k]); } + len += sprintf(buf+len, "\n"); } - pr_info("\n"); - mdelay(10); + pr_info("%s\n", buf); + msleep(20); } + + kfree(buf); kfree(local_ldim_matrix_t); } static void ldim_get_matrix_info_5(void) { - unsigned int i, j; + unsigned int i, j, len; unsigned int *local_ldim_matrix_t = NULL; + char *buf; - LDIMPR("%s:\n", __func__); - local_ldim_matrix_t = kmalloc(ldim_hist_row* - ldim_hist_col*sizeof(unsigned int), GFP_KERNEL); + local_ldim_matrix_t = kcalloc(ldim_hist_row*ldim_hist_col, + sizeof(unsigned int), GFP_KERNEL); if (local_ldim_matrix_t == NULL) { - LDIMERR("ldim_driver local_ldim_matrix_t malloc error\n"); + LDIMERR("ldim_matrix_t malloc error\n"); return; } + + len = ldim_blk_col * 10 + 20; + buf = kcalloc(len, sizeof(char), GFP_KERNEL); + if (buf == NULL) { + LDIMERR("print buf malloc error\n"); + kfree(local_ldim_matrix_t); + return; + } + memcpy(local_ldim_matrix_t, &FDat.TF_BL_alpha[0], ldim_blk_col*ldim_blk_row*sizeof(unsigned int)); + pr_info("%s:\n", __func__); for (i = 0; i < ldim_blk_row; i++) { + len = 0; for (j = 0; j < ldim_blk_col; j++) { - pr_info("0x%x\t", + len += sprintf(buf+len, "\t0x%x", local_ldim_matrix_t[ldim_blk_col*i+j]); } - pr_info("\n"); - mdelay(10); + pr_info("%s\n", buf); + msleep(20); } + + kfree(buf); kfree(local_ldim_matrix_t); } + static void ldim_get_matrix_info_6(void) { - unsigned int i, j; + unsigned int i, j, len; unsigned int *p = NULL; + char *buf; - LDIMPR("%s:\n", __func__); - p = kmalloc(ldim_blk_col*ldim_blk_row* + p = kcalloc(ldim_blk_col*ldim_blk_row, sizeof(unsigned int), GFP_KERNEL); - if (p == NULL) + if (p == NULL) { + LDIMERR("ldim_matrix_t malloc error\n"); + return; + } + + len = ldim_blk_col * 30 + 20; + buf = kcalloc(len, sizeof(char), GFP_KERNEL); + if (buf == NULL) { + LDIMERR("print buf malloc error\n"); + kfree(p); return; + } memcpy(p, ldim_driver.max_rgb, ldim_blk_col*ldim_blk_row*sizeof(unsigned int)); + + pr_info("%s max_rgb:\n", __func__); for (i = 0; i < ldim_blk_row; i++) { + len = 0; for (j = 0; j < ldim_blk_col; j++) { - LDIMPR("(R:%d,G:%d,B:%d)\t", - (*(p + j + i*ldim_blk_col)>>20)&0x3ff, + len += sprintf(buf+len, "\t(R:%4d, G:%4d, B:%4d)", (*(p + j + i*ldim_blk_col))&0x3ff, - (*(p + j + i*ldim_blk_col)>>10)&0x3ff); + (*(p + j + i*ldim_blk_col)>>10)&0x3ff, + (*(p + j + i*ldim_blk_col)>>20)&0x3ff); + if ((j + 1) % 4 == 0) + len += sprintf(buf+len, "\n\n"); } - pr_info("\n"); + pr_info("%s\n\n", buf); + msleep(20); } + + kfree(buf); kfree(p); } + static void ldim_get_matrix(unsigned int *data, unsigned int reg_sel) { /* gMatrix_LUT: s12*100 */ @@ -2122,72 +2367,96 @@ static void ldim_get_matrix(unsigned int *data, unsigned int reg_sel) static void ldim_get_matrix_info(void) { - unsigned int i, j; + unsigned int i, j, len; unsigned short *local_ldim_matrix_t = NULL; unsigned short *local_ldim_matrix_spi_t = NULL; + char *buf; - LDIMPR("%s:\n", __func__); - local_ldim_matrix_t = kmalloc(ldim_hist_row* - ldim_hist_col*sizeof(unsigned int), GFP_KERNEL); + local_ldim_matrix_t = kcalloc(ldim_hist_row*ldim_hist_col, + sizeof(unsigned int), GFP_KERNEL); if (local_ldim_matrix_t == NULL) { - LDIMERR("ldim_driver local_ldim_matrix_t malloc error\n"); + LDIMERR("ldim_matrix_t malloc error\n"); return; } - local_ldim_matrix_spi_t = kmalloc(ldim_hist_row* - ldim_hist_col*sizeof(unsigned int), GFP_KERNEL); + local_ldim_matrix_spi_t = kcalloc(ldim_hist_row*ldim_hist_col, + sizeof(unsigned int), GFP_KERNEL); if (local_ldim_matrix_spi_t == NULL) { - LDIMERR("ldim_driver local_ldim_matrix_spi_t malloc error\n"); + LDIMERR("ldim_matrix_spi_t malloc error\n"); + kfree(local_ldim_matrix_t); + return; + } + + len = ldim_blk_col * 10 + 20; + buf = kcalloc(len, sizeof(char), GFP_KERNEL); + if (buf == NULL) { + LDIMERR("print buf malloc error\n"); kfree(local_ldim_matrix_t); + kfree(local_ldim_matrix_spi_t); return; } + memcpy(local_ldim_matrix_t, &ldim_driver.local_ldim_matrix[0], ldim_blk_col*ldim_blk_row*sizeof(unsigned short)); memcpy(local_ldim_matrix_spi_t, &ldim_driver.ldim_matrix_buf[0], ldim_blk_col*ldim_blk_row*sizeof(unsigned short)); - /*printk("%s and spi info:\n", __func__);*/ - LDIMPR("%s and spi info:\n", __func__); + + pr_info("%s:\n", __func__); for (i = 0; i < ldim_blk_row; i++) { + len = 0; for (j = 0; j < ldim_blk_col; j++) { - pr_info("0x%x\t", local_ldim_matrix_t - [ldim_blk_col*i+j]); + len += sprintf(buf+len, "\t0x%x", + local_ldim_matrix_t[ldim_blk_col*i+j]); } - pr_info("\n"); - mdelay(10); + pr_info("%s\n", buf); + msleep(20); } - LDIMPR("%s: transfer_matrix:\n", __func__); + + pr_info("spi transfer_matrix:\n"); for (i = 0; i < ldim_blk_row; i++) { + len = 0; for (j = 0; j < ldim_blk_col; j++) { - pr_info("0x%x\t", local_ldim_matrix_spi_t - [ldim_blk_col*i+j]); + len += sprintf(buf+len, "\t0x%x", + local_ldim_matrix_spi_t[ldim_blk_col*i+j]); } - pr_info("\n"); - mdelay(10); + pr_info("%s\n", buf); + msleep(20); } pr_info("\n"); + kfree(buf); kfree(local_ldim_matrix_t); kfree(local_ldim_matrix_spi_t); - } static void ldim_nPRM_bl_matrix_info(void) { - unsigned int i, j; + unsigned int i, j, len; unsigned int local_ldim_matrix_t[LD_BLKREGNUM] = {0}; + char *buf; + + len = ldim_blk_col * 10 + 20; + buf = kcalloc(len, sizeof(char), GFP_KERNEL); + if (buf == NULL) { + LDIMERR("print buf malloc error\n"); + return; + } memcpy(&local_ldim_matrix_t[0], &nPRM.BL_matrix[0], ldim_blk_col*ldim_blk_row*sizeof(unsigned short)); - /*printk("%s and spi info:\n", __func__);*/ - LDIMPR("%s and spi info:\n", __func__); + + pr_info("%s and spi info:\n", __func__); for (i = 0; i < ldim_blk_row; i++) { + len = 0; for (j = 0; j < ldim_blk_col; j++) { - pr_info("0x%x\t", local_ldim_matrix_t + len += sprintf(buf+len, "\t0x%x", local_ldim_matrix_t [ldim_blk_col*i+j]); } - pr_info("\n"); - mdelay(10); + pr_info("%s\n", buf); + msleep(20); } + + kfree(buf); } static void ldim_set_matrix(unsigned int *data, unsigned int reg_sel, unsigned int cnt) @@ -2340,6 +2609,7 @@ static struct aml_ldim_driver_s ldim_driver = { .valid_flag = 0, /* default invalid, active when bl_ctrl_method=ldim */ .dev_index = 0xff, .static_pic_flag = 0, + .ldim_conf = &ldim_config, .ldev_conf = NULL, .ldim_matrix_buf = NULL, .hist_matrix = NULL, @@ -2381,7 +2651,7 @@ static ssize_t ldim_attr_show(struct class *cla, len += sprintf(buf+len, "echo ldim_disable > /sys/class/aml_ldim/attr\n"); len += sprintf(buf+len, - "echo ldim_info > /sys/class/aml_ldim/attr\n"); + "echo info > /sys/class/aml_ldim/attr\n"); len += sprintf(buf+len, "echo test_mode 0 > /sys/class/aml_ldim/attr\n"); len += sprintf(buf+len, @@ -2464,8 +2734,6 @@ static ssize_t ldim_attr_show(struct class *cla, "echo curve_14 512 4 4000 26 > /sys/class/aml_ldim/attr\n"); len += sprintf(buf+len, "echo curve_15 512 4 4055 25 > /sys/class/aml_ldim/attr\n"); - len += sprintf(buf+len, - "echo info > /sys/class/aml_ldim/attr\n"); return len; } @@ -2511,7 +2779,7 @@ static ssize_t ldim_attr_store(struct class *cla, if (kstrtoul(parm[1], 10, &db_data) < 0) return -EINVAL; } - LDIM_DATA_FROM_DB = (unsigned int)db_data; + LDIM_DATA_FROM_DB = (unsigned int)db_data; pr_info("set LDIM_DATA_FROM_DB=%lu\n", db_data); } else if (!strcmp(parm[0], "print_db_flag")) { print_db_flag = 1; @@ -2538,6 +2806,8 @@ static ssize_t ldim_attr_store(struct class *cla, backlit_mod, ldim_bl_en, ldim_hvcnt_bypass); ldim_blk_row = blk_vnum; ldim_blk_col = blk_hnum; + ldim_config.row = ldim_blk_row; + ldim_config.col = ldim_blk_col; ldim_config.bl_mode = (unsigned char)backlit_mod; LDIM_Initial(pic_h, pic_v, blk_vnum, blk_hnum, backlit_mod, ldim_bl_en, ldim_hvcnt_bypass); @@ -2897,6 +3167,16 @@ static ssize_t ldim_attr_store(struct class *cla, pr_info("set avg_gain=%ld\n", avg_gain); } else if (!strcmp(parm[0], "info")) { ldim_driver.config_print(); + pr_info("\nldim_blk_row = %d\n" + "ldim_blk_col = %d\n" + "ldim_hist_row = %d\n" + "ldim_hist_col = %d\n" + "ldim_bl_mode = %d\n" + "dev_index = %d\n", + ldim_blk_row, ldim_blk_col, + ldim_hist_row, ldim_hist_col, + ldim_config.bl_mode, + ldim_driver.dev_index); pr_info("\nldim_on_flag = %d\n" "ldim_func_en = %d\n" "ldim_remap_en = %d\n" @@ -2962,39 +3242,20 @@ static struct class_attribute aml_ldim_class_attrs[] = { __ATTR_NULL, }; -static int aml_ldim_get_config_dts(struct ldim_config_s *ldconf, - struct device *dev) +int aml_ldim_get_config_dts(struct device_node *child) { struct vinfo_s *vinfo = get_current_vinfo(); - struct aml_bl_drv_s *bl_drv = aml_bl_get_driver(); - struct device_node *child; - char propname[20]; - unsigned int *para; - int i; + unsigned int para[5]; int ret; - if (dev->of_node == NULL) { - LDIMERR("dev of_node is null\n"); - return -1; - } - sprintf(propname, "backlight_%d", bl_drv->index); - child = of_get_child_by_name(dev->of_node, propname); if (child == NULL) { - LDIMERR("failed to get %s\n", propname); + LDIMERR("child device_node is null\n"); return -1; } - ldconf->hsize = vinfo->width; - ldconf->vsize = vinfo->height; - for (i = 0; i < LD_BLKREGNUM; i++) - ldconf->bl_mapping[i] = (unsigned short)i; - - /* malloc para */ - para = kzalloc(sizeof(unsigned int) * LD_BLKREGNUM, GFP_KERNEL); - if (para == NULL) { - LDIMERR("%s: malloc failed\n", __func__); - return -1; - } + /* default setting */ + ldim_config.hsize = vinfo->width; + ldim_config.vsize = vinfo->height; /* get row & col from dts */ ret = of_property_read_u32_array(child, "bl_ldim_region_row_col", @@ -3010,31 +3271,19 @@ static int aml_ldim_get_config_dts(struct ldim_config_s *ldconf, ldim_blk_col = para[1]; ldim_hist_row = ldim_blk_row; ldim_hist_col = ldim_blk_col; + ldim_config.row = ldim_blk_row; + ldim_config.col = ldim_blk_col; } } - if (ldim_debug_print) { - LDIMPR("get region row = %d, col = %d\n", - ldim_blk_row, ldim_blk_col); - } + LDIMPR("get region row = %d, col = %d\n", ldim_blk_row, ldim_blk_col); /* get bl_mode from dts */ ret = of_property_read_u32(child, "bl_ldim_mode", ¶[0]); if (ret) LDIMERR("failed to get bl_ldim_mode\n"); else - ldconf->bl_mode = (unsigned char)para[0]; - if (ldim_debug_print) - LDIMPR("get bl_mode = %d\n", ldconf->bl_mode); - - /* get bl_mapping_table from dts */ - ret = of_property_read_u32_array(child, "bl_ldim_mapping", para, - (ldim_blk_row * ldim_blk_col)); - if (ret) { - LDIMERR("failed to get bl_ldim_mapping, use default\n"); - } else { - for (i = 0; i < (ldim_blk_row * ldim_blk_col); i++) - ldconf->bl_mapping[i] = (unsigned short)para[i]; - } + ldim_config.bl_mode = (unsigned char)para[0]; + LDIMPR("get bl_mode = %d\n", ldim_config.bl_mode); /* get ldim_dev_index from dts */ ret = of_property_read_u32(child, "ldim_dev_index", ¶[0]); @@ -3044,99 +3293,38 @@ static int aml_ldim_get_config_dts(struct ldim_config_s *ldconf, ldim_driver.dev_index = para[0]; LDIMPR("get ldim_dev_index = %d\n", ldim_driver.dev_index); - kfree(para); return 0; } -static int aml_ldim_get_config_unifykey(struct ldim_config_s *ldconf) +int aml_ldim_get_config_unifykey(unsigned char *buf) { - unsigned char *para; - int key_len, len; unsigned char *p; - struct aml_lcd_unifykey_header_s bl_header; - struct aml_bl_drv_s *bl_drv = aml_bl_get_driver(); struct vinfo_s *vinfo = get_current_vinfo(); - int i, ret; - - ldconf->hsize = vinfo->width; - ldconf->vsize = vinfo->height; - for (i = 0; i < LD_BLKREGNUM; i++) - ldconf->bl_mapping[i] = (unsigned short)i; - - para = kmalloc((sizeof(unsigned char) * LCD_UKEY_BL_SIZE), GFP_KERNEL); - if (!para) { - BLERR("%s: Not enough memory\n", __func__); - return -1; - } - key_len = LCD_UKEY_BL_SIZE; - memset(para, 0, (sizeof(unsigned char) * key_len)); - ret = lcd_unifykey_get("backlight", para, &key_len); - if (ret < 0) { - kfree(para); - return -1; - } + /* default setting */ + ldim_config.hsize = vinfo->width; + ldim_config.vsize = vinfo->height; - /* step 1: check header */ - len = LCD_UKEY_HEAD_SIZE; - ret = lcd_unifykey_len_check(key_len, len); - if (ret < 0) { - BLERR("unifykey header length is incorrect\n"); - kfree(para); - return -1; - } - - lcd_unifykey_header_check(para, &bl_header); - BLPR("unifykey version: 0x%04x\n", bl_header.version); - switch (bl_header.version) { - case 2: - len = 10 + 30 + 12 + 8 + 32 + 10; - break; - default: - len = 10 + 30 + 12 + 8 + 32; - break; - } - - /* step 2: check backlight parameters */ - ret = lcd_unifykey_len_check(key_len, len); - if (ret < 0) { - BLERR("unifykey length is incorrect\n"); - kfree(para); - return -1; - } - - /* 60byte */ - p = para + 60; + p = buf; /* ldim: 24byte */ - switch (bl_drv->bconf->method) { - case BL_CTRL_LOCAL_DIMING: - /* get bl_ldim_region_row_col 4byte*/ - ldim_blk_row = (*p | ((*(p + 1)) << 8)); - ldim_blk_col = (*(p + 2) | ((*(p + 3)) << 8)); - ldim_hist_row = ldim_blk_row; - ldim_hist_col = ldim_blk_col; - if (ldim_debug_print) { - LDIMPR("get region row = %d, col = %d\n", - ldim_blk_row, ldim_blk_col); - } - - /* get ldim_dev_index 1byte*/ - ldim_driver.dev_index = *(p + 4); - if (ldim_debug_print) - LDIMPR("get dev_index = %d\n", ldim_driver.dev_index); - - /* get bl_ldim_mode 1byte*/ - ldconf->bl_mode = *(p + 5); - if (ldim_debug_print) - LDIMPR("get bl_mode = %d\n", ldconf->bl_mode); - - break; - default: - break; - } + /* get bl_ldim_region_row_col 4byte*/ + ldim_blk_row = *(p + LCD_UKEY_BL_LDIM_ROW); + ldim_blk_col = *(p + LCD_UKEY_BL_LDIM_COL); + ldim_hist_row = ldim_blk_row; + ldim_hist_col = ldim_blk_col; + ldim_config.row = ldim_blk_row; + ldim_config.col = ldim_blk_col; + LDIMPR("get region row = %d, col = %d\n", ldim_blk_row, ldim_blk_col); + + /* get bl_ldim_mode 1byte*/ + ldim_config.bl_mode = *(p + LCD_UKEY_BL_LDIM_MODE); + LDIMPR("get bl_mode = %d\n", ldim_config.bl_mode); + + /* get ldim_dev_index 1byte*/ + ldim_driver.dev_index = *(p + LCD_UKEY_BL_LDIM_DEV_INDEX); + LDIMPR("get dev_index = %d\n", ldim_driver.dev_index); - kfree(para); return 0; } @@ -3230,7 +3418,7 @@ err0: } -int aml_ldim_probe(struct platform_device *pdev, int load_id) +int aml_ldim_probe(struct platform_device *pdev) { int ret = 0; unsigned int i; @@ -3263,17 +3451,17 @@ int aml_ldim_probe(struct platform_device *pdev, int load_id) nPRM.bin_1 = &bin_1[0]; nPRM.val_2 = &val_2[0]; nPRM.bin_2 = &bin_2[0]; - if (load_id) - aml_ldim_get_config_unifykey(&ldim_config); - else - aml_ldim_get_config_dts(&ldim_config, &pdev->dev); - aml_ldim_kzalloc(ldim_blk_row, ldim_blk_col); + ret = aml_ldim_kzalloc(ldim_blk_row, ldim_blk_col); + if (ret) { + LDIMERR("%s failed\n", __func__); + goto err; + } ret = alloc_chrdev_region(&devp->aml_ldim_devno, 0, 1, AML_LDIM_DEVICE_NAME); if (ret < 0) { - pr_err("ldim: failed to alloc major number\n"); + LDIMERR("failed to alloc major number\n"); ret = -ENODEV; goto err; } @@ -3302,7 +3490,7 @@ int aml_ldim_probe(struct platform_device *pdev, int load_id) /* connect the major/minor number to the cdev */ ret = cdev_add(devp->aml_ldim_cdevp, devp->aml_ldim_devno, 1); if (ret) { - pr_err("aml_ldim: failed to add device\n"); + LDIMERR("failed to add device\n"); goto err3; } diff --git a/drivers/amlogic/media/vout/backlight/aml_ldim/ldim_drv.h b/drivers/amlogic/media/vout/backlight/aml_ldim/ldim_drv.h index f536e7a..396e952 100644 --- a/drivers/amlogic/media/vout/backlight/aml_ldim/ldim_drv.h +++ b/drivers/amlogic/media/vout/backlight/aml_ldim/ldim_drv.h @@ -18,6 +18,7 @@ #ifndef _AML_LDIM_DRV_H_ #define _AML_LDIM_DRV_H_ #include +#include #define AML_LDIM_MODULE_NAME "aml_ldim" #define AML_LDIM_DRIVER_NAME "aml_ldim" @@ -29,7 +30,7 @@ /*#define LDIM_EXT_DEBUG_INFO*/ #define LDIMPR(fmt, args...) pr_info("ldim: "fmt"", ## args) -#define LDIMERR(fmt, args...) pr_info("ldim: error: "fmt"", ## args) +#define LDIMERR(fmt, args...) pr_err("ldim: error: "fmt"", ## args) extern unsigned int ldim_debug_print; @@ -106,18 +107,11 @@ extern unsigned int ldim_debug_print; #define LD_LUT_LEN 32 #define LD_BLKHMAX 32 #define LD_BLKVMAX 32 -#define LD_BLKREGNUM 384 /* maximum support 24*16*/ + #define LD_DATA_DEPTH 12 #define LD_DATA_MAX 0xfff -struct ldim_config_s { - unsigned short hsize; - unsigned short vsize; - unsigned char bl_mode; - unsigned short bl_mapping[LD_BLKREGNUM]; -}; - struct LDReg { int reg_LD_pic_RowMax; /*u13*/ int reg_LD_pic_ColMax; /*u13*/ diff --git a/drivers/amlogic/media/vout/backlight/aml_ldim/ldim_func.c b/drivers/amlogic/media/vout/backlight/aml_ldim/ldim_func.c index ff4d096..2e4c7c1 100644 --- a/drivers/amlogic/media/vout/backlight/aml_ldim/ldim_func.c +++ b/drivers/amlogic/media/vout/backlight/aml_ldim/ldim_func.c @@ -659,7 +659,7 @@ void ldim_read_region(unsigned int nrow, unsigned int ncol) */ void ldim_set_matrix_ycbcr2rgb(void) { - Wr_reg_bits(LDIM_STTS_CTRL0, 0, 2, 1); + Wr_reg_bits(LDIM_STTS_CTRL0, 1, 2, 1); /* enable matrix */ Wr(LDIM_STTS_MATRIX_PRE_OFFSET0_1, 0x07c00600); Wr(LDIM_STTS_MATRIX_PRE_OFFSET2, 0x00000600); @@ -681,18 +681,15 @@ void ldim_set_matrix_rgb2ycbcr(int mode) /* 0.257 0.504 0.098 */ /* -0.148 -0.291 0.439 */ /* 0.439 -0.368 -0.071 */ - Wr(LDIM_STTS_MATRIX_COEF00_01, (0x107 << 16) | - 0x204); - Wr(LDIM_STTS_MATRIX_COEF02_10, (0x64 << 16) | - 0x1f68); - Wr(LDIM_STTS_MATRIX_COEF11_12, (0x1ed6 << 16) | - 0x1c2); - Wr(LDIM_STTS_MATRIX_COEF20_21, (0x1c2 << 16) | - 0x1e87); + Wr(LDIM_STTS_MATRIX_COEF00_01, (0x107 << 16) | 0x204); + Wr(LDIM_STTS_MATRIX_COEF02_10, (0x64 << 16) | 0x1f68); + Wr(LDIM_STTS_MATRIX_COEF11_12, (0x1ed6 << 16) | 0x1c2); + Wr(LDIM_STTS_MATRIX_COEF20_21, (0x1c2 << 16) | 0x1e87); Wr(LDIM_STTS_MATRIX_COEF22, 0x1fb7); Wr(LDIM_STTS_MATRIX_OFFSET2, 0x0200); } else if (mode == 1) {/*ycbcr full range, 601 conversion*/ + /* todo */ } } @@ -762,86 +759,102 @@ void LD_MtxInv(int *oDat, int *iDat, int nRow, int nCol) } static int Remap_lut[16][32] = { -{ 128, 258, 387, 517, 646, 776, 905, 1034, -1163, 1291, 1420, 1548, 1676, 1804, 1932, 2059, -2187, 2314, 2441, 2569, 2696, 2823, 2950, 3077, -3204, 3331, 3458, 3586, 3713, 3840, 3968, 4095, -}, -{ 114, 230, 345, 461, 577, 693, 808, 923, -1038, 1153, 1267, 1382, 1496, 1610, 1724, 1844, -1987, 2130, 2272, 2415, 2557, 2700, 2842, 2985, -3127, 3270, 3412, 3555, 3697, 3840, 3981, 4095, -}, -{ 114, 230, 345, 461, 577, 692, 808, 923, -1038, 1152, 1267, 1381, 1496, 1610, 1731, 1874, -2017, 2160, 2303, 2445, 2588, 2731, 2873, 3015, -3158, 3300, 3443, 3585, 3728, 3868, 3981, 4095, -}, -{ 115, 230, 346, 462, 579, 694, 810, 926, -1041, 1155, 1270, 1384, 1499, 1637, 1781, 1923, -2066, 2209, 2351, 2494, 2636, 2778, 2921, 3063, -3205, 3347, 3490, 3632, 3754, 3868, 3982, 4095, -}, -{ 119, 243, 367, 493, 620, 744, 867, 988, -1106, 1224, 1340, 1456, 1596, 1739, 1881, 2021, -2161, 2300, 2438, 2576, 2713, 2850, 2987, 3124, -3261, 3399, 3536, 3652, 3761, 3871, 3982, 4095, -}, -{ 116, 240, 364, 490, 619, 742, 863, 982, -1096, 1208, 1319, 1469, 1620, 1769, 1917, 2063, -2208, 2352, 2494, 2636, 2777, 2918, 3059, 3200, -3341, 3482, 3589, 3687, 3786, 3887, 3990, 4095, -}, -{ 114, 237, 361, 487, 615, 737, 857, 973, -1085, 1221, 1380, 1536, 1691, 1844, 1994, 2144, -2291, 2438, 2583, 2727, 2870, 3014, 3157, 3300, -3424, 3518, 3610, 3704, 3798, 3894, 3994, 4095, -}, -{ 113, 238, 363, 490, 620, 744, 863, 978, -1091, 1256, 1419, 1579, 1737, 1893, 2046, 2198, -2348, 2496, 2642, 2788, 2933, 3077, 3222, 3366, -3459, 3547, 3633, 3722, 3811, 3903, 3997, 4095, -}, -{ 120, 255, 390, 528, 669, 801, 928, 1050, -1194, 1356, 1515, 1671, 1825, 1975, 2123, 2268, -2412, 2553, 2693, 2832, 2970, 3107, 3244, 3361, -3448, 3536, 3623, 3713, 3804, 3897, 3994, 4095, -}, -{ 134, 292, 449, 611, 775, 924, 1063, 1193, -1340, 1503, 1661, 1814, 1963, 2108, 2249, 2387, -2522, 2654, 2785, 2914, 3042, 3169, 3297, 3405, -3484, 3565, 3644, 3727, 3813, 3901, 3996, 4095, -}, -{ 160, 358, 550, 746, 943, 1113, 1266, 1406, -1552, 1708, 1858, 2000, 2138, 2269, 2397, 2520, -2640, 2757, 2872, 2985, 3098, 3211, 3325, 3422, -3496, 3572, 3647, 3727, 3811, 3898, 3993, 4095, -}, -{ 201, 456, 693, 929, 1162, 1354, 1520, 1671, -1822, 1963, 2095, 2220, 2339, 2451, 2559, 2662, -2762, 2859, 2955, 3049, 3143, 3239, 3335, 3407, -3479, 3556, 3630, 3712, 3797, 3887, 3987, 4095, -}, -{ 243, 546, 815, 1079, 1334, 1536, 1707, 1857, -1996, 2125, 2245, 2357, 2462, 2561, 2655, 2746, -2833, 2917, 3000, 3083, 3166, 3250, 3336, 3405, -3476, 3551, 3624, 3706, 3791, 3882, 3984, 4095, -}, -{ 280, 622, 914, 1195, 1465, 1672, 1844, 1993, -2122, 2240, 2349, 2450, 2545, 2634, 2718, 2798, -2875, 2950, 3023, 3097, 3171, 3247, 3325, 3393, -3464, 3540, 3614, 3697, 3784, 3876, 3981, 4095, -}, -{ 308, 675, 979, 1268, 1544, 1752, 1922, 2067, -2191, 2304, 2408, 2505, 2595, 2679, 2758, 2834, -2907, 2978, 3048, 3118, 3189, 3262, 3338, 3404, -3473, 3546, 3618, 3700, 3785, 3877, 3981, 4095, -}, -{ 342, 738, 1058, 1360, 1648, 1862, 2037, 2184, -2295, 2396, 2488, 2573, 2651, 2724, 2792, 2857, -2919, 2979, 3038, 3098, 3158, 3221, 3287, 3357, -3431, 3510, 3588, 3674, 3766, 3864, 3975, 4095, -}, + { + 128, 258, 387, 517, 646, 776, 905, 1034, + 1163, 1291, 1420, 1548, 1676, 1804, 1932, 2059, + 2187, 2314, 2441, 2569, 2696, 2823, 2950, 3077, + 3204, 3331, 3458, 3586, 3713, 3840, 3968, 4095, + }, + { + 114, 230, 345, 461, 577, 693, 808, 923, + 1038, 1153, 1267, 1382, 1496, 1610, 1724, 1844, + 1987, 2130, 2272, 2415, 2557, 2700, 2842, 2985, + 3127, 3270, 3412, 3555, 3697, 3840, 3981, 4095, + }, + { + 114, 230, 345, 461, 577, 692, 808, 923, + 1038, 1152, 1267, 1381, 1496, 1610, 1731, 1874, + 2017, 2160, 2303, 2445, 2588, 2731, 2873, 3015, + 3158, 3300, 3443, 3585, 3728, 3868, 3981, 4095, + }, + { + 115, 230, 346, 462, 579, 694, 810, 926, + 1041, 1155, 1270, 1384, 1499, 1637, 1781, 1923, + 2066, 2209, 2351, 2494, 2636, 2778, 2921, 3063, + 3205, 3347, 3490, 3632, 3754, 3868, 3982, 4095, + }, + { + 119, 243, 367, 493, 620, 744, 867, 988, + 1106, 1224, 1340, 1456, 1596, 1739, 1881, 2021, + 2161, 2300, 2438, 2576, 2713, 2850, 2987, 3124, + 3261, 3399, 3536, 3652, 3761, 3871, 3982, 4095, + }, + { + 116, 240, 364, 490, 619, 742, 863, 982, + 1096, 1208, 1319, 1469, 1620, 1769, 1917, 2063, + 2208, 2352, 2494, 2636, 2777, 2918, 3059, 3200, + 3341, 3482, 3589, 3687, 3786, 3887, 3990, 4095, + }, + { + 114, 237, 361, 487, 615, 737, 857, 973, + 1085, 1221, 1380, 1536, 1691, 1844, 1994, 2144, + 2291, 2438, 2583, 2727, 2870, 3014, 3157, 3300, + 3424, 3518, 3610, 3704, 3798, 3894, 3994, 4095, + }, + { + 113, 238, 363, 490, 620, 744, 863, 978, + 1091, 1256, 1419, 1579, 1737, 1893, 2046, 2198, + 2348, 2496, 2642, 2788, 2933, 3077, 3222, 3366, + 3459, 3547, 3633, 3722, 3811, 3903, 3997, 4095, + }, + { + 120, 255, 390, 528, 669, 801, 928, 1050, + 1194, 1356, 1515, 1671, 1825, 1975, 2123, 2268, + 2412, 2553, 2693, 2832, 2970, 3107, 3244, 3361, + 3448, 3536, 3623, 3713, 3804, 3897, 3994, 4095, + }, + { + 134, 292, 449, 611, 775, 924, 1063, 1193, + 1340, 1503, 1661, 1814, 1963, 2108, 2249, 2387, + 2522, 2654, 2785, 2914, 3042, 3169, 3297, 3405, + 3484, 3565, 3644, 3727, 3813, 3901, 3996, 4095, + }, + { + 160, 358, 550, 746, 943, 1113, 1266, 1406, + 1552, 1708, 1858, 2000, 2138, 2269, 2397, 2520, + 2640, 2757, 2872, 2985, 3098, 3211, 3325, 3422, + 3496, 3572, 3647, 3727, 3811, 3898, 3993, 4095, + }, + { + 201, 456, 693, 929, 1162, 1354, 1520, 1671, + 1822, 1963, 2095, 2220, 2339, 2451, 2559, 2662, + 2762, 2859, 2955, 3049, 3143, 3239, 3335, 3407, + 3479, 3556, 3630, 3712, 3797, 3887, 3987, 4095, + }, + { + 243, 546, 815, 1079, 1334, 1536, 1707, 1857, + 1996, 2125, 2245, 2357, 2462, 2561, 2655, 2746, + 2833, 2917, 3000, 3083, 3166, 3250, 3336, 3405, + 3476, 3551, 3624, 3706, 3791, 3882, 3984, 4095, + }, + { + 280, 622, 914, 1195, 1465, 1672, 1844, 1993, + 2122, 2240, 2349, 2450, 2545, 2634, 2718, 2798, + 2875, 2950, 3023, 3097, 3171, 3247, 3325, 3393, + 3464, 3540, 3614, 3697, 3784, 3876, 3981, 4095, + }, + { + 308, 675, 979, 1268, 1544, 1752, 1922, 2067, + 2191, 2304, 2408, 2505, 2595, 2679, 2758, 2834, + 2907, 2978, 3048, 3118, 3189, 3262, 3338, 3404, + 3473, 3546, 3618, 3700, 3785, 3877, 3981, 4095, + }, + { + 342, 738, 1058, 1360, 1648, 1862, 2037, 2184, + 2295, 2396, 2488, 2573, 2651, 2724, 2792, 2857, + 2919, 2979, 3038, 3098, 3158, 3221, 3287, 3357, + 3431, 3510, 3588, 3674, 3766, 3864, 3975, 4095, + }, }; static int Remap_lut2[16][16] = {}; @@ -867,8 +880,8 @@ void LD_LUTInit(struct LDReg *Reg) Reg->X_lut2[0][k][t] = Remap_lut2[k][t]; Reg->X_lut2[1][k][t] = Remap_lut2[k][t]; Reg->X_lut2[2][k][t] = Remap_lut2[k][t]; - } } + } break; case BL_CHIP_GXTVBB: /* Emulate the FW to set the LUTs */ @@ -881,8 +894,8 @@ void LD_LUTInit(struct LDReg *Reg) Reg->X_lut[0][k][t] = Remap_lut[k][t]; Reg->X_lut[1][k][t] = Remap_lut[k][t]; Reg->X_lut[2][k][t] = Remap_lut[k][t]; - } } + } break; default: break; diff --git a/drivers/amlogic/media/vout/lcd/lcd_debug.c b/drivers/amlogic/media/vout/lcd/lcd_debug.c index 709a17c..98cd778 100644 --- a/drivers/amlogic/media/vout/lcd/lcd_debug.c +++ b/drivers/amlogic/media/vout/lcd/lcd_debug.c @@ -979,7 +979,7 @@ static char *lcd_enc_tst_str[] = { "8-Black", /* 8 */ }; -static unsigned int lcd_enc_tst[][8] = { +static unsigned int lcd_enc_tst[][7] = { /*tst_mode, Y, Cb, Cr, tst_en, vfifo_en rgbin*/ {0, 0x200, 0x200, 0x200, 0, 1, 3}, /* 0 */ {1, 0x200, 0x200, 0x200, 1, 0, 1}, /* 1 */ diff --git a/include/linux/amlogic/media/vout/lcd/aml_bl.h b/include/linux/amlogic/media/vout/lcd/aml_bl.h index e1ad8d8..2afb5f1 100644 --- a/include/linux/amlogic/media/vout/lcd/aml_bl.h +++ b/include/linux/amlogic/media/vout/lcd/aml_bl.h @@ -62,7 +62,7 @@ enum bl_ctrl_method_e { BL_CTRL_GPIO = 0, BL_CTRL_PWM, BL_CTRL_PWM_COMBO, - BL_CTRL_LOCAL_DIMING, + BL_CTRL_LOCAL_DIMMING, BL_CTRL_EXTERN, BL_CTRL_MAX, }; @@ -148,13 +148,13 @@ struct bl_config_s { unsigned int power_off_delay; unsigned int dim_max; unsigned int dim_min; + unsigned int en_sequence_reverse; struct bl_pwm_config_s *bl_pwm; struct bl_pwm_config_s *bl_pwm_combo0; struct bl_pwm_config_s *bl_pwm_combo1; unsigned int pwm_on_delay; unsigned int pwm_off_delay; - unsigned int pwm_en_sequence_reverse; struct bl_gpio_s bl_gpio[BL_GPIO_NUM_MAX]; struct pinctrl *pin; diff --git a/include/linux/amlogic/media/vout/lcd/aml_ldim.h b/include/linux/amlogic/media/vout/lcd/aml_ldim.h index 03ea281..5627814 100644 --- a/include/linux/amlogic/media/vout/lcd/aml_ldim.h +++ b/include/linux/amlogic/media/vout/lcd/aml_ldim.h @@ -27,7 +27,7 @@ #define _VE_LDIM 'C' /* VPP.ldim IOCTL command list */ -#define LDIM_IOC_PARA _IOW(_VE_LDIM, 0x50, struct vpu_ldim_param_s) +#define LDIM_IOC_PARA _IOW(_VE_LDIM, 0x50, struct ldim_param_s) enum ldim_dev_type_e { LDIM_DEV_TYPE_NORMAL = 0, @@ -36,6 +36,16 @@ enum ldim_dev_type_e { LDIM_DEV_TYPE_MAX, }; +#define LD_BLKREGNUM 384 /* maximum support 24*16*/ + +struct ldim_config_s { + unsigned short hsize; + unsigned short vsize; + unsigned char row; + unsigned char col; + unsigned char bl_mode; +}; + #define LDIM_SPI_INIT_ON_SIZE 300 #define LDIM_SPI_INIT_OFF_SIZE 20 struct ldim_dev_config_s { @@ -58,6 +68,8 @@ struct ldim_dev_config_s { unsigned char *init_off; struct bl_pwm_config_s pwm_config; + + unsigned short bl_mapping[LD_BLKREGNUM]; }; /*******global API******/ @@ -65,6 +77,8 @@ struct aml_ldim_driver_s { int valid_flag; int dev_index; int static_pic_flag; + + struct ldim_config_s *ldim_conf; struct ldim_dev_config_s *ldev_conf; unsigned short *ldim_matrix_buf; unsigned int *hist_matrix; @@ -89,7 +103,7 @@ struct aml_ldim_driver_s { struct spi_board_info *spi_dev; }; -struct vpu_ldim_param_s { +struct ldim_param_s { /* beam model */ int rgb_base; int boost_gain; @@ -117,7 +131,10 @@ struct vpu_ldim_param_s { }; extern struct aml_ldim_driver_s *aml_ldim_get_driver(void); -extern int aml_ldim_probe(struct platform_device *pdev, int load_id); + +extern int aml_ldim_get_config_dts(struct device_node *child); +extern int aml_ldim_get_config_unifykey(unsigned char *buf); +extern int aml_ldim_probe(struct platform_device *pdev); extern int aml_ldim_remove(void); #endif diff --git a/include/linux/amlogic/media/vout/lcd/lcd_unifykey.h b/include/linux/amlogic/media/vout/lcd/lcd_unifykey.h index fb031d5..5e38698 100644 --- a/include/linux/amlogic/media/vout/lcd/lcd_unifykey.h +++ b/include/linux/amlogic/media/vout/lcd/lcd_unifykey.h @@ -179,8 +179,8 @@ struct aml_lcd_unifykey_header_s { * ********************************* */ /* V1: 92 */ -/* V2: 102 */ -#define LCD_UKEY_BL_SIZE 102 +/* V2: 118 */ +#define LCD_UKEY_BL_SIZE 118 /* header (10Byte) */ /* LCD_UKEY_HEAD_SIZE */ @@ -221,12 +221,23 @@ struct aml_lcd_unifykey_header_s { #define LCD_UKEY_BL_PWM_LEVEL_MIN (LCD_UKEY_BL_NAME + 76) #define LCD_UKEY_BL_PWM2_LEVEL_MAX (LCD_UKEY_BL_NAME + 78) #define LCD_UKEY_BL_PWM2_LEVEL_MIN (LCD_UKEY_BL_NAME + 80) +/* local dimming (16Byte) */ /* V2 */ +#define LCD_UKEY_BL_LDIM_ROW (LCD_UKEY_BL_NAME + 82) +#define LCD_UKEY_BL_LDIM_COL (LCD_UKEY_BL_NAME + 83) +#define LCD_UKEY_BL_LDIM_MODE (LCD_UKEY_BL_NAME + 84) +#define LCD_UKEY_BL_LDIM_DEV_INDEX (LCD_UKEY_BL_NAME + 85) +#define LCD_UKEY_BL_LDIM_ATTR_4 (LCD_UKEY_BL_NAME + 86) +#define LCD_UKEY_BL_LDIM_ATTR_5 (LCD_UKEY_BL_NAME + 88) +#define LCD_UKEY_BL_LDIM_ATTR_6 (LCD_UKEY_BL_NAME + 90) +#define LCD_UKEY_BL_LDIM_ATTR_7 (LCD_UKEY_BL_NAME + 92) +#define LCD_UKEY_BL_LDIM_ATTR_8 (LCD_UKEY_BL_NAME + 94) +#define LCD_UKEY_BL_LDIM_ATTR_9 (LCD_UKEY_BL_NAME + 96) /* customer(10Byte) */ /* V2 */ -#define LCD_UKEY_BL_CUST_VAL_0 (LCD_UKEY_BL_NAME + 82) -#define LCD_UKEY_BL_CUST_VAL_1 (LCD_UKEY_BL_NAME + 84) -#define LCD_UKEY_BL_CUST_VAL_2 (LCD_UKEY_BL_NAME + 86) -#define LCD_UKEY_BL_CUST_VAL_3 (LCD_UKEY_BL_NAME + 88) -#define LCD_UKEY_BL_CUST_VAL_4 (LCD_UKEY_BL_NAME + 90) +#define LCD_UKEY_BL_CUST_VAL_0 (LCD_UKEY_BL_NAME + 98) +#define LCD_UKEY_BL_CUST_VAL_1 (LCD_UKEY_BL_NAME + 100) +#define LCD_UKEY_BL_CUST_VAL_2 (LCD_UKEY_BL_NAME + 102) +#define LCD_UKEY_BL_CUST_VAL_3 (LCD_UKEY_BL_NAME + 104) +#define LCD_UKEY_BL_CUST_VAL_4 (LCD_UKEY_BL_NAME + 106) /* ******************************** * API -- 2.7.4