mirror of
https://github.com/hardkernel/linux.git
synced 2026-06-07 03:15:31 +09:00
media: rockchip: isp: fix w3a with aiisp for isp35
Change-Id: I17fd6a32670a609bac13cc4ccb0df92eff364817 Signed-off-by: Cai YiWei <cyw@rock-chips.com>
This commit is contained in:
@@ -918,6 +918,7 @@ static void
|
||||
isp_rawaf_config(struct rkisp_isp_params_vdev *params_vdev,
|
||||
const struct isp35_rawaf_meas_cfg *arg, u32 id)
|
||||
{
|
||||
struct rkisp_isp_params_val_v35 *priv = params_vdev->priv_val;
|
||||
struct rkisp_device *dev = params_vdev->dev;
|
||||
struct v4l2_rect *out_crop = &dev->isp_sdev.out_crop;
|
||||
u32 width = out_crop->width, height = out_crop->height;
|
||||
@@ -1069,6 +1070,11 @@ isp_rawaf_config(struct rkisp_isp_params_vdev *params_vdev,
|
||||
ctrl &= ~(ISP3X_RAWAF_SEL(3) | ISP32L_BNR2AF_SEL);
|
||||
ctrl |= ISP3X_RAWAF_SEL(arg->rawaf_sel) | !!arg->bnr2af_sel << 28;
|
||||
isp3_param_write(params_vdev, ctrl, ISP3X_VI_ISP_PATH, id);
|
||||
priv->is_af_fe = true;
|
||||
if (arg->from_ynr ||
|
||||
(arg->bnr2af_sel && arg->bnr_be_sel) ||
|
||||
(!arg->bnr2af_sel && arg->rawaf_sel == 3))
|
||||
priv->is_af_fe = false;
|
||||
}
|
||||
|
||||
static void
|
||||
@@ -1243,6 +1249,7 @@ static void
|
||||
isp_rawawb_config(struct rkisp_isp_params_vdev *params_vdev,
|
||||
const struct isp35_rawawb_meas_cfg *arg, u32 id)
|
||||
{
|
||||
struct rkisp_isp_params_val_v35 *priv = params_vdev->priv_val;
|
||||
struct rkisp_device *dev = params_vdev->dev;
|
||||
struct v4l2_rect *out_crop = &dev->isp_sdev.out_crop;
|
||||
struct isp35_isp_params_cfg *params_rec = params_vdev->isp35_params + id;
|
||||
@@ -1293,8 +1300,6 @@ isp_rawawb_config(struct rkisp_isp_params_vdev *params_vdev,
|
||||
!!arg->blk_measure_xytype << 2 |
|
||||
!!arg->blk_measure_mode << 1 |
|
||||
!!arg->blk_measure_enable;
|
||||
if (dev->is_aiisp_en)
|
||||
value |= ISP35_RAWAWB_BNR_BE_SEL;
|
||||
isp3_param_write(params_vdev, value, ISP3X_RAWAWB_BLK_CTRL, id);
|
||||
|
||||
h_offs = arg->h_offs & ~0x1;
|
||||
@@ -1944,6 +1949,10 @@ isp_rawawb_config(struct rkisp_isp_params_vdev *params_vdev,
|
||||
value |= val;
|
||||
isp3_param_write(params_vdev, value, ISP3X_VI_ISP_PATH, id);
|
||||
}
|
||||
priv->is_awb_fe = true;
|
||||
if (arg->drc2awb_sel ||
|
||||
(arg->bnr2awb_sel && arg->bnr_be_sel))
|
||||
priv->is_awb_fe = false;
|
||||
}
|
||||
|
||||
static void
|
||||
@@ -2109,6 +2118,7 @@ static void
|
||||
isp_aiawb_config(struct rkisp_isp_params_vdev *params_vdev,
|
||||
const struct isp35_aiawb_meas_cfg *arg, u32 id)
|
||||
{
|
||||
struct rkisp_isp_params_val_v35 *priv = params_vdev->priv_val;
|
||||
const struct isp2x_bls_fixed_val *pval = &arg->bls3_val;
|
||||
u32 value;
|
||||
|
||||
@@ -2145,9 +2155,9 @@ isp_aiawb_config(struct rkisp_isp_params_vdev *params_vdev,
|
||||
isp3_param_write(params_vdev, value, ISP3X_BLS_CTRL, id);
|
||||
|
||||
value = isp3_param_read(params_vdev, ISP39_W3A_CTRL0, id);
|
||||
if ((!arg->rawout_sel && !(value & ISP35_W3A_RAWLSC_SEL)) ||
|
||||
(arg->rawout_sel && value & ISP35_W3A_RAWLSC_SEL)) {
|
||||
if (arg->rawout_sel)
|
||||
if ((!arg->path_sel && !(value & ISP35_W3A_RAWLSC_SEL)) ||
|
||||
(arg->path_sel && value & ISP35_W3A_RAWLSC_SEL)) {
|
||||
if (arg->path_sel)
|
||||
value &= ~ISP35_W3A_RAWLSC_SEL;
|
||||
else
|
||||
value |= ISP35_W3A_RAWLSC_SEL;
|
||||
@@ -2163,6 +2173,11 @@ isp_aiawb_config(struct rkisp_isp_params_vdev *params_vdev,
|
||||
(arg->path_sel & 0x7) << 8 |
|
||||
(arg->in_shift & 0xf) << 12;
|
||||
isp3_param_write(params_vdev, value, ISP35_AIAWB_CTRL0, id);
|
||||
priv->is_aiawb_fe = true;
|
||||
if (arg->path_sel == 2 || arg->path_sel == 3)
|
||||
priv->is_aiawb_fe = false;
|
||||
else if (arg->path_sel == 4)
|
||||
priv->is_aiawb_fe = priv->is_awb_fe;
|
||||
|
||||
value = arg->exp_thr | (arg->saturation_hthr & 0xfff) << 8 |
|
||||
(arg->saturation_lthr & 0x7ff) << 20 | !!arg->exp1_check_en << 31;
|
||||
@@ -4732,38 +4747,67 @@ void __isp_isr_meas_config(struct rkisp_isp_params_vdev *params_vdev,
|
||||
struct isp35_isp_params_cfg *new_params,
|
||||
enum rkisp_params_type type, u32 id)
|
||||
{
|
||||
struct rkisp_isp_params_val_v35 *priv = params_vdev->priv_val;
|
||||
struct rkisp_device *dev = params_vdev->dev;
|
||||
u64 module_cfg_update = new_params->module_cfg_update;
|
||||
bool is_ae0_cfg = !!(module_cfg_update & ISP35_MODULE_RAWAE0);
|
||||
bool is_hist0_cfg = !!(module_cfg_update & ISP35_MODULE_RAWHIST0);
|
||||
bool is_ae3_cfg = !!(module_cfg_update & ISP35_MODULE_RAWAE3);
|
||||
bool is_hist3_cfg = !!(module_cfg_update & ISP35_MODULE_RAWHIST3);
|
||||
bool is_af_cfg = !!(module_cfg_update & ISP35_MODULE_RAWAF);
|
||||
bool is_awb_cfg = !!(module_cfg_update & ISP35_MODULE_RAWAWB);
|
||||
bool is_aiawb_cfg = !!(module_cfg_update & ISP35_MODULE_AIAWB);
|
||||
|
||||
v4l2_dbg(4, rkisp_debug, &dev->v4l2_dev,
|
||||
"%s id:%d seq:%d type:%d module_cfg_update:0x%llx\n",
|
||||
__func__, id, new_params->frame_id, type, module_cfg_update);
|
||||
|
||||
if (!dev->is_aiisp_en || type != RKISP_PARAMS_LAT) {
|
||||
if (module_cfg_update & ISP35_MODULE_RAWAE0)
|
||||
isp_rawae0_config(params_vdev, &new_params->meas.rawae0, id);
|
||||
if (module_cfg_update & ISP35_MODULE_RAWHIST0)
|
||||
isp_rawhist0_config(params_vdev, &new_params->meas.rawhist0, id);
|
||||
if ((module_cfg_update & ISP35_MODULE_RAWAF))
|
||||
isp_rawaf_config(params_vdev, &new_params->meas.rawaf, id);
|
||||
if (dev->is_aiisp_en && type == RKISP_PARAMS_IMD) {
|
||||
params_vdev->cur_fe_frame_id = new_params->frame_id;
|
||||
return;
|
||||
if (dev->is_aiisp_en && type != RKISP_PARAMS_ALL) {
|
||||
if ((priv->is_ae0_fe && type == RKISP_PARAMS_LAT) ||
|
||||
(!priv->is_ae0_fe && type == RKISP_PARAMS_IMD)) {
|
||||
is_ae0_cfg = false;
|
||||
is_hist0_cfg = false;
|
||||
}
|
||||
if ((priv->is_ae3_fe && type == RKISP_PARAMS_LAT) ||
|
||||
(!priv->is_ae3_fe && type == RKISP_PARAMS_IMD)) {
|
||||
is_ae3_cfg = false;
|
||||
is_hist3_cfg = false;
|
||||
}
|
||||
if ((priv->is_af_fe && type == RKISP_PARAMS_LAT) ||
|
||||
(!priv->is_af_fe && type == RKISP_PARAMS_IMD))
|
||||
is_af_cfg = false;
|
||||
if ((priv->is_awb_fe && type == RKISP_PARAMS_LAT) ||
|
||||
(!priv->is_awb_fe && type == RKISP_PARAMS_IMD))
|
||||
is_awb_cfg = false;
|
||||
if ((priv->is_aiawb_fe && type == RKISP_PARAMS_LAT) ||
|
||||
(!priv->is_aiawb_fe && type == RKISP_PARAMS_IMD))
|
||||
is_aiawb_cfg = false;
|
||||
}
|
||||
|
||||
if (is_ae0_cfg)
|
||||
isp_rawae0_config(params_vdev, &new_params->meas.rawae0, id);
|
||||
if (is_hist0_cfg)
|
||||
isp_rawhist0_config(params_vdev, &new_params->meas.rawhist0, id);
|
||||
if (is_ae3_cfg)
|
||||
isp_rawae3_config(params_vdev, &new_params->meas.rawae3, id);
|
||||
if (is_hist3_cfg)
|
||||
isp_rawhist3_config(params_vdev, &new_params->meas.rawhist3, id);
|
||||
if (is_af_cfg)
|
||||
isp_rawaf_config(params_vdev, &new_params->meas.rawaf, id);
|
||||
if (is_awb_cfg)
|
||||
isp_rawawb_config(params_vdev, &new_params->meas.rawawb, id);
|
||||
if (is_aiawb_cfg)
|
||||
isp_aiawb_config(params_vdev, &new_params->meas.aiawb, id);
|
||||
|
||||
if (dev->is_aiisp_en && type == RKISP_PARAMS_IMD) {
|
||||
params_vdev->cur_fe_frame_id = new_params->frame_id;
|
||||
return;
|
||||
}
|
||||
|
||||
params_vdev->cur_frame_id = new_params->frame_id;
|
||||
params_vdev->exposure = new_params->exposure;
|
||||
|
||||
if (module_cfg_update & ISP35_MODULE_RAWAE3)
|
||||
isp_rawae3_config(params_vdev, &new_params->meas.rawae3, id);
|
||||
if (module_cfg_update & ISP35_MODULE_RAWHIST3)
|
||||
isp_rawhist3_config(params_vdev, &new_params->meas.rawhist3, id);
|
||||
if (module_cfg_update & ISP35_MODULE_AIAWB)
|
||||
isp_aiawb_config(params_vdev, &new_params->meas.aiawb, id);
|
||||
if (module_cfg_update & ISP35_MODULE_AWBSYNC)
|
||||
isp_awbsync_config(params_vdev, &new_params->meas.awbsync, id);
|
||||
if (module_cfg_update & ISP35_MODULE_RAWAWB)
|
||||
isp_rawawb_config(params_vdev, &new_params->meas.rawawb, id);
|
||||
}
|
||||
|
||||
static __maybe_unused
|
||||
@@ -4867,8 +4911,12 @@ rkisp_params_first_cfg_v35(struct rkisp_isp_params_vdev *params_vdev)
|
||||
spin_unlock_irqrestore(¶ms_vdev->config_lock, flags);
|
||||
|
||||
if (dev->hw_dev->is_single && (dev->isp_state & ISP_START)) {
|
||||
rkisp_set_bits(dev, ISP3X_ISP_CTRL0, 0, CIF_ISP_CTRL_ISP_CFG_UPD, true);
|
||||
rkisp_clear_reg_cache_bits(dev, CIF_ISP_CTRL, CIF_ISP_CTRL_ISP_CFG_UPD);
|
||||
u32 val = CIF_ISP_CTRL_ISP_CFG_UPD;
|
||||
|
||||
if (dev->is_aiisp_en)
|
||||
val |= ISP35_ISP_CFG_UPD_FE;
|
||||
rkisp_set_bits(dev, ISP3X_ISP_CTRL0, 0, val, true);
|
||||
rkisp_clear_reg_cache_bits(dev, CIF_ISP_CTRL, val);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -93,6 +93,9 @@ struct rkisp_isp_params_val_v35 {
|
||||
bool yraw_sel;
|
||||
bool is_ae0_fe;
|
||||
bool is_ae3_fe;
|
||||
bool is_af_fe;
|
||||
bool is_awb_fe;
|
||||
bool is_aiawb_fe;
|
||||
};
|
||||
|
||||
#if IS_ENABLED(CONFIG_VIDEO_ROCKCHIP_ISP_VERSION_V35)
|
||||
|
||||
@@ -288,6 +288,10 @@ rkisp_stats_get_aiawb_stats(struct rkisp_isp_stats_vdev *stats_vdev,
|
||||
rkisp_write(dev, ISP35_AIAWB_WR_BASE, val, false);
|
||||
rkisp_write(dev, ISP35_AIAWB_CTRL0, ctrl | ISP35_AIAWB_SELF_UPD, false);
|
||||
priv_val->buf_aiawb_idx = buf_idx;
|
||||
v4l2_dbg(4, rkisp_debug, &stats_vdev->dev->v4l2_dev,
|
||||
"aiawb idx:%d next(id:%d 0x%x)\n",
|
||||
pbuf->stat.buf_aiawb_index, buf_idx,
|
||||
isp3_stats_read(stats_vdev, ISP35_AIAWB_WR_BASE_SHD));
|
||||
}
|
||||
|
||||
static void
|
||||
@@ -412,8 +416,7 @@ rkisp_stats_send_meas_fe(struct rkisp_isp_stats_vdev *stats_vdev)
|
||||
struct rkisp_buffer *cur_buf = NULL;
|
||||
unsigned long flags = 0;
|
||||
u32 cur_frame_id, size = stats_vdev->vdev_fmt.fmt.meta.buffersize;
|
||||
u32 val, ris = isp3_stats_read(stats_vdev, ISP3X_ISP_3A_RIS);
|
||||
u32 mask = ISP3X_3A_RAWAF;
|
||||
u32 val, mask = 0, ris = isp3_stats_read(stats_vdev, ISP3X_ISP_3A_RIS);
|
||||
u64 ns;
|
||||
|
||||
if (!dev->is_aiisp_en)
|
||||
@@ -422,27 +425,40 @@ rkisp_stats_send_meas_fe(struct rkisp_isp_stats_vdev *stats_vdev)
|
||||
mask |= ISP3X_3A_RAWAE_CH0 | ISP3X_3A_RAWHIST_CH0;
|
||||
if (priv->is_ae3_fe)
|
||||
mask |= ISP3X_3A_RAWAE_BIG | ISP3X_3A_RAWHIST_BIG;
|
||||
if (priv->is_af_fe)
|
||||
mask |= ISP3X_3A_RAWAF;
|
||||
if (priv->is_awb_fe)
|
||||
mask |= ISP3X_3A_RAWAWB;
|
||||
if (priv->is_aiawb_fe)
|
||||
mask |= ISP35_AIAWB_DONE;
|
||||
if (ris & mask) {
|
||||
isp3_stats_write(stats_vdev, ISP3X_ISP_3A_ICR, ris & mask);
|
||||
val = isp3_stats_read(stats_vdev, ISP3X_RAWAF_CTRL);
|
||||
if (val & ISP35_3A_MEAS_DONE)
|
||||
isp3_module_done(stats_vdev, ISP3X_RAWAF_CTRL, val);
|
||||
if (ris & ISP3X_3A_RAWAE_CH0) {
|
||||
if (ris & (mask & ISP3X_3A_RAWAWB)) {
|
||||
val = isp3_stats_read(stats_vdev, ISP3X_RAWAWB_CTRL);
|
||||
if (val & ISP35_3A_MEAS_DONE)
|
||||
isp3_module_done(stats_vdev, ISP3X_RAWAWB_CTRL, val);
|
||||
}
|
||||
if (ris & (mask & ISP3X_3A_RAWAF)) {
|
||||
val = isp3_stats_read(stats_vdev, ISP3X_RAWAF_CTRL);
|
||||
if (val & ISP35_3A_MEAS_DONE)
|
||||
isp3_module_done(stats_vdev, ISP3X_RAWAF_CTRL, val);
|
||||
}
|
||||
if (ris & (mask & ISP3X_3A_RAWAE_CH0)) {
|
||||
val = isp3_stats_read(stats_vdev, ISP3X_RAWAE_LITE_BASE);
|
||||
if (val & ISP35_3A_MEAS_DONE)
|
||||
isp3_module_done(stats_vdev, ISP3X_RAWAE_LITE_BASE, val);
|
||||
}
|
||||
if (ris & ISP3X_3A_RAWHIST_CH0) {
|
||||
if (ris & (mask & ISP3X_3A_RAWHIST_CH0)) {
|
||||
val = isp3_stats_read(stats_vdev, ISP3X_RAWHIST_LITE_BASE);
|
||||
if (val & ISP35_3A_MEAS_DONE)
|
||||
isp3_module_done(stats_vdev, ISP3X_RAWHIST_LITE_BASE, val);
|
||||
}
|
||||
if (ris & ISP3X_3A_RAWAE_BIG) {
|
||||
if (ris & (mask & ISP3X_3A_RAWAE_BIG)) {
|
||||
val = isp3_stats_read(stats_vdev, ISP3X_RAWAE_BIG1_BASE);
|
||||
if (val & ISP35_3A_MEAS_DONE)
|
||||
isp3_module_done(stats_vdev, ISP3X_RAWAE_BIG1_BASE, val);
|
||||
}
|
||||
if (ris & ISP3X_3A_RAWHIST_BIG) {
|
||||
if (ris & (mask & ISP3X_3A_RAWHIST_BIG)) {
|
||||
val = isp3_stats_read(stats_vdev, ISP3X_RAWHIST_BIG1_BASE);
|
||||
if (val & ISP35_3A_MEAS_DONE)
|
||||
isp3_module_done(stats_vdev, ISP3X_RAWHIST_BIG1_BASE, val);
|
||||
@@ -476,31 +492,38 @@ rkisp_stats_send_meas_fe(struct rkisp_isp_stats_vdev *stats_vdev)
|
||||
stat_buf->stat.buf_gain_index = -1;
|
||||
stat_buf->stat.buf_vpsl_index = -1;
|
||||
}
|
||||
if (ris & ISP3X_3A_RAWAE_CH0 && stat_buf && stat_tmp_buf) {
|
||||
if (ris & (mask & ISP3X_3A_RAWAE_CH0) && stat_buf && stat_tmp_buf) {
|
||||
memcpy(&stat_buf->stat.rawae0,
|
||||
&stat_tmp_buf->stat.rawae0, sizeof(struct isp33_rawae_stat));
|
||||
stat_buf->meas_type |= ISP35_STAT_RAWAE0;
|
||||
}
|
||||
if (ris & ISP3X_3A_RAWHIST_CH0 && stat_buf && stat_tmp_buf) {
|
||||
if (ris & (mask & ISP3X_3A_RAWHIST_CH0) && stat_buf && stat_tmp_buf) {
|
||||
memcpy(&stat_buf->stat.rawhist0,
|
||||
&stat_tmp_buf->stat.rawhist0, sizeof(struct isp33_rawhist_stat));
|
||||
stat_buf->meas_type |= ISP35_STAT_RAWHST0;
|
||||
}
|
||||
if (ris & ISP3X_3A_RAWAE_BIG && stat_buf && stat_tmp_buf) {
|
||||
if (ris & (mask & ISP3X_3A_RAWAE_BIG) && stat_buf && stat_tmp_buf) {
|
||||
memcpy(&stat_buf->stat.rawae3,
|
||||
&stat_tmp_buf->stat.rawae3, sizeof(struct isp33_rawae_stat));
|
||||
stat_buf->meas_type |= ISP35_STAT_RAWAE3;
|
||||
}
|
||||
if (ris & ISP3X_3A_RAWHIST_BIG && stat_buf && stat_tmp_buf) {
|
||||
if (ris & (mask & ISP3X_3A_RAWHIST_BIG) && stat_buf && stat_tmp_buf) {
|
||||
memcpy(&stat_buf->stat.rawhist3,
|
||||
&stat_tmp_buf->stat.rawhist3, sizeof(struct isp33_rawhist_stat));
|
||||
stat_buf->meas_type |= ISP35_STAT_RAWHST3;
|
||||
}
|
||||
if (ris & ISP3X_3A_RAWAF && stat_buf && stat_tmp_buf) {
|
||||
if (ris & (mask & ISP3X_3A_RAWAF) && stat_buf && stat_tmp_buf) {
|
||||
memcpy(&stat_buf->stat.rawaf,
|
||||
&stat_tmp_buf->stat.rawaf, sizeof(struct isp39_rawaf_stat));
|
||||
stat_buf->meas_type |= ISP35_STAT_RAWAF;
|
||||
}
|
||||
if (ris & (mask & ISP3X_3A_RAWAWB) && stat_buf && stat_tmp_buf) {
|
||||
memcpy(&stat_buf->stat.rawawb,
|
||||
&stat_tmp_buf->stat.rawawb, sizeof(struct isp33_rawawb_stat));
|
||||
stat_buf->meas_type |= ISP35_STAT_RAWAWB;
|
||||
}
|
||||
if (ris & (mask & ISP35_AIAWB_DONE) && stat_buf)
|
||||
rkisp_stats_get_aiawb_stats(stats_vdev, stat_buf);
|
||||
if (stat_buf)
|
||||
rkisp_stats_get_bay3d_stats(stats_vdev, stat_buf);
|
||||
if (cur_buf) {
|
||||
@@ -510,10 +533,10 @@ rkisp_stats_send_meas_fe(struct rkisp_isp_stats_vdev *stats_vdev)
|
||||
vb2_buffer_done(&cur_buf->vb.vb2_buf, VB2_BUF_STATE_DONE);
|
||||
}
|
||||
v4l2_dbg(4, rkisp_debug, &stats_vdev->dev->v4l2_dev,
|
||||
"%s seq:%d params_id:%d ris:0x%x buf:%p meas_type:0x%x\n",
|
||||
__func__,
|
||||
cur_frame_id, params_vdev->cur_fe_frame_id, ris,
|
||||
cur_buf, !stat_buf ? 0 : stat_buf->meas_type);
|
||||
"%s seq:%d params_id:%d ris:0x%x buf:0x%x meas_type:0x%x\n",
|
||||
__func__, cur_frame_id, params_vdev->cur_fe_frame_id, ris,
|
||||
!cur_buf ? -1 : cur_buf->buff_addr[0],
|
||||
!stat_buf ? 0 : stat_buf->meas_type);
|
||||
}
|
||||
|
||||
static void
|
||||
@@ -530,37 +553,53 @@ rkisp_stats_send_meas(struct rkisp_isp_stats_vdev *stats_vdev)
|
||||
bool is_dummy = false;
|
||||
unsigned long flags = 0;
|
||||
|
||||
mask = ISP3X_3A_RAWAWB | ISP35_AIAWB_DONE | ISP3X_3A_DDR_DONE;
|
||||
mask = ISP3X_3A_DDR_DONE;
|
||||
if (!dev->is_aiisp_en) {
|
||||
mask |= ISP3X_3A_RAWAF | ISP3X_3A_RAWAE_CH0 | ISP3X_3A_RAWHIST_CH0 |
|
||||
ISP3X_3A_RAWAE_BIG | ISP3X_3A_RAWHIST_BIG;
|
||||
ISP3X_3A_RAWAE_BIG | ISP3X_3A_RAWHIST_BIG | ISP3X_3A_RAWAWB |
|
||||
ISP35_AIAWB_DONE;
|
||||
}
|
||||
if (dev->is_aiisp_en) {
|
||||
if (!priv->is_ae0_fe)
|
||||
mask |= ISP3X_3A_RAWHIST_CH0 | ISP3X_3A_RAWAE_CH0;
|
||||
if (!priv->is_ae3_fe)
|
||||
mask |= ISP3X_3A_RAWAE_BIG | ISP3X_3A_RAWHIST_BIG;
|
||||
if (!priv->is_af_fe)
|
||||
mask |= ISP3X_3A_RAWAF;
|
||||
if (!priv->is_awb_fe)
|
||||
mask |= ISP3X_3A_RAWAWB;
|
||||
if (!priv->is_aiawb_fe)
|
||||
mask |= ISP35_AIAWB_DONE;
|
||||
}
|
||||
if (dev->is_aiisp_en && !priv->is_ae0_fe)
|
||||
mask |= ISP3X_3A_RAWHIST_CH0 | ISP3X_3A_RAWAE_CH0;
|
||||
if (dev->is_aiisp_en && !priv->is_ae3_fe)
|
||||
mask |= ISP3X_3A_RAWAE_BIG | ISP3X_3A_RAWHIST_BIG;
|
||||
if (ris & mask) {
|
||||
isp3_stats_write(stats_vdev, ISP3X_ISP_3A_ICR, ris & mask);
|
||||
if (dev->is_aiisp_en) {
|
||||
val = isp3_stats_read(stats_vdev, ISP3X_RAWAWB_CTRL);
|
||||
if (val & ISP35_3A_MEAS_DONE)
|
||||
isp3_module_done(stats_vdev, ISP3X_RAWAWB_CTRL, val);
|
||||
if (ris & ISP3X_3A_RAWAE_CH0) {
|
||||
if (ris & (mask & ISP3X_3A_RAWAWB)) {
|
||||
val = isp3_stats_read(stats_vdev, ISP3X_RAWAWB_CTRL);
|
||||
if (val & ISP35_3A_MEAS_DONE)
|
||||
isp3_module_done(stats_vdev, ISP3X_RAWAWB_CTRL, val);
|
||||
}
|
||||
if (ris & (mask & ISP3X_3A_RAWAF)) {
|
||||
val = isp3_stats_read(stats_vdev, ISP3X_RAWAF_CTRL);
|
||||
if (val & ISP35_3A_MEAS_DONE)
|
||||
isp3_module_done(stats_vdev, ISP3X_RAWAF_CTRL, val);
|
||||
}
|
||||
if (ris & (mask & ISP3X_3A_RAWAE_CH0)) {
|
||||
val = isp3_stats_read(stats_vdev, ISP3X_RAWAE_LITE_BASE);
|
||||
if (val & ISP35_3A_MEAS_DONE)
|
||||
isp3_module_done(stats_vdev, ISP3X_RAWAE_LITE_BASE, val);
|
||||
}
|
||||
if (ris & ISP3X_3A_RAWHIST_CH0) {
|
||||
if (ris & (mask & ISP3X_3A_RAWHIST_CH0)) {
|
||||
val = isp3_stats_read(stats_vdev, ISP3X_RAWHIST_LITE_BASE);
|
||||
if (val & ISP35_3A_MEAS_DONE)
|
||||
isp3_module_done(stats_vdev, ISP3X_RAWHIST_LITE_BASE, val);
|
||||
}
|
||||
if (ris & ISP3X_3A_RAWAE_BIG) {
|
||||
if (ris & (mask & ISP3X_3A_RAWAE_BIG)) {
|
||||
val = isp3_stats_read(stats_vdev, ISP3X_RAWAE_BIG1_BASE);
|
||||
if (val & ISP35_3A_MEAS_DONE)
|
||||
isp3_module_done(stats_vdev, ISP3X_RAWAE_BIG1_BASE, val);
|
||||
}
|
||||
if (ris & ISP3X_3A_RAWHIST_BIG) {
|
||||
if (ris & (mask & ISP3X_3A_RAWHIST_BIG)) {
|
||||
val = isp3_stats_read(stats_vdev, ISP3X_RAWHIST_BIG1_BASE);
|
||||
if (val & ISP35_3A_MEAS_DONE)
|
||||
isp3_module_done(stats_vdev, ISP3X_RAWHIST_BIG1_BASE, val);
|
||||
@@ -628,8 +667,12 @@ rkisp_stats_send_meas(struct rkisp_isp_stats_vdev *stats_vdev)
|
||||
cur_stat_buf->stat.buf_vpsl_index = -1;
|
||||
}
|
||||
|
||||
if (ris & (mask & ISP3X_3A_RAWAF) && cur_stat_buf)
|
||||
if (ris & (mask & ISP3X_3A_RAWAF) && cur_stat_buf) {
|
||||
cur_stat_buf->meas_type |= ISP35_STAT_RAWAF;
|
||||
if (dev->is_aiisp_en && stat_tmp_buf)
|
||||
memcpy(&cur_stat_buf->stat.rawaf,
|
||||
&stat_tmp_buf->stat.rawaf, sizeof(struct isp39_rawaf_stat));
|
||||
}
|
||||
if (ris & (mask & ISP3X_3A_RAWAE_CH0) && cur_stat_buf) {
|
||||
cur_stat_buf->meas_type |= ISP35_STAT_RAWAE0;
|
||||
if (dev->is_aiisp_en && stat_tmp_buf)
|
||||
@@ -660,7 +703,7 @@ rkisp_stats_send_meas(struct rkisp_isp_stats_vdev *stats_vdev)
|
||||
memcpy(&cur_stat_buf->stat.rawawb,
|
||||
&stat_tmp_buf->stat.rawawb, sizeof(struct isp33_rawawb_stat));
|
||||
}
|
||||
if (ris & ISP35_AIAWB_DONE && cur_stat_buf)
|
||||
if (ris & (mask & ISP35_AIAWB_DONE) && cur_stat_buf)
|
||||
rkisp_stats_get_aiawb_stats(stats_vdev, cur_stat_buf);
|
||||
if (ris & ISP35_AWBSYNC_DONE && cur_stat_buf)
|
||||
rkisp_stats_get_awbsync_stats(stats_vdev, cur_stat_buf);
|
||||
@@ -698,20 +741,26 @@ rkisp_stats_send_meas(struct rkisp_isp_stats_vdev *stats_vdev)
|
||||
vb2_buffer_done(&cur_buf->vb.vb2_buf, VB2_BUF_STATE_DONE);
|
||||
}
|
||||
v4l2_dbg(4, rkisp_debug, &stats_vdev->dev->v4l2_dev,
|
||||
"%s seq:%d params_id:%d ris:0x%x buf:0x%x meas_type:0x%x aiawb(idx:%d 0x%x)\n",
|
||||
"%s seq:%d params_id:%d ris:0x%x buf:0x%x meas_type:0x%x\n",
|
||||
__func__, cur_frame_id, params_vdev->cur_frame_id, ris,
|
||||
!cur_buf ? -1 : cur_buf->buff_addr[0],
|
||||
!cur_stat_buf ? 0 : cur_stat_buf->meas_type,
|
||||
!cur_stat_buf ? -1 : cur_stat_buf->stat.buf_aiawb_index,
|
||||
isp3_stats_read(stats_vdev, ISP35_AIAWB_WR_BASE_SHD));
|
||||
!cur_stat_buf ? 0 : cur_stat_buf->meas_type);
|
||||
}
|
||||
|
||||
static void
|
||||
rkisp_stats_isr_v35(struct rkisp_isp_stats_vdev *stats_vdev,
|
||||
u32 isp_ris, u32 isp3a_ris)
|
||||
{
|
||||
u32 w3a_ris;
|
||||
|
||||
rkisp_pdaf_isr(stats_vdev->dev);
|
||||
|
||||
w3a_ris = rkisp_read(stats_vdev->dev, ISP39_W3A_INT_STAT, true);
|
||||
if (w3a_ris & ISP39_W3A_INT_ERR_MASK) {
|
||||
v4l2_err(&stats_vdev->dev->v4l2_dev, "w3a error 0x%x\n", w3a_ris);
|
||||
rkisp_write(stats_vdev->dev, ISP39_W3A_INT_STAT, w3a_ris, true);
|
||||
}
|
||||
|
||||
if (isp_ris & ISP3X_BAY3D_FRM_END)
|
||||
rkisp_stats_send_meas_fe(stats_vdev);
|
||||
if (isp_ris & ISP3X_FRAME)
|
||||
@@ -777,6 +826,8 @@ rkisp_stats_first_ddr_config_v35(struct rkisp_isp_stats_vdev *stats_vdev)
|
||||
val |= ISP39_W3A_EN | ISP39_W3A_FORCE_UPD;
|
||||
if (!dev->is_aiisp_en)
|
||||
val |= ISP39_W3A_AUTO_CLR_EN;
|
||||
else
|
||||
val |= ISP35_W3A_FORCE_UPD_F;
|
||||
if (pdaf_vdev && pdaf_vdev->streaming) {
|
||||
val |= ISP39_W3A_PDAF_EN;
|
||||
rkisp_pdaf_update_buf(dev);
|
||||
|
||||
@@ -1140,7 +1140,7 @@ static void isp35_show(struct rkisp_device *dev, struct seq_file *p)
|
||||
struct rkisp_isp_params_val_v35 *priv = dev->params_vdev.priv_val;
|
||||
u32 full_range_flg = CIF_ISP_CTRL_ISP_CSM_Y_FULL_ENA | CIF_ISP_CTRL_ISP_CSM_C_FULL_ENA;
|
||||
static const char * const effect[] = { "OFF", "BLACKWHITE" };
|
||||
u32 val, tmp;
|
||||
u32 val, tmp, isp_path = rkisp_read(dev, ISP3X_VI_ISP_PATH, false);
|
||||
|
||||
val = rkisp_read(dev, ISP3X_SWS_CFG, false);
|
||||
tmp = rkisp_read(dev, ISP3X_SWS_CFG, true);
|
||||
@@ -1248,21 +1248,42 @@ static void isp35_show(struct rkisp_device *dev, struct seq_file *p)
|
||||
seq_printf(p, "%-10s %s pregdain:0x%x offset:0x%x offset1:%d max:0x%x\n",
|
||||
"OB", val ? "ON" : "OFF", val, tmp & 0x1ff, (tmp >> 16) & 0x1ff,
|
||||
rkisp_read(dev, ISP32_BLS_ISP_OB_MAX, false));
|
||||
val = rkisp_read(dev, ISP3X_RAWAE_LITE_CTRL, false);
|
||||
seq_printf(p, "%-10s %s(0x%x)\n", "RAWAE0", (val & 1) ? "ON" : "OFF", val);
|
||||
val = rkisp_read(dev, ISP3X_RAWAE_BIG1_BASE, false);
|
||||
seq_printf(p, "%-10s %s(0x%x)\n", "RAWAE3", (val & 1) ? "ON" : "OFF", val);
|
||||
val = rkisp_read(dev, ISP3X_RAWHIST_LITE_CTRL, false);
|
||||
seq_printf(p, "%-10s %s(0x%x)\n", "RAWHIST0", (val & 1) ? "ON" : "OFF", val);
|
||||
val = rkisp_read(dev, ISP3X_RAWHIST_BIG1_BASE, false);
|
||||
seq_printf(p, "%-10s %s(0x%x)\n", "RAWHIST3", (val & 1) ? "ON" : "OFF", val);
|
||||
val = rkisp_read(dev, ISP3X_RAWAE_LITE_CTRL, false);
|
||||
seq_printf(p, "%-10s %s(0x%x) sel[bnr(fe:%d be:%d) swap:%d]\n",
|
||||
"RAWAE0", (val & 1) ? "ON" : "OFF", val,
|
||||
!!(isp_path & BIT(30) && !(val & BIT(9))),
|
||||
!!(isp_path & BIT(30) && val & BIT(9)),
|
||||
(isp_path >> 22) & 0x3);
|
||||
val = rkisp_read(dev, ISP3X_RAWAE_BIG1_BASE, false);
|
||||
seq_printf(p, "%-10s %s(0x%x) sel[bnr(fe:%d be:%d) debayer:%d dpcc:%d]\n",
|
||||
"RAWAE3", (val & 1) ? "ON" : "OFF", val,
|
||||
!!(isp_path & BIT(29) && !(val & BIT(9))),
|
||||
!!(isp_path & BIT(29) && val & BIT(9)),
|
||||
((isp_path >> 16) & 0x3) == 3,
|
||||
((isp_path >> 16) & 0x3) != 3 ? (isp_path >> 16) & 0x3 : 0);
|
||||
val = rkisp_read(dev, ISP3X_RAWAF_CTRL, false);
|
||||
seq_printf(p, "%-10s %s(0x%x)\n", "RAWAF", (val & 1) ? "ON" : "OFF", val);
|
||||
seq_printf(p, "%-10s %s(0x%x) sel[ynr:%d bnr(fe:%d be:%d) debayer:%d dpcc:%d])\n",
|
||||
"RAWAF", (val & 1) ? "ON" : "OFF", val,
|
||||
!!(val & BIT(19)),
|
||||
!!(isp_path & BIT(28) && !(val & BIT(20))),
|
||||
!!(isp_path & BIT(28) && val & BIT(20)),
|
||||
((isp_path >> 18) & 0x3) == 3,
|
||||
((isp_path >> 18) & 0x3) != 3 ? (isp_path >> 18) & 0x3 : 0);
|
||||
val = rkisp_read(dev, ISP3X_RAWAWB_CTRL, false);
|
||||
seq_printf(p, "%-10s %s(0x%x)\n", "RAWAWB", (val & 1) ? "ON" : "OFF", val);
|
||||
tmp = rkisp_read(dev, ISP3X_RAWAWB_BLK_CTRL, false);
|
||||
seq_printf(p, "%-10s %s(0x%x) sel[drc:%d bnr(fe:%d be:%d) degamma:%d]\n",
|
||||
"RAWAWB", (val & 1) ? "ON" : "OFF", val,
|
||||
!!(isp_path & BIT(27)),
|
||||
!!(isp_path & BIT(26) && !(tmp & BIT(10))),
|
||||
!!(isp_path & BIT(26) && tmp & BIT(10)),
|
||||
(isp_path >> 20) & 0x3);
|
||||
val = rkisp_read(dev, ISP35_AIAWB_CTRL0, false);
|
||||
seq_printf(p, "%-10s %s(0x%x) idx:%d cnt:%d\n", "AIAWB", (val & 1) ? "ON" : "OFF",
|
||||
val, priv->buf_aiawb_cnt, priv->buf_aiawb_idx);
|
||||
seq_printf(p, "%-10s %s(0x%x) sel:%d idx:%d cnt:%d\n", "AIAWB", (val & 1) ? "ON" : "OFF",
|
||||
val, (val >> 8) & 0x7, priv->buf_aiawb_cnt, priv->buf_aiawb_idx);
|
||||
val = rkisp_read(dev, ISP35_AWBSYNC_CTRL, false);
|
||||
seq_printf(p, "%-10s %s(0x%x)\n", "AWBSYNC", (val & 1) ? "ON" : "OFF", val);
|
||||
val = rkisp_read(dev, ISP3X_ISP_DEBUG1, true);
|
||||
|
||||
@@ -697,7 +697,7 @@ static void rkisp_update_list_reg(struct rkisp_device *dev)
|
||||
dev->params_vdev.ops->vpsl_update_regs(&dev->params_vdev);
|
||||
}
|
||||
if (dev->isp_ver >= ISP_V33) {
|
||||
val = rkisp_read(dev, ISP39_W3A_CTRL0, false);
|
||||
val = rkisp_read_reg_cache(dev, ISP39_W3A_CTRL0);
|
||||
writel(val, hw->base_addr + ISP39_W3A_CTRL0);
|
||||
}
|
||||
rkisp_unite_write(dev, ISP3X_MI_WR_INIT, CIF_MI_INIT_SOFT_UPD, true);
|
||||
@@ -955,6 +955,8 @@ run_next:
|
||||
if (is_upd) {
|
||||
val = rkisp_read(dev, ISP_CTRL, false);
|
||||
val |= CIF_ISP_CTRL_ISP_CFG_UPD;
|
||||
if (dev->isp_ver == ISP_V35 && dev->is_aiisp_en)
|
||||
val |= ISP35_ISP_CFG_UPD_FE;
|
||||
writel(val, hw->base_addr + ISP_CTRL);
|
||||
if (hw->unite == ISP_UNITE_TWO)
|
||||
writel(val, hw->base_next_addr + ISP_CTRL);
|
||||
@@ -1968,7 +1970,7 @@ static int rkisp_config_isp(struct rkisp_device *dev)
|
||||
u32 acq_mult = 0;
|
||||
u32 acq_prop = 0;
|
||||
u32 extend_line = 0;
|
||||
u32 width, height;
|
||||
u32 width, height, val;
|
||||
|
||||
sensor = dev->active_sensor;
|
||||
in_fmt = &dev->isp_sdev.in_fmt;
|
||||
@@ -2061,6 +2063,8 @@ static int rkisp_config_isp(struct rkisp_device *dev)
|
||||
acq_prop |= signal | in_fmt->yuv_seq |
|
||||
CIF_ISP_ACQ_PROP_BAYER_PAT(in_fmt->bayer_pat) |
|
||||
CIF_ISP_ACQ_PROP_FIELD_SEL_ALL;
|
||||
if (dev->isp_ver == ISP_V35 && dev->is_aiisp_en)
|
||||
acq_prop |= ISP35_BAYER_PAT_FE(in_fmt->bayer_pat) | ISP35_BAYER_UPD_FE_EN;
|
||||
rkisp_unite_write(dev, CIF_ISP_ACQ_PROP, acq_prop, false);
|
||||
rkisp_unite_write(dev, CIF_ISP_ACQ_NR_FRAMES, 0, true);
|
||||
|
||||
@@ -2071,19 +2075,31 @@ static int rkisp_config_isp(struct rkisp_device *dev)
|
||||
/* Acquisition Size */
|
||||
rkisp_unite_write(dev, CIF_ISP_ACQ_H_OFFS, acq_mult * in_crop->left, false);
|
||||
rkisp_unite_write(dev, CIF_ISP_ACQ_V_OFFS, in_crop->top, false);
|
||||
rkisp_unite_write(dev, CIF_ISP_ACQ_H_SIZE, acq_mult * width, false);
|
||||
if (dev->isp_ver == ISP_V35 && dev->is_aiisp_en)
|
||||
val = (acq_mult * width) | (acq_mult * width) << 16;
|
||||
else
|
||||
val = acq_mult * width;
|
||||
rkisp_unite_write(dev, CIF_ISP_ACQ_H_SIZE, val, false);
|
||||
|
||||
/* ISP Out Area differ with ACQ is only FIFO, so don't crop in this */
|
||||
rkisp_unite_write(dev, CIF_ISP_OUT_H_OFFS, 0, true);
|
||||
rkisp_unite_write(dev, CIF_ISP_OUT_V_OFFS, 0, true);
|
||||
rkisp_unite_write(dev, CIF_ISP_OUT_H_SIZE, width, false);
|
||||
if (dev->isp_ver == ISP_V35 && dev->is_aiisp_en)
|
||||
val = width | width << 16;
|
||||
else
|
||||
val = width;
|
||||
rkisp_unite_write(dev, CIF_ISP_OUT_H_SIZE, val, false);
|
||||
|
||||
if (dev->cap_dev.stream[RKISP_STREAM_SP].interlaced) {
|
||||
rkisp_unite_write(dev, CIF_ISP_ACQ_V_SIZE, height / 2, false);
|
||||
rkisp_unite_write(dev, CIF_ISP_OUT_V_SIZE, height / 2, false);
|
||||
} else {
|
||||
rkisp_unite_write(dev, CIF_ISP_ACQ_V_SIZE, height + extend_line, false);
|
||||
rkisp_unite_write(dev, CIF_ISP_OUT_V_SIZE, height + extend_line, false);
|
||||
if (dev->isp_ver == ISP_V35 && dev->is_aiisp_en)
|
||||
val = (height + extend_line) | (height + extend_line) << 16;
|
||||
else
|
||||
val = height + extend_line;
|
||||
rkisp_unite_write(dev, CIF_ISP_ACQ_V_SIZE, val, false);
|
||||
rkisp_unite_write(dev, CIF_ISP_OUT_V_SIZE, val, false);
|
||||
}
|
||||
|
||||
/* interrupt mask */
|
||||
@@ -2335,7 +2351,7 @@ static int rkisp_isp_stop(struct rkisp_device *dev)
|
||||
struct rkisp_hw_dev *hw = dev->hw_dev;
|
||||
void __iomem *base = dev->base_addr;
|
||||
unsigned long old_rate, safe_rate;
|
||||
u32 val;
|
||||
u32 val, upd = CIF_ISP_CTRL_ISP_CFG_UPD;
|
||||
u32 i;
|
||||
|
||||
v4l2_dbg(1, rkisp_debug, &dev->v4l2_dev,
|
||||
@@ -2405,10 +2421,11 @@ static int rkisp_isp_stop(struct rkisp_device *dev)
|
||||
readl(base + CIF_ISP_CTRL), readl(base + CIF_ISP_FLAGS_SHD),
|
||||
ISP3X_ISP_OUT_LINE(rkisp_read(dev, ISP3X_ISP_DEBUG2, true)));
|
||||
|
||||
if (dev->isp_ver == ISP_V35 && dev->is_aiisp_en)
|
||||
upd |= ISP35_ISP_CFG_UPD_FE;
|
||||
val = rkisp_read(dev, CIF_ISP_CTRL, true);
|
||||
val |= CIF_ISP_CTRL_ISP_CFG_UPD;
|
||||
rkisp_unite_write(dev, CIF_ISP_CTRL, val, true);
|
||||
rkisp_clear_reg_cache_bits(dev, CIF_ISP_CTRL, CIF_ISP_CTRL_ISP_CFG_UPD);
|
||||
rkisp_unite_write(dev, CIF_ISP_CTRL, val | upd, true);
|
||||
rkisp_clear_reg_cache_bits(dev, CIF_ISP_CTRL, upd);
|
||||
|
||||
if (!in_interrupt()) {
|
||||
/* normal case */
|
||||
@@ -2473,7 +2490,7 @@ end:
|
||||
static int rkisp_isp_start(struct rkisp_device *dev)
|
||||
{
|
||||
struct rkisp_hw_dev *hw = dev->hw_dev;
|
||||
u32 val;
|
||||
u32 val, upd = CIF_ISP_CTRL_ISP_CFG_UPD;
|
||||
|
||||
v4l2_dbg(1, rkisp_debug, &dev->v4l2_dev,
|
||||
"%s refcnt:%d link_num:%d unite_div:%d\n", __func__,
|
||||
@@ -2500,16 +2517,18 @@ static int rkisp_isp_start(struct rkisp_device *dev)
|
||||
}
|
||||
}
|
||||
|
||||
if (dev->isp_ver == ISP_V35 && dev->is_aiisp_en)
|
||||
upd |= ISP35_ISP_CFG_UPD_FE;
|
||||
/* Activate ISP */
|
||||
val = rkisp_read_reg_cache(dev, CIF_ISP_CTRL);
|
||||
val |= CIF_ISP_CTRL_ISP_CFG_UPD | CIF_ISP_CTRL_ISP_ENABLE |
|
||||
val |= upd | CIF_ISP_CTRL_ISP_ENABLE |
|
||||
CIF_ISP_CTRL_ISP_INFORM_ENABLE | CIF_ISP_CTRL_ISP_CFG_UPD_PERMANENT;
|
||||
if (dev->isp_ver == ISP_V20)
|
||||
val |= NOC_HURRY_PRIORITY(2) | NOC_HURRY_W_MODE(2) | NOC_HURRY_R_MODE(1);
|
||||
if (atomic_read(&hw->refcnt) == 1)
|
||||
hw->cur_dev_id = dev->dev_id;
|
||||
rkisp_unite_write(dev, CIF_ISP_CTRL, val, false);
|
||||
rkisp_clear_reg_cache_bits(dev, CIF_ISP_CTRL, CIF_ISP_CTRL_ISP_CFG_UPD);
|
||||
rkisp_clear_reg_cache_bits(dev, CIF_ISP_CTRL, upd);
|
||||
|
||||
dev->isp_err_cnt = 0;
|
||||
dev->isp_isr_cnt = 0;
|
||||
|
||||
Reference in New Issue
Block a user