mirror of
https://github.com/hardkernel/linux.git
synced 2026-06-07 19:30:30 +09:00
media: rockchip: isp: fix rawhist weight config error for multi deivce
rawhist weight reg will be automatically incremented by each write. Change-Id: I531d8a03dda804039237d3400d77127b070c11e9 Signed-off-by: Cai YiWei <cyw@rock-chips.com>
This commit is contained in:
@@ -322,6 +322,10 @@ void rkisp_params_cfg(struct rkisp_isp_params_vdev *params_vdev, u32 frame_id)
|
||||
|
||||
void rkisp_params_cfgsram(struct rkisp_isp_params_vdev *params_vdev)
|
||||
{
|
||||
/* multi device to switch sram config */
|
||||
if (params_vdev->dev->hw_dev->is_single)
|
||||
return;
|
||||
|
||||
if (params_vdev->ops->param_cfgsram)
|
||||
params_vdev->ops->param_cfgsram(params_vdev);
|
||||
}
|
||||
|
||||
@@ -456,18 +456,22 @@ isp_sdg_enable(struct rkisp_isp_params_vdev *params_vdev,
|
||||
|
||||
static void __maybe_unused
|
||||
isp_lsc_matrix_cfg_sram(struct rkisp_isp_params_vdev *params_vdev,
|
||||
const struct isp2x_lsc_cfg *pconfig, bool is_direct)
|
||||
const struct isp2x_lsc_cfg *pconfig, bool is_check)
|
||||
{
|
||||
int i, j;
|
||||
unsigned int sram_addr;
|
||||
unsigned int data;
|
||||
|
||||
if (is_check &&
|
||||
!(rkisp_ioread32(params_vdev, ISP_LSC_CTRL) & ISP_LSC_EN))
|
||||
return;
|
||||
|
||||
/* CIF_ISP_LSC_TABLE_ADDRESS_153 = ( 17 * 18 ) >> 1 */
|
||||
sram_addr = CIF_ISP_LSC_TABLE_ADDRESS_0;
|
||||
rkisp_write(params_vdev->dev, ISP_LSC_R_TABLE_ADDR, sram_addr, is_direct);
|
||||
rkisp_write(params_vdev->dev, ISP_LSC_GR_TABLE_ADDR, sram_addr, is_direct);
|
||||
rkisp_write(params_vdev->dev, ISP_LSC_GB_TABLE_ADDR, sram_addr, is_direct);
|
||||
rkisp_write(params_vdev->dev, ISP_LSC_B_TABLE_ADDR, sram_addr, is_direct);
|
||||
rkisp_write(params_vdev->dev, ISP_LSC_R_TABLE_ADDR, sram_addr, true);
|
||||
rkisp_write(params_vdev->dev, ISP_LSC_GR_TABLE_ADDR, sram_addr, true);
|
||||
rkisp_write(params_vdev->dev, ISP_LSC_GB_TABLE_ADDR, sram_addr, true);
|
||||
rkisp_write(params_vdev->dev, ISP_LSC_B_TABLE_ADDR, sram_addr, true);
|
||||
|
||||
/* program data tables (table size is 9 * 17 = 153) */
|
||||
for (i = 0; i < CIF_ISP_LSC_SECTORS_MAX * CIF_ISP_LSC_SECTORS_MAX;
|
||||
@@ -477,46 +481,34 @@ isp_lsc_matrix_cfg_sram(struct rkisp_isp_params_vdev *params_vdev,
|
||||
* DWORDs (2nd value of last DWORD unused)
|
||||
*/
|
||||
for (j = 0; j < CIF_ISP_LSC_SECTORS_MAX - 1; j += 2) {
|
||||
data = ISP_ISP_LSC_TABLE_DATA(
|
||||
pconfig->r_data_tbl[i + j],
|
||||
pconfig->r_data_tbl[i + j + 1]);
|
||||
rkisp_write(params_vdev->dev, ISP_LSC_R_TABLE_DATA, data, is_direct);
|
||||
data = ISP_ISP_LSC_TABLE_DATA(pconfig->r_data_tbl[i + j],
|
||||
pconfig->r_data_tbl[i + j + 1]);
|
||||
rkisp_write(params_vdev->dev, ISP_LSC_R_TABLE_DATA, data, true);
|
||||
|
||||
data = ISP_ISP_LSC_TABLE_DATA(
|
||||
pconfig->gr_data_tbl[i + j],
|
||||
pconfig->gr_data_tbl[i + j + 1]);
|
||||
rkisp_write(params_vdev->dev, ISP_LSC_GR_TABLE_DATA, data, is_direct);
|
||||
data = ISP_ISP_LSC_TABLE_DATA(pconfig->gr_data_tbl[i + j],
|
||||
pconfig->gr_data_tbl[i + j + 1]);
|
||||
rkisp_write(params_vdev->dev, ISP_LSC_GR_TABLE_DATA, data, true);
|
||||
|
||||
data = ISP_ISP_LSC_TABLE_DATA(
|
||||
pconfig->gb_data_tbl[i + j],
|
||||
pconfig->gb_data_tbl[i + j + 1]);
|
||||
rkisp_write(params_vdev->dev, ISP_LSC_GB_TABLE_DATA, data, is_direct);
|
||||
data = ISP_ISP_LSC_TABLE_DATA(pconfig->gb_data_tbl[i + j],
|
||||
pconfig->gb_data_tbl[i + j + 1]);
|
||||
rkisp_write(params_vdev->dev, ISP_LSC_GB_TABLE_DATA, data, true);
|
||||
|
||||
data = ISP_ISP_LSC_TABLE_DATA(
|
||||
pconfig->b_data_tbl[i + j],
|
||||
pconfig->b_data_tbl[i + j + 1]);
|
||||
rkisp_write(params_vdev->dev, ISP_LSC_B_TABLE_DATA, data, is_direct);
|
||||
data = ISP_ISP_LSC_TABLE_DATA(pconfig->b_data_tbl[i + j],
|
||||
pconfig->b_data_tbl[i + j + 1]);
|
||||
rkisp_write(params_vdev->dev, ISP_LSC_B_TABLE_DATA, data, true);
|
||||
}
|
||||
|
||||
data = ISP_ISP_LSC_TABLE_DATA(
|
||||
pconfig->r_data_tbl[i + j],
|
||||
0);
|
||||
rkisp_write(params_vdev->dev, ISP_LSC_R_TABLE_DATA, data, is_direct);
|
||||
data = ISP_ISP_LSC_TABLE_DATA(pconfig->r_data_tbl[i + j], 0);
|
||||
rkisp_write(params_vdev->dev, ISP_LSC_R_TABLE_DATA, data, true);
|
||||
|
||||
data = ISP_ISP_LSC_TABLE_DATA(
|
||||
pconfig->gr_data_tbl[i + j],
|
||||
0);
|
||||
rkisp_write(params_vdev->dev, ISP_LSC_GR_TABLE_DATA, data, is_direct);
|
||||
data = ISP_ISP_LSC_TABLE_DATA(pconfig->gr_data_tbl[i + j], 0);
|
||||
rkisp_write(params_vdev->dev, ISP_LSC_GR_TABLE_DATA, data, true);
|
||||
|
||||
data = ISP_ISP_LSC_TABLE_DATA(
|
||||
pconfig->gb_data_tbl[i + j],
|
||||
0);
|
||||
rkisp_write(params_vdev->dev, ISP_LSC_GB_TABLE_DATA, data, is_direct);
|
||||
data = ISP_ISP_LSC_TABLE_DATA(pconfig->gb_data_tbl[i + j], 0);
|
||||
rkisp_write(params_vdev->dev, ISP_LSC_GB_TABLE_DATA, data, true);
|
||||
|
||||
data = ISP_ISP_LSC_TABLE_DATA(
|
||||
pconfig->b_data_tbl[i + j],
|
||||
0);
|
||||
rkisp_write(params_vdev->dev, ISP_LSC_B_TABLE_DATA, data, is_direct);
|
||||
data = ISP_ISP_LSC_TABLE_DATA(pconfig->b_data_tbl[i + j], 0);
|
||||
rkisp_write(params_vdev->dev, ISP_LSC_B_TABLE_DATA, data, true);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -598,8 +590,7 @@ static void
|
||||
isp_lsc_config(struct rkisp_isp_params_vdev *params_vdev,
|
||||
const struct isp2x_lsc_cfg *arg)
|
||||
{
|
||||
struct rkisp_isp_params_val_v21 *priv_val =
|
||||
(struct rkisp_isp_params_val_v21 *)params_vdev->priv_val;
|
||||
struct isp21_isp_params_cfg *params_rec = params_vdev->isp21_params;
|
||||
struct rkisp_device *dev = params_vdev->dev;
|
||||
unsigned int data;
|
||||
u32 lsc_ctrl;
|
||||
@@ -607,10 +598,17 @@ isp_lsc_config(struct rkisp_isp_params_vdev *params_vdev,
|
||||
|
||||
/* To config must be off , store the current status firstly */
|
||||
lsc_ctrl = rkisp_ioread32(params_vdev, ISP_LSC_CTRL);
|
||||
isp_param_clear_bits(params_vdev, ISP_LSC_CTRL,
|
||||
ISP_LSC_EN);
|
||||
isp_param_clear_bits(params_vdev, ISP_LSC_CTRL, ISP_LSC_EN);
|
||||
/* online mode lsc lut load from ddr quick for some sensor VB short
|
||||
* readback mode lsc lut AHB config to sram, once for single device,
|
||||
* need record to switch for multi-device.
|
||||
*/
|
||||
if (!IS_HDR_RDBK(dev->rd_mode))
|
||||
isp_lsc_matrix_cfg_ddr(params_vdev, arg);
|
||||
else if (dev->hw_dev->is_single)
|
||||
isp_lsc_matrix_cfg_sram(params_vdev, arg, false);
|
||||
else
|
||||
params_rec->others.lsc_cfg = *arg;
|
||||
|
||||
for (i = 0; i < 4; i++) {
|
||||
/* program x size tables */
|
||||
@@ -646,8 +644,6 @@ isp_lsc_config(struct rkisp_isp_params_vdev *params_vdev,
|
||||
} else {
|
||||
isp_param_clear_bits(params_vdev, ISP_LSC_CTRL, ISP_LSC_EN);
|
||||
}
|
||||
|
||||
priv_val->cur_lsccfg = *arg;
|
||||
}
|
||||
|
||||
static void
|
||||
@@ -2249,37 +2245,81 @@ isp_rawhstlite_enable(struct rkisp_isp_params_vdev *params_vdev,
|
||||
}
|
||||
|
||||
static void
|
||||
isp_rawhstbig_config(struct rkisp_isp_params_vdev *params_vdev,
|
||||
const struct isp2x_rawhistbig_cfg *arg, u32 blk_no)
|
||||
isp_rawhstbig_cfg_sram(struct rkisp_isp_params_vdev *params_vdev,
|
||||
const struct isp2x_rawhistbig_cfg *arg,
|
||||
u32 blk_no, bool is_check)
|
||||
{
|
||||
u32 i, j;
|
||||
u32 value;
|
||||
u32 hist_ctrl;
|
||||
u32 block_hsize, block_vsize;
|
||||
u32 wnd_num_idx, hist_weight_num;
|
||||
u32 i, j, wnd_num_idx, value;
|
||||
u8 weight15x15[ISP2X_RAWHSTBIG_WEIGHT_REG_SIZE];
|
||||
const u32 hist_wnd_num[] = {
|
||||
5, 5, 15, 15
|
||||
};
|
||||
const u32 hist_wnd_num[] = { 5, 5, 15, 15 };
|
||||
u32 addr;
|
||||
|
||||
switch (blk_no) {
|
||||
case 0:
|
||||
addr = ISP_RAWHIST_BIG1_BASE;
|
||||
break;
|
||||
case 1:
|
||||
addr = ISP_RAWHIST_BIG2_BASE;
|
||||
break;
|
||||
case 2:
|
||||
addr = ISP_RAWHIST_BIG3_BASE;
|
||||
break;
|
||||
case 0:
|
||||
default:
|
||||
addr = ISP_RAWHIST_BIG1_BASE;
|
||||
break;
|
||||
}
|
||||
|
||||
value = ISP2X_RAWHSTBIG_CTRL_EN_MASK;
|
||||
if (is_check &&
|
||||
!(rkisp_ioread32(params_vdev, addr + ISP_RAWHIST_BIG_CTRL) & value))
|
||||
return;
|
||||
|
||||
wnd_num_idx = arg->wnd_num;
|
||||
memset(weight15x15, 0, sizeof(weight15x15));
|
||||
for (i = 0; i < hist_wnd_num[wnd_num_idx]; i++) {
|
||||
for (j = 0; j < hist_wnd_num[wnd_num_idx]; j++) {
|
||||
weight15x15[i * ISP2X_RAWHSTBIG_ROW_NUM + j] =
|
||||
arg->weight[i * hist_wnd_num[wnd_num_idx] + j];
|
||||
}
|
||||
}
|
||||
|
||||
for (i = 0; i < (ISP2X_RAWHSTBIG_WEIGHT_REG_SIZE / 5); i++) {
|
||||
value = ISP2X_RAWHSTBIG_WEIGHT_SET(weight15x15[5 * i + 0],
|
||||
weight15x15[5 * i + 1],
|
||||
weight15x15[5 * i + 2],
|
||||
weight15x15[5 * i + 3],
|
||||
weight15x15[5 * i + 4]);
|
||||
rkisp_write(params_vdev->dev, addr + ISP_RAWHIST_BIG_WEIGHT_BASE,
|
||||
value, true);
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
isp_rawhstbig_config(struct rkisp_isp_params_vdev *params_vdev,
|
||||
const struct isp2x_rawhistbig_cfg *arg, u32 blk_no)
|
||||
{
|
||||
struct isp21_isp_params_cfg *params_rec = params_vdev->isp21_params;
|
||||
struct rkisp_device *dev = params_vdev->dev;
|
||||
struct isp2x_rawhistbig_cfg *arg_rec;
|
||||
u32 hist_ctrl, block_hsize, block_vsize, wnd_num_idx;
|
||||
const u32 hist_wnd_num[] = { 5, 5, 15, 15 };
|
||||
u32 addr;
|
||||
|
||||
switch (blk_no) {
|
||||
case 1:
|
||||
addr = ISP_RAWHIST_BIG2_BASE;
|
||||
arg_rec = ¶ms_rec->meas.rawhist1;
|
||||
break;
|
||||
case 2:
|
||||
addr = ISP_RAWHIST_BIG3_BASE;
|
||||
arg_rec = ¶ms_rec->meas.rawhist2;
|
||||
break;
|
||||
case 0:
|
||||
default:
|
||||
addr = ISP_RAWHIST_BIG1_BASE;
|
||||
arg_rec = ¶ms_rec->meas.rawhist3;
|
||||
break;
|
||||
}
|
||||
|
||||
wnd_num_idx = arg->wnd_num;
|
||||
memset(weight15x15, 0x00, sizeof(weight15x15));
|
||||
/* avoid to override the old enable value */
|
||||
hist_ctrl = rkisp_ioread32(params_vdev, addr + ISP_RAWHIST_BIG_CTRL);
|
||||
hist_ctrl &= ISP2X_RAWHSTBIG_CTRL_EN_MASK;
|
||||
@@ -2309,25 +2349,10 @@ isp_rawhstbig_config(struct rkisp_isp_params_vdev *params_vdev,
|
||||
ISP2X_PACK_4BYTE(arg->rcc, arg->gcc, arg->bcc, arg->off),
|
||||
addr + ISP_RAWHIST_BIG_RAW2Y_CC);
|
||||
|
||||
for (i = 0; i < hist_wnd_num[wnd_num_idx]; i++) {
|
||||
for (j = 0; j < hist_wnd_num[wnd_num_idx]; j++) {
|
||||
weight15x15[i * ISP2X_RAWHSTBIG_ROW_NUM + j] =
|
||||
arg->weight[i * hist_wnd_num[wnd_num_idx] + j];
|
||||
}
|
||||
}
|
||||
|
||||
rkisp_iowrite32(params_vdev, ISP2X_RAWHSTBIG_WRAM_EN, ISP_RAWHIST_BIG_WRAM_CTRL);
|
||||
hist_weight_num = ISP2X_RAWHSTBIG_WEIGHT_REG_SIZE;
|
||||
for (i = 0; i < (hist_weight_num / 5); i++) {
|
||||
value = ISP2X_RAWHSTBIG_WEIGHT_SET(
|
||||
weight15x15[5 * i + 0],
|
||||
weight15x15[5 * i + 1],
|
||||
weight15x15[5 * i + 2],
|
||||
weight15x15[5 * i + 3],
|
||||
weight15x15[5 * i + 4]);
|
||||
rkisp_iowrite32(params_vdev, value,
|
||||
addr + ISP_RAWHIST_BIG_WEIGHT_BASE);
|
||||
}
|
||||
if (dev->hw_dev->is_single)
|
||||
isp_rawhstbig_cfg_sram(params_vdev, arg, blk_no, false);
|
||||
else
|
||||
*arg_rec = *arg;
|
||||
}
|
||||
|
||||
static void
|
||||
@@ -3677,12 +3702,14 @@ void __isp_config_hdrshd(struct rkisp_isp_params_vdev *params_vdev)
|
||||
}
|
||||
|
||||
static
|
||||
void rkisp_params_cfgsram_v2x(struct rkisp_isp_params_vdev *params_vdev)
|
||||
void rkisp_params_cfgsram_v21(struct rkisp_isp_params_vdev *params_vdev)
|
||||
{
|
||||
struct rkisp_isp_params_val_v21 *priv_val =
|
||||
(struct rkisp_isp_params_val_v21 *)params_vdev->priv_val;
|
||||
struct isp21_isp_params_cfg *params = params_vdev->isp21_params;
|
||||
|
||||
isp_lsc_matrix_cfg_sram(params_vdev, &priv_val->cur_lsccfg, true);
|
||||
isp_lsc_matrix_cfg_sram(params_vdev, ¶ms->others.lsc_cfg, true);
|
||||
isp_rawhstbig_cfg_sram(params_vdev, ¶ms->meas.rawhist1, 1, true);
|
||||
isp_rawhstbig_cfg_sram(params_vdev, ¶ms->meas.rawhist2, 2, true);
|
||||
isp_rawhstbig_cfg_sram(params_vdev, ¶ms->meas.rawhist3, 0, true);
|
||||
}
|
||||
|
||||
static void
|
||||
@@ -4071,7 +4098,7 @@ static struct rkisp_isp_params_ops rkisp_isp_params_ops_tbl = {
|
||||
.disable_isp = rkisp_params_disable_isp_v2x,
|
||||
.isr_hdl = rkisp_params_isr_v2x,
|
||||
.param_cfg = rkisp_params_cfg_v2x,
|
||||
.param_cfgsram = rkisp_params_cfgsram_v2x,
|
||||
.param_cfgsram = rkisp_params_cfgsram_v21,
|
||||
.get_meshbuf_inf = rkisp_params_get_ldchbuf_inf_v2x,
|
||||
.set_meshbuf_size = rkisp_params_set_ldchbuf_size_v2x,
|
||||
.stream_stop = rkisp_params_stream_stop_v2x,
|
||||
|
||||
@@ -156,7 +156,6 @@ struct rkisp_isp_params_val_v21 {
|
||||
struct isp21_drc_cfg last_hdrdrc;
|
||||
struct isp2x_hdrmge_cfg cur_hdrmge;
|
||||
struct isp21_drc_cfg cur_hdrdrc;
|
||||
struct isp2x_lsc_cfg cur_lsccfg;
|
||||
|
||||
u8 dhaz_en;
|
||||
u8 wdr_en;
|
||||
|
||||
@@ -532,18 +532,22 @@ isp_sihst_enable(struct rkisp_isp_params_vdev *params_vdev,
|
||||
|
||||
static void __maybe_unused
|
||||
isp_lsc_matrix_cfg_sram(struct rkisp_isp_params_vdev *params_vdev,
|
||||
const struct isp2x_lsc_cfg *pconfig, bool is_direct)
|
||||
const struct isp2x_lsc_cfg *pconfig, bool is_check)
|
||||
{
|
||||
int i, j;
|
||||
unsigned int sram_addr;
|
||||
unsigned int data;
|
||||
|
||||
if (is_check &&
|
||||
!(rkisp_ioread32(params_vdev, ISP_LSC_CTRL) & ISP_LSC_EN))
|
||||
return;
|
||||
|
||||
/* CIF_ISP_LSC_TABLE_ADDRESS_153 = ( 17 * 18 ) >> 1 */
|
||||
sram_addr = CIF_ISP_LSC_TABLE_ADDRESS_0;
|
||||
rkisp_write(params_vdev->dev, ISP_LSC_R_TABLE_ADDR, sram_addr, is_direct);
|
||||
rkisp_write(params_vdev->dev, ISP_LSC_GR_TABLE_ADDR, sram_addr, is_direct);
|
||||
rkisp_write(params_vdev->dev, ISP_LSC_GB_TABLE_ADDR, sram_addr, is_direct);
|
||||
rkisp_write(params_vdev->dev, ISP_LSC_B_TABLE_ADDR, sram_addr, is_direct);
|
||||
rkisp_write(params_vdev->dev, ISP_LSC_R_TABLE_ADDR, sram_addr, true);
|
||||
rkisp_write(params_vdev->dev, ISP_LSC_GR_TABLE_ADDR, sram_addr, true);
|
||||
rkisp_write(params_vdev->dev, ISP_LSC_GB_TABLE_ADDR, sram_addr, true);
|
||||
rkisp_write(params_vdev->dev, ISP_LSC_B_TABLE_ADDR, sram_addr, true);
|
||||
|
||||
/* program data tables (table size is 9 * 17 = 153) */
|
||||
for (i = 0; i < CIF_ISP_LSC_SECTORS_MAX * CIF_ISP_LSC_SECTORS_MAX;
|
||||
@@ -553,46 +557,34 @@ isp_lsc_matrix_cfg_sram(struct rkisp_isp_params_vdev *params_vdev,
|
||||
* DWORDs (2nd value of last DWORD unused)
|
||||
*/
|
||||
for (j = 0; j < CIF_ISP_LSC_SECTORS_MAX - 1; j += 2) {
|
||||
data = ISP_ISP_LSC_TABLE_DATA(
|
||||
pconfig->r_data_tbl[i + j],
|
||||
pconfig->r_data_tbl[i + j + 1]);
|
||||
rkisp_write(params_vdev->dev, ISP_LSC_R_TABLE_DATA, data, is_direct);
|
||||
data = ISP_ISP_LSC_TABLE_DATA(pconfig->r_data_tbl[i + j],
|
||||
pconfig->r_data_tbl[i + j + 1]);
|
||||
rkisp_write(params_vdev->dev, ISP_LSC_R_TABLE_DATA, data, true);
|
||||
|
||||
data = ISP_ISP_LSC_TABLE_DATA(
|
||||
pconfig->gr_data_tbl[i + j],
|
||||
pconfig->gr_data_tbl[i + j + 1]);
|
||||
rkisp_write(params_vdev->dev, ISP_LSC_GR_TABLE_DATA, data, is_direct);
|
||||
data = ISP_ISP_LSC_TABLE_DATA(pconfig->gr_data_tbl[i + j],
|
||||
pconfig->gr_data_tbl[i + j + 1]);
|
||||
rkisp_write(params_vdev->dev, ISP_LSC_GR_TABLE_DATA, data, true);
|
||||
|
||||
data = ISP_ISP_LSC_TABLE_DATA(
|
||||
pconfig->gb_data_tbl[i + j],
|
||||
pconfig->gb_data_tbl[i + j + 1]);
|
||||
rkisp_write(params_vdev->dev, ISP_LSC_GB_TABLE_DATA, data, is_direct);
|
||||
data = ISP_ISP_LSC_TABLE_DATA(pconfig->gb_data_tbl[i + j],
|
||||
pconfig->gb_data_tbl[i + j + 1]);
|
||||
rkisp_write(params_vdev->dev, ISP_LSC_GB_TABLE_DATA, data, true);
|
||||
|
||||
data = ISP_ISP_LSC_TABLE_DATA(
|
||||
pconfig->b_data_tbl[i + j],
|
||||
pconfig->b_data_tbl[i + j + 1]);
|
||||
rkisp_write(params_vdev->dev, ISP_LSC_B_TABLE_DATA, data, is_direct);
|
||||
data = ISP_ISP_LSC_TABLE_DATA(pconfig->b_data_tbl[i + j],
|
||||
pconfig->b_data_tbl[i + j + 1]);
|
||||
rkisp_write(params_vdev->dev, ISP_LSC_B_TABLE_DATA, data, true);
|
||||
}
|
||||
|
||||
data = ISP_ISP_LSC_TABLE_DATA(
|
||||
pconfig->r_data_tbl[i + j],
|
||||
0);
|
||||
rkisp_write(params_vdev->dev, ISP_LSC_R_TABLE_DATA, data, is_direct);
|
||||
data = ISP_ISP_LSC_TABLE_DATA(pconfig->r_data_tbl[i + j], 0);
|
||||
rkisp_write(params_vdev->dev, ISP_LSC_R_TABLE_DATA, data, true);
|
||||
|
||||
data = ISP_ISP_LSC_TABLE_DATA(
|
||||
pconfig->gr_data_tbl[i + j],
|
||||
0);
|
||||
rkisp_write(params_vdev->dev, ISP_LSC_GR_TABLE_DATA, data, is_direct);
|
||||
data = ISP_ISP_LSC_TABLE_DATA(pconfig->gr_data_tbl[i + j], 0);
|
||||
rkisp_write(params_vdev->dev, ISP_LSC_GR_TABLE_DATA, data, true);
|
||||
|
||||
data = ISP_ISP_LSC_TABLE_DATA(
|
||||
pconfig->gb_data_tbl[i + j],
|
||||
0);
|
||||
rkisp_write(params_vdev->dev, ISP_LSC_GB_TABLE_DATA, data, is_direct);
|
||||
data = ISP_ISP_LSC_TABLE_DATA(pconfig->gb_data_tbl[i + j], 0);
|
||||
rkisp_write(params_vdev->dev, ISP_LSC_GB_TABLE_DATA, data, true);
|
||||
|
||||
data = ISP_ISP_LSC_TABLE_DATA(
|
||||
pconfig->b_data_tbl[i + j],
|
||||
0);
|
||||
rkisp_write(params_vdev->dev, ISP_LSC_B_TABLE_DATA, data, is_direct);
|
||||
data = ISP_ISP_LSC_TABLE_DATA(pconfig->b_data_tbl[i + j], 0);
|
||||
rkisp_write(params_vdev->dev, ISP_LSC_B_TABLE_DATA, data, true);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -674,8 +666,7 @@ static void
|
||||
isp_lsc_config(struct rkisp_isp_params_vdev *params_vdev,
|
||||
const struct isp2x_lsc_cfg *arg)
|
||||
{
|
||||
struct rkisp_isp_params_val_v2x *priv_val =
|
||||
(struct rkisp_isp_params_val_v2x *)params_vdev->priv_val;
|
||||
struct isp2x_isp_params_cfg *params_rec = params_vdev->isp2x_params;
|
||||
struct rkisp_device *dev = params_vdev->dev;
|
||||
unsigned int data;
|
||||
u32 lsc_ctrl;
|
||||
@@ -683,10 +674,17 @@ isp_lsc_config(struct rkisp_isp_params_vdev *params_vdev,
|
||||
|
||||
/* To config must be off , store the current status firstly */
|
||||
lsc_ctrl = rkisp_ioread32(params_vdev, ISP_LSC_CTRL);
|
||||
isp_param_clear_bits(params_vdev, ISP_LSC_CTRL,
|
||||
ISP_LSC_EN);
|
||||
isp_param_clear_bits(params_vdev, ISP_LSC_CTRL, ISP_LSC_EN);
|
||||
/* online mode lsc lut load from ddr quick for some sensor VB short
|
||||
* readback mode lsc lut AHB config to sram, once for single device,
|
||||
* need record to switch for multi-device.
|
||||
*/
|
||||
if (!IS_HDR_RDBK(dev->rd_mode))
|
||||
isp_lsc_matrix_cfg_ddr(params_vdev, arg);
|
||||
else if (dev->hw_dev->is_single)
|
||||
isp_lsc_matrix_cfg_sram(params_vdev, arg, false);
|
||||
else
|
||||
params_rec->others.lsc_cfg = *arg;
|
||||
|
||||
for (i = 0; i < 4; i++) {
|
||||
/* program x size tables */
|
||||
@@ -722,8 +720,6 @@ isp_lsc_config(struct rkisp_isp_params_vdev *params_vdev,
|
||||
} else {
|
||||
isp_param_clear_bits(params_vdev, ISP_LSC_CTRL, ISP_LSC_EN);
|
||||
}
|
||||
|
||||
priv_val->cur_lsccfg = *arg;
|
||||
}
|
||||
|
||||
static void
|
||||
@@ -2807,37 +2803,82 @@ isp_rawhstlite_enable(struct rkisp_isp_params_vdev *params_vdev,
|
||||
}
|
||||
|
||||
static void
|
||||
isp_rawhstbig_config(struct rkisp_isp_params_vdev *params_vdev,
|
||||
const struct isp2x_rawhistbig_cfg *arg, u32 blk_no)
|
||||
isp_rawhstbig_cfg_sram(struct rkisp_isp_params_vdev *params_vdev,
|
||||
const struct isp2x_rawhistbig_cfg *arg,
|
||||
u32 blk_no, bool is_check)
|
||||
{
|
||||
u32 i, j;
|
||||
u32 value;
|
||||
u32 hist_ctrl;
|
||||
u32 block_hsize, block_vsize;
|
||||
u32 wnd_num_idx, hist_weight_num;
|
||||
u32 i, j, wnd_num_idx, value;
|
||||
u8 weight15x15[ISP2X_RAWHSTBIG_WEIGHT_REG_SIZE];
|
||||
const u32 hist_wnd_num[] = {
|
||||
5, 5, 15, 15
|
||||
};
|
||||
const u32 hist_wnd_num[] = { 5, 5, 15, 15 };
|
||||
u32 addr;
|
||||
|
||||
switch (blk_no) {
|
||||
case 0:
|
||||
addr = ISP_RAWHIST_BIG1_BASE;
|
||||
break;
|
||||
case 1:
|
||||
addr = ISP_RAWHIST_BIG2_BASE;
|
||||
break;
|
||||
case 2:
|
||||
addr = ISP_RAWHIST_BIG3_BASE;
|
||||
break;
|
||||
case 0:
|
||||
default:
|
||||
addr = ISP_RAWHIST_BIG1_BASE;
|
||||
break;
|
||||
}
|
||||
|
||||
value = ISP2X_RAWHSTBIG_CTRL_EN_MASK;
|
||||
if (is_check &&
|
||||
!(rkisp_ioread32(params_vdev, addr + ISP_RAWHIST_BIG_CTRL) & value))
|
||||
return;
|
||||
|
||||
wnd_num_idx = arg->wnd_num;
|
||||
memset(weight15x15, 0, sizeof(weight15x15));
|
||||
for (i = 0; i < hist_wnd_num[wnd_num_idx]; i++) {
|
||||
for (j = 0; j < hist_wnd_num[wnd_num_idx]; j++) {
|
||||
weight15x15[i * ISP2X_RAWHSTBIG_ROW_NUM + j] =
|
||||
arg->weight[i * hist_wnd_num[wnd_num_idx] + j];
|
||||
}
|
||||
}
|
||||
|
||||
for (i = 0; i < (ISP2X_RAWHSTBIG_WEIGHT_REG_SIZE / 5); i++) {
|
||||
value = ISP2X_RAWHSTBIG_WEIGHT_SET(weight15x15[5 * i + 0],
|
||||
weight15x15[5 * i + 1],
|
||||
weight15x15[5 * i + 2],
|
||||
weight15x15[5 * i + 3],
|
||||
weight15x15[5 * i + 4]);
|
||||
rkisp_write(params_vdev->dev,
|
||||
addr + ISP_RAWHIST_BIG_WEIGHT_BASE,
|
||||
value, true);
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
isp_rawhstbig_config(struct rkisp_isp_params_vdev *params_vdev,
|
||||
const struct isp2x_rawhistbig_cfg *arg, u32 blk_no)
|
||||
{
|
||||
struct isp2x_isp_params_cfg *params_rec = params_vdev->isp2x_params;
|
||||
struct rkisp_device *dev = params_vdev->dev;
|
||||
struct isp2x_rawhistbig_cfg *arg_rec;
|
||||
u32 hist_ctrl, block_hsize, block_vsize, wnd_num_idx;
|
||||
const u32 hist_wnd_num[] = { 5, 5, 15, 15 };
|
||||
u32 addr;
|
||||
|
||||
switch (blk_no) {
|
||||
case 1:
|
||||
addr = ISP_RAWHIST_BIG2_BASE;
|
||||
arg_rec = ¶ms_rec->meas.rawhist1;
|
||||
break;
|
||||
case 2:
|
||||
addr = ISP_RAWHIST_BIG3_BASE;
|
||||
arg_rec = ¶ms_rec->meas.rawhist2;
|
||||
break;
|
||||
case 0:
|
||||
default:
|
||||
addr = ISP_RAWHIST_BIG1_BASE;
|
||||
arg_rec = ¶ms_rec->meas.rawhist3;
|
||||
break;
|
||||
}
|
||||
|
||||
wnd_num_idx = arg->wnd_num;
|
||||
memset(weight15x15, 0x00, sizeof(weight15x15));
|
||||
/* avoid to override the old enable value */
|
||||
hist_ctrl = rkisp_ioread32(params_vdev, addr + ISP_RAWHIST_BIG_CTRL);
|
||||
hist_ctrl &= ISP2X_RAWHSTBIG_CTRL_EN_MASK;
|
||||
@@ -2867,25 +2908,10 @@ isp_rawhstbig_config(struct rkisp_isp_params_vdev *params_vdev,
|
||||
ISP2X_PACK_4BYTE(arg->rcc, arg->gcc, arg->bcc, arg->off),
|
||||
addr + ISP_RAWHIST_BIG_RAW2Y_CC);
|
||||
|
||||
for (i = 0; i < hist_wnd_num[wnd_num_idx]; i++) {
|
||||
for (j = 0; j < hist_wnd_num[wnd_num_idx]; j++) {
|
||||
weight15x15[i * ISP2X_RAWHSTBIG_ROW_NUM + j] =
|
||||
arg->weight[i * hist_wnd_num[wnd_num_idx] + j];
|
||||
}
|
||||
}
|
||||
|
||||
rkisp_iowrite32(params_vdev, ISP2X_RAWHSTBIG_WRAM_EN, ISP_RAWHIST_BIG_WRAM_CTRL);
|
||||
hist_weight_num = ISP2X_RAWHSTBIG_WEIGHT_REG_SIZE;
|
||||
for (i = 0; i < (hist_weight_num / 5); i++) {
|
||||
value = ISP2X_RAWHSTBIG_WEIGHT_SET(
|
||||
weight15x15[5 * i + 0],
|
||||
weight15x15[5 * i + 1],
|
||||
weight15x15[5 * i + 2],
|
||||
weight15x15[5 * i + 3],
|
||||
weight15x15[5 * i + 4]);
|
||||
rkisp_iowrite32(params_vdev, value,
|
||||
addr + ISP_RAWHIST_BIG_WEIGHT_BASE);
|
||||
}
|
||||
if (dev->hw_dev->is_single)
|
||||
isp_rawhstbig_cfg_sram(params_vdev, arg, blk_no, false);
|
||||
else
|
||||
*arg_rec = *arg;
|
||||
}
|
||||
|
||||
static void
|
||||
@@ -4014,10 +4040,12 @@ void __isp_config_hdrshd(struct rkisp_isp_params_vdev *params_vdev)
|
||||
static
|
||||
void rkisp_params_cfgsram_v2x(struct rkisp_isp_params_vdev *params_vdev)
|
||||
{
|
||||
struct rkisp_isp_params_val_v2x *priv_val =
|
||||
(struct rkisp_isp_params_val_v2x *)params_vdev->priv_val;
|
||||
struct isp2x_isp_params_cfg *params = params_vdev->isp2x_params;
|
||||
|
||||
isp_lsc_matrix_cfg_sram(params_vdev, &priv_val->cur_lsccfg, true);
|
||||
isp_lsc_matrix_cfg_sram(params_vdev, ¶ms->others.lsc_cfg, true);
|
||||
isp_rawhstbig_cfg_sram(params_vdev, ¶ms->meas.rawhist1, 1, true);
|
||||
isp_rawhstbig_cfg_sram(params_vdev, ¶ms->meas.rawhist2, 2, true);
|
||||
isp_rawhstbig_cfg_sram(params_vdev, ¶ms->meas.rawhist3, 0, true);
|
||||
}
|
||||
|
||||
/* Not called when the camera active, thus not isr protection. */
|
||||
|
||||
@@ -333,7 +333,6 @@ struct rkisp_isp_params_val_v2x {
|
||||
struct isp2x_hdrmge_cfg last_hdrmge;
|
||||
struct isp2x_hdrtmo_cfg cur_hdrtmo;
|
||||
struct isp2x_hdrmge_cfg cur_hdrmge;
|
||||
struct isp2x_lsc_cfg cur_lsccfg;
|
||||
|
||||
u8 dhaz_en;
|
||||
u8 wdr_en;
|
||||
|
||||
Reference in New Issue
Block a user