backlight: update ldim setting for tl1 [1/1]
authorEvoke Zhang <evoke.zhang@amlogic.com>
Tue, 20 Nov 2018 10:38:38 +0000 (18:38 +0800)
committerEvoke Zhang <evoke.zhang@amlogic.com>
Thu, 3 Jan 2019 08:02:12 +0000 (03:02 -0500)
PD#SWPL-2762

Problem:
ldim is changed for tl1

Solution:
update ldim setting for tl1

Verify:
x301

Change-Id: I21b10f27f4d1776db664c62fa7358b38801c7f53
Signed-off-by: Evoke Zhang <evoke.zhang@amlogic.com>
13 files changed:
MAINTAINERS
arch/arm/boot/dts/amlogic/mesontl1_t309-panel.dtsi
arch/arm/boot/dts/amlogic/mesontl1_x301-panel.dtsi
arch/arm64/boot/dts/amlogic/mesontl1_t309-panel.dtsi
arch/arm64/boot/dts/amlogic/mesontl1_x301-panel.dtsi
drivers/amlogic/media/vout/backlight/aml_bl.c
drivers/amlogic/media/vout/backlight/aml_ldim/Makefile
drivers/amlogic/media/vout/backlight/aml_ldim/ldim_dev_drv.c
drivers/amlogic/media/vout/backlight/aml_ldim/ldim_drv.c
drivers/amlogic/media/vout/backlight/aml_ldim/ldim_drv.h
drivers/amlogic/media/vout/backlight/aml_ldim/ldim_func.c
drivers/amlogic/media/vout/backlight/aml_ldim/ldim_hw.c [new file with mode: 0644]
drivers/amlogic/media/vout/backlight/aml_ldim/ldim_reg.h

index ffc6f35..2e5e232 100644 (file)
@@ -14730,6 +14730,7 @@ F:      arch/arm64/boot/dts/amlogic/partition_mbox_ab_P_32.dtsi
 AMLOGIC BACKLIGHT LDIM DRIVER
 M:     Evoke Zhang <evoke.zhang@amlogic.com>
 F:     drivers/amlogic/media/vout/backlight/aml_ldim/ldim_spi.c
+F:     drivers/amlogic/media/vout/backlight/aml_ldim/ldim_hw.c
 
 AMLOGIC MESON TL1 DTS
 M:     Xingyu Chen <xingyu.chen@amlogic.com>
index d43d679..b43b9c5 100644 (file)
                                2 0 /*pwm1 gpio_index, gpio_off*/
                                10 10>; /*pwm_on_delay(ms), pwm_off_delay(ms)*/
                };
+               backlight_3{
+                       index = <3>;
+                       bl_name = "pwm_combo_ldim_test";
+                       bl_level_default_uboot_kernel = <31 100>;
+                       bl_level_attr = <255 10 /*max, min*/
+                               128 128>; /*mid, mid_mapping*/
+                       bl_ctrl_method = <2>; /*1=pwm,2=pwm_combo,3=ldim*/
+                       bl_power_attr = <0 /*en_gpio_index*/
+                               1 0  /*on_value, off_value*/
+                               410 110>; /*on_delay(ms), off_delay(ms)*/
+                       bl_pwm_combo_level_mapping = <255 10 /*pwm_0 range*/
+                               0 0>; /*pwm_1 range*/
+                       bl_pwm_combo_port = "PWM_C","PWM_D";
+                       bl_pwm_combo_attr = <1 /*pwm0 method*/
+                               180 /*pwm0 freq(pwm:Hz, pwm_vs:multiple of vs)*/
+                               100 25 /*pwm0 duty_max(%), duty_min(%)*/
+                               1 /*pwm1 method*/
+                               18000 /*pwm1 freq(pwm:Hz, pwm_vs:multi of vs)*/
+                               80 80>; /*pwm1 duty_max(%), duty_min(%)*/
+                       bl_pwm_combo_power = <1 0 /*pwm0 gpio_index, gpio_off*/
+                               2 0 /*pwm1 gpio_index, gpio_off*/
+                               10 10>; /*pwm_on_delay(ms), pwm_off_delay(ms)*/
+                       bl_ldim_region_row_col = <2 10>;
+               };
+               backlight_4{
+                       index = <4>;
+                       bl_name = "ldim_global";
+                       bl_level_default_uboot_kernel = <100 100>;
+                       bl_level_attr = <255 10 /*max, min*/
+                               128 128>; /*mid, mid_mapping*/
+                       bl_ctrl_method = <3>; /*1=pwm,2=pwm_combo,3=ldim*/
+                       bl_power_attr = <0 /*en_gpio_index*/
+                               1 0  /*on_value, off_value*/
+                               200 200>; /*on_delay(ms), off_delay(ms)*/
+                       bl_ldim_region_row_col = <1 1>;
+                       bl_ldim_mode = <1>; /*0=left/right side
+                                            *1=top/bottom side
+                                            *2=direct
+                                            */
+                       ldim_dev_index = <1>;
+               };
        };
 
        bl_pwm_conf:bl_pwm_conf{
                };
        };
 
+       local_dimming_device {
+               compatible = "amlogic, ldim_dev";
+               status = "okay";
+               pinctrl-names = "ldim_pwm",
+                       "ldim_pwm_vs",
+                       "ldim_pwm_off";
+               pinctrl-0 = <&pwm_c_pins3>;
+               pinctrl-1 = <&bl_pwm_vs_on_pins>;
+               pinctrl-2 = <&bl_pwm_off_pins>;
+               pinctrl_version = <1>; /* for uboot */
+               ldim_pwm_config = <&bl_pwm_conf>;
+
+               /* pwm port: PWM_A, PWM_B, PWM_C, PWM_D, PWM_E, PWM_F, PWM_VS*/
+               ldim_dev-gpios = <&gpio_ao GPIOAO_11 GPIO_ACTIVE_HIGH
+                       &gpio GPIOZ_5 GPIO_ACTIVE_HIGH
+                       &gpio GPIOZ_6 GPIO_ACTIVE_HIGH>;
+               ldim_dev_gpio_names = "GPIOAO_11","GPIOZ_5","GPIOZ_6";
+
+               ldim_dev_0 {
+                       index = <0>;
+                       type = <0>; /*0=normal, 1=spi, 2=i2c*/
+                       ldim_dev_name = "ob3350";
+                       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)*/
+                               50>;/*duty(%)*/
+                       dim_max_min = <100 20>; /*dim_max, dim_min*/
+                       en_gpio_on_off = <0 /*ldim_dev-gpios index*/
+                               1 0>; /*on_level, off_level*/
+               };
+               ldim_dev_1 {
+                       index = <1>;
+                       type = <0>; /*0=normal, 1=spi, 2=i2c*/
+                       ldim_dev_name = "global";
+                       ldim_pwm_pinmux_sel = "ldim_pwm";
+                       ldim_pwm_port = "PWM_C";
+                       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*/
+               };
+       };
+
 }; /* end of / */
index d16f107..41ff2ba 100644 (file)
                                2 0 /*pwm1 gpio_index, gpio_off*/
                                10 10>; /*pwm_on_delay(ms), pwm_off_delay(ms)*/
                };
+               backlight_3{
+                       index = <3>;
+                       bl_name = "pwm_combo_ldim_test";
+                       bl_level_default_uboot_kernel = <31 100>;
+                       bl_level_attr = <255 10 /*max, min*/
+                               128 128>; /*mid, mid_mapping*/
+                       bl_ctrl_method = <2>; /*1=pwm,2=pwm_combo,3=ldim*/
+                       bl_power_attr = <0 /*en_gpio_index*/
+                               1 0  /*on_value, off_value*/
+                               410 110>; /*on_delay(ms), off_delay(ms)*/
+                       bl_pwm_combo_level_mapping = <255 10 /*pwm_0 range*/
+                               0 0>; /*pwm_1 range*/
+                       bl_pwm_combo_port = "PWM_C","PWM_D";
+                       bl_pwm_combo_attr = <1 /*pwm0 method*/
+                               180 /*pwm0 freq(pwm:Hz, pwm_vs:multiple of vs)*/
+                               100 25 /*pwm0 duty_max(%), duty_min(%)*/
+                               1 /*pwm1 method*/
+                               18000 /*pwm1 freq(pwm:Hz, pwm_vs:multi of vs)*/
+                               80 80>; /*pwm1 duty_max(%), duty_min(%)*/
+                       bl_pwm_combo_power = <1 0 /*pwm0 gpio_index, gpio_off*/
+                               2 0 /*pwm1 gpio_index, gpio_off*/
+                               10 10>; /*pwm_on_delay(ms), pwm_off_delay(ms)*/
+                       bl_ldim_region_row_col = <2 10>;
+               };
+               backlight_4{
+                       index = <4>;
+                       bl_name = "ldim_global";
+                       bl_level_default_uboot_kernel = <100 100>;
+                       bl_level_attr = <255 10 /*max, min*/
+                               128 128>; /*mid, mid_mapping*/
+                       bl_ctrl_method = <3>; /*1=pwm,2=pwm_combo,3=ldim*/
+                       bl_power_attr = <0 /*en_gpio_index*/
+                               1 0  /*on_value, off_value*/
+                               200 200>; /*on_delay(ms), off_delay(ms)*/
+                       bl_ldim_region_row_col = <1 1>;
+                       bl_ldim_mode = <1>; /*0=left/right side
+                                            *1=top/bottom side
+                                            *2=direct
+                                            */
+                       ldim_dev_index = <1>;
+               };
        };
 
        bl_pwm_conf:bl_pwm_conf{
                };
        };
 
+       local_dimming_device {
+               compatible = "amlogic, ldim_dev";
+               status = "okay";
+               pinctrl-names = "ldim_pwm",
+                       "ldim_pwm_vs",
+                       "ldim_pwm_off";
+               pinctrl-0 = <&pwm_c_pins3>;
+               pinctrl-1 = <&bl_pwm_vs_on_pins>;
+               pinctrl-2 = <&bl_pwm_off_pins>;
+               pinctrl_version = <1>; /* for uboot */
+               ldim_pwm_config = <&bl_pwm_conf>;
+
+               /* pwm port: PWM_A, PWM_B, PWM_C, PWM_D, PWM_E, PWM_F, PWM_VS*/
+               ldim_dev-gpios = <&gpio_ao GPIOAO_11 GPIO_ACTIVE_HIGH
+                       &gpio GPIOZ_5 GPIO_ACTIVE_HIGH
+                       &gpio GPIOZ_6 GPIO_ACTIVE_HIGH>;
+               ldim_dev_gpio_names = "GPIOAO_11","GPIOZ_5","GPIOZ_6";
+
+               ldim_dev_0 {
+                       index = <0>;
+                       type = <0>; /*0=normal, 1=spi, 2=i2c*/
+                       ldim_dev_name = "ob3350";
+                       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)*/
+                               50>;/*duty(%)*/
+                       dim_max_min = <100 20>; /*dim_max, dim_min*/
+                       en_gpio_on_off = <0 /*ldim_dev-gpios index*/
+                               1 0>; /*on_level, off_level*/
+               };
+               ldim_dev_1 {
+                       index = <1>;
+                       type = <0>; /*0=normal, 1=spi, 2=i2c*/
+                       ldim_dev_name = "global";
+                       ldim_pwm_pinmux_sel = "ldim_pwm";
+                       ldim_pwm_port = "PWM_C";
+                       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*/
+               };
+       };
 }; /* end of / */
index bedb295..4b56366 100644 (file)
                                2 0 /*pwm1 gpio_index, gpio_off*/
                                10 10>; /*pwm_on_delay(ms), pwm_off_delay(ms)*/
                };
+               backlight_3{
+                       index = <3>;
+                       bl_name = "pwm_combo_ldim_test";
+                       bl_level_default_uboot_kernel = <31 100>;
+                       bl_level_attr = <255 10 /*max, min*/
+                               128 128>; /*mid, mid_mapping*/
+                       bl_ctrl_method = <2>; /*1=pwm,2=pwm_combo,3=ldim*/
+                       bl_power_attr = <0 /*en_gpio_index*/
+                               1 0  /*on_value, off_value*/
+                               410 110>; /*on_delay(ms), off_delay(ms)*/
+                       bl_pwm_combo_level_mapping = <255 10 /*pwm_0 range*/
+                               0 0>; /*pwm_1 range*/
+                       bl_pwm_combo_port = "PWM_C","PWM_D";
+                       bl_pwm_combo_attr = <1 /*pwm0 method*/
+                               180 /*pwm0 freq(pwm:Hz, pwm_vs:multiple of vs)*/
+                               100 25 /*pwm0 duty_max(%), duty_min(%)*/
+                               1 /*pwm1 method*/
+                               18000 /*pwm1 freq(pwm:Hz, pwm_vs:multi of vs)*/
+                               80 80>; /*pwm1 duty_max(%), duty_min(%)*/
+                       bl_pwm_combo_power = <1 0 /*pwm0 gpio_index, gpio_off*/
+                               2 0 /*pwm1 gpio_index, gpio_off*/
+                               10 10>; /*pwm_on_delay(ms), pwm_off_delay(ms)*/
+                       bl_ldim_region_row_col = <2 10>;
+               };
+               backlight_4{
+                       index = <4>;
+                       bl_name = "ldim_global";
+                       bl_level_default_uboot_kernel = <100 100>;
+                       bl_level_attr = <255 10 /*max, min*/
+                               128 128>; /*mid, mid_mapping*/
+                       bl_ctrl_method = <3>; /*1=pwm,2=pwm_combo,3=ldim*/
+                       bl_power_attr = <0 /*en_gpio_index*/
+                               1 0  /*on_value, off_value*/
+                               200 200>; /*on_delay(ms), off_delay(ms)*/
+                       bl_ldim_region_row_col = <1 1>;
+                       bl_ldim_mode = <1>; /*0=left/right side
+                                            *1=top/bottom side
+                                            *2=direct
+                                            */
+                       ldim_dev_index = <1>;
+               };
        };
 
        bl_pwm_conf:bl_pwm_conf{
                };
        };
 
+       local_dimming_device {
+               compatible = "amlogic, ldim_dev";
+               status = "okay";
+               pinctrl-names = "ldim_pwm",
+                       "ldim_pwm_vs",
+                       "ldim_pwm_off";
+               pinctrl-0 = <&pwm_c_pins3>;
+               pinctrl-1 = <&bl_pwm_vs_on_pins>;
+               pinctrl-2 = <&bl_pwm_off_pins>;
+               pinctrl_version = <1>; /* for uboot */
+               ldim_pwm_config = <&bl_pwm_conf>;
+
+               /* pwm port: PWM_A, PWM_B, PWM_C, PWM_D, PWM_E, PWM_F, PWM_VS*/
+               ldim_dev-gpios = <&gpio_ao GPIOAO_11 GPIO_ACTIVE_HIGH
+                       &gpio GPIOZ_5 GPIO_ACTIVE_HIGH
+                       &gpio GPIOZ_6 GPIO_ACTIVE_HIGH>;
+               ldim_dev_gpio_names = "GPIOAO_11","GPIOZ_5","GPIOZ_6";
+
+               ldim_dev_0 {
+                       index = <0>;
+                       type = <0>; /*0=normal, 1=spi, 2=i2c*/
+                       ldim_dev_name = "ob3350";
+                       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)*/
+                               50>;/*duty(%)*/
+                       dim_max_min = <100 20>; /*dim_max, dim_min*/
+                       en_gpio_on_off = <0 /*ldim_dev-gpios index*/
+                               1 0>; /*on_level, off_level*/
+               };
+               ldim_dev_1 {
+                       index = <1>;
+                       type = <0>; /*0=normal, 1=spi, 2=i2c*/
+                       ldim_dev_name = "global";
+                       ldim_pwm_pinmux_sel = "ldim_pwm";
+                       ldim_pwm_port = "PWM_C";
+                       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*/
+               };
+       };
+
 }; /* end of / */
index 1869dc5..76e7b4f 100644 (file)
                                2 0 /*pwm1 gpio_index, gpio_off*/
                                10 10>; /*pwm_on_delay(ms), pwm_off_delay(ms)*/
                };
+               backlight_3{
+                       index = <3>;
+                       bl_name = "pwm_combo_ldim_test";
+                       bl_level_default_uboot_kernel = <31 100>;
+                       bl_level_attr = <255 10 /*max, min*/
+                               128 128>; /*mid, mid_mapping*/
+                       bl_ctrl_method = <2>; /*1=pwm,2=pwm_combo,3=ldim*/
+                       bl_power_attr = <0 /*en_gpio_index*/
+                               1 0  /*on_value, off_value*/
+                               410 110>; /*on_delay(ms), off_delay(ms)*/
+                       bl_pwm_combo_level_mapping = <255 10 /*pwm_0 range*/
+                               0 0>; /*pwm_1 range*/
+                       bl_pwm_combo_port = "PWM_C","PWM_D";
+                       bl_pwm_combo_attr = <1 /*pwm0 method*/
+                               180 /*pwm0 freq(pwm:Hz, pwm_vs:multiple of vs)*/
+                               100 25 /*pwm0 duty_max(%), duty_min(%)*/
+                               1 /*pwm1 method*/
+                               18000 /*pwm1 freq(pwm:Hz, pwm_vs:multi of vs)*/
+                               80 80>; /*pwm1 duty_max(%), duty_min(%)*/
+                       bl_pwm_combo_power = <1 0 /*pwm0 gpio_index, gpio_off*/
+                               2 0 /*pwm1 gpio_index, gpio_off*/
+                               10 10>; /*pwm_on_delay(ms), pwm_off_delay(ms)*/
+                       bl_ldim_region_row_col = <2 10>;
+               };
+               backlight_4{
+                       index = <4>;
+                       bl_name = "ldim_global";
+                       bl_level_default_uboot_kernel = <100 100>;
+                       bl_level_attr = <255 10 /*max, min*/
+                               128 128>; /*mid, mid_mapping*/
+                       bl_ctrl_method = <3>; /*1=pwm,2=pwm_combo,3=ldim*/
+                       bl_power_attr = <0 /*en_gpio_index*/
+                               1 0  /*on_value, off_value*/
+                               200 200>; /*on_delay(ms), off_delay(ms)*/
+                       bl_ldim_region_row_col = <1 1>;
+                       bl_ldim_mode = <1>; /*0=left/right side
+                                            *1=top/bottom side
+                                            *2=direct
+                                            */
+                       ldim_dev_index = <1>;
+               };
        };
 
        bl_pwm_conf:bl_pwm_conf{
                };
        };
 
+       local_dimming_device {
+               compatible = "amlogic, ldim_dev";
+               status = "okay";
+               pinctrl-names = "ldim_pwm",
+                       "ldim_pwm_vs",
+                       "ldim_pwm_off";
+               pinctrl-0 = <&pwm_c_pins3>;
+               pinctrl-1 = <&bl_pwm_vs_on_pins>;
+               pinctrl-2 = <&bl_pwm_off_pins>;
+               pinctrl_version = <1>; /* for uboot */
+               ldim_pwm_config = <&bl_pwm_conf>;
+
+               /* pwm port: PWM_A, PWM_B, PWM_C, PWM_D, PWM_E, PWM_F, PWM_VS*/
+               ldim_dev-gpios = <&gpio_ao GPIOAO_11 GPIO_ACTIVE_HIGH
+                       &gpio GPIOZ_5 GPIO_ACTIVE_HIGH
+                       &gpio GPIOZ_6 GPIO_ACTIVE_HIGH>;
+               ldim_dev_gpio_names = "GPIOAO_11","GPIOZ_5","GPIOZ_6";
+
+               ldim_dev_0 {
+                       index = <0>;
+                       type = <0>; /*0=normal, 1=spi, 2=i2c*/
+                       ldim_dev_name = "ob3350";
+                       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)*/
+                               50>;/*duty(%)*/
+                       dim_max_min = <100 20>; /*dim_max, dim_min*/
+                       en_gpio_on_off = <0 /*ldim_dev-gpios index*/
+                               1 0>; /*on_level, off_level*/
+               };
+               ldim_dev_1 {
+                       index = <1>;
+                       type = <0>; /*0=normal, 1=spi, 2=i2c*/
+                       ldim_dev_name = "global";
+                       ldim_pwm_pinmux_sel = "ldim_pwm";
+                       ldim_pwm_port = "PWM_C";
+                       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*/
+               };
+       };
 }; /* end of / */
index d65b675..7e8e52e 100644 (file)
@@ -1535,7 +1535,8 @@ static int aml_bl_config_load_from_dts(struct bl_config_s *bconf,
                bconf->power_on_delay = bl_para[3];
                bconf->power_off_delay = bl_para[4];
        }
-       ret = of_property_read_u32(child, "bl_ldim_mode", &bl_para[0]);
+       ret = of_property_read_u32(child, "bl_ldim_region_row_col",
+               &bl_para[0]);
        if (ret == 0)
                bconf->ldim_flag = 1;
 
@@ -1603,10 +1604,11 @@ static int aml_bl_config_load_from_dts(struct bl_config_s *bconf,
                ret = of_property_read_u32(child,
                        "bl_pwm_en_sequence_reverse", &val);
                if (ret) {
-                       BLPR("don't find bl_pwm_en_sequence_reverse\n");
                        bconf->en_sequence_reverse = 0;
-               } else
+               } else {
                        bconf->en_sequence_reverse = val;
+                       BLPR("find bl_pwm_en_sequence_reverse: %d\n", val);
+               }
 
                bl_pwm->pwm_duty = bl_pwm->pwm_duty_min;
                /* init pwm config */
@@ -2047,6 +2049,9 @@ static int aml_bl_pwm_channel_register(struct bl_config_s *bconf,
        struct device_node *child;
        struct bl_pwm_config_s *bl_pwm = NULL;
 
+       if (bl_debug_print_flag)
+               BLPR("%s\n", __func__);
+
        ret = of_property_read_u32(blnode, "bl_pwm_config", &pwm_phandle);
        if (ret) {
                BLERR("not match bl_pwm_config node\n");
@@ -2110,8 +2115,6 @@ static int aml_bl_pwm_channel_register(struct bl_config_s *bconf,
                        bl_pwm->pwm_data.port_index, bl_pwm->pwm_data.pwm);
        }
 
-       BLPR("%s ok\n", __func__);
-
        return ret;
 
 }
index bc2132e..1d695bb 100644 (file)
@@ -3,6 +3,6 @@
 #
 obj-$(CONFIG_AMLOGIC_LOCAL_DIMMING) = aml_ldim.o ldim_dev_drv.o ldim_spi.o \
                ob3350_bl.o global_bl.o iw7027_bl.o
-aml_ldim-objs := ldim_drv.o ldim_func.o
+aml_ldim-objs := ldim_drv.o ldim_func.o ldim_hw.o
 
 
index 455066d..6ed4519 100644 (file)
@@ -636,6 +636,9 @@ static int ldim_dev_pwm_channel_register(struct bl_pwm_config_s *bl_pwm,
        struct device_node *child;
        struct aml_ldim_driver_s *ldim_drv = aml_ldim_get_driver();
 
+       if (ldim_debug_print)
+               LDIMPR("%s ok\n", __func__);
+
        ret = of_property_read_u32(blnode, "ldim_pwm_config", &pwm_phandle);
        if (ret) {
                LDIMERR("not match ldim_pwm_config node\n");
@@ -683,8 +686,6 @@ static int ldim_dev_pwm_channel_register(struct bl_pwm_config_s *bl_pwm,
                        bl_pwm->pwm_data.port_index, bl_pwm->pwm_data.pwm);
        }
 
-       LDIMPR("%s ok\n", __func__);
-
        return ret;
 
 }
@@ -1255,11 +1256,12 @@ static int ldim_dev_probe(struct platform_device *pdev)
                        ldim_drv->dev_index);
 
                ldim_dev_add_driver(ldim_drv);
+
+               /* init ldim function */
+               if (ldim_drv->valid_flag)
+                       ldim_drv->init();
+               LDIMPR("%s OK\n", __func__);
        }
-       /* init ldim function */
-       if (ldim_drv->valid_flag)
-               ldim_drv->init();
-       LDIMPR("%s OK\n", __func__);
 
        return 0;
 }
@@ -1268,10 +1270,11 @@ static int __exit ldim_dev_remove(struct platform_device *pdev)
 {
        struct aml_ldim_driver_s *ldim_drv = aml_ldim_get_driver();
 
-       if (ldim_drv->dev_index != 0xff)
+       if (ldim_drv->dev_index != 0xff) {
                ldim_dev_remove_driver(ldim_drv);
+               LDIMPR("%s OK\n", __func__);
+       }
 
-       LDIMPR("%s OK\n", __func__);
        return 0;
 }
 
index 7ec078d..5035be5 100644 (file)
@@ -309,258 +309,22 @@ static void ldim_db_load_update(struct LDReg_s *mLDReg,
                ldim_db_para_print(mLDReg);
 }
 
-static void ldim_stts_initial_txlx(unsigned int resolution)
-{
-       Wr_reg(LDIM_STTS_CTRL0, 7 << 2);
-       ldim_set_matrix_ycbcr2rgb();
-       ldim_stts_en(resolution, 0, 0, 1, 1, 1, 0);
-}
-
 static void ldim_stts_initial(unsigned int pic_h, unsigned int pic_v,
                unsigned int BLK_Vnum, unsigned int BLK_Hnum)
 {
-       unsigned int resolution, resolution_region, blk_height, blk_width;
-       unsigned int row_start, col_start;
-
-       BLK_Vnum = (BLK_Vnum == 0) ? 1 : BLK_Vnum;
-       BLK_Hnum = (BLK_Hnum == 0) ? 1 : BLK_Hnum;
        LDIMPR("%s: %d %d %d %d\n", __func__, pic_h, pic_v, BLK_Vnum, BLK_Hnum);
 
        ldim_fw_para.hist_col = BLK_Vnum;
        ldim_fw_para.hist_row = BLK_Hnum;
 
-       resolution = (((pic_h - 1) & 0xffff) << 16) | ((pic_v - 1) & 0xffff);
-       /*Wr_reg(VDIN0_HIST_CTRL, 0x10d);*/
-
        if (ldim_dev.ldim_op_func == NULL) {
                LDIMERR("%s: invalid ldim_op_func\n", __func__);
                return;
        }
-       if (ldim_dev.ldim_op_func->stts_init)
-               ldim_dev.ldim_op_func->stts_init(resolution);
-
-       resolution_region = 0;
-
-       blk_height = (pic_v - 8) / BLK_Vnum;
-       blk_width = (pic_h - 8) / BLK_Hnum;
-       row_start = (pic_v - (blk_height * BLK_Vnum)) >> 1;
-       col_start = (pic_h - (blk_width * BLK_Hnum)) >> 1;
-       ldim_set_region(0, blk_height, blk_width,
-               row_start, col_start, BLK_Hnum);
-}
-
-static int LDIM_Update_Matrix(int NewBlMatrix[], int BlMatrixNum)
-{
-       int data;
-
-       data = LDIM_RD_32Bits(REG_LD_MISC_CTRL0);
-       if (data & (1 << 12)) {  /*bl_ram_mode=1;*/
-               if (LDIM_RD_32Bits(REG_LD_BLMAT_RAM_MISC) & 0x10000)
-                       /*Previous Matrix is not used*/
-                       goto Previous_Matrix;
-               else {
-                       LDIM_WR_BASE_LUT_DRT(REG_LD_MATRIX_BASE,
-                               NewBlMatrix, BlMatrixNum);
-                       LDIM_WR_32Bits(REG_LD_BLMAT_RAM_MISC,
-                               (BlMatrixNum & 0x1ff) | (1 << 16));
-                       /*set Matrix update ready*/
-
-                       return 0;
-               }
-       } else {  /*bl_ram_mode=0*/
-               /*set ram_clk_sel=0, ram_bus_sel = 0*/
-               data = data & (~(3 << 9));
-               LDIM_WR_32Bits(REG_LD_MISC_CTRL0, data);
-               LDIM_WR_BASE_LUT_DRT(REG_LD_MATRIX_BASE,
-                       NewBlMatrix, BlMatrixNum);
-               data = data | (3 << 9); /*set ram_clk_sel=1, ram_bus_sel = 1*/
-               LDIM_WR_32Bits(REG_LD_MISC_CTRL0, data);
-
-               return 0;
+       if (ldim_dev.ldim_op_func->stts_init) {
+               ldim_dev.ldim_op_func->stts_init(pic_h, pic_v,
+                       BLK_Vnum, BLK_Hnum);
        }
-
-Previous_Matrix:
-       return 1;
-}
-
-static void ldim_initial_txlx(unsigned int ldim_bl_en,
-               unsigned int ldim_hvcnt_bypass)
-{
-       unsigned int i;
-       unsigned int data;
-       unsigned int *arrayTmp;
-
-       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);
-       LDIM_WR_32Bits(REG_LD_FRM_SIZE, data);
-
-       /* LD_RGB_MOD */
-       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_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));
-       LDIM_WR_32Bits(REG_LD_BLK_HVNUM, data);
-
-       /* LD_HVGAIN */
-       data = ((nPRM.reg_LD_Vgain & 0xfff) << 16) |
-               (nPRM.reg_LD_Hgain & 0xfff);
-       LDIM_WR_32Bits(REG_LD_HVGAIN, data);
-
-       /*  LD_BKLIT_VLD  */
-       data = 0;
-       for (i = 0; i < 32; i++)
-               if (nPRM.reg_LD_BkLit_valid[i])
-                       data = data | (1 << i);
-       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);
-       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);
-       LDIM_WR_32Bits(REG_LD_LIT_GAIN_COMP, data);
-
-       /* LD_FRM_RST_POS */
-       data = (1 << 16) | (5); /* h=1,v=5 :ldim_param_frm_rst_pos */
-       LDIM_WR_32Bits(REG_LD_FRM_RST_POS, data);
-
-       /* LD_FRM_BL_START_POS */
-       data = (1 << 16) | (6); /* ldim_param_frm_bl_start_pos; */
-       LDIM_WR_32Bits(REG_LD_FRM_BL_START_POS, data);
-
-       /* REG_LD_FRM_HBLAN_VHOLS  */
-       data = ((nPRM.reg_LD_LUT_VHo_LS & 0x7) << 16) |
-               ((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);
-       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);
-       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);
-       LDIM_WR_32Bits(REG_LD_XLUT_DEMO_ROI_CTRL, data);
-
-       /*LD_BLMAT_RAM_MISC*/
-       LDIM_WR_32Bits(REG_LD_BLMAT_RAM_MISC, 384 & 0x1ff);
-
-       /*  X_idx: 12*16  */
-       LDIM_WR_BASE_LUT(REG_LD_RGB_IDX_BASE, nPRM.X_idx[0], 16, 16);
-
-       /* X_nrm[16]: 4 * 16 */
-       LDIM_WR_BASE_LUT(REG_LD_RGB_NRMW_BASE_TXLX, nPRM.X_nrm[0], 4, 16);
-
-       /*reg_LD_BLK_Hidx[33]: 14*33 */
-       LDIM_WR_BASE_LUT(REG_LD_BLK_HIDX_BASE_TXLX,
-                       nPRM.reg_LD_BLK_Hidx, 16, 33);
-
-       /* reg_LD_BLK_Vidx[25]: 14*25 */
-       LDIM_WR_BASE_LUT(REG_LD_BLK_VIDX_BASE_TXLX,
-                       nPRM.reg_LD_BLK_Vidx, 16, 25);
-
-       /* reg_LD_LUT_VHk_pos[32]/reg_LD_LUT_VHk_neg[32]: u8 */
-       for (i = 0; i < 32; i++)
-               arrayTmp[i]    =  nPRM.reg_LD_LUT_VHk_pos[i];
-       for (i = 0; i < 32; i++)
-               arrayTmp[32+i] =  nPRM.reg_LD_LUT_VHk_neg[i];
-       LDIM_WR_BASE_LUT(REG_LD_LUT_VHK_NEGPOS_BASE_TXLX, arrayTmp, 8, 64);
-
-       /* reg_LD_LUT_VHo_pos[32]/reg_LD_LUT_VHo_neg[32]: s8 */
-       for (i = 0; i < 32; i++)
-               arrayTmp[i]    =  nPRM.reg_LD_LUT_VHo_pos[i];
-       for (i = 0; i < 32; i++)
-               arrayTmp[32+i] =  nPRM.reg_LD_LUT_VHo_neg[i];
-       LDIM_WR_BASE_LUT(REG_LD_LUT_VHO_NEGPOS_BASE_TXLX, arrayTmp, 8, 64);
-
-       /* reg_LD_LUT_HHk[32]:u8 */
-       LDIM_WR_BASE_LUT(REG_LD_LUT_HHK_BASE_TXLX, nPRM.reg_LD_LUT_HHk, 8, 32);
-
-       /*reg_LD_Reflect_Hdgr[20],reg_LD_Reflect_Vdgr[20],
-        *      reg_LD_Reflect_Xdgr[4]
-        */
-       for (i = 0; i < 20; i++)
-               arrayTmp[i] = nPRM.reg_LD_Reflect_Hdgr[i];
-       for (i = 0; i < 20; i++)
-               arrayTmp[20+i] = nPRM.reg_LD_Reflect_Vdgr[i];
-       for (i = 0; i < 4; i++)
-               arrayTmp[40+i] = nPRM.reg_LD_Reflect_Xdgr[i];
-       LDIM_WR_BASE_LUT(REG_LD_REFLECT_DGR_BASE_TXLX, arrayTmp, 8, 44);
-
-       /*reg_LD_LUT_Hdg_LEXT[8]/reg_LD_LUT_Vdg_LEXT[8]/reg_LD_LUT_VHk_LEXT[8]*/
-       for (i = 0; i < 8; i++)
-               arrayTmp[i] = (nPRM.reg_LD_LUT_Hdg_LEXT_TXLX[i] & 0x3ff) |
-                       ((nPRM.reg_LD_LUT_VHk_LEXT_TXLX[i] & 0x3ff) << 10) |
-                       ((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*/
-       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*/
-       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*/
-       LDIM_WR_BASE_LUT(REG_LD_LUT_VHK_BASE_TXLX,
-               nPRM.reg_LD_LUT_VHk_TXLX[0], 16, 8*32);
-
-       /*reg_LD_LUT_Id[16][24]: u3*16*24=u3*384 */
-       LDIM_WR_BASE_LUT(REG_LD_LUT_ID_BASE_TXLX, nPRM.reg_LD_LUT_Id, 4, 384);
-
-       /*enable the CBUS configure the RAM*/
-       /*LD_MISC_CTRL0  {reg_blmat_ram_mode,
-        *1'h0,ram_bus_sel,ram_clk_sel,ram_clk_gate_en,
-        *2'h0,reg_hvcnt_bypass,reg_demo_synmode,reg_ldbl_synmode,
-        *reg_ldim_bl_en,soft_bl_start,reg_soft_rst)
-        */
-       data = LDIM_RD_32Bits(REG_LD_MISC_CTRL0);
-       data = (data & (~(3 << 9))) | (1 << 8);
-       LDIM_WR_32Bits(REG_LD_MISC_CTRL0, data);
-
-       /*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_WR_32Bits(REG_LD_MISC_CTRL0, data);
-
-       LDIM_Update_Matrix(nPRM.BL_matrix, 16 * 24);
-
-       kfree(arrayTmp);
 }
 
 static void LDIM_Initial(unsigned int pic_h, unsigned int pic_v,
@@ -591,105 +355,23 @@ static void LDIM_Initial(unsigned int pic_h, unsigned int pic_v,
                LDIMERR("%s: invalid ldim_op_func\n", __func__);
                return;
        }
-       if (ldim_dev.ldim_op_func->ldim_init)
-               ldim_dev.ldim_op_func->ldim_init(ldim_bl_en, ldim_hvcnt_bypass);
-}
-
-static void ldim_update_matrix(unsigned int mode)
-{
-       unsigned int data;
-       int bl_matrix[8] = {0};
-       unsigned int reg_BL_matrix_Compensate = 0x0;
-       int bl_matrix_1[8] = {0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff,
-                       0xfff, 0xfff};
-       unsigned int reg_BL_matrix_Compensate_1 = 0xfff;
-       int bl_matrix_2[8] = {0xfff, 0xfff, 0xfff, 0x000, 0x000, 0xfff,
-                       0xfff, 0xfff};
-       unsigned int reg_BL_matrix_Compensate_2 = 0xbff;
-       int bl_matrix_3[8] = {0, 0, 0, 0xfff, 0, 0, 0, 0};
-       unsigned int reg_BL_matrix_Compensate_3 = 0x1ff;
-       int bl_matrix_4[8] = {0xfff, 0xfff, 0xfff, 0, 0xfff, 0xfff,
-                       0xfff, 0xfff};
-       unsigned int reg_BL_matrix_Compensate_4 = 0xdff;
-
-       data = LDIM_RD_32Bits(REG_LD_MISC_CTRL0);
-       data = data & (~(3<<4));
-       LDIM_WR_32Bits(REG_LD_MISC_CTRL0, data);
-
-       /* gMatrix_LUT: s12*100 ==> max to 8*8 enum ##r/w ram method*/
-       if (mode == 0) {
-               LDIM_WR_BASE_LUT_DRT(REG_LD_MATRIX_BASE,
-                       &bl_matrix[0], 8);
-               /*  compensate  */
-               data = LDIM_RD_32Bits(REG_LD_LIT_GAIN_COMP);
-               data = data|(reg_BL_matrix_Compensate&0xfff);
-               LDIM_WR_32Bits(REG_LD_LIT_GAIN_COMP, data);
-       } else if (mode == 1) {
-               LDIM_WR_BASE_LUT_DRT(REG_LD_MATRIX_BASE,
-                       &bl_matrix_1[0], 8);
-       /*  compensate  */
-               data = LDIM_RD_32Bits(REG_LD_LIT_GAIN_COMP);
-               data = data | (reg_BL_matrix_Compensate_1 & 0xfff);
-               LDIM_WR_32Bits(REG_LD_LIT_GAIN_COMP, data);
-       } else if (mode == 2) {
-               LDIM_WR_BASE_LUT_DRT(REG_LD_MATRIX_BASE,
-                       &bl_matrix_2[0], 8);
-       /*  compensate  */
-               data = LDIM_RD_32Bits(REG_LD_LIT_GAIN_COMP);
-               data = data|(reg_BL_matrix_Compensate_2 & 0xfff);
-               LDIM_WR_32Bits(REG_LD_LIT_GAIN_COMP, data);
-       } else if (mode == 3) {
-               LDIM_WR_BASE_LUT_DRT(REG_LD_MATRIX_BASE,
-                       &bl_matrix_3[0], 8);
-       /* compensate */
-               data = LDIM_RD_32Bits(REG_LD_LIT_GAIN_COMP);
-               data = data | (reg_BL_matrix_Compensate_3 & 0xfff);
-               LDIM_WR_32Bits(REG_LD_LIT_GAIN_COMP, data);
-       } else if (mode == 4) {
-               LDIM_WR_BASE_LUT_DRT(REG_LD_MATRIX_BASE,
-                       &bl_matrix_4[0], 8);
-       /* compensate */
-               data = LDIM_RD_32Bits(REG_LD_LIT_GAIN_COMP);
-               data = data | (reg_BL_matrix_Compensate_4 & 0xfff);
-               LDIM_WR_32Bits(REG_LD_LIT_GAIN_COMP, data);
-       }
-       /* disable the CBUS configure the RAM */
-       data = LDIM_RD_32Bits(REG_LD_MISC_CTRL0);
-       data = data | (3<<4);
-       LDIM_WR_32Bits(REG_LD_MISC_CTRL0, data);
-}
-
-static void ldim_update_txlx(void)
-{
-       unsigned int data;
-
-       if (ldim_avg_update_en) {
-               /* LD_BKLIT_PARAM */
-               data = LDIM_RD_32Bits(REG_LD_BKLIT_PARAM);
-               data = (data&(~0xfff)) | (nPRM.reg_BL_matrix_AVG&0xfff);
-               LDIM_WR_32Bits(REG_LD_BKLIT_PARAM, data);
-
-               /* compensate */
-               data = LDIM_RD_32Bits(REG_LD_LIT_GAIN_COMP);
-               data = (data&(~0xfff)) |
-                       (nPRM.reg_BL_matrix_Compensate & 0xfff);
-               LDIM_WR_32Bits(REG_LD_LIT_GAIN_COMP, data);
+       if (ldim_dev.ldim_op_func->ldim_init) {
+               ldim_dev.ldim_op_func->ldim_init(&nPRM,
+                       ldim_bl_en, ldim_hvcnt_bypass);
        }
-
-       if (ldim_matrix_update_en)
-               LDIM_Update_Matrix(nPRM.BL_matrix, ldim_blk_row*ldim_blk_col);
-
 }
 
-static void ldim_update_setting(void)
+static void ldim_remap_update(void)
 {
        if (ldim_dev.ldim_op_func == NULL) {
                if (brightness_vs_cnt == 0)
                        LDIMERR("%s: invalid ldim_op_func\n", __func__);
                return;
        }
-       if (ldim_dev.ldim_op_func->update_setting)
-               ldim_dev.ldim_op_func->update_setting();
+       if (ldim_dev.ldim_op_func->remap_update) {
+               ldim_dev.ldim_op_func->remap_update(&nPRM,
+                       ldim_avg_update_en, ldim_matrix_update_en);
+       }
 }
 
 static irqreturn_t ldim_vsync_isr(int irq, void *dev_id)
@@ -706,7 +388,7 @@ static irqreturn_t ldim_vsync_isr(int irq, void *dev_id)
 
        if (ldim_func_en) {
                if (ldim_avg_update_en)
-                       ldim_update_setting();
+                       ldim_remap_update();
 
                if (ldim_hist_en) {
                        /*schedule_work(&ldim_on_vs_work);*/
@@ -1293,7 +975,7 @@ static void ldim_get_matrix_info(void)
        }
 
        pr_info("current black_frm: %d\n", ldim_fw_para.black_frm);
-       pr_info("spi transfer_matrix:\n");
+       pr_info("ldim_dev brightness transfer_matrix:\n");
        for (i = 0; i < ldim_blk_row; i++) {
                len = 0;
                for (j = 0; j < ldim_blk_col; j++) {
@@ -1662,7 +1344,8 @@ static int ldim_on_init(void)
 {
        int ret = 0;
 
-       LDIMPR("%s\n", __func__);
+       if (ldim_debug_print)
+               LDIMPR("%s\n", __func__);
 
        /* init ldim */
        ldim_stts_initial(ldim_config.hsize, ldim_config.vsize,
@@ -1775,6 +1458,45 @@ struct aml_ldim_driver_s *aml_ldim_get_driver(void)
        return &ldim_driver;
 }
 
+/* ******************************************************
+ * local dimming dummy function for virtual ldim dev
+ * ******************************************************
+ */
+static int ldim_virtual_smr(unsigned short *buf, unsigned char len)
+{
+       return 0;
+}
+
+static int ldim_virtual_power_on(void)
+{
+       return 0;
+}
+
+static int ldim_virtual_power_off(void)
+{
+       return 0;
+}
+
+static int ldim_virtual_driver_update(struct aml_ldim_driver_s *ldim_drv)
+{
+       ldim_drv->device_power_on = ldim_virtual_power_on;
+       ldim_drv->device_power_off = ldim_virtual_power_off;
+       ldim_drv->device_bri_update = ldim_virtual_smr;
+
+       return 0;
+}
+
+static int ldim_dev_add_virtual_driver(struct aml_ldim_driver_s *ldim_drv)
+{
+       LDIMPR("%s\n", __func__);
+
+       ldim_virtual_driver_update(ldim_drv);
+       ldim_drv->init();
+
+       return 0;
+}
+/* ****************************************************** */
+
 static int ldim_open(struct inode *inode, struct file *file)
 {
        struct ldim_dev_s *devp;
@@ -2356,16 +2078,6 @@ static ssize_t ldim_attr_store(struct class *cla,
                        pr_info("reg_addr: 0x%x=0x%x, readback: 0x%x\n",
                                reg_addr, reg_val, LDIM_RD_32Bits(reg_addr));
                }
-       } else if (!strcmp(parm[0], "update_matrix")) {
-               unsigned int mode = 0;
-
-               if (parm[1] != NULL) {
-                       if (kstrtouint(parm[1], 10, &mode) < 0)
-                               goto ldim_attr_store_err;
-
-                       ldim_update_matrix(mode);
-                       pr_info("mode: %d\n", mode);
-               }
        } else if (!strcmp(parm[0], "bl_remap_curve")) {
                if (parm[1] != NULL) {
                        if (!strcmp(parm[1], "r")) {
@@ -2855,7 +2567,8 @@ static ssize_t ldim_attr_store(struct class *cla,
                        ldim_fw_para.Dbprint_lv);
        } else if (!strcmp(parm[0], "info")) {
                pr_info("ldim_drv_ver: %s\n", LDIM_DRV_VER);
-               ldim_driver.config_print();
+               if (ldim_driver.config_print)
+                       ldim_driver.config_print();
                pr_info("\nldim_blk_row          = %d\n"
                        "ldim_blk_col          = %d\n"
                        "ldim_hist_row         = %d\n"
@@ -2944,10 +2657,32 @@ static ssize_t ldim_func_en_store(struct class *class,
        return count;
 }
 
+static ssize_t ldim_para_show(struct class *class,
+               struct class_attribute *attr, char *buf)
+{
+       int len = 0;
+
+       len = sprintf(buf, "boost_gain=%d\n", ldim_fw_para.boost_gain);
+
+       return len;
+}
+
+static ssize_t ldim_dump_show(struct class *class,
+               struct class_attribute *attr, char *buf)
+{
+       int len = 0;
+
+       len = ldim_hw_reg_dump(buf);
+
+       return len;
+}
+
 static struct class_attribute aml_ldim_class_attrs[] = {
        __ATTR(attr, 0644, ldim_attr_show, ldim_attr_store),
        __ATTR(func_en, 0644,
                ldim_func_en_show, ldim_func_en_store),
+       __ATTR(para, 0644, ldim_para_show, NULL),
+       __ATTR(dump, 0644, ldim_dump_show, NULL),
        __ATTR_NULL,
 };
 
@@ -3000,7 +2735,8 @@ int aml_ldim_get_config_dts(struct device_node *child)
                LDIMERR("failed to get ldim_dev_index\n");
        else
                ldim_driver.dev_index = (unsigned char)para[0];
-       LDIMPR("get ldim_dev_index = %d\n", ldim_driver.dev_index);
+       if (ldim_driver.dev_index < 0xff)
+               LDIMPR("get ldim_dev_index = %d\n", ldim_driver.dev_index);
 
        return 0;
 }
@@ -3032,7 +2768,8 @@ int aml_ldim_get_config_unifykey(unsigned char *buf)
 
        /* 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);
+       if (ldim_driver.dev_index < 0xff)
+               LDIMPR("get dev_index = %d\n", ldim_driver.dev_index);
 
        return 0;
 }
@@ -3192,17 +2929,52 @@ ldim_malloc_err0:
 }
 
 static struct ldim_operate_func_s ldim_op_func_txlx = {
-       .update_setting = ldim_update_txlx,
+       .h_region_max = 24,
+       .v_region_max = 16,
+       .total_region_max = 384,
+       .remap_update = ldim_remap_update_txlx,
        .stts_init = ldim_stts_initial_txlx,
        .ldim_init = ldim_initial_txlx,
 };
 
 static struct ldim_operate_func_s ldim_op_func_tl1 = {
-       .update_setting = NULL,
-       .stts_init = NULL,
+       .h_region_max = 31,
+       .v_region_max = 16,
+       .total_region_max = 128,
+       .remap_update = NULL,
+       .stts_init = ldim_stts_initial_tl1,
        .ldim_init = NULL,
 };
 
+static int ldim_region_num_check(struct ldim_operate_func_s *ldim_func)
+{
+       unsigned short temp;
+
+       if (ldim_func == NULL) {
+               LDIMERR("%s: ldim_func is NULL\n", __func__);
+               return -1;
+       }
+
+       if (ldim_config.row > ldim_func->v_region_max) {
+               LDIMERR("%s: blk row (%d) is out of support (%d)\n",
+                       __func__, ldim_config.row, ldim_func->v_region_max);
+               return -1;
+       }
+       if (ldim_config.col > ldim_func->h_region_max) {
+               LDIMERR("%s: blk col (%d) is out of support (%d)\n",
+                       __func__, ldim_config.col, ldim_func->h_region_max);
+               return -1;
+       }
+       temp = ldim_config.row * ldim_config.col;
+       if (temp > ldim_func->total_region_max) {
+               LDIMERR("%s: blk total region (%d) is out of support (%d)\n",
+                       __func__, temp, ldim_func->total_region_max);
+               return -1;
+       }
+
+       return 0;
+}
+
 int aml_ldim_probe(struct platform_device *pdev)
 {
        int ret = 0;
@@ -3250,6 +3022,9 @@ int aml_ldim_probe(struct platform_device *pdev)
                devp->ldim_op_func = NULL;
                break;
        }
+       ret = ldim_region_num_check(devp->ldim_op_func);
+       if (ret)
+               return -1;
 
        ret = aml_ldim_malloc(ldim_blk_row, ldim_blk_col);
        if (ret) {
@@ -3320,12 +3095,18 @@ int aml_ldim_probe(struct platform_device *pdev)
                goto err;
        }
        ldim_vsync_irq = bl_drv->res_ldim_vsync_irq->start;
-       LDIMPR("ldim_vsync_irq: %d\n", ldim_vsync_irq);
+       if (ldim_debug_print)
+               LDIMPR("ldim_vsync_irq: %d\n", ldim_vsync_irq);
        if (request_irq(ldim_vsync_irq, ldim_vsync_isr, IRQF_SHARED,
-               "ldim_vsync", (void *)"ldim_vsync"))
+               "ldim_vsync", (void *)"ldim_vsync")) {
                LDIMERR("can't request ldim_vsync_irq\n");
-       else
-               LDIMPR("request ldim_vsync_irq successful\n");
+       } else {
+               if (ldim_debug_print)
+                       LDIMPR("request ldim_vsync_irq successful\n");
+       }
+
+       if (bl_drv->bconf->method != BL_CTRL_LOCAL_DIMMING)
+               ldim_dev_add_virtual_driver(&ldim_driver);
 
        ldim_driver.valid_flag = 1;
 
index 0875bde..d186f59 100644 (file)
@@ -25,7 +25,8 @@
 /*20180820: pq tooling support, espically optimize some alg parameters */
 /*20181101: fix ldim_op_func null mistake, add new spi api support */
 /*20181203: add 50/60hz change & iw7027 error handle support */
-#define LDIM_DRV_VER    "20181203"
+/*20181220: add tl1 support*/
+#define LDIM_DRV_VER    "20181220"
 
 extern unsigned char ldim_debug_print;
 
@@ -39,25 +40,36 @@ extern int LD_remap_lut[16][32];
 /*========================================*/
 
 struct ldim_operate_func_s {
-       void (*update_setting)(void);
-       void (*stts_init)(unsigned int resolution);
-       void (*ldim_init)(unsigned int bl_en, unsigned int hvcnt_bypass);
+       unsigned short h_region_max;
+       unsigned short v_region_max;
+       unsigned short total_region_max;
+       void (*remap_update)(struct LDReg_s *nPRM,
+               unsigned int avg_update_en, unsigned int matrix_update_en);
+       void (*stts_init)(unsigned int pic_h, unsigned int pic_v,
+               unsigned int blk_vnum, unsigned int blk_hnum);
+       void (*ldim_init)(struct LDReg_s *nPRM,
+               unsigned int bl_en, unsigned int hvcnt_bypass);
 };
 
 /*========================================*/
 
 extern int  ldim_round(int ix, int ib);
-extern void ldim_stts_en(unsigned int resolution, unsigned int pix_drop_mode,
-       unsigned int eol_en, unsigned int hist_mode, unsigned int lpf_en,
-       unsigned int rd_idx_auto_inc_mode, unsigned int one_ram_en);
-extern void ldim_set_region(unsigned int resolution, unsigned int blk_height,
-       unsigned int blk_width, unsigned int row_start, unsigned int col_start,
-       unsigned int blk_hnum);
 extern void LD_ConLDReg(struct LDReg_s *Reg);
 extern void ld_fw_cfg_once(struct LDReg_s *nPRM);
-extern void ldim_stts_read_region(unsigned int nrow, unsigned int ncol);
 
+/* ldim hw */
+extern int ldim_hw_reg_dump(char *buf);
+extern void ldim_stts_read_region(unsigned int nrow, unsigned int ncol);
 extern void ldim_set_matrix_ycbcr2rgb(void);
 extern void ldim_set_matrix_rgb2ycbcr(int mode);
 
+extern void ldim_initial_txlx(struct LDReg_s *nPRM,
+               unsigned int ldim_bl_en, unsigned int ldim_hvcnt_bypass);
+extern void ldim_stts_initial_txlx(unsigned int pic_h, unsigned int pic_v,
+               unsigned int blk_vnum, unsigned int blk_hnum);
+extern void ldim_stts_initial_tl1(unsigned int pic_h, unsigned int pic_v,
+               unsigned int blk_vnum, unsigned int blk_hnum);
+extern void ldim_remap_update_txlx(struct LDReg_s *nPRM,
+               unsigned int avg_update_en, unsigned int matrix_update_en);
+
 #endif
index 606cd54..613c6a7 100644 (file)
@@ -38,9 +38,6 @@
 #define MIN(a, b)   ((a < b) ? a:b)
 #endif
 
-#define Wr(reg, val)    Wr_reg(reg, val)
-#define Rd(reg)         Rd_reg(reg)
-
 static int LD_BLK_Hidx[33] = {
        /* S14* 33      */
        -1920, -1440, -960, -480, 0, 480,
@@ -246,385 +243,6 @@ int ldim_round(int ix, int ib)
        return ld_rst;
 }
 
-/***** local dimming stts functions begin *****/
-/*hist mode: 0: comp0 hist only, 1: Max(comp0,1,2) for hist,
- *2: the hist of all comp0,1,2 are calculated
- */
-/*lpf_en   1: 1,2,1 filter on before finding max& hist*/
-/*rd_idx_auto_inc_mode 0: no self increase, 1: read index increase after
- *read a 25/48 block, 2: increases every read and lock sub-idx
- */
-/*one_ram_en 1: one ram mode;  0:double ram mode*/
-void ldim_stts_en(unsigned int resolution, unsigned int pix_drop_mode,
-       unsigned int eol_en, unsigned int hist_mode, unsigned int lpf_en,
-       unsigned int rd_idx_auto_inc_mode, unsigned int one_ram_en)
-{
-       int data32;
-
-       Wr(LDIM_STTS_GCLK_CTRL0, 0x0);
-       Wr(LDIM_STTS_WIDTHM1_HEIGHTM1, resolution);
-
-       data32 = 0x80000000 | ((pix_drop_mode & 0x3) << 29);
-       data32 = data32 | ((eol_en & 0x1) << 28);
-       data32 = data32 | ((one_ram_en & 0x1) << 27);
-       data32 = data32 | ((hist_mode & 0x3) << 22);
-       data32 = data32 | ((lpf_en & 0x1) << 21);
-       data32 = data32 | ((rd_idx_auto_inc_mode & 0xff) << 14);
-       Wr(LDIM_STTS_HIST_REGION_IDX, data32);
-}
-
-void ldim_set_region(unsigned int resolution, unsigned int blk_height,
-       unsigned int blk_width, unsigned int row_start, unsigned int col_start,
-       unsigned int blk_hnum)
-{
-       unsigned int hend0, hend1, hend2, hend3, hend4, hend5,
-                       hend6, hend7, hend8, hend9, hend10, hend11, hend12,
-                       hend13, hend14, hend15, hend16, hend17, hend18,
-                       hend19, hend20, hend21, hend22, hend23;
-       unsigned int vend0, vend1, vend2, vend3, vend4, vend5,
-                       vend6, vend7, vend8, vend9, vend10, vend11,
-                       vend12, vend13, vend14, vend15;
-       unsigned int data32, k, h_index[24], v_index[16];
-
-       if (resolution == 0) {
-               h_index[0] = col_start + blk_width - 1;
-               for (k = 1; k < 24; k++) {
-                       h_index[k] = h_index[k-1] + blk_width;
-                       if (h_index[k] > 4095)
-                               h_index[k] = 4095; /* clip U12 */
-               }
-               v_index[0] = row_start + blk_height - 1;
-               for (k = 1; k < 16; k++) {
-                       v_index[k] = v_index[k-1] + blk_height;
-                       if (v_index[k] > 4095)
-                               v_index[k] = 4095; /* clip U12 */
-               }
-               hend0 = h_index[0];/*col_start + blk_width - 1;*/
-               hend1 = h_index[1];/*hend0 + blk_width;*/
-               hend2 = h_index[2];/*hend1 + blk_width;*/
-               hend3 = h_index[3];/*hend2 + blk_width;*/
-               hend4 = h_index[4];/*hend3 + blk_width;*/
-               hend5 = h_index[5];/*hend4 + blk_width;*/
-               hend6 = h_index[6];/*hend5 + blk_width;*/
-               hend7 = h_index[7];/*hend6 + blk_width;*/
-               hend8 = h_index[8];/*hend7 + blk_width;*/
-               hend9 = h_index[9];/*hend8 + blk_width;*/
-               hend10 = h_index[10];/*hend9 + blk_width ;*/
-               hend11 = h_index[11];/*hend10 + blk_width;*/
-               hend12 = h_index[12];/*hend11 + blk_width;*/
-               hend13 = h_index[13];/*hend12 + blk_width;*/
-               hend14 = h_index[14];/*hend13 + blk_width;*/
-               hend15 = h_index[15];/*hend14 + blk_width;*/
-               hend16 = h_index[16];/*hend15 + blk_width;*/
-               hend17 = h_index[17];/*hend16 + blk_width;*/
-               hend18 = h_index[18];/*hend17 + blk_width;*/
-               hend19 = h_index[19];/*hend18 + blk_width;*/
-               hend20 = h_index[20];/*hend19 + blk_width ;*/
-               hend21 = h_index[21];/*hend20 + blk_width;*/
-               hend22 = h_index[22];/*hend21 + blk_width;*/
-               hend23 = h_index[23];/*hend22 + blk_width;*/
-               vend0 = v_index[0];/*row_start + blk_height - 1;*/
-               vend1 = v_index[1];/*vend0 + blk_height;*/
-               vend2 = v_index[2];/*vend1 + blk_height;*/
-               vend3 = v_index[3];/*vend2 + blk_height;*/
-               vend4 = v_index[4];/*vend3 + blk_height;*/
-               vend5 = v_index[5];/*vend4 + blk_height;*/
-               vend6 = v_index[6];/*vend5 + blk_height;*/
-               vend7 = v_index[7];/*vend6 + blk_height;*/
-               vend8 = v_index[8];/*vend7 + blk_height;*/
-               vend9 = v_index[9];/*vend8 + blk_height;*/
-               vend10 = v_index[10];/*vend9 +  blk_height;*/
-               vend11 = v_index[11];/*vend10 + blk_height;*/
-               vend12 = v_index[12];/*vend11 + blk_height;*/
-               vend13 = v_index[13];/*vend12 + blk_height;*/
-               vend14 = v_index[14];/*vend13 + blk_height;*/
-               vend15 = v_index[15];/*vend14 + blk_height;*/
-
-               data32 = Rd(LDIM_STTS_HIST_REGION_IDX);
-               Wr(LDIM_STTS_HIST_REGION_IDX, 0xffe0ffff & data32);
-               Wr(LDIM_STTS_HIST_SET_REGION, ((((row_start & 0x1fff) << 16)
-                       & 0xffff0000) | (col_start & 0x1fff)));
-               Wr(LDIM_STTS_HIST_SET_REGION, (((hend1 & 0x1fff) << 16)
-                       | (hend0 & 0x1fff)));
-               Wr(LDIM_STTS_HIST_SET_REGION, (((vend1 & 0x1fff) << 16)
-                       | (vend0 & 0x1fff)));
-               Wr(LDIM_STTS_HIST_SET_REGION, (((hend3 & 0x1fff) << 16)
-                       | (hend2 & 0x1fff)));
-               Wr(LDIM_STTS_HIST_SET_REGION, (((vend3 & 0x1fff) << 16)
-                       | (vend2 & 0x1fff)));
-               Wr(LDIM_STTS_HIST_SET_REGION, (((hend5 & 0x1fff) << 16)
-                       | (hend4 & 0x1fff)));
-               Wr(LDIM_STTS_HIST_SET_REGION, (((vend5 & 0x1fff) << 16)
-                       | (vend4 & 0x1fff)));
-               Wr(LDIM_STTS_HIST_SET_REGION, (((hend7 & 0x1fff) << 16)
-                       | (hend6 & 0x1fff)));
-               Wr(LDIM_STTS_HIST_SET_REGION, (((vend7 & 0x1fff) << 16)
-                       | (vend6 & 0x1fff)));
-               Wr(LDIM_STTS_HIST_SET_REGION, (((hend9 & 0x1fff) << 16)
-                       | (hend8 & 0x1fff)));
-               Wr(LDIM_STTS_HIST_SET_REGION, (((vend9 & 0x1fff) << 16)
-                       | (vend8 & 0x1fff)));
-               Wr(LDIM_STTS_HIST_SET_REGION, (((hend11 & 0x1fff) << 16)
-                       | (hend10 & 0x1fff)));
-               Wr(LDIM_STTS_HIST_SET_REGION, (((vend11 & 0x1fff) << 16)
-                       | (vend10 & 0x1fff)));
-               Wr(LDIM_STTS_HIST_SET_REGION, (((hend13 & 0x1fff) << 16)
-                       | (hend12 & 0x1fff)));
-               Wr(LDIM_STTS_HIST_SET_REGION, (((vend13 & 0x1fff) << 16)
-                       | (vend12 & 0x1fff)));
-               Wr(LDIM_STTS_HIST_SET_REGION, (((hend15 & 0x1fff) << 16)
-                       | (hend14 & 0x1fff)));
-               Wr(LDIM_STTS_HIST_SET_REGION, (((vend15 & 0x1fff) << 16)
-                       | (vend14 & 0x1fff)));
-               Wr(LDIM_STTS_HIST_SET_REGION, (((hend17 & 0x1fff) << 16)
-                       | (hend16 & 0x1fff)));
-               Wr(LDIM_STTS_HIST_SET_REGION, (((hend19 & 0x1fff) << 16)
-                       | (hend18 & 0x1fff)));
-               Wr(LDIM_STTS_HIST_SET_REGION, (((hend21 & 0x1fff) << 16)
-                       | (hend20 & 0x1fff)));
-               Wr(LDIM_STTS_HIST_SET_REGION, (((hend23 & 0x1fff) << 16)
-                       | (hend22 & 0x1fff)));
-               Wr(LDIM_STTS_HIST_SET_REGION, blk_hnum); /*h region number*/
-               Wr(LDIM_STTS_HIST_SET_REGION, 0); /*line_n_int_num*/
-       } else if (resolution == 1) {
-               data32 = Rd(LDIM_STTS_HIST_REGION_IDX);
-               Wr(LDIM_STTS_HIST_REGION_IDX, 0xfff0ffff & data32);
-               Wr(LDIM_STTS_HIST_SET_REGION, 0x0010010);
-               Wr(LDIM_STTS_HIST_SET_REGION, 0x1000080);
-               Wr(LDIM_STTS_HIST_SET_REGION, 0x0800040);
-               Wr(LDIM_STTS_HIST_SET_REGION, 0x2000180);
-               Wr(LDIM_STTS_HIST_SET_REGION, 0x10000c0);
-               Wr(LDIM_STTS_HIST_SET_REGION, 0x3000280);
-               Wr(LDIM_STTS_HIST_SET_REGION, 0x1800140);
-               Wr(LDIM_STTS_HIST_SET_REGION, 0x4000380);
-               Wr(LDIM_STTS_HIST_SET_REGION, 0x20001c0);
-               /*Wr(LDIM_STTS_HIST_SET_REGION, 0x4ff0480);*/
-               /*Wr(LDIM_STTS_HIST_SET_REGION, 0x2cf0260);*/
-       } else if (resolution == 2) {
-               data32 = Rd(LDIM_STTS_HIST_REGION_IDX);
-               Wr(LDIM_STTS_HIST_REGION_IDX, 0xfff0ffff & data32);
-
-               Wr(LDIM_STTS_HIST_SET_REGION, 0x0000000);/*hv00*/
-               Wr(LDIM_STTS_HIST_SET_REGION, 0x17f00bf);/*h01*/
-               Wr(LDIM_STTS_HIST_SET_REGION, 0x0d7006b);/*v01*/
-               Wr(LDIM_STTS_HIST_SET_REGION, 0x2ff023f);/*h23*/
-               Wr(LDIM_STTS_HIST_SET_REGION, 0x1af0143);/*v23*/
-               Wr(LDIM_STTS_HIST_SET_REGION, 0x47f03bf);/*h45*/
-               Wr(LDIM_STTS_HIST_SET_REGION, 0x287021b);/*v45*/
-               Wr(LDIM_STTS_HIST_SET_REGION, 0x5ff053f);/*h67*/
-               Wr(LDIM_STTS_HIST_SET_REGION, 0x35f02f3);/*v67*/
-               Wr(LDIM_STTS_HIST_SET_REGION, 0xffe0ffe);/*h89*/
-               Wr(LDIM_STTS_HIST_SET_REGION, 0xffe0ffe);/*v89*/
-               Wr(LDIM_STTS_HIST_SET_REGION, 0xffe0ffe);/*h1011*/
-               Wr(LDIM_STTS_HIST_SET_REGION, 0xffe0ffe);/*v1011*/
-               Wr(LDIM_STTS_HIST_SET_REGION, 0xffe0ffe);/*h1213*/
-               Wr(LDIM_STTS_HIST_SET_REGION, 0xffe0ffe);/*v1213*/
-               Wr(LDIM_STTS_HIST_SET_REGION, 0xffe0ffe);/*h1415*/
-               Wr(LDIM_STTS_HIST_SET_REGION, 0xffe0ffe);/*v1415*/
-               Wr(LDIM_STTS_HIST_SET_REGION, 0xffe0ffe);/*h1617*/
-               Wr(LDIM_STTS_HIST_SET_REGION, 0xffe0ffe);/*h1819*/
-               Wr(LDIM_STTS_HIST_SET_REGION, 0xffe0ffe);/*h2021*/
-               Wr(LDIM_STTS_HIST_SET_REGION, 0xffe0ffe);/*h2223*/
-       } else if (resolution == 3) {
-               data32 = Rd(LDIM_STTS_HIST_REGION_IDX);
-               Wr(LDIM_STTS_HIST_REGION_IDX, 0xfff0ffff & data32);
-
-               Wr(LDIM_STTS_HIST_SET_REGION, 0x0000000);
-               Wr(LDIM_STTS_HIST_SET_REGION, 0x1df00ef);
-               Wr(LDIM_STTS_HIST_SET_REGION, 0x10d0086);
-               Wr(LDIM_STTS_HIST_SET_REGION, 0x3bf02cf);
-               Wr(LDIM_STTS_HIST_SET_REGION, 0x21b0194);
-               Wr(LDIM_STTS_HIST_SET_REGION, 0x59f04af);
-               Wr(LDIM_STTS_HIST_SET_REGION, 0x32902a2);
-               Wr(LDIM_STTS_HIST_SET_REGION, 0x77f068f);
-               Wr(LDIM_STTS_HIST_SET_REGION, 0x43703b0);
-               /*Wr(LDIM_STTS_HIST_SET_REGION, 0x7800780);*/
-               /*Wr(LDIM_STTS_HIST_SET_REGION, 0x4380438);*/
-       } else if (resolution == 4) { /* 5x6 */
-               data32 = Rd(LDIM_STTS_HIST_REGION_IDX);
-               Wr(LDIM_STTS_HIST_REGION_IDX, 0xfff0ffff & data32);
-
-               Wr(LDIM_STTS_HIST_SET_REGION, 0x0040001);
-               Wr(LDIM_STTS_HIST_SET_REGION, 0x27f0136);
-               Wr(LDIM_STTS_HIST_SET_REGION, 0x1af00d7);
-               Wr(LDIM_STTS_HIST_SET_REGION, 0x4ff03bf);
-               Wr(LDIM_STTS_HIST_SET_REGION, 0x35f0287);
-               Wr(LDIM_STTS_HIST_SET_REGION, 0x77f063f);
-               Wr(LDIM_STTS_HIST_SET_REGION, 0x4380437);
-               Wr(LDIM_STTS_HIST_SET_REGION, 0x7800780);
-               Wr(LDIM_STTS_HIST_SET_REGION, 0x4380438);
-               /*Wr(LDIM_STTS_HIST_SET_REGION, 0x7800780);*/
-               /*Wr(LDIM_STTS_HIST_SET_REGION, 0x4380438);*/
-       } else if (resolution == 5) { /* 8x2 */
-               data32 = Rd(LDIM_STTS_HIST_REGION_IDX);
-               Wr(LDIM_STTS_HIST_REGION_IDX, 0xfff0ffff & data32);
-
-               Wr(LDIM_STTS_HIST_SET_REGION, 0x0030002);
-               Wr(LDIM_STTS_HIST_SET_REGION, 0x31f02bb);
-               Wr(LDIM_STTS_HIST_SET_REGION, 0x0940031);
-               Wr(LDIM_STTS_HIST_SET_REGION, 0x7800780);
-               Wr(LDIM_STTS_HIST_SET_REGION, 0x233012b);
-               Wr(LDIM_STTS_HIST_SET_REGION, 0x7800780);
-               Wr(LDIM_STTS_HIST_SET_REGION, 0x30b0243);
-               Wr(LDIM_STTS_HIST_SET_REGION, 0x7800780);
-               Wr(LDIM_STTS_HIST_SET_REGION, 0x42d03d3);
-               /*Wr(LDIM_STTS_HIST_SET_REGION, 0x7800780);*/
-               /*Wr(LDIM_STTS_HIST_SET_REGION, 0x4380438);*/
-       } else if (resolution == 6) { /* 2x1 */
-               data32 = Rd(LDIM_STTS_HIST_REGION_IDX);
-               Wr(LDIM_STTS_HIST_REGION_IDX, 0xfff0ffff & data32);
-
-               Wr(LDIM_STTS_HIST_SET_REGION, 0x0030002);
-               Wr(LDIM_STTS_HIST_SET_REGION, 0x78002bb);
-               Wr(LDIM_STTS_HIST_SET_REGION, 0x0940031);
-               Wr(LDIM_STTS_HIST_SET_REGION, 0x7800780);
-               Wr(LDIM_STTS_HIST_SET_REGION, 0x4380438);
-               Wr(LDIM_STTS_HIST_SET_REGION, 0x7800780);
-               Wr(LDIM_STTS_HIST_SET_REGION, 0x4380438);
-               Wr(LDIM_STTS_HIST_SET_REGION, 0x7800780);
-               Wr(LDIM_STTS_HIST_SET_REGION, 0x4380438);
-               /*Wr(LDIM_STTS_HIST_SET_REGION, 0x7800780);*/
-               /*Wr(LDIM_STTS_HIST_SET_REGION, 0x4380438);*/
-       } else if (resolution == 7) { /* 2x2 */
-               data32 = Rd(LDIM_STTS_HIST_REGION_IDX);
-               Wr(LDIM_STTS_HIST_REGION_IDX, 0xfff0ffff & data32);
-
-               Wr(LDIM_STTS_HIST_SET_REGION, 0x0000000);
-               Wr(LDIM_STTS_HIST_SET_REGION, 0x77f03bf);
-               Wr(LDIM_STTS_HIST_SET_REGION, 0x437021b);
-               Wr(LDIM_STTS_HIST_SET_REGION, 0x7800780);
-               Wr(LDIM_STTS_HIST_SET_REGION, 0x4380438);
-               Wr(LDIM_STTS_HIST_SET_REGION, 0x7800780);
-               Wr(LDIM_STTS_HIST_SET_REGION, 0x4380438);
-               Wr(LDIM_STTS_HIST_SET_REGION, 0x7800780);
-               Wr(LDIM_STTS_HIST_SET_REGION, 0x4380438);
-               /*Wr(LDIM_STTS_HIST_SET_REGION, 0x7800780);*/
-               /*Wr(LDIM_STTS_HIST_SET_REGION, 0x4380438);*/
-       } else if (resolution == 8) { /* 3x5 */
-               data32 = Rd(LDIM_STTS_HIST_REGION_IDX);
-               Wr(LDIM_STTS_HIST_REGION_IDX, 0xfff0ffff & data32);
-
-               Wr(LDIM_STTS_HIST_SET_REGION, 0x0000000);
-               Wr(LDIM_STTS_HIST_SET_REGION, 0x2ff017f);
-               Wr(LDIM_STTS_HIST_SET_REGION, 0x2cf0167);
-               Wr(LDIM_STTS_HIST_SET_REGION, 0x5ff047f);
-               Wr(LDIM_STTS_HIST_SET_REGION, 0x4380437);
-               Wr(LDIM_STTS_HIST_SET_REGION, 0x780077f);
-               Wr(LDIM_STTS_HIST_SET_REGION, 0x4380438);
-               Wr(LDIM_STTS_HIST_SET_REGION, 0x7800780);
-               Wr(LDIM_STTS_HIST_SET_REGION, 0x4380438);
-               /*Wr(LDIM_STTS_HIST_SET_REGION, 0x7800780);*/
-               /*Wr(LDIM_STTS_HIST_SET_REGION, 0x4380438);*/
-       } else if (resolution == 9) { /* 4x3 */
-               data32 = Rd(LDIM_STTS_HIST_REGION_IDX);
-               Wr(LDIM_STTS_HIST_REGION_IDX, 0xfff0ffff & data32);
-
-               Wr(LDIM_STTS_HIST_SET_REGION, 0x0010001);
-               Wr(LDIM_STTS_HIST_SET_REGION, 0x4560333);
-               Wr(LDIM_STTS_HIST_SET_REGION, 0x2220180);
-               Wr(LDIM_STTS_HIST_SET_REGION, 0x7800666);
-               Wr(LDIM_STTS_HIST_SET_REGION, 0x4000338);
-               Wr(LDIM_STTS_HIST_SET_REGION, 0x7800780);
-               Wr(LDIM_STTS_HIST_SET_REGION, 0x4380438);
-               Wr(LDIM_STTS_HIST_SET_REGION, 0x7800780);
-               Wr(LDIM_STTS_HIST_SET_REGION, 0x4380438);
-               /*Wr(LDIM_STTS_HIST_SET_REGION, 0x7800780);*/
-               /*Wr(LDIM_STTS_HIST_SET_REGION, 0x4380438);*/
-       } else if (resolution == 10) { /* 6x8 */
-               data32 = Rd(LDIM_STTS_HIST_REGION_IDX);
-               Wr(LDIM_STTS_HIST_REGION_IDX, 0xfff0ffff & data32);
-
-               Wr(LDIM_STTS_HIST_SET_REGION, 0x0010001);
-               Wr(LDIM_STTS_HIST_SET_REGION, 0x2430167);
-               Wr(LDIM_STTS_HIST_SET_REGION, 0x2220180);
-               Wr(LDIM_STTS_HIST_SET_REGION, 0x4000350);
-               Wr(LDIM_STTS_HIST_SET_REGION, 0x4000338);
-               Wr(LDIM_STTS_HIST_SET_REGION, 0x6000510);
-               Wr(LDIM_STTS_HIST_SET_REGION, 0x4370410);
-               Wr(LDIM_STTS_HIST_SET_REGION, 0x77f0700);
-               Wr(LDIM_STTS_HIST_SET_REGION, 0x4380438);
-               /*Wr(LDIM_STTS_HIST_SET_REGION, 0x7800780);*/
-               /*Wr(LDIM_STTS_HIST_SET_REGION, 0x4380438);*/
-       }
-}
-
-static unsigned int invalid_val_cnt;
-void ldim_stts_read_region(unsigned int nrow, unsigned int ncol)
-{
-       unsigned int i, j, k;
-       unsigned int data32;
-       struct aml_ldim_driver_s *ldim_drv = aml_ldim_get_driver();
-
-       if (invalid_val_cnt > 0xfffffff)
-               invalid_val_cnt = 0;
-
-       Wr(LDIM_STTS_HIST_REGION_IDX, Rd(LDIM_STTS_HIST_REGION_IDX)
-               & 0xffffc000);
-       data32 = Rd(LDIM_STTS_HIST_START_RD_REGION);
-
-       for (i = 0; i < nrow; i++) {
-               for (j = 0; j < ncol; j++) {
-                       data32 = Rd(LDIM_STTS_HIST_START_RD_REGION);
-                       for (k = 0; k < 17; k++) {
-                               if (k == 16) {
-                                       data32 = Rd(LDIM_STTS_HIST_READ_REGION);
-                                       ldim_drv->max_rgb[i * ncol + j]
-                                               = data32;
-                               } else {
-                                       data32 = Rd(LDIM_STTS_HIST_READ_REGION);
-                                       ldim_drv->hist_matrix[i * ncol * 16 +
-                                               j * 16 + k] = data32;
-                               }
-                               if (!(data32 & 0x40000000))
-                                       invalid_val_cnt++;
-                       }
-               }
-       }
-}
-
-/* VDIN_MATRIX_YUV601_RGB */
-/* -16    1.164  0      1.596      0 */
-/* -128     1.164 -0.391 -0.813      0 */
-/* -128     1.164  2.018  0         0 */
-/*{0x07c00600, 0x00000600, 0x04a80000, 0x066204a8, 0x1e701cbf, 0x04a80812,
- *     0x00000000, 0x00000000, 0x00000000,},
- */
-void ldim_set_matrix_ycbcr2rgb(void)
-{
-       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);
-       Wr(LDIM_STTS_MATRIX_COEF00_01, 0x04a80000);
-       Wr(LDIM_STTS_MATRIX_COEF02_10, 0x066204a8);
-       Wr(LDIM_STTS_MATRIX_COEF11_12, 0x1e701cbf);
-       Wr(LDIM_STTS_MATRIX_COEF20_21, 0x04a80812);
-       Wr(LDIM_STTS_MATRIX_COEF22, 0x00000000);
-       Wr(LDIM_STTS_MATRIX_OFFSET0_1, 0x00000000);
-       Wr(LDIM_STTS_MATRIX_OFFSET2, 0x00000000);
-}
-
-void ldim_set_matrix_rgb2ycbcr(int mode)
-{
-       Wr_reg_bits(LDIM_STTS_CTRL0, 1, 2, 1);
-       if (mode == 0) {/*ycbcr not full range, 601 conversion*/
-               Wr(LDIM_STTS_MATRIX_PRE_OFFSET0_1, 0x0);
-               Wr(LDIM_STTS_MATRIX_PRE_OFFSET2, 0x0);
-               /*      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_COEF22, 0x1fb7);
-
-               Wr(LDIM_STTS_MATRIX_OFFSET2, 0x0200);
-       } else if (mode == 1) {/*ycbcr full range, 601 conversion*/
-               /* todo */
-       }
-}
-
 int Round(int iX, int iB)
 {
        int Rst = 0;
diff --git a/drivers/amlogic/media/vout/backlight/aml_ldim/ldim_hw.c b/drivers/amlogic/media/vout/backlight/aml_ldim/ldim_hw.c
new file mode 100644 (file)
index 0000000..7d2dcc1
--- /dev/null
@@ -0,0 +1,1021 @@
+/*
+ * drivers/amlogic/media/vout/backlight/aml_ldim/ldim_hw.c
+ *
+ * Copyright (C) 2017 Amlogic, Inc. All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
+ * more details.
+ *
+ */
+
+#include <linux/version.h>
+#include <linux/string.h>
+#include <linux/io.h>
+#include <linux/mm.h>
+#include <linux/mutex.h>
+#include <linux/cdev.h>
+#include <linux/uaccess.h>
+#include <linux/timer.h>
+#include <linux/delay.h>
+#include <linux/major.h>
+#include <linux/sched.h>
+#include <linux/vmalloc.h>
+#include <linux/types.h>
+#include <linux/init.h>
+#include <linux/slab.h>
+#include <linux/module.h>
+#include <linux/kernel.h>
+#include <linux/device.h>
+#include <linux/interrupt.h>
+#include <linux/fs.h>
+#include <linux/miscdevice.h>
+#include <linux/platform_device.h>
+#include <linux/moduleparam.h>
+#include <linux/timer.h>
+#include <linux/spinlock.h>
+#include <linux/amlogic/iomap.h>
+#include <linux/workqueue.h>
+#include <linux/amlogic/media/vfm/vframe.h>
+#include <linux/amlogic/media/vout/lcd/aml_ldim.h>
+#include <linux/amlogic/media/vout/lcd/aml_bl.h>
+#include <linux/amlogic/media/vout/vout_notify.h>
+#include <linux/amlogic/media/vout/lcd/lcd_vout.h>
+#include <linux/amlogic/media/utils/vdec_reg.h>
+#include <linux/amlogic/media/vout/lcd/lcd_unifykey.h>
+#include <linux/amlogic/media/vout/lcd/ldim_alg.h>
+#include "ldim_drv.h"
+#include "ldim_reg.h"
+
+#define Wr(reg, val)    Wr_reg(reg, val)
+#define Rd(reg)         Rd_reg(reg)
+
+static int LDIM_Update_Matrix(int NewBlMatrix[], int BlMatrixNum)
+{
+       int data;
+
+       data = LDIM_RD_32Bits(REG_LD_MISC_CTRL0);
+       if (data & (1 << 12)) {  /*bl_ram_mode=1;*/
+               if (LDIM_RD_32Bits(REG_LD_BLMAT_RAM_MISC) & 0x10000)
+                       /*Previous Matrix is not used*/
+                       goto Previous_Matrix;
+               else {
+                       LDIM_WR_BASE_LUT_DRT(REG_LD_MATRIX_BASE,
+                               NewBlMatrix, BlMatrixNum);
+                       LDIM_WR_32Bits(REG_LD_BLMAT_RAM_MISC,
+                               (BlMatrixNum & 0x1ff) | (1 << 16));
+                       /*set Matrix update ready*/
+
+                       return 0;
+               }
+       } else {  /*bl_ram_mode=0*/
+               /*set ram_clk_sel=0, ram_bus_sel = 0*/
+               data = data & (~(3 << 9));
+               LDIM_WR_32Bits(REG_LD_MISC_CTRL0, data);
+               LDIM_WR_BASE_LUT_DRT(REG_LD_MATRIX_BASE,
+                       NewBlMatrix, BlMatrixNum);
+               data = data | (3 << 9); /*set ram_clk_sel=1, ram_bus_sel = 1*/
+               LDIM_WR_32Bits(REG_LD_MISC_CTRL0, data);
+
+               return 0;
+       }
+
+Previous_Matrix:
+       return 1;
+}
+
+void ldim_initial_txlx(struct LDReg_s *nPRM,
+               unsigned int ldim_bl_en, unsigned int ldim_hvcnt_bypass)
+{
+       unsigned int i;
+       unsigned int data;
+       unsigned int *arrayTmp;
+
+       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);
+       LDIM_WR_32Bits(REG_LD_FRM_SIZE, data);
+
+       /* LD_RGB_MOD */
+       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_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));
+       LDIM_WR_32Bits(REG_LD_BLK_HVNUM, data);
+
+       /* LD_HVGAIN */
+       data = ((nPRM->reg_LD_Vgain & 0xfff) << 16) |
+               (nPRM->reg_LD_Hgain & 0xfff);
+       LDIM_WR_32Bits(REG_LD_HVGAIN, data);
+
+       /*  LD_BKLIT_VLD  */
+       data = 0;
+       for (i = 0; i < 32; i++)
+               if (nPRM->reg_LD_BkLit_valid[i])
+                       data = data | (1 << i);
+       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);
+       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);
+       LDIM_WR_32Bits(REG_LD_LIT_GAIN_COMP, data);
+
+       /* LD_FRM_RST_POS */
+       data = (1 << 16) | (5); /* h=1,v=5 :ldim_param_frm_rst_pos */
+       LDIM_WR_32Bits(REG_LD_FRM_RST_POS, data);
+
+       /* LD_FRM_BL_START_POS */
+       data = (1 << 16) | (6); /* ldim_param_frm_bl_start_pos; */
+       LDIM_WR_32Bits(REG_LD_FRM_BL_START_POS, data);
+
+       /* REG_LD_FRM_HBLAN_VHOLS  */
+       data = ((nPRM->reg_LD_LUT_VHo_LS & 0x7) << 16) |
+               ((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);
+       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);
+       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);
+       LDIM_WR_32Bits(REG_LD_XLUT_DEMO_ROI_CTRL, data);
+
+       /*LD_BLMAT_RAM_MISC*/
+       LDIM_WR_32Bits(REG_LD_BLMAT_RAM_MISC, 384 & 0x1ff);
+
+       /*  X_idx: 12*16  */
+       LDIM_WR_BASE_LUT(REG_LD_RGB_IDX_BASE, nPRM->X_idx[0], 16, 16);
+
+       /* X_nrm[16]: 4 * 16 */
+       LDIM_WR_BASE_LUT(REG_LD_RGB_NRMW_BASE_TXLX, nPRM->X_nrm[0], 4, 16);
+
+       /*reg_LD_BLK_Hidx[33]: 14*33 */
+       LDIM_WR_BASE_LUT(REG_LD_BLK_HIDX_BASE_TXLX,
+                       nPRM->reg_LD_BLK_Hidx, 16, 33);
+
+       /* reg_LD_BLK_Vidx[25]: 14*25 */
+       LDIM_WR_BASE_LUT(REG_LD_BLK_VIDX_BASE_TXLX,
+                       nPRM->reg_LD_BLK_Vidx, 16, 25);
+
+       /* reg_LD_LUT_VHk_pos[32]/reg_LD_LUT_VHk_neg[32]: u8 */
+       for (i = 0; i < 32; i++)
+               arrayTmp[i]    =  nPRM->reg_LD_LUT_VHk_pos[i];
+       for (i = 0; i < 32; i++)
+               arrayTmp[32+i] =  nPRM->reg_LD_LUT_VHk_neg[i];
+       LDIM_WR_BASE_LUT(REG_LD_LUT_VHK_NEGPOS_BASE_TXLX, arrayTmp, 8, 64);
+
+       /* reg_LD_LUT_VHo_pos[32]/reg_LD_LUT_VHo_neg[32]: s8 */
+       for (i = 0; i < 32; i++)
+               arrayTmp[i]    =  nPRM->reg_LD_LUT_VHo_pos[i];
+       for (i = 0; i < 32; i++)
+               arrayTmp[32+i] =  nPRM->reg_LD_LUT_VHo_neg[i];
+       LDIM_WR_BASE_LUT(REG_LD_LUT_VHO_NEGPOS_BASE_TXLX, arrayTmp, 8, 64);
+
+       /* reg_LD_LUT_HHk[32]:u8 */
+       LDIM_WR_BASE_LUT(REG_LD_LUT_HHK_BASE_TXLX, nPRM->reg_LD_LUT_HHk, 8, 32);
+
+       /*reg_LD_Reflect_Hdgr[20],reg_LD_Reflect_Vdgr[20],
+        *      reg_LD_Reflect_Xdgr[4]
+        */
+       for (i = 0; i < 20; i++)
+               arrayTmp[i] = nPRM->reg_LD_Reflect_Hdgr[i];
+       for (i = 0; i < 20; i++)
+               arrayTmp[20+i] = nPRM->reg_LD_Reflect_Vdgr[i];
+       for (i = 0; i < 4; i++)
+               arrayTmp[40+i] = nPRM->reg_LD_Reflect_Xdgr[i];
+       LDIM_WR_BASE_LUT(REG_LD_REFLECT_DGR_BASE_TXLX, arrayTmp, 8, 44);
+
+       /*reg_LD_LUT_Hdg_LEXT[8]/reg_LD_LUT_Vdg_LEXT[8]/reg_LD_LUT_VHk_LEXT[8]*/
+       for (i = 0; i < 8; i++)
+               arrayTmp[i] = (nPRM->reg_LD_LUT_Hdg_LEXT_TXLX[i] & 0x3ff) |
+                       ((nPRM->reg_LD_LUT_VHk_LEXT_TXLX[i] & 0x3ff) << 10) |
+                       ((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*/
+       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*/
+       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*/
+       LDIM_WR_BASE_LUT(REG_LD_LUT_VHK_BASE_TXLX,
+               nPRM->reg_LD_LUT_VHk_TXLX[0], 16, 8*32);
+
+       /*reg_LD_LUT_Id[16][24]: u3*16*24=u3*384 */
+       LDIM_WR_BASE_LUT(REG_LD_LUT_ID_BASE_TXLX, nPRM->reg_LD_LUT_Id, 4, 384);
+
+       /*enable the CBUS configure the RAM*/
+       /*LD_MISC_CTRL0  {reg_blmat_ram_mode,
+        *1'h0,ram_bus_sel,ram_clk_sel,ram_clk_gate_en,
+        *2'h0,reg_hvcnt_bypass,reg_demo_synmode,reg_ldbl_synmode,
+        *reg_ldim_bl_en,soft_bl_start,reg_soft_rst)
+        */
+       data = LDIM_RD_32Bits(REG_LD_MISC_CTRL0);
+       data = (data & (~(3 << 9))) | (1 << 8);
+       LDIM_WR_32Bits(REG_LD_MISC_CTRL0, data);
+
+       /*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_WR_32Bits(REG_LD_MISC_CTRL0, data);
+
+       LDIM_Update_Matrix(nPRM->BL_matrix, 16 * 24);
+
+       kfree(arrayTmp);
+}
+
+static unsigned int ldim_hw_reg_dump_table[] = {
+       LDIM_STTS_GCLK_CTRL0,
+       LDIM_STTS_WIDTHM1_HEIGHTM1,
+       LDIM_STTS_CTRL0,
+       LDIM_STTS_HIST_REGION_IDX,
+};
+
+int ldim_hw_reg_dump(char *buf)
+{
+       unsigned int reg, data32;
+       int i, size, len = 0;
+
+       size = sizeof(ldim_hw_reg_dump_table) / sizeof(unsigned int);
+       for (i = 0; i < size; i++) {
+               reg = ldim_hw_reg_dump_table[i];
+               data32 = Rd(reg);
+               len += sprintf(buf+len, "0x%x = 0x%08x\n", reg, data32);
+       }
+
+       data32 = Rd(LDIM_STTS_HIST_REGION_IDX);
+       Wr(LDIM_STTS_HIST_REGION_IDX, 0xffe0ffff & data32);
+       for (i = 0; i < 23; i++) {
+               reg = LDIM_STTS_HIST_SET_REGION;
+               data32 = Rd(reg);
+               len += sprintf(buf+len, "0x%x = 0x%08x\n", reg, data32);
+       }
+
+       return len;
+}
+
+/***** local dimming stts functions begin *****/
+/*hist mode: 0: comp0 hist only, 1: Max(comp0,1,2) for hist,
+ *2: the hist of all comp0,1,2 are calculated
+ */
+/*lpf_en   1: 1,2,1 filter on before finding max& hist*/
+/*rd_idx_auto_inc_mode 0: no self increase, 1: read index increase after
+ *read a 25/48 block, 2: increases every read and lock sub-idx
+ */
+/*one_ram_en 1: one ram mode;  0:double ram mode*/
+static void ldim_stts_en(unsigned int resolution, unsigned int pix_drop_mode,
+       unsigned int eol_en, unsigned int hist_mode, unsigned int lpf_en,
+       unsigned int rd_idx_auto_inc_mode, unsigned int one_ram_en)
+{
+       int data32;
+
+       Wr(LDIM_STTS_GCLK_CTRL0, 0x0);
+       Wr(LDIM_STTS_WIDTHM1_HEIGHTM1, resolution);
+
+       data32 = 0x80000000 | ((pix_drop_mode & 0x3) << 29);
+       data32 = data32 | ((eol_en & 0x1) << 28);
+       data32 = data32 | ((one_ram_en & 0x1) << 27);
+       data32 = data32 | ((hist_mode & 0x3) << 22);
+       data32 = data32 | ((lpf_en & 0x1) << 21);
+       data32 = data32 | ((rd_idx_auto_inc_mode & 0xff) << 14);
+       Wr(LDIM_STTS_HIST_REGION_IDX, data32);
+}
+
+static void ldim_stts_set_region_txlx(unsigned int resolution,
+               unsigned int blk_height, unsigned int blk_width,
+               unsigned int row_start, unsigned int col_start,
+               unsigned int blk_hnum)
+{
+       unsigned int hend0, hend1, hend2, hend3, hend4, hend5,
+                       hend6, hend7, hend8, hend9, hend10, hend11, hend12,
+                       hend13, hend14, hend15, hend16, hend17, hend18,
+                       hend19, hend20, hend21, hend22, hend23;
+       unsigned int vend0, vend1, vend2, vend3, vend4, vend5,
+                       vend6, vend7, vend8, vend9, vend10, vend11,
+                       vend12, vend13, vend14, vend15;
+       unsigned int data32, k, h_index[24], v_index[16];
+
+       if (resolution == 0) {
+               h_index[0] = col_start + blk_width - 1;
+               for (k = 1; k < 24; k++) {
+                       h_index[k] = h_index[k-1] + blk_width;
+                       if (h_index[k] > 4095)
+                               h_index[k] = 4095; /* clip U12 */
+               }
+               v_index[0] = row_start + blk_height - 1;
+               for (k = 1; k < 16; k++) {
+                       v_index[k] = v_index[k-1] + blk_height;
+                       if (v_index[k] > 4095)
+                               v_index[k] = 4095; /* clip U12 */
+               }
+               hend0 = h_index[0];/*col_start + blk_width - 1;*/
+               hend1 = h_index[1];/*hend0 + blk_width;*/
+               hend2 = h_index[2];/*hend1 + blk_width;*/
+               hend3 = h_index[3];/*hend2 + blk_width;*/
+               hend4 = h_index[4];/*hend3 + blk_width;*/
+               hend5 = h_index[5];/*hend4 + blk_width;*/
+               hend6 = h_index[6];/*hend5 + blk_width;*/
+               hend7 = h_index[7];/*hend6 + blk_width;*/
+               hend8 = h_index[8];/*hend7 + blk_width;*/
+               hend9 = h_index[9];/*hend8 + blk_width;*/
+               hend10 = h_index[10];/*hend9 + blk_width ;*/
+               hend11 = h_index[11];/*hend10 + blk_width;*/
+               hend12 = h_index[12];/*hend11 + blk_width;*/
+               hend13 = h_index[13];/*hend12 + blk_width;*/
+               hend14 = h_index[14];/*hend13 + blk_width;*/
+               hend15 = h_index[15];/*hend14 + blk_width;*/
+               hend16 = h_index[16];/*hend15 + blk_width;*/
+               hend17 = h_index[17];/*hend16 + blk_width;*/
+               hend18 = h_index[18];/*hend17 + blk_width;*/
+               hend19 = h_index[19];/*hend18 + blk_width;*/
+               hend20 = h_index[20];/*hend19 + blk_width ;*/
+               hend21 = h_index[21];/*hend20 + blk_width;*/
+               hend22 = h_index[22];/*hend21 + blk_width;*/
+               hend23 = h_index[23];/*hend22 + blk_width;*/
+               vend0 = v_index[0];/*row_start + blk_height - 1;*/
+               vend1 = v_index[1];/*vend0 + blk_height;*/
+               vend2 = v_index[2];/*vend1 + blk_height;*/
+               vend3 = v_index[3];/*vend2 + blk_height;*/
+               vend4 = v_index[4];/*vend3 + blk_height;*/
+               vend5 = v_index[5];/*vend4 + blk_height;*/
+               vend6 = v_index[6];/*vend5 + blk_height;*/
+               vend7 = v_index[7];/*vend6 + blk_height;*/
+               vend8 = v_index[8];/*vend7 + blk_height;*/
+               vend9 = v_index[9];/*vend8 + blk_height;*/
+               vend10 = v_index[10];/*vend9 +  blk_height;*/
+               vend11 = v_index[11];/*vend10 + blk_height;*/
+               vend12 = v_index[12];/*vend11 + blk_height;*/
+               vend13 = v_index[13];/*vend12 + blk_height;*/
+               vend14 = v_index[14];/*vend13 + blk_height;*/
+               vend15 = v_index[15];/*vend14 + blk_height;*/
+
+               data32 = Rd(LDIM_STTS_HIST_REGION_IDX);
+               Wr(LDIM_STTS_HIST_REGION_IDX, 0xffe0ffff & data32);
+               Wr(LDIM_STTS_HIST_SET_REGION,
+                       ((((row_start & 0x1fff) << 16) & 0xffff0000) |
+                       (col_start & 0x1fff)));
+               Wr(LDIM_STTS_HIST_SET_REGION, (((hend1 & 0x1fff) << 16)
+                       | (hend0 & 0x1fff)));
+               Wr(LDIM_STTS_HIST_SET_REGION, (((vend1 & 0x1fff) << 16)
+                       | (vend0 & 0x1fff)));
+               Wr(LDIM_STTS_HIST_SET_REGION, (((hend3 & 0x1fff) << 16)
+                       | (hend2 & 0x1fff)));
+               Wr(LDIM_STTS_HIST_SET_REGION, (((vend3 & 0x1fff) << 16)
+                       | (vend2 & 0x1fff)));
+               Wr(LDIM_STTS_HIST_SET_REGION, (((hend5 & 0x1fff) << 16)
+                       | (hend4 & 0x1fff)));
+               Wr(LDIM_STTS_HIST_SET_REGION, (((vend5 & 0x1fff) << 16)
+                       | (vend4 & 0x1fff)));
+               Wr(LDIM_STTS_HIST_SET_REGION, (((hend7 & 0x1fff) << 16)
+                       | (hend6 & 0x1fff)));
+               Wr(LDIM_STTS_HIST_SET_REGION, (((vend7 & 0x1fff) << 16)
+                       | (vend6 & 0x1fff)));
+               Wr(LDIM_STTS_HIST_SET_REGION, (((hend9 & 0x1fff) << 16)
+                       | (hend8 & 0x1fff)));
+               Wr(LDIM_STTS_HIST_SET_REGION, (((vend9 & 0x1fff) << 16)
+                       | (vend8 & 0x1fff)));
+               Wr(LDIM_STTS_HIST_SET_REGION, (((hend11 & 0x1fff) << 16)
+                       | (hend10 & 0x1fff)));
+               Wr(LDIM_STTS_HIST_SET_REGION, (((vend11 & 0x1fff) << 16)
+                       | (vend10 & 0x1fff)));
+               Wr(LDIM_STTS_HIST_SET_REGION, (((hend13 & 0x1fff) << 16)
+                       | (hend12 & 0x1fff)));
+               Wr(LDIM_STTS_HIST_SET_REGION, (((vend13 & 0x1fff) << 16)
+                       | (vend12 & 0x1fff)));
+               Wr(LDIM_STTS_HIST_SET_REGION, (((hend15 & 0x1fff) << 16)
+                       | (hend14 & 0x1fff)));
+               Wr(LDIM_STTS_HIST_SET_REGION, (((vend15 & 0x1fff) << 16)
+                       | (vend14 & 0x1fff)));
+               Wr(LDIM_STTS_HIST_SET_REGION, (((hend17 & 0x1fff) << 16)
+                       | (hend16 & 0x1fff)));
+               Wr(LDIM_STTS_HIST_SET_REGION, (((hend19 & 0x1fff) << 16)
+                       | (hend18 & 0x1fff)));
+               Wr(LDIM_STTS_HIST_SET_REGION, (((hend21 & 0x1fff) << 16)
+                       | (hend20 & 0x1fff)));
+               Wr(LDIM_STTS_HIST_SET_REGION, (((hend23 & 0x1fff) << 16)
+                       | (hend22 & 0x1fff)));
+               Wr(LDIM_STTS_HIST_SET_REGION, blk_hnum); /*h region number*/
+               Wr(LDIM_STTS_HIST_SET_REGION, 0); /*line_n_int_num*/
+       } else if (resolution == 1) {
+               data32 = Rd(LDIM_STTS_HIST_REGION_IDX);
+               Wr(LDIM_STTS_HIST_REGION_IDX, 0xfff0ffff & data32);
+               Wr(LDIM_STTS_HIST_SET_REGION, 0x0010010);
+               Wr(LDIM_STTS_HIST_SET_REGION, 0x1000080);
+               Wr(LDIM_STTS_HIST_SET_REGION, 0x0800040);
+               Wr(LDIM_STTS_HIST_SET_REGION, 0x2000180);
+               Wr(LDIM_STTS_HIST_SET_REGION, 0x10000c0);
+               Wr(LDIM_STTS_HIST_SET_REGION, 0x3000280);
+               Wr(LDIM_STTS_HIST_SET_REGION, 0x1800140);
+               Wr(LDIM_STTS_HIST_SET_REGION, 0x4000380);
+               Wr(LDIM_STTS_HIST_SET_REGION, 0x20001c0);
+               /*Wr(LDIM_STTS_HIST_SET_REGION, 0x4ff0480);*/
+               /*Wr(LDIM_STTS_HIST_SET_REGION, 0x2cf0260);*/
+       } else if (resolution == 2) {
+               data32 = Rd(LDIM_STTS_HIST_REGION_IDX);
+               Wr(LDIM_STTS_HIST_REGION_IDX, 0xfff0ffff & data32);
+
+               Wr(LDIM_STTS_HIST_SET_REGION, 0x0000000);/*hv00*/
+               Wr(LDIM_STTS_HIST_SET_REGION, 0x17f00bf);/*h01*/
+               Wr(LDIM_STTS_HIST_SET_REGION, 0x0d7006b);/*v01*/
+               Wr(LDIM_STTS_HIST_SET_REGION, 0x2ff023f);/*h23*/
+               Wr(LDIM_STTS_HIST_SET_REGION, 0x1af0143);/*v23*/
+               Wr(LDIM_STTS_HIST_SET_REGION, 0x47f03bf);/*h45*/
+               Wr(LDIM_STTS_HIST_SET_REGION, 0x287021b);/*v45*/
+               Wr(LDIM_STTS_HIST_SET_REGION, 0x5ff053f);/*h67*/
+               Wr(LDIM_STTS_HIST_SET_REGION, 0x35f02f3);/*v67*/
+               Wr(LDIM_STTS_HIST_SET_REGION, 0xffe0ffe);/*h89*/
+               Wr(LDIM_STTS_HIST_SET_REGION, 0xffe0ffe);/*v89*/
+               Wr(LDIM_STTS_HIST_SET_REGION, 0xffe0ffe);/*h1011*/
+               Wr(LDIM_STTS_HIST_SET_REGION, 0xffe0ffe);/*v1011*/
+               Wr(LDIM_STTS_HIST_SET_REGION, 0xffe0ffe);/*h1213*/
+               Wr(LDIM_STTS_HIST_SET_REGION, 0xffe0ffe);/*v1213*/
+               Wr(LDIM_STTS_HIST_SET_REGION, 0xffe0ffe);/*h1415*/
+               Wr(LDIM_STTS_HIST_SET_REGION, 0xffe0ffe);/*v1415*/
+               Wr(LDIM_STTS_HIST_SET_REGION, 0xffe0ffe);/*h1617*/
+               Wr(LDIM_STTS_HIST_SET_REGION, 0xffe0ffe);/*h1819*/
+               Wr(LDIM_STTS_HIST_SET_REGION, 0xffe0ffe);/*h2021*/
+               Wr(LDIM_STTS_HIST_SET_REGION, 0xffe0ffe);/*h2223*/
+       } else if (resolution == 3) {
+               data32 = Rd(LDIM_STTS_HIST_REGION_IDX);
+               Wr(LDIM_STTS_HIST_REGION_IDX, 0xfff0ffff & data32);
+
+               Wr(LDIM_STTS_HIST_SET_REGION, 0x0000000);
+               Wr(LDIM_STTS_HIST_SET_REGION, 0x1df00ef);
+               Wr(LDIM_STTS_HIST_SET_REGION, 0x10d0086);
+               Wr(LDIM_STTS_HIST_SET_REGION, 0x3bf02cf);
+               Wr(LDIM_STTS_HIST_SET_REGION, 0x21b0194);
+               Wr(LDIM_STTS_HIST_SET_REGION, 0x59f04af);
+               Wr(LDIM_STTS_HIST_SET_REGION, 0x32902a2);
+               Wr(LDIM_STTS_HIST_SET_REGION, 0x77f068f);
+               Wr(LDIM_STTS_HIST_SET_REGION, 0x43703b0);
+               /*Wr(LDIM_STTS_HIST_SET_REGION, 0x7800780);*/
+               /*Wr(LDIM_STTS_HIST_SET_REGION, 0x4380438);*/
+       } else if (resolution == 4) { /* 5x6 */
+               data32 = Rd(LDIM_STTS_HIST_REGION_IDX);
+               Wr(LDIM_STTS_HIST_REGION_IDX, 0xfff0ffff & data32);
+
+               Wr(LDIM_STTS_HIST_SET_REGION, 0x0040001);
+               Wr(LDIM_STTS_HIST_SET_REGION, 0x27f0136);
+               Wr(LDIM_STTS_HIST_SET_REGION, 0x1af00d7);
+               Wr(LDIM_STTS_HIST_SET_REGION, 0x4ff03bf);
+               Wr(LDIM_STTS_HIST_SET_REGION, 0x35f0287);
+               Wr(LDIM_STTS_HIST_SET_REGION, 0x77f063f);
+               Wr(LDIM_STTS_HIST_SET_REGION, 0x4380437);
+               Wr(LDIM_STTS_HIST_SET_REGION, 0x7800780);
+               Wr(LDIM_STTS_HIST_SET_REGION, 0x4380438);
+               /*Wr(LDIM_STTS_HIST_SET_REGION, 0x7800780);*/
+               /*Wr(LDIM_STTS_HIST_SET_REGION, 0x4380438);*/
+       } else if (resolution == 5) { /* 8x2 */
+               data32 = Rd(LDIM_STTS_HIST_REGION_IDX);
+               Wr(LDIM_STTS_HIST_REGION_IDX, 0xfff0ffff & data32);
+
+               Wr(LDIM_STTS_HIST_SET_REGION, 0x0030002);
+               Wr(LDIM_STTS_HIST_SET_REGION, 0x31f02bb);
+               Wr(LDIM_STTS_HIST_SET_REGION, 0x0940031);
+               Wr(LDIM_STTS_HIST_SET_REGION, 0x7800780);
+               Wr(LDIM_STTS_HIST_SET_REGION, 0x233012b);
+               Wr(LDIM_STTS_HIST_SET_REGION, 0x7800780);
+               Wr(LDIM_STTS_HIST_SET_REGION, 0x30b0243);
+               Wr(LDIM_STTS_HIST_SET_REGION, 0x7800780);
+               Wr(LDIM_STTS_HIST_SET_REGION, 0x42d03d3);
+               /*Wr(LDIM_STTS_HIST_SET_REGION, 0x7800780);*/
+               /*Wr(LDIM_STTS_HIST_SET_REGION, 0x4380438);*/
+       } else if (resolution == 6) { /* 2x1 */
+               data32 = Rd(LDIM_STTS_HIST_REGION_IDX);
+               Wr(LDIM_STTS_HIST_REGION_IDX, 0xfff0ffff & data32);
+
+               Wr(LDIM_STTS_HIST_SET_REGION, 0x0030002);
+               Wr(LDIM_STTS_HIST_SET_REGION, 0x78002bb);
+               Wr(LDIM_STTS_HIST_SET_REGION, 0x0940031);
+               Wr(LDIM_STTS_HIST_SET_REGION, 0x7800780);
+               Wr(LDIM_STTS_HIST_SET_REGION, 0x4380438);
+               Wr(LDIM_STTS_HIST_SET_REGION, 0x7800780);
+               Wr(LDIM_STTS_HIST_SET_REGION, 0x4380438);
+               Wr(LDIM_STTS_HIST_SET_REGION, 0x7800780);
+               Wr(LDIM_STTS_HIST_SET_REGION, 0x4380438);
+               /*Wr(LDIM_STTS_HIST_SET_REGION, 0x7800780);*/
+               /*Wr(LDIM_STTS_HIST_SET_REGION, 0x4380438);*/
+       } else if (resolution == 7) { /* 2x2 */
+               data32 = Rd(LDIM_STTS_HIST_REGION_IDX);
+               Wr(LDIM_STTS_HIST_REGION_IDX, 0xfff0ffff & data32);
+
+               Wr(LDIM_STTS_HIST_SET_REGION, 0x0000000);
+               Wr(LDIM_STTS_HIST_SET_REGION, 0x77f03bf);
+               Wr(LDIM_STTS_HIST_SET_REGION, 0x437021b);
+               Wr(LDIM_STTS_HIST_SET_REGION, 0x7800780);
+               Wr(LDIM_STTS_HIST_SET_REGION, 0x4380438);
+               Wr(LDIM_STTS_HIST_SET_REGION, 0x7800780);
+               Wr(LDIM_STTS_HIST_SET_REGION, 0x4380438);
+               Wr(LDIM_STTS_HIST_SET_REGION, 0x7800780);
+               Wr(LDIM_STTS_HIST_SET_REGION, 0x4380438);
+               /*Wr(LDIM_STTS_HIST_SET_REGION, 0x7800780);*/
+               /*Wr(LDIM_STTS_HIST_SET_REGION, 0x4380438);*/
+       } else if (resolution == 8) { /* 3x5 */
+               data32 = Rd(LDIM_STTS_HIST_REGION_IDX);
+               Wr(LDIM_STTS_HIST_REGION_IDX, 0xfff0ffff & data32);
+
+               Wr(LDIM_STTS_HIST_SET_REGION, 0x0000000);
+               Wr(LDIM_STTS_HIST_SET_REGION, 0x2ff017f);
+               Wr(LDIM_STTS_HIST_SET_REGION, 0x2cf0167);
+               Wr(LDIM_STTS_HIST_SET_REGION, 0x5ff047f);
+               Wr(LDIM_STTS_HIST_SET_REGION, 0x4380437);
+               Wr(LDIM_STTS_HIST_SET_REGION, 0x780077f);
+               Wr(LDIM_STTS_HIST_SET_REGION, 0x4380438);
+               Wr(LDIM_STTS_HIST_SET_REGION, 0x7800780);
+               Wr(LDIM_STTS_HIST_SET_REGION, 0x4380438);
+               /*Wr(LDIM_STTS_HIST_SET_REGION, 0x7800780);*/
+               /*Wr(LDIM_STTS_HIST_SET_REGION, 0x4380438);*/
+       } else if (resolution == 9) { /* 4x3 */
+               data32 = Rd(LDIM_STTS_HIST_REGION_IDX);
+               Wr(LDIM_STTS_HIST_REGION_IDX, 0xfff0ffff & data32);
+
+               Wr(LDIM_STTS_HIST_SET_REGION, 0x0010001);
+               Wr(LDIM_STTS_HIST_SET_REGION, 0x4560333);
+               Wr(LDIM_STTS_HIST_SET_REGION, 0x2220180);
+               Wr(LDIM_STTS_HIST_SET_REGION, 0x7800666);
+               Wr(LDIM_STTS_HIST_SET_REGION, 0x4000338);
+               Wr(LDIM_STTS_HIST_SET_REGION, 0x7800780);
+               Wr(LDIM_STTS_HIST_SET_REGION, 0x4380438);
+               Wr(LDIM_STTS_HIST_SET_REGION, 0x7800780);
+               Wr(LDIM_STTS_HIST_SET_REGION, 0x4380438);
+               /*Wr(LDIM_STTS_HIST_SET_REGION, 0x7800780);*/
+               /*Wr(LDIM_STTS_HIST_SET_REGION, 0x4380438);*/
+       } else if (resolution == 10) { /* 6x8 */
+               data32 = Rd(LDIM_STTS_HIST_REGION_IDX);
+               Wr(LDIM_STTS_HIST_REGION_IDX, 0xfff0ffff & data32);
+
+               Wr(LDIM_STTS_HIST_SET_REGION, 0x0010001);
+               Wr(LDIM_STTS_HIST_SET_REGION, 0x2430167);
+               Wr(LDIM_STTS_HIST_SET_REGION, 0x2220180);
+               Wr(LDIM_STTS_HIST_SET_REGION, 0x4000350);
+               Wr(LDIM_STTS_HIST_SET_REGION, 0x4000338);
+               Wr(LDIM_STTS_HIST_SET_REGION, 0x6000510);
+               Wr(LDIM_STTS_HIST_SET_REGION, 0x4370410);
+               Wr(LDIM_STTS_HIST_SET_REGION, 0x77f0700);
+               Wr(LDIM_STTS_HIST_SET_REGION, 0x4380438);
+               /*Wr(LDIM_STTS_HIST_SET_REGION, 0x7800780);*/
+               /*Wr(LDIM_STTS_HIST_SET_REGION, 0x4380438);*/
+       }
+}
+
+static void ldim_stts_set_region_tl1(
+               unsigned int resolution,
+                       /* 0: auto calc by height/width/row_start/col_start
+                        * 1: 720p
+                        * 2: 1080p
+                        */
+               unsigned int height, unsigned int width,
+               unsigned int blk_height, unsigned int blk_width,
+               unsigned int row_start, unsigned int col_start,
+               unsigned int blk_vnum, unsigned int blk_hnum)
+{
+       unsigned int data32, h_region_num;
+       unsigned int heightm1, widthm1;
+       unsigned int lights_mode = 0;
+       unsigned int hend[24], vend[16], i;
+
+       memset(hend, 0, (sizeof(unsigned int) * 24));
+       memset(vend, 0, (sizeof(unsigned int) * 16));
+
+       /* 0:normal   1:>24 h region */
+       if (blk_hnum > 24)
+               lights_mode = 1;
+       h_region_num = blk_hnum;
+       if (ldim_debug_print) {
+               pr_info("%s: lights_mode=%d, h_region_num=%d\n",
+                       __func__, lights_mode, h_region_num);
+       }
+
+       heightm1 = height - 1;
+       widthm1  = width - 1;
+
+       if (resolution == 0) {
+               hend[0] = col_start + blk_width - 1;
+               for (i = 1; i < 24; i++) {
+                       hend[i] = (hend[i-1] + blk_width >= widthm1) ?
+                               hend[i-1] : (hend[i-1] + blk_width);
+               }
+               vend[0] = row_start + blk_height - 1;
+               for (i = 1; i < 16; i++) {
+                       vend[i] = (vend[i-1] + blk_height >= heightm1) ?
+                               vend[i-1] : (vend[i-1] + blk_height);
+               }
+
+               if (lights_mode == 1) {  /* 31 h region */
+                       vend[8] = (hend[23] + blk_width >= widthm1) ?
+                               hend[23] : (hend[23] + blk_width);
+                       for (i = 9; i < 16; i++) {
+                               vend[i] = (vend[i-1] + blk_width >= widthm1) ?
+                                       vend[i-1] : (vend[i-1] + blk_width);
+                       }
+               }
+
+               Wr_reg_bits(LDIM_STTS_CTRL0, lights_mode, 22, 2);
+               data32 = Rd(LDIM_STTS_HIST_REGION_IDX);
+               Wr(LDIM_STTS_HIST_REGION_IDX, 0xffe0ffff & data32);
+               Wr(LDIM_STTS_HIST_SET_REGION,
+                       ((((row_start & 0x1fff) << 16) & 0xffff0000) |
+                       (col_start & 0x1fff)));
+               Wr(LDIM_STTS_HIST_SET_REGION, (((hend[1] & 0x1fff) << 16) |
+                       (hend[0] & 0x1fff)));
+               Wr(LDIM_STTS_HIST_SET_REGION, (((vend[1] & 0x1fff) << 16) |
+                       (vend[0] & 0x1fff)));
+               Wr(LDIM_STTS_HIST_SET_REGION, (((hend[3] & 0x1fff) << 16) |
+                       (hend[2] & 0x1fff)));
+               Wr(LDIM_STTS_HIST_SET_REGION, (((vend[3] & 0x1fff) << 16) |
+                       (vend[2] & 0x1fff)));
+               Wr(LDIM_STTS_HIST_SET_REGION, (((hend[5] & 0x1fff) << 16) |
+                       (hend[4] & 0x1fff)));
+               Wr(LDIM_STTS_HIST_SET_REGION, (((vend[5] & 0x1fff) << 16) |
+                       (vend[4] & 0x1fff)));
+               Wr(LDIM_STTS_HIST_SET_REGION, (((hend[7] & 0x1fff) << 16) |
+                       (hend[6] & 0x1fff)));
+               Wr(LDIM_STTS_HIST_SET_REGION, (((vend[7] & 0x1fff) << 16) |
+                       (vend[6] & 0x1fff)));
+               Wr(LDIM_STTS_HIST_SET_REGION, (((hend[9] & 0x1fff) << 16) |
+                       (hend[8] & 0x1fff)));
+               Wr(LDIM_STTS_HIST_SET_REGION, (((vend[9] & 0x1fff) << 16) |
+                       (vend[8] & 0x1fff)));
+               Wr(LDIM_STTS_HIST_SET_REGION, (((hend[11] & 0x1fff) << 16) |
+                       (hend[10] & 0x1fff)));
+               Wr(LDIM_STTS_HIST_SET_REGION, (((vend[11] & 0x1fff) << 16) |
+                       (vend[10] & 0x1fff)));
+               Wr(LDIM_STTS_HIST_SET_REGION, (((hend[13] & 0x1fff) << 16) |
+                       (hend[12] & 0x1fff)));
+               Wr(LDIM_STTS_HIST_SET_REGION, (((vend[13] & 0x1fff) << 16) |
+                       (vend[12] & 0x1fff)));
+               Wr(LDIM_STTS_HIST_SET_REGION, (((hend[15] & 0x1fff) << 16) |
+                       (hend[14] & 0x1fff)));
+               Wr(LDIM_STTS_HIST_SET_REGION, (((vend[15] & 0x1fff) << 16) |
+                       (vend[14] & 0x1fff)));
+               Wr(LDIM_STTS_HIST_SET_REGION, (((hend[17] & 0x1fff) << 16) |
+                       (hend[16] & 0x1fff)));
+               Wr(LDIM_STTS_HIST_SET_REGION, (((hend[19] & 0x1fff) << 16) |
+                       (hend[18] & 0x1fff)));
+               Wr(LDIM_STTS_HIST_SET_REGION, (((hend[21] & 0x1fff) << 16) |
+                       (hend[20] & 0x1fff)));
+               Wr(LDIM_STTS_HIST_SET_REGION, (((hend[23] & 0x1fff) << 16) |
+                       (hend[22] & 0x1fff)));
+               Wr(LDIM_STTS_HIST_SET_REGION, h_region_num); /*h region number*/
+               Wr(LDIM_STTS_HIST_SET_REGION, 0); /* line_n_int_num */
+       } else if (resolution == 1) {
+               data32 = Rd(LDIM_STTS_HIST_REGION_IDX);
+               Wr(LDIM_STTS_HIST_REGION_IDX, 0xfff0ffff & data32);
+
+               Wr(LDIM_STTS_HIST_SET_REGION, 0x0010010);
+               Wr(LDIM_STTS_HIST_SET_REGION, 0x1000080);
+               Wr(LDIM_STTS_HIST_SET_REGION, 0x0800040);
+               Wr(LDIM_STTS_HIST_SET_REGION, 0x2000180);
+               Wr(LDIM_STTS_HIST_SET_REGION, 0x10000c0);
+               Wr(LDIM_STTS_HIST_SET_REGION, 0x3000280);
+               Wr(LDIM_STTS_HIST_SET_REGION, 0x1800140);
+               Wr(LDIM_STTS_HIST_SET_REGION, 0x4000380);
+               Wr(LDIM_STTS_HIST_SET_REGION, 0x20001c0);
+               /*    Wr(LDIM_STTS_HIST_SET_REGION, 0x4ff0480); */
+               /*    Wr(LDIM_STTS_HIST_SET_REGION, 0x2cf0260); */
+       } else if (resolution == 2) {
+               data32 = Rd(LDIM_STTS_HIST_REGION_IDX);
+               Wr(LDIM_STTS_HIST_REGION_IDX, 0xfff0ffff & data32);
+
+               Wr(LDIM_STTS_HIST_SET_REGION, 0x0000000);/* hv00 */
+               Wr(LDIM_STTS_HIST_SET_REGION, 0x17f00bf);/* h01 */
+               Wr(LDIM_STTS_HIST_SET_REGION, 0x0d7006b);/* v01 */
+               Wr(LDIM_STTS_HIST_SET_REGION, 0x2ff023f);/* h23 */
+               Wr(LDIM_STTS_HIST_SET_REGION, 0x1af0143);/* v23 */
+               Wr(LDIM_STTS_HIST_SET_REGION, 0x47f03bf);/* h45 */
+               Wr(LDIM_STTS_HIST_SET_REGION, 0x287021b);/* v45 */
+               Wr(LDIM_STTS_HIST_SET_REGION, 0x5ff053f);/* h67 */
+               Wr(LDIM_STTS_HIST_SET_REGION, 0x35f02f3);/* v67 */
+               Wr(LDIM_STTS_HIST_SET_REGION, 0xffe0ffe);/* h89 */
+               Wr(LDIM_STTS_HIST_SET_REGION, 0xffe0ffe);/* v89 */
+               Wr(LDIM_STTS_HIST_SET_REGION, 0xffe0ffe);/* h1011 */
+               Wr(LDIM_STTS_HIST_SET_REGION, 0xffe0ffe);/* v1011 */
+               Wr(LDIM_STTS_HIST_SET_REGION, 0xffe0ffe);/* h1213 */
+               Wr(LDIM_STTS_HIST_SET_REGION, 0xffe0ffe);/* v1213 */
+               Wr(LDIM_STTS_HIST_SET_REGION, 0xffe0ffe);/* h1415 */
+               Wr(LDIM_STTS_HIST_SET_REGION, 0xffe0ffe);/* v1415 */
+               Wr(LDIM_STTS_HIST_SET_REGION, 0xffe0ffe);/* h1617 */
+               Wr(LDIM_STTS_HIST_SET_REGION, 0xffe0ffe);/* h1819 */
+               Wr(LDIM_STTS_HIST_SET_REGION, 0xffe0ffe);/* h2021 */
+               Wr(LDIM_STTS_HIST_SET_REGION, 0xffe0ffe);/* h2223 */
+       } else if (resolution == 3) {
+               data32 = Rd(LDIM_STTS_HIST_REGION_IDX);
+               Wr(LDIM_STTS_HIST_REGION_IDX, 0xfff0ffff & data32);
+
+               Wr(LDIM_STTS_HIST_SET_REGION, 0x0000000);
+               Wr(LDIM_STTS_HIST_SET_REGION, 0x1df00ef);
+               Wr(LDIM_STTS_HIST_SET_REGION, 0x10d0086);
+               Wr(LDIM_STTS_HIST_SET_REGION, 0x3bf02cf);
+               Wr(LDIM_STTS_HIST_SET_REGION, 0x21b0194);
+               Wr(LDIM_STTS_HIST_SET_REGION, 0x59f04af);
+               Wr(LDIM_STTS_HIST_SET_REGION, 0x32902a2);
+               Wr(LDIM_STTS_HIST_SET_REGION, 0x77f068f);
+               Wr(LDIM_STTS_HIST_SET_REGION, 0x43703b0);
+               /*    Wr(LDIM_STTS_HIST_SET_REGION, 0x7800780); */
+               /*    Wr(LDIM_STTS_HIST_SET_REGION, 0x4380438); */
+       } else if (resolution == 4) { /* 5x6 */
+               data32 = Rd(LDIM_STTS_HIST_REGION_IDX);
+               Wr(LDIM_STTS_HIST_REGION_IDX, 0xfff0ffff & data32);
+
+               Wr(LDIM_STTS_HIST_SET_REGION, 0x0040001);
+               Wr(LDIM_STTS_HIST_SET_REGION, 0x27f0136);
+               Wr(LDIM_STTS_HIST_SET_REGION, 0x1af00d7);
+               Wr(LDIM_STTS_HIST_SET_REGION, 0x4ff03bf);
+               Wr(LDIM_STTS_HIST_SET_REGION, 0x35f0287);
+               Wr(LDIM_STTS_HIST_SET_REGION, 0x77f063f);
+               Wr(LDIM_STTS_HIST_SET_REGION, 0x4380437);
+               Wr(LDIM_STTS_HIST_SET_REGION, 0x7800780);
+               Wr(LDIM_STTS_HIST_SET_REGION, 0x4380438);
+               /*    Wr(LDIM_STTS_HIST_SET_REGION, 0x7800780); */
+               /*    Wr(LDIM_STTS_HIST_SET_REGION, 0x4380438); */
+       } else if (resolution == 5) { /* 8x2 */
+               data32 = Rd(LDIM_STTS_HIST_REGION_IDX);
+               Wr(LDIM_STTS_HIST_REGION_IDX, 0xfff0ffff & data32);
+
+               Wr(LDIM_STTS_HIST_SET_REGION, 0x0030002);
+               Wr(LDIM_STTS_HIST_SET_REGION, 0x31f02bb);
+               Wr(LDIM_STTS_HIST_SET_REGION, 0x0940031);
+               Wr(LDIM_STTS_HIST_SET_REGION, 0x7800780);
+               Wr(LDIM_STTS_HIST_SET_REGION, 0x233012b);
+               Wr(LDIM_STTS_HIST_SET_REGION, 0x7800780);
+               Wr(LDIM_STTS_HIST_SET_REGION, 0x30b0243);
+               Wr(LDIM_STTS_HIST_SET_REGION, 0x7800780);
+               Wr(LDIM_STTS_HIST_SET_REGION, 0x42d03d3);
+               /*    Wr(LDIM_STTS_HIST_SET_REGION, 0x7800780); */
+               /*    Wr(LDIM_STTS_HIST_SET_REGION, 0x4380438); */
+       } else if (resolution == 6) { /* 2x1 */
+               data32 = Rd(LDIM_STTS_HIST_REGION_IDX);
+               Wr(LDIM_STTS_HIST_REGION_IDX, 0xfff0ffff & data32);
+
+               Wr(LDIM_STTS_HIST_SET_REGION, 0x0030002);
+               Wr(LDIM_STTS_HIST_SET_REGION, 0x78002bb);
+               Wr(LDIM_STTS_HIST_SET_REGION, 0x0940031);
+               Wr(LDIM_STTS_HIST_SET_REGION, 0x7800780);
+               Wr(LDIM_STTS_HIST_SET_REGION, 0x4380438);
+               Wr(LDIM_STTS_HIST_SET_REGION, 0x7800780);
+               Wr(LDIM_STTS_HIST_SET_REGION, 0x4380438);
+               Wr(LDIM_STTS_HIST_SET_REGION, 0x7800780);
+               Wr(LDIM_STTS_HIST_SET_REGION, 0x4380438);
+               /*    Wr(LDIM_STTS_HIST_SET_REGION, 0x7800780); */
+               /*    Wr(LDIM_STTS_HIST_SET_REGION, 0x4380438); */
+       } else if (resolution == 7) { /* 2x2 */
+               data32 = Rd(LDIM_STTS_HIST_REGION_IDX);
+               Wr(LDIM_STTS_HIST_REGION_IDX, 0xfff0ffff & data32);
+
+               Wr(LDIM_STTS_HIST_SET_REGION, 0x0000000);
+               Wr(LDIM_STTS_HIST_SET_REGION, 0x77f03bf);
+               Wr(LDIM_STTS_HIST_SET_REGION, 0x437021b);
+               Wr(LDIM_STTS_HIST_SET_REGION, 0x7800780);
+               Wr(LDIM_STTS_HIST_SET_REGION, 0x4380438);
+               Wr(LDIM_STTS_HIST_SET_REGION, 0x7800780);
+               Wr(LDIM_STTS_HIST_SET_REGION, 0x4380438);
+               Wr(LDIM_STTS_HIST_SET_REGION, 0x7800780);
+               Wr(LDIM_STTS_HIST_SET_REGION, 0x4380438);
+               /*    Wr(LDIM_STTS_HIST_SET_REGION, 0x7800780); */
+               /*    Wr(LDIM_STTS_HIST_SET_REGION, 0x4380438); */
+       } else if (resolution == 8) { /* 3x5 */
+               data32 = Rd(LDIM_STTS_HIST_REGION_IDX);
+               Wr(LDIM_STTS_HIST_REGION_IDX, 0xfff0ffff & data32);
+
+               Wr(LDIM_STTS_HIST_SET_REGION, 0x0000000);
+               Wr(LDIM_STTS_HIST_SET_REGION, 0x2ff017f);
+               Wr(LDIM_STTS_HIST_SET_REGION, 0x2cf0167);
+               Wr(LDIM_STTS_HIST_SET_REGION, 0x5ff047f);
+               Wr(LDIM_STTS_HIST_SET_REGION, 0x4380437);
+               Wr(LDIM_STTS_HIST_SET_REGION, 0x780077f);
+               Wr(LDIM_STTS_HIST_SET_REGION, 0x4380438);
+               Wr(LDIM_STTS_HIST_SET_REGION, 0x7800780);
+               Wr(LDIM_STTS_HIST_SET_REGION, 0x4380438);
+               /*    Wr(LDIM_STTS_HIST_SET_REGION, 0x7800780); */
+               /*    Wr(LDIM_STTS_HIST_SET_REGION, 0x4380438); */
+       } else if (resolution == 9) { /* 4x3 */
+               data32 = Rd(LDIM_STTS_HIST_REGION_IDX);
+               Wr(LDIM_STTS_HIST_REGION_IDX, 0xfff0ffff & data32);
+
+               Wr(LDIM_STTS_HIST_SET_REGION, 0x0010001);
+               Wr(LDIM_STTS_HIST_SET_REGION, 0x4560333);
+               Wr(LDIM_STTS_HIST_SET_REGION, 0x2220180);
+               Wr(LDIM_STTS_HIST_SET_REGION, 0x7800666);
+               Wr(LDIM_STTS_HIST_SET_REGION, 0x4000338);
+               Wr(LDIM_STTS_HIST_SET_REGION, 0x7800780);
+               Wr(LDIM_STTS_HIST_SET_REGION, 0x4380438);
+               Wr(LDIM_STTS_HIST_SET_REGION, 0x7800780);
+               Wr(LDIM_STTS_HIST_SET_REGION, 0x4380438);
+               /*    Wr(LDIM_STTS_HIST_SET_REGION, 0x7800780); */
+               /*    Wr(LDIM_STTS_HIST_SET_REGION, 0x4380438); */
+       } else if (resolution == 10) { /* 6x8 */
+               data32 = Rd(LDIM_STTS_HIST_REGION_IDX);
+               Wr(LDIM_STTS_HIST_REGION_IDX, 0xfff0ffff & data32);
+
+               Wr(LDIM_STTS_HIST_SET_REGION, 0x0010001);
+               Wr(LDIM_STTS_HIST_SET_REGION, 0x2430167);
+               Wr(LDIM_STTS_HIST_SET_REGION, 0x2220180);
+               Wr(LDIM_STTS_HIST_SET_REGION, 0x4000350);
+               Wr(LDIM_STTS_HIST_SET_REGION, 0x4000338);
+               Wr(LDIM_STTS_HIST_SET_REGION, 0x6000510);
+               Wr(LDIM_STTS_HIST_SET_REGION, 0x4370410);
+               Wr(LDIM_STTS_HIST_SET_REGION, 0x77f0700);
+               Wr(LDIM_STTS_HIST_SET_REGION, 0x4380438);
+               /*    Wr(LDIM_STTS_HIST_SET_REGION, 0x7800780); */
+               /*    Wr(LDIM_STTS_HIST_SET_REGION, 0x4380438); */
+       }
+}
+
+void ldim_stts_initial_txlx(unsigned int pic_h, unsigned int pic_v,
+               unsigned int blk_vnum, unsigned int blk_hnum)
+{
+       unsigned int resolution, blk_height, blk_width;
+       unsigned int row_start, col_start;
+
+       blk_vnum = (blk_vnum == 0) ? 1 : blk_vnum;
+       blk_hnum = (blk_hnum == 0) ? 1 : blk_hnum;
+
+       resolution = (((pic_h - 1) & 0xffff) << 16) | ((pic_v - 1) & 0xffff);
+       /*Wr_reg(VDIN0_HIST_CTRL, 0x10d);*/
+
+       blk_height = (pic_v - 8) / blk_vnum;
+       blk_width = (pic_h - 8) / blk_hnum;
+       row_start = (pic_v - (blk_height * blk_vnum)) >> 1;
+       col_start = (pic_h - (blk_width * blk_hnum)) >> 1;
+
+       Wr_reg(LDIM_STTS_CTRL0, 7 << 2);
+       ldim_set_matrix_ycbcr2rgb();
+       ldim_stts_en(resolution, 0, 0, 1, 1, 1, 0);
+
+       ldim_stts_set_region_txlx(0, blk_height, blk_width,
+               row_start, col_start, blk_hnum);
+}
+
+void ldim_stts_initial_tl1(unsigned int pic_h, unsigned int pic_v,
+               unsigned int blk_vnum, unsigned int blk_hnum)
+{
+       unsigned int resolution, blk_height, blk_width;
+       unsigned int row_start, col_start;
+
+       blk_vnum = (blk_vnum == 0) ? 1 : blk_vnum;
+       blk_hnum = (blk_hnum == 0) ? 1 : blk_hnum;
+
+       resolution = (((pic_h - 1) & 0xffff) << 16) | ((pic_v - 1) & 0xffff);
+       /*Wr_reg(VDIN0_HIST_CTRL, 0x10d);*/
+
+       blk_height = (pic_v - 8) / blk_vnum;
+       blk_width = (pic_h - 8) / blk_hnum;
+       row_start = (pic_v - (blk_height * blk_vnum)) >> 1;
+       col_start = (pic_h - (blk_width * blk_hnum)) >> 1;
+
+       ldim_stts_en(resolution, 0, 0, 1, 1, 1, 0);
+       ldim_set_matrix_ycbcr2rgb();
+       /*0:di  1:vdin  2:null  3:postblend  4:vpp out  5:vd1  6:vd2  7:osd1*/
+       Wr_reg_bits(LDIM_STTS_CTRL0, 3, 3, 3);
+
+       ldim_stts_set_region_tl1(0, pic_v, pic_h, blk_height, blk_width,
+               row_start, col_start, blk_vnum, blk_hnum);
+}
+
+static unsigned int invalid_val_cnt;
+void ldim_stts_read_region(unsigned int nrow, unsigned int ncol)
+{
+       unsigned int i, j, k;
+       unsigned int data32;
+       struct aml_ldim_driver_s *ldim_drv = aml_ldim_get_driver();
+
+       if (invalid_val_cnt > 0xfffffff)
+               invalid_val_cnt = 0;
+
+       Wr(LDIM_STTS_HIST_REGION_IDX, Rd(LDIM_STTS_HIST_REGION_IDX)
+               & 0xffffc000);
+       data32 = Rd(LDIM_STTS_HIST_START_RD_REGION);
+
+       for (i = 0; i < nrow; i++) {
+               for (j = 0; j < ncol; j++) {
+                       data32 = Rd(LDIM_STTS_HIST_START_RD_REGION);
+                       for (k = 0; k < 17; k++) {
+                               if (k == 16) {
+                                       data32 = Rd(LDIM_STTS_HIST_READ_REGION);
+                                       ldim_drv->max_rgb[i * ncol + j]
+                                               = data32;
+                               } else {
+                                       data32 = Rd(LDIM_STTS_HIST_READ_REGION);
+                                       ldim_drv->hist_matrix[i * ncol * 16 +
+                                               j * 16 + k] = data32;
+                               }
+                               if (!(data32 & 0x40000000))
+                                       invalid_val_cnt++;
+                       }
+               }
+       }
+}
+
+/* VDIN_MATRIX_YUV601_RGB */
+/* -16    1.164  0      1.596      0 */
+/* -128     1.164 -0.391 -0.813      0 */
+/* -128     1.164  2.018  0         0 */
+/*{0x07c00600, 0x00000600, 0x04a80000, 0x066204a8, 0x1e701cbf, 0x04a80812,
+ *     0x00000000, 0x00000000, 0x00000000,},
+ */
+void ldim_set_matrix_ycbcr2rgb(void)
+{
+       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);
+       Wr(LDIM_STTS_MATRIX_COEF00_01, 0x04a80000);
+       Wr(LDIM_STTS_MATRIX_COEF02_10, 0x066204a8);
+       Wr(LDIM_STTS_MATRIX_COEF11_12, 0x1e701cbf);
+       Wr(LDIM_STTS_MATRIX_COEF20_21, 0x04a80812);
+       Wr(LDIM_STTS_MATRIX_COEF22, 0x00000000);
+       Wr(LDIM_STTS_MATRIX_OFFSET0_1, 0x00000000);
+       Wr(LDIM_STTS_MATRIX_OFFSET2, 0x00000000);
+}
+
+void ldim_set_matrix_rgb2ycbcr(int mode)
+{
+       Wr_reg_bits(LDIM_STTS_CTRL0, 1, 2, 1);
+       if (mode == 0) {/*ycbcr not full range, 601 conversion*/
+               Wr(LDIM_STTS_MATRIX_PRE_OFFSET0_1, 0x0);
+               Wr(LDIM_STTS_MATRIX_PRE_OFFSET2, 0x0);
+               /*      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_COEF22, 0x1fb7);
+
+               Wr(LDIM_STTS_MATRIX_OFFSET2, 0x0200);
+       } else if (mode == 1) {/*ycbcr full range, 601 conversion*/
+               /* todo */
+       }
+}
+
+void ldim_remap_update_txlx(struct LDReg_s *nPRM,
+               unsigned int avg_update_en, unsigned int matrix_update_en)
+{
+       unsigned int data;
+
+       if (avg_update_en) {
+               /* LD_BKLIT_PARAM */
+               data = LDIM_RD_32Bits(REG_LD_BKLIT_PARAM);
+               data = (data & (~0xfff)) | (nPRM->reg_BL_matrix_AVG & 0xfff);
+               LDIM_WR_32Bits(REG_LD_BKLIT_PARAM, data);
+
+               /* compensate */
+               data = LDIM_RD_32Bits(REG_LD_LIT_GAIN_COMP);
+               data = (data & (~0xfff)) |
+                       (nPRM->reg_BL_matrix_Compensate & 0xfff);
+               LDIM_WR_32Bits(REG_LD_LIT_GAIN_COMP, data);
+       }
+
+       if (matrix_update_en) {
+               data = nPRM->reg_LD_BLK_Vnum * nPRM->reg_LD_BLK_Hnum;
+               LDIM_Update_Matrix(nPRM->BL_matrix, data);
+       }
+}
index 6fe28b4..297dafa 100644 (file)
@@ -23,8 +23,8 @@
 #define ASSIST_SPARE8_REG1                     0x1f58
 
 /*gxtvbb new add*/
-#define LDIM_STTS_CTRL0                                0x1ac1
 #define LDIM_STTS_GCLK_CTRL0                   0x1ac0
+#define LDIM_STTS_CTRL0                                0x1ac1
 #define LDIM_STTS_WIDTHM1_HEIGHTM1             0x1ac2
 #define LDIM_STTS_MATRIX_COEF00_01             0x1ac3
 #define LDIM_STTS_MATRIX_COEF02_10             0x1ac4