mirror of
https://github.com/hardkernel/linux.git
synced 2026-06-08 03:40:35 +09:00
backlight: add support for tl1 [1/1]
PD#172587 Problem: do not suppoert for tl1 Solution: add backlight support for fl1 Verify: verified on PTM Change-Id: I052a7ef93ec9cb21a544e4823a4c9a339d38b5f9 Signed-off-by: Evoke Zhang <evoke.zhang@amlogic.com>
This commit is contained in:
@@ -3183,12 +3183,6 @@ static int aml_bl_resume(struct platform_device *pdev)
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_OF
|
||||
static struct bl_data_s bl_data_gxtvbb = {
|
||||
.chip_type = BL_CHIP_GXTVBB,
|
||||
.chip_name = "gxtvbb",
|
||||
.pwm_reg = pwm_reg_txl,
|
||||
};
|
||||
|
||||
static struct bl_data_s bl_data_gxl = {
|
||||
.chip_type = BL_CHIP_GXL,
|
||||
.chip_name = "gxl",
|
||||
@@ -3231,11 +3225,13 @@ static struct bl_data_s bl_data_g12b = {
|
||||
.pwm_reg = pwm_reg_txlx,
|
||||
};
|
||||
|
||||
static struct bl_data_s bl_data_tl1 = {
|
||||
.chip_type = BL_CHIP_TL1,
|
||||
.chip_name = "tl1",
|
||||
.pwm_reg = pwm_reg_txlx,
|
||||
};
|
||||
|
||||
static const struct of_device_id bl_dt_match_table[] = {
|
||||
{
|
||||
.compatible = "amlogic, backlight-gxtvbb",
|
||||
.data = &bl_data_gxtvbb,
|
||||
},
|
||||
{
|
||||
.compatible = "amlogic, backlight-gxl",
|
||||
.data = &bl_data_gxl,
|
||||
@@ -3264,6 +3260,10 @@ static const struct of_device_id bl_dt_match_table[] = {
|
||||
.compatible = "amlogic, backlight-g12b",
|
||||
.data = &bl_data_g12b,
|
||||
},
|
||||
{
|
||||
.compatible = "amlogic, backlight-tl1",
|
||||
.data = &bl_data_tl1,
|
||||
},
|
||||
{},
|
||||
};
|
||||
#endif
|
||||
|
||||
@@ -59,6 +59,9 @@ const char ldim_dev_id[] = "ldim-dev";
|
||||
unsigned char ldim_debug_print;
|
||||
|
||||
struct ldim_dev_s {
|
||||
struct aml_ldim_func_s *ldim_func;
|
||||
struct ldim_param_s *ldim_db_para;
|
||||
|
||||
struct cdev cdev;
|
||||
struct device *dev;
|
||||
dev_t aml_ldim_devno;
|
||||
@@ -66,7 +69,6 @@ struct ldim_dev_s {
|
||||
struct cdev *aml_ldim_cdevp;
|
||||
};
|
||||
static struct ldim_dev_s ldim_dev;
|
||||
static struct ldim_param_s *ldim_db_para;
|
||||
static struct LDReg_s nPRM;
|
||||
static struct FW_DAT_s FDat;
|
||||
static struct ldim_fw_para_s ldim_fw_para;
|
||||
@@ -96,7 +98,6 @@ static struct work_struct ldim_on_vs_work;
|
||||
static struct work_struct ldim_off_vs_work;
|
||||
|
||||
static unsigned int ldim_irq_cnt;
|
||||
static unsigned int rdma_ldim_irq_cnt;
|
||||
|
||||
/*BL_matrix remap curve*/
|
||||
static unsigned int bl_remap_curve[16] = {
|
||||
@@ -128,9 +129,6 @@ static unsigned int ldim_top_en;
|
||||
module_param(ldim_top_en, uint, 0664);
|
||||
MODULE_PARM_DESC(ldim_top_en, "ldim_top_en");
|
||||
|
||||
static void ldim_on_vs_brightness(void);
|
||||
static void ldim_off_vs_brightness(void);
|
||||
static void ldim_on_vs_arithmetic(void);
|
||||
static void ldim_dump_histgram(void);
|
||||
static void ldim_get_matrix_info_max_rgb(void);
|
||||
|
||||
@@ -144,18 +142,6 @@ static struct ldim_config_s ldim_config = {
|
||||
.hvcnt_bypass = 0,
|
||||
};
|
||||
|
||||
static void ldim_on_update_brightness(struct work_struct *work)
|
||||
{
|
||||
ldim_stts_read_region(ldim_hist_row, ldim_hist_col);
|
||||
ldim_on_vs_arithmetic();
|
||||
ldim_on_vs_brightness();
|
||||
}
|
||||
|
||||
static void ldim_off_update_brightness(struct work_struct *work)
|
||||
{
|
||||
ldim_off_vs_brightness();
|
||||
}
|
||||
|
||||
static void ldim_db_para_print(struct LDReg_s *mLDReg)
|
||||
{
|
||||
int i, len;
|
||||
@@ -276,58 +262,64 @@ static void ldim_db_para_print(struct LDReg_s *mLDReg)
|
||||
}
|
||||
|
||||
static void ldim_db_load_update(struct LDReg_s *mLDReg,
|
||||
struct ldim_param_s *db_pare)
|
||||
struct ldim_param_s *db_para)
|
||||
{
|
||||
int i;
|
||||
|
||||
if (db_pare == NULL)
|
||||
if (db_para == NULL)
|
||||
return;
|
||||
|
||||
LDIMPR("ldim_db_load_update\n");
|
||||
/* beam model */
|
||||
ldim_fw_para.rgb_base = db_pare->rgb_base;
|
||||
ldim_fw_para.boost_gain = db_pare->boost_gain;
|
||||
ldim_fw_para.lpf_res = db_pare->lpf_res;
|
||||
ldim_fw_para.fw_LD_ThSF_l = db_pare->fw_ld_th_sf;
|
||||
ldim_fw_para.rgb_base = db_para->rgb_base;
|
||||
ldim_fw_para.boost_gain = db_para->boost_gain;
|
||||
ldim_fw_para.lpf_res = db_para->lpf_res;
|
||||
ldim_fw_para.fw_LD_ThSF_l = db_para->fw_ld_th_sf;
|
||||
|
||||
/* beam curve */
|
||||
mLDReg->reg_LD_Vgain = db_pare->ld_vgain;
|
||||
mLDReg->reg_LD_Hgain = db_pare->ld_hgain;
|
||||
mLDReg->reg_LD_Litgain = db_pare->ld_litgain;
|
||||
mLDReg->reg_LD_Vgain = db_para->ld_vgain;
|
||||
mLDReg->reg_LD_Hgain = db_para->ld_hgain;
|
||||
mLDReg->reg_LD_Litgain = db_para->ld_litgain;
|
||||
|
||||
mLDReg->reg_LD_LUT_Vdg_LEXT = db_pare->ld_lut_vdg_lext;
|
||||
mLDReg->reg_LD_LUT_Hdg_LEXT = db_pare->ld_lut_hdg_lext;
|
||||
mLDReg->reg_LD_LUT_VHk_LEXT = db_pare->ld_lut_vhk_lext;
|
||||
mLDReg->reg_LD_LUT_Vdg_LEXT = db_para->ld_lut_vdg_lext;
|
||||
mLDReg->reg_LD_LUT_Hdg_LEXT = db_para->ld_lut_hdg_lext;
|
||||
mLDReg->reg_LD_LUT_VHk_LEXT = db_para->ld_lut_vhk_lext;
|
||||
|
||||
for (i = 0; i < 32; i++) {
|
||||
mLDReg->reg_LD_LUT_Hdg[i] = db_pare->ld_lut_hdg[i];
|
||||
mLDReg->reg_LD_LUT_Vdg[i] = db_pare->ld_lut_vdg[i];
|
||||
mLDReg->reg_LD_LUT_VHk[i] = db_pare->ld_lut_vhk[i];
|
||||
mLDReg->reg_LD_LUT_Hdg[i] = db_para->ld_lut_hdg[i];
|
||||
mLDReg->reg_LD_LUT_Vdg[i] = db_para->ld_lut_vdg[i];
|
||||
mLDReg->reg_LD_LUT_VHk[i] = db_para->ld_lut_vhk[i];
|
||||
}
|
||||
|
||||
/* beam shape minor adjustment */
|
||||
for (i = 0; i < 32; i++) {
|
||||
mLDReg->reg_LD_LUT_VHk_pos[i] = db_pare->ld_lut_vhk_pos[i];
|
||||
mLDReg->reg_LD_LUT_VHk_neg[i] = db_pare->ld_lut_vhk_neg[i];
|
||||
mLDReg->reg_LD_LUT_HHk[i] = db_pare->ld_lut_hhk[i];
|
||||
mLDReg->reg_LD_LUT_VHo_pos[i] = db_pare->ld_lut_vho_pos[i];
|
||||
mLDReg->reg_LD_LUT_VHo_neg[i] = db_pare->ld_lut_vho_neg[i];
|
||||
mLDReg->reg_LD_LUT_VHk_pos[i] = db_para->ld_lut_vhk_pos[i];
|
||||
mLDReg->reg_LD_LUT_VHk_neg[i] = db_para->ld_lut_vhk_neg[i];
|
||||
mLDReg->reg_LD_LUT_HHk[i] = db_para->ld_lut_hhk[i];
|
||||
mLDReg->reg_LD_LUT_VHo_pos[i] = db_para->ld_lut_vho_pos[i];
|
||||
mLDReg->reg_LD_LUT_VHo_neg[i] = db_para->ld_lut_vho_neg[i];
|
||||
}
|
||||
|
||||
/* remapping */
|
||||
/*db_pare->lit_idx_th;*/
|
||||
/*db_pare->comp_gain;*/
|
||||
/*db_para->lit_idx_th;*/
|
||||
/*db_para->comp_gain;*/
|
||||
|
||||
if (db_print_flag == 1)
|
||||
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;
|
||||
struct aml_bl_drv_s *bl_drv = aml_bl_get_driver();
|
||||
|
||||
BLK_Vnum = (BLK_Vnum == 0) ? 1 : BLK_Vnum;
|
||||
BLK_Hnum = (BLK_Hnum == 0) ? 1 : BLK_Hnum;
|
||||
@@ -339,21 +331,12 @@ static void ldim_stts_initial(unsigned int pic_h, unsigned int pic_v,
|
||||
resolution = (((pic_h - 1) & 0xffff) << 16) | ((pic_v - 1) & 0xffff);
|
||||
/*Wr_reg(VDIN0_HIST_CTRL, 0x10d);*/
|
||||
|
||||
switch (bl_drv->data->chip_type) {
|
||||
case BL_CHIP_TXLX:
|
||||
Wr_reg(LDIM_STTS_CTRL0, 7 << 2);
|
||||
ldim_set_matrix_ycbcr2rgb();
|
||||
ldim_stts_en(resolution, 0, 0, 1, 1, 1, 0);
|
||||
break;
|
||||
case BL_CHIP_GXTVBB:
|
||||
Wr_reg(LDIM_STTS_CTRL0, 3 << 3);/*4 mux to vpp_dout*/
|
||||
ldim_set_matrix_ycbcr2rgb();
|
||||
/*ldim_set_matrix_rgb2ycbcr(0);*/
|
||||
ldim_stts_en(resolution, 0, 0, 1, 1, 1, 0);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
if (ldim_dev.ldim_func == NULL) {
|
||||
LDIMERR("%s: invalid ldim_func\n", __func__);
|
||||
return;
|
||||
}
|
||||
if (ldim_dev.ldim_func->stts_init)
|
||||
ldim_dev.ldim_func->stts_init(resolution);
|
||||
|
||||
resolution_region = 0;
|
||||
|
||||
@@ -365,155 +348,6 @@ static void ldim_stts_initial(unsigned int pic_h, unsigned int pic_v,
|
||||
row_start, col_start, BLK_Hnum);
|
||||
}
|
||||
|
||||
static void LDIM_Initial_GXTVBB(unsigned int ldim_bl_en,
|
||||
unsigned int ldim_hvcnt_bypass)
|
||||
{
|
||||
unsigned int i, j, k;
|
||||
unsigned int data;
|
||||
unsigned int *arrayTmp;
|
||||
|
||||
arrayTmp = kcalloc(1536, sizeof(unsigned int), GFP_KERNEL);
|
||||
if (arrayTmp == NULL) {
|
||||
LDIMERR("%s malloc error\n", __func__);
|
||||
return;
|
||||
}
|
||||
|
||||
data = LDIM_RD_32Bits(REG_LD_MISC_CTRL0);
|
||||
data = data & (~(3<<4));
|
||||
LDIM_WR_32Bits(REG_LD_MISC_CTRL0, data);
|
||||
/*change here: gBLK_Hidx_LUT: s14*19 */
|
||||
LDIM_WR_BASE_LUT(REG_LD_BLK_HIDX_BASE,
|
||||
nPRM.reg_LD_BLK_Hidx, 16, LD_BLK_LEN_H);
|
||||
/* change here: gBLK_Vidx_LUT: s14*19 */
|
||||
LDIM_WR_BASE_LUT(REG_LD_BLK_VIDX_BASE,
|
||||
nPRM.reg_LD_BLK_Vidx, 16, LD_BLK_LEN_V);
|
||||
/* change here: gHDG_LUT: u10*32 */
|
||||
LDIM_WR_BASE_LUT(REG_LD_LUT_HDG_BASE,
|
||||
nPRM.reg_LD_LUT_Hdg, 16, LD_LUT_LEN);
|
||||
/* change here: gVDG_LUT: u10*32 */
|
||||
LDIM_WR_BASE_LUT(REG_LD_LUT_VDG_BASE,
|
||||
nPRM.reg_LD_LUT_Vdg, 16, LD_LUT_LEN);
|
||||
/* change here: gVHk_LUT: u10*32 */
|
||||
LDIM_WR_BASE_LUT(REG_LD_LUT_VHK_BASE,
|
||||
nPRM.reg_LD_LUT_VHk, 16, LD_LUT_LEN);
|
||||
/* 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, 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, arrayTmp, 8, 64);
|
||||
/* reg_LD_LUT_HHk[32]:u8 */
|
||||
LDIM_WR_BASE_LUT(REG_LD_LUT_HHK_BASE, nPRM.reg_LD_LUT_HHk, 8, 32);
|
||||
/*gLD_REFLECT_DGR_LUT: u6 * (20+20+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, arrayTmp, 8, 44);
|
||||
/* X_lut: 12 * 3*16*32 */
|
||||
for (i = 0; i < 3; i++)
|
||||
for (j = 0; j < 16; j++)
|
||||
for (k = 0; k < 32; k++)
|
||||
arrayTmp[16*32*i+32*j+k] = nPRM.X_lut[i][j][k];
|
||||
LDIM_WR_BASE_LUT(REG_LD_RGB_LUT_BASE, arrayTmp, 16, 32*16*3);
|
||||
/* X_nrm: 4 * 16 */
|
||||
LDIM_WR_BASE_LUT(REG_LD_RGB_NRMW_BASE, nPRM.X_nrm[0], 4, 16);
|
||||
/* X_idx: 12*16 */
|
||||
/*LDIM_WR_BASE_LUT(REG_LD_RGB_IDX_BASE, nPRM.X_idx[0], 12, 16);*/
|
||||
LDIM_WR_BASE_LUT(REG_LD_RGB_IDX_BASE, nPRM.X_idx[0], 16, 16);
|
||||
/* gMatrix_LUT: u12*LD_BLKREGNUM */
|
||||
LDIM_WR_BASE_LUT_DRT(REG_LD_MATRIX_BASE, nPRM.BL_matrix, LD_BLKREGNUM);
|
||||
/* LD_FRM_SIZE */
|
||||
data = ((nPRM.reg_LD_pic_RowMax&0xfff)<<16) |
|
||||
(nPRM.reg_LD_pic_ColMax&0xfff);
|
||||
LDIM_WR_32Bits(REG_LD_FRM_SIZE, data);
|
||||
/* LD_RGB_MOD */
|
||||
data = ((nPRM.reg_LD_RGBmapping_demo & 0x1) << 19) |
|
||||
((nPRM.reg_LD_X_LUT_interp_mode[2] & 0x1) << 18) |
|
||||
((nPRM.reg_LD_X_LUT_interp_mode[1] & 0x1) << 17) |
|
||||
((nPRM.reg_LD_X_LUT_interp_mode[0] & 0x1) << 16) |
|
||||
((nPRM.reg_LD_BkLit_LPFmod & 0x7) << 12) |
|
||||
((nPRM.reg_LD_Litshft & 0x7) << 8) |
|
||||
((nPRM.reg_LD_BackLit_Xtlk & 0x1) << 7) |
|
||||
((nPRM.reg_LD_BkLit_Intmod & 0x1) << 6) |
|
||||
((nPRM.reg_LD_BkLUT_Intmod & 0x1) << 5) |
|
||||
((nPRM.reg_LD_BkLit_curmod & 0x1) << 4) |
|
||||
((nPRM.reg_LD_BackLit_mode & 0x3));
|
||||
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);
|
||||
/* 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);
|
||||
/* LD_HVGAIN */
|
||||
data = ((nPRM.reg_LD_Vgain & 0xfff) << 16) |
|
||||
(nPRM.reg_LD_Hgain & 0xfff);
|
||||
LDIM_WR_32Bits(REG_LD_HVGAIN, data);
|
||||
/* LD_LIT_GAIN_COMP */
|
||||
data = ((nPRM.reg_LD_Litgain & 0xfff) << 16) |
|
||||
(nPRM.reg_BL_matrix_Compensate & 0xfff);
|
||||
LDIM_WR_32Bits(REG_LD_LIT_GAIN_COMP, 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);
|
||||
/* REG_LD_LUT_XDG_LEXT */
|
||||
data = ((nPRM.reg_LD_LUT_Vdg_LEXT & 0x3ff) << 20) |
|
||||
((nPRM.reg_LD_LUT_VHk_LEXT & 0x3ff) << 10) |
|
||||
(nPRM.reg_LD_LUT_Hdg_LEXT & 0x3ff);
|
||||
LDIM_WR_32Bits(REG_LD_LUT_XDG_LEXT, data);
|
||||
|
||||
/* LD_FRM_RST_POS */
|
||||
data = (16<<16) | (3); /* h=16,v=3 :ldim_param_frm_rst_pos */
|
||||
LDIM_WR_32Bits(REG_LD_FRM_RST_POS, data);
|
||||
/* LD_FRM_BL_START_POS */
|
||||
data = (16<<16) | (4); /* ldim_param_frm_bl_start_pos; */
|
||||
LDIM_WR_32Bits(REG_LD_FRM_BL_START_POS, 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);
|
||||
|
||||
/* REG_LD_MISC_CTRL0 {ram_clk_gate_en,2'h0,ldlut_ram_sel,ram_clk_sel,
|
||||
* reg_hvcnt_bypass,reg_ldim_bl_en,soft_bl_start,reg_soft_rst)
|
||||
*/
|
||||
data = (0 << 1) | (ldim_bl_en << 2) |
|
||||
(ldim_hvcnt_bypass << 3) | (3 << 4) | (1 << 8);
|
||||
/* ldim_param_misc_ctrl0; */
|
||||
LDIM_WR_32Bits(REG_LD_MISC_CTRL0, data);
|
||||
kfree(arrayTmp);
|
||||
}
|
||||
|
||||
static int LDIM_Update_Matrix(int NewBlMatrix[], int BlMatrixNum)
|
||||
{
|
||||
int data;
|
||||
@@ -548,7 +382,7 @@ Previous_Matrix:
|
||||
return 1;
|
||||
}
|
||||
|
||||
static void LDIM_Initial_TXLX(unsigned int ldim_bl_en,
|
||||
static void ldim_initial_txlx(unsigned int ldim_bl_en,
|
||||
unsigned int ldim_hvcnt_bypass)
|
||||
{
|
||||
unsigned int i;
|
||||
@@ -733,8 +567,6 @@ static void LDIM_Initial(unsigned int pic_h, unsigned int pic_v,
|
||||
unsigned int BackLit_mode, unsigned int ldim_bl_en,
|
||||
unsigned int ldim_hvcnt_bypass)
|
||||
{
|
||||
struct aml_bl_drv_s *bl_drv = aml_bl_get_driver();
|
||||
|
||||
LDIMPR("%s: %d %d %d %d %d %d %d\n",
|
||||
__func__, pic_h, pic_v, BLK_Vnum, BLK_Hnum,
|
||||
BackLit_mode, ldim_bl_en, ldim_hvcnt_bypass);
|
||||
@@ -752,18 +584,14 @@ static void LDIM_Initial(unsigned int pic_h, unsigned int pic_v,
|
||||
/*config params end */
|
||||
ld_fw_cfg_once(&nPRM);
|
||||
if (LDIM_DATA_FROM_DB)
|
||||
ldim_db_load_update(&nPRM, ldim_db_para);
|
||||
ldim_db_load_update(&nPRM, ldim_dev.ldim_db_para);
|
||||
|
||||
switch (bl_drv->data->chip_type) {
|
||||
case BL_CHIP_TXLX:
|
||||
LDIM_Initial_TXLX(ldim_bl_en, ldim_hvcnt_bypass);
|
||||
break;
|
||||
case BL_CHIP_GXTVBB:
|
||||
LDIM_Initial_GXTVBB(ldim_bl_en, ldim_hvcnt_bypass);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
if (ldim_dev.ldim_func == NULL) {
|
||||
LDIMERR("%s: invalid ldim_func\n", __func__);
|
||||
return;
|
||||
}
|
||||
if (ldim_dev.ldim_func->ldim_init)
|
||||
ldim_dev.ldim_func->ldim_init(ldim_bl_en, ldim_hvcnt_bypass);
|
||||
}
|
||||
|
||||
static void ldim_update_matrix(unsigned int mode)
|
||||
@@ -830,44 +658,6 @@ static void ldim_update_matrix(unsigned int mode)
|
||||
LDIM_WR_32Bits(REG_LD_MISC_CTRL0, data);
|
||||
}
|
||||
|
||||
static void ldim_update_gxtvbb(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_matrix_update_en) {
|
||||
data = LDIM_RD_32Bits(REG_LD_MISC_CTRL0);
|
||||
data = data & (~(3<<4));
|
||||
data = data | (1<<2);
|
||||
LDIM_WR_32Bits(REG_LD_MISC_CTRL0, data);
|
||||
|
||||
/* gMatrix_LUT: s12*100 ==> max to 8*8 enum ##r/w ram method*/
|
||||
LDIM_WR_BASE_LUT_DRT(REG_LD_MATRIX_BASE,
|
||||
&(nPRM.BL_matrix[0]), ldim_blk_row*ldim_blk_col);
|
||||
|
||||
/*data = LDIM_RD_32Bits(REG_LD_MISC_CTRL0);*/
|
||||
data = data | (3<<4);
|
||||
LDIM_WR_32Bits(REG_LD_MISC_CTRL0, data);
|
||||
} else {
|
||||
data = LDIM_RD_32Bits(REG_LD_MISC_CTRL0);
|
||||
data = data & (~(1<<2));
|
||||
LDIM_WR_32Bits(REG_LD_MISC_CTRL0, data);
|
||||
}
|
||||
/* disable the CBUS configure the RAM */
|
||||
|
||||
}
|
||||
|
||||
static void ldim_update_txlx(void)
|
||||
{
|
||||
unsigned int data;
|
||||
@@ -892,43 +682,18 @@ static void ldim_update_txlx(void)
|
||||
|
||||
static void ldim_update_setting(void)
|
||||
{
|
||||
struct aml_bl_drv_s *bl_drv = aml_bl_get_driver();
|
||||
|
||||
switch (bl_drv->data->chip_type) {
|
||||
case BL_CHIP_TXLX:
|
||||
ldim_update_txlx();
|
||||
break;
|
||||
case BL_CHIP_GXTVBB:
|
||||
ldim_update_gxtvbb();
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
if (ldim_dev.ldim_func == NULL) {
|
||||
if (ldim_debug_print)
|
||||
LDIMERR("%s: invalid ldim_func\n", __func__);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
static irqreturn_t rdma_ldim_intr(int irq, void *dev_id)
|
||||
{
|
||||
ulong flags;
|
||||
|
||||
/*LDIMPR("*********rdma_ldim_intr start*********\n");*/
|
||||
spin_lock_irqsave(&rdma_ldim_isr_lock, flags);
|
||||
|
||||
if (ldim_hist_en) {
|
||||
/*schedule_work(&ldim_on_vs_work);*/
|
||||
queue_work(ldim_queue, &ldim_on_vs_work);
|
||||
}
|
||||
rdma_ldim_irq_cnt++;
|
||||
if (rdma_ldim_irq_cnt > 0xfffffff)
|
||||
rdma_ldim_irq_cnt = 0;
|
||||
spin_unlock_irqrestore(&rdma_ldim_isr_lock, flags);
|
||||
/*LDIMPR("*********rdma_ldim_intr end*********\n");*/
|
||||
return IRQ_HANDLED;
|
||||
if (ldim_dev.ldim_func->update_setting)
|
||||
ldim_dev.ldim_func->update_setting();
|
||||
}
|
||||
|
||||
static irqreturn_t ldim_vsync_isr(int irq, void *dev_id)
|
||||
{
|
||||
ulong flags;
|
||||
struct aml_bl_drv_s *bl_drv = aml_bl_get_driver();
|
||||
unsigned long flags;
|
||||
|
||||
if (ldim_on_flag == 0)
|
||||
return IRQ_HANDLED;
|
||||
@@ -939,17 +704,9 @@ static irqreturn_t ldim_vsync_isr(int irq, void *dev_id)
|
||||
if (ldim_avg_update_en)
|
||||
ldim_update_setting();
|
||||
|
||||
switch (bl_drv->data->chip_type) {
|
||||
case BL_CHIP_TXLX:
|
||||
if (ldim_hist_en) {
|
||||
/*schedule_work(&ldim_on_vs_work);*/
|
||||
queue_work(ldim_queue, &ldim_on_vs_work);
|
||||
}
|
||||
break;
|
||||
case BL_CHIP_GXTVBB:
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
if (ldim_hist_en) {
|
||||
/*schedule_work(&ldim_on_vs_work);*/
|
||||
queue_work(ldim_queue, &ldim_on_vs_work);
|
||||
}
|
||||
} else {
|
||||
/*schedule_work(&ldim_off_vs_work);*/
|
||||
@@ -1126,6 +883,18 @@ static void ldim_on_vs_arithmetic(void)
|
||||
kfree(local_ldim_max_rgb);
|
||||
}
|
||||
|
||||
static void ldim_on_update_brightness(struct work_struct *work)
|
||||
{
|
||||
ldim_stts_read_region(ldim_hist_row, ldim_hist_col);
|
||||
ldim_on_vs_arithmetic();
|
||||
ldim_on_vs_brightness();
|
||||
}
|
||||
|
||||
static void ldim_off_update_brightness(struct work_struct *work)
|
||||
{
|
||||
ldim_off_vs_brightness();
|
||||
}
|
||||
|
||||
static void ldim_bl_remap_curve_print(void)
|
||||
{
|
||||
int i = 0, len;
|
||||
@@ -2036,10 +1805,10 @@ static long ldim_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
|
||||
LDIMERR("db_para malloc error\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
ldim_db_para = db_para;
|
||||
if (copy_from_user(ldim_db_para, (void __user *)arg,
|
||||
ldim_dev.ldim_db_para = db_para;
|
||||
if (copy_from_user(ldim_dev.ldim_db_para, (void __user *)arg,
|
||||
sizeof(struct ldim_param_s))) {
|
||||
ldim_db_para = NULL;
|
||||
ldim_dev.ldim_db_para = NULL;
|
||||
kfree(db_para);
|
||||
return -EINVAL;
|
||||
}
|
||||
@@ -2047,7 +1816,7 @@ static long ldim_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
|
||||
LDIM_Initial(ldim_config.hsize, ldim_config.vsize,
|
||||
ldim_blk_row, ldim_blk_col,
|
||||
ldim_config.bl_mode, 1, 0);
|
||||
ldim_db_para = NULL;
|
||||
ldim_dev.ldim_db_para = NULL;
|
||||
kfree(db_para);
|
||||
break;
|
||||
|
||||
@@ -3422,11 +3191,23 @@ ldim_malloc_err0:
|
||||
return -1;
|
||||
}
|
||||
|
||||
static struct aml_ldim_func_s ldim_func_txlx = {
|
||||
.update_setting = ldim_update_txlx,
|
||||
.stts_init = ldim_stts_initial_txlx,
|
||||
.ldim_init = ldim_initial_txlx,
|
||||
};
|
||||
|
||||
static struct aml_ldim_func_s ldim_func_tl1 = {
|
||||
.update_setting = NULL,
|
||||
.stts_init = NULL,
|
||||
.ldim_init = NULL,
|
||||
};
|
||||
|
||||
int aml_ldim_probe(struct platform_device *pdev)
|
||||
{
|
||||
int ret = 0;
|
||||
unsigned int i;
|
||||
unsigned int ldim_vsync_irq = 0, ldim_rdma_irq = 0;
|
||||
unsigned int ldim_vsync_irq = 0;
|
||||
struct ldim_dev_s *devp = &ldim_dev;
|
||||
struct aml_bl_drv_s *bl_drv = aml_bl_get_driver();
|
||||
|
||||
@@ -3454,7 +3235,19 @@ int aml_ldim_probe(struct platform_device *pdev)
|
||||
|
||||
/* db para */
|
||||
LDIM_DATA_FROM_DB = 0;
|
||||
ldim_db_para = NULL;
|
||||
devp->ldim_db_para = NULL;
|
||||
/* ldim_func */
|
||||
switch (bl_drv->data->chip_type) {
|
||||
case BL_CHIP_TL1:
|
||||
devp->ldim_func = &ldim_func_tl1;
|
||||
break;
|
||||
case BL_CHIP_TXLX:
|
||||
devp->ldim_func = &ldim_func_txlx;
|
||||
break;
|
||||
default:
|
||||
devp->ldim_func = NULL;
|
||||
break;
|
||||
}
|
||||
|
||||
ret = aml_ldim_malloc(ldim_blk_row, ldim_blk_col);
|
||||
if (ret) {
|
||||
@@ -3534,27 +3327,6 @@ int aml_ldim_probe(struct platform_device *pdev)
|
||||
else
|
||||
LDIMPR("request ldim_vsync_irq successful\n");
|
||||
|
||||
switch (bl_drv->data->chip_type) {
|
||||
case BL_CHIP_GXTVBB:
|
||||
bl_drv->res_ldim_rdma_irq = platform_get_resource(pdev,
|
||||
IORESOURCE_IRQ, 1);
|
||||
if (!bl_drv->res_ldim_rdma_irq) {
|
||||
ret = -ENODEV;
|
||||
LDIMERR("ldim_rdma_irq resource error\n");
|
||||
goto err;
|
||||
}
|
||||
ldim_rdma_irq = bl_drv->res_ldim_rdma_irq->start;
|
||||
LDIMPR("ldim_rdma_irq: %d\n", ldim_rdma_irq);
|
||||
if (request_irq(ldim_rdma_irq, rdma_ldim_intr, IRQF_SHARED,
|
||||
"ldim_rdma", (void *)"ldim_rdma"))
|
||||
LDIMERR("can't request ldim_rdma_irq\n");
|
||||
else
|
||||
LDIMPR("request ldim_rdma_irq successful\n");
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
ldim_driver.valid_flag = 1;
|
||||
|
||||
LDIMPR("%s ok\n", __func__);
|
||||
@@ -3594,16 +3366,6 @@ int aml_ldim_remove(void)
|
||||
kfree(ldim_driver.local_ldim_matrix);
|
||||
|
||||
free_irq(bl_drv->res_ldim_vsync_irq->start, (void *)"ldim_vsync");
|
||||
switch (bl_drv->data->chip_type) {
|
||||
case BL_CHIP_GXTVBB:
|
||||
if (bl_drv->res_ldim_rdma_irq) {
|
||||
free_irq(bl_drv->res_ldim_rdma_irq->start,
|
||||
(void *)"ldim_rdma");
|
||||
}
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
cdev_del(devp->aml_ldim_cdevp);
|
||||
kfree(devp->aml_ldim_cdevp);
|
||||
|
||||
@@ -36,6 +36,13 @@ extern int LD_remap_lut[16][32];
|
||||
|
||||
/*========================================*/
|
||||
|
||||
struct aml_ldim_func_s {
|
||||
void (*update_setting)(void);
|
||||
void (*stts_init)(unsigned int resolution);
|
||||
void (*ldim_init)(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,
|
||||
|
||||
@@ -41,51 +41,6 @@
|
||||
#define Wr(reg, val) Wr_reg(reg, val)
|
||||
#define Rd(reg) Rd_reg(reg)
|
||||
|
||||
static int LD_STA1max_Hidx[25] = {
|
||||
/* U12* 25 */
|
||||
0, 480, 960, 1440, 1920, 2400, 2880,
|
||||
3360, 3840, 4095, 4095, 4095, 4095,
|
||||
4095, 4095, 4095, 4095, 4095, 4095,
|
||||
4095, 4095, 4095, 4095, 4095, 4095
|
||||
};
|
||||
|
||||
static int LD_STA1max_Vidx[17] = {
|
||||
/* u12x 17 */
|
||||
0, 2160, 4095, 4095, 4095, 4095,
|
||||
4095, 4095, 4095, 4095, 4095, 4095,
|
||||
4095, 4095, 4095, 4095, 4095
|
||||
};
|
||||
|
||||
static int LD_STA2max_Hidx[25] = {
|
||||
/* U12* 25 */
|
||||
0, 480, 960, 1440, 1920, 2400, 2880,
|
||||
3360, 3840, 4095, 4095, 4095, 4095,
|
||||
4095, 4095, 4095, 4095, 4095, 4095,
|
||||
4095, 4095, 4095, 4095, 4095, 4095
|
||||
};
|
||||
|
||||
static int LD_STA2max_Vidx[17] = {
|
||||
/* u12x 17 */
|
||||
0, 2160, 4095, 4095, 4095, 4095,
|
||||
4095, 4095, 4095, 4095, 4095, 4095,
|
||||
4095, 4095, 4095, 4095, 4095
|
||||
};
|
||||
|
||||
static int LD_STAhist_Hidx[25] = {
|
||||
/* U12* 25 */
|
||||
0, 480, 960, 1440, 1920, 2400, 2880,
|
||||
3360, 3840, 4095, 4095, 4095, 4095,
|
||||
4095, 4095, 4095, 4095, 4095, 4095,
|
||||
4095, 4095, 4095, 4095, 4095, 4095
|
||||
};
|
||||
|
||||
static int LD_STAhist_Vidx[17] = {
|
||||
/* u12x 17 */
|
||||
0, 2160, 4095, 4095, 4095, 4095,
|
||||
4095, 4095, 4095, 4095, 4095, 4095,
|
||||
4095, 4095, 4095, 4095, 4095
|
||||
};
|
||||
|
||||
static int LD_BLK_Hidx[33] = {
|
||||
/* S14* 33 */
|
||||
-1920, -1440, -960, -480, 0, 480,
|
||||
@@ -104,27 +59,6 @@ static int LD_BLK_Vidx[25] = {
|
||||
8191, 8191, 8191, 8191, 8191, 8191, 8191
|
||||
};
|
||||
|
||||
static int LD_LUT_Hdg[32] = {
|
||||
/* u10 */
|
||||
503, 501, 494, 481, 465, 447, 430, 409, 388, 369, 354,
|
||||
343, 334, 326, 318, 311, 305, 299, 293, 286, 279, 272,
|
||||
266, 261, 257, 252, 245, 235, 226, 218, 214, 213
|
||||
};
|
||||
|
||||
static int LD_LUT_Vdg[32] = {
|
||||
/* u10 */
|
||||
373, 371, 367, 364, 359, 353, 346, 337, 328, 318, 308,
|
||||
297, 286, 274, 261, 247, 232, 218, 204, 191, 180, 169,
|
||||
158, 148, 138, 130, 122, 115, 108, 104, 100, 97
|
||||
};
|
||||
|
||||
static int LD_LUT_VHk[32] = {
|
||||
/* u10 */
|
||||
492, 492, 492, 492, 427, 356, 328, 298, 272, 251, 229,
|
||||
206, 191, 175, 162, 151, 144, 139, 131, 127, 119, 110,
|
||||
105, 101, 99, 98, 94, 85, 83, 77, 74, 73
|
||||
};
|
||||
|
||||
static int LD_LUT_Hdg1[32] = {
|
||||
/* u10 */
|
||||
503, 501, 494, 481, 465, 447, 430, 409, 388, 369, 354,
|
||||
@@ -162,17 +96,20 @@ static int LD_LUT_Hdg1_TXLX[32] = {
|
||||
455, 487, 498, 505, 506, 509, 503, 494,
|
||||
493, 483, 484, 480, 478, 476, 472, 472,
|
||||
468, 465, 459, 449, 448, 439, 436, 432,
|
||||
430, 413, 402, 386, 361, 343, 317, 307};
|
||||
430, 413, 402, 386, 361, 343, 317, 307
|
||||
};
|
||||
static int LD_LUT_Vdg1_TXLX[32] = {
|
||||
485, 483, 474, 465, 451, 435, 406, 381,
|
||||
350, 320, 283, 251, 211, 178, 147, 113,
|
||||
88, 65, 52, 37, 27, 20, 16, 8,
|
||||
3, 2, 0, 0, 0, 0, 0, 0};
|
||||
3, 2, 0, 0, 0, 0, 0, 0
|
||||
};
|
||||
static int LD_LUT_VHk1_TXLX[32] = {
|
||||
490, 410, 356, 317, 288, 272, 266, 260,
|
||||
258, 253, 249, 246, 242, 240, 236, 236,
|
||||
232, 229, 226, 224, 224, 222, 221, 221,
|
||||
221, 219, 219, 221, 219, 225, 228, 237};
|
||||
221, 219, 219, 221, 219, 225, 228, 237
|
||||
};
|
||||
static int reg_LD_LUT_Hdg_TXLX[8][32] = {
|
||||
{254, 248, 239, 226, 211, 194, 176, 156,
|
||||
137, 119, 101, 85, 70, 57, 45, 36,
|
||||
@@ -275,18 +212,23 @@ static int reg_LD_LUT_VHk_TXLX[8][32] = {
|
||||
128, 128, 128, 128, 128, 128, 128, 128,
|
||||
128, 128, 128, 128, 128, 128, 128, 128},
|
||||
};
|
||||
static int reg_LD_LUT_VHo_pos_TXLX[32] = {0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
|
||||
static int reg_LD_LUT_VHo_neg_TXLX[32] = {0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
|
||||
static int reg_LD_LUT_VHo_pos_TXLX[32] = {
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
|
||||
};
|
||||
static int reg_LD_LUT_VHo_neg_TXLX[32] = {
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
|
||||
};
|
||||
static int reg_LD_LUT_Hdg_LEXT_TXLX[8] = {
|
||||
260, 260, 260, 260, 260, 260, 260, 260};
|
||||
260, 260, 260, 260, 260, 260, 260, 260
|
||||
};
|
||||
static int reg_LD_LUT_Vdg_LEXT_TXLX[8] = {
|
||||
260, 260, 260, 260, 260, 260, 260, 260};
|
||||
260, 260, 260, 260, 260, 260, 260, 260
|
||||
};
|
||||
static int reg_LD_LUT_VHk_LEXT_TXLX[8] = {
|
||||
128, 128, 128, 128, 128, 128, 128, 128};
|
||||
128, 128, 128, 128, 128, 128, 128, 128
|
||||
};
|
||||
|
||||
|
||||
/* public function */
|
||||
@@ -873,269 +815,11 @@ void LD_LUTInit(struct LDReg_s *Reg)
|
||||
}
|
||||
}
|
||||
break;
|
||||
case BL_CHIP_GXTVBB:
|
||||
/* Emulate the FW to set the LUTs */
|
||||
for (k = 0; k < 16; k++) {
|
||||
/*set the LUT to be inverse of the Lit_value,*/
|
||||
/* lit_idx distribute equal space, set by FW */
|
||||
Reg->X_idx[0][k] = 4095 - 256 * k;
|
||||
Reg->X_nrm[0][k] = 8;
|
||||
for (t = 0; t < 32; t++) {
|
||||
Reg->X_lut[0][k][t] = LD_remap_lut[k][t];
|
||||
Reg->X_lut[1][k][t] = LD_remap_lut[k][t];
|
||||
Reg->X_lut[2][k][t] = LD_remap_lut[k][t];
|
||||
}
|
||||
}
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static void ConLDReg_GXTVBB(struct LDReg_s *Reg)
|
||||
{
|
||||
unsigned int T = 0;
|
||||
unsigned int Vnum = 0;
|
||||
unsigned int Hnum = 0;
|
||||
unsigned int BSIZE = 0;
|
||||
|
||||
/* General registers; */
|
||||
Reg->reg_LD_pic_RowMax = 2160;/* setting default */
|
||||
Reg->reg_LD_pic_ColMax = 3840;
|
||||
LD_IntialData(Reg->reg_LD_pic_YUVsum, 3, 0);
|
||||
/* only output u16*3, (internal ACC will be u32x3)*/
|
||||
LD_IntialData(Reg->reg_LD_pic_RGBsum, 3, 0);
|
||||
|
||||
/* set same region division for statistics */
|
||||
Reg->reg_LD_STA_Vnum = 8;
|
||||
Reg->reg_LD_STA_Hnum = 8;
|
||||
|
||||
/*Image Statistic options */
|
||||
Reg->reg_LD_BLK_Vnum = 1;/*u5: Maximum to BLKVMAX */
|
||||
Reg->reg_LD_BLK_Hnum = 8;/*u5: Maximum to BLKHMAX */
|
||||
|
||||
Reg->reg_LD_STA1max_LPF = 1;
|
||||
/*u1: STA1max statistics on [1 2 1]/4 filtered results */
|
||||
Reg->reg_LD_STA2max_LPF = 1;
|
||||
/*u1: STA2max statistics on [1 2 1]/4 filtered results*/
|
||||
Reg->reg_LD_STAhist_LPF = 1;
|
||||
/*u1: STAhist statistics on [1 2 1]/4 filtered results*/
|
||||
Reg->reg_LD_STA1max_Hdlt = 0;
|
||||
/*u2: (2^x) extra pixels into Max calculation*/
|
||||
Reg->reg_LD_STA1max_Vdlt = 0;
|
||||
/*u4: extra pixels into Max calculation vertically*/
|
||||
Reg->reg_LD_STA2max_Hdlt = 0;
|
||||
/*u2: (2^x) extra pixels into Max calculation*/
|
||||
Reg->reg_LD_STA2max_Vdlt = 0;
|
||||
/*u4: extra pixels into Max calculation vertically*/
|
||||
Reg->reg_LD_STAhist_mode = 3;
|
||||
/*u3: histogram statistics on XX separately 20bits*16bins:
|
||||
* 0:R-only,1:G-only 2:B-only 3:Y-only; 4:MAX(R,G,B),5/6/7:R&G&B
|
||||
*/
|
||||
Reg->reg_LD_STAhist_pix_drop_mode = 0;/*u2 */
|
||||
for (T = 0; T < LD_STA_LEN_H; T++) {
|
||||
Reg->reg_LD_STA1max_Hidx[T] = LD_STA1max_Hidx[T];/*U12* 25*/
|
||||
Reg->reg_LD_STA2max_Hidx[T] = LD_STA2max_Hidx[T];/*U12* 25*/
|
||||
Reg->reg_LD_STAhist_Hidx[T] = LD_STAhist_Hidx[T];/*U12* 25*/
|
||||
}
|
||||
for (T = 0; T < LD_STA_LEN_V; T++) {
|
||||
Reg->reg_LD_STA1max_Vidx[T] = LD_STA1max_Vidx[T];/*u12x 17*/
|
||||
Reg->reg_LD_STA2max_Vidx[T] = LD_STA2max_Vidx[T];/*u12x 17*/
|
||||
Reg->reg_LD_STAhist_Vidx[T] = LD_STAhist_Vidx[T];/*u12x 17*/
|
||||
}
|
||||
|
||||
/****** FBC3 fw_hw_alg_frm *******/
|
||||
Reg->reg_ldfw_BLmax = 4095; /*maximum BL value*/
|
||||
Reg->reg_ldfw_blk_norm = 128;
|
||||
/*u8: normalization gain for blk number,
|
||||
* 1/blk_num= norm>>(rs+8), norm = (1<<(rs+8))/blk_num
|
||||
*/
|
||||
|
||||
Reg->reg_ldfw_blk_norm_rs = 2;
|
||||
/*u3: 0~7, 1/blk_num= norm>>(rs+8)*/
|
||||
|
||||
for (T = 0; T < 8; T++)
|
||||
Reg->reg_ldfw_sta_hdg_weight[T] = 64;
|
||||
|
||||
Reg->reg_ldfw_sta_max_mode = 3;
|
||||
/* u2: maximum selection for components:
|
||||
* 0: r_max, 1: g_max, 2: b_max; 3: max(r,g,b)
|
||||
*/
|
||||
|
||||
Reg->reg_ldfw_sta_max_hist_mode = 0;
|
||||
/* u2: mode of reference max/hist mode:
|
||||
* 0: MIN(max, hist), 1: MAX(max, hist) 2: (max+hist)/2,
|
||||
* 3: (max(a,b)*3 + min(a,b))/4
|
||||
*/
|
||||
|
||||
Reg->reg_ldfw_hist_valid_rate = 64;
|
||||
/* u8, norm to 512 as "1", if hist_matrix[i]>(rate*histavg)>>9 */
|
||||
|
||||
Reg->reg_ldfw_hist_valid_ofst = 63;/* u8, hist valid bin upward offset*/
|
||||
Reg->reg_ldfw_sedglit_RL = 1;/*u1: single edge lit right/bottom mode*/
|
||||
|
||||
Reg->reg_ldfw_sf_thrd = 1600;
|
||||
/*u12: threshold of difference to enable the sf;*/
|
||||
|
||||
Reg->reg_ldfw_boost_gain = 64;
|
||||
/* u8: boost gain for the region that is
|
||||
* larger than the average, norm to 16 as "1"
|
||||
*/
|
||||
|
||||
Reg->reg_ldfw_tf_alpha_rate = 16;
|
||||
/*u8: rate to SFB_BL_matrix from last frame difference;*/
|
||||
|
||||
Reg->reg_ldfw_tf_alpha_ofst = 32;
|
||||
/* u8: ofset to alpha SFB_BL_matrix from last frame difference;*/
|
||||
|
||||
Reg->reg_ldfw_tf_disable_th = 255;
|
||||
/* u8: 4x is the threshod to disable tf to the alpha
|
||||
* (SFB_BL_matrix from last frame difference;
|
||||
*/
|
||||
|
||||
Reg->reg_ldfw_blest_acmode = 1;
|
||||
/* u3: 0: est on BLmatrix; 1: est on (BL-DC);
|
||||
* 2: est on (BL-MIN); 3: est on (BL-MAX) 4: 2048; 5:1024
|
||||
*/
|
||||
|
||||
Reg->reg_ldfw_sf_enable = 0;
|
||||
/* u1: enable signal for spatial filter on the tbl_matrix */
|
||||
|
||||
Reg->reg_ldfw_boost_enable = 0;
|
||||
/* u1: enable signal for Boost filter on the tbl_matrix */
|
||||
|
||||
Reg->ro_ldfw_bl_matrix_avg = 0;
|
||||
/* u12: read-only register for bl_matrix */
|
||||
|
||||
/*---------------------Setting BL_matrix initial value
|
||||
* (will be updated frame to frame in FW)
|
||||
*/
|
||||
Vnum = Reg->reg_LD_BLK_Vnum;
|
||||
Hnum = Reg->reg_LD_BLK_Hnum;
|
||||
BSIZE = Vnum*Hnum;
|
||||
/*Initialization */
|
||||
LD_IntialData(Reg->BL_matrix, BSIZE, 4095);
|
||||
|
||||
/* BackLight Modeling control register setting*/
|
||||
Reg->reg_LD_BackLit_Xtlk = 1;
|
||||
/* u1: 0 no block to block Xtalk model needed; 1: Xtalk model needed*/
|
||||
Reg->reg_LD_BackLit_mode = 1;
|
||||
/*u2: 0- LEFT/RIGHT Edge Lit; 1- Top/Bot Edge Lit; 2 - DirectLit modeled
|
||||
* H/V independent; 3- DirectLit modeled HV Circle distribution
|
||||
*/
|
||||
Reg->reg_LD_Reflect_Hnum = 3;
|
||||
/*u3: numbers of band reflection considered in Horizontal
|
||||
* direction; 0~4
|
||||
*/
|
||||
Reg->reg_LD_Reflect_Vnum = 0;
|
||||
/*u3: numbers of band reflection considered in Horizontal
|
||||
* direction; 0~4
|
||||
*/
|
||||
Reg->reg_LD_BkLit_curmod = 0;
|
||||
/*u1: 0: H/V separately, 1 Circle distribution*/
|
||||
Reg->reg_LD_BkLUT_Intmod = 1;
|
||||
/*u1: 0: linear interpolation, 1 cubical interpolation*/
|
||||
Reg->reg_LD_BkLit_Intmod = 1;
|
||||
/*u1: 0: linear interpolation, 1 cubical interpolation*/
|
||||
Reg->reg_LD_BkLit_LPFmod = 7;
|
||||
/* u3: 0: no LPF, 1:[1 14 1]/16;2:[1 6 1]/8; 3: [1 2 1]/4;
|
||||
* 4:[9 14 9]/32 5/6/7: [5 6 5]/16;
|
||||
*/
|
||||
Reg->reg_LD_BkLit_Celnum = 121;
|
||||
/*u8:0:1920~61####((Reg->reg_LD_pic_ColMax+1)/32)+1;*/
|
||||
Reg->reg_BL_matrix_AVG = 4095;
|
||||
/* u12: DC of whole picture BL to be subtract from BL_matrix
|
||||
* during modeling (Set by FW daynamically)
|
||||
*/
|
||||
Reg->reg_BL_matrix_Compensate = 4095;
|
||||
/* u12: DC of whole picture BL to be compensated back to
|
||||
* Litfull after the model (Set by FW dynamically);
|
||||
*/
|
||||
LD_IntialData(Reg->reg_LD_Reflect_Hdgr, 20, 32);
|
||||
/*20*u6: cells 1~20 for H Gains of different dist of Left/Right;*/
|
||||
LD_IntialData(Reg->reg_LD_Reflect_Vdgr, 20, 32);
|
||||
/*20*u6: cells 1~20 for V Gains of different dist of Top/Bot; */
|
||||
LD_IntialData(Reg->reg_LD_Reflect_Xdgr, 4, 32);/* 4*u6: */
|
||||
|
||||
Reg->reg_LD_Vgain = 256;/* u12 */
|
||||
Reg->reg_LD_Hgain = 242;/* u12 */
|
||||
Reg->reg_LD_Litgain = 256;/* u12 */
|
||||
Reg->reg_LD_Litshft = 3;
|
||||
/* u3 right shif of bits for the all Lit's sum */
|
||||
LD_IntialData(Reg->reg_LD_BkLit_valid, 32, 1);
|
||||
/*u1x32: valid bits for the 32 cell Bklit to contribut to current
|
||||
* position (refer to the backlit padding pattern)
|
||||
* region division index 1 2 3 4 5(0) 6(1) 7(2) 8(3) 9(4)
|
||||
* 10(5)11(6)12(7)13(8) 14(9)15(10) 16 17 18 19
|
||||
*/
|
||||
for (T = 0; T < LD_BLK_LEN_H; T++)
|
||||
Reg->reg_LD_BLK_Hidx[T] = LD_BLK_Hidx[T];/* S14* BLK_LEN_H */
|
||||
for (T = 0; T < LD_BLK_LEN_V; T++)
|
||||
Reg->reg_LD_BLK_Vidx[T] = LD_BLK_Vidx[T];/* S14x BLK_LEN_V */
|
||||
for (T = 0; T < LD_LUT_LEN; T++) {
|
||||
Reg->reg_LD_LUT_Hdg[T] = LD_LUT_Hdg[T];
|
||||
Reg->reg_LD_LUT_Vdg[T] = LD_LUT_Vdg[T];
|
||||
Reg->reg_LD_LUT_VHk[T] = LD_LUT_VHk[T];
|
||||
}
|
||||
/* set the VHk_pos and VHk_neg value ,normalized to
|
||||
* 128 as "1" 20150428
|
||||
*/
|
||||
for (T = 0; T < 32; T++) {
|
||||
Reg->reg_LD_LUT_VHk_pos[T] = 128;/* vdist>=0 */
|
||||
Reg->reg_LD_LUT_VHk_neg[T] = 128;/* vdist<0 */
|
||||
Reg->reg_LD_LUT_HHk[T] = 128;/* hdist gain */
|
||||
Reg->reg_LD_LUT_VHo_pos[T] = 0;/* vdist>=0 */
|
||||
Reg->reg_LD_LUT_VHo_neg[T] = 0;/* vdist<0 */
|
||||
}
|
||||
Reg->reg_LD_LUT_VHo_LS = 0;
|
||||
Reg->reg_LD_LUT_Hdg_LEXT = 505;
|
||||
/* 2*(nPRM->reg_LD_LUT_Hdg[0]) - (nPRM->reg_LD_LUT_Hdg[1]); */
|
||||
Reg->reg_LD_LUT_Vdg_LEXT = 372;
|
||||
/* 2*(nPRM->reg_LD_LUT_Vdg[0]) - (nPRM->reg_LD_LUT_Vdg[1]); */
|
||||
Reg->reg_LD_LUT_VHk_LEXT = 492;
|
||||
/* 2*(nPRM->reg_LD_LUT_VHk[0]) - (nPRM->reg_LD_LUT_VHk[1]); */
|
||||
/* set the demo window */
|
||||
Reg->reg_LD_xlut_demo_roi_xstart = (Reg->reg_LD_pic_ColMax/4);
|
||||
/* u14 start col index of the region of interest */
|
||||
Reg->reg_LD_xlut_demo_roi_xend = (Reg->reg_LD_pic_ColMax*3/4);
|
||||
/* u14 end col index of the region of interest */
|
||||
Reg->reg_LD_xlut_demo_roi_ystart = (Reg->reg_LD_pic_RowMax/4);
|
||||
/* u14 start row index of the region of interest */
|
||||
Reg->reg_LD_xlut_demo_roi_yend = (Reg->reg_LD_pic_RowMax*3/4);
|
||||
/* u14 end row index of the region of interest */
|
||||
Reg->reg_LD_xlut_iroi_enable = 1;
|
||||
/* u1: enable rgb LUT remapping inside regon of interest:
|
||||
* 0: no rgb remapping; 1: enable rgb remapping
|
||||
*/
|
||||
Reg->reg_LD_xlut_oroi_enable = 1;
|
||||
/* u1: enable rgb LUT remapping outside regon of interest:
|
||||
* 0: no rgb remapping; 1: enable rgb remapping
|
||||
*/
|
||||
|
||||
/* Registers used in LD_RGB_LUT for RGB remaping */
|
||||
Reg->reg_LD_RGBmapping_demo = 0;
|
||||
/* u2: 0 no demo mode 1: display BL_fulpel on RGB */
|
||||
Reg->reg_LD_X_LUT_interp_mode[0] = 1;
|
||||
/* U1 0: using linear interpolation between to neighbour LUT;
|
||||
* 1: use the nearest LUT results
|
||||
*/
|
||||
Reg->reg_LD_X_LUT_interp_mode[1] = 1;
|
||||
/* U1 0: using linear interpolation between to neighbour LUT;
|
||||
* 1: use the nearest LUT results
|
||||
*/
|
||||
Reg->reg_LD_X_LUT_interp_mode[2] = 1;
|
||||
/* U1 0: using linear interpolation between to neighbour LUT;
|
||||
* 1: use the nearest LUT results
|
||||
*/
|
||||
LD_LUTInit(Reg);
|
||||
/* only do the Lit modleing on the AC part */
|
||||
Reg->fw_LD_BLEst_ACmode = 0;
|
||||
/* u2: 0: est on BLmatrix; 1: est on (BL-DC);
|
||||
* 2: est on (BL-MIN); 3: est on (BL-MAX)
|
||||
*/
|
||||
}
|
||||
|
||||
|
||||
static void ConLDReg_TXLX(struct LDReg_s *Reg)
|
||||
{
|
||||
int i, j;
|
||||
@@ -1399,9 +1083,6 @@ void LD_ConLDReg(struct LDReg_s *Reg)
|
||||
case BL_CHIP_TXLX:
|
||||
ConLDReg_TXLX(Reg);
|
||||
break;
|
||||
case BL_CHIP_GXTVBB:
|
||||
ConLDReg_GXTVBB(Reg);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -24,7 +24,7 @@
|
||||
#include <linux/amlogic/pwm_meson.h>
|
||||
|
||||
#define BLPR(fmt, args...) pr_info("bl: "fmt"", ## args)
|
||||
#define BLERR(fmt, args...) pr_err("bl error: "fmt"", ## args)
|
||||
#define BLERR(fmt, args...) pr_err("bl error: "fmt"", ## args)
|
||||
#define AML_BL_NAME "aml-bl"
|
||||
|
||||
#define BL_LEVEL_MAX 255
|
||||
@@ -42,7 +42,6 @@
|
||||
#define BL_FREQ_VS_DEFAULT 2 /* multiple 2 of vfreq */
|
||||
|
||||
enum bl_chip_type_e {
|
||||
BL_CHIP_GXTVBB,
|
||||
BL_CHIP_GXL,
|
||||
BL_CHIP_GXM,
|
||||
BL_CHIP_TXL,
|
||||
@@ -50,6 +49,7 @@ enum bl_chip_type_e {
|
||||
BL_CHIP_AXG,
|
||||
BL_CHIP_G12A,
|
||||
BL_CHIP_G12B,
|
||||
BL_CHIP_TL1,
|
||||
BL_CHIP_MAX,
|
||||
};
|
||||
|
||||
@@ -183,7 +183,7 @@ struct aml_bl_drv_s {
|
||||
struct workqueue_struct *workqueue;
|
||||
struct delayed_work bl_delayed_work;
|
||||
struct resource *res_ldim_vsync_irq;
|
||||
struct resource *res_ldim_rdma_irq;
|
||||
/*struct resource *res_ldim_rdma_irq;*/
|
||||
};
|
||||
|
||||
extern struct aml_bl_drv_s *aml_bl_get_driver(void);
|
||||
|
||||
Reference in New Issue
Block a user