diff --git a/drivers/media/platform/rockchip/isp/capture.c b/drivers/media/platform/rockchip/isp/capture.c index 44abf09af035..cfad3e69b948 100644 --- a/drivers/media/platform/rockchip/isp/capture.c +++ b/drivers/media/platform/rockchip/isp/capture.c @@ -450,6 +450,22 @@ int rkisp_stream_frame_start(struct rkisp_device *dev, u32 isp_mis) return 0; } +int rkisp_stream_isp_end(struct rkisp_device *dev, u32 isp_mis) +{ + struct rkisp_stream *stream; + int i; + + for (i = 0; i < RKISP_MAX_STREAM; i++) { + if (i == RKISP_STREAM_VIR || i == RKISP_STREAM_LUMA) + continue; + stream = &dev->cap_dev.stream[i]; + if (stream->streaming && + stream->ops && stream->ops->isp_end) + stream->ops->isp_end(stream, isp_mis); + } + return 0; +} + void rkisp_stream_buf_done_early(struct rkisp_device *dev) { struct rkisp_stream *stream; diff --git a/drivers/media/platform/rockchip/isp/capture.h b/drivers/media/platform/rockchip/isp/capture.h index a9c4fc905794..4c3d3fc627e9 100644 --- a/drivers/media/platform/rockchip/isp/capture.h +++ b/drivers/media/platform/rockchip/isp/capture.h @@ -242,6 +242,7 @@ struct streams_ops { int (*frame_end)(struct rkisp_stream *stream, u32 state); int (*frame_start)(struct rkisp_stream *stream, u32 mis); int (*set_wrap)(struct rkisp_stream *stream, int line); + int (*isp_end)(struct rkisp_stream *stream, u32 irq); }; struct rockit_isp_ops { @@ -301,6 +302,7 @@ struct rkisp_stream { bool is_crop_upd; bool is_using_resmem; bool frame_early; + bool need_scl_upd; wait_queue_head_t done; unsigned int burst; atomic_t sequence; @@ -354,6 +356,7 @@ void rkisp_mi_isr(u32 mis_val, struct rkisp_device *dev); void rkisp_set_stream_def_fmt(struct rkisp_device *dev, u32 id, u32 width, u32 height, u32 pixelformat); int rkisp_stream_frame_start(struct rkisp_device *dev, u32 isp_mis); +int rkisp_stream_isp_end(struct rkisp_device *dev, u32 isp_mis); int rkisp_fcc_xysubs(u32 fcc, u32 *xsubs, u32 *ysubs); int rkisp_mbus_code_xysubs(u32 code, u32 *xsubs, u32 *ysubs); int rkisp_fh_open(struct file *filp); diff --git a/drivers/media/platform/rockchip/isp/capture_v39.c b/drivers/media/platform/rockchip/isp/capture_v39.c index c275d65b548f..442ccd28039d 100644 --- a/drivers/media/platform/rockchip/isp/capture_v39.c +++ b/drivers/media/platform/rockchip/isp/capture_v39.c @@ -23,6 +23,7 @@ static int mi_frame_end(struct rkisp_stream *stream, u32 state); static int mi_frame_start(struct rkisp_stream *stream, u32 irq); +static int isp_frame_end(struct rkisp_stream *stream, u32 irq); static const struct capture_fmt mp_fmts[] = { /* yuv422 */ @@ -847,7 +848,7 @@ static void update_mi(struct rkisp_stream *stream) rkisp_write(dev, reg, val, false); } - if (dev->hw_dev->unite > ISP_UNITE_DIV1) { + if (dev->unite_div > ISP_UNITE_DIV1) { /* right of image, or right top of image */ reg = stream->config->mi.y_base_ad_init; val = stream->next_buf->buff_addr[RKISP_PLANE_Y]; @@ -934,6 +935,7 @@ static struct streams_ops rkisp_mp_streams_ops = { .update_mi = update_mi, .frame_end = mi_frame_end, .frame_start = mi_frame_start, + .isp_end = isp_frame_end, }; static struct streams_ops rkisp_sp_streams_ops = { @@ -945,6 +947,7 @@ static struct streams_ops rkisp_sp_streams_ops = { .update_mi = update_mi, .frame_end = mi_frame_end, .frame_start = mi_frame_start, + .isp_end = isp_frame_end, }; static struct streams_ops rkisp_ldc_streams_ops = { @@ -1007,6 +1010,24 @@ static int mi_frame_start(struct rkisp_stream *stream, u32 irq) return 0; } +static int isp_frame_end(struct rkisp_stream *stream, u32 irq) +{ + struct rkisp_device *dev = stream->ispdev; + u32 val = ISP3X_ISP_OUT_LINE(rkisp_read(dev, ISP3X_ISP_DEBUG2, true)); + + if (stream->need_scl_upd) { + if (val) + v4l2_err(&dev->v4l2_dev, + "no to update scl, need to increase sensor vblank\n"); + else { + val = ISP32_SCALE_FORCE_UPD | ISP32_SCALE_GEN_UPD; + rkisp_write(dev, stream->config->rsz.update, val, true); + stream->need_scl_upd = false; + } + } + return 0; +} + /* * This function is called when a frame end come. The next frame * is processing and we should set up buffer for next-next frame, @@ -1461,11 +1482,16 @@ static int rkisp_stream_start(struct rkisp_stream *stream) { struct rkisp_device *dev = stream->ispdev; struct v4l2_device *v4l2_dev = &dev->v4l2_dev; + bool async = false; int ret; + stream->need_scl_upd = false; if (stream->id == RKISP_STREAM_LDC) goto skip; + async = (dev->cap_dev.stream[RKISP_STREAM_MP].streaming || + dev->cap_dev.stream[RKISP_STREAM_SP].streaming); + /* * can't be async now, otherwise the latter started stream fails to * produce mi interrupt. @@ -1476,12 +1502,13 @@ static int rkisp_stream_start(struct rkisp_stream *stream) return ret; } - ret = rkisp_stream_config_rsz(stream, false); + ret = rkisp_stream_config_rsz(stream, async); if (ret < 0) { v4l2_err(v4l2_dev, "config rsz failed with error %d\n", ret); return ret; } - + if (async && dev->hw_dev->is_single) + stream->need_scl_upd = true; skip: return rkisp_start(stream); } diff --git a/drivers/media/platform/rockchip/isp/dev.c b/drivers/media/platform/rockchip/isp/dev.c index 908f08ac72fe..4ed234132bc5 100644 --- a/drivers/media/platform/rockchip/isp/dev.c +++ b/drivers/media/platform/rockchip/isp/dev.c @@ -1171,9 +1171,10 @@ static void rkisp_pm_complete(struct device *dev) isp_dev->isp_state = ISP_START | ISP_FRAME_END; if (!hw->is_single && hw->is_multi_overflow) hw->pre_dev_id++; - if (isp_dev->is_suspend_one_frame && !hw->is_multi_overflow) + if (isp_dev->is_suspend_one_frame && + !hw->is_multi_overflow && hw->isp_ver < ISP_V33) isp_dev->is_first_double = true; - if (hw->isp_ver > ISP_V20) { + if (hw->isp_ver > ISP_V20 && hw->isp_ver < ISP_V33) { val = ISP3X_YNR_FST_FRAME | ISP3X_CNR_FST_FRAME | ISP3X_DHAZ_FST_FRAME | ISP3X_ADRC_FST_FRAME; if (hw->isp_ver == ISP_V32) diff --git a/drivers/media/platform/rockchip/isp/hw.c b/drivers/media/platform/rockchip/isp/hw.c index b9031c1fe13e..ec7360f24be0 100644 --- a/drivers/media/platform/rockchip/isp/hw.c +++ b/drivers/media/platform/rockchip/isp/hw.c @@ -417,6 +417,21 @@ void rkisp_hw_reg_restore(struct rkisp_hw_dev *dev) }, { .base = MI_WR_CTRL, .shd = MI_WR_CTRL_SHD, + }, { + .base = ISP39_W3A_AEBIG_ADDR, + .shd = ISP39_W3A_AEBIG_ADDR_SHD, + }, { + .base = ISP39_W3A_AE0_ADDR, + .shd = ISP39_W3A_AE0_ADDR_SHD, + }, { + .base = ISP39_W3A_AF_ADDR, + .shd = ISP39_W3A_AF_ADDR_SHD, + }, { + .base = ISP39_W3A_AWB_ADDR, + .shd = ISP39_W3A_AWB_ADDR_SHD, + }, { + .base = ISP39_W3A_PDAF_ADDR, + .shd = ISP39_W3A_PDAF_ADDR_SHD, } }; @@ -438,6 +453,11 @@ void rkisp_hw_reg_restore(struct rkisp_hw_dev *dev) *reg = 1; } } + if (dev->isp_ver == ISP_V39) { + reg = reg_buf + ISP39_VI3A_CTRL0; + if (*reg) + *reg |= ISP39_W3A_FORCE_UPD; + } reg = reg_buf + ISP_CTRL; *reg &= ~(CIF_ISP_CTRL_ISP_ENABLE | CIF_ISP_CTRL_ISP_INFORM_ENABLE | @@ -451,7 +471,9 @@ void rkisp_hw_reg_restore(struct rkisp_hw_dev *dev) if ((j > ISP3X_LSC_CTRL && j < ISP3X_LSC_XGRAD_01) || (j > ISP32_CAC_OFFSET && j < ISP3X_CAC_RO_CNT) || (j > ISP3X_3DLUT_UPDATE && j < ISP3X_GAIN_BASE) || - (j == 0x4840 || j == 0x4a80 || j == 0x4b40 || j == 0x5660)) + (j == 0x4840 || j == 0x4a80 || j == 0x4b40 || j == 0x5660) || + (dev->isp_ver == ISP_V39 && + (j > ISP39_DHAZ_HIST_IIR0 && j < ISP39_DHAZ_LINE_CNT))) continue; /* skip mmu range */ if (dev->isp_ver < ISP_V30 && @@ -479,7 +501,7 @@ void rkisp_hw_reg_restore(struct rkisp_hw_dev *dev) } writel(val, base + backup[j].base); } - if (dev->isp_ver == ISP_V30) { + if (dev->isp_ver == ISP_V32) { reg = reg_buf + ISP32_MI_WR_CTRL2_SHD; reg1 = reg_buf + ISP3X_MI_BP_WR_CTRL; if ((*reg & ISP32_BP_EN_IN_SHD) != (*reg1 & ISP3X_BP_ENABLE)) { @@ -507,25 +529,38 @@ void rkisp_hw_reg_restore(struct rkisp_hw_dev *dev) writel(*reg | CIF_DUAL_CROP_CFG_UPD, base + DUAL_CROP_CTRL); reg = reg_buf + SELF_RESIZE_CTRL; if (*reg & 0xf) { - if (dev->isp_ver == ISP_V32_L) - writel(*reg | ISP32_SCALE_FORCE_UPD, base + ISP32_SELF_SCALE_UPDATE); + if (dev->isp_ver == ISP_V32_L || dev->isp_ver == ISP_V39) + writel(ISP32_SCALE_FORCE_UPD | ISP32_SCALE_GEN_UPD, + base + ISP32_SELF_SCALE_UPDATE); else writel(*reg | CIF_RSZ_CTRL_CFG_UPD, base + SELF_RESIZE_CTRL); } reg = reg_buf + MAIN_RESIZE_CTRL; - if (*reg & 0xf) - writel(*reg | CIF_RSZ_CTRL_CFG_UPD, base + MAIN_RESIZE_CTRL); + if (*reg & 0xf) { + if (dev->isp_ver == ISP_V39) + writel(ISP32_SCALE_FORCE_UPD | ISP32_SCALE_GEN_UPD, + base + ISP39_MAIN_SCALE_UPDATE); + else + writel(*reg | CIF_RSZ_CTRL_CFG_UPD, base + MAIN_RESIZE_CTRL); + } reg = reg_buf + ISP32_BP_RESIZE_CTRL; if (*reg & 0xf) writel(*reg | CIF_RSZ_CTRL_CFG_UPD, base + ISP32_BP_RESIZE_CTRL); - + if (dev->isp_ver == ISP_V39) { + reg = reg_buf + ISP39_W3A_CTRL0; + if (*reg) + writel(*reg | ISP39_W3A_FORCE_UPD, base + ISP39_W3A_CTRL0); + reg = reg_buf + ISP39_VI3A_CTRL0; + if (*reg) + writel(*reg | ISP39_W3A_FORCE_UPD, base + ISP39_VI3A_CTRL0); + } /* update mi and isp, base_reg will update to shd_reg */ writel(CIF_MI_INIT_SOFT_UPD, base + MI_WR_INIT); /* config base_reg */ for (j = 0; j < ARRAY_SIZE(backup); j++) writel(backup[j].val, base + backup[j].base); - if (dev->isp_ver == ISP_V30) { + if (dev->isp_ver == ISP_V32) { reg = reg_buf + ISP3X_MI_BP_WR_CTRL; writel(*reg, base + ISP3X_MI_BP_WR_CTRL); reg = reg_buf + ISP32_MI_MPDS_WR_CTRL; @@ -540,15 +575,17 @@ void rkisp_hw_reg_restore(struct rkisp_hw_dev *dev) writel(val, base + MI_SWS_3A_WR_BASE); } - rkisp_params_cfgsram(&isp->params_vdev, false); + if (dev->is_single) { + rkisp_params_cfgsram(&isp->params_vdev, false, true); - reg = reg_buf + ISP_CTRL; - *reg |= CIF_ISP_CTRL_ISP_ENABLE | - CIF_ISP_CTRL_ISP_CFG_UPD | - CIF_ISP_CTRL_ISP_INFORM_ENABLE; - writel(*reg, dev->base_addr + ISP_CTRL); - if (dev->unite == ISP_UNITE_TWO) - writel(*reg, dev->base_next_addr + ISP_CTRL); + reg = reg_buf + ISP_CTRL; + *reg |= CIF_ISP_CTRL_ISP_ENABLE | + CIF_ISP_CTRL_ISP_CFG_UPD | + CIF_ISP_CTRL_ISP_INFORM_ENABLE; + writel(*reg, dev->base_addr + ISP_CTRL); + if (dev->unite == ISP_UNITE_TWO) + writel(*reg, dev->base_next_addr + ISP_CTRL); + } } static const char * const rk3562_isp_clks[] = { @@ -964,6 +1001,7 @@ void rkisp_soft_reset(struct rkisp_hw_dev *dev, bool is_secure) writel(ISP39_ADRC_CMPS_BYP_EN, dev->base_addr + ISP3X_DRC_CTRL0); writel(ISP39_W3A_PDAF2DDR_HOLD_DIS | ISP39_W3A_3A_HOLD_DIS, dev->base_addr + ISP39_W3A_CTRL0); + writel(0, dev->base_addr + ISP39_VI3A_CTRL0); } } diff --git a/drivers/media/platform/rockchip/isp/isp_params.c b/drivers/media/platform/rockchip/isp/isp_params.c index c422fa9a0a49..631d787324fd 100644 --- a/drivers/media/platform/rockchip/isp/isp_params.c +++ b/drivers/media/platform/rockchip/isp/isp_params.c @@ -404,7 +404,8 @@ void rkisp_params_cfg(struct rkisp_isp_params_vdev *params_vdev, u32 frame_id) params_vdev->ops->param_cfg(params_vdev, frame_id, RKISP_PARAMS_IMD); } -void rkisp_params_cfgsram(struct rkisp_isp_params_vdev *params_vdev, bool is_check) +void rkisp_params_cfgsram(struct rkisp_isp_params_vdev *params_vdev, + bool is_check, bool is_reset) { if (is_check) { if (params_vdev->dev->procfs.mode & RKISP_PROCFS_FIL_SW) @@ -415,7 +416,7 @@ void rkisp_params_cfgsram(struct rkisp_isp_params_vdev *params_vdev, bool is_che return; } if (params_vdev->ops->param_cfgsram) - params_vdev->ops->param_cfgsram(params_vdev); + params_vdev->ops->param_cfgsram(params_vdev, is_reset); } void rkisp_params_isr(struct rkisp_isp_params_vdev *params_vdev, diff --git a/drivers/media/platform/rockchip/isp/isp_params.h b/drivers/media/platform/rockchip/isp/isp_params.h index ecbc08a4e22a..1a386b3e4cff 100644 --- a/drivers/media/platform/rockchip/isp/isp_params.h +++ b/drivers/media/platform/rockchip/isp/isp_params.h @@ -35,7 +35,7 @@ struct rkisp_isp_params_ops { void (*isr_hdl)(struct rkisp_isp_params_vdev *params_vdev, u32 isp_mis); void (*param_cfg)(struct rkisp_isp_params_vdev *params_vdev, u32 frame_id, enum rkisp_params_type type); - void (*param_cfgsram)(struct rkisp_isp_params_vdev *params_vdev); + void (*param_cfgsram)(struct rkisp_isp_params_vdev *params_vdev, bool is_reset); void (*get_meshbuf_inf)(struct rkisp_isp_params_vdev *params_vdev, void *meshbuf); int (*set_meshbuf_size)(struct rkisp_isp_params_vdev *params_vdev, void *meshsize); void (*free_meshbuf)(struct rkisp_isp_params_vdev *params_vdev, u64 id); @@ -144,7 +144,7 @@ void rkisp_params_isr(struct rkisp_isp_params_vdev *params_vdev, u32 isp_mis); 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, bool is_check); +void rkisp_params_cfgsram(struct rkisp_isp_params_vdev *params_vdev, bool is_check, bool is_reset); void rkisp_params_get_meshbuf_inf(struct rkisp_isp_params_vdev *params_vdev, void *meshbuf); int rkisp_params_set_meshbuf_size(struct rkisp_isp_params_vdev *params_vdev, void *meshsize); void rkisp_params_meshbuf_free(struct rkisp_isp_params_vdev *params_vdev, u64 id); diff --git a/drivers/media/platform/rockchip/isp/isp_params_v21.c b/drivers/media/platform/rockchip/isp/isp_params_v21.c index f30b5434f7bd..805a6e0bc7bc 100644 --- a/drivers/media/platform/rockchip/isp/isp_params_v21.c +++ b/drivers/media/platform/rockchip/isp/isp_params_v21.c @@ -3757,7 +3757,7 @@ void __isp_isr_meas_en(struct rkisp_isp_params_vdev *params_vdev, } static -void rkisp_params_cfgsram_v21(struct rkisp_isp_params_vdev *params_vdev) +void rkisp_params_cfgsram_v21(struct rkisp_isp_params_vdev *params_vdev, bool is_reset) { struct isp21_isp_params_cfg *params = params_vdev->isp21_params; diff --git a/drivers/media/platform/rockchip/isp/isp_params_v2x.c b/drivers/media/platform/rockchip/isp/isp_params_v2x.c index e0154623813c..abe6516dee19 100644 --- a/drivers/media/platform/rockchip/isp/isp_params_v2x.c +++ b/drivers/media/platform/rockchip/isp/isp_params_v2x.c @@ -4061,7 +4061,7 @@ 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_v2x(struct rkisp_isp_params_vdev *params_vdev, bool is_reset) { struct isp2x_isp_params_cfg *params = params_vdev->isp2x_params; diff --git a/drivers/media/platform/rockchip/isp/isp_params_v32.c b/drivers/media/platform/rockchip/isp/isp_params_v32.c index d1b1b31640cb..f901639a5254 100644 --- a/drivers/media/platform/rockchip/isp/isp_params_v32.c +++ b/drivers/media/platform/rockchip/isp/isp_params_v32.c @@ -4379,7 +4379,7 @@ void __isp_isr_meas_en(struct rkisp_isp_params_vdev *params_vdev, } static -void rkisp_params_cfgsram_v32(struct rkisp_isp_params_vdev *params_vdev) +void rkisp_params_cfgsram_v32(struct rkisp_isp_params_vdev *params_vdev, bool is_reset) { u32 id = params_vdev->dev->unite_index; struct isp32_isp_params_cfg *params = params_vdev->isp32_params + id; diff --git a/drivers/media/platform/rockchip/isp/isp_params_v39.c b/drivers/media/platform/rockchip/isp/isp_params_v39.c index abf790ca6343..12754d389e65 100644 --- a/drivers/media/platform/rockchip/isp/isp_params_v39.c +++ b/drivers/media/platform/rockchip/isp/isp_params_v39.c @@ -633,6 +633,8 @@ isp_lsc_enable(struct rkisp_isp_params_vdev *params_vdev, bool en, u32 id) if (en) { val = ISP_LSC_EN | ISP39_SELF_FORCE_UPD; + if (!IS_HDR_RDBK(params_vdev->dev->rd_mode)) + val |= ISP3X_LSC_LUT_EN; isp3_param_set_bits(params_vdev, ISP3X_LSC_CTRL, val, id); } else { isp3_param_clear_bits(params_vdev, ISP3X_LSC_CTRL, ISP_LSC_EN, id); @@ -2342,7 +2344,7 @@ isp_dhaz_cfg_sram(struct rkisp_isp_params_vdev *params_vdev, struct rkisp_isp_params_val_v39 *priv_val = params_vdev->priv_val; u32 i, j, val, ctrl = isp3_param_read(params_vdev, ISP3X_DHAZ_CTRL, id); - if (is_check && (ctrl & ISP3X_DHAZ_ENMUX)) + if (is_check && !(ctrl & ISP3X_DHAZ_ENMUX)) return; if (arg->hist_iir_wr) { @@ -2368,7 +2370,7 @@ isp_dhaz_config(struct rkisp_isp_params_vdev *params_vdev, struct isp39_isp_params_cfg *params_rec = params_vdev->isp39_params + id; struct isp39_dhaz_cfg *arg_rec = ¶ms_rec->others.dhaz_cfg; struct rkisp_isp_params_val_v39 *priv_val = params_vdev->priv_val; - u32 w = out_crop->width, h = out_crop->height; + u32 w = out_crop->width, h = out_crop->height; u32 i, value, ctrl, thumb_row, thumb_col, blk_het, blk_wid; ctrl = isp3_param_read(params_vdev, ISP3X_DHAZ_CTRL, id); @@ -3361,7 +3363,9 @@ isp_bay3d_enable(struct rkisp_isp_params_vdev *params_vdev, bool en, u32 id) isp3_param_write(params_vdev, bay3d_ctrl, ISP3X_BAY3D_CTRL, id); value = ISP3X_BAY3D_IIR_WR_AUTO_UPD | ISP3X_BAY3D_IIRSELF_UPD | - ISP3X_BAY3D_RDSELF_UPD | ISP3X_GAIN_WR_AUTO_UPD | ISP3X_GAINSELF_UPD; + ISP3X_BAY3D_RDSELF_UPD; + if (priv_val->buf_gain.mem_priv) + value |= ISP3X_GAIN_WR_AUTO_UPD | ISP3X_GAINSELF_UPD; isp3_param_set_bits(params_vdev, MI_WR_CTRL2, value, id); isp3_param_set_bits(params_vdev, ISP3X_ISP_CTRL1, ISP3X_RAW3D_FST_FRAME, id); @@ -4090,12 +4094,17 @@ void __isp_isr_meas_en(struct rkisp_isp_params_vdev *params_vdev, } static -void rkisp_params_cfgsram_v39(struct rkisp_isp_params_vdev *params_vdev) +void rkisp_params_cfgsram_v39(struct rkisp_isp_params_vdev *params_vdev, bool is_reset) { - u32 id = params_vdev->dev->unite_index; + struct rkisp_device *dev = params_vdev->dev; + u32 id = dev->unite_index; struct isp39_isp_params_cfg *params = params_vdev->isp39_params + id; + if (!dev->hw_dev->is_frm_buf && is_reset) + params->others.dhaz_cfg.hist_iir_wr = true; isp_dhaz_cfg_sram(params_vdev, ¶ms->others.dhaz_cfg, true, id); + params->others.dhaz_cfg.hist_iir_wr = false; + isp_lsc_matrix_cfg_sram(params_vdev, ¶ms->others.lsc_cfg, true, id); isp_rawhstbig_cfg_sram(params_vdev, ¶ms->meas.rawhist0, ISP3X_RAWHIST_LITE_BASE, true, id); @@ -4171,7 +4180,7 @@ rkisp_alloc_internal_buf(struct rkisp_isp_params_vdev *params_vdev, priv_val->gain_size = val; if (dev->unite_div > ISP_UNITE_DIV1) val *= dev->unite_div; - is_alloc = iirsparse_en ? true : false; + is_alloc = dev->is_aiisp_en ? true : false; if (priv_val->buf_gain.mem_priv) { if (val > priv_val->buf_gain.size) rkisp_free_buffer(dev, &priv_val->buf_gain); diff --git a/drivers/media/platform/rockchip/isp/isp_params_v3x.c b/drivers/media/platform/rockchip/isp/isp_params_v3x.c index 613fdc00d02d..ad0da6b28956 100644 --- a/drivers/media/platform/rockchip/isp/isp_params_v3x.c +++ b/drivers/media/platform/rockchip/isp/isp_params_v3x.c @@ -4081,7 +4081,7 @@ void __isp_isr_meas_en(struct rkisp_isp_params_vdev *params_vdev, } static -void rkisp_params_cfgsram_v3x(struct rkisp_isp_params_vdev *params_vdev) +void rkisp_params_cfgsram_v3x(struct rkisp_isp_params_vdev *params_vdev, bool is_reset) { struct isp3x_isp_params_cfg *params = params_vdev->isp3x_params; diff --git a/drivers/media/platform/rockchip/isp/isp_stats_v39.c b/drivers/media/platform/rockchip/isp/isp_stats_v39.c index c164f96244f8..ef9069aa8d47 100644 --- a/drivers/media/platform/rockchip/isp/isp_stats_v39.c +++ b/drivers/media/platform/rockchip/isp/isp_stats_v39.c @@ -71,10 +71,7 @@ rkisp_stats_get_dhaz_stats(struct rkisp_isp_stats_vdev *stats_vdev, dhaz->hist_iir[i][2 * j + 1] = value >> 16; } } - if (!dev->hw_dev->is_single) { - arg_rec->hist_iir_wr = true; - memcpy(arg_rec->hist_iir, dhaz->hist_iir, sizeof(dhaz->hist_iir)); - } + memcpy(arg_rec->hist_iir, dhaz->hist_iir, sizeof(dhaz->hist_iir)); pbuf->meas_type |= ISP39_STAT_DHAZ; } end: @@ -175,6 +172,9 @@ rkisp_stats_info2ddr(struct rkisp_isp_stats_vdev *stats_vdev, int idx, buf_fd = -1; u32 reg = 0, ctrl, mask; + if (dev->is_aiisp_en) + return; + priv_val = dev->params_vdev.priv_val; if (!priv_val->buf_info_owner && priv_val->buf_info_idx >= 0) { priv_val->buf_info_idx = -1; @@ -252,24 +252,15 @@ rkisp_stats_send_meas_v39(struct rkisp_isp_stats_vdev *stats_vdev, struct rkisp39_stat_buffer *cur_stat_buf = NULL; u32 size = stats_vdev->vdev_fmt.fmt.meta.buffersize; u32 cur_frame_id = meas_work->frame_id; - bool is_dummy = false; - unsigned long flags; if (!stats_vdev->rdbk_drop) { - if (!cur_buf && stats_vdev->stats_buf[0].mem_priv) { - rkisp_finish_buffer(stats_vdev->dev, &stats_vdev->stats_buf[0]); - cur_stat_buf = stats_vdev->stats_buf[0].vaddr; - cur_stat_buf->frame_id = -1; - is_dummy = true; - } else if (cur_buf) { + if (cur_buf) cur_stat_buf = cur_buf->vaddr[0]; - } /* buffer done when frame of right handle */ if (dev->unite_div > ISP_UNITE_DIV1) { if (dev->unite_index == ISP_UNITE_LEFT) { cur_buf = NULL; - is_dummy = false; } else if (cur_stat_buf) { cur_stat_buf = (void *)cur_stat_buf + size / dev->unite_div; cur_stat_buf->frame_id = cur_frame_id; @@ -313,21 +304,6 @@ rkisp_stats_send_meas_v39(struct rkisp_isp_stats_vdev *stats_vdev, rkisp_stats_get_bay3d_stats(stats_vdev, cur_stat_buf); } - if (is_dummy) { - spin_lock_irqsave(&stats_vdev->rd_lock, flags); - if (!list_empty(&stats_vdev->stat)) { - cur_buf = list_first_entry(&stats_vdev->stat, struct rkisp_buffer, queue); - list_del(&cur_buf->queue); - } else { - cur_stat_buf->frame_id = cur_frame_id; - cur_stat_buf->params_id = params_vdev->cur_frame_id; - } - spin_unlock_irqrestore(&stats_vdev->rd_lock, flags); - if (cur_buf) { - memcpy(cur_buf->vaddr[0], cur_stat_buf, size); - cur_stat_buf = cur_buf->vaddr[0]; - } - } if (cur_buf && cur_stat_buf) { cur_stat_buf->frame_id = cur_frame_id; cur_stat_buf->params_id = params_vdev->cur_frame_id; diff --git a/drivers/media/platform/rockchip/isp/regs.c b/drivers/media/platform/rockchip/isp/regs.c index 444e2b3f4c22..854ccd2ae84d 100644 --- a/drivers/media/platform/rockchip/isp/regs.c +++ b/drivers/media/platform/rockchip/isp/regs.c @@ -448,7 +448,7 @@ static void set_bilinear_scale(struct rkisp_stream *stream, struct v4l2_rect *in reg = stream->config->rsz.ctrl; rkisp_write(dev, reg, rsz_ctrl, false); - val = ISP32_SCALE_FORCE_UPD; + val = ISP32_SCALE_FORCE_UPD | ISP32_SCALE_GEN_UPD; if (async && dev->hw_dev->is_single) val = ISP32_SCALE_GEN_UPD; reg = stream->config->rsz.update; diff --git a/drivers/media/platform/rockchip/isp/rkisp.c b/drivers/media/platform/rockchip/isp/rkisp.c index 3f33a782b0cf..ad1e031093fd 100644 --- a/drivers/media/platform/rockchip/isp/rkisp.c +++ b/drivers/media/platform/rockchip/isp/rkisp.c @@ -226,8 +226,10 @@ int rkisp_align_sensor_resolution(struct rkisp_device *dev, CIF_ISP_INPUT_H_MAX_V32_L_UNITE : CIF_ISP_INPUT_H_MAX_V32_L; break; case ISP_V39: - max_w = CIF_ISP_INPUT_W_MAX_V39; - max_h = CIF_ISP_INPUT_H_MAX_V39; + max_w = dev->hw_dev->unite ? + CIF_ISP_INPUT_W_MAX_V39_UNITE : CIF_ISP_INPUT_W_MAX_V39; + max_h = dev->hw_dev->unite ? + CIF_ISP_INPUT_H_MAX_V39_UNITE : CIF_ISP_INPUT_H_MAX_V39; break; default: max_w = CIF_ISP_INPUT_W_MAX; @@ -721,7 +723,7 @@ void rkisp_trigger_read_back(struct rkisp_device *dev, u8 dma2frm, u32 mode, boo run_next: if (!dev->sw_rd_cnt) rkisp_rockit_frame_start(dev); - rkisp_params_cfgsram(params_vdev, true); + rkisp_params_cfgsram(params_vdev, true, false); stats_vdev->rdbk_drop = false; if (dev->is_frame_double) { is_upd = true; @@ -2746,8 +2748,10 @@ static int rkisp_isp_sd_get_selection(struct v4l2_subdev *sd, CIF_ISP_INPUT_H_MAX_V32_L_UNITE : CIF_ISP_INPUT_H_MAX_V32_L; break; case ISP_V39: - max_w = CIF_ISP_INPUT_W_MAX_V39; - max_h = CIF_ISP_INPUT_H_MAX_V39; + max_w = dev->hw_dev->unite ? + CIF_ISP_INPUT_W_MAX_V39_UNITE : CIF_ISP_INPUT_W_MAX_V39; + max_h = dev->hw_dev->unite ? + CIF_ISP_INPUT_H_MAX_V39_UNITE : CIF_ISP_INPUT_H_MAX_V39; break; default: max_w = CIF_ISP_INPUT_W_MAX; @@ -4518,6 +4522,7 @@ vs_skip: dev->isp_err_cnt = 0; dev->isp_state &= ~ISP_ERROR; + rkisp_stream_isp_end(dev, isp_mis); } if (isp_mis & CIF_ISP_V_START) {