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>
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 / */
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 / */
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 / */
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 / */
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;
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 */
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");
bl_pwm->pwm_data.port_index, bl_pwm->pwm_data.pwm);
}
- BLPR("%s ok\n", __func__);
-
return ret;
}
#
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
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");
bl_pwm->pwm_data.port_index, bl_pwm->pwm_data.pwm);
}
- LDIMPR("%s ok\n", __func__);
-
return ret;
}
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;
}
{
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;
}
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,
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)
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);*/
}
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++) {
{
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,
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;
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")) {
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"
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,
};
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;
}
/* 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;
}
}
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;
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) {
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;
/*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;
/*========================================*/
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
#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,
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;
--- /dev/null
+/*
+ * 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);
+ }
+}
#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