From 9999e48639b3cecb08ffb37358bcba3b48161b29 Mon Sep 17 00:00:00 2001 From: hc <hc@nodka.com> Date: Fri, 10 May 2024 08:50:17 +0000 Subject: [PATCH] add ax88772_rst --- kernel/drivers/media/platform/rockchip/isp/isp_stats_v2x.c | 447 ++++++++++++++++++++++++------------------------------- 1 files changed, 195 insertions(+), 252 deletions(-) diff --git a/kernel/drivers/media/platform/rockchip/isp/isp_stats_v2x.c b/kernel/drivers/media/platform/rockchip/isp/isp_stats_v2x.c index 06ae885..b69b48f 100644 --- a/kernel/drivers/media/platform/rockchip/isp/isp_stats_v2x.c +++ b/kernel/drivers/media/platform/rockchip/isp/isp_stats_v2x.c @@ -55,17 +55,13 @@ ISP2X_SIAWB_GET_MEAN_Y_G(reg_val); } -static int +static void rkisp_stats_get_rawawb_meas_reg(struct rkisp_isp_stats_vdev *stats_vdev, struct rkisp_isp2x_stat_buffer *pbuf) { u64 msb, lsb; - u32 ctrl; + u32 value; int i; - - ctrl = rkisp_read(stats_vdev->dev, ISP_RAWAWB_CTRL, true); - if (!(ctrl & ISP2X_3A_MEAS_DONE)) - return -ENODATA; if (!pbuf) goto out; @@ -159,8 +155,9 @@ } out: - rkisp_write(stats_vdev->dev, ISP_RAWAWB_CTRL, ctrl, true); - return 0; + value = rkisp_read(stats_vdev->dev, ISP_RAWAWB_CTRL, true); + value |= ISP2X_3A_MEAS_DONE; + rkisp_write(stats_vdev->dev, ISP_RAWAWB_CTRL, value, true); } static void @@ -183,18 +180,14 @@ af->win[2].lum = rkisp_read(stats_vdev->dev, ISP_AFM_LUM_C, true); } -static int +static void rkisp_stats_get_rawaf_meas_reg(struct rkisp_isp_stats_vdev *stats_vdev, struct rkisp_isp2x_stat_buffer *pbuf) { struct isp2x_rawaf_stat *af; - u32 value, read_line, ctrl; + u32 value, read_line; u32 line_num[ISP2X_RAWAF_LINE_NUM + 1]; int i; - - ctrl = rkisp_read(stats_vdev->dev, ISP_RAWAF_CTRL, true); - if (!(ctrl & ISP2X_3A_MEAS_DONE)) - return -ENODATA; if (!pbuf) goto out; @@ -231,21 +224,18 @@ af->ramdata[i] = rkisp_read(stats_vdev->dev, ISP_RAWAF_RAM_DATA, true); out: - rkisp_write(stats_vdev->dev, ISP_RAWAF_CTRL, ctrl, true); + value = rkisp_read(stats_vdev->dev, ISP_RAWAF_CTRL, true); + value |= ISP2X_3A_MEAS_DONE; + rkisp_write(stats_vdev->dev, ISP_RAWAF_CTRL, value, true); rkisp_write(stats_vdev->dev, ISP_RAWAF_INT_STATE, 0, true); - return 0; } -static int +static void rkisp_stats_get_yuvae_meas_reg(struct rkisp_isp_stats_vdev *stats_vdev, struct rkisp_isp2x_stat_buffer *pbuf) { - u32 value, ctrl; + u32 value; int i; - - ctrl = rkisp_read(stats_vdev->dev, ISP_YUVAE_CTRL, true); - if (!(ctrl & ISP2X_3A_MEAS_DONE)) - return -ENODATA; if (!pbuf) goto out; @@ -266,8 +256,9 @@ rkisp_read(stats_vdev->dev, ISP_YUVAE_WND1_SUMY + 4 * i, true); out: - rkisp_write(stats_vdev->dev, ISP_YUVAE_CTRL, ctrl, true); - return 0; + value = rkisp_read(stats_vdev->dev, ISP_YUVAE_CTRL, true); + value |= ISP2X_3A_MEAS_DONE; + rkisp_write(stats_vdev->dev, ISP_YUVAE_CTRL, value, true); } static void @@ -293,11 +284,11 @@ } } -static int +static void rkisp_stats_get_rawaebig_meas_reg(struct rkisp_isp_stats_vdev *stats_vdev, struct isp2x_rawaebig_stat *ae, u32 blk_no) { - u32 addr, value, ctrl; + u32 addr, value; int i; switch (blk_no) { @@ -314,10 +305,6 @@ addr = RAWAE_BIG1_BASE; break; } - - ctrl = rkisp_read(stats_vdev->dev, addr + RAWAE_BIG_CTRL, true); - if (!(ctrl & ISP2X_3A_MEAS_DONE)) - return -ENODATA; if (!ae) goto out; @@ -339,15 +326,16 @@ } out: - rkisp_write(stats_vdev->dev, addr + RAWAE_BIG_CTRL, ctrl, true); - return 0; + value = rkisp_read(stats_vdev->dev, addr + RAWAE_BIG_CTRL, true); + value |= ISP2X_3A_MEAS_DONE; + rkisp_write(stats_vdev->dev, addr + RAWAE_BIG_CTRL, value, true); } -static int +static void rkisp_stats_get_rawhstbig_meas_reg(struct rkisp_isp_stats_vdev *stats_vdev, struct isp2x_rawhistbig_stat *hst, u32 blk_no) { - u32 addr, ctrl; + u32 addr, value; int i; switch (blk_no) { @@ -365,10 +353,6 @@ break; } - ctrl = rkisp_read(stats_vdev->dev, addr + ISP_RAWHIST_BIG_CTRL, true); - if (!(ctrl & ISP2X_3A_MEAS_DONE)) - return -ENODATA; - if (!hst) goto out; @@ -377,129 +361,87 @@ addr + ISP_RAWHIST_BIG_RO_BASE_BIN, true); out: - rkisp_write(stats_vdev->dev, addr + ISP_RAWHIST_BIG_CTRL, ctrl, true); - return 0; + value = rkisp_read(stats_vdev->dev, addr + ISP_RAWHIST_BIG_CTRL, true); + value |= ISP2X_3A_MEAS_DONE; + rkisp_write(stats_vdev->dev, addr + ISP_RAWHIST_BIG_CTRL, value, true); } -static int +static void rkisp_stats_get_rawae1_meas_reg(struct rkisp_isp_stats_vdev *stats_vdev, struct rkisp_isp2x_stat_buffer *pbuf) { - int ret = 0; - - if (!pbuf) { + if (!pbuf) rkisp_stats_get_rawaebig_meas_reg(stats_vdev, NULL, 1); - } else { - ret = rkisp_stats_get_rawaebig_meas_reg(stats_vdev, &pbuf->params.rawae1, 1); - if (!ret) - pbuf->meas_type |= ISP2X_STAT_RAWAE1; - } - - return ret; + else + rkisp_stats_get_rawaebig_meas_reg(stats_vdev, &pbuf->params.rawae1, 1); } -static int +static void rkisp_stats_get_rawhst1_meas_reg(struct rkisp_isp_stats_vdev *stats_vdev, struct rkisp_isp2x_stat_buffer *pbuf) { - int ret = 0; - - if (!pbuf) { + if (!pbuf) rkisp_stats_get_rawhstbig_meas_reg(stats_vdev, NULL, 1); - } else { - ret = rkisp_stats_get_rawhstbig_meas_reg(stats_vdev, &pbuf->params.rawhist1, 1); - if (!ret) - pbuf->meas_type |= ISP2X_STAT_RAWHST1; - } - - return ret; + else + rkisp_stats_get_rawhstbig_meas_reg(stats_vdev, &pbuf->params.rawhist1, 1); } -static int +static void rkisp_stats_get_rawae2_meas_reg(struct rkisp_isp_stats_vdev *stats_vdev, struct rkisp_isp2x_stat_buffer *pbuf) { - int ret = 0; - - if (!pbuf) { + if (!pbuf) rkisp_stats_get_rawaebig_meas_reg(stats_vdev, NULL, 2); - } else { + else rkisp_stats_get_rawaebig_meas_reg(stats_vdev, &pbuf->params.rawae2, 2); - if (!ret) - pbuf->meas_type |= ISP2X_STAT_RAWAE2; - } - - return ret; } -static int +static void rkisp_stats_get_rawhst2_meas_reg(struct rkisp_isp_stats_vdev *stats_vdev, struct rkisp_isp2x_stat_buffer *pbuf) { - int ret = 0; - - if (!pbuf) { + if (!pbuf) rkisp_stats_get_rawhstbig_meas_reg(stats_vdev, NULL, 2); - } else { - ret = rkisp_stats_get_rawhstbig_meas_reg(stats_vdev, &pbuf->params.rawhist2, 2); - if (!ret) - pbuf->meas_type |= ISP2X_STAT_RAWHST2; - } - - return ret; + else + rkisp_stats_get_rawhstbig_meas_reg(stats_vdev, &pbuf->params.rawhist2, 2); } -static int +static void rkisp_stats_get_rawae3_meas_reg(struct rkisp_isp_stats_vdev *stats_vdev, struct rkisp_isp2x_stat_buffer *pbuf) { - int ret = 0; - - if (!pbuf) { + if (!pbuf) rkisp_stats_get_rawaebig_meas_reg(stats_vdev, NULL, 0); - } else { - ret = rkisp_stats_get_rawaebig_meas_reg(stats_vdev, &pbuf->params.rawae3, 0); - if (!ret) - pbuf->meas_type |= ISP2X_STAT_RAWAE3; - } - - return ret; + else + rkisp_stats_get_rawaebig_meas_reg(stats_vdev, &pbuf->params.rawae3, 0); } -static int +static void rkisp_stats_get_rawhst3_meas_reg(struct rkisp_isp_stats_vdev *stats_vdev, struct rkisp_isp2x_stat_buffer *pbuf) { - int ret = 0; - - if (!pbuf) { + if (!pbuf) rkisp_stats_get_rawhstbig_meas_reg(stats_vdev, NULL, 0); - } else { - ret = rkisp_stats_get_rawhstbig_meas_reg(stats_vdev, &pbuf->params.rawhist3, 0); - if (!ret) - pbuf->meas_type |= ISP2X_STAT_RAWHST3; - } - - return ret; + else + rkisp_stats_get_rawhstbig_meas_reg(stats_vdev, &pbuf->params.rawhist3, 0); } -static int +static void rkisp_stats_get_rawaelite_meas_reg(struct rkisp_isp_stats_vdev *stats_vdev, struct rkisp_isp2x_stat_buffer *pbuf) { struct isp2x_rawaelite_stat *ae; - u32 value, ctrl; + u32 value; int i; - - ctrl = rkisp_read(stats_vdev->dev, ISP_RAWAE_LITE_CTRL, true); - if (!(ctrl & ISP2X_3A_MEAS_DONE)) - return -ENODATA; if (!pbuf) goto out; - pbuf->meas_type |= ISP2X_STAT_RAWAE0; ae = &pbuf->params.rawae0; + value = rkisp_read(stats_vdev->dev, ISP_RAWAE_LITE_CTRL, true); + + if ((value & ISP2X_3A_MEAS_DONE) == 0) + return; for (i = 0; i < ISP2X_RAWAELITE_MEAN_NUM; i++) { value = rkisp_read(stats_vdev->dev, ISP_RAWAE_LITE_RO_MEAN + 4 * i, true); @@ -509,33 +451,30 @@ } out: - rkisp_write(stats_vdev->dev, ISP_RAWAE_LITE_CTRL, ctrl, true); - return 0; + value = rkisp_read(stats_vdev->dev, ISP_RAWAE_LITE_CTRL, true); + value |= ISP2X_3A_MEAS_DONE; + rkisp_write(stats_vdev->dev, ISP_RAWAE_LITE_CTRL, value, true); } -static int +static void rkisp_stats_get_rawhstlite_meas_reg(struct rkisp_isp_stats_vdev *stats_vdev, struct rkisp_isp2x_stat_buffer *pbuf) { struct isp2x_rawhistlite_stat *hst; - u32 ctrl; + u32 value; int i; - - ctrl = rkisp_read(stats_vdev->dev, ISP_RAWHIST_LITE_CTRL, true); - if (!(ctrl & ISP2X_3A_MEAS_DONE)) - return -ENODATA; if (!pbuf) goto out; - pbuf->meas_type |= ISP2X_STAT_RAWHST0; hst = &pbuf->params.rawhist0; for (i = 0; i < ISP2X_HIST_BIN_N_MAX; i++) hst->hist_bin[i] = rkisp_read(stats_vdev->dev, ISP_RAWHIST_LITE_RO_BASE_BIN, true); out: - rkisp_write(stats_vdev->dev, ISP_RAWHIST_LITE_CTRL, ctrl, true); - return 0; + value = rkisp_read(stats_vdev->dev, ISP_RAWHIST_LITE_CTRL, true); + value |= ISP2X_3A_MEAS_DONE; + rkisp_write(stats_vdev->dev, ISP_RAWHIST_LITE_CTRL, value, true); } static void @@ -723,7 +662,7 @@ ISP2X_SIAWB_GET_MEAN_Y_G(reg_val); } -static int +static void rkisp_stats_get_rawawb_meas_ddr(struct rkisp_isp_stats_vdev *stats_vdev, struct rkisp_isp2x_stat_buffer *pbuf) { @@ -733,7 +672,7 @@ u32 i; if (!pbuf) - goto out; + goto OUT; pbuf->meas_type |= ISP2X_STAT_RAWAWB; @@ -830,11 +769,10 @@ pbuf->params.rawawb.ramdata[2 * i].r = (msb & 0x3FFFF0) >> 4; pbuf->params.rawawb.ramdata[2 * i].wp = (msb & 0x01C00000) >> 22; -out: +OUT: value = rkisp_read(stats_vdev->dev, ISP_RAWAWB_CTRL, true); value |= ISP2X_3A_MEAS_DONE; rkisp_write(stats_vdev->dev, ISP_RAWAWB_CTRL, value, true); - return 0; } static void @@ -861,7 +799,7 @@ af->win[2].lum = ddr_addr[6]; } -static int +static void rkisp_stats_get_rawaf_meas_ddr(struct rkisp_isp_stats_vdev *stats_vdev, struct rkisp_isp2x_stat_buffer *pbuf) { @@ -871,7 +809,7 @@ int i; if (!pbuf) - goto out; + goto OUT; af = &pbuf->params.rawaf; pbuf->meas_type |= ISP2X_STAT_RAWAF; @@ -888,15 +826,14 @@ for (i = 0; i < ISP2X_RAWAF_SUMDATA_ROW * ISP2X_RAWAF_SUMDATA_COLUMN; i++) af->ramdata[i] = ddr_addr[i]; -out: +OUT: value = rkisp_read(stats_vdev->dev, ISP_RAWAF_CTRL, true); value |= ISP2X_3A_MEAS_DONE; rkisp_write(stats_vdev->dev, ISP_RAWAF_CTRL, value, true); rkisp_write(stats_vdev->dev, ISP_RAWAF_INT_STATE, 0, true); - return 0; } -static int +static void rkisp_stats_get_yuvae_meas_ddr(struct rkisp_isp_stats_vdev *stats_vdev, struct rkisp_isp2x_stat_buffer *pbuf) { @@ -905,7 +842,7 @@ int i; if (!pbuf) - goto out; + goto OUT; pbuf->meas_type |= ISP2X_STAT_YUVAE; @@ -925,11 +862,10 @@ pbuf->params.yuvae.ro_yuvae_sumy[i] = rkisp_read(stats_vdev->dev, ISP_YUVAE_WND1_SUMY + 4 * i, true); -out: +OUT: value = rkisp_read(stats_vdev->dev, ISP_YUVAE_CTRL, true); value |= ISP2X_3A_MEAS_DONE; rkisp_write(stats_vdev->dev, ISP_YUVAE_CTRL, value, true); - return 0; } static void @@ -960,7 +896,7 @@ } } -static int +static void rkisp_stats_get_rawaebig_meas_ddr(struct rkisp_isp_stats_vdev *stats_vdev, struct isp2x_rawaebig_stat *ae, u32 blk_no) { @@ -987,7 +923,7 @@ } if (!ae) - goto out; + goto OUT; for (i = 0; i < ISP2X_RAWAEBIG_SUBWIN_NUM; i++) ae->sumr[i] = rkisp_read(stats_vdev->dev, addr + RAWAE_BIG_WND1_SUMR + i * 4, true); @@ -1005,14 +941,13 @@ ae->data[i].channelr_xy = ISP2X_RAWAEBIG_GET_MEAN_R(value); } -out: +OUT: value = rkisp_read(stats_vdev->dev, addr + RAWAE_BIG_CTRL, true); value |= ISP2X_3A_MEAS_DONE; rkisp_write(stats_vdev->dev, addr + RAWAE_BIG_CTRL, value, true); - return 0; } -static int +static void rkisp_stats_get_rawhstbig_meas_ddr(struct rkisp_isp_stats_vdev *stats_vdev, struct isp2x_rawhistbig_stat *hst, u32 blk_no) { @@ -1039,121 +974,78 @@ } if (!hst) - goto out; + goto OUT; for (i = 0; i < ISP2X_HIST_BIN_N_MAX; i++) hst->hist_bin[i] = ddr_addr[i]; -out: +OUT: value = rkisp_read(stats_vdev->dev, addr + ISP_RAWHIST_BIG_CTRL, true); value |= ISP2X_3A_MEAS_DONE; rkisp_write(stats_vdev->dev, addr + ISP_RAWHIST_BIG_CTRL, value, true); - return 0; } -static int +static void rkisp_stats_get_rawae1_meas_ddr(struct rkisp_isp_stats_vdev *stats_vdev, struct rkisp_isp2x_stat_buffer *pbuf) { - int ret = 0; - - if (!pbuf) { + if (!pbuf) rkisp_stats_get_rawaebig_meas_ddr(stats_vdev, NULL, 1); - } else { - ret = rkisp_stats_get_rawaebig_meas_ddr(stats_vdev, &pbuf->params.rawae1, 1); - if (!ret) - pbuf->meas_type |= ISP2X_STAT_RAWAE1; - } - - return ret; + else + rkisp_stats_get_rawaebig_meas_ddr(stats_vdev, &pbuf->params.rawae1, 1); } -static int +static void rkisp_stats_get_rawhst1_meas_ddr(struct rkisp_isp_stats_vdev *stats_vdev, struct rkisp_isp2x_stat_buffer *pbuf) { - int ret = 0; - - if (!pbuf) { + if (!pbuf) rkisp_stats_get_rawhstbig_meas_ddr(stats_vdev, NULL, 1); - } else { - ret = rkisp_stats_get_rawhstbig_meas_ddr(stats_vdev, &pbuf->params.rawhist1, 1); - if (!ret) - pbuf->meas_type |= ISP2X_STAT_RAWHST1; - } - - return ret; + else + rkisp_stats_get_rawhstbig_meas_ddr(stats_vdev, &pbuf->params.rawhist1, 1); } -static int +static void rkisp_stats_get_rawae2_meas_ddr(struct rkisp_isp_stats_vdev *stats_vdev, struct rkisp_isp2x_stat_buffer *pbuf) { - int ret = 0; - - if (!pbuf) { + if (!pbuf) rkisp_stats_get_rawaebig_meas_ddr(stats_vdev, NULL, 2); - } else { - ret = rkisp_stats_get_rawaebig_meas_ddr(stats_vdev, &pbuf->params.rawae2, 2); - if (!ret) - pbuf->meas_type |= ISP2X_STAT_RAWAE2; - } - - return ret; + else + rkisp_stats_get_rawaebig_meas_ddr(stats_vdev, &pbuf->params.rawae2, 2); } -static int +static void rkisp_stats_get_rawhst2_meas_ddr(struct rkisp_isp_stats_vdev *stats_vdev, struct rkisp_isp2x_stat_buffer *pbuf) { - int ret = 0; - - if (!pbuf) { + if (!pbuf) rkisp_stats_get_rawhstbig_meas_ddr(stats_vdev, NULL, 2); - } else { - ret = rkisp_stats_get_rawhstbig_meas_ddr(stats_vdev, &pbuf->params.rawhist2, 2); - if (!ret) - pbuf->meas_type |= ISP2X_STAT_RAWHST2; - } - - return ret; + else + rkisp_stats_get_rawhstbig_meas_ddr(stats_vdev, &pbuf->params.rawhist2, 2); } -static int +static void rkisp_stats_get_rawae3_meas_ddr(struct rkisp_isp_stats_vdev *stats_vdev, struct rkisp_isp2x_stat_buffer *pbuf) { - int ret = 0; - - if (!pbuf) { + if (!pbuf) rkisp_stats_get_rawaebig_meas_ddr(stats_vdev, NULL, 0); - } else { + else rkisp_stats_get_rawaebig_meas_ddr(stats_vdev, &pbuf->params.rawae3, 0); - if (!ret) - pbuf->meas_type |= ISP2X_STAT_RAWAE3; - } - - return ret; } -static int +static void rkisp_stats_get_rawhst3_meas_ddr(struct rkisp_isp_stats_vdev *stats_vdev, struct rkisp_isp2x_stat_buffer *pbuf) { - int ret = 0; - - if (!pbuf) { + if (!pbuf) rkisp_stats_get_rawhstbig_meas_ddr(stats_vdev, NULL, 0); - } else { - ret = rkisp_stats_get_rawhstbig_meas_ddr(stats_vdev, &pbuf->params.rawhist3, 0); - if (!ret) - pbuf->meas_type |= ISP2X_STAT_RAWHST3; - } - - return ret; + else + rkisp_stats_get_rawhstbig_meas_ddr(stats_vdev, &pbuf->params.rawhist3, 0); } -static int +static void rkisp_stats_get_rawaelite_meas_ddr(struct rkisp_isp_stats_vdev *stats_vdev, struct rkisp_isp2x_stat_buffer *pbuf) { @@ -1163,10 +1055,13 @@ int i; if (!pbuf) - goto out; + goto OUT; - pbuf->meas_type |= ISP2X_STAT_RAWAE0; ae = &pbuf->params.rawae0; + value = rkisp_read(stats_vdev->dev, ISP_RAWAE_LITE_CTRL, true); + if ((value & ISP2X_3A_MEAS_DONE) == 0) + return; + rd_buf_idx = stats_vdev->rd_buf_idx; ddr_addr = stats_vdev->stats_buf[rd_buf_idx].vaddr + 0x0AB0; for (i = 0; i < ISP2X_RAWAELITE_MEAN_NUM; i++) { @@ -1176,14 +1071,13 @@ ae->data[i].channelr_xy = ISP2X_RAWAEBIG_GET_MEAN_R(value); } -out: +OUT: value = rkisp_read(stats_vdev->dev, ISP_RAWAE_LITE_CTRL, true); value |= ISP2X_3A_MEAS_DONE; rkisp_write(stats_vdev->dev, ISP_RAWAE_LITE_CTRL, value, true); - return 0; } -static int +static void rkisp_stats_get_rawhstlite_meas_ddr(struct rkisp_isp_stats_vdev *stats_vdev, struct rkisp_isp2x_stat_buffer *pbuf) { @@ -1193,9 +1087,8 @@ int i; if (!pbuf) - goto out; + goto OUT; - pbuf->meas_type |= ISP2X_STAT_RAWHST0; hst = &pbuf->params.rawhist0; rd_buf_idx = stats_vdev->rd_buf_idx; @@ -1204,11 +1097,10 @@ for (i = 0; i < ISP2X_HIST_BIN_N_MAX; i++) hst->hist_bin[i] = ddr_addr[i]; -out: +OUT: value = rkisp_read(stats_vdev->dev, ISP_RAWHIST_LITE_CTRL, true); value |= ISP2X_3A_MEAS_DONE; rkisp_write(stats_vdev->dev, ISP_RAWHIST_LITE_CTRL, value, true); - return 0; } static struct rkisp_stats_v2x_ops __maybe_unused rkisp_stats_ddr_ops_v2x = { @@ -1237,15 +1129,14 @@ { unsigned int cur_frame_id = -1; struct rkisp_isp2x_stat_buffer *cur_stat_buf = NULL; - struct rkisp_buffer *cur_buf = stats_vdev->cur_buf; + struct rkisp_buffer *cur_buf = NULL; struct rkisp_stats_v2x_ops *ops = (struct rkisp_stats_v2x_ops *)stats_vdev->priv_ops; - int ret = 0; cur_frame_id = meas_work->frame_id; spin_lock(&stats_vdev->rd_lock); /* get one empty buffer */ - if (!cur_buf && !list_empty(&stats_vdev->stat)) { + if (!list_empty(&stats_vdev->stat)) { cur_buf = list_first_entry(&stats_vdev->stat, struct rkisp_buffer, queue); list_del(&cur_buf->queue); @@ -1258,11 +1149,18 @@ cur_stat_buf->frame_id = cur_frame_id; } - if (meas_work->isp_ris & ISP2X_SIAWB_DONE) + if (meas_work->isp_ris & ISP2X_SIAWB_DONE) { ops->get_siawb_meas(stats_vdev, cur_stat_buf); - if (meas_work->isp_ris & ISP2X_SIAF_FIN) + if (cur_stat_buf) + cur_stat_buf->meas_type |= ISP2X_STAT_SIAWB; + } + + if (meas_work->isp_ris & ISP2X_SIAF_FIN) { ops->get_siaf_meas(stats_vdev, cur_stat_buf); + if (cur_stat_buf) + cur_stat_buf->meas_type |= ISP2X_STAT_SIAF; + } if (meas_work->isp_ris & ISP2X_AFM_SUM_OF) v4l2_warn(stats_vdev->vnode.vdev.v4l2_dev, @@ -1272,17 +1170,29 @@ v4l2_warn(stats_vdev->vnode.vdev.v4l2_dev, "ISP2X_AFM_LUM_OF\n"); - if (meas_work->isp_ris & ISP2X_YUVAE_END) - ret |= ops->get_yuvae_meas(stats_vdev, cur_stat_buf); + if (meas_work->isp_ris & ISP2X_YUVAE_END) { + ops->get_yuvae_meas(stats_vdev, cur_stat_buf); + if (cur_stat_buf) + cur_stat_buf->meas_type |= ISP2X_STAT_YUVAE; + } - if (meas_work->isp_ris & ISP2X_SIHST_RDY) + if (meas_work->isp_ris & ISP2X_SIHST_RDY) { ops->get_sihst_meas(stats_vdev, cur_stat_buf); + if (cur_stat_buf) + cur_stat_buf->meas_type |= ISP2X_STAT_SIHST; + } - if (meas_work->isp3a_ris & ISP2X_3A_RAWAWB) - ret |= ops->get_rawawb_meas(stats_vdev, cur_stat_buf); + if (meas_work->isp3a_ris & ISP2X_3A_RAWAWB) { + ops->get_rawawb_meas(stats_vdev, cur_stat_buf); + if (cur_stat_buf) + cur_stat_buf->meas_type |= ISP2X_STAT_RAWAWB; + } - if (meas_work->isp3a_ris & ISP2X_3A_RAWAF) - ret |= ops->get_rawaf_meas(stats_vdev, cur_stat_buf); + if (meas_work->isp3a_ris & ISP2X_3A_RAWAF) { + ops->get_rawaf_meas(stats_vdev, cur_stat_buf); + if (cur_stat_buf) + cur_stat_buf->meas_type |= ISP2X_STAT_RAWAF; + } if (meas_work->isp3a_ris & ISP2X_3A_RAWAF_SUM) v4l2_warn(stats_vdev->vnode.vdev.v4l2_dev, @@ -1292,29 +1202,53 @@ v4l2_warn(stats_vdev->vnode.vdev.v4l2_dev, "ISP2X_3A_RAWAF_LUM\n"); - if (meas_work->isp3a_ris & ISP2X_3A_RAWAE_BIG) - ret |= ops->get_rawae3_meas(stats_vdev, cur_stat_buf); + if (meas_work->isp3a_ris & ISP2X_3A_RAWAE_BIG) { + ops->get_rawae3_meas(stats_vdev, cur_stat_buf); + if (cur_stat_buf) + cur_stat_buf->meas_type |= ISP2X_STAT_RAWAE3; + } - if (meas_work->isp3a_ris & ISP2X_3A_RAWHIST_BIG) - ret |= ops->get_rawhst3_meas(stats_vdev, cur_stat_buf); + if (meas_work->isp3a_ris & ISP2X_3A_RAWHIST_BIG) { + ops->get_rawhst3_meas(stats_vdev, cur_stat_buf); + if (cur_stat_buf) + cur_stat_buf->meas_type |= ISP2X_STAT_RAWHST3; + } - if (meas_work->isp3a_ris & ISP2X_3A_RAWAE_CH0) - ret |= ops->get_rawae0_meas(stats_vdev, cur_stat_buf); + if (meas_work->isp3a_ris & ISP2X_3A_RAWAE_CH0) { + ops->get_rawae0_meas(stats_vdev, cur_stat_buf); + if (cur_stat_buf) + cur_stat_buf->meas_type |= ISP2X_STAT_RAWAE0; + } - if (meas_work->isp3a_ris & ISP2X_3A_RAWAE_CH1) - ret |= ops->get_rawae1_meas(stats_vdev, cur_stat_buf); + if (meas_work->isp3a_ris & ISP2X_3A_RAWAE_CH1) { + ops->get_rawae1_meas(stats_vdev, cur_stat_buf); + if (cur_stat_buf) + cur_stat_buf->meas_type |= ISP2X_STAT_RAWAE1; + } - if (meas_work->isp3a_ris & ISP2X_3A_RAWAE_CH2) - ret |= ops->get_rawae2_meas(stats_vdev, cur_stat_buf); + if (meas_work->isp3a_ris & ISP2X_3A_RAWAE_CH2) { + ops->get_rawae2_meas(stats_vdev, cur_stat_buf); + if (cur_stat_buf) + cur_stat_buf->meas_type |= ISP2X_STAT_RAWAE2; + } - if (meas_work->isp3a_ris & ISP2X_3A_RAWHIST_CH0) - ret |= ops->get_rawhst0_meas(stats_vdev, cur_stat_buf); + if (meas_work->isp3a_ris & ISP2X_3A_RAWHIST_CH0) { + ops->get_rawhst0_meas(stats_vdev, cur_stat_buf); + if (cur_stat_buf) + cur_stat_buf->meas_type |= ISP2X_STAT_RAWHST0; + } - if (meas_work->isp3a_ris & ISP2X_3A_RAWHIST_CH1) - ret |= ops->get_rawhst1_meas(stats_vdev, cur_stat_buf); + if (meas_work->isp3a_ris & ISP2X_3A_RAWHIST_CH1) { + ops->get_rawhst1_meas(stats_vdev, cur_stat_buf); + if (cur_stat_buf) + cur_stat_buf->meas_type |= ISP2X_STAT_RAWHST1; + } - if (meas_work->isp3a_ris & ISP2X_3A_RAWHIST_CH2) - ret |= ops->get_rawhst2_meas(stats_vdev, cur_stat_buf); + if (meas_work->isp3a_ris & ISP2X_3A_RAWHIST_CH2) { + ops->get_rawhst2_meas(stats_vdev, cur_stat_buf); + if (cur_stat_buf) + cur_stat_buf->meas_type |= ISP2X_STAT_RAWHST2; + } if (meas_work->isp_ris & ISP2X_FRAME) { ops->get_bls_stats(stats_vdev, cur_stat_buf); @@ -1322,7 +1256,7 @@ ops->get_dhaz_stats(stats_vdev, cur_stat_buf); } - if (cur_buf && !ret) { + if (cur_buf) { bool reg_withstream = false; struct v4l2_subdev *sd = v4l2_get_subdev_hostdata(&stats_vdev->dev->br_dev.sd); @@ -1339,9 +1273,7 @@ memcpy(tmp_statsbuf, cur_stat_buf, sizeof(*cur_stat_buf)); } vb2_buffer_done(&cur_buf->vb.vb2_buf, VB2_BUF_STATE_DONE); - cur_buf = NULL; } - stats_vdev->cur_buf = cur_buf; } static void @@ -1447,7 +1379,7 @@ if ((isp_ris & ISP2X_FRAME) && stats_vdev->rd_stats_from_ddr) { wr_buf_idx = stats_vdev->wr_buf_idx; stats_vdev->rd_buf_idx = wr_buf_idx; - rkisp_finish_buffer(dev, &stats_vdev->stats_buf[wr_buf_idx]); + wr_buf_idx = (wr_buf_idx + 1) % RKISP_STATS_DDR_BUF_NUM; stats_vdev->wr_buf_idx = wr_buf_idx; rkisp_write(stats_vdev->dev, MI_DBR_WR_SIZE, @@ -1474,9 +1406,20 @@ work.frame_id = cur_frame_id; work.isp_ris = temp_isp_ris | isp_ris; work.isp3a_ris = temp_isp3a_ris | iq_3a_mask; - work.timestamp = ktime_get_ns(); + work.timestamp = rkisp_time_get_ns(dev); - rkisp_stats_send_meas_v2x(stats_vdev, &work); + if (!IS_HDR_RDBK(dev->hdr.op_mode)) { + if (!kfifo_is_full(&stats_vdev->rd_kfifo)) + kfifo_in(&stats_vdev->rd_kfifo, + &work, sizeof(work)); + else + v4l2_err(stats_vdev->vnode.vdev.v4l2_dev, + "stats kfifo is full\n"); + + tasklet_schedule(&stats_vdev->rd_tasklet); + } else { + rkisp_stats_send_meas_v2x(stats_vdev, &work); + } } /* -- Gitblit v1.6.2