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;
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;
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] = {
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);
.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;
}
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;
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;
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;
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;
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);
/*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)
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;
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;
- }
-}
-
-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);
+ if (ldim_dev.ldim_func == NULL) {
+ if (ldim_debug_print)
+ LDIMERR("%s: invalid ldim_func\n", __func__);
+ return;
}
- 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;
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);*/
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;
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;
}
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;
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();
/* 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) {
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__);
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);
#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,
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,
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,
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 */
}
}
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;
case BL_CHIP_TXLX:
ConLDReg_TXLX(Reg);
break;
- case BL_CHIP_GXTVBB:
- ConLDReg_GXTVBB(Reg);
- break;
default:
break;
}