From 9342eb601f8f180abdd7d2d21a84969085ea0c96 Mon Sep 17 00:00:00 2001 From: Hu Kejun Date: Sun, 28 Jun 2020 14:24:04 +0800 Subject: [PATCH] media: rockchip: isp: fix ae window is not correct Signed-off-by: Hu Kejun Change-Id: Ie98897c7e63bbaac724357d1ee4b6964071a9346 --- .../platform/rockchip/isp/isp_params_v2x.c | 35 ++++++++++++++----- 1 file changed, 26 insertions(+), 9 deletions(-) diff --git a/drivers/media/platform/rockchip/isp/isp_params_v2x.c b/drivers/media/platform/rockchip/isp/isp_params_v2x.c index 2e9d5b66564f..a78c3b2e83fc 100644 --- a/drivers/media/platform/rockchip/isp/isp_params_v2x.c +++ b/drivers/media/platform/rockchip/isp/isp_params_v2x.c @@ -1702,8 +1702,9 @@ static void isp_rawaelite_config(struct rkisp_isp_params_vdev *params_vdev, const struct isp2x_rawaelite_meas_cfg *arg) { - u32 value; - u32 block_hsize, block_vsize; + struct rkisp_device *ispdev = params_vdev->dev; + struct v4l2_rect *out_crop = &ispdev->isp_sdev.out_crop; + u32 block_hsize, block_vsize, value; u32 wnd_num_idx = 0; const u32 ae_wnd_num[] = { 1, 5 @@ -1723,8 +1724,16 @@ isp_rawaelite_config(struct rkisp_isp_params_vdev *params_vdev, ISP2X_RAWAE_LITE_H_OFFSET_SET(arg->win.h_offs), ISP_RAWAE_LITE_OFFSET); - block_hsize = arg->win.h_size / ae_wnd_num[wnd_num_idx] - 1; - block_vsize = arg->win.v_size / ae_wnd_num[wnd_num_idx] - 1; + block_hsize = arg->win.h_size / ae_wnd_num[wnd_num_idx]; + value = block_hsize * ae_wnd_num[wnd_num_idx] + arg->win.h_offs; + if (value + 1 > out_crop->width) + block_hsize -= 1; + block_vsize = arg->win.v_size / ae_wnd_num[wnd_num_idx]; + value = block_vsize * ae_wnd_num[wnd_num_idx] + arg->win.v_offs; + if (value + 2 > out_crop->height) + block_vsize -= 1; + if (block_vsize % 2) + block_vsize -= 1; rkisp_iowrite32(params_vdev, ISP2X_RAWAE_LITE_V_SIZE_SET(block_vsize) | ISP2X_RAWAE_LITE_H_SIZE_SET(block_hsize), @@ -1756,14 +1765,14 @@ static void isp_rawaebig_config(struct rkisp_isp_params_vdev *params_vdev, const struct isp2x_rawaebig_meas_cfg *arg, u32 blk_no) { - u32 i; - u32 value; + struct rkisp_device *ispdev = params_vdev->dev; + struct v4l2_rect *out_crop = &ispdev->isp_sdev.out_crop; u32 block_hsize, block_vsize; + u32 addr, i, value; u32 wnd_num_idx = 0; const u32 ae_wnd_num[] = { 1, 5, 15, 15 }; - u32 addr; switch (blk_no) { case 0: @@ -1808,8 +1817,16 @@ isp_rawaebig_config(struct rkisp_isp_params_vdev *params_vdev, ISP2X_RAWAEBIG_H_OFFSET_SET(arg->win.h_offs), addr + RAWAE_BIG_OFFSET); - block_hsize = arg->win.h_size / ae_wnd_num[wnd_num_idx] - 1; - block_vsize = arg->win.v_size / ae_wnd_num[wnd_num_idx] - 1; + block_hsize = arg->win.h_size / ae_wnd_num[wnd_num_idx]; + value = block_hsize * ae_wnd_num[wnd_num_idx] + arg->win.h_offs; + if (value + 1 > out_crop->width) + block_hsize -= 1; + block_vsize = arg->win.v_size / ae_wnd_num[wnd_num_idx]; + value = block_vsize * ae_wnd_num[wnd_num_idx] + arg->win.v_offs; + if (value + 2 > out_crop->height) + block_vsize -= 1; + if (block_vsize % 2) + block_vsize -= 1; rkisp_iowrite32(params_vdev, ISP2X_RAWAEBIG_V_SIZE_SET(block_vsize) | ISP2X_RAWAEBIG_H_SIZE_SET(block_hsize),