From 47984bb96450526588679c7eb115fda7d873b617 Mon Sep 17 00:00:00 2001 From: Hu Kejun Date: Sun, 5 Jan 2020 22:29:08 +0800 Subject: [PATCH] media: rockchip: isp: add other iq config function Change-Id: I79d6aab382eb79489f0aee19812233b34f012b72 Signed-off-by: Hu Kejun --- drivers/media/platform/rockchip/isp/capture.c | 35 +- drivers/media/platform/rockchip/isp/common.h | 23 + .../media/platform/rockchip/isp/isp_params.c | 23 +- .../media/platform/rockchip/isp/isp_params.h | 3 + .../platform/rockchip/isp/isp_params_v1x.c | 12 + .../platform/rockchip/isp/isp_params_v1x.h | 1 + .../platform/rockchip/isp/isp_params_v2x.c | 2751 +++++++++++++---- .../platform/rockchip/isp/isp_params_v2x.h | 45 +- .../media/platform/rockchip/isp/isp_stats.c | 10 +- .../media/platform/rockchip/isp/isp_stats.h | 2 +- .../platform/rockchip/isp/isp_stats_v2x.c | 186 +- .../platform/rockchip/isp/isp_stats_v2x.h | 35 +- .../media/platform/rockchip/isp/regs_v2x.h | 76 +- include/uapi/linux/rkisp2-config.h | 259 +- 14 files changed, 2690 insertions(+), 771 deletions(-) diff --git a/drivers/media/platform/rockchip/isp/capture.c b/drivers/media/platform/rockchip/isp/capture.c index b36c70c94348..d1180c05d9ab 100644 --- a/drivers/media/platform/rockchip/isp/capture.c +++ b/drivers/media/platform/rockchip/isp/capture.c @@ -1514,29 +1514,6 @@ static int mi_frame_end(struct rkisp_stream *stream) /***************************** vb2 operations*******************************/ -static int rkisp_allow_buffer(struct rkisp_device *dev, - struct rkisp_dummy_buffer *buf) -{ - int ret = 0; - - buf->vaddr = dma_alloc_coherent(dev->dev, buf->size, - &buf->dma_addr, GFP_KERNEL); - if (!buf->vaddr) - ret = -ENOMEM; - return ret; -} - -static void rkisp_free_buffer(struct rkisp_device *dev, - struct rkisp_dummy_buffer *buf) -{ - if (buf && buf->vaddr && buf->size) { - dma_free_coherent(dev->dev, buf->size, - buf->vaddr, buf->dma_addr); - buf->size = 0; - buf->vaddr = NULL; - } -} - static int rkisp_create_hdr_buf(struct rkisp_device *dev) { int i, j, max_dma, max_buf = 1; @@ -1557,7 +1534,7 @@ static int rkisp_create_hdr_buf(struct rkisp_device *dev) for (j = 0; j < max_buf; j++) { buf = &dev->hdr.dummy_buf[i][j]; buf->size = size; - if (rkisp_allow_buffer(dev, buf) < 0) { + if (rkisp_alloc_buffer(dev->dev, buf) < 0) { v4l2_err(&dev->v4l2_dev, "Failed to allocate the memory for hdr buffer\n"); return -ENOMEM; @@ -1619,17 +1596,17 @@ void hdr_destroy_buf(struct rkisp_device *dev) for (i = 0; i < max_dma; i++) { buf = dev->hdr.rx_cur_buf[i]; if (buf) { - rkisp_free_buffer(dev, buf); + rkisp_free_buffer(dev->dev, buf); dev->hdr.rx_cur_buf[i] = NULL; } for (j = 0; j < max_buf; j++) { buf = hdr_dqbuf(&dev->hdr.q_tx[i]); if (buf) - rkisp_free_buffer(dev, buf); + rkisp_free_buffer(dev->dev, buf); buf = hdr_dqbuf(&dev->hdr.q_rx[i]); if (buf) - rkisp_free_buffer(dev, buf); + rkisp_free_buffer(dev->dev, buf); } } } @@ -2015,7 +1992,7 @@ static int rkisp_create_dummy_buf(struct rkisp_stream *stream) dummy_buf->size = max(dummy_buf->size, in_size); } - if (rkisp_allow_buffer(dev, dummy_buf) < 0) { + if (rkisp_alloc_buffer(dev->dev, dummy_buf) < 0) { v4l2_err(&dev->v4l2_dev, "Failed to allocate the memory for dummy buffer\n"); return -ENOMEM; @@ -2032,7 +2009,7 @@ static void rkisp_destroy_dummy_buf(struct rkisp_stream *stream) struct rkisp_dummy_buffer *dummy_buf = &stream->dummy_buf; struct rkisp_device *dev = stream->ispdev; - rkisp_free_buffer(dev, dummy_buf); + rkisp_free_buffer(dev->dev, dummy_buf); if (dev->isp_ver == ISP_V20) hdr_destroy_buf(dev); } diff --git a/drivers/media/platform/rockchip/isp/common.h b/drivers/media/platform/rockchip/isp/common.h index 29305cc02f21..2f9fff318e95 100644 --- a/drivers/media/platform/rockchip/isp/common.h +++ b/drivers/media/platform/rockchip/isp/common.h @@ -133,4 +133,27 @@ static inline struct vb2_queue *to_vb2_queue(struct file *file) return &vnode->buf_queue; } +static inline int rkisp_alloc_buffer(struct device *dev, + struct rkisp_dummy_buffer *buf) +{ + int ret = 0; + + buf->vaddr = dma_alloc_coherent(dev, buf->size, + &buf->dma_addr, GFP_KERNEL); + if (!buf->vaddr) + ret = -ENOMEM; + return ret; +} + +static inline void rkisp_free_buffer(struct device *dev, + struct rkisp_dummy_buffer *buf) +{ + if (buf && buf->vaddr && buf->size) { + dma_free_coherent(dev, buf->size, + buf->vaddr, buf->dma_addr); + buf->size = 0; + buf->vaddr = NULL; + } +} + #endif /* _RKISP_COMMON_H */ diff --git a/drivers/media/platform/rockchip/isp/isp_params.c b/drivers/media/platform/rockchip/isp/isp_params.c index 5178e7f8dce4..e76da6118991 100644 --- a/drivers/media/platform/rockchip/isp/isp_params.c +++ b/drivers/media/platform/rockchip/isp/isp_params.c @@ -110,11 +110,7 @@ static int rkisp_params_vb2_queue_setup(struct vb2_queue *vq, RKISP_ISP_PARAMS_REQ_BUFS_MAX); *num_planes = 1; - - if (params_vdev->dev->isp_ver <= ISP_V13) - sizes[0] = sizeof(struct rkisp1_isp_params_cfg); - else - sizes[0] = sizeof(struct isp2x_isp_params_cfg); + params_vdev->ops->get_param_size(params_vdev, sizes); INIT_LIST_HEAD(¶ms_vdev->params); params_vdev->first_params = true; @@ -192,6 +188,7 @@ rkisp_params_vb2_start_streaming(struct vb2_queue *queue, unsigned int count) struct rkisp_isp_params_vdev *params_vdev = queue->drv_priv; unsigned long flags; + params_vdev->hdrtmo_en = false; spin_lock_irqsave(¶ms_vdev->config_lock, flags); params_vdev->streamon = true; spin_unlock_irqrestore(¶ms_vdev->config_lock, flags); @@ -247,6 +244,14 @@ static void rkisp_init_params_vdev(struct rkisp_isp_params_vdev *params_vdev) rkisp_init_params_vdev_v2x(params_vdev); } +static void rkisp_uninit_params_vdev(struct rkisp_isp_params_vdev *params_vdev) +{ + if (params_vdev->dev->isp_ver <= ISP_V13) + rkisp_uninit_params_vdev_v1x(params_vdev); + else + rkisp_uninit_params_vdev_v2x(params_vdev); +} + void rkisp_params_isr(struct rkisp_isp_params_vdev *params_vdev, u32 isp_mis) { @@ -317,13 +322,17 @@ int rkisp_register_params_vdev(struct rkisp_isp_params_vdev *params_vdev, ret = media_create_pad_link(source, 0, sink, RKISP_ISP_PAD_SINK_PARAMS, MEDIA_LNK_FL_ENABLED); if (ret < 0) - goto err_cleanup_media_entity; + goto err_unregister_video; return 0; + +err_unregister_video: + video_unregister_device(vdev); err_cleanup_media_entity: media_entity_cleanup(&vdev->entity); err_release_queue: vb2_queue_release(vdev->queue); + rkisp_uninit_params_vdev(params_vdev); return ret; } @@ -335,4 +344,6 @@ void rkisp_unregister_params_vdev(struct rkisp_isp_params_vdev *params_vdev) video_unregister_device(vdev); media_entity_cleanup(&vdev->entity); vb2_queue_release(vdev->queue); + rkisp_uninit_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 35ce6acd5a1a..0deaa609b355 100644 --- a/drivers/media/platform/rockchip/isp/isp_params.h +++ b/drivers/media/platform/rockchip/isp/isp_params.h @@ -12,6 +12,7 @@ struct rkisp_isp_params_vdev; struct rkisp_isp_params_ops { void (*save_first_param)(struct rkisp_isp_params_vdev *params_vdev, void *param); void (*clear_first_param)(struct rkisp_isp_params_vdev *params_vdev); + void (*get_param_size)(struct rkisp_isp_params_vdev *params_vdev, unsigned int sizes[]); void (*config_isp)(struct rkisp_isp_params_vdev *params_vdev); void (*disable_isp)(struct rkisp_isp_params_vdev *params_vdev); void (*isr_hdl)(struct rkisp_isp_params_vdev *params_vdev, @@ -37,6 +38,7 @@ struct rkisp_isp_params_vdev { struct v4l2_format vdev_fmt; bool streamon; bool first_params; + bool hdrtmo_en; enum v4l2_quantization quantization; enum rkisp_fmt_raw_pat_type raw_type; @@ -47,6 +49,7 @@ struct rkisp_isp_params_vdev { struct rkisp_isp_params_ops *ops; void *priv_ops; void *priv_cfg; + void *priv_val; }; /* config params before ISP streaming */ diff --git a/drivers/media/platform/rockchip/isp/isp_params_v1x.c b/drivers/media/platform/rockchip/isp/isp_params_v1x.c index a9da239c0a39..9ce356dd28c2 100644 --- a/drivers/media/platform/rockchip/isp/isp_params_v1x.c +++ b/drivers/media/platform/rockchip/isp/isp_params_v1x.c @@ -2265,6 +2265,12 @@ static void rkisp1_clear_first_param_v1x(struct rkisp_isp_params_vdev *params_vd params_vdev->isp1x_params.module_en_update = 0; } +static void +rkisp1_get_param_size_v1x(struct rkisp_isp_params_vdev *params_vdev, unsigned int sizes[]) +{ + sizes[0] = sizeof(struct rkisp1_isp_params_cfg); +} + /* Not called when the camera active, thus not isr protection. */ static void rkisp1_params_disable_isp_v1x(struct rkisp_isp_params_vdev *params_vdev) { @@ -2342,6 +2348,7 @@ unlock: static struct rkisp_isp_params_ops rkisp_isp_params_ops_tbl = { .save_first_param = rkisp1_save_first_param_v1x, .clear_first_param = rkisp1_clear_first_param_v1x, + .get_param_size = rkisp1_get_param_size_v1x, .config_isp = rkisp1_params_configure_isp_v1x, .disable_isp = rkisp1_params_disable_isp_v1x, .isr_hdl = rkisp1_params_isr_v1x, @@ -2360,3 +2367,8 @@ void rkisp_init_params_vdev_v1x(struct rkisp_isp_params_vdev *params_vdev) params_vdev->priv_cfg = &rkisp1_v10_isp_params_config; } } + +void rkisp_uninit_params_vdev_v1x(struct rkisp_isp_params_vdev *params_vdev) +{ +} + diff --git a/drivers/media/platform/rockchip/isp/isp_params_v1x.h b/drivers/media/platform/rockchip/isp/isp_params_v1x.h index f527ec078f63..78ca8a85629e 100644 --- a/drivers/media/platform/rockchip/isp/isp_params_v1x.h +++ b/drivers/media/platform/rockchip/isp/isp_params_v1x.h @@ -77,5 +77,6 @@ struct rkisp_isp_params_v1x_config { }; void rkisp_init_params_vdev_v1x(struct rkisp_isp_params_vdev *params_vdev); +void rkisp_uninit_params_vdev_v1x(struct rkisp_isp_params_vdev *params_vdev); #endif /* _RKISP_ISP_PARAM_V1X_H */ diff --git a/drivers/media/platform/rockchip/isp/isp_params_v2x.c b/drivers/media/platform/rockchip/isp/isp_params_v2x.c index fc6f3e32bc08..48133c762724 100644 --- a/drivers/media/platform/rockchip/isp/isp_params_v2x.c +++ b/drivers/media/platform/rockchip/isp/isp_params_v2x.c @@ -58,36 +58,337 @@ static void isp_dpcc_config(struct rkisp_isp_params_vdev *params_vdev, const struct isp2x_dpcc_cfg *arg) { + u32 value; + int i; + + value = rkisp_ioread32(params_vdev, ISP_DPCC_MODE); + value &= ISP_DPCC_EN; + + value |= (arg->stage1_enable & 0x01) << 2 | + (arg->grayscale_mode & 0x01) << 1; + rkisp_iowrite32(params_vdev, value, ISP_DPCC_MODE); + + value = (arg->sw_rk_out_sel & 0x03) << 5 | + (arg->sw_dpcc_output_sel & 0x01) << 4 | + (arg->stage1_rb_3x3 & 0x01) << 3 | + (arg->stage1_g_3x3 & 0x01) << 2 | + (arg->stage1_incl_rb_center & 0x01) << 1 | + (arg->stage1_incl_green_center & 0x01); + rkisp_iowrite32(params_vdev, value, ISP_DPCC_OUTPUT_MODE); + + value = (arg->stage1_use_fix_set & 0x01) << 3 | + (arg->stage1_use_set_3 & 0x01) << 2 | + (arg->stage1_use_set_2 & 0x01) << 1 | + (arg->stage1_use_set_1 & 0x01); + rkisp_iowrite32(params_vdev, value, ISP_DPCC_SET_USE); + + value = (arg->sw_rk_red_blue1_en & 0x01) << 13 | + (arg->rg_red_blue1_enable & 0x01) << 12 | + (arg->rnd_red_blue1_enable & 0x01) << 11 | + (arg->ro_red_blue1_enable & 0x01) << 10 | + (arg->lc_red_blue1_enable & 0x01) << 9 | + (arg->pg_red_blue1_enable & 0x01) << 8 | + (arg->sw_rk_green1_en & 0x01) << 5 | + (arg->rg_green1_enable & 0x01) << 4 | + (arg->rnd_green1_enable & 0x01) << 3 | + (arg->ro_green1_enable & 0x01) << 2 | + (arg->lc_green1_enable & 0x01) << 1 | + (arg->pg_green1_enable & 0x01); + rkisp_iowrite32(params_vdev, value, ISP_DPCC_METHODS_SET_1); + + value = (arg->sw_rk_red_blue2_en & 0x01) << 13 | + (arg->rg_red_blue2_enable & 0x01) << 12 | + (arg->rnd_red_blue2_enable & 0x01) << 11 | + (arg->ro_red_blue2_enable & 0x01) << 10 | + (arg->lc_red_blue2_enable & 0x01) << 9 | + (arg->pg_red_blue2_enable & 0x01) << 8 | + (arg->sw_rk_green2_en & 0x01) << 5 | + (arg->rg_green2_enable & 0x01) << 4 | + (arg->rnd_green2_enable & 0x01) << 3 | + (arg->ro_green2_enable & 0x01) << 2 | + (arg->lc_green2_enable & 0x01) << 1 | + (arg->pg_green2_enable & 0x01); + rkisp_iowrite32(params_vdev, value, ISP_DPCC_METHODS_SET_2); + + value = (arg->sw_rk_red_blue3_en & 0x01) << 13 | + (arg->rg_red_blue3_enable & 0x01) << 12 | + (arg->rnd_red_blue3_enable & 0x01) << 11 | + (arg->ro_red_blue3_enable & 0x01) << 10 | + (arg->lc_red_blue3_enable & 0x01) << 9 | + (arg->pg_red_blue3_enable & 0x01) << 8 | + (arg->sw_rk_green3_en & 0x01) << 5 | + (arg->rg_green3_enable & 0x01) << 4 | + (arg->rnd_green3_enable & 0x01) << 3 | + (arg->ro_green3_enable & 0x01) << 2 | + (arg->lc_green3_enable & 0x01) << 1 | + (arg->pg_green3_enable & 0x01); + rkisp_iowrite32(params_vdev, value, ISP_DPCC_METHODS_SET_3); + + value = ISP2X_PACK_4BYTE(arg->line_thr_1_g, arg->line_thr_1_rb, + arg->sw_mindis1_g, arg->sw_mindis1_rb); + rkisp_iowrite32(params_vdev, value, ISP_DPCC_LINE_THRESH_1); + + value = ISP2X_PACK_4BYTE(arg->line_mad_fac_1_g, arg->line_mad_fac_1_rb, + arg->sw_dis_scale_max1, arg->sw_dis_scale_min1); + rkisp_iowrite32(params_vdev, value, ISP_DPCC_LINE_MAD_FAC_1); + + value = ISP2X_PACK_4BYTE(arg->pg_fac_1_g, arg->pg_fac_1_rb, 0, 0); + rkisp_iowrite32(params_vdev, value, ISP_DPCC_PG_FAC_1); + + value = ISP2X_PACK_4BYTE(arg->rnd_thr_1_g, arg->rnd_thr_1_rb, 0, 0); + rkisp_iowrite32(params_vdev, value, ISP_DPCC_RND_THRESH_1); + + value = ISP2X_PACK_4BYTE(arg->rg_fac_1_g, arg->rg_fac_1_rb, 0, 0); + rkisp_iowrite32(params_vdev, value, ISP_DPCC_RG_FAC_1); + + value = ISP2X_PACK_4BYTE(arg->line_thr_2_g, arg->line_thr_2_rb, + arg->sw_mindis2_g, arg->sw_mindis2_rb); + rkisp_iowrite32(params_vdev, value, ISP_DPCC_LINE_THRESH_2); + + value = ISP2X_PACK_4BYTE(arg->line_mad_fac_2_g, arg->line_mad_fac_2_rb, + arg->sw_dis_scale_max2, arg->sw_dis_scale_min2); + rkisp_iowrite32(params_vdev, value, ISP_DPCC_LINE_MAD_FAC_2); + + value = ISP2X_PACK_4BYTE(arg->pg_fac_2_g, arg->pg_fac_2_rb, 0, 0); + rkisp_iowrite32(params_vdev, value, ISP_DPCC_PG_FAC_2); + + value = ISP2X_PACK_4BYTE(arg->rnd_thr_2_g, arg->rnd_thr_2_rb, 0, 0); + rkisp_iowrite32(params_vdev, value, ISP_DPCC_RND_THRESH_2); + + value = ISP2X_PACK_4BYTE(arg->rg_fac_2_g, arg->rg_fac_2_rb, 0, 0); + rkisp_iowrite32(params_vdev, value, ISP_DPCC_RG_FAC_2); + + value = ISP2X_PACK_4BYTE(arg->line_thr_3_g, arg->line_thr_3_rb, + arg->sw_mindis3_g, arg->sw_mindis3_rb); + rkisp_iowrite32(params_vdev, value, ISP_DPCC_LINE_THRESH_3); + + value = ISP2X_PACK_4BYTE(arg->line_mad_fac_3_g, arg->line_mad_fac_3_rb, + arg->sw_dis_scale_max3, arg->sw_dis_scale_min3); + rkisp_iowrite32(params_vdev, value, ISP_DPCC_LINE_MAD_FAC_3); + + value = ISP2X_PACK_4BYTE(arg->pg_fac_3_g, arg->pg_fac_3_rb, 0, 0); + rkisp_iowrite32(params_vdev, value, ISP_DPCC_PG_FAC_3); + + value = ISP2X_PACK_4BYTE(arg->rnd_thr_3_g, arg->rnd_thr_3_rb, 0, 0); + rkisp_iowrite32(params_vdev, value, ISP_DPCC_RND_THRESH_3); + + value = ISP2X_PACK_4BYTE(arg->rg_fac_3_g, arg->rg_fac_3_rb, 0, 0); + rkisp_iowrite32(params_vdev, value, ISP_DPCC_RG_FAC_3); + + value = (arg->ro_lim_3_rb & 0x03) << 10 | + (arg->ro_lim_3_g & 0x03) << 8 | + (arg->ro_lim_2_rb & 0x03) << 6 | + (arg->ro_lim_2_g & 0x03) << 4 | + (arg->ro_lim_1_rb & 0x03) << 2 | + (arg->ro_lim_1_g & 0x03); + rkisp_iowrite32(params_vdev, value, ISP_DPCC_RO_LIMITS); + + value = (arg->rnd_offs_3_rb & 0x03) << 10 | + (arg->rnd_offs_3_g & 0x03) << 8 | + (arg->rnd_offs_2_rb & 0x03) << 6 | + (arg->rnd_offs_2_g & 0x03) << 4 | + (arg->rnd_offs_1_rb & 0x03) << 2 | + (arg->rnd_offs_1_g & 0x03); + rkisp_iowrite32(params_vdev, value, ISP_DPCC_RND_OFFS); + + value = (arg->bpt_rb_3x3 & 0x01) << 11 | + (arg->bpt_g_3x3 & 0x01) << 10 | + (arg->bpt_incl_rb_center & 0x01) << 9 | + (arg->bpt_incl_green_center & 0x01) << 8 | + (arg->bpt_use_fix_set & 0x01) << 7 | + (arg->bpt_use_set_3 & 0x01) << 6 | + (arg->bpt_use_set_2 & 0x01) << 5 | + (arg->bpt_use_set_1 & 0x01) << 4 | + (arg->bpt_cor_en & 0x01) << 1 | + (arg->bpt_det_en & 0x01); + rkisp_iowrite32(params_vdev, value, ISP_DPCC_BPT_CTRL); + + rkisp_iowrite32(params_vdev, arg->bp_number, ISP_DPCC_BPT_NUMBER); + rkisp_iowrite32(params_vdev, arg->bp_table_addr, ISP_DPCC_BPT_ADDR); + + value = ISP2X_PACK_2SHORT(arg->bpt_h_addr, arg->bpt_v_addr); + rkisp_iowrite32(params_vdev, value, ISP_DPCC_BPT_DATA); + + rkisp_iowrite32(params_vdev, arg->bp_cnt, ISP_DPCC_BP_CNT); + + rkisp_iowrite32(params_vdev, arg->sw_pdaf_en, ISP_DPCC_PDAF_EN); + + value = 0; + for (i = 0; i < ISP2X_DPCC_PDAF_POINT_NUM; i++) + value |= (arg->pdaf_point_en[i] & 0x01) << i; + rkisp_iowrite32(params_vdev, value, ISP_DPCC_PDAF_POINT_EN); + + value = ISP2X_PACK_2SHORT(arg->pdaf_offsetx, arg->pdaf_offsety); + rkisp_iowrite32(params_vdev, value, ISP_DPCC_PDAF_OFFSET); + + value = ISP2X_PACK_2SHORT(arg->pdaf_wrapx, arg->pdaf_wrapy); + rkisp_iowrite32(params_vdev, value, ISP_DPCC_PDAF_WRAP); + + value = ISP2X_PACK_2SHORT(arg->pdaf_wrapx_num, arg->pdaf_wrapy_num); + rkisp_iowrite32(params_vdev, value, ISP_DPCC_PDAF_SCOPE); + + for (i = 0; i < ISP2X_DPCC_PDAF_POINT_NUM / 2; i++) { + value = ISP2X_PACK_4BYTE(arg->point[2 * i].x, arg->point[2 * i].y, + arg->point[2 * i + 1].x, arg->point[2 * i + 1].y); + rkisp_iowrite32(params_vdev, value, ISP_DPCC_PDAF_POINT_0 + 4 * i); + } + + rkisp_iowrite32(params_vdev, arg->pdaf_forward_med, ISP_DPCC_BPT_ADDR); } static void isp_dpcc_enable(struct rkisp_isp_params_vdev *params_vdev, bool en) { + u32 value; + + value = rkisp_ioread32(params_vdev, ISP_DPCC_MODE); + value &= ~ISP_DPCC_EN; + + if (en) + value |= ISP_DPCC_EN; + rkisp_iowrite32(params_vdev, value, ISP_DPCC_MODE); } static void isp_bls_config(struct rkisp_isp_params_vdev *params_vdev, const struct isp2x_bls_cfg *arg) { + /* avoid to override the old enable value */ + u32 new_control; + + new_control = rkisp_ioread32(params_vdev, ISP_BLS_CTRL); + new_control &= ISP_BLS_ENA; + /* fixed subtraction values */ + if (!arg->enable_auto) { + const struct isp2x_bls_fixed_val *pval = &arg->fixed_val; + + switch (params_vdev->raw_type) { + case RAW_BGGR: + rkisp_iowrite32(params_vdev, + pval->r, ISP_BLS_D_FIXED); + rkisp_iowrite32(params_vdev, + pval->gr, ISP_BLS_C_FIXED); + rkisp_iowrite32(params_vdev, + pval->gb, ISP_BLS_B_FIXED); + rkisp_iowrite32(params_vdev, + pval->b, ISP_BLS_A_FIXED); + break; + case RAW_GBRG: + rkisp_iowrite32(params_vdev, + pval->r, ISP_BLS_C_FIXED); + rkisp_iowrite32(params_vdev, + pval->gr, ISP_BLS_D_FIXED); + rkisp_iowrite32(params_vdev, + pval->gb, ISP_BLS_A_FIXED); + rkisp_iowrite32(params_vdev, + pval->b, ISP_BLS_B_FIXED); + break; + case RAW_GRBG: + rkisp_iowrite32(params_vdev, + pval->r, ISP_BLS_B_FIXED); + rkisp_iowrite32(params_vdev, + pval->gr, ISP_BLS_A_FIXED); + rkisp_iowrite32(params_vdev, + pval->gb, ISP_BLS_D_FIXED); + rkisp_iowrite32(params_vdev, + pval->b, ISP_BLS_C_FIXED); + break; + case RAW_RGGB: + rkisp_iowrite32(params_vdev, + pval->r, ISP_BLS_A_FIXED); + rkisp_iowrite32(params_vdev, + pval->gr, ISP_BLS_B_FIXED); + rkisp_iowrite32(params_vdev, + pval->gb, ISP_BLS_C_FIXED); + rkisp_iowrite32(params_vdev, + pval->b, ISP_BLS_D_FIXED); + break; + default: + break; + } + + } else { + if (arg->en_windows & BIT(1)) { + rkisp_iowrite32(params_vdev, arg->bls_window2.h_offs, + ISP_BLS_H2_START); + rkisp_iowrite32(params_vdev, arg->bls_window2.h_offs + arg->bls_window2.h_size, + ISP_BLS_H2_STOP); + rkisp_iowrite32(params_vdev, arg->bls_window2.v_offs, + ISP_BLS_V2_START); + rkisp_iowrite32(params_vdev, arg->bls_window2.v_offs + arg->bls_window2.v_size, + ISP_BLS_V2_STOP); + new_control |= ISP_BLS_WINDOW_2; + } + + if (arg->en_windows & BIT(0)) { + rkisp_iowrite32(params_vdev, arg->bls_window1.h_offs, + ISP_BLS_H1_START); + rkisp_iowrite32(params_vdev, arg->bls_window1.h_offs + arg->bls_window1.h_size, + ISP_BLS_H1_STOP); + rkisp_iowrite32(params_vdev, arg->bls_window1.v_offs, + ISP_BLS_V1_START); + rkisp_iowrite32(params_vdev, arg->bls_window1.v_offs + arg->bls_window1.v_size, + ISP_BLS_V1_STOP); + new_control |= ISP_BLS_WINDOW_1; + } + + rkisp_iowrite32(params_vdev, arg->bls_samples, + ISP_BLS_SAMPLES); + + new_control |= ISP_BLS_MODE_MEASURED; + } + rkisp_iowrite32(params_vdev, new_control, ISP_BLS_CTRL); } static void isp_bls_enable(struct rkisp_isp_params_vdev *params_vdev, bool en) { + u32 new_control; + + new_control = rkisp_ioread32(params_vdev, ISP_BLS_CTRL); + if (en) + new_control |= ISP_BLS_ENA; + else + new_control &= ~ISP_BLS_ENA; + rkisp_iowrite32(params_vdev, new_control, ISP_BLS_CTRL); } static void isp_sdg_config(struct rkisp_isp_params_vdev *params_vdev, const struct isp2x_sdg_cfg *arg) { + int i; + + rkisp_iowrite32(params_vdev, + arg->xa_pnts.gamma_dx0, ISP_GAMMA_DX_LO); + rkisp_iowrite32(params_vdev, + arg->xa_pnts.gamma_dx1, ISP_GAMMA_DX_HI); + + for (i = 0; i < ISP2X_DEGAMMA_CURVE_SIZE; i++) { + rkisp_iowrite32(params_vdev, arg->curve_r.gamma_y[i], + ISP_GAMMA_R_Y_0 + i * 4); + rkisp_iowrite32(params_vdev, arg->curve_g.gamma_y[i], + ISP_GAMMA_G_Y_0 + i * 4); + rkisp_iowrite32(params_vdev, arg->curve_b.gamma_y[i], + ISP_GAMMA_B_Y_0 + i * 4); + } } static void isp_sdg_enable(struct rkisp_isp_params_vdev *params_vdev, bool en) { + if (en) { + isp_param_set_bits(params_vdev, + CIF_ISP_CTRL, + CIF_ISP_CTRL_ISP_GAMMA_IN_ENA); + } else { + isp_param_clear_bits(params_vdev, + CIF_ISP_CTRL, + CIF_ISP_CTRL_ISP_GAMMA_IN_ENA); + } } static void @@ -105,12 +406,12 @@ isp_sihst_config(struct rkisp_isp_params_vdev *params_vdev, }; wnd_num_idx = arg->wnd_num; - for (i = 0; i < ISP2X_HIST_WIN_NUM; i++) { + for (i = 0; i < ISP2X_SIHIST_WIN_NUM; i++) { /* avoid to override the old enable value */ hist_ctrl = rkisp_ioread32(params_vdev, ISP_HIST_HIST_CTRL + i * 0x10); hist_ctrl &= ISP2X_SIHST_CTRL_INTRSEL_MASK | - ISP2X_SIHST_CTRL_WNDNUM_MASK | - ISP2X_SIHST_CTRL_EN_MASK; + ISP2X_SIHST_CTRL_WNDNUM_MASK | + ISP2X_SIHST_CTRL_EN_MASK; hist_ctrl = hist_ctrl | ISP2X_SIHST_CTRL_DATASEL_SET(arg->win_cfg[i].data_sel) | ISP2X_SIHST_CTRL_WATERLINE_SET(arg->win_cfg[i].waterline) | @@ -142,17 +443,17 @@ isp_sihst_config(struct rkisp_isp_params_vdev *params_vdev, hist_weight_num = ISP2X_SIHST_WEIGHT_REG_SIZE; for (i = 0; i < (hist_weight_num / 4); i++) { value = ISP2X_SIHST_WEIGHT_SET( - weight15x15[4 * i + 0], - weight15x15[4 * i + 1], - weight15x15[4 * i + 2], - weight15x15[4 * i + 3]); + weight15x15[4 * i + 0], + weight15x15[4 * i + 1], + weight15x15[4 * i + 2], + weight15x15[4 * i + 3]); rkisp_iowrite32(params_vdev, value, - ISP_HIST_HIST_WEIGHT_0 + 4 * i); + ISP_HIST_HIST_WEIGHT_0 + 4 * i); } value = ISP2X_SIHST_WEIGHT_SET( - weight15x15[4 * i + 0], 0, 0, 0); + weight15x15[4 * i + 0], 0, 0, 0); rkisp_iowrite32(params_vdev, value, - ISP_HIST_HIST_WEIGHT_0 + 4 * i); + ISP_HIST_HIST_WEIGHT_0 + 4 * i); hist_ctrl = rkisp_ioread32(params_vdev, ISP_HIST_HIST_CTRL); hist_ctrl &= ~ISP2X_SIHST_CTRL_WNDNUM_MASK; @@ -174,16 +475,233 @@ isp_sihst_enable(struct rkisp_isp_params_vdev *params_vdev, rkisp_iowrite32(params_vdev, hist_ctrl, ISP_HIST_HIST_CTRL); } +static void __maybe_unused +isp_lsc_matrix_cfg_sram(struct rkisp_isp_params_vdev *params_vdev, + const struct isp2x_lsc_cfg *pconfig) +{ + int i, j; + unsigned int isp_lsc_status, sram_addr, isp_lsc_table_sel; + unsigned int data; + + isp_lsc_status = rkisp_ioread32(params_vdev, ISP_LSC_STATUS); + + /* CIF_ISP_LSC_TABLE_ADDRESS_153 = ( 17 * 18 ) >> 1 */ + sram_addr = (isp_lsc_status & CIF_ISP_LSC_ACTIVE_TABLE) ? + CIF_ISP_LSC_TABLE_ADDRESS_0 : + CIF_ISP_LSC_TABLE_ADDRESS_153; + rkisp_iowrite32(params_vdev, sram_addr, ISP_LSC_R_TABLE_ADDR); + rkisp_iowrite32(params_vdev, sram_addr, ISP_LSC_GR_TABLE_ADDR); + rkisp_iowrite32(params_vdev, sram_addr, ISP_LSC_GB_TABLE_ADDR); + rkisp_iowrite32(params_vdev, sram_addr, ISP_LSC_B_TABLE_ADDR); + + /* program data tables (table size is 9 * 17 = 153) */ + for (i = 0; i < CIF_ISP_LSC_SECTORS_MAX * CIF_ISP_LSC_SECTORS_MAX; + i += CIF_ISP_LSC_SECTORS_MAX) { + /* + * 17 sectors with 2 values in one DWORD = 9 + * DWORDs (2nd value of last DWORD unused) + */ + for (j = 0; j < CIF_ISP_LSC_SECTORS_MAX - 1; j += 2) { + data = CIF_ISP_LSC_TABLE_DATA_V12( + pconfig->r_data_tbl[i + j], + pconfig->r_data_tbl[i + j + 1]); + rkisp_iowrite32(params_vdev, data, + ISP_LSC_R_TABLE_DATA); + + data = CIF_ISP_LSC_TABLE_DATA_V12( + pconfig->gr_data_tbl[i + j], + pconfig->gr_data_tbl[i + j + 1]); + rkisp_iowrite32(params_vdev, data, + ISP_LSC_GR_TABLE_DATA); + + data = CIF_ISP_LSC_TABLE_DATA_V12( + pconfig->gb_data_tbl[i + j], + pconfig->gb_data_tbl[i + j + 1]); + rkisp_iowrite32(params_vdev, data, + ISP_LSC_GB_TABLE_DATA); + + data = CIF_ISP_LSC_TABLE_DATA_V12( + pconfig->b_data_tbl[i + j], + pconfig->b_data_tbl[i + j + 1]); + rkisp_iowrite32(params_vdev, data, + ISP_LSC_B_TABLE_DATA); + } + + data = CIF_ISP_LSC_TABLE_DATA_V12( + pconfig->r_data_tbl[i + j], + 0); + rkisp_iowrite32(params_vdev, data, + ISP_LSC_R_TABLE_DATA); + + data = CIF_ISP_LSC_TABLE_DATA_V12( + pconfig->gr_data_tbl[i + j], + 0); + rkisp_iowrite32(params_vdev, data, + CIF_ISP_LSC_GR_TABLE_DATA); + + data = CIF_ISP_LSC_TABLE_DATA_V12( + pconfig->gb_data_tbl[i + j], + 0); + rkisp_iowrite32(params_vdev, data, + ISP_LSC_GB_TABLE_DATA); + + data = CIF_ISP_LSC_TABLE_DATA_V12( + pconfig->b_data_tbl[i + j], + 0); + rkisp_iowrite32(params_vdev, data, + ISP_LSC_B_TABLE_DATA); + } + isp_lsc_table_sel = (isp_lsc_status & CIF_ISP_LSC_ACTIVE_TABLE) ? + CIF_ISP_LSC_TABLE_0 : CIF_ISP_LSC_TABLE_1; + rkisp_iowrite32(params_vdev, isp_lsc_table_sel, ISP_LSC_TABLE_SEL); +} + +static void __maybe_unused +isp_lsc_matrix_cfg_ddr(struct rkisp_isp_params_vdev *params_vdev, + const struct isp2x_lsc_cfg *pconfig) +{ + unsigned int isp_lsc_status, isp_lsc_table_sel; + struct rkisp_isp_params_val_v2x *priv_val; + u32 value, buf_idx; + unsigned int data; + u32 *vaddr[4]; + u32 index[4]; + int i, j; + + priv_val = (struct rkisp_isp_params_val_v2x *)params_vdev->priv_val; + buf_idx = (priv_val->buf_lsclut_idx++) % RKISP_PARAM_LSC_LUT_BUF_NUM; + + memset(&index[0], 0, sizeof(index)); + vaddr[0] = priv_val->buf_lsclut[buf_idx].vaddr; + vaddr[1] = vaddr[0] + RKISP_PARAM_LSC_LUT_TBL_SIZE * 4; + vaddr[2] = vaddr[1] + RKISP_PARAM_LSC_LUT_TBL_SIZE * 4; + vaddr[3] = vaddr[2] + RKISP_PARAM_LSC_LUT_TBL_SIZE * 4; + + /* program data tables (table size is 9 * 17 = 153) */ + for (i = 0; i < CIF_ISP_LSC_SECTORS_MAX * CIF_ISP_LSC_SECTORS_MAX; + i += CIF_ISP_LSC_SECTORS_MAX) { + /* + * 17 sectors with 2 values in one DWORD = 9 + * DWORDs (2nd value of last DWORD unused) + */ + for (j = 0; j < CIF_ISP_LSC_SECTORS_MAX - 1; j += 2) { + data = CIF_ISP_LSC_TABLE_DATA_V12( + pconfig->r_data_tbl[i + j], + pconfig->r_data_tbl[i + j + 1]); + vaddr[0][index[0]++] = data; + + data = CIF_ISP_LSC_TABLE_DATA_V12( + pconfig->gr_data_tbl[i + j], + pconfig->gr_data_tbl[i + j + 1]); + vaddr[1][index[1]++] = data; + + data = CIF_ISP_LSC_TABLE_DATA_V12( + pconfig->gb_data_tbl[i + j], + pconfig->gb_data_tbl[i + j + 1]); + vaddr[2][index[2]++] = data; + + data = CIF_ISP_LSC_TABLE_DATA_V12( + pconfig->b_data_tbl[i + j], + pconfig->b_data_tbl[i + j + 1]); + vaddr[3][index[3]++] = data; + } + + data = CIF_ISP_LSC_TABLE_DATA_V12( + pconfig->r_data_tbl[i + j], + 0); + vaddr[0][index[0]++] = data; + + data = CIF_ISP_LSC_TABLE_DATA_V12( + pconfig->gr_data_tbl[i + j], + 0); + vaddr[1][index[1]++] = data; + + data = CIF_ISP_LSC_TABLE_DATA_V12( + pconfig->gb_data_tbl[i + j], + 0); + vaddr[2][index[2]++] = data; + + data = CIF_ISP_LSC_TABLE_DATA_V12( + pconfig->b_data_tbl[i + j], + 0); + vaddr[3][index[3]++] = data; + } + + value = priv_val->buf_lsclut[buf_idx].dma_addr; + rkisp_iowrite32(params_vdev, value, MI_LUT_LSC_RD_BASE); + rkisp_iowrite32(params_vdev, RKISP_PARAM_LSC_LUT_BUF_SIZE, MI_LUT_LSC_RD_WSIZE); + + isp_lsc_status = rkisp_ioread32(params_vdev, ISP_LSC_STATUS); + isp_lsc_table_sel = (isp_lsc_status & CIF_ISP_LSC_ACTIVE_TABLE) ? + CIF_ISP_LSC_TABLE_0 : CIF_ISP_LSC_TABLE_1; + rkisp_iowrite32(params_vdev, isp_lsc_table_sel, ISP_LSC_TABLE_SEL); +} + static void isp_lsc_config(struct rkisp_isp_params_vdev *params_vdev, const struct isp2x_lsc_cfg *arg) { + int i; + u32 lsc_ctrl; + unsigned int data; + + /* 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, + CIF_ISP_LSC_CTRL_ENA); + isp_lsc_matrix_cfg_sram(params_vdev, arg); + + for (i = 0; i < 4; i++) { + /* program x size tables */ + data = CIF_ISP_LSC_SECT_SIZE(arg->x_size_tbl[i * 2], + arg->x_size_tbl[i * 2 + 1]); + rkisp_iowrite32(params_vdev, data, + ISP_LSC_XSIZE_01 + i * 4); + + /* program x grad tables */ + data = CIF_ISP_LSC_SECT_SIZE(arg->x_grad_tbl[i * 2], + arg->x_grad_tbl[i * 2 + 1]); + rkisp_iowrite32(params_vdev, data, + ISP_LSC_XGRAD_01 + i * 4); + + /* program y size tables */ + data = CIF_ISP_LSC_SECT_SIZE(arg->y_size_tbl[i * 2], + arg->y_size_tbl[i * 2 + 1]); + rkisp_iowrite32(params_vdev, data, + ISP_LSC_YSIZE_01 + i * 4); + + /* program y grad tables */ + data = CIF_ISP_LSC_SECT_SIZE(arg->y_grad_tbl[i * 2], + arg->y_grad_tbl[i * 2 + 1]); + rkisp_iowrite32(params_vdev, data, + ISP_LSC_YGRAD_01 + i * 4); + } + + /* restore the lsc ctrl status */ + if (lsc_ctrl & CIF_ISP_LSC_CTRL_ENA) { + isp_param_set_bits(params_vdev, + ISP_LSC_CTRL, + CIF_ISP_LSC_CTRL_ENA); + } else { + isp_param_clear_bits(params_vdev, + ISP_LSC_CTRL, + CIF_ISP_LSC_CTRL_ENA); + } } static void isp_lsc_enable(struct rkisp_isp_params_vdev *params_vdev, bool en) { + if (en) { + isp_param_set_bits(params_vdev, + ISP_LSC_CTRL, + CIF_ISP_LSC_CTRL_ENA); + } else { + isp_param_clear_bits(params_vdev, + ISP_LSC_CTRL, + CIF_ISP_LSC_CTRL_ENA); + } } static void @@ -191,11 +709,11 @@ isp_awbgain_config(struct rkisp_isp_params_vdev *params_vdev, const struct isp2x_awb_gain_cfg *arg) { rkisp_iowrite32(params_vdev, - CIF_ISP_AWB_GAIN_R_SET(arg->gain_green_r) | - arg->gain_green_b, CIF_ISP_AWB_GAIN_G_V12); + CIF_ISP_AWB_GAIN_R_SET(arg->gain_green_r) | + arg->gain_green_b, CIF_ISP_AWB_GAIN_G_V12); rkisp_iowrite32(params_vdev, CIF_ISP_AWB_GAIN_R_SET(arg->gain_red) | - arg->gain_blue, CIF_ISP_AWB_GAIN_RB_V12); + arg->gain_blue, CIF_ISP_AWB_GAIN_RB_V12); } static void @@ -212,51 +730,189 @@ isp_awbgain_enable(struct rkisp_isp_params_vdev *params_vdev, } static void -isp_bdm_config(struct rkisp_isp_params_vdev *params_vdev, - const struct isp2x_bdm_config *arg) +isp_debayer_config(struct rkisp_isp_params_vdev *params_vdev, + const struct isp2x_debayer_cfg *arg) { + u32 value; + + value = rkisp_ioread32(params_vdev, ISP_DEBAYER_CONTROL); + value &= ISP_DEBAYER_EN; + + value |= (arg->filter_c_en & 0x01) << 8 | + (arg->filter_g_en & 0x01) << 4; + rkisp_iowrite32(params_vdev, value, ISP_DEBAYER_CONTROL); + + value = (arg->thed1 & 0x0F) << 12 | + (arg->thed0 & 0x0F) << 8 | + (arg->dist_scale & 0x0F) << 4 | + (arg->max_ratio & 0x07) << 1 | + (arg->clip_en & 0x01); + rkisp_iowrite32(params_vdev, value, ISP_DEBAYER_G_INTERP); + + value = (arg->filter1_coe5 & 0x0F) << 16 | + (arg->filter1_coe4 & 0x0F) << 12 | + (arg->filter1_coe3 & 0x0F) << 8 | + (arg->filter1_coe2 & 0x0F) << 4 | + (arg->filter1_coe1 & 0x0F); + rkisp_iowrite32(params_vdev, value, ISP_DEBAYER_G_INTERP_FILTER1); + + value = (arg->filter2_coe5 & 0x0F) << 16 | + (arg->filter2_coe4 & 0x0F) << 12 | + (arg->filter2_coe3 & 0x0F) << 8 | + (arg->filter2_coe2 & 0x0F) << 4 | + (arg->filter2_coe1 & 0x0F); + rkisp_iowrite32(params_vdev, value, ISP_DEBAYER_G_INTERP_FILTER2); + + value = (arg->hf_offset & 0xFFFF) << 16 | + (arg->gain_offset & 0x0F) << 8 | + (arg->offset & 0x1F); + rkisp_iowrite32(params_vdev, value, ISP_DEBAYER_G_FILTER); + + value = (arg->shift_num & 0x03) << 16 | + (arg->order_max & 0x1F) << 8 | + (arg->order_min & 0x1F); + rkisp_iowrite32(params_vdev, value, ISP_DEBAYER_C_FILTER); } static void -isp_bdm_enable(struct rkisp_isp_params_vdev *params_vdev, - bool en) -{ -} - -static void -isp_ctk_config(struct rkisp_isp_params_vdev *params_vdev, - const struct isp2x_ctk_cfg *arg) -{ -} - -static void -isp_ctk_enable(struct rkisp_isp_params_vdev *params_vdev, +isp_debayer_enable(struct rkisp_isp_params_vdev *params_vdev, + bool en) +{ + if (en) + isp_param_set_bits(params_vdev, + ISP_DEBAYER_CONTROL, + ISP_DEBAYER_EN); + else + isp_param_clear_bits(params_vdev, + ISP_DEBAYER_CONTROL, + ISP_DEBAYER_EN); +} + +static void +isp_ccm_config(struct rkisp_isp_params_vdev *params_vdev, + const struct isp2x_ccm_cfg *arg) +{ + u32 value; + u32 i; + + value = ISP2X_PACK_2SHORT(arg->coeff0_r, arg->coeff1_r); + rkisp_iowrite32(params_vdev, value, ISP_CCM_COEFF0_R); + + value = ISP2X_PACK_2SHORT(arg->coeff2_r, arg->offset_r); + rkisp_iowrite32(params_vdev, value, ISP_CCM_COEFF1_R); + + value = ISP2X_PACK_2SHORT(arg->coeff0_g, arg->coeff1_g); + rkisp_iowrite32(params_vdev, value, ISP_CCM_COEFF0_G); + + value = ISP2X_PACK_2SHORT(arg->coeff2_g, arg->offset_g); + rkisp_iowrite32(params_vdev, value, ISP_CCM_COEFF1_G); + + value = ISP2X_PACK_2SHORT(arg->coeff0_b, arg->coeff1_b); + rkisp_iowrite32(params_vdev, value, ISP_CCM_COEFF0_B); + + value = ISP2X_PACK_2SHORT(arg->coeff2_b, arg->offset_b); + rkisp_iowrite32(params_vdev, value, ISP_CCM_COEFF1_B); + + value = ISP2X_PACK_2SHORT(arg->coeff0_y, arg->coeff1_y); + rkisp_iowrite32(params_vdev, value, ISP_CCM_COEFF0_Y); + + value = ISP2X_PACK_2SHORT(arg->coeff2_y, 0); + rkisp_iowrite32(params_vdev, value, ISP_CCM_COEFF1_Y); + + for (i = 0; i < ISP2X_CCM_CURVE_NUM / 2; i++) { + value = ISP2X_PACK_2SHORT(arg->alp_y[2 * i], arg->alp_y[2 * i + 1]); + rkisp_iowrite32(params_vdev, value, ISP_CCM_ALP_Y0 + 4 * i); + } + value = ISP2X_PACK_2SHORT(arg->alp_y[2 * i], 0); + rkisp_iowrite32(params_vdev, value, ISP_CCM_ALP_Y0 + 4 * i); + + value = arg->bound_bit & 0x0F; + rkisp_iowrite32(params_vdev, value, ISP_CCM_BOUND_BIT); +} + +static void +isp_ccm_enable(struct rkisp_isp_params_vdev *params_vdev, bool en) { + if (en) + isp_param_set_bits(params_vdev, ISP_CCM_CTRL, ISP_CCM_EN); + else + isp_param_clear_bits(params_vdev, ISP_CCM_CTRL, ISP_CCM_EN); } static void isp_goc_config(struct rkisp_isp_params_vdev *params_vdev, const struct isp2x_gammaout_cfg *arg) { + int i; + u32 value; + + if (arg->equ_segm) + isp_param_set_bits(params_vdev, ISP_GAMMA_OUT_CTRL, 0x02); + else + isp_param_clear_bits(params_vdev, ISP_GAMMA_OUT_CTRL, 0x02); + + rkisp_iowrite32(params_vdev, arg->offset, ISP_GAMMA_OUT_OFFSET); + for (i = 0; i < ISP2X_GAMMA_OUT_MAX_SAMPLES / 2; i++) { + value = ISP2X_PACK_2SHORT( + arg->gamma_y[2 * i], + arg->gamma_y[2 * i + 1]); + rkisp_iowrite32(params_vdev, value, ISP_GAMMA_OUT_Y0 + i * 4); + } + + rkisp_iowrite32(params_vdev, arg->gamma_y[2 * i], ISP_GAMMA_OUT_Y0 + i * 4); } static void isp_goc_enable(struct rkisp_isp_params_vdev *params_vdev, bool en) { + if (en) + isp_param_set_bits(params_vdev, ISP_GAMMA_OUT_CTRL, 0x01); + else + isp_param_clear_bits(params_vdev, ISP_GAMMA_OUT_CTRL, 0x01); } static void isp_cproc_config(struct rkisp_isp_params_vdev *params_vdev, const struct isp2x_cproc_cfg *arg) { + struct cifisp_isp_other_cfg *cur_other_cfg = ¶ms_vdev->isp1x_params.others; + struct cifisp_ie_config *cur_ie_config = &cur_other_cfg->ie_config; + u32 effect = cur_ie_config->effect; + u32 quantization = params_vdev->quantization; + + rkisp_iowrite32(params_vdev, arg->contrast, CPROC_CONTRAST); + rkisp_iowrite32(params_vdev, arg->hue, CPROC_HUE); + rkisp_iowrite32(params_vdev, arg->sat, CPROC_SATURATION); + rkisp_iowrite32(params_vdev, arg->brightness, CPROC_BRIGHTNESS); + + if (quantization != V4L2_QUANTIZATION_FULL_RANGE || + effect != V4L2_COLORFX_NONE) { + isp_param_clear_bits(params_vdev, CPROC_CTRL, + CIF_C_PROC_YOUT_FULL | + CIF_C_PROC_YIN_FULL | + CIF_C_PROC_COUT_FULL); + } else { + isp_param_set_bits(params_vdev, CPROC_CTRL, + CIF_C_PROC_YOUT_FULL | + CIF_C_PROC_YIN_FULL | + CIF_C_PROC_COUT_FULL); + } } static void isp_cproc_enable(struct rkisp_isp_params_vdev *params_vdev, bool en) { + if (en) + isp_param_set_bits(params_vdev, + CPROC_CTRL, + CIF_C_PROC_CTR_ENABLE); + else + isp_param_clear_bits(params_vdev, + CPROC_CTRL, + CIF_C_PROC_CTR_ENABLE); } static void @@ -268,22 +924,22 @@ isp_siaf_config(struct rkisp_isp_params_vdev *params_vdev, u32 afm_ctrl; num_of_win = min_t(size_t, ARRAY_SIZE(arg->afm_win), - arg->num_afm_win); + arg->num_afm_win); afm_ctrl = rkisp_ioread32(params_vdev, ISP_AFM_CTRL); /* Switch off to configure. */ isp_param_clear_bits(params_vdev, ISP_AFM_CTRL, ISP2X_SIAF_ENA); for (i = 0; i < num_of_win; i++) { rkisp_iowrite32(params_vdev, - ISP2X_SIAF_WIN_X(arg->afm_win[i].win.h_offs) | - ISP2X_SIAF_WIN_Y(arg->afm_win[i].win.v_offs), - ISP_AFM_LT_A + i * 8); + ISP2X_SIAF_WIN_X(arg->afm_win[i].win.h_offs) | + ISP2X_SIAF_WIN_Y(arg->afm_win[i].win.v_offs), + ISP_AFM_LT_A + i * 8); rkisp_iowrite32(params_vdev, - ISP2X_SIAF_WIN_X(arg->afm_win[i].win.h_size + - arg->afm_win[i].win.h_offs) | - ISP2X_SIAF_WIN_Y(arg->afm_win[i].win.v_size + - arg->afm_win[i].win.v_offs), - ISP_AFM_RB_A + i * 8); + ISP2X_SIAF_WIN_X(arg->afm_win[i].win.h_size + + arg->afm_win[i].win.h_offs) | + ISP2X_SIAF_WIN_Y(arg->afm_win[i].win.v_size + + arg->afm_win[i].win.v_offs), + ISP_AFM_RB_A + i * 8); } rkisp_iowrite32(params_vdev, arg->thres, ISP_AFM_THRES); @@ -320,14 +976,14 @@ isp_siawb_config(struct rkisp_isp_params_vdev *params_vdev, if (arg->awb_mode == CIFISP_AWB_MODE_YCBCR) { /* Reference Cb and Cr */ rkisp_iowrite32(params_vdev, - CIF_ISP_AWB_REF_CR_SET(arg->awb_ref_cr) | - arg->awb_ref_cb, CIF_ISP_AWB_REF_V10); + CIF_ISP_AWB_REF_CR_SET(arg->awb_ref_cr) | + arg->awb_ref_cb, CIF_ISP_AWB_REF_V10); /* Yc Threshold */ rkisp_iowrite32(params_vdev, - CIF_ISP_AWB_MAX_Y_SET(arg->max_y) | - CIF_ISP_AWB_MIN_Y_SET(arg->min_y) | - CIF_ISP_AWB_MAX_CS_SET(arg->max_csum) | - arg->min_c, CIF_ISP_AWB_THRESH_V10); + CIF_ISP_AWB_MAX_Y_SET(arg->max_y) | + CIF_ISP_AWB_MIN_Y_SET(arg->min_y) | + CIF_ISP_AWB_MAX_CS_SET(arg->max_csum) | + arg->min_c, CIF_ISP_AWB_THRESH_V10); } reg_val = rkisp_ioread32(params_vdev, CIF_ISP_AWB_PROP_V10); @@ -343,17 +999,17 @@ isp_siawb_config(struct rkisp_isp_params_vdev *params_vdev, /* window offset */ rkisp_iowrite32(params_vdev, - arg->awb_wnd.v_offs, CIF_ISP_AWB_WND_V_OFFS_V10); + arg->awb_wnd.v_offs, CIF_ISP_AWB_WND_V_OFFS_V10); rkisp_iowrite32(params_vdev, - arg->awb_wnd.h_offs, CIF_ISP_AWB_WND_H_OFFS_V10); + arg->awb_wnd.h_offs, CIF_ISP_AWB_WND_H_OFFS_V10); /* AWB window size */ rkisp_iowrite32(params_vdev, - arg->awb_wnd.v_size, CIF_ISP_AWB_WND_V_SIZE_V10); + arg->awb_wnd.v_size, CIF_ISP_AWB_WND_V_SIZE_V10); rkisp_iowrite32(params_vdev, - arg->awb_wnd.h_size, CIF_ISP_AWB_WND_H_SIZE_V10); + arg->awb_wnd.h_size, CIF_ISP_AWB_WND_H_SIZE_V10); /* Number of frames */ rkisp_iowrite32(params_vdev, - arg->frames, CIF_ISP_AWB_FRAMES_V10); + arg->frames, CIF_ISP_AWB_FRAMES_V10); } static void @@ -376,7 +1032,7 @@ isp_siawb_enable(struct rkisp_isp_params_vdev *params_vdev, CIF_ISP_CTRL_ISP_AWB_ENA); } else { rkisp_iowrite32(params_vdev, - reg_val, CIF_ISP_AWB_PROP_V10); + reg_val, CIF_ISP_AWB_PROP_V10); isp_param_clear_bits(params_vdev, CIF_ISP_CTRL, CIF_ISP_CTRL_ISP_AWB_ENA); } @@ -386,12 +1042,77 @@ static void isp_ie_config(struct rkisp_isp_params_vdev *params_vdev, const struct isp2x_ie_cfg *arg) { + u32 eff_ctrl; + + eff_ctrl = rkisp_ioread32(params_vdev, CIF_IMG_EFF_CTRL); + eff_ctrl &= ~CIF_IMG_EFF_CTRL_MODE_MASK; + + if (params_vdev->quantization == V4L2_QUANTIZATION_FULL_RANGE) + eff_ctrl |= CIF_IMG_EFF_CTRL_YCBCR_FULL; + + switch (arg->effect) { + case V4L2_COLORFX_SEPIA: + eff_ctrl |= CIF_IMG_EFF_CTRL_MODE_SEPIA; + break; + case V4L2_COLORFX_SET_CBCR: + rkisp_iowrite32(params_vdev, arg->eff_tint, CIF_IMG_EFF_TINT); + eff_ctrl |= CIF_IMG_EFF_CTRL_MODE_SEPIA; + break; + /* + * Color selection is similar to water color(AQUA): + * grayscale + selected color w threshold + */ + case V4L2_COLORFX_AQUA: + eff_ctrl |= CIF_IMG_EFF_CTRL_MODE_COLOR_SEL; + rkisp_iowrite32(params_vdev, arg->color_sel, + CIF_IMG_EFF_COLOR_SEL); + break; + case V4L2_COLORFX_EMBOSS: + eff_ctrl |= CIF_IMG_EFF_CTRL_MODE_EMBOSS; + rkisp_iowrite32(params_vdev, arg->eff_mat_1, + CIF_IMG_EFF_MAT_1); + rkisp_iowrite32(params_vdev, arg->eff_mat_2, + CIF_IMG_EFF_MAT_2); + rkisp_iowrite32(params_vdev, arg->eff_mat_3, + CIF_IMG_EFF_MAT_3); + break; + case V4L2_COLORFX_SKETCH: + eff_ctrl |= CIF_IMG_EFF_CTRL_MODE_SKETCH; + rkisp_iowrite32(params_vdev, arg->eff_mat_3, + CIF_IMG_EFF_MAT_3); + rkisp_iowrite32(params_vdev, arg->eff_mat_4, + CIF_IMG_EFF_MAT_4); + rkisp_iowrite32(params_vdev, arg->eff_mat_5, + CIF_IMG_EFF_MAT_5); + break; + case V4L2_COLORFX_BW: + eff_ctrl |= CIF_IMG_EFF_CTRL_MODE_BLACKWHITE; + break; + case V4L2_COLORFX_NEGATIVE: + eff_ctrl |= CIF_IMG_EFF_CTRL_MODE_NEGATIVE; + break; + default: + break; + } + + rkisp_iowrite32(params_vdev, eff_ctrl, CIF_IMG_EFF_CTRL); } static void isp_ie_enable(struct rkisp_isp_params_vdev *params_vdev, bool en) { + if (en) { + isp_param_set_bits(params_vdev, CIF_ICCL, CIF_ICCL_IE_CLK); + isp_param_set_bits(params_vdev, CIF_IMG_EFF_CTRL, + CIF_IMG_EFF_CTRL_ENABLE); + isp_param_set_bits(params_vdev, CIF_IMG_EFF_CTRL, + CIF_IMG_EFF_CTRL_CFG_UPD); + } else { + isp_param_clear_bits(params_vdev, CIF_IMG_EFF_CTRL, + CIF_IMG_EFF_CTRL_ENABLE); + isp_param_clear_bits(params_vdev, CIF_ICCL, CIF_ICCL_IE_CLK); + } } static void @@ -433,27 +1154,27 @@ isp_yuvae_config(struct rkisp_isp_params_vdev *params_vdev, rkisp_iowrite32(params_vdev, exp_ctrl, ISP_YUVAE_CTRL); rkisp_iowrite32(params_vdev, - ISP2X_YUVAE_V_OFFSET_SET(arg->win.v_offs) | - ISP2X_YUVAE_H_OFFSET_SET(arg->win.h_offs), - ISP_YUVAE_OFFSET); + ISP2X_YUVAE_V_OFFSET_SET(arg->win.v_offs) | + ISP2X_YUVAE_H_OFFSET_SET(arg->win.h_offs), + ISP_YUVAE_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; rkisp_iowrite32(params_vdev, - ISP2X_YUVAE_V_SIZE_SET(block_vsize) | - ISP2X_YUVAE_H_SIZE_SET(block_hsize), - ISP_YUVAE_BLK_SIZE); + ISP2X_YUVAE_V_SIZE_SET(block_vsize) | + ISP2X_YUVAE_H_SIZE_SET(block_hsize), + ISP_YUVAE_BLK_SIZE); for (i = 0; i < ISP2X_YUVAE_SUBWIN_NUM; i++) { rkisp_iowrite32(params_vdev, - ISP2X_YUVAE_SUBWIN_V_OFFSET_SET(arg->subwin[i].v_offs) | - ISP2X_YUVAE_SUBWIN_H_OFFSET_SET(arg->subwin[i].h_offs), - ISP_YUVAE_WND1_OFFSET + 8 * i); + ISP2X_YUVAE_SUBWIN_V_OFFSET_SET(arg->subwin[i].v_offs) | + ISP2X_YUVAE_SUBWIN_H_OFFSET_SET(arg->subwin[i].h_offs), + ISP_YUVAE_WND1_OFFSET + 8 * i); rkisp_iowrite32(params_vdev, - ISP2X_YUVAE_SUBWIN_V_SIZE_SET(arg->subwin[i].v_size + arg->subwin[i].v_offs) | - ISP2X_YUVAE_SUBWIN_H_SIZE_SET(arg->subwin[i].h_size + arg->subwin[i].h_offs), - ISP_YUVAE_WND1_SIZE + 8 * i); + ISP2X_YUVAE_SUBWIN_V_SIZE_SET(arg->subwin[i].v_size + arg->subwin[i].v_offs) | + ISP2X_YUVAE_SUBWIN_H_SIZE_SET(arg->subwin[i].h_size + arg->subwin[i].h_offs), + ISP_YUVAE_WND1_SIZE + 8 * i); } } @@ -477,24 +1198,336 @@ static void isp_wdr_config(struct rkisp_isp_params_vdev *params_vdev, const struct isp2x_wdr_cfg *arg) { + int i; + + for (i = 0; i < ISP2X_WDR_SIZE; i++) { + if (i <= 39) + rkisp_iowrite32(params_vdev, arg->c_wdr[i], + ISP_WDR_CTRL + i * 4); + else + rkisp_iowrite32(params_vdev, arg->c_wdr[i], + ISP_WDR_CTRL0 + (i - 40) * 4); + } } static void isp_wdr_enable(struct rkisp_isp_params_vdev *params_vdev, bool en) { + if (en) + rkisp_iowrite32(params_vdev, 0x030cf1, + ISP_WDR_CTRL0); + else + rkisp_iowrite32(params_vdev, 0x030cf0, + ISP_WDR_CTRL0); } static void isp_iesharp_config(struct rkisp_isp_params_vdev *params_vdev, const struct isp2x_rkiesharp_cfg *arg) { + u32 i; + u32 val; + u32 eff_ctrl; + u32 minmax[5]; + + val = CIF_ISP_PACK_4BYTE(arg->yavg_thr[0], + arg->yavg_thr[1], + arg->yavg_thr[2], + arg->yavg_thr[3]); + rkisp_iowrite32(params_vdev, val, + CIF_RKSHARP_YAVG_THR); + + val = CIF_ISP_PACK_4BYTE(arg->delta1[0], + arg->delta2[0], + arg->delta1[1], + arg->delta2[1]); + rkisp_iowrite32(params_vdev, val, + CIF_RKSHARP_DELTA_P0_P1); + + val = CIF_ISP_PACK_4BYTE(arg->delta1[2], + arg->delta2[2], + arg->delta1[3], + arg->delta2[3]); + rkisp_iowrite32(params_vdev, val, + CIF_RKSHARP_DELTA_P2_P3); + + val = CIF_ISP_PACK_4BYTE(arg->delta1[4], + arg->delta2[4], + 0, + 0); + rkisp_iowrite32(params_vdev, val, + CIF_RKSHARP_DELTA_P4); + + for (i = 0; i < 5; i++) + minmax[i] = arg->minnumber[i] << 4 | arg->maxnumber[i]; + val = CIF_ISP_PACK_4BYTE(minmax[0], + minmax[1], + minmax[2], + minmax[3]); + rkisp_iowrite32(params_vdev, val, + CIF_RKSHARP_NPIXEL_P0_P1_P2_P3); + rkisp_iowrite32(params_vdev, minmax[4], + CIF_RKSHARP_NPIXEL_P4); + + val = CIF_ISP_PACK_4BYTE(arg->gauss_flat_coe[0], + arg->gauss_flat_coe[1], + arg->gauss_flat_coe[2], + 0); + rkisp_iowrite32(params_vdev, val, + CIF_RKSHARP_GAUSS_FLAT_COE1); + + val = CIF_ISP_PACK_4BYTE(arg->gauss_flat_coe[3], + arg->gauss_flat_coe[4], + arg->gauss_flat_coe[5], + 0); + rkisp_iowrite32(params_vdev, val, + CIF_RKSHARP_GAUSS_FLAT_COE2); + + val = CIF_ISP_PACK_4BYTE(arg->gauss_flat_coe[6], + arg->gauss_flat_coe[7], + arg->gauss_flat_coe[8], + 0); + rkisp_iowrite32(params_vdev, val, + CIF_RKSHARP_GAUSS_FLAT_COE3); + + val = CIF_ISP_PACK_4BYTE(arg->gauss_noise_coe[0], + arg->gauss_noise_coe[1], + arg->gauss_noise_coe[2], + 0); + rkisp_iowrite32(params_vdev, val, + CIF_RKSHARP_GAUSS_NOISE_COE1); + + val = CIF_ISP_PACK_4BYTE(arg->gauss_noise_coe[3], + arg->gauss_noise_coe[4], + arg->gauss_noise_coe[5], + 0); + rkisp_iowrite32(params_vdev, val, + CIF_RKSHARP_GAUSS_NOISE_COE2); + + val = CIF_ISP_PACK_4BYTE(arg->gauss_noise_coe[6], + arg->gauss_noise_coe[7], + arg->gauss_noise_coe[8], + 0); + rkisp_iowrite32(params_vdev, val, + CIF_RKSHARP_GAUSS_NOISE_COE3); + + val = CIF_ISP_PACK_4BYTE(arg->gauss_other_coe[0], + arg->gauss_other_coe[1], + arg->gauss_other_coe[2], + 0); + rkisp_iowrite32(params_vdev, val, + CIF_RKSHARP_GAUSS_OTHER_COE1); + + val = CIF_ISP_PACK_4BYTE(arg->gauss_other_coe[3], + arg->gauss_other_coe[4], + arg->gauss_other_coe[5], + 0); + rkisp_iowrite32(params_vdev, val, + CIF_RKSHARP_GAUSS_OTHER_COE2); + + val = CIF_ISP_PACK_4BYTE(arg->gauss_other_coe[6], + arg->gauss_other_coe[7], + arg->gauss_other_coe[8], + 0); + rkisp_iowrite32(params_vdev, val, + CIF_RKSHARP_GAUSS_OTHER_COE3); + + val = CIF_ISP_PACK_4BYTE(arg->line1_filter_coe[0], + arg->line1_filter_coe[1], + arg->line1_filter_coe[2], + 0); + rkisp_iowrite32(params_vdev, val, + CIF_RKSHARP_LINE1_FILTER_COE1); + + val = CIF_ISP_PACK_4BYTE(arg->line1_filter_coe[3], + arg->line1_filter_coe[4], + arg->line1_filter_coe[5], + 0); + rkisp_iowrite32(params_vdev, val, + CIF_RKSHARP_LINE1_FILTER_COE2); + + val = CIF_ISP_PACK_4BYTE(arg->line2_filter_coe[0], + arg->line2_filter_coe[1], + arg->line2_filter_coe[2], + 0); + rkisp_iowrite32(params_vdev, val, + CIF_RKSHARP_LINE2_FILTER_COE1); + + val = CIF_ISP_PACK_4BYTE(arg->line2_filter_coe[3], + arg->line2_filter_coe[4], + arg->line2_filter_coe[5], + 0); + rkisp_iowrite32(params_vdev, val, + CIF_RKSHARP_LINE2_FILTER_COE2); + + val = CIF_ISP_PACK_4BYTE(arg->line2_filter_coe[6], + arg->line2_filter_coe[7], + arg->line2_filter_coe[8], + 0); + rkisp_iowrite32(params_vdev, val, + CIF_RKSHARP_LINE2_FILTER_COE3); + + val = CIF_ISP_PACK_4BYTE(arg->line3_filter_coe[0], + arg->line3_filter_coe[1], + arg->line3_filter_coe[2], + 0); + rkisp_iowrite32(params_vdev, val, + CIF_RKSHARP_LINE3_FILTER_COE1); + + val = CIF_ISP_PACK_4BYTE(arg->line3_filter_coe[3], + arg->line3_filter_coe[4], + arg->line3_filter_coe[5], + 0); + rkisp_iowrite32(params_vdev, val, + CIF_RKSHARP_LINE3_FILTER_COE2); + + val = CIF_ISP_PACK_2SHORT(arg->grad_seq[0], + arg->grad_seq[1]); + rkisp_iowrite32(params_vdev, val, + CIF_RKSHARP_GRAD_SEQ_P0_P1); + + val = CIF_ISP_PACK_2SHORT(arg->grad_seq[2], + arg->grad_seq[3]); + rkisp_iowrite32(params_vdev, val, + CIF_RKSHARP_GRAD_SEQ_P2_P3); + + val = CIF_ISP_PACK_4BYTE(arg->sharp_factor[0], + arg->sharp_factor[1], + arg->sharp_factor[2], + 0); + rkisp_iowrite32(params_vdev, val, + CIF_RKSHARP_SHARP_FACTOR_P0_P1_P2); + + val = CIF_ISP_PACK_4BYTE(arg->sharp_factor[3], + arg->sharp_factor[4], + 0, + 0); + rkisp_iowrite32(params_vdev, val, + CIF_RKSHARP_SHARP_FACTOR_P3_P4); + + val = CIF_ISP_PACK_4BYTE(arg->uv_gauss_flat_coe[0], + arg->uv_gauss_flat_coe[1], + arg->uv_gauss_flat_coe[2], + arg->uv_gauss_flat_coe[3]); + rkisp_iowrite32(params_vdev, val, + CIF_RKSHARP_UV_GAUSS_FLAT_COE11_COE14); + + val = CIF_ISP_PACK_4BYTE(arg->uv_gauss_flat_coe[4], + arg->uv_gauss_flat_coe[5], + arg->uv_gauss_flat_coe[6], + arg->uv_gauss_flat_coe[7]); + rkisp_iowrite32(params_vdev, val, + CIF_RKSHARP_UV_GAUSS_FLAT_COE15_COE23); + + val = CIF_ISP_PACK_4BYTE(arg->uv_gauss_flat_coe[8], + arg->uv_gauss_flat_coe[9], + arg->uv_gauss_flat_coe[10], + arg->uv_gauss_flat_coe[11]); + rkisp_iowrite32(params_vdev, val, + CIF_RKSHARP_UV_GAUSS_FLAT_COE24_COE32); + + val = CIF_ISP_PACK_4BYTE(arg->uv_gauss_flat_coe[12], + arg->uv_gauss_flat_coe[13], + arg->uv_gauss_flat_coe[14], + 0); + rkisp_iowrite32(params_vdev, val, + CIF_RKSHARP_UV_GAUSS_FLAT_COE33_COE35); + + val = CIF_ISP_PACK_4BYTE(arg->uv_gauss_noise_coe[0], + arg->uv_gauss_noise_coe[1], + arg->uv_gauss_noise_coe[2], + arg->uv_gauss_noise_coe[3]); + rkisp_iowrite32(params_vdev, val, + CIF_RKSHARP_UV_GAUSS_NOISE_COE11_COE14); + + val = CIF_ISP_PACK_4BYTE(arg->uv_gauss_noise_coe[4], + arg->uv_gauss_noise_coe[5], + arg->uv_gauss_noise_coe[6], + arg->uv_gauss_noise_coe[7]); + rkisp_iowrite32(params_vdev, val, + CIF_RKSHARP_UV_GAUSS_NOISE_COE15_COE23); + + val = CIF_ISP_PACK_4BYTE(arg->uv_gauss_noise_coe[8], + arg->uv_gauss_noise_coe[9], + arg->uv_gauss_noise_coe[10], + arg->uv_gauss_noise_coe[11]); + rkisp_iowrite32(params_vdev, val, + CIF_RKSHARP_UV_GAUSS_NOISE_COE24_COE32); + + val = CIF_ISP_PACK_4BYTE(arg->uv_gauss_noise_coe[12], + arg->uv_gauss_noise_coe[13], + arg->uv_gauss_noise_coe[14], + 0); + rkisp_iowrite32(params_vdev, val, + CIF_RKSHARP_UV_GAUSS_NOISE_COE33_COE35); + + val = CIF_ISP_PACK_4BYTE(arg->uv_gauss_other_coe[0], + arg->uv_gauss_other_coe[1], + arg->uv_gauss_other_coe[2], + arg->uv_gauss_other_coe[3]); + rkisp_iowrite32(params_vdev, val, + CIF_RKSHARP_UV_GAUSS_OTHER_COE11_COE14); + + val = CIF_ISP_PACK_4BYTE(arg->uv_gauss_other_coe[4], + arg->uv_gauss_other_coe[5], + arg->uv_gauss_other_coe[6], + arg->uv_gauss_other_coe[7]); + rkisp_iowrite32(params_vdev, val, + CIF_RKSHARP_UV_GAUSS_OTHER_COE15_COE23); + + val = CIF_ISP_PACK_4BYTE(arg->uv_gauss_other_coe[8], + arg->uv_gauss_other_coe[9], + arg->uv_gauss_other_coe[10], + arg->uv_gauss_other_coe[11]); + rkisp_iowrite32(params_vdev, val, + CIF_RKSHARP_UV_GAUSS_OTHER_COE24_COE32); + + val = CIF_ISP_PACK_4BYTE(arg->uv_gauss_other_coe[12], + arg->uv_gauss_other_coe[13], + arg->uv_gauss_other_coe[14], + 0); + rkisp_iowrite32(params_vdev, val, + CIF_RKSHARP_UV_GAUSS_OTHER_COE33_COE35); + + rkisp_iowrite32(params_vdev, arg->switch_avg, + CIF_RKSHARP_CTRL); + + rkisp_iowrite32(params_vdev, + arg->coring_thr, + CIF_IMG_EFF_SHARPEN); + + val = rkisp_ioread32(params_vdev, CIF_IMG_EFF_MAT_3) & 0x0F; + val |= (arg->lap_mat_coe[0] & 0x0F) << 4 | + (arg->lap_mat_coe[1] & 0x0F) << 8 | + (arg->lap_mat_coe[2] & 0x0F) << 12; + rkisp_iowrite32(params_vdev, val, CIF_IMG_EFF_MAT_3); + + val = (arg->lap_mat_coe[3] & 0x0F) << 0 | + (arg->lap_mat_coe[4] & 0x0F) << 4 | + (arg->lap_mat_coe[5] & 0x0F) << 8 | + (arg->lap_mat_coe[6] & 0x0F) << 12; + rkisp_iowrite32(params_vdev, val, CIF_IMG_EFF_MAT_4); + + val = (arg->lap_mat_coe[7] & 0x0F) << 0 | + (arg->lap_mat_coe[8] & 0x0F) << 4; + rkisp_iowrite32(params_vdev, val, CIF_IMG_EFF_MAT_5); + + eff_ctrl = rkisp_ioread32(params_vdev, CIF_IMG_EFF_CTRL); + eff_ctrl &= ~CIF_IMG_EFF_CTRL_MODE_MASK; + eff_ctrl |= CIF_IMG_EFF_CTRL_MODE_RKSHARPEN; + + if (arg->full_range) + eff_ctrl |= CIF_IMG_EFF_CTRL_YCBCR_FULL; + + rkisp_iowrite32(params_vdev, eff_ctrl, CIF_IMG_EFF_CTRL); } static void isp_iesharp_enable(struct rkisp_isp_params_vdev *params_vdev, bool en) { + return isp_ie_enable(params_vdev, en); } static void @@ -522,14 +1555,14 @@ isp_rawaf_config(struct rkisp_isp_params_vdev *params_vdev, // (horizontal left row), value must be greater or equal 2 // (vertical top line), value must be greater or equal 1 rkisp_iowrite32(params_vdev, - ISP2X_PACK_2SHORT(v_offs, h_offs), - ISP_RAWAF_LT_A + i * 8); + ISP2X_PACK_2SHORT(v_offs, h_offs), + ISP_RAWAF_LT_A + i * 8); // value must be smaller than [width of picture -2] // value must be lower than (number of lines -2) rkisp_iowrite32(params_vdev, - ISP2X_PACK_2SHORT(v_size, h_size), - ISP_RAWAF_RB_A + i * 8); + ISP2X_PACK_2SHORT(v_size, h_size), + ISP_RAWAF_RB_A + i * 8); } var = 0; @@ -624,9 +1657,14 @@ isp_rawaelite_config(struct rkisp_isp_params_vdev *params_vdev, 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; rkisp_iowrite32(params_vdev, - ISP2X_RAWAE_LITE_V_SIZE_SET(block_vsize) | - ISP2X_RAWAE_LITE_H_SIZE_SET(block_hsize), - ISP_RAWAE_LITE_BLK_SIZ); + ISP2X_RAWAE_LITE_V_SIZE_SET(block_vsize) | + ISP2X_RAWAE_LITE_H_SIZE_SET(block_hsize), + ISP_RAWAE_LITE_BLK_SIZ); + + value = rkisp_ioread32(params_vdev, CTRL_VI_ISP_PATH); + value &= ~(ISP2X_ISPPATH_RAWAE_SWAP_SET(3)); + value |= ISP2X_ISPPATH_RAWAE_SWAP_SET(arg->rawae_sel); + rkisp_iowrite32(params_vdev, value, CTRL_VI_ISP_PATH); } static void @@ -697,27 +1735,27 @@ isp_rawaebig_config(struct rkisp_isp_params_vdev *params_vdev, rkisp_iowrite32(params_vdev, value, addr + RAWAE_BIG_CTRL); rkisp_iowrite32(params_vdev, - ISP2X_RAWAEBIG_V_OFFSET_SET(arg->win.v_offs) | - ISP2X_RAWAEBIG_H_OFFSET_SET(arg->win.h_offs), - addr + RAWAE_BIG_OFFSET); + ISP2X_RAWAEBIG_V_OFFSET_SET(arg->win.v_offs) | + 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; rkisp_iowrite32(params_vdev, - ISP2X_RAWAEBIG_V_SIZE_SET(block_vsize) | - ISP2X_RAWAEBIG_H_SIZE_SET(block_hsize), - addr + RAWAE_BIG_BLK_SIZE); + ISP2X_RAWAEBIG_V_SIZE_SET(block_vsize) | + ISP2X_RAWAEBIG_H_SIZE_SET(block_hsize), + addr + RAWAE_BIG_BLK_SIZE); for (i = 0; i < ISP2X_RAWAEBIG_SUBWIN_NUM; i++) { rkisp_iowrite32(params_vdev, - ISP2X_RAWAEBIG_SUBWIN_V_OFFSET_SET(arg->subwin[i].v_offs) | - ISP2X_RAWAEBIG_SUBWIN_H_OFFSET_SET(arg->subwin[i].h_offs), - addr + RAWAE_BIG_WND1_OFFSET + 8 * i); + ISP2X_RAWAEBIG_SUBWIN_V_OFFSET_SET(arg->subwin[i].v_offs) | + ISP2X_RAWAEBIG_SUBWIN_H_OFFSET_SET(arg->subwin[i].h_offs), + addr + RAWAE_BIG_WND1_OFFSET + 8 * i); rkisp_iowrite32(params_vdev, - ISP2X_RAWAEBIG_SUBWIN_V_SIZE_SET(arg->subwin[i].v_size + arg->subwin[i].v_offs) | - ISP2X_RAWAEBIG_SUBWIN_H_SIZE_SET(arg->subwin[i].h_size + arg->subwin[i].h_offs), - addr + RAWAE_BIG_WND1_SIZE + 8 * i); + ISP2X_RAWAEBIG_SUBWIN_V_SIZE_SET(arg->subwin[i].v_size + arg->subwin[i].v_offs) | + ISP2X_RAWAEBIG_SUBWIN_H_SIZE_SET(arg->subwin[i].h_size + arg->subwin[i].h_offs), + addr + RAWAE_BIG_WND1_SIZE + 8 * i); } if (blk_no == 0) { @@ -725,6 +1763,11 @@ isp_rawaebig_config(struct rkisp_isp_params_vdev *params_vdev, value &= ~(ISP2X_ISPPATH_RAWAE_SEL_SET(3)); value |= ISP2X_ISPPATH_RAWAE_SEL_SET(arg->rawae_sel); rkisp_iowrite32(params_vdev, value, CTRL_VI_ISP_PATH); + } else { + value = rkisp_ioread32(params_vdev, CTRL_VI_ISP_PATH); + value &= ~(ISP2X_ISPPATH_RAWAE_SWAP_SET(3)); + value |= ISP2X_ISPPATH_RAWAE_SWAP_SET(arg->rawae_sel); + rkisp_iowrite32(params_vdev, value, CTRL_VI_ISP_PATH); } } @@ -809,808 +1852,808 @@ isp_rawawb_config(struct rkisp_isp_params_vdev *params_vdev, u32 value; rkisp_iowrite32(params_vdev, - ISP2X_PACK_2SHORT(arg->sw_rawawb_h_offs, arg->sw_rawawb_v_offs), - ISP_RAWAWB_WIN_OFFS); + ISP2X_PACK_2SHORT(arg->sw_rawawb_h_offs, arg->sw_rawawb_v_offs), + ISP_RAWAWB_WIN_OFFS); rkisp_iowrite32(params_vdev, - ISP2X_PACK_2SHORT(arg->sw_rawawb_h_size, arg->sw_rawawb_v_size), - ISP_RAWAWB_WIN_SIZE); + ISP2X_PACK_2SHORT(arg->sw_rawawb_h_size, arg->sw_rawawb_v_size), + ISP_RAWAWB_WIN_SIZE); rkisp_iowrite32(params_vdev, - ISP2X_PACK_2SHORT(arg->sw_rawawb_r_max, arg->sw_rawawb_g_max), - ISP_RAWAWB_LIMIT_RG_MAX); + ISP2X_PACK_2SHORT(arg->sw_rawawb_r_max, arg->sw_rawawb_g_max), + ISP_RAWAWB_LIMIT_RG_MAX); rkisp_iowrite32(params_vdev, - ISP2X_PACK_2SHORT(arg->sw_rawawb_b_max, arg->sw_rawawb_y_max), - ISP_RAWAWB_LIMIT_BY_MAX); + ISP2X_PACK_2SHORT(arg->sw_rawawb_b_max, arg->sw_rawawb_y_max), + ISP_RAWAWB_LIMIT_BY_MAX); rkisp_iowrite32(params_vdev, - ISP2X_PACK_2SHORT(arg->sw_rawawb_r_min, arg->sw_rawawb_g_min), - ISP_RAWAWB_LIMIT_RG_MIN); + ISP2X_PACK_2SHORT(arg->sw_rawawb_r_min, arg->sw_rawawb_g_min), + ISP_RAWAWB_LIMIT_RG_MIN); rkisp_iowrite32(params_vdev, - ISP2X_PACK_2SHORT(arg->sw_rawawb_b_min, arg->sw_rawawb_y_min), - ISP_RAWAWB_LIMIT_BY_MIN); + ISP2X_PACK_2SHORT(arg->sw_rawawb_b_min, arg->sw_rawawb_y_min), + ISP_RAWAWB_LIMIT_BY_MIN); rkisp_iowrite32(params_vdev, - ISP2X_PACK_2SHORT(arg->sw_rawawb_coeff_y_r, arg->sw_rawawb_coeff_y_g), - ISP_RAWAWB_RGB2Y_0); + ISP2X_PACK_2SHORT(arg->sw_rawawb_coeff_y_r, arg->sw_rawawb_coeff_y_g), + ISP_RAWAWB_RGB2Y_0); rkisp_iowrite32(params_vdev, - ISP2X_PACK_2SHORT(arg->sw_rawawb_coeff_y_b, 0), - ISP_RAWAWB_RGB2Y_1); + ISP2X_PACK_2SHORT(arg->sw_rawawb_coeff_y_b, 0), + ISP_RAWAWB_RGB2Y_1); rkisp_iowrite32(params_vdev, - ISP2X_PACK_2SHORT(arg->sw_rawawb_coeff_u_r, arg->sw_rawawb_coeff_u_g), - ISP_RAWAWB_RGB2U_0); + ISP2X_PACK_2SHORT(arg->sw_rawawb_coeff_u_r, arg->sw_rawawb_coeff_u_g), + ISP_RAWAWB_RGB2U_0); rkisp_iowrite32(params_vdev, - ISP2X_PACK_2SHORT(arg->sw_rawawb_coeff_u_b, 0), - ISP_RAWAWB_RGB2U_1); + ISP2X_PACK_2SHORT(arg->sw_rawawb_coeff_u_b, 0), + ISP_RAWAWB_RGB2U_1); rkisp_iowrite32(params_vdev, - ISP2X_PACK_2SHORT(arg->sw_rawawb_coeff_v_r, arg->sw_rawawb_coeff_v_g), - ISP_RAWAWB_RGB2V_0); + ISP2X_PACK_2SHORT(arg->sw_rawawb_coeff_v_r, arg->sw_rawawb_coeff_v_g), + ISP_RAWAWB_RGB2V_0); rkisp_iowrite32(params_vdev, - ISP2X_PACK_2SHORT(arg->sw_rawawb_coeff_v_b, 0), - ISP_RAWAWB_RGB2V_1); + ISP2X_PACK_2SHORT(arg->sw_rawawb_coeff_v_b, 0), + ISP_RAWAWB_RGB2V_1); rkisp_iowrite32(params_vdev, - ISP2X_PACK_2SHORT(arg->sw_rawawb_vertex0_u_0, arg->sw_rawawb_vertex0_v_0), - ISP_RAWAWB_UV_DETC_VERTEX0_0); + ISP2X_PACK_2SHORT(arg->sw_rawawb_vertex0_u_0, arg->sw_rawawb_vertex0_v_0), + ISP_RAWAWB_UV_DETC_VERTEX0_0); rkisp_iowrite32(params_vdev, - ISP2X_PACK_2SHORT(arg->sw_rawawb_vertex1_u_0, arg->sw_rawawb_vertex1_v_0), - ISP_RAWAWB_UV_DETC_VERTEX1_0); + ISP2X_PACK_2SHORT(arg->sw_rawawb_vertex1_u_0, arg->sw_rawawb_vertex1_v_0), + ISP_RAWAWB_UV_DETC_VERTEX1_0); rkisp_iowrite32(params_vdev, - ISP2X_PACK_2SHORT(arg->sw_rawawb_vertex2_u_0, arg->sw_rawawb_vertex2_v_0), - ISP_RAWAWB_UV_DETC_VERTEX2_0); + ISP2X_PACK_2SHORT(arg->sw_rawawb_vertex2_u_0, arg->sw_rawawb_vertex2_v_0), + ISP_RAWAWB_UV_DETC_VERTEX2_0); rkisp_iowrite32(params_vdev, - ISP2X_PACK_2SHORT(arg->sw_rawawb_vertex3_u_0, arg->sw_rawawb_vertex3_v_0), - ISP_RAWAWB_UV_DETC_VERTEX3_0); + ISP2X_PACK_2SHORT(arg->sw_rawawb_vertex3_u_0, arg->sw_rawawb_vertex3_v_0), + ISP_RAWAWB_UV_DETC_VERTEX3_0); rkisp_iowrite32(params_vdev, - arg->sw_rawawb_islope01_0, - ISP_RAWAWB_UV_DETC_ISLOPE01_0); + arg->sw_rawawb_islope01_0, + ISP_RAWAWB_UV_DETC_ISLOPE01_0); rkisp_iowrite32(params_vdev, - arg->sw_rawawb_islope12_0, - ISP_RAWAWB_UV_DETC_ISLOPE12_0); + arg->sw_rawawb_islope12_0, + ISP_RAWAWB_UV_DETC_ISLOPE12_0); rkisp_iowrite32(params_vdev, - arg->sw_rawawb_islope23_0, - ISP_RAWAWB_UV_DETC_ISLOPE23_0); + arg->sw_rawawb_islope23_0, + ISP_RAWAWB_UV_DETC_ISLOPE23_0); rkisp_iowrite32(params_vdev, - arg->sw_rawawb_islope30_0, - ISP_RAWAWB_UV_DETC_ISLOPE30_0); + arg->sw_rawawb_islope30_0, + ISP_RAWAWB_UV_DETC_ISLOPE30_0); rkisp_iowrite32(params_vdev, - ISP2X_PACK_2SHORT(arg->sw_rawawb_vertex0_u_1, arg->sw_rawawb_vertex0_v_1), - ISP_RAWAWB_UV_DETC_VERTEX0_1); + ISP2X_PACK_2SHORT(arg->sw_rawawb_vertex0_u_1, arg->sw_rawawb_vertex0_v_1), + ISP_RAWAWB_UV_DETC_VERTEX0_1); rkisp_iowrite32(params_vdev, - ISP2X_PACK_2SHORT(arg->sw_rawawb_vertex1_u_1, arg->sw_rawawb_vertex1_v_1), - ISP_RAWAWB_UV_DETC_VERTEX1_1); + ISP2X_PACK_2SHORT(arg->sw_rawawb_vertex1_u_1, arg->sw_rawawb_vertex1_v_1), + ISP_RAWAWB_UV_DETC_VERTEX1_1); rkisp_iowrite32(params_vdev, - ISP2X_PACK_2SHORT(arg->sw_rawawb_vertex2_u_1, arg->sw_rawawb_vertex2_v_1), - ISP_RAWAWB_UV_DETC_VERTEX2_1); + ISP2X_PACK_2SHORT(arg->sw_rawawb_vertex2_u_1, arg->sw_rawawb_vertex2_v_1), + ISP_RAWAWB_UV_DETC_VERTEX2_1); rkisp_iowrite32(params_vdev, - ISP2X_PACK_2SHORT(arg->sw_rawawb_vertex3_u_1, arg->sw_rawawb_vertex3_v_1), - ISP_RAWAWB_UV_DETC_VERTEX3_1); + ISP2X_PACK_2SHORT(arg->sw_rawawb_vertex3_u_1, arg->sw_rawawb_vertex3_v_1), + ISP_RAWAWB_UV_DETC_VERTEX3_1); rkisp_iowrite32(params_vdev, - arg->sw_rawawb_islope01_1, - ISP_RAWAWB_UV_DETC_ISLOPE01_1); + arg->sw_rawawb_islope01_1, + ISP_RAWAWB_UV_DETC_ISLOPE01_1); rkisp_iowrite32(params_vdev, - arg->sw_rawawb_islope12_1, - ISP_RAWAWB_UV_DETC_ISLOPE12_1); + arg->sw_rawawb_islope12_1, + ISP_RAWAWB_UV_DETC_ISLOPE12_1); rkisp_iowrite32(params_vdev, - arg->sw_rawawb_islope23_1, - ISP_RAWAWB_UV_DETC_ISLOPE23_1); + arg->sw_rawawb_islope23_1, + ISP_RAWAWB_UV_DETC_ISLOPE23_1); rkisp_iowrite32(params_vdev, - arg->sw_rawawb_islope30_1, - ISP_RAWAWB_UV_DETC_ISLOPE30_1); + arg->sw_rawawb_islope30_1, + ISP_RAWAWB_UV_DETC_ISLOPE30_1); rkisp_iowrite32(params_vdev, - ISP2X_PACK_2SHORT(arg->sw_rawawb_vertex0_u_2, arg->sw_rawawb_vertex0_v_2), - ISP_RAWAWB_UV_DETC_VERTEX0_2); + ISP2X_PACK_2SHORT(arg->sw_rawawb_vertex0_u_2, arg->sw_rawawb_vertex0_v_2), + ISP_RAWAWB_UV_DETC_VERTEX0_2); rkisp_iowrite32(params_vdev, - ISP2X_PACK_2SHORT(arg->sw_rawawb_vertex1_u_2, arg->sw_rawawb_vertex1_v_2), - ISP_RAWAWB_UV_DETC_VERTEX1_2); + ISP2X_PACK_2SHORT(arg->sw_rawawb_vertex1_u_2, arg->sw_rawawb_vertex1_v_2), + ISP_RAWAWB_UV_DETC_VERTEX1_2); rkisp_iowrite32(params_vdev, - ISP2X_PACK_2SHORT(arg->sw_rawawb_vertex2_u_2, arg->sw_rawawb_vertex2_v_2), - ISP_RAWAWB_UV_DETC_VERTEX2_2); + ISP2X_PACK_2SHORT(arg->sw_rawawb_vertex2_u_2, arg->sw_rawawb_vertex2_v_2), + ISP_RAWAWB_UV_DETC_VERTEX2_2); rkisp_iowrite32(params_vdev, - ISP2X_PACK_2SHORT(arg->sw_rawawb_vertex3_u_2, arg->sw_rawawb_vertex3_v_2), - ISP_RAWAWB_UV_DETC_VERTEX3_2); + ISP2X_PACK_2SHORT(arg->sw_rawawb_vertex3_u_2, arg->sw_rawawb_vertex3_v_2), + ISP_RAWAWB_UV_DETC_VERTEX3_2); rkisp_iowrite32(params_vdev, - arg->sw_rawawb_islope01_2, - ISP_RAWAWB_UV_DETC_ISLOPE01_2); + arg->sw_rawawb_islope01_2, + ISP_RAWAWB_UV_DETC_ISLOPE01_2); rkisp_iowrite32(params_vdev, - arg->sw_rawawb_islope12_2, - ISP_RAWAWB_UV_DETC_ISLOPE12_2); + arg->sw_rawawb_islope12_2, + ISP_RAWAWB_UV_DETC_ISLOPE12_2); rkisp_iowrite32(params_vdev, - arg->sw_rawawb_islope23_2, - ISP_RAWAWB_UV_DETC_ISLOPE23_2); + arg->sw_rawawb_islope23_2, + ISP_RAWAWB_UV_DETC_ISLOPE23_2); rkisp_iowrite32(params_vdev, - arg->sw_rawawb_islope30_2, - ISP_RAWAWB_UV_DETC_ISLOPE30_2); + arg->sw_rawawb_islope30_2, + ISP_RAWAWB_UV_DETC_ISLOPE30_2); rkisp_iowrite32(params_vdev, - ISP2X_PACK_2SHORT(arg->sw_rawawb_vertex0_u_3, arg->sw_rawawb_vertex0_v_3), - ISP_RAWAWB_UV_DETC_VERTEX0_3); + ISP2X_PACK_2SHORT(arg->sw_rawawb_vertex0_u_3, arg->sw_rawawb_vertex0_v_3), + ISP_RAWAWB_UV_DETC_VERTEX0_3); rkisp_iowrite32(params_vdev, - ISP2X_PACK_2SHORT(arg->sw_rawawb_vertex1_u_3, arg->sw_rawawb_vertex1_v_3), - ISP_RAWAWB_UV_DETC_VERTEX1_3); + ISP2X_PACK_2SHORT(arg->sw_rawawb_vertex1_u_3, arg->sw_rawawb_vertex1_v_3), + ISP_RAWAWB_UV_DETC_VERTEX1_3); rkisp_iowrite32(params_vdev, - ISP2X_PACK_2SHORT(arg->sw_rawawb_vertex2_u_3, arg->sw_rawawb_vertex2_v_3), - ISP_RAWAWB_UV_DETC_VERTEX2_3); + ISP2X_PACK_2SHORT(arg->sw_rawawb_vertex2_u_3, arg->sw_rawawb_vertex2_v_3), + ISP_RAWAWB_UV_DETC_VERTEX2_3); rkisp_iowrite32(params_vdev, - ISP2X_PACK_2SHORT(arg->sw_rawawb_vertex3_u_3, arg->sw_rawawb_vertex3_v_3), - ISP_RAWAWB_UV_DETC_VERTEX3_3); + ISP2X_PACK_2SHORT(arg->sw_rawawb_vertex3_u_3, arg->sw_rawawb_vertex3_v_3), + ISP_RAWAWB_UV_DETC_VERTEX3_3); rkisp_iowrite32(params_vdev, - arg->sw_rawawb_islope01_3, - ISP_RAWAWB_UV_DETC_ISLOPE01_3); + arg->sw_rawawb_islope01_3, + ISP_RAWAWB_UV_DETC_ISLOPE01_3); rkisp_iowrite32(params_vdev, - arg->sw_rawawb_islope12_3, - ISP_RAWAWB_UV_DETC_ISLOPE12_3); + arg->sw_rawawb_islope12_3, + ISP_RAWAWB_UV_DETC_ISLOPE12_3); rkisp_iowrite32(params_vdev, - arg->sw_rawawb_islope23_3, - ISP_RAWAWB_UV_DETC_ISLOPE23_3); + arg->sw_rawawb_islope23_3, + ISP_RAWAWB_UV_DETC_ISLOPE23_3); rkisp_iowrite32(params_vdev, - arg->sw_rawawb_islope30_3, - ISP_RAWAWB_UV_DETC_ISLOPE30_3); + arg->sw_rawawb_islope30_3, + ISP_RAWAWB_UV_DETC_ISLOPE30_3); rkisp_iowrite32(params_vdev, - ISP2X_PACK_2SHORT(arg->sw_rawawb_vertex0_u_4, arg->sw_rawawb_vertex0_v_4), - ISP_RAWAWB_UV_DETC_VERTEX0_4); + ISP2X_PACK_2SHORT(arg->sw_rawawb_vertex0_u_4, arg->sw_rawawb_vertex0_v_4), + ISP_RAWAWB_UV_DETC_VERTEX0_4); rkisp_iowrite32(params_vdev, - ISP2X_PACK_2SHORT(arg->sw_rawawb_vertex1_u_4, arg->sw_rawawb_vertex1_v_4), - ISP_RAWAWB_UV_DETC_VERTEX1_4); + ISP2X_PACK_2SHORT(arg->sw_rawawb_vertex1_u_4, arg->sw_rawawb_vertex1_v_4), + ISP_RAWAWB_UV_DETC_VERTEX1_4); rkisp_iowrite32(params_vdev, - ISP2X_PACK_2SHORT(arg->sw_rawawb_vertex2_u_4, arg->sw_rawawb_vertex2_v_4), - ISP_RAWAWB_UV_DETC_VERTEX2_4); + ISP2X_PACK_2SHORT(arg->sw_rawawb_vertex2_u_4, arg->sw_rawawb_vertex2_v_4), + ISP_RAWAWB_UV_DETC_VERTEX2_4); rkisp_iowrite32(params_vdev, - ISP2X_PACK_2SHORT(arg->sw_rawawb_vertex3_u_4, arg->sw_rawawb_vertex3_v_4), - ISP_RAWAWB_UV_DETC_VERTEX3_4); + ISP2X_PACK_2SHORT(arg->sw_rawawb_vertex3_u_4, arg->sw_rawawb_vertex3_v_4), + ISP_RAWAWB_UV_DETC_VERTEX3_4); rkisp_iowrite32(params_vdev, - arg->sw_rawawb_islope01_4, - ISP_RAWAWB_UV_DETC_ISLOPE01_4); + arg->sw_rawawb_islope01_4, + ISP_RAWAWB_UV_DETC_ISLOPE01_4); rkisp_iowrite32(params_vdev, - arg->sw_rawawb_islope12_4, - ISP_RAWAWB_UV_DETC_ISLOPE12_4); + arg->sw_rawawb_islope12_4, + ISP_RAWAWB_UV_DETC_ISLOPE12_4); rkisp_iowrite32(params_vdev, - arg->sw_rawawb_islope23_4, - ISP_RAWAWB_UV_DETC_ISLOPE23_4); + arg->sw_rawawb_islope23_4, + ISP_RAWAWB_UV_DETC_ISLOPE23_4); rkisp_iowrite32(params_vdev, - arg->sw_rawawb_islope30_4, - ISP_RAWAWB_UV_DETC_ISLOPE30_4); + arg->sw_rawawb_islope30_4, + ISP_RAWAWB_UV_DETC_ISLOPE30_4); rkisp_iowrite32(params_vdev, - ISP2X_PACK_2SHORT(arg->sw_rawawb_vertex0_u_5, arg->sw_rawawb_vertex0_v_5), - ISP_RAWAWB_UV_DETC_VERTEX0_5); + ISP2X_PACK_2SHORT(arg->sw_rawawb_vertex0_u_5, arg->sw_rawawb_vertex0_v_5), + ISP_RAWAWB_UV_DETC_VERTEX0_5); rkisp_iowrite32(params_vdev, - ISP2X_PACK_2SHORT(arg->sw_rawawb_vertex1_u_5, arg->sw_rawawb_vertex1_v_5), - ISP_RAWAWB_UV_DETC_VERTEX1_5); + ISP2X_PACK_2SHORT(arg->sw_rawawb_vertex1_u_5, arg->sw_rawawb_vertex1_v_5), + ISP_RAWAWB_UV_DETC_VERTEX1_5); rkisp_iowrite32(params_vdev, - ISP2X_PACK_2SHORT(arg->sw_rawawb_vertex2_u_5, arg->sw_rawawb_vertex2_v_5), - ISP_RAWAWB_UV_DETC_VERTEX2_5); + ISP2X_PACK_2SHORT(arg->sw_rawawb_vertex2_u_5, arg->sw_rawawb_vertex2_v_5), + ISP_RAWAWB_UV_DETC_VERTEX2_5); rkisp_iowrite32(params_vdev, - ISP2X_PACK_2SHORT(arg->sw_rawawb_vertex3_u_5, arg->sw_rawawb_vertex3_v_5), - ISP_RAWAWB_UV_DETC_VERTEX3_5); + ISP2X_PACK_2SHORT(arg->sw_rawawb_vertex3_u_5, arg->sw_rawawb_vertex3_v_5), + ISP_RAWAWB_UV_DETC_VERTEX3_5); rkisp_iowrite32(params_vdev, - arg->sw_rawawb_islope01_5, - ISP_RAWAWB_UV_DETC_ISLOPE01_5); + arg->sw_rawawb_islope01_5, + ISP_RAWAWB_UV_DETC_ISLOPE01_5); rkisp_iowrite32(params_vdev, - arg->sw_rawawb_islope12_5, - ISP_RAWAWB_UV_DETC_ISLOPE12_5); + arg->sw_rawawb_islope12_5, + ISP_RAWAWB_UV_DETC_ISLOPE12_5); rkisp_iowrite32(params_vdev, - arg->sw_rawawb_islope23_5, - ISP_RAWAWB_UV_DETC_ISLOPE23_5); + arg->sw_rawawb_islope23_5, + ISP_RAWAWB_UV_DETC_ISLOPE23_5); rkisp_iowrite32(params_vdev, - arg->sw_rawawb_islope30_5, - ISP_RAWAWB_UV_DETC_ISLOPE30_5); + arg->sw_rawawb_islope30_5, + ISP_RAWAWB_UV_DETC_ISLOPE30_5); rkisp_iowrite32(params_vdev, - ISP2X_PACK_2SHORT(arg->sw_rawawb_vertex0_u_6, arg->sw_rawawb_vertex0_v_6), - ISP_RAWAWB_UV_DETC_VERTEX0_6); + ISP2X_PACK_2SHORT(arg->sw_rawawb_vertex0_u_6, arg->sw_rawawb_vertex0_v_6), + ISP_RAWAWB_UV_DETC_VERTEX0_6); rkisp_iowrite32(params_vdev, - ISP2X_PACK_2SHORT(arg->sw_rawawb_vertex1_u_6, arg->sw_rawawb_vertex1_v_6), - ISP_RAWAWB_UV_DETC_VERTEX1_6); + ISP2X_PACK_2SHORT(arg->sw_rawawb_vertex1_u_6, arg->sw_rawawb_vertex1_v_6), + ISP_RAWAWB_UV_DETC_VERTEX1_6); rkisp_iowrite32(params_vdev, - ISP2X_PACK_2SHORT(arg->sw_rawawb_vertex2_u_6, arg->sw_rawawb_vertex2_v_6), - ISP_RAWAWB_UV_DETC_VERTEX2_6); + ISP2X_PACK_2SHORT(arg->sw_rawawb_vertex2_u_6, arg->sw_rawawb_vertex2_v_6), + ISP_RAWAWB_UV_DETC_VERTEX2_6); rkisp_iowrite32(params_vdev, - ISP2X_PACK_2SHORT(arg->sw_rawawb_vertex3_u_6, arg->sw_rawawb_vertex3_v_6), - ISP_RAWAWB_UV_DETC_VERTEX3_6); + ISP2X_PACK_2SHORT(arg->sw_rawawb_vertex3_u_6, arg->sw_rawawb_vertex3_v_6), + ISP_RAWAWB_UV_DETC_VERTEX3_6); rkisp_iowrite32(params_vdev, - arg->sw_rawawb_islope01_6, - ISP_RAWAWB_UV_DETC_ISLOPE01_6); + arg->sw_rawawb_islope01_6, + ISP_RAWAWB_UV_DETC_ISLOPE01_6); rkisp_iowrite32(params_vdev, - arg->sw_rawawb_islope12_6, - ISP_RAWAWB_UV_DETC_ISLOPE12_6); + arg->sw_rawawb_islope12_6, + ISP_RAWAWB_UV_DETC_ISLOPE12_6); rkisp_iowrite32(params_vdev, - arg->sw_rawawb_islope23_6, - ISP_RAWAWB_UV_DETC_ISLOPE23_6); + arg->sw_rawawb_islope23_6, + ISP_RAWAWB_UV_DETC_ISLOPE23_6); rkisp_iowrite32(params_vdev, - arg->sw_rawawb_islope30_6, - ISP_RAWAWB_UV_DETC_ISLOPE30_6); + arg->sw_rawawb_islope30_6, + ISP_RAWAWB_UV_DETC_ISLOPE30_6); rkisp_iowrite32(params_vdev, - arg->sw_rawawb_b_uv_0, - ISP_RAWAWB_YUV_DETC_B_UV_0); + arg->sw_rawawb_b_uv_0, + ISP_RAWAWB_YUV_DETC_B_UV_0); rkisp_iowrite32(params_vdev, - arg->sw_rawawb_slope_vtcuv_0, - ISP_RAWAWB_YUV_DETC_SLOPE_VTCUV_0); + arg->sw_rawawb_slope_vtcuv_0, + ISP_RAWAWB_YUV_DETC_SLOPE_VTCUV_0); rkisp_iowrite32(params_vdev, - arg->sw_rawawb_inv_dslope_0, - ISP_RAWAWB_YUV_DETC_INV_DSLOPE_0); + arg->sw_rawawb_inv_dslope_0, + ISP_RAWAWB_YUV_DETC_INV_DSLOPE_0); rkisp_iowrite32(params_vdev, - arg->sw_rawawb_slope_ydis_0, - ISP_RAWAWB_YUV_DETC_SLOPE_YDIS_0); + arg->sw_rawawb_slope_ydis_0, + ISP_RAWAWB_YUV_DETC_SLOPE_YDIS_0); rkisp_iowrite32(params_vdev, - arg->sw_rawawb_b_ydis_0, - ISP_RAWAWB_YUV_DETC_B_YDIS_0); + arg->sw_rawawb_b_ydis_0, + ISP_RAWAWB_YUV_DETC_B_YDIS_0); rkisp_iowrite32(params_vdev, - arg->sw_rawawb_b_uv_1, - ISP_RAWAWB_YUV_DETC_B_UV_1); + arg->sw_rawawb_b_uv_1, + ISP_RAWAWB_YUV_DETC_B_UV_1); rkisp_iowrite32(params_vdev, - arg->sw_rawawb_slope_vtcuv_1, - ISP_RAWAWB_YUV_DETC_SLOPE_VTCUV_1); + arg->sw_rawawb_slope_vtcuv_1, + ISP_RAWAWB_YUV_DETC_SLOPE_VTCUV_1); rkisp_iowrite32(params_vdev, - arg->sw_rawawb_inv_dslope_1, - ISP_RAWAWB_YUV_DETC_INV_DSLOPE_1); + arg->sw_rawawb_inv_dslope_1, + ISP_RAWAWB_YUV_DETC_INV_DSLOPE_1); rkisp_iowrite32(params_vdev, - arg->sw_rawawb_slope_ydis_1, - ISP_RAWAWB_YUV_DETC_SLOPE_YDIS_1); + arg->sw_rawawb_slope_ydis_1, + ISP_RAWAWB_YUV_DETC_SLOPE_YDIS_1); rkisp_iowrite32(params_vdev, - arg->sw_rawawb_b_ydis_1, - ISP_RAWAWB_YUV_DETC_B_YDIS_1); + arg->sw_rawawb_b_ydis_1, + ISP_RAWAWB_YUV_DETC_B_YDIS_1); rkisp_iowrite32(params_vdev, - arg->sw_rawawb_b_uv_2, - ISP_RAWAWB_YUV_DETC_B_UV_2); + arg->sw_rawawb_b_uv_2, + ISP_RAWAWB_YUV_DETC_B_UV_2); rkisp_iowrite32(params_vdev, - arg->sw_rawawb_slope_vtcuv_2, - ISP_RAWAWB_YUV_DETC_SLOPE_VTCUV_2); + arg->sw_rawawb_slope_vtcuv_2, + ISP_RAWAWB_YUV_DETC_SLOPE_VTCUV_2); rkisp_iowrite32(params_vdev, - arg->sw_rawawb_inv_dslope_2, - ISP_RAWAWB_YUV_DETC_INV_DSLOPE_2); + arg->sw_rawawb_inv_dslope_2, + ISP_RAWAWB_YUV_DETC_INV_DSLOPE_2); rkisp_iowrite32(params_vdev, - arg->sw_rawawb_slope_ydis_2, - ISP_RAWAWB_YUV_DETC_SLOPE_YDIS_2); + arg->sw_rawawb_slope_ydis_2, + ISP_RAWAWB_YUV_DETC_SLOPE_YDIS_2); rkisp_iowrite32(params_vdev, - arg->sw_rawawb_b_ydis_2, - ISP_RAWAWB_YUV_DETC_B_YDIS_2); + arg->sw_rawawb_b_ydis_2, + ISP_RAWAWB_YUV_DETC_B_YDIS_2); rkisp_iowrite32(params_vdev, - arg->sw_rawawb_b_uv_3, - ISP_RAWAWB_YUV_DETC_B_UV_3); + arg->sw_rawawb_b_uv_3, + ISP_RAWAWB_YUV_DETC_B_UV_3); rkisp_iowrite32(params_vdev, - arg->sw_rawawb_slope_vtcuv_3, - ISP_RAWAWB_YUV_DETC_SLOPE_VTCUV_3); + arg->sw_rawawb_slope_vtcuv_3, + ISP_RAWAWB_YUV_DETC_SLOPE_VTCUV_3); rkisp_iowrite32(params_vdev, - arg->sw_rawawb_inv_dslope_3, - ISP_RAWAWB_YUV_DETC_INV_DSLOPE_3); + arg->sw_rawawb_inv_dslope_3, + ISP_RAWAWB_YUV_DETC_INV_DSLOPE_3); rkisp_iowrite32(params_vdev, - arg->sw_rawawb_slope_ydis_3, - ISP_RAWAWB_YUV_DETC_SLOPE_YDIS_3); + arg->sw_rawawb_slope_ydis_3, + ISP_RAWAWB_YUV_DETC_SLOPE_YDIS_3); rkisp_iowrite32(params_vdev, - arg->sw_rawawb_b_ydis_3, - ISP_RAWAWB_YUV_DETC_B_YDIS_3); + arg->sw_rawawb_b_ydis_3, + ISP_RAWAWB_YUV_DETC_B_YDIS_3); rkisp_iowrite32(params_vdev, - arg->sw_rawawb_ref_u, - ISP_RAWAWB_YUV_DETC_REF_U); + arg->sw_rawawb_ref_u, + ISP_RAWAWB_YUV_DETC_REF_U); rkisp_iowrite32(params_vdev, - ISP2X_PACK_4BYTE(arg->sw_rawawb_ref_v_0, arg->sw_rawawb_ref_v_1, - arg->sw_rawawb_ref_v_2, arg->sw_rawawb_ref_v_3), - ISP_RAWAWB_YUV_DETC_REF_V); + ISP2X_PACK_4BYTE(arg->sw_rawawb_ref_v_0, arg->sw_rawawb_ref_v_1, + arg->sw_rawawb_ref_v_2, arg->sw_rawawb_ref_v_3), + ISP_RAWAWB_YUV_DETC_REF_V); rkisp_iowrite32(params_vdev, - ISP2X_PACK_2SHORT(arg->sw_rawawb_dis0_0, arg->sw_rawawb_dis1_0), - ISP_RAWAWB_YUV_DETC_DIS01_0); + ISP2X_PACK_2SHORT(arg->sw_rawawb_dis0_0, arg->sw_rawawb_dis1_0), + ISP_RAWAWB_YUV_DETC_DIS01_0); rkisp_iowrite32(params_vdev, - ISP2X_PACK_2SHORT(arg->sw_rawawb_dis2_0, arg->sw_rawawb_dis3_0), - ISP_RAWAWB_YUV_DETC_DIS23_0); + ISP2X_PACK_2SHORT(arg->sw_rawawb_dis2_0, arg->sw_rawawb_dis3_0), + ISP_RAWAWB_YUV_DETC_DIS23_0); rkisp_iowrite32(params_vdev, - ISP2X_PACK_2SHORT(arg->sw_rawawb_dis4_0, arg->sw_rawawb_dis5_0), - ISP_RAWAWB_YUV_DETC_DIS45_0); + ISP2X_PACK_2SHORT(arg->sw_rawawb_dis4_0, arg->sw_rawawb_dis5_0), + ISP_RAWAWB_YUV_DETC_DIS45_0); rkisp_iowrite32(params_vdev, - ISP2X_PACK_4BYTE(arg->sw_rawawb_th0_0, arg->sw_rawawb_th1_0, - arg->sw_rawawb_th2_0, arg->sw_rawawb_th3_0), - ISP_RAWAWB_YUV_DETC_TH03_0); + ISP2X_PACK_4BYTE(arg->sw_rawawb_th0_0, arg->sw_rawawb_th1_0, + arg->sw_rawawb_th2_0, arg->sw_rawawb_th3_0), + ISP_RAWAWB_YUV_DETC_TH03_0); rkisp_iowrite32(params_vdev, - ISP2X_PACK_4BYTE(arg->sw_rawawb_th4_0, arg->sw_rawawb_th5_0, - 0, 0), - ISP_RAWAWB_YUV_DETC_TH45_0); + ISP2X_PACK_4BYTE(arg->sw_rawawb_th4_0, arg->sw_rawawb_th5_0, + 0, 0), + ISP_RAWAWB_YUV_DETC_TH45_0); rkisp_iowrite32(params_vdev, - ISP2X_PACK_2SHORT(arg->sw_rawawb_dis0_1, arg->sw_rawawb_dis1_1), - ISP_RAWAWB_YUV_DETC_DIS01_1); + ISP2X_PACK_2SHORT(arg->sw_rawawb_dis0_1, arg->sw_rawawb_dis1_1), + ISP_RAWAWB_YUV_DETC_DIS01_1); rkisp_iowrite32(params_vdev, - ISP2X_PACK_2SHORT(arg->sw_rawawb_dis2_1, arg->sw_rawawb_dis3_1), - ISP_RAWAWB_YUV_DETC_DIS23_1); + ISP2X_PACK_2SHORT(arg->sw_rawawb_dis2_1, arg->sw_rawawb_dis3_1), + ISP_RAWAWB_YUV_DETC_DIS23_1); rkisp_iowrite32(params_vdev, - ISP2X_PACK_2SHORT(arg->sw_rawawb_dis4_1, arg->sw_rawawb_dis5_1), - ISP_RAWAWB_YUV_DETC_DIS45_1); + ISP2X_PACK_2SHORT(arg->sw_rawawb_dis4_1, arg->sw_rawawb_dis5_1), + ISP_RAWAWB_YUV_DETC_DIS45_1); rkisp_iowrite32(params_vdev, - ISP2X_PACK_4BYTE(arg->sw_rawawb_th0_1, arg->sw_rawawb_th1_1, - arg->sw_rawawb_th2_1, arg->sw_rawawb_th3_1), - ISP_RAWAWB_YUV_DETC_TH03_1); + ISP2X_PACK_4BYTE(arg->sw_rawawb_th0_1, arg->sw_rawawb_th1_1, + arg->sw_rawawb_th2_1, arg->sw_rawawb_th3_1), + ISP_RAWAWB_YUV_DETC_TH03_1); rkisp_iowrite32(params_vdev, - ISP2X_PACK_4BYTE(arg->sw_rawawb_th4_1, arg->sw_rawawb_th5_1, - 0, 0), - ISP_RAWAWB_YUV_DETC_TH45_1); + ISP2X_PACK_4BYTE(arg->sw_rawawb_th4_1, arg->sw_rawawb_th5_1, + 0, 0), + ISP_RAWAWB_YUV_DETC_TH45_1); rkisp_iowrite32(params_vdev, - ISP2X_PACK_2SHORT(arg->sw_rawawb_dis0_2, arg->sw_rawawb_dis1_2), - ISP_RAWAWB_YUV_DETC_DIS01_2); + ISP2X_PACK_2SHORT(arg->sw_rawawb_dis0_2, arg->sw_rawawb_dis1_2), + ISP_RAWAWB_YUV_DETC_DIS01_2); rkisp_iowrite32(params_vdev, - ISP2X_PACK_2SHORT(arg->sw_rawawb_dis2_2, arg->sw_rawawb_dis3_2), - ISP_RAWAWB_YUV_DETC_DIS23_2); + ISP2X_PACK_2SHORT(arg->sw_rawawb_dis2_2, arg->sw_rawawb_dis3_2), + ISP_RAWAWB_YUV_DETC_DIS23_2); rkisp_iowrite32(params_vdev, - ISP2X_PACK_2SHORT(arg->sw_rawawb_dis4_2, arg->sw_rawawb_dis5_2), - ISP_RAWAWB_YUV_DETC_DIS45_2); + ISP2X_PACK_2SHORT(arg->sw_rawawb_dis4_2, arg->sw_rawawb_dis5_2), + ISP_RAWAWB_YUV_DETC_DIS45_2); rkisp_iowrite32(params_vdev, - ISP2X_PACK_4BYTE(arg->sw_rawawb_th0_2, arg->sw_rawawb_th1_2, - arg->sw_rawawb_th2_2, arg->sw_rawawb_th3_2), - ISP_RAWAWB_YUV_DETC_TH03_2); + ISP2X_PACK_4BYTE(arg->sw_rawawb_th0_2, arg->sw_rawawb_th1_2, + arg->sw_rawawb_th2_2, arg->sw_rawawb_th3_2), + ISP_RAWAWB_YUV_DETC_TH03_2); rkisp_iowrite32(params_vdev, - ISP2X_PACK_4BYTE(arg->sw_rawawb_th4_2, arg->sw_rawawb_th5_2, - 0, 0), - ISP_RAWAWB_YUV_DETC_TH45_2); + ISP2X_PACK_4BYTE(arg->sw_rawawb_th4_2, arg->sw_rawawb_th5_2, + 0, 0), + ISP_RAWAWB_YUV_DETC_TH45_2); rkisp_iowrite32(params_vdev, - ISP2X_PACK_2SHORT(arg->sw_rawawb_dis0_3, arg->sw_rawawb_dis1_3), - ISP_RAWAWB_YUV_DETC_DIS01_3); + ISP2X_PACK_2SHORT(arg->sw_rawawb_dis0_3, arg->sw_rawawb_dis1_3), + ISP_RAWAWB_YUV_DETC_DIS01_3); rkisp_iowrite32(params_vdev, - ISP2X_PACK_2SHORT(arg->sw_rawawb_dis2_3, arg->sw_rawawb_dis3_3), - ISP_RAWAWB_YUV_DETC_DIS23_3); + ISP2X_PACK_2SHORT(arg->sw_rawawb_dis2_3, arg->sw_rawawb_dis3_3), + ISP_RAWAWB_YUV_DETC_DIS23_3); rkisp_iowrite32(params_vdev, - ISP2X_PACK_2SHORT(arg->sw_rawawb_dis4_3, arg->sw_rawawb_dis5_3), - ISP_RAWAWB_YUV_DETC_DIS45_3); + ISP2X_PACK_2SHORT(arg->sw_rawawb_dis4_3, arg->sw_rawawb_dis5_3), + ISP_RAWAWB_YUV_DETC_DIS45_3); rkisp_iowrite32(params_vdev, - ISP2X_PACK_4BYTE(arg->sw_rawawb_th0_3, arg->sw_rawawb_th1_3, - arg->sw_rawawb_th2_3, arg->sw_rawawb_th3_3), - ISP_RAWAWB_YUV_DETC_TH03_3); + ISP2X_PACK_4BYTE(arg->sw_rawawb_th0_3, arg->sw_rawawb_th1_3, + arg->sw_rawawb_th2_3, arg->sw_rawawb_th3_3), + ISP_RAWAWB_YUV_DETC_TH03_3); rkisp_iowrite32(params_vdev, - ISP2X_PACK_4BYTE(arg->sw_rawawb_th4_3, arg->sw_rawawb_th5_3, - 0, 0), - ISP_RAWAWB_YUV_DETC_TH45_3); + ISP2X_PACK_4BYTE(arg->sw_rawawb_th4_3, arg->sw_rawawb_th5_3, + 0, 0), + ISP_RAWAWB_YUV_DETC_TH45_3); rkisp_iowrite32(params_vdev, - ISP2X_PACK_2SHORT(arg->sw_rawawb_wt0, arg->sw_rawawb_wt1), - ISP_RAWAWB_RGB2XY_WT01); + ISP2X_PACK_2SHORT(arg->sw_rawawb_wt0, arg->sw_rawawb_wt1), + ISP_RAWAWB_RGB2XY_WT01); rkisp_iowrite32(params_vdev, - arg->sw_rawawb_wt2, - ISP_RAWAWB_RGB2XY_WT2); + arg->sw_rawawb_wt2, + ISP_RAWAWB_RGB2XY_WT2); rkisp_iowrite32(params_vdev, - ISP2X_PACK_2SHORT(arg->sw_rawawb_mat0_x, arg->sw_rawawb_mat0_y), - ISP_RAWAWB_RGB2XY_MAT0_XY); + ISP2X_PACK_2SHORT(arg->sw_rawawb_mat0_x, arg->sw_rawawb_mat0_y), + ISP_RAWAWB_RGB2XY_MAT0_XY); rkisp_iowrite32(params_vdev, - ISP2X_PACK_2SHORT(arg->sw_rawawb_mat1_x, arg->sw_rawawb_mat1_y), - ISP_RAWAWB_RGB2XY_MAT1_XY); + ISP2X_PACK_2SHORT(arg->sw_rawawb_mat1_x, arg->sw_rawawb_mat1_y), + ISP_RAWAWB_RGB2XY_MAT1_XY); rkisp_iowrite32(params_vdev, - ISP2X_PACK_2SHORT(arg->sw_rawawb_mat2_x, arg->sw_rawawb_mat2_y), - ISP_RAWAWB_RGB2XY_MAT2_XY); + ISP2X_PACK_2SHORT(arg->sw_rawawb_mat2_x, arg->sw_rawawb_mat2_y), + ISP_RAWAWB_RGB2XY_MAT2_XY); rkisp_iowrite32(params_vdev, - ISP2X_PACK_2SHORT(arg->sw_rawawb_nor_x0_0, arg->sw_rawawb_nor_x1_0), - ISP_RAWAWB_XY_DETC_NOR_X_0); + ISP2X_PACK_2SHORT(arg->sw_rawawb_nor_x0_0, arg->sw_rawawb_nor_x1_0), + ISP_RAWAWB_XY_DETC_NOR_X_0); rkisp_iowrite32(params_vdev, - ISP2X_PACK_2SHORT(arg->sw_rawawb_nor_y0_0, arg->sw_rawawb_nor_y1_0), - ISP_RAWAWB_XY_DETC_NOR_Y_0); + ISP2X_PACK_2SHORT(arg->sw_rawawb_nor_y0_0, arg->sw_rawawb_nor_y1_0), + ISP_RAWAWB_XY_DETC_NOR_Y_0); rkisp_iowrite32(params_vdev, - ISP2X_PACK_2SHORT(arg->sw_rawawb_big_x0_0, arg->sw_rawawb_big_x1_0), - ISP_RAWAWB_XY_DETC_BIG_X_0); + ISP2X_PACK_2SHORT(arg->sw_rawawb_big_x0_0, arg->sw_rawawb_big_x1_0), + ISP_RAWAWB_XY_DETC_BIG_X_0); rkisp_iowrite32(params_vdev, - ISP2X_PACK_2SHORT(arg->sw_rawawb_big_y0_0, arg->sw_rawawb_big_y1_0), - ISP_RAWAWB_XY_DETC_BIG_Y_0); + ISP2X_PACK_2SHORT(arg->sw_rawawb_big_y0_0, arg->sw_rawawb_big_y1_0), + ISP_RAWAWB_XY_DETC_BIG_Y_0); rkisp_iowrite32(params_vdev, - ISP2X_PACK_2SHORT(arg->sw_rawawb_sma_x0_0, arg->sw_rawawb_sma_x1_0), - ISP_RAWAWB_XY_DETC_SMA_X_0); + ISP2X_PACK_2SHORT(arg->sw_rawawb_sma_x0_0, arg->sw_rawawb_sma_x1_0), + ISP_RAWAWB_XY_DETC_SMA_X_0); rkisp_iowrite32(params_vdev, - ISP2X_PACK_2SHORT(arg->sw_rawawb_sma_y0_0, arg->sw_rawawb_sma_y1_0), - ISP_RAWAWB_XY_DETC_SMA_Y_0); + ISP2X_PACK_2SHORT(arg->sw_rawawb_sma_y0_0, arg->sw_rawawb_sma_y1_0), + ISP_RAWAWB_XY_DETC_SMA_Y_0); rkisp_iowrite32(params_vdev, - ISP2X_PACK_2SHORT(arg->sw_rawawb_nor_x0_1, arg->sw_rawawb_nor_x1_1), - ISP_RAWAWB_XY_DETC_NOR_X_1); + ISP2X_PACK_2SHORT(arg->sw_rawawb_nor_x0_1, arg->sw_rawawb_nor_x1_1), + ISP_RAWAWB_XY_DETC_NOR_X_1); rkisp_iowrite32(params_vdev, - ISP2X_PACK_2SHORT(arg->sw_rawawb_nor_y0_1, arg->sw_rawawb_nor_y1_1), - ISP_RAWAWB_XY_DETC_NOR_Y_1); + ISP2X_PACK_2SHORT(arg->sw_rawawb_nor_y0_1, arg->sw_rawawb_nor_y1_1), + ISP_RAWAWB_XY_DETC_NOR_Y_1); rkisp_iowrite32(params_vdev, - ISP2X_PACK_2SHORT(arg->sw_rawawb_big_x0_1, arg->sw_rawawb_big_x1_1), - ISP_RAWAWB_XY_DETC_BIG_X_1); + ISP2X_PACK_2SHORT(arg->sw_rawawb_big_x0_1, arg->sw_rawawb_big_x1_1), + ISP_RAWAWB_XY_DETC_BIG_X_1); rkisp_iowrite32(params_vdev, - ISP2X_PACK_2SHORT(arg->sw_rawawb_big_y0_1, arg->sw_rawawb_big_y1_1), - ISP_RAWAWB_XY_DETC_BIG_Y_1); + ISP2X_PACK_2SHORT(arg->sw_rawawb_big_y0_1, arg->sw_rawawb_big_y1_1), + ISP_RAWAWB_XY_DETC_BIG_Y_1); rkisp_iowrite32(params_vdev, - ISP2X_PACK_2SHORT(arg->sw_rawawb_sma_x0_1, arg->sw_rawawb_sma_x1_1), - ISP_RAWAWB_XY_DETC_SMA_X_1); + ISP2X_PACK_2SHORT(arg->sw_rawawb_sma_x0_1, arg->sw_rawawb_sma_x1_1), + ISP_RAWAWB_XY_DETC_SMA_X_1); rkisp_iowrite32(params_vdev, - ISP2X_PACK_2SHORT(arg->sw_rawawb_sma_y0_1, arg->sw_rawawb_sma_y1_1), - ISP_RAWAWB_XY_DETC_SMA_Y_1); + ISP2X_PACK_2SHORT(arg->sw_rawawb_sma_y0_1, arg->sw_rawawb_sma_y1_1), + ISP_RAWAWB_XY_DETC_SMA_Y_1); rkisp_iowrite32(params_vdev, - ISP2X_PACK_2SHORT(arg->sw_rawawb_nor_x0_2, arg->sw_rawawb_nor_x1_2), - ISP_RAWAWB_XY_DETC_NOR_X_2); + ISP2X_PACK_2SHORT(arg->sw_rawawb_nor_x0_2, arg->sw_rawawb_nor_x1_2), + ISP_RAWAWB_XY_DETC_NOR_X_2); rkisp_iowrite32(params_vdev, - ISP2X_PACK_2SHORT(arg->sw_rawawb_nor_y0_2, arg->sw_rawawb_nor_y1_2), - ISP_RAWAWB_XY_DETC_NOR_Y_2); + ISP2X_PACK_2SHORT(arg->sw_rawawb_nor_y0_2, arg->sw_rawawb_nor_y1_2), + ISP_RAWAWB_XY_DETC_NOR_Y_2); rkisp_iowrite32(params_vdev, - ISP2X_PACK_2SHORT(arg->sw_rawawb_big_x0_2, arg->sw_rawawb_big_x1_2), - ISP_RAWAWB_XY_DETC_BIG_X_2); + ISP2X_PACK_2SHORT(arg->sw_rawawb_big_x0_2, arg->sw_rawawb_big_x1_2), + ISP_RAWAWB_XY_DETC_BIG_X_2); rkisp_iowrite32(params_vdev, - ISP2X_PACK_2SHORT(arg->sw_rawawb_big_y0_2, arg->sw_rawawb_big_y1_2), - ISP_RAWAWB_XY_DETC_BIG_Y_2); + ISP2X_PACK_2SHORT(arg->sw_rawawb_big_y0_2, arg->sw_rawawb_big_y1_2), + ISP_RAWAWB_XY_DETC_BIG_Y_2); rkisp_iowrite32(params_vdev, - ISP2X_PACK_2SHORT(arg->sw_rawawb_sma_x0_2, arg->sw_rawawb_sma_x1_2), - ISP_RAWAWB_XY_DETC_SMA_X_2); + ISP2X_PACK_2SHORT(arg->sw_rawawb_sma_x0_2, arg->sw_rawawb_sma_x1_2), + ISP_RAWAWB_XY_DETC_SMA_X_2); rkisp_iowrite32(params_vdev, - ISP2X_PACK_2SHORT(arg->sw_rawawb_sma_y0_2, arg->sw_rawawb_sma_y1_2), - ISP_RAWAWB_XY_DETC_SMA_Y_2); + ISP2X_PACK_2SHORT(arg->sw_rawawb_sma_y0_2, arg->sw_rawawb_sma_y1_2), + ISP_RAWAWB_XY_DETC_SMA_Y_2); rkisp_iowrite32(params_vdev, - ISP2X_PACK_2SHORT(arg->sw_rawawb_nor_x0_3, arg->sw_rawawb_nor_x1_3), - ISP_RAWAWB_XY_DETC_NOR_X_3); + ISP2X_PACK_2SHORT(arg->sw_rawawb_nor_x0_3, arg->sw_rawawb_nor_x1_3), + ISP_RAWAWB_XY_DETC_NOR_X_3); rkisp_iowrite32(params_vdev, - ISP2X_PACK_2SHORT(arg->sw_rawawb_nor_y0_3, arg->sw_rawawb_nor_y1_3), - ISP_RAWAWB_XY_DETC_NOR_Y_3); + ISP2X_PACK_2SHORT(arg->sw_rawawb_nor_y0_3, arg->sw_rawawb_nor_y1_3), + ISP_RAWAWB_XY_DETC_NOR_Y_3); rkisp_iowrite32(params_vdev, - ISP2X_PACK_2SHORT(arg->sw_rawawb_big_x0_3, arg->sw_rawawb_big_x1_3), - ISP_RAWAWB_XY_DETC_BIG_X_3); + ISP2X_PACK_2SHORT(arg->sw_rawawb_big_x0_3, arg->sw_rawawb_big_x1_3), + ISP_RAWAWB_XY_DETC_BIG_X_3); rkisp_iowrite32(params_vdev, - ISP2X_PACK_2SHORT(arg->sw_rawawb_big_y0_3, arg->sw_rawawb_big_y1_3), - ISP_RAWAWB_XY_DETC_BIG_Y_3); + ISP2X_PACK_2SHORT(arg->sw_rawawb_big_y0_3, arg->sw_rawawb_big_y1_3), + ISP_RAWAWB_XY_DETC_BIG_Y_3); rkisp_iowrite32(params_vdev, - ISP2X_PACK_2SHORT(arg->sw_rawawb_sma_x0_3, arg->sw_rawawb_sma_x1_3), - ISP_RAWAWB_XY_DETC_SMA_X_3); + ISP2X_PACK_2SHORT(arg->sw_rawawb_sma_x0_3, arg->sw_rawawb_sma_x1_3), + ISP_RAWAWB_XY_DETC_SMA_X_3); rkisp_iowrite32(params_vdev, - ISP2X_PACK_2SHORT(arg->sw_rawawb_sma_y0_3, arg->sw_rawawb_sma_y1_3), - ISP_RAWAWB_XY_DETC_SMA_Y_3); + ISP2X_PACK_2SHORT(arg->sw_rawawb_sma_y0_3, arg->sw_rawawb_sma_y1_3), + ISP_RAWAWB_XY_DETC_SMA_Y_3); rkisp_iowrite32(params_vdev, - ISP2X_PACK_2SHORT(arg->sw_rawawb_nor_x0_4, arg->sw_rawawb_nor_x1_4), - ISP_RAWAWB_XY_DETC_NOR_X_4); + ISP2X_PACK_2SHORT(arg->sw_rawawb_nor_x0_4, arg->sw_rawawb_nor_x1_4), + ISP_RAWAWB_XY_DETC_NOR_X_4); rkisp_iowrite32(params_vdev, - ISP2X_PACK_2SHORT(arg->sw_rawawb_nor_y0_4, arg->sw_rawawb_nor_y1_4), - ISP_RAWAWB_XY_DETC_NOR_Y_4); + ISP2X_PACK_2SHORT(arg->sw_rawawb_nor_y0_4, arg->sw_rawawb_nor_y1_4), + ISP_RAWAWB_XY_DETC_NOR_Y_4); rkisp_iowrite32(params_vdev, - ISP2X_PACK_2SHORT(arg->sw_rawawb_big_x0_4, arg->sw_rawawb_big_x1_4), - ISP_RAWAWB_XY_DETC_BIG_X_4); + ISP2X_PACK_2SHORT(arg->sw_rawawb_big_x0_4, arg->sw_rawawb_big_x1_4), + ISP_RAWAWB_XY_DETC_BIG_X_4); rkisp_iowrite32(params_vdev, - ISP2X_PACK_2SHORT(arg->sw_rawawb_big_y0_4, arg->sw_rawawb_big_y1_4), - ISP_RAWAWB_XY_DETC_BIG_Y_4); + ISP2X_PACK_2SHORT(arg->sw_rawawb_big_y0_4, arg->sw_rawawb_big_y1_4), + ISP_RAWAWB_XY_DETC_BIG_Y_4); rkisp_iowrite32(params_vdev, - ISP2X_PACK_2SHORT(arg->sw_rawawb_sma_x0_4, arg->sw_rawawb_sma_x1_4), - ISP_RAWAWB_XY_DETC_SMA_X_4); + ISP2X_PACK_2SHORT(arg->sw_rawawb_sma_x0_4, arg->sw_rawawb_sma_x1_4), + ISP_RAWAWB_XY_DETC_SMA_X_4); rkisp_iowrite32(params_vdev, - ISP2X_PACK_2SHORT(arg->sw_rawawb_sma_y0_4, arg->sw_rawawb_sma_y1_4), - ISP_RAWAWB_XY_DETC_SMA_Y_4); + ISP2X_PACK_2SHORT(arg->sw_rawawb_sma_y0_4, arg->sw_rawawb_sma_y1_4), + ISP_RAWAWB_XY_DETC_SMA_Y_4); rkisp_iowrite32(params_vdev, - ISP2X_PACK_2SHORT(arg->sw_rawawb_nor_x0_5, arg->sw_rawawb_nor_x1_5), - ISP_RAWAWB_XY_DETC_NOR_X_5); + ISP2X_PACK_2SHORT(arg->sw_rawawb_nor_x0_5, arg->sw_rawawb_nor_x1_5), + ISP_RAWAWB_XY_DETC_NOR_X_5); rkisp_iowrite32(params_vdev, - ISP2X_PACK_2SHORT(arg->sw_rawawb_nor_y0_5, arg->sw_rawawb_nor_y1_5), - ISP_RAWAWB_XY_DETC_NOR_Y_5); + ISP2X_PACK_2SHORT(arg->sw_rawawb_nor_y0_5, arg->sw_rawawb_nor_y1_5), + ISP_RAWAWB_XY_DETC_NOR_Y_5); rkisp_iowrite32(params_vdev, - ISP2X_PACK_2SHORT(arg->sw_rawawb_big_x0_5, arg->sw_rawawb_big_x1_5), - ISP_RAWAWB_XY_DETC_BIG_X_5); + ISP2X_PACK_2SHORT(arg->sw_rawawb_big_x0_5, arg->sw_rawawb_big_x1_5), + ISP_RAWAWB_XY_DETC_BIG_X_5); rkisp_iowrite32(params_vdev, - ISP2X_PACK_2SHORT(arg->sw_rawawb_big_y0_5, arg->sw_rawawb_big_y1_5), - ISP_RAWAWB_XY_DETC_BIG_Y_5); + ISP2X_PACK_2SHORT(arg->sw_rawawb_big_y0_5, arg->sw_rawawb_big_y1_5), + ISP_RAWAWB_XY_DETC_BIG_Y_5); rkisp_iowrite32(params_vdev, - ISP2X_PACK_2SHORT(arg->sw_rawawb_sma_x0_5, arg->sw_rawawb_sma_x1_5), - ISP_RAWAWB_XY_DETC_SMA_X_5); + ISP2X_PACK_2SHORT(arg->sw_rawawb_sma_x0_5, arg->sw_rawawb_sma_x1_5), + ISP_RAWAWB_XY_DETC_SMA_X_5); rkisp_iowrite32(params_vdev, - ISP2X_PACK_2SHORT(arg->sw_rawawb_sma_y0_5, arg->sw_rawawb_sma_y1_5), - ISP_RAWAWB_XY_DETC_SMA_Y_5); + ISP2X_PACK_2SHORT(arg->sw_rawawb_sma_y0_5, arg->sw_rawawb_sma_y1_5), + ISP_RAWAWB_XY_DETC_SMA_Y_5); rkisp_iowrite32(params_vdev, - ISP2X_PACK_2SHORT(arg->sw_rawawb_nor_x0_6, arg->sw_rawawb_nor_x1_6), - ISP_RAWAWB_XY_DETC_NOR_X_6); + ISP2X_PACK_2SHORT(arg->sw_rawawb_nor_x0_6, arg->sw_rawawb_nor_x1_6), + ISP_RAWAWB_XY_DETC_NOR_X_6); rkisp_iowrite32(params_vdev, - ISP2X_PACK_2SHORT(arg->sw_rawawb_nor_y0_6, arg->sw_rawawb_nor_y1_6), - ISP_RAWAWB_XY_DETC_NOR_Y_6); + ISP2X_PACK_2SHORT(arg->sw_rawawb_nor_y0_6, arg->sw_rawawb_nor_y1_6), + ISP_RAWAWB_XY_DETC_NOR_Y_6); rkisp_iowrite32(params_vdev, - ISP2X_PACK_2SHORT(arg->sw_rawawb_big_x0_6, arg->sw_rawawb_big_x1_6), - ISP_RAWAWB_XY_DETC_BIG_X_6); + ISP2X_PACK_2SHORT(arg->sw_rawawb_big_x0_6, arg->sw_rawawb_big_x1_6), + ISP_RAWAWB_XY_DETC_BIG_X_6); rkisp_iowrite32(params_vdev, - ISP2X_PACK_2SHORT(arg->sw_rawawb_big_y0_6, arg->sw_rawawb_big_y1_6), - ISP_RAWAWB_XY_DETC_BIG_Y_6); + ISP2X_PACK_2SHORT(arg->sw_rawawb_big_y0_6, arg->sw_rawawb_big_y1_6), + ISP_RAWAWB_XY_DETC_BIG_Y_6); rkisp_iowrite32(params_vdev, - ISP2X_PACK_2SHORT(arg->sw_rawawb_sma_x0_6, arg->sw_rawawb_sma_x1_6), - ISP_RAWAWB_XY_DETC_SMA_X_6); + ISP2X_PACK_2SHORT(arg->sw_rawawb_sma_x0_6, arg->sw_rawawb_sma_x1_6), + ISP_RAWAWB_XY_DETC_SMA_X_6); rkisp_iowrite32(params_vdev, - ISP2X_PACK_2SHORT(arg->sw_rawawb_sma_y0_6, arg->sw_rawawb_sma_y1_6), - ISP_RAWAWB_XY_DETC_SMA_Y_6); + ISP2X_PACK_2SHORT(arg->sw_rawawb_sma_y0_6, arg->sw_rawawb_sma_y1_6), + ISP_RAWAWB_XY_DETC_SMA_Y_6); rkisp_iowrite32(params_vdev, - ISP2X_PACK_2SHORT(arg->sw_rawawb_multiwindow0_h_offs, arg->sw_rawawb_multiwindow0_v_offs), - ISP_RAWAWB_MULTIWINDOW0_OFFS); + ISP2X_PACK_2SHORT(arg->sw_rawawb_multiwindow0_h_offs, arg->sw_rawawb_multiwindow0_v_offs), + ISP_RAWAWB_MULTIWINDOW0_OFFS); rkisp_iowrite32(params_vdev, - ISP2X_PACK_2SHORT(arg->sw_rawawb_multiwindow0_h_size, arg->sw_rawawb_multiwindow0_v_size), - ISP_RAWAWB_MULTIWINDOW0_SIZE); + ISP2X_PACK_2SHORT(arg->sw_rawawb_multiwindow0_h_size, arg->sw_rawawb_multiwindow0_v_size), + ISP_RAWAWB_MULTIWINDOW0_SIZE); rkisp_iowrite32(params_vdev, - ISP2X_PACK_2SHORT(arg->sw_rawawb_multiwindow1_h_offs, arg->sw_rawawb_multiwindow1_v_offs), - ISP_RAWAWB_MULTIWINDOW1_OFFS); + ISP2X_PACK_2SHORT(arg->sw_rawawb_multiwindow1_h_offs, arg->sw_rawawb_multiwindow1_v_offs), + ISP_RAWAWB_MULTIWINDOW1_OFFS); rkisp_iowrite32(params_vdev, - ISP2X_PACK_2SHORT(arg->sw_rawawb_multiwindow1_h_size, arg->sw_rawawb_multiwindow1_v_size), - ISP_RAWAWB_MULTIWINDOW1_SIZE); + ISP2X_PACK_2SHORT(arg->sw_rawawb_multiwindow1_h_size, arg->sw_rawawb_multiwindow1_v_size), + ISP_RAWAWB_MULTIWINDOW1_SIZE); rkisp_iowrite32(params_vdev, - ISP2X_PACK_2SHORT(arg->sw_rawawb_multiwindow2_h_offs, arg->sw_rawawb_multiwindow2_v_offs), - ISP_RAWAWB_MULTIWINDOW2_OFFS); + ISP2X_PACK_2SHORT(arg->sw_rawawb_multiwindow2_h_offs, arg->sw_rawawb_multiwindow2_v_offs), + ISP_RAWAWB_MULTIWINDOW2_OFFS); rkisp_iowrite32(params_vdev, - ISP2X_PACK_2SHORT(arg->sw_rawawb_multiwindow2_h_size, arg->sw_rawawb_multiwindow2_v_size), - ISP_RAWAWB_MULTIWINDOW2_SIZE); + ISP2X_PACK_2SHORT(arg->sw_rawawb_multiwindow2_h_size, arg->sw_rawawb_multiwindow2_v_size), + ISP_RAWAWB_MULTIWINDOW2_SIZE); rkisp_iowrite32(params_vdev, - ISP2X_PACK_2SHORT(arg->sw_rawawb_multiwindow3_h_offs, arg->sw_rawawb_multiwindow3_v_offs), - ISP_RAWAWB_MULTIWINDOW3_OFFS); + ISP2X_PACK_2SHORT(arg->sw_rawawb_multiwindow3_h_offs, arg->sw_rawawb_multiwindow3_v_offs), + ISP_RAWAWB_MULTIWINDOW3_OFFS); rkisp_iowrite32(params_vdev, - ISP2X_PACK_2SHORT(arg->sw_rawawb_multiwindow3_h_size, arg->sw_rawawb_multiwindow3_v_size), - ISP_RAWAWB_MULTIWINDOW3_SIZE); + ISP2X_PACK_2SHORT(arg->sw_rawawb_multiwindow3_h_size, arg->sw_rawawb_multiwindow3_v_size), + ISP_RAWAWB_MULTIWINDOW3_SIZE); rkisp_iowrite32(params_vdev, - ISP2X_PACK_2SHORT(arg->sw_rawawb_multiwindow4_h_offs, arg->sw_rawawb_multiwindow4_v_offs), - ISP_RAWAWB_MULTIWINDOW4_OFFS); + ISP2X_PACK_2SHORT(arg->sw_rawawb_multiwindow4_h_offs, arg->sw_rawawb_multiwindow4_v_offs), + ISP_RAWAWB_MULTIWINDOW4_OFFS); rkisp_iowrite32(params_vdev, - ISP2X_PACK_2SHORT(arg->sw_rawawb_multiwindow4_h_size, arg->sw_rawawb_multiwindow4_v_size), - ISP_RAWAWB_MULTIWINDOW4_SIZE); + ISP2X_PACK_2SHORT(arg->sw_rawawb_multiwindow4_h_size, arg->sw_rawawb_multiwindow4_v_size), + ISP_RAWAWB_MULTIWINDOW4_SIZE); rkisp_iowrite32(params_vdev, - ISP2X_PACK_2SHORT(arg->sw_rawawb_multiwindow5_h_offs, arg->sw_rawawb_multiwindow5_v_offs), - ISP_RAWAWB_MULTIWINDOW5_OFFS); + ISP2X_PACK_2SHORT(arg->sw_rawawb_multiwindow5_h_offs, arg->sw_rawawb_multiwindow5_v_offs), + ISP_RAWAWB_MULTIWINDOW5_OFFS); rkisp_iowrite32(params_vdev, - ISP2X_PACK_2SHORT(arg->sw_rawawb_multiwindow5_h_size, arg->sw_rawawb_multiwindow5_v_size), - ISP_RAWAWB_MULTIWINDOW5_SIZE); + ISP2X_PACK_2SHORT(arg->sw_rawawb_multiwindow5_h_size, arg->sw_rawawb_multiwindow5_v_size), + ISP_RAWAWB_MULTIWINDOW5_SIZE); rkisp_iowrite32(params_vdev, - ISP2X_PACK_2SHORT(arg->sw_rawawb_multiwindow6_h_offs, arg->sw_rawawb_multiwindow6_v_offs), - ISP_RAWAWB_MULTIWINDOW6_OFFS); + ISP2X_PACK_2SHORT(arg->sw_rawawb_multiwindow6_h_offs, arg->sw_rawawb_multiwindow6_v_offs), + ISP_RAWAWB_MULTIWINDOW6_OFFS); rkisp_iowrite32(params_vdev, - ISP2X_PACK_2SHORT(arg->sw_rawawb_multiwindow6_h_size, arg->sw_rawawb_multiwindow6_v_size), - ISP_RAWAWB_MULTIWINDOW6_SIZE); + ISP2X_PACK_2SHORT(arg->sw_rawawb_multiwindow6_h_size, arg->sw_rawawb_multiwindow6_v_size), + ISP_RAWAWB_MULTIWINDOW6_SIZE); rkisp_iowrite32(params_vdev, - ISP2X_PACK_2SHORT(arg->sw_rawawb_multiwindow7_h_offs, arg->sw_rawawb_multiwindow7_v_offs), - ISP_RAWAWB_MULTIWINDOW7_OFFS); + ISP2X_PACK_2SHORT(arg->sw_rawawb_multiwindow7_h_offs, arg->sw_rawawb_multiwindow7_v_offs), + ISP_RAWAWB_MULTIWINDOW7_OFFS); rkisp_iowrite32(params_vdev, - ISP2X_PACK_2SHORT(arg->sw_rawawb_multiwindow7_h_size, arg->sw_rawawb_multiwindow7_v_size), - ISP_RAWAWB_MULTIWINDOW7_SIZE); + ISP2X_PACK_2SHORT(arg->sw_rawawb_multiwindow7_h_size, arg->sw_rawawb_multiwindow7_v_size), + ISP_RAWAWB_MULTIWINDOW7_SIZE); rkisp_iowrite32(params_vdev, - ISP2X_PACK_2SHORT(arg->sw_rawawb_exc_wp_region0_xu0, arg->sw_rawawb_exc_wp_region0_xu1), - ISP_RAWAWB_EXC_WP_REGION0_XU); + ISP2X_PACK_2SHORT(arg->sw_rawawb_exc_wp_region0_xu0, arg->sw_rawawb_exc_wp_region0_xu1), + ISP_RAWAWB_EXC_WP_REGION0_XU); rkisp_iowrite32(params_vdev, - ISP2X_PACK_2SHORT(arg->sw_rawawb_exc_wp_region0_yv0, arg->sw_rawawb_exc_wp_region0_yv1), - ISP_RAWAWB_EXC_WP_REGION0_YV); + ISP2X_PACK_2SHORT(arg->sw_rawawb_exc_wp_region0_yv0, arg->sw_rawawb_exc_wp_region0_yv1), + ISP_RAWAWB_EXC_WP_REGION0_YV); rkisp_iowrite32(params_vdev, - ISP2X_PACK_2SHORT(arg->sw_rawawb_exc_wp_region1_xu0, arg->sw_rawawb_exc_wp_region1_xu1), - ISP_RAWAWB_EXC_WP_REGION1_XU); + ISP2X_PACK_2SHORT(arg->sw_rawawb_exc_wp_region1_xu0, arg->sw_rawawb_exc_wp_region1_xu1), + ISP_RAWAWB_EXC_WP_REGION1_XU); rkisp_iowrite32(params_vdev, - ISP2X_PACK_2SHORT(arg->sw_rawawb_exc_wp_region1_yv0, arg->sw_rawawb_exc_wp_region1_yv1), - ISP_RAWAWB_EXC_WP_REGION1_YV); + ISP2X_PACK_2SHORT(arg->sw_rawawb_exc_wp_region1_yv0, arg->sw_rawawb_exc_wp_region1_yv1), + ISP_RAWAWB_EXC_WP_REGION1_YV); rkisp_iowrite32(params_vdev, - ISP2X_PACK_2SHORT(arg->sw_rawawb_exc_wp_region2_xu0, arg->sw_rawawb_exc_wp_region2_xu1), - ISP_RAWAWB_EXC_WP_REGION2_XU); + ISP2X_PACK_2SHORT(arg->sw_rawawb_exc_wp_region2_xu0, arg->sw_rawawb_exc_wp_region2_xu1), + ISP_RAWAWB_EXC_WP_REGION2_XU); rkisp_iowrite32(params_vdev, - ISP2X_PACK_2SHORT(arg->sw_rawawb_exc_wp_region2_yv0, arg->sw_rawawb_exc_wp_region2_yv1), - ISP_RAWAWB_EXC_WP_REGION2_YV); + ISP2X_PACK_2SHORT(arg->sw_rawawb_exc_wp_region2_yv0, arg->sw_rawawb_exc_wp_region2_yv1), + ISP_RAWAWB_EXC_WP_REGION2_YV); rkisp_iowrite32(params_vdev, - ISP2X_PACK_2SHORT(arg->sw_rawawb_exc_wp_region3_xu0, arg->sw_rawawb_exc_wp_region3_xu1), - ISP_RAWAWB_EXC_WP_REGION3_XU); + ISP2X_PACK_2SHORT(arg->sw_rawawb_exc_wp_region3_xu0, arg->sw_rawawb_exc_wp_region3_xu1), + ISP_RAWAWB_EXC_WP_REGION3_XU); rkisp_iowrite32(params_vdev, - ISP2X_PACK_2SHORT(arg->sw_rawawb_exc_wp_region3_yv0, arg->sw_rawawb_exc_wp_region3_yv1), - ISP_RAWAWB_EXC_WP_REGION3_YV); + ISP2X_PACK_2SHORT(arg->sw_rawawb_exc_wp_region3_yv0, arg->sw_rawawb_exc_wp_region3_yv1), + ISP_RAWAWB_EXC_WP_REGION3_YV); rkisp_iowrite32(params_vdev, - ISP2X_PACK_2SHORT(arg->sw_rawawb_exc_wp_region4_xu0, arg->sw_rawawb_exc_wp_region4_xu1), - ISP_RAWAWB_EXC_WP_REGION4_XU); + ISP2X_PACK_2SHORT(arg->sw_rawawb_exc_wp_region4_xu0, arg->sw_rawawb_exc_wp_region4_xu1), + ISP_RAWAWB_EXC_WP_REGION4_XU); rkisp_iowrite32(params_vdev, - ISP2X_PACK_2SHORT(arg->sw_rawawb_exc_wp_region4_yv0, arg->sw_rawawb_exc_wp_region4_yv1), - ISP_RAWAWB_EXC_WP_REGION4_YV); + ISP2X_PACK_2SHORT(arg->sw_rawawb_exc_wp_region4_yv0, arg->sw_rawawb_exc_wp_region4_yv1), + ISP_RAWAWB_EXC_WP_REGION4_YV); rkisp_iowrite32(params_vdev, - ISP2X_PACK_2SHORT(arg->sw_rawawb_exc_wp_region5_xu0, arg->sw_rawawb_exc_wp_region5_xu1), - ISP_RAWAWB_EXC_WP_REGION5_XU); + ISP2X_PACK_2SHORT(arg->sw_rawawb_exc_wp_region5_xu0, arg->sw_rawawb_exc_wp_region5_xu1), + ISP_RAWAWB_EXC_WP_REGION5_XU); rkisp_iowrite32(params_vdev, - ISP2X_PACK_2SHORT(arg->sw_rawawb_exc_wp_region5_yv0, arg->sw_rawawb_exc_wp_region5_yv1), - ISP_RAWAWB_EXC_WP_REGION5_YV); + ISP2X_PACK_2SHORT(arg->sw_rawawb_exc_wp_region5_yv0, arg->sw_rawawb_exc_wp_region5_yv1), + ISP_RAWAWB_EXC_WP_REGION5_YV); rkisp_iowrite32(params_vdev, - ISP2X_PACK_2SHORT(arg->sw_rawawb_exc_wp_region6_xu0, arg->sw_rawawb_exc_wp_region6_xu1), - ISP_RAWAWB_EXC_WP_REGION6_XU); + ISP2X_PACK_2SHORT(arg->sw_rawawb_exc_wp_region6_xu0, arg->sw_rawawb_exc_wp_region6_xu1), + ISP_RAWAWB_EXC_WP_REGION6_XU); rkisp_iowrite32(params_vdev, - ISP2X_PACK_2SHORT(arg->sw_rawawb_exc_wp_region6_yv0, arg->sw_rawawb_exc_wp_region6_yv1), - ISP_RAWAWB_EXC_WP_REGION6_YV); + ISP2X_PACK_2SHORT(arg->sw_rawawb_exc_wp_region6_yv0, arg->sw_rawawb_exc_wp_region6_yv1), + ISP_RAWAWB_EXC_WP_REGION6_YV); rkisp_iowrite32(params_vdev, - (arg->sw_rawawb_multiwindow_en & 0x1) << 31 | - (arg->sw_rawawb_exc_wp_region6_domain & 0x1) << 26 | - (arg->sw_rawawb_exc_wp_region6_measen & 0x1) << 25 | - (arg->sw_rawawb_exc_wp_region6_excen & 0x1) << 24 | - (arg->sw_rawawb_exc_wp_region5_domain & 0x1) << 22 | - (arg->sw_rawawb_exc_wp_region5_measen & 0x1) << 21 | - (arg->sw_rawawb_exc_wp_region5_excen & 0x1) << 20 | - (arg->sw_rawawb_exc_wp_region4_domain & 0x1) << 18 | - (arg->sw_rawawb_exc_wp_region4_measen & 0x1) << 17 | - (arg->sw_rawawb_exc_wp_region4_excen & 0x1) << 16 | - (arg->sw_rawawb_exc_wp_region3_domain & 0x1) << 14 | - (arg->sw_rawawb_exc_wp_region3_measen & 0x1) << 13 | - (arg->sw_rawawb_exc_wp_region3_excen & 0x1) << 12 | - (arg->sw_rawawb_exc_wp_region2_domain & 0x1) << 10 | - (arg->sw_rawawb_exc_wp_region2_measen & 0x1) << 9 | - (arg->sw_rawawb_exc_wp_region2_excen & 0x1) << 8 | - (arg->sw_rawawb_exc_wp_region1_domain & 0x1) << 6 | - (arg->sw_rawawb_exc_wp_region1_measen & 0x1) << 5 | - (arg->sw_rawawb_exc_wp_region1_excen & 0x1) << 4 | - (arg->sw_rawawb_exc_wp_region0_domain & 0x1) << 2 | - (arg->sw_rawawb_exc_wp_region0_measen & 0x1) << 1 | - (arg->sw_rawawb_exc_wp_region0_excen & 0x1) << 0, - ISP_RAWAWB_MULTIWINDOW_EXC_CTRL); + (arg->sw_rawawb_multiwindow_en & 0x1) << 31 | + (arg->sw_rawawb_exc_wp_region6_domain & 0x1) << 26 | + (arg->sw_rawawb_exc_wp_region6_measen & 0x1) << 25 | + (arg->sw_rawawb_exc_wp_region6_excen & 0x1) << 24 | + (arg->sw_rawawb_exc_wp_region5_domain & 0x1) << 22 | + (arg->sw_rawawb_exc_wp_region5_measen & 0x1) << 21 | + (arg->sw_rawawb_exc_wp_region5_excen & 0x1) << 20 | + (arg->sw_rawawb_exc_wp_region4_domain & 0x1) << 18 | + (arg->sw_rawawb_exc_wp_region4_measen & 0x1) << 17 | + (arg->sw_rawawb_exc_wp_region4_excen & 0x1) << 16 | + (arg->sw_rawawb_exc_wp_region3_domain & 0x1) << 14 | + (arg->sw_rawawb_exc_wp_region3_measen & 0x1) << 13 | + (arg->sw_rawawb_exc_wp_region3_excen & 0x1) << 12 | + (arg->sw_rawawb_exc_wp_region2_domain & 0x1) << 10 | + (arg->sw_rawawb_exc_wp_region2_measen & 0x1) << 9 | + (arg->sw_rawawb_exc_wp_region2_excen & 0x1) << 8 | + (arg->sw_rawawb_exc_wp_region1_domain & 0x1) << 6 | + (arg->sw_rawawb_exc_wp_region1_measen & 0x1) << 5 | + (arg->sw_rawawb_exc_wp_region1_excen & 0x1) << 4 | + (arg->sw_rawawb_exc_wp_region0_domain & 0x1) << 2 | + (arg->sw_rawawb_exc_wp_region0_measen & 0x1) << 1 | + (arg->sw_rawawb_exc_wp_region0_excen & 0x1) << 0, + ISP_RAWAWB_MULTIWINDOW_EXC_CTRL); rkisp_iowrite32(params_vdev, - (arg->sw_rawawb_store_wp_flag_ls_idx0 & 0x7) | - (arg->sw_rawawb_store_wp_flag_ls_idx1 & 0x7) << 3 | - (arg->sw_rawawb_store_wp_flag_ls_idx2 & 0x7) << 6 | - (arg->sw_rawawb_blk_measure_mode & 0x3) << 12, - ISP_RAWAWB_BLK_CTRL); + (arg->sw_rawawb_store_wp_flag_ls_idx0 & 0x7) | + (arg->sw_rawawb_store_wp_flag_ls_idx1 & 0x7) << 3 | + (arg->sw_rawawb_store_wp_flag_ls_idx2 & 0x7) << 6 | + (arg->sw_rawawb_blk_measure_mode & 0x3) << 12, + ISP_RAWAWB_BLK_CTRL); /* avoid to override the old enable value */ value = rkisp_ioread32(params_vdev, ISP_RAWAWB_CTRL); value &= ISP2X_RAWAWB_ENA; value &= ~ISP2X_REG_WR_MASK; rkisp_iowrite32(params_vdev, - value | - (arg->sw_rawawb_uv_en & 0x1) << 1 | - (arg->sw_rawawb_xy_en & 0x1) << 2 | - (arg->sw_rawawb_3dyuv_ls_idx0 & 0x7) << 4 | - (arg->sw_rawawb_3dyuv_ls_idx1 & 0x7) << 7 | - (arg->sw_rawawb_3dyuv_ls_idx2 & 0x7) << 10 | - (arg->sw_rawawb_3dyuv_ls_idx3 & 0x7) << 13 | - (arg->sw_rawawb_y_range & 0x1) << 16 | - (arg->sw_rawawb_c_range & 0x1) << 17 | - (arg->sw_rawawb_wind_size & 0x1) << 18 | - (arg->sw_rawawb_light_num & 0x7) << 20, - ISP_RAWAWB_CTRL); + value | + (arg->sw_rawawb_uv_en & 0x1) << 1 | + (arg->sw_rawawb_xy_en & 0x1) << 2 | + (arg->sw_rawawb_3dyuv_ls_idx0 & 0x7) << 4 | + (arg->sw_rawawb_3dyuv_ls_idx1 & 0x7) << 7 | + (arg->sw_rawawb_3dyuv_ls_idx2 & 0x7) << 10 | + (arg->sw_rawawb_3dyuv_ls_idx3 & 0x7) << 13 | + (arg->sw_rawawb_y_range & 0x1) << 16 | + (arg->sw_rawawb_c_range & 0x1) << 17 | + (arg->sw_rawawb_wind_size & 0x1) << 18 | + (arg->sw_rawawb_light_num & 0x7) << 20, + ISP_RAWAWB_CTRL); value = rkisp_ioread32(params_vdev, CTRL_VI_ISP_PATH); value &= ~(ISP2X_ISPPATH_RAWAWB_SEL_SET(3)); @@ -1666,27 +2709,27 @@ isp_rawhstlite_config(struct rkisp_isp_params_vdev *params_vdev, block_hsize &= 0xFFFE; block_vsize &= 0xFFFE; rkisp_iowrite32(params_vdev, - ISP2X_RAWHSTLITE_SIZE_SET(block_hsize, block_vsize), - ISP_RAWHIST_LITE_SIZE); + ISP2X_RAWHSTLITE_SIZE_SET(block_hsize, block_vsize), + ISP_RAWHIST_LITE_SIZE); rkisp_iowrite32(params_vdev, - ISP2X_PACK_4BYTE(arg->rcc, arg->gcc, arg->bcc, arg->off), - ISP_RAWHIST_LITE_RAW2Y_CC); + ISP2X_PACK_4BYTE(arg->rcc, arg->gcc, arg->bcc, arg->off), + ISP_RAWHIST_LITE_RAW2Y_CC); for (i = 0; i < (ISP2X_RAWHSTLITE_WEIGHT_REG_SIZE / 4); i++) { value = ISP2X_RAWHSTLITE_WEIGHT_SET( - arg->weight[4 * i + 0], - arg->weight[4 * i + 1], - arg->weight[4 * i + 2], - arg->weight[4 * i + 3]); + arg->weight[4 * i + 0], + arg->weight[4 * i + 1], + arg->weight[4 * i + 2], + arg->weight[4 * i + 3]); rkisp_iowrite32(params_vdev, value, - ISP_RAWHIST_LITE_WEIGHT + 4 * i); + ISP_RAWHIST_LITE_WEIGHT + 4 * i); } value = ISP2X_RAWHSTLITE_WEIGHT_SET( - arg->weight[4 * i + 0], 0, 0, 0); + arg->weight[4 * i + 0], 0, 0, 0); rkisp_iowrite32(params_vdev, value, - ISP_RAWHIST_LITE_WEIGHT + 4 * i); + ISP_RAWHIST_LITE_WEIGHT + 4 * i); } static void @@ -1751,21 +2794,21 @@ isp_rawhstbig_config(struct rkisp_isp_params_vdev *params_vdev, rkisp_iowrite32(params_vdev, hist_ctrl, addr + ISP_RAWHIST_BIG_CTRL); rkisp_iowrite32(params_vdev, - ISP2X_RAWHSTBIG_OFFS_SET(arg->win.h_offs & 0xFFFE, - arg->win.v_offs & 0xFFFE), - addr + ISP_RAWHIST_BIG_OFFS); + ISP2X_RAWHSTBIG_OFFS_SET(arg->win.h_offs & 0xFFFE, + arg->win.v_offs & 0xFFFE), + addr + ISP_RAWHIST_BIG_OFFS); block_hsize = arg->win.h_size / hist_wnd_num[wnd_num_idx] - 1; block_vsize = arg->win.v_size / hist_wnd_num[wnd_num_idx] - 1; block_hsize &= 0xFFFE; block_vsize &= 0xFFFE; rkisp_iowrite32(params_vdev, - ISP2X_RAWHSTBIG_SIZE_SET(block_hsize, block_vsize), - addr + ISP_RAWHIST_BIG_SIZE); + ISP2X_RAWHSTBIG_SIZE_SET(block_hsize, block_vsize), + addr + ISP_RAWHIST_BIG_SIZE); rkisp_iowrite32(params_vdev, - ISP2X_PACK_4BYTE(arg->rcc, arg->gcc, arg->bcc, arg->off), - addr + ISP_RAWHIST_BIG_RAW2Y_CC); + 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++) { @@ -1778,13 +2821,13 @@ isp_rawhstbig_config(struct rkisp_isp_params_vdev *params_vdev, 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]); + 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); + addr + ISP_RAWHIST_BIG_WEIGHT_BASE); } } @@ -1864,6 +2907,31 @@ static void isp_hdrmge_config(struct rkisp_isp_params_vdev *params_vdev, const struct isp2x_hdrmge_cfg *arg) { + u32 value; + int i; + + value = ISP2X_PACK_2SHORT(arg->gain0, arg->gain0_inv); + rkisp_iowrite32(params_vdev, value, ISP_HDRMGE_GAIN0); + + value = ISP2X_PACK_2SHORT(arg->gain1, arg->gain1_inv); + rkisp_iowrite32(params_vdev, value, ISP_HDRMGE_GAIN1); + + value = arg->gain2; + rkisp_iowrite32(params_vdev, value, ISP_HDRMGE_GAIN2); + + value = ISP2X_PACK_4BYTE(arg->ms_dif_0p8, arg->ms_diff_0p15, + arg->lm_dif_0p9, arg->lm_dif_0p15); + rkisp_iowrite32(params_vdev, value, ISP_HDRMGE_CONS_DIFF); + + for (i = 0; i < ISP2X_HDRMGE_L_CURVE_NUM; i++) { + value = ISP2X_PACK_2SHORT(arg->curve.curve_0[i], arg->curve.curve_1[i]); + rkisp_iowrite32(params_vdev, value, ISP_HDRMGE_DIFF_Y0 + 4 * i); + } + + for (i = 0; i < ISP2X_HDRMGE_E_CURVE_NUM; i++) { + value = arg->e_y[i]; + rkisp_iowrite32(params_vdev, value, ISP_HDRMGE_OVER_Y0 + 4 * i); + } } static void @@ -1876,47 +2944,391 @@ static void isp_rawnr_config(struct rkisp_isp_params_vdev *params_vdev, const struct isp2x_rawnr_cfg *arg) { + u32 value; + int i; + + value = rkisp_ioread32(params_vdev, ISP_RAWNR_CTRL); + value &= ISP_RAWNR_EN; + + value |= (arg->gauss_en & 0x01) << 20 | + (arg->log_bypass & 0x01) << 12; + rkisp_iowrite32(params_vdev, value, ISP_RAWNR_CTRL); + rkisp_iowrite32(params_vdev, arg->filtpar0, ISP_RAWNR_FILTPAR0); + rkisp_iowrite32(params_vdev, arg->filtpar1, ISP_RAWNR_FILTPAR1); + rkisp_iowrite32(params_vdev, arg->filtpar2, ISP_RAWNR_FILTPAR2); + rkisp_iowrite32(params_vdev, arg->dgain0, ISP_RAWNR_DGAIN0); + rkisp_iowrite32(params_vdev, arg->dgain1, ISP_RAWNR_DGAIN1); + rkisp_iowrite32(params_vdev, arg->dgain2, ISP_RAWNR_DGAIN2); + + for (i = 0; i < ISP2X_RAWNR_LUMA_RATION_NUM / 2; i++) { + value = ISP2X_PACK_2SHORT(arg->luration[2 * i], arg->luration[2 * i + 1]); + rkisp_iowrite32(params_vdev, value, ISP_RAWNR_LURTION0_1 + 4 * i); + } + + for (i = 0; i < ISP2X_RAWNR_LUMA_RATION_NUM / 2; i++) { + value = ISP2X_PACK_2SHORT(arg->lulevel[2 * i], arg->lulevel[2 * i + 1]); + rkisp_iowrite32(params_vdev, value, ISP_RAWNR_LULEVEL0_1 + 4 * i); + } + + rkisp_iowrite32(params_vdev, arg->gauss, ISP_RAWNR_GAUSS); + rkisp_iowrite32(params_vdev, arg->sigma, ISP_RAWNR_SIGMA); + rkisp_iowrite32(params_vdev, arg->pix_diff, ISP_RAWNR_PIX_DIFF); + rkisp_iowrite32(params_vdev, arg->thld_diff, ISP_RAWNR_HILD_DIFF); + + value = (arg->gas_weig_scl2 & 0x01) << 24 | + (arg->gas_weig_scl1 & 0xFF) << 16 | + (arg->thld_chanelw & 0x07FF); + rkisp_iowrite32(params_vdev, value, ISP_RAWNR_THLD_CHANELW); + + rkisp_iowrite32(params_vdev, arg->lamda, ISP_RAWNR_LAMDA); + + value = ISP2X_PACK_2SHORT(arg->fixw0, arg->fixw1); + rkisp_iowrite32(params_vdev, value, ISP_RAWNR_FIXW0_1); + + value = ISP2X_PACK_2SHORT(arg->fixw2, arg->fixw3); + rkisp_iowrite32(params_vdev, value, ISP_RAWNR_FIXW2_3); + + rkisp_iowrite32(params_vdev, arg->wlamda0, ISP_RAWNR_WLAMDA0); + rkisp_iowrite32(params_vdev, arg->wlamda1, ISP_RAWNR_WLAMDA1); + rkisp_iowrite32(params_vdev, arg->wlamda2, ISP_RAWNR_WLAMDA2); + + value = ISP2X_PACK_2SHORT(arg->bgain_filp, arg->rgain_filp); + rkisp_iowrite32(params_vdev, value, ISP_RAWNR_RGBAIN_FLIP); } static void isp_rawnr_enable(struct rkisp_isp_params_vdev *params_vdev, bool en) { + u32 value; + + value = rkisp_ioread32(params_vdev, ISP_RAWNR_CTRL); + value &= ~ISP_RAWNR_EN; + + if (en) + value |= ISP_RAWNR_EN; + rkisp_iowrite32(params_vdev, value, ISP_RAWNR_CTRL); } static void isp_hdrtmo_config(struct rkisp_isp_params_vdev *params_vdev, const struct isp2x_hdrtmo_cfg *arg) { + u32 value; + + value = rkisp_ioread32(params_vdev, ISP_HDRTMO_CTRL); + value &= ISP_HDRTMO_EN; + + value |= (arg->cnt_vsize & 0x1FFF) << 16 | + (arg->gain_ld_off2 & 0x0F) << 12 | + (arg->gain_ld_off1 & 0x0F) << 8 | + (arg->big_en & 0x01) << 5 | + (arg->nobig_en & 0x01) << 4 | + (arg->newhst_en & 0x01) << 2 | + (arg->cnt_mode & 0x01) << 1; + rkisp_iowrite32(params_vdev, value, ISP_HDRTMO_CTRL); + + value = (arg->expl_lgratio & 0xFFFF) << 16 | + (arg->lgscl_ratio & 0xFF) << 8 | + (arg->cfg_alpha & 0xFF); + rkisp_iowrite32(params_vdev, value, ISP_HDRTMO_CTRL_CFG); + + value = ISP2X_PACK_2SHORT(arg->set_palpha, arg->set_gainoff); + rkisp_iowrite32(params_vdev, value, ISP_HDRTMO_LG_CFG0); + + value = ISP2X_PACK_2SHORT(arg->set_lgmin, arg->set_lgmax); + rkisp_iowrite32(params_vdev, value, ISP_HDRTMO_LG_CFG1); + + value = ISP2X_PACK_2SHORT(arg->set_lgmean, arg->set_weightkey); + rkisp_iowrite32(params_vdev, value, ISP_HDRTMO_LG_CFG2); + + value = ISP2X_PACK_2SHORT(arg->set_lgrange0, arg->set_lgrange1); + rkisp_iowrite32(params_vdev, value, ISP_HDRTMO_LG_CFG3); + + value = arg->set_lgavgmax; + rkisp_iowrite32(params_vdev, value, ISP_HDRTMO_LG_CFG4); + + value = (arg->clipgap1_i & 0x0F) << 28 | + (arg->clipgap0_i & 0x0F) << 24 | + (arg->clipratio1 & 0xFF) << 16 | + (arg->clipratio0 & 0xFF) << 8 | + (arg->ratiol & 0xFF); + rkisp_iowrite32(params_vdev, value, ISP_HDRTMO_CLIPRATIO); + + value = ISP2X_PACK_2SHORT(arg->lgscl, arg->lgscl_inv); + rkisp_iowrite32(params_vdev, value, ISP_HDRTMO_LG_SCL); + + value = arg->lgmax; + rkisp_iowrite32(params_vdev, value, ISP_HDRTMO_LG_MAX); + + value = ISP2X_PACK_2SHORT(arg->hist_min, arg->hist_low); + rkisp_iowrite32(params_vdev, value, ISP_HDRTMO_HIST_LOW); + + value = (arg->hist_shift & 0x07) << 28 | + (arg->hist_0p3 & 0x07FF) << 16 | + (arg->hist_high & 0x3FFF); + rkisp_iowrite32(params_vdev, value, ISP_HDRTMO_HIST_HIGH); + + value = (arg->palpha_lwscl & 0x3F) << 26 | + (arg->palpha_lw0p5 & 0x03FF) << 16 | + (arg->palpha_0p18 & 0x03FF); + rkisp_iowrite32(params_vdev, value, ISP_HDRTMO_PALPHA); + + value = ISP2X_PACK_2SHORT(arg->maxpalpha, arg->maxgain); + rkisp_iowrite32(params_vdev, value, ISP_HDRTMO_MAXGAIN); } static void isp_hdrtmo_enable(struct rkisp_isp_params_vdev *params_vdev, bool en) { + params_vdev->hdrtmo_en = en; } static void isp_gic_config(struct rkisp_isp_params_vdev *params_vdev, const struct isp2x_gic_cfg *arg) { + u32 value; + s32 i; + + value = rkisp_ioread32(params_vdev, ISP_GIC_CONTROL); + value &= ISP_GIC_ENA; + + if (arg->edge_open) + value |= ISP_GIC_EDGE_OPEN; + rkisp_iowrite32(params_vdev, value, ISP_GIC_CONTROL); + + value = (arg->regmingradthrdark2 & 0x03FF) << 20 | + (arg->regmingradthrdark1 & 0x03FF) << 10 | + (arg->regminbusythre & 0x03FF); + rkisp_iowrite32(params_vdev, value, ISP_GIC_DIFF_PARA1); + + value = (arg->regdarkthre & 0x07FF) << 21 | + (arg->regmaxcorvboth & 0x03FF) << 11 | + (arg->regdarktthrehi & 0x07FF); + rkisp_iowrite32(params_vdev, value, ISP_GIC_DIFF_PARA2); + + value = (arg->regkgrad2dark & 0x0F) << 28 | + (arg->regkgrad1dark & 0x0F) << 24 | + (arg->regstrengthglobal_fix & 0xFF) << 16 | + (arg->regdarkthrestep & 0x0F) << 12 | + (arg->regkgrad2 & 0x0F) << 8 | + (arg->regkgrad1 & 0x0F) << 4 | + (arg->reggbthre & 0x0F); + rkisp_iowrite32(params_vdev, value, ISP_GIC_DIFF_PARA3); + + value = (arg->regmaxcorv & 0x03FF) << 20 | + (arg->regmingradthr2 & 0x03FF) << 10 | + (arg->regmingradthr1 & 0x03FF); + rkisp_iowrite32(params_vdev, value, ISP_GIC_DIFF_PARA4); + + value = (arg->gr_ratio & 0x03) << 28 | + (arg->dnloscale & 0x07FF) << 15 | + (arg->dnhiscale & 0x07FF) << 4 | + (arg->reglumapointsstep & 0x0F); + rkisp_iowrite32(params_vdev, value, ISP_GIC_NOISE_PARA1); + + value = (arg->gvaluelimitlo & 0x0FFF) << 20 | + (arg->gvaluelimithi & 0x0FFF) << 8 | + (arg->fusionratiohilimt1 & 0xFF); + rkisp_iowrite32(params_vdev, value, ISP_GIC_NOISE_PARA2); + + value = arg->regstrength_fix & 0xFF; + rkisp_iowrite32(params_vdev, value, ISP_GIC_NOISE_PARA3); + + for (i = 0; i < ISP2X_GIC_SIGMA_Y_NUM / 2; i++) { + value = ISP2X_PACK_2SHORT(arg->sigma_y[2 * i], arg->sigma_y[2 * i + 1]); + rkisp_iowrite32(params_vdev, value, ISP_GIC_SIGMA_VALUE0 + 4 * i); + } + value = ISP2X_PACK_2SHORT(arg->sigma_y[2 * i], 0); + rkisp_iowrite32(params_vdev, value, ISP_GIC_SIGMA_VALUE0 + 4 * i); + + value = (arg->noise_coe_a & 0x07FF) << 4 | + (arg->noise_cut_en & 0x01); + rkisp_iowrite32(params_vdev, value, ISP_GIC_NOISE_CTRL0); + + value = ISP2X_PACK_2SHORT(arg->noise_coe_b, arg->diff_clip); + rkisp_iowrite32(params_vdev, value, ISP_GIC_NOISE_CTRL1); } static void isp_gic_enable(struct rkisp_isp_params_vdev *params_vdev, bool en) { + u32 value; + + value = rkisp_ioread32(params_vdev, ISP_GIC_CONTROL); + value &= ISP_GIC_EDGE_OPEN; + + if (en) + value |= ISP_GIC_ENA; + rkisp_iowrite32(params_vdev, value, ISP_GIC_CONTROL); } static void isp_dhaz_config(struct rkisp_isp_params_vdev *params_vdev, const struct isp2x_dhaz_cfg *arg) { + u32 value; + + value = rkisp_ioread32(params_vdev, ISP_DHAZ_CTRL); + value &= ISP_DHAZ_ENMUX; + + if (arg->nobig_en) + value |= ISP_DHAZ_NOBIGEN; + if (arg->big_en) + value |= ISP_DHAZ_BIGEN; + if (arg->dc_en) + value |= ISP_DHAZ_DCEN; + if (arg->hist_en) + value |= ISP_DHAZ_HSTEN; + if (arg->hpara_en) + value |= ISP_DHAZ_HPARAEN; + if (arg->hist_chn) + value |= ISP_DHAZ_HSTCHN; + if (arg->enhance_en) + value |= ISP_DHAZ_ENHANCE; + rkisp_iowrite32(params_vdev, value, ISP_DHAZ_CTRL); + + value = ISP2X_PACK_4BYTE(arg->dc_min_th, arg->dc_max_th, + arg->yhist_th, arg->yblk_th); + rkisp_iowrite32(params_vdev, value, ISP_DHAZ_ADP0); + + value = ISP2X_PACK_4BYTE(arg->bright_min, arg->bright_max, + arg->wt_max, 0); + rkisp_iowrite32(params_vdev, value, ISP_DHAZ_ADP1); + + value = ISP2X_PACK_4BYTE(arg->air_min, arg->air_max, + arg->dark_th, arg->tmax_base); + rkisp_iowrite32(params_vdev, value, ISP_DHAZ_ADP2); + + value = ISP2X_PACK_2SHORT(arg->tmax_off, arg->tmax_max); + rkisp_iowrite32(params_vdev, value, ISP_DHAZ_ADP_TMAX); + + value = ISP2X_PACK_2SHORT(arg->hist_gratio, arg->hist_th_off); + rkisp_iowrite32(params_vdev, value, ISP_DHAZ_ADP_HIST0); + + value = ISP2X_PACK_2SHORT(arg->hist_k, arg->hist_min); + rkisp_iowrite32(params_vdev, value, ISP_DHAZ_ADP_HIST1); + + value = ISP2X_PACK_2SHORT(arg->hist_scale, arg->enhance_value); + rkisp_iowrite32(params_vdev, value, ISP_DHAZ_HIST_ENH); + + value = (arg->iir_wt_sigma & 0x07FF) << 16 | + (arg->iir_sigma & 0xFF) << 8 | + (arg->stab_fnum & 0x1F); + rkisp_iowrite32(params_vdev, value, ISP_DHAZ_IIR0); + + value = ISP2X_PACK_2SHORT(arg->iir_air_sigma, arg->iir_tmax_sigma); + rkisp_iowrite32(params_vdev, value, ISP_DHAZ_IIR1); + + value = (arg->cfg_wt & 0x01FF) << 16 | + (arg->cfg_air & 0xFF) << 8 | + (arg->cfg_alpha & 0xFF); + rkisp_iowrite32(params_vdev, value, ISP_DHAZ_ALPHA0); + + value = ISP2X_PACK_2SHORT(arg->cfg_tmax, arg->cfg_gratio); + rkisp_iowrite32(params_vdev, value, ISP_DHAZ_ALPHA1); + + value = ISP2X_PACK_2SHORT(arg->dc_thed, arg->dc_weitcur); + rkisp_iowrite32(params_vdev, value, ISP_DHAZ_BI_DC); + + value = ISP2X_PACK_4BYTE(arg->sw_dhaz_dc_bf_h0, arg->sw_dhaz_dc_bf_h1, + arg->sw_dhaz_dc_bf_h2, arg->sw_dhaz_dc_bf_h3); + rkisp_iowrite32(params_vdev, value, ISP_DHAZ_DC_BF0); + + value = ISP2X_PACK_4BYTE(arg->sw_dhaz_dc_bf_h4, arg->sw_dhaz_dc_bf_h5, 0, 0); + rkisp_iowrite32(params_vdev, value, ISP_DHAZ_DC_BF1); + + value = ISP2X_PACK_2SHORT(arg->air_thed, arg->air_weitcur); + rkisp_iowrite32(params_vdev, value, ISP_DHAZ_BI_AIR); + + value = ISP2X_PACK_4BYTE(arg->air_bf_h0, arg->air_bf_h1, arg->air_bf_h2, 0); + rkisp_iowrite32(params_vdev, value, ISP_DHAZ_AIR_BF); + + value = ISP2X_PACK_4BYTE(arg->gaus_h0, arg->gaus_h1, arg->gaus_h2, 0); + rkisp_iowrite32(params_vdev, value, ISP_DHAZ_GAUS); + + value = (arg->conv_t0[5] & 0x0F) << 20 | + (arg->conv_t0[4] & 0x0F) << 16 | + (arg->conv_t0[3] & 0x0F) << 12 | + (arg->conv_t0[2] & 0x0F) << 8 | + (arg->conv_t0[1] & 0x0F) << 4 | + (arg->conv_t0[0] & 0x0F); + rkisp_iowrite32(params_vdev, value, ISP_DHAZ_HIST_CONV0); + + value = (arg->conv_t1[5] & 0x0F) << 20 | + (arg->conv_t1[4] & 0x0F) << 16 | + (arg->conv_t1[3] & 0x0F) << 12 | + (arg->conv_t1[2] & 0x0F) << 8 | + (arg->conv_t1[1] & 0x0F) << 4 | + (arg->conv_t1[0] & 0x0F); + rkisp_iowrite32(params_vdev, value, ISP_DHAZ_HIST_CONV1); + + value = (arg->conv_t2[5] & 0x0F) << 20 | + (arg->conv_t2[4] & 0x0F) << 16 | + (arg->conv_t2[3] & 0x0F) << 12 | + (arg->conv_t2[2] & 0x0F) << 8 | + (arg->conv_t2[1] & 0x0F) << 4 | + (arg->conv_t2[0] & 0x0F); + rkisp_iowrite32(params_vdev, value, ISP_DHAZ_HIST_CONV2); } static void isp_dhaz_enable(struct rkisp_isp_params_vdev *params_vdev, bool en) +{ + u32 value; + + value = rkisp_ioread32(params_vdev, ISP_DHAZ_CTRL); + value &= ~ISP_DHAZ_ENMUX; + + if (en) + value |= ISP_DHAZ_ENMUX; + + rkisp_iowrite32(params_vdev, value, ISP_DHAZ_CTRL); +} + +static void +isp_gain_config(struct rkisp_isp_params_vdev *params_vdev, + const struct isp2x_gain_cfg *arg) +{ + u32 value, i; + + value = (arg->dhaz_en & 0x01) << 16 | + (arg->wdr_en & 0x01) << 12 | + (arg->tmo_en & 0x01) << 8 | + (arg->lsc_en & 0x01) << 4 | + (arg->mge_en & 0x01); + rkisp_iowrite32(params_vdev, value, ISP_GAIN_CTRL); + + value = arg->mge_gain[0]; + rkisp_iowrite32(params_vdev, value, ISP_GAIN_G0); + + value = ISP2X_PACK_2SHORT(arg->mge_gain[1], arg->mge_gain[2]); + rkisp_iowrite32(params_vdev, value, ISP_GAIN_G1_G2); + + for (i = 0; i < ISP2X_GAIN_IDX_NUM / 4; i++) { + value = ISP2X_PACK_4BYTE(arg->idx[4 * i], arg->idx[4 * i + 1], + arg->idx[4 * i + 2], arg->idx[4 * i + 3]); + rkisp_iowrite32(params_vdev, value, ISP_GAIN_IDX0 + 4 * i); + } + value = ISP2X_PACK_4BYTE(arg->idx[4 * i], arg->idx[4 * i + 1], + arg->idx[4 * i + 2], 0); + rkisp_iowrite32(params_vdev, value, ISP_GAIN_IDX0 + 4 * i); + + for (i = 0; i < ISP2X_GAIN_LUT_NUM / 2; i++) { + value = ISP2X_PACK_2SHORT(arg->lut[2 * i], arg->lut[2 * i + 1]); + rkisp_iowrite32(params_vdev, value, ISP_GAIN_LUT0 + 4 * i); + } + value = ISP2X_PACK_2SHORT(arg->lut[2 * i], 0); + rkisp_iowrite32(params_vdev, value, ISP_GAIN_LUT0 + 4 * i); +} + +static void +isp_gain_enable(struct rkisp_isp_params_vdev *params_vdev, + bool en) { } @@ -1924,12 +3336,103 @@ static void isp_3dlut_config(struct rkisp_isp_params_vdev *params_vdev, const struct isp2x_3dlut_cfg *arg) { + struct rkisp_isp_params_val_v2x *priv_val; + u32 value, buf_idx, i; + u32 *data; + + value = rkisp_ioread32(params_vdev, ISP_3DLUT_CTRL); + value &= ~ISP_3DLUT_EN; + + if (arg->bypass_en) + value |= ISP_3DLUT_BYPASS; + + rkisp_iowrite32(params_vdev, value, ISP_3DLUT_CTRL); + + priv_val = (struct rkisp_isp_params_val_v2x *)params_vdev->priv_val; + buf_idx = (priv_val->buf_3dlut_idx++) % RKISP_PARAM_3DLUT_BUF_NUM; + + data = (u32 *)priv_val->buf_3dlut[buf_idx].vaddr; + for (i = 0; i < arg->actual_size; i++) + data[i] = (arg->lut_r[i] & 0x3FF) | (arg->lut_g[i] & 0xFFF) << 10 | + (arg->lut_b[i] & 0x3FF) << 22; + + value = priv_val->buf_3dlut[buf_idx].dma_addr; + rkisp_iowrite32(params_vdev, value, MI_LUT_3D_RD_BASE); + rkisp_iowrite32(params_vdev, arg->actual_size, MI_LUT_3D_RD_WSIZE); + isp_param_set_bits(params_vdev, ISP_3DLUT_UPDATE, 0x01); } static void isp_3dlut_enable(struct rkisp_isp_params_vdev *params_vdev, bool en) { + if (en) + isp_param_set_bits(params_vdev, ISP_3DLUT_CTRL, 0x01); + else + isp_param_clear_bits(params_vdev, ISP_3DLUT_CTRL, 0x01); +} + +static void +isp_ldch_config(struct rkisp_isp_params_vdev *params_vdev, + const struct isp2x_ldch_cfg *arg) +{ + struct rkisp_isp_params_val_v2x *priv_val; + u32 value, buf_idx; + + priv_val = (struct rkisp_isp_params_val_v2x *)params_vdev->priv_val; + buf_idx = (priv_val->buf_ldch_idx++) % RKISP_PARAM_LDCH_BUF_NUM; + memcpy(priv_val->buf_ldch[buf_idx].vaddr, &arg->data[0], + arg->hsize * arg->vsize * 4); + + value = priv_val->buf_ldch[buf_idx].dma_addr; + rkisp_iowrite32(params_vdev, value, MI_LUT_LDCH_RD_BASE); + rkisp_iowrite32(params_vdev, arg->hsize, MI_LUT_LDCH_RD_H_WSIZE); + rkisp_iowrite32(params_vdev, arg->vsize, MI_LUT_LDCH_RD_V_SIZE); +} + +static void +isp_ldch_enable(struct rkisp_isp_params_vdev *params_vdev, + bool en) +{ + if (en) + isp_param_set_bits(params_vdev, ISP_LDCH_STS, 0x01); + else + isp_param_clear_bits(params_vdev, ISP_LDCH_STS, 0x01); +} + +static void +isp_csm_config(struct rkisp_isp_params_vdev *params_vdev, + bool full_range) +{ + const u16 full_range_coeff[] = { + 0x0026, 0x004b, 0x000f, + 0x01ea, 0x01d6, 0x0040, + 0x0040, 0x01ca, 0x01f6 + }; + const u16 limited_range_coeff[] = { + 0x0021, 0x0040, 0x000d, + 0x01ed, 0x01db, 0x0038, + 0x0038, 0x01d1, 0x01f7, + }; + unsigned int i; + + if (full_range) { + for (i = 0; i < ARRAY_SIZE(full_range_coeff); i++) + rkisp_iowrite32(params_vdev, full_range_coeff[i], + ISP_CC_COEFF_0 + i * 4); + + isp_param_set_bits(params_vdev, ISP_CTRL, + CIF_ISP_CTRL_ISP_CSM_Y_FULL_ENA | + CIF_ISP_CTRL_ISP_CSM_C_FULL_ENA); + } else { + for (i = 0; i < ARRAY_SIZE(limited_range_coeff); i++) + rkisp_iowrite32(params_vdev, limited_range_coeff[i], + CIF_ISP_CC_COEFF_0 + i * 4); + + isp_param_clear_bits(params_vdev, ISP_CTRL, + CIF_ISP_CTRL_ISP_CSM_Y_FULL_ENA | + CIF_ISP_CTRL_ISP_CSM_C_FULL_ENA); + } } struct rkisp_isp_params_v2x_ops rkisp_v2x_isp_params_ops = { @@ -1945,10 +3448,10 @@ struct rkisp_isp_params_v2x_ops rkisp_v2x_isp_params_ops = { .lsc_enable = isp_lsc_enable, .awbgain_config = isp_awbgain_config, .awbgain_enable = isp_awbgain_enable, - .bdm_config = isp_bdm_config, - .bdm_enable = isp_bdm_enable, - .ctk_config = isp_ctk_config, - .ctk_enable = isp_ctk_enable, + .debayer_config = isp_debayer_config, + .debayer_enable = isp_debayer_enable, + .ccm_config = isp_ccm_config, + .ccm_enable = isp_ccm_enable, .goc_config = isp_goc_config, .goc_enable = isp_goc_enable, .cproc_config = isp_cproc_config, @@ -1995,8 +3498,13 @@ struct rkisp_isp_params_v2x_ops rkisp_v2x_isp_params_ops = { .gic_enable = isp_gic_enable, .dhaz_config = isp_dhaz_config, .dhaz_enable = isp_dhaz_enable, + .gain_config = isp_gain_config, + .gain_enable = isp_gain_enable, .isp3dlut_config = isp_3dlut_config, .isp3dlut_enable = isp_3dlut_enable, + .ldch_config = isp_ldch_config, + .ldch_enable = isp_ldch_enable, + .csm_config = isp_csm_config, }; static __maybe_unused @@ -2066,26 +3574,26 @@ void __isp_isr_other_config(struct rkisp_isp_params_vdev *params_vdev, !!(module_ens & ISP2X_MODULE_AWB_GAIN)); } - if ((module_en_update & ISP2X_MODULE_BDM) || - (module_cfg_update & ISP2X_MODULE_BDM)) { - if ((module_cfg_update & ISP2X_MODULE_BDM)) - ops->bdm_config(params_vdev, - &new_params->others.bdm_cfg); + if ((module_en_update & ISP2X_MODULE_DEBAYER) || + (module_cfg_update & ISP2X_MODULE_DEBAYER)) { + if ((module_cfg_update & ISP2X_MODULE_DEBAYER)) + ops->debayer_config(params_vdev, + &new_params->others.debayer_cfg); - if (module_en_update & ISP2X_MODULE_BDM) - ops->bdm_enable(params_vdev, - !!(module_ens & ISP2X_MODULE_BDM)); + if (module_en_update & ISP2X_MODULE_DEBAYER) + ops->debayer_enable(params_vdev, + !!(module_ens & ISP2X_MODULE_DEBAYER)); } - if ((module_en_update & ISP2X_MODULE_CTK) || - (module_cfg_update & ISP2X_MODULE_CTK)) { - if ((module_cfg_update & ISP2X_MODULE_CTK)) - ops->ctk_config(params_vdev, - &new_params->others.ctk_cfg); + if ((module_en_update & ISP2X_MODULE_CCM) || + (module_cfg_update & ISP2X_MODULE_CCM)) { + if ((module_cfg_update & ISP2X_MODULE_CCM)) + ops->ccm_config(params_vdev, + &new_params->others.ccm_cfg); - if (module_en_update & ISP2X_MODULE_CTK) - ops->ctk_enable(params_vdev, - !!(module_ens & ISP2X_MODULE_CTK)); + if (module_en_update & ISP2X_MODULE_CCM) + ops->ccm_enable(params_vdev, + !!(module_ens & ISP2X_MODULE_CCM)); } if ((module_en_update & ISP2X_MODULE_GOC) || @@ -2208,6 +3716,28 @@ void __isp_isr_other_config(struct rkisp_isp_params_vdev *params_vdev, ops->isp3dlut_enable(params_vdev, !!(module_ens & ISP2X_MODULE_3DLUT)); } + + if ((module_en_update & ISP2X_MODULE_LDCH) || + (module_cfg_update & ISP2X_MODULE_LDCH)) { + if ((module_cfg_update & ISP2X_MODULE_LDCH)) + ops->ldch_config(params_vdev, + &new_params->others.ldch_cfg); + + if (module_en_update & ISP2X_MODULE_LDCH) + ops->ldch_enable(params_vdev, + !!(module_ens & ISP2X_MODULE_LDCH)); + } + + if ((module_en_update & ISP2X_MODULE_GAIN) || + (module_cfg_update & ISP2X_MODULE_GAIN)) { + if ((module_cfg_update & ISP2X_MODULE_GAIN)) + ops->gain_config(params_vdev, + &new_params->others.gain_cfg); + + if (module_en_update & ISP2X_MODULE_GAIN) + ops->gain_enable(params_vdev, + !!(module_ens & ISP2X_MODULE_GAIN)); + } } static __maybe_unused @@ -2388,6 +3918,8 @@ static void rkisp_params_configure_isp_v2x(struct rkisp_isp_params_vdev *params_vdev) { struct device *dev = params_vdev->dev->dev; + struct rkisp_isp_params_v2x_ops *ops = + (struct rkisp_isp_params_v2x_ops *)params_vdev->priv_ops; spin_lock(¶ms_vdev->config_lock); /* override the default things */ @@ -2395,13 +3927,19 @@ rkisp_params_configure_isp_v2x(struct rkisp_isp_params_vdev *params_vdev) !params_vdev->isp2x_params.module_en_update) dev_warn(dev, "can not get first iq setting in stream on\n"); + /* set the range */ + if (params_vdev->quantization == V4L2_QUANTIZATION_FULL_RANGE) + ops->csm_config(params_vdev, true); + else + ops->csm_config(params_vdev, false); + __isp_isr_other_config(params_vdev, ¶ms_vdev->isp2x_params); __isp_isr_meas_config(params_vdev, ¶ms_vdev->isp2x_params); __preisp_isr_update_hdrae_para(params_vdev, ¶ms_vdev->isp2x_params); spin_unlock(¶ms_vdev->config_lock); } -static void rkisp1_save_first_param_v2x(struct rkisp_isp_params_vdev *params_vdev, void *param) +static void rkisp_save_first_param_v2x(struct rkisp_isp_params_vdev *params_vdev, void *param) { struct isp2x_isp_params_cfg *new_params; @@ -2409,12 +3947,59 @@ static void rkisp1_save_first_param_v2x(struct rkisp_isp_params_vdev *params_vde params_vdev->isp2x_params = *new_params; } -static void rkisp1_clear_first_param_v2x(struct rkisp_isp_params_vdev *params_vdev) +static void rkisp_clear_first_param_v2x(struct rkisp_isp_params_vdev *params_vdev) { params_vdev->isp2x_params.module_cfg_update = 0; params_vdev->isp2x_params.module_en_update = 0; } +static int rkisp_get_isp_fmt(struct rkisp_isp_params_vdev *params_vdev, + struct v4l2_subdev_format *fmt) +{ + struct rkisp_device *dev = params_vdev->dev; + int ret; + + /* get isp in format */ + fmt->pad = RKISP_ISP_PAD_SINK; + fmt->which = V4L2_SUBDEV_FORMAT_ACTIVE; + ret = v4l2_subdev_call(&dev->isp_sdev.sd, pad, get_fmt, NULL, fmt); + return ret; +} + +static void +rkisp_get_param_size_v2x(struct rkisp_isp_params_vdev *params_vdev, + unsigned int sizes[]) +{ + struct rkisp_device *dev = params_vdev->dev; + struct rkisp_isp_params_val_v2x *priv_val; + struct v4l2_subdev_format fmt; + u32 width, height; + int i, ret; + + ret = rkisp_get_isp_fmt(params_vdev, &fmt); + if (ret) { + dev_err(dev->dev, "get format fail\n"); + return; + } + width = (fmt.format.width + 15) / 16 + 1; + height = (fmt.format.height + 7) / 8 + 1; + + sizes[0] = sizeof(struct isp2x_isp_params_cfg) + 2 * width * height; + + priv_val = (struct rkisp_isp_params_val_v2x *)params_vdev->priv_val; + if (priv_val->buf_ldch[0].size != 2 * width * height) { + for (i = 0; i < RKISP_PARAM_LDCH_BUF_NUM; i++) + rkisp_free_buffer(dev->dev, &priv_val->buf_ldch[i]); + + for (i = 0; i < RKISP_PARAM_LDCH_BUF_NUM; i++) { + priv_val->buf_ldch[i].size = 2 * width * height; + ret = rkisp_alloc_buffer(dev->dev, &priv_val->buf_ldch[i]); + if (ret) + dev_err(dev->dev, "can not alloc buffer\n"); + } + } +} + /* Not called when the camera active, thus not isr protection. */ static void rkisp_params_disable_isp_v2x(struct rkisp_isp_params_vdev *params_vdev) @@ -2428,8 +4013,8 @@ rkisp_params_disable_isp_v2x(struct rkisp_isp_params_vdev *params_vdev) ops->sihst_enable(params_vdev, false); ops->lsc_enable(params_vdev, false); ops->awbgain_enable(params_vdev, false); - ops->bdm_enable(params_vdev, false); - ops->ctk_enable(params_vdev, false); + ops->debayer_enable(params_vdev, false); + ops->ccm_enable(params_vdev, false); ops->goc_enable(params_vdev, false); ops->cproc_enable(params_vdev, false); ops->siaf_enable(params_vdev, false); @@ -2499,8 +4084,9 @@ unlock: } static struct rkisp_isp_params_ops rkisp_isp_params_ops_tbl = { - .save_first_param = rkisp1_save_first_param_v2x, - .clear_first_param = rkisp1_clear_first_param_v2x, + .save_first_param = rkisp_save_first_param_v2x, + .clear_first_param = rkisp_clear_first_param_v2x, + .get_param_size = rkisp_get_param_size_v2x, .config_isp = rkisp_params_configure_isp_v2x, .disable_isp = rkisp_params_disable_isp_v2x, .isr_hdl = rkisp_params_isr_v2x, @@ -2508,7 +4094,66 @@ static struct rkisp_isp_params_ops rkisp_isp_params_ops_tbl = { void rkisp_init_params_vdev_v2x(struct rkisp_isp_params_vdev *params_vdev) { + struct rkisp_isp_params_val_v2x *priv_val; + struct device *dev = params_vdev->dev->dev; + int i, ret; + + priv_val = kzalloc(sizeof(*priv_val), GFP_KERNEL); + if (!priv_val) { + dev_err(dev, "can not get memory\n"); + return; + } + + priv_val->buf_3dlut_idx = 0; + for (i = 0; i < RKISP_PARAM_3DLUT_BUF_NUM; i++) { + priv_val->buf_3dlut[i].size = RKISP_PARAM_3DLUT_BUF_SIZE; + ret = rkisp_alloc_buffer(dev, &priv_val->buf_3dlut[i]); + if (ret) { + dev_err(dev, "can not alloc buffer\n"); + goto err; + } + } + + priv_val->buf_lsclut_idx = 0; + for (i = 0; i < RKISP_PARAM_LSC_LUT_BUF_NUM; i++) { + priv_val->buf_lsclut[i].size = RKISP_PARAM_LSC_LUT_BUF_SIZE; + ret = rkisp_alloc_buffer(dev, &priv_val->buf_lsclut[i]); + if (ret) { + dev_err(dev, "can not alloc buffer\n"); + goto err; + } + } + + params_vdev->priv_val = (void *)priv_val; params_vdev->ops = &rkisp_isp_params_ops_tbl; params_vdev->priv_ops = &rkisp_v2x_isp_params_ops; + return; + +err: + for (i = 0; i < RKISP_PARAM_3DLUT_BUF_NUM; i++) + rkisp_free_buffer(dev, &priv_val->buf_3dlut[i]); + + for (i = 0; i < RKISP_PARAM_LSC_LUT_BUF_NUM; i++) + rkisp_free_buffer(dev, &priv_val->buf_lsclut[i]); +} + +void rkisp_uninit_params_vdev_v2x(struct rkisp_isp_params_vdev *params_vdev) +{ + struct rkisp_isp_params_val_v2x *priv_val; + struct device *dev = params_vdev->dev->dev; + int i; + + priv_val = params_vdev->priv_val; + if (!priv_val) + return; + + for (i = 0; i < RKISP_PARAM_3DLUT_BUF_NUM; i++) + rkisp_free_buffer(dev, &priv_val->buf_3dlut[i]); + + for (i = 0; i < RKISP_PARAM_LSC_LUT_BUF_NUM; i++) + rkisp_free_buffer(dev, &priv_val->buf_lsclut[i]); + + kfree(priv_val); + params_vdev->priv_val = NULL; } diff --git a/drivers/media/platform/rockchip/isp/isp_params_v2x.h b/drivers/media/platform/rockchip/isp/isp_params_v2x.h index eadb9249aa41..534028c99cbd 100644 --- a/drivers/media/platform/rockchip/isp/isp_params_v2x.h +++ b/drivers/media/platform/rockchip/isp/isp_params_v2x.h @@ -169,6 +169,15 @@ #define ISP2X_ISPPATH_RAWAWB_SEL_SET(x) (((x) & 0x03) << 20) #define ISP2X_ISPPATH_RAWAE_SWAP_SET(x) (((x) & 0x03) << 22) +#define RKISP_PARAM_3DLUT_BUF_NUM 2 +#define RKISP_PARAM_3DLUT_BUF_SIZE (9 * 9 * 9 * 4) + +#define RKISP_PARAM_LDCH_BUF_NUM 2 + +#define RKISP_PARAM_LSC_LUT_BUF_NUM 2 +#define RKISP_PARAM_LSC_LUT_TBL_SIZE (9 * 17) +#define RKISP_PARAM_LSC_LUT_BUF_SIZE (RKISP_PARAM_LSC_LUT_TBL_SIZE * 4) + struct rkisp_isp_params_vdev; struct rkisp_isp_params_v2x_ops { void (*dpcc_config)(struct rkisp_isp_params_vdev *params_vdev, @@ -195,13 +204,13 @@ struct rkisp_isp_params_v2x_ops { const struct isp2x_awb_gain_cfg *arg); void (*awbgain_enable)(struct rkisp_isp_params_vdev *params_vdev, bool en); - void (*bdm_config)(struct rkisp_isp_params_vdev *params_vdev, - const struct isp2x_bdm_config *arg); - void (*bdm_enable)(struct rkisp_isp_params_vdev *params_vdev, - bool en); - void (*ctk_config)(struct rkisp_isp_params_vdev *params_vdev, - const struct isp2x_ctk_cfg *arg); - void (*ctk_enable)(struct rkisp_isp_params_vdev *params_vdev, + void (*debayer_config)(struct rkisp_isp_params_vdev *params_vdev, + const struct isp2x_debayer_cfg *arg); + void (*debayer_enable)(struct rkisp_isp_params_vdev *params_vdev, + bool en); + void (*ccm_config)(struct rkisp_isp_params_vdev *params_vdev, + const struct isp2x_ccm_cfg *arg); + void (*ccm_enable)(struct rkisp_isp_params_vdev *params_vdev, bool en); void (*goc_config)(struct rkisp_isp_params_vdev *params_vdev, const struct isp2x_gammaout_cfg *arg); @@ -295,12 +304,34 @@ struct rkisp_isp_params_v2x_ops { const struct isp2x_dhaz_cfg *arg); void (*dhaz_enable)(struct rkisp_isp_params_vdev *params_vdev, bool en); + void (*gain_config)(struct rkisp_isp_params_vdev *params_vdev, + const struct isp2x_gain_cfg *arg); + void (*gain_enable)(struct rkisp_isp_params_vdev *params_vdev, + bool en); void (*isp3dlut_config)(struct rkisp_isp_params_vdev *params_vdev, const struct isp2x_3dlut_cfg *arg); void (*isp3dlut_enable)(struct rkisp_isp_params_vdev *params_vdev, bool en); + void (*ldch_config)(struct rkisp_isp_params_vdev *params_vdev, + const struct isp2x_ldch_cfg *arg); + void (*ldch_enable)(struct rkisp_isp_params_vdev *params_vdev, + bool en); + void (*csm_config)(struct rkisp_isp_params_vdev *params_vdev, + bool full_range); +}; + +struct rkisp_isp_params_val_v2x { + struct rkisp_dummy_buffer buf_3dlut[RKISP_PARAM_3DLUT_BUF_NUM]; + u32 buf_3dlut_idx; + + struct rkisp_dummy_buffer buf_ldch[RKISP_PARAM_LDCH_BUF_NUM]; + u32 buf_ldch_idx; + + struct rkisp_dummy_buffer buf_lsclut[RKISP_PARAM_LSC_LUT_BUF_NUM]; + u32 buf_lsclut_idx; }; void rkisp_init_params_vdev_v2x(struct rkisp_isp_params_vdev *params_vdev); +void rkisp_uninit_params_vdev_v2x(struct rkisp_isp_params_vdev *params_vdev); #endif /* _RKISP_ISP_PARAM_V2X_H */ diff --git a/drivers/media/platform/rockchip/isp/isp_stats.c b/drivers/media/platform/rockchip/isp/isp_stats.c index 5bf05a06f68f..eb893201acaa 100644 --- a/drivers/media/platform/rockchip/isp/isp_stats.c +++ b/drivers/media/platform/rockchip/isp/isp_stats.c @@ -289,7 +289,7 @@ int rkisp_register_stats_vdev(struct rkisp_isp_stats_vdev *stats_vdev, ret = media_create_pad_link(source, RKISP_ISP_PAD_SOURCE_STATS, sink, 0, MEDIA_LNK_FL_ENABLED); if (ret < 0) - goto err_cleanup_media_entity; + goto err_unregister_video; ret = kfifo_alloc(&stats_vdev->rd_kfifo, RKISP_READOUT_WORK_SIZE, @@ -298,7 +298,7 @@ int rkisp_register_stats_vdev(struct rkisp_isp_stats_vdev *stats_vdev, dev_err(&vdev->dev, "kfifo_alloc failed with error %d\n", ret); - goto err_cleanup_media_entity; + goto err_unregister_video; } tasklet_init(&stats_vdev->rd_tasklet, @@ -308,10 +308,13 @@ int rkisp_register_stats_vdev(struct rkisp_isp_stats_vdev *stats_vdev, return 0; +err_unregister_video: + video_unregister_device(vdev); err_cleanup_media_entity: media_entity_cleanup(&vdev->entity); err_release_queue: vb2_queue_release(vdev->queue); + rkisp_uninit_stats_vdev(stats_vdev); return ret; } @@ -320,10 +323,11 @@ void rkisp_unregister_stats_vdev(struct rkisp_isp_stats_vdev *stats_vdev) struct rkisp_vdev_node *node = &stats_vdev->vnode; struct video_device *vdev = &node->vdev; - rkisp_uninit_stats_vdev(stats_vdev); kfifo_free(&stats_vdev->rd_kfifo); tasklet_kill(&stats_vdev->rd_tasklet); video_unregister_device(vdev); media_entity_cleanup(&vdev->entity); vb2_queue_release(vdev->queue); + rkisp_uninit_stats_vdev(stats_vdev); } + diff --git a/drivers/media/platform/rockchip/isp/isp_stats.h b/drivers/media/platform/rockchip/isp/isp_stats.h index e2c560a95740..04da0cd7df5d 100644 --- a/drivers/media/platform/rockchip/isp/isp_stats.h +++ b/drivers/media/platform/rockchip/isp/isp_stats.h @@ -29,7 +29,7 @@ struct rkisp_isp_readout_work { }; struct rkisp_isp_stats_ops { - void (*isr_hdl)(struct rkisp_isp_stats_vdev *params_vdev, + void (*isr_hdl)(struct rkisp_isp_stats_vdev *stats_vdev, u32 isp_mis, u32 isp3a_ris); void (*send_meas)(struct rkisp_isp_stats_vdev *stats_vdev, struct rkisp_isp_readout_work *meas_work); diff --git a/drivers/media/platform/rockchip/isp/isp_stats_v2x.c b/drivers/media/platform/rockchip/isp/isp_stats_v2x.c index 636f49468a42..592b6d1df1fc 100644 --- a/drivers/media/platform/rockchip/isp/isp_stats_v2x.c +++ b/drivers/media/platform/rockchip/isp/isp_stats_v2x.c @@ -268,9 +268,9 @@ rkisp_stats_get_sihst_meas_reg(struct rkisp_isp_stats_vdev *stats_vdev, pbuf->meas_type |= ISP2X_STAT_SIHST; addr = stats_vdev->dev->base_addr + ISP_HIST_HIST_BIN; - for (i = 0; i < ISP2X_HIST_WIN_NUM; i++) { + for (i = 0; i < ISP2X_SIHIST_WIN_NUM; i++) { addr += i * 0x40; - for (j = 0; j < ISP2X_HIST_BIN_N_MAX / 2; j++) { + for (j = 0; j < ISP2X_SIHIST_BIN_N_MAX / 2; j++) { value = readl(addr + (j * 4)); pbuf->params.sihst.win_stat[i].hist_bins[2 * j] = ISP2X_HIST_GET_BIN0(value); @@ -479,6 +479,145 @@ out: writel(value, addr + ISP_RAWHIST_LITE_CTRL); } +static void +rkisp_stats_get_bls_stats(struct rkisp_isp_stats_vdev *stats_vdev, + struct rkisp_isp2x_stat_buffer *pbuf) +{ + void __iomem *addr = stats_vdev->dev->base_addr; + struct ispsd_in_fmt in_fmt = stats_vdev->dev->isp_sdev.in_fmt; + enum rkisp_fmt_raw_pat_type raw_type = in_fmt.bayer_pat; + struct isp2x_bls_stat *bls; + u32 value; + + if (!pbuf) + return; + + bls = &pbuf->params.bls; + value = readl(addr + ISP_BLS_CTRL); + if (value & (ISP_BLS_ENA | ISP_BLS_MODE_MEASURED)) { + pbuf->meas_type |= ISP2X_STAT_BLS; + + switch (raw_type) { + case RAW_BGGR: + bls->meas_r = readl(addr + ISP_BLS_D_MEASURED); + bls->meas_gr = readl(addr + ISP_BLS_C_MEASURED); + bls->meas_gb = readl(addr + ISP_BLS_B_MEASURED); + bls->meas_b = readl(addr + ISP_BLS_A_MEASURED); + break; + case RAW_GBRG: + bls->meas_r = readl(addr + ISP_BLS_C_MEASURED); + bls->meas_gr = readl(addr + ISP_BLS_D_MEASURED); + bls->meas_gb = readl(addr + ISP_BLS_A_MEASURED); + bls->meas_b = readl(addr + ISP_BLS_B_MEASURED); + break; + case RAW_GRBG: + bls->meas_r = readl(addr + ISP_BLS_B_MEASURED); + bls->meas_gr = readl(addr + ISP_BLS_A_MEASURED); + bls->meas_gb = readl(addr + ISP_BLS_D_MEASURED); + bls->meas_b = readl(addr + ISP_BLS_C_MEASURED); + break; + case RAW_RGGB: + bls->meas_r = readl(addr + ISP_BLS_A_MEASURED); + bls->meas_gr = readl(addr + ISP_BLS_B_MEASURED); + bls->meas_gb = readl(addr + ISP_BLS_C_MEASURED); + bls->meas_b = readl(addr + ISP_BLS_D_MEASURED); + break; + default: + break; + } + } +} + +static void +rkisp_stats_get_tmo_stats(struct rkisp_isp_stats_vdev *stats_vdev, + struct rkisp_isp2x_stat_buffer *pbuf) +{ + struct rkisp_device *dev = stats_vdev->dev; + struct rkisp_isp_params_vdev *params_vdev = &dev->params_vdev; + void __iomem *addr = dev->base_addr; + struct isp2x_hdrtmo_stat *tmo; + u32 value, i; + + if (!pbuf || !params_vdev->hdrtmo_en) + return; + + tmo = &pbuf->params.hdrtmo; + value = readl(addr + ISP_HDRTMO_CTRL); + if (value & ISP_HDRTMO_EN) { + pbuf->meas_type |= ISP2X_STAT_HDRTMO; + + value = readl(addr + ISP_HDRTMO_LG_RO0); + tmo->lglow = value >> 16; + tmo->lgmin = value & 0xFFFF; + + value = readl(addr + ISP_HDRTMO_LG_RO1); + tmo->lghigh = value >> 16; + tmo->lgmax = value & 0xFFFF; + + value = readl(addr + ISP_HDRTMO_LG_RO2); + tmo->weightkey = (value >> 16) & 0xFF; + tmo->lgmean = value & 0xFFFF; + + value = readl(addr + ISP_HDRTMO_LG_RO3); + tmo->lgrange1 = value >> 16; + tmo->lgrange0 = value & 0xFFFF; + + value = readl(addr + ISP_HDRTMO_LG_RO4); + tmo->palpha = (value >> 16) & 0x3FF; + tmo->lgavgmax = value & 0xFFFF; + + value = readl(addr + ISP_HDRTMO_LG_RO5); + tmo->linecnt = value & 0x1FFF; + + for (i = 0; i < ISP2X_HDRTMO_MINMAX_NUM; i++) + tmo->min_max[i] = readl(addr + ISP_HDRTMO_HIST_RO0 + 4 * i); + } +} + +static void +rkisp_stats_get_dhaz_stats(struct rkisp_isp_stats_vdev *stats_vdev, + struct rkisp_isp2x_stat_buffer *pbuf) +{ + void __iomem *addr = stats_vdev->dev->base_addr; + struct isp2x_dhaz_stat *dhaz; + u32 value, i; + + if (!pbuf) + return; + + dhaz = &pbuf->params.dhaz; + value = readl(addr + ISP_DHAZ_CTRL); + if (value & ISP_DHAZ_ENMUX) { + pbuf->meas_type |= ISP2X_STAT_DHAZ; + + value = readl(addr + ISP_DHAZ_ADP_RD0); + dhaz->dhaz_adp_air_base = value >> 16; + dhaz->dhaz_adp_wt = value & 0xFFFF; + + value = readl(addr + ISP_DHAZ_ADP_RD1); + dhaz->dhaz_adp_gratio = value >> 16; + dhaz->dhaz_adp_tmax = value & 0xFFFF; + + for (i = 0; i < ISP2X_DHAZ_HIST_IIR_NUM / 2; i++) { + value = readl(addr + ISP_DHAZ_HIST_REG0 + 4 * i); + dhaz->h_r_iir[2 * i] = value & 0xFFFF; + dhaz->h_r_iir[2 * i + 1] = value >> 16; + } + + for (i = 0; i < ISP2X_DHAZ_HIST_IIR_NUM / 2; i++) { + value = readl(addr + ISP_DHAZ_HIST_REG32 + 4 * i); + dhaz->h_g_iir[2 * i] = value & 0xFFFF; + dhaz->h_g_iir[2 * i + 1] = value >> 16; + } + + for (i = 0; i < ISP2X_DHAZ_HIST_IIR_NUM / 2; i++) { + value = readl(addr + ISP_DHAZ_HIST_REG64 + 4 * i); + dhaz->h_b_iir[2 * i] = value & 0xFFFF; + dhaz->h_b_iir[2 * i + 1] = value >> 16; + } + } +} + static struct rkisp_stats_v2x_ops __maybe_unused rkisp_stats_reg_ops_v2x = { .get_siawb_meas = rkisp_stats_get_siawb_meas_reg, .get_rawawb_meas = rkisp_stats_get_rawawb_meas_reg, @@ -494,6 +633,9 @@ static struct rkisp_stats_v2x_ops __maybe_unused rkisp_stats_reg_ops_v2x = { .get_rawhstbig3_meas = rkisp_stats_get_rawhstbig3_meas_reg, .get_rawaelite_meas = rkisp_stats_get_rawaelite_meas_reg, .get_rawhstlite_meas = rkisp_stats_get_rawhstlite_meas_reg, + .get_bls_stats = rkisp_stats_get_bls_stats, + .get_tmo_stats = rkisp_stats_get_tmo_stats, + .get_dhaz_stats = rkisp_stats_get_dhaz_stats, }; static void @@ -735,10 +877,10 @@ rkisp_stats_get_sihst_meas_ddr(struct rkisp_isp_stats_vdev *stats_vdev, rd_buf_idx = stats_vdev->rd_buf_idx; ddr_addr = stats_vdev->stats_buf[rd_buf_idx].vaddr + 0x2C00; - for (i = 0; i < 1; i++) { + for (i = 0; i < ISP2X_SIHIST_WIN_NUM; i++) { ddr_addr += i * 0x40; - for (j = 0; j < ISP2X_HIST_BIN_N_MAX / 2; j++) { - value = ddr_addr[j * 4]; + for (j = 0; j < ISP2X_SIHIST_BIN_N_MAX / 2; j++) { + value = ddr_addr[j]; pbuf->params.sihst.win_stat[i].hist_bins[2 * j] = ISP2X_HIST_GET_BIN0(value); pbuf->params.sihst.win_stat[i].hist_bins[2 * j + 1] = @@ -975,6 +1117,9 @@ static struct rkisp_stats_v2x_ops __maybe_unused rkisp_stats_ddr_ops_v2x = { .get_rawhstbig3_meas = rkisp_stats_get_rawhstbig3_meas_ddr, .get_rawaelite_meas = rkisp_stats_get_rawaelite_meas_ddr, .get_rawhstlite_meas = rkisp_stats_get_rawhstlite_meas_ddr, + .get_bls_stats = rkisp_stats_get_bls_stats, + .get_tmo_stats = rkisp_stats_get_tmo_stats, + .get_dhaz_stats = rkisp_stats_get_dhaz_stats, }; static void @@ -1111,6 +1256,10 @@ rkisp_stats_send_meas_v2x(struct rkisp_isp_stats_vdev *stats_vdev, cur_stat_buf->meas_type |= ISP2X_STAT_RAWHSTCH2; } + ops->get_bls_stats(stats_vdev, cur_stat_buf); + ops->get_tmo_stats(stats_vdev, cur_stat_buf); + ops->get_dhaz_stats(stats_vdev, cur_stat_buf); + if (cur_buf) { vb2_set_plane_payload(&cur_buf->vb.vb2_buf, 0, sizeof(struct rkisp_isp2x_stat_buffer)); @@ -1212,29 +1361,6 @@ unlock: spin_unlock(&stats_vdev->irq_lock); } -static int __maybe_unused rkisp_alloc_buffer(struct rkisp_device *dev, - struct rkisp_dummy_buffer *buf) -{ - int ret = 0; - - buf->vaddr = dma_alloc_coherent(dev->dev, buf->size, - &buf->dma_addr, GFP_KERNEL); - if (!buf->vaddr) - ret = -ENOMEM; - return ret; -} - -static void __maybe_unused rkisp_free_buffer(struct rkisp_device *dev, - struct rkisp_dummy_buffer *buf) -{ - if (buf && buf->vaddr && buf->size) { - dma_free_coherent(dev->dev, buf->size, - buf->vaddr, buf->dma_addr); - buf->size = 0; - buf->vaddr = NULL; - } -} - static struct rkisp_isp_stats_ops rkisp_isp_stats_ops_tbl = { .isr_hdl = rkisp_stats_isr_v2x, .send_meas = rkisp_stats_send_meas_v2x, @@ -1275,7 +1401,7 @@ void rkisp_init_stats_vdev_v2x(struct rkisp_isp_stats_vdev *stats_vdev) stats_vdev->wr_buf_idx = 0; for (i = 0; i < RKISP_STATS_DDR_BUF_NUM; i++) { stats_vdev->stats_buf[i].size = RKISP_RD_STATS_BUF_SIZE; - rkisp_alloc_buffer(stats_vdev->dev, &stats_vdev->stats_buf[i]); + rkisp_alloc_buffer(stats_vdev->dev->dev, &stats_vdev->stats_buf[i]); } } #endif @@ -1286,6 +1412,6 @@ void rkisp_uninit_stats_vdev_v2x(struct rkisp_isp_stats_vdev *stats_vdev) int i; for (i = 0; i < RKISP_STATS_DDR_BUF_NUM; i++) - rkisp_free_buffer(stats_vdev->dev, &stats_vdev->stats_buf[i]); + rkisp_free_buffer(stats_vdev->dev->dev, &stats_vdev->stats_buf[i]); } diff --git a/drivers/media/platform/rockchip/isp/isp_stats_v2x.h b/drivers/media/platform/rockchip/isp/isp_stats_v2x.h index d828c5dec856..06c826846cd1 100644 --- a/drivers/media/platform/rockchip/isp/isp_stats_v2x.h +++ b/drivers/media/platform/rockchip/isp/isp_stats_v2x.h @@ -15,39 +15,46 @@ struct rkisp_isp_stats_vdev; struct rkisp_stats_v2x_ops { void (*get_siawb_meas)(struct rkisp_isp_stats_vdev *stats_vdev, - struct rkisp_isp2x_stat_buffer *pbuf); + struct rkisp_isp2x_stat_buffer *pbuf); void (*get_rawawb_meas)(struct rkisp_isp_stats_vdev *stats_vdev, - struct rkisp_isp2x_stat_buffer *pbuf); + struct rkisp_isp2x_stat_buffer *pbuf); void (*get_siaf_meas)(struct rkisp_isp_stats_vdev *stats_vdev, - struct rkisp_isp2x_stat_buffer *pbuf); + struct rkisp_isp2x_stat_buffer *pbuf); void (*get_rawaf_meas)(struct rkisp_isp_stats_vdev *stats_vdev, - struct rkisp_isp2x_stat_buffer *pbuf); + struct rkisp_isp2x_stat_buffer *pbuf); void (*get_yuvae_meas)(struct rkisp_isp_stats_vdev *stats_vdev, - struct rkisp_isp2x_stat_buffer *pbuf); + struct rkisp_isp2x_stat_buffer *pbuf); void (*get_sihst_meas)(struct rkisp_isp_stats_vdev *stats_vdev, - struct rkisp_isp2x_stat_buffer *pbuf); + struct rkisp_isp2x_stat_buffer *pbuf); void (*get_rawaebig1_meas)(struct rkisp_isp_stats_vdev *stats_vdev, - struct rkisp_isp2x_stat_buffer *pbuf); + struct rkisp_isp2x_stat_buffer *pbuf); void (*get_rawhstbig1_meas)(struct rkisp_isp_stats_vdev *stats_vdev, - struct rkisp_isp2x_stat_buffer *pbuf); + struct rkisp_isp2x_stat_buffer *pbuf); void (*get_rawaebig2_meas)(struct rkisp_isp_stats_vdev *stats_vdev, - struct rkisp_isp2x_stat_buffer *pbuf); + struct rkisp_isp2x_stat_buffer *pbuf); void (*get_rawhstbig2_meas)(struct rkisp_isp_stats_vdev *stats_vdev, - struct rkisp_isp2x_stat_buffer *pbuf); + struct rkisp_isp2x_stat_buffer *pbuf); void (*get_rawaebig3_meas)(struct rkisp_isp_stats_vdev *stats_vdev, - struct rkisp_isp2x_stat_buffer *pbuf); + struct rkisp_isp2x_stat_buffer *pbuf); void (*get_rawhstbig3_meas)(struct rkisp_isp_stats_vdev *stats_vdev, - struct rkisp_isp2x_stat_buffer *pbuf); + struct rkisp_isp2x_stat_buffer *pbuf); void (*get_rawaelite_meas)(struct rkisp_isp_stats_vdev *stats_vdev, - struct rkisp_isp2x_stat_buffer *pbuf); + struct rkisp_isp2x_stat_buffer *pbuf); void (*get_rawhstlite_meas)(struct rkisp_isp_stats_vdev *stats_vdev, - struct rkisp_isp2x_stat_buffer *pbuf); + struct rkisp_isp2x_stat_buffer *pbuf); + + void (*get_bls_stats)(struct rkisp_isp_stats_vdev *stats_vdev, + struct rkisp_isp2x_stat_buffer *pbuf); + void (*get_tmo_stats)(struct rkisp_isp_stats_vdev *stats_vdev, + struct rkisp_isp2x_stat_buffer *pbuf); + void (*get_dhaz_stats)(struct rkisp_isp_stats_vdev *stats_vdev, + struct rkisp_isp2x_stat_buffer *pbuf); }; void rkisp_stats_first_ddr_config_v2x(struct rkisp_isp_stats_vdev *stats_vdev); diff --git a/drivers/media/platform/rockchip/isp/regs_v2x.h b/drivers/media/platform/rockchip/isp/regs_v2x.h index 144d97210d25..bbda9f0ebcd9 100644 --- a/drivers/media/platform/rockchip/isp/regs_v2x.h +++ b/drivers/media/platform/rockchip/isp/regs_v2x.h @@ -584,6 +584,7 @@ #define ISP_DEBAYER_C_FILTER (ISP_DEBAYER_BASE + 0x00014) #define ISP_WDR_BASE 0x00002A00 +#define ISP_WDR_CTRL (ISP_WDR_BASE + 0x00000) #define ISP_WDR_WDR_TONECURVE_DYN1 (ISP_WDR_BASE + 0x00004) #define ISP_WDR_WDR_TONECURVE_DYN2 (ISP_WDR_BASE + 0x00008) #define ISP_WDR_WDR_TONECURVE_DYN3 (ISP_WDR_BASE + 0x0000c) @@ -661,14 +662,16 @@ #define ISP_GIC_NOISE_PARA1 (ISP_GIC_BASE + 0x00014) #define ISP_GIC_NOISE_PARA2 (ISP_GIC_BASE + 0x00018) #define ISP_GIC_NOISE_PARA3 (ISP_GIC_BASE + 0x0001c) -#define ISP_GIC_SIGMA_VALUE0 (ISP_GIC_BASE + 0x00044) -#define ISP_GIC_SIGMA_VALUE1 (ISP_GIC_BASE + 0x00048) -#define ISP_GIC_SIGMA_VALUE2 (ISP_GIC_BASE + 0x0004c) -#define ISP_GIC_SIGMA_VALUE3 (ISP_GIC_BASE + 0x00050) -#define ISP_GIC_SIGMA_VALUE4 (ISP_GIC_BASE + 0x00054) -#define ISP_GIC_SIGMA_VALUE5 (ISP_GIC_BASE + 0x00058) -#define ISP_GIC_SIGMA_VALUE6 (ISP_GIC_BASE + 0x0005c) -#define ISP_GIC_SIGMA_VALUE7 (ISP_GIC_BASE + 0x00060) +#define ISP_GIC_SIGMA_VALUE0 (ISP_GIC_BASE + 0x00020) +#define ISP_GIC_SIGMA_VALUE1 (ISP_GIC_BASE + 0x00024) +#define ISP_GIC_SIGMA_VALUE2 (ISP_GIC_BASE + 0x00028) +#define ISP_GIC_SIGMA_VALUE3 (ISP_GIC_BASE + 0x0002c) +#define ISP_GIC_SIGMA_VALUE4 (ISP_GIC_BASE + 0x00030) +#define ISP_GIC_SIGMA_VALUE5 (ISP_GIC_BASE + 0x00034) +#define ISP_GIC_SIGMA_VALUE6 (ISP_GIC_BASE + 0x00038) +#define ISP_GIC_SIGMA_VALUE7 (ISP_GIC_BASE + 0x0003c) +#define ISP_GIC_NOISE_CTRL0 (ISP_GIC_BASE + 0x00040) +#define ISP_GIC_NOISE_CTRL1 (ISP_GIC_BASE + 0x00044) #define ISP_BLS_BASE 0x00003000 #define ISP_BLS_CTRL (ISP_BLS_BASE + 0x00000) @@ -830,7 +833,7 @@ #define ISP_HDRTMO_HIST_RO31 (ISP_HDRTMO_BASE + 0x000dc) #define ISP_RAWNR_BASE 0x00003A00 -#define ISP_RAWNR_STS (ISP_RAWNR_BASE + 0x00004) +#define ISP_RAWNR_CTRL (ISP_RAWNR_BASE + 0x00004) #define ISP_RAWNR_FILTPAR0 (ISP_RAWNR_BASE + 0x00008) #define ISP_RAWNR_FILTPAR1 (ISP_RAWNR_BASE + 0x0000c) #define ISP_RAWNR_FILTPAR2 (ISP_RAWNR_BASE + 0x00010) @@ -983,7 +986,7 @@ #define ISP_DHAZ_HIST_REG94 (ISP_DHAZ_BASE + 0x001e8) #define ISP_DHAZ_HIST_REG95 (ISP_DHAZ_BASE + 0x001ec) -#define ISP_3DLUT_BASE 0x00003D00 +#define ISP_3DLUT_BASE 0x00003E00 #define ISP_3DLUT_CTRL (ISP_3DLUT_BASE + 0x00000) #define ISP_3DLUT_UPDATE (ISP_3DLUT_BASE + 0x00004) @@ -1835,6 +1838,59 @@ #define SW_HDRMGE_MODE_FRAMEX2 BIT(2) #define SW_HDRMGE_MODE_FRAMEX3 (2 << 2) +/* BLS */ +/* ISP_BLS_CTRL */ +#define ISP_BLS_ENA BIT(0) +#define ISP_BLS_MODE_MEASURED BIT(1) +#define ISP_BLS_MODE_FIXED 0 +#define ISP_BLS_WINDOW_1 (1 << 2) +#define ISP_BLS_WINDOW_2 (2 << 2) + +/* GIC */ +/* ISP_GIC_CTRL */ +#define ISP_GIC_ENA BIT(0) +#define ISP_GIC_EDGE_OPEN BIT(1) + +/* DHAZ */ +/* ISP_DHAZ_CTRL */ +#define ISP_DHAZ_ENMUX BIT(0) +#define ISP_DHAZ_NOBIGEN BIT(2) +#define ISP_DHAZ_BIGEN BIT(3) +#define ISP_DHAZ_DCEN BIT(4) +#define ISP_DHAZ_HSTEN BIT(8) +#define ISP_DHAZ_HPARAEN BIT(12) +#define ISP_DHAZ_HSTCHN BIT(16) +#define ISP_DHAZ_ENHANCE BIT(20) + +/* HDRTMO */ +/* ISP_HDRTMO_CTRL */ +#define ISP_HDRTMO_EN BIT(0) + +/* HDRMGE */ +/* ISP_HDRMGE_CTRL */ +#define ISP_HDRMGE_EN BIT(0) + +/* RAWNR */ +/* ISP_RAWNR_CTRL */ +#define ISP_RAWNR_EN BIT(0) + +/* DPCC */ +/* ISP_DPCC_CTRL */ +#define ISP_DPCC_EN BIT(0) + +/* CCM */ +/* ISP_CCM_CTRL */ +#define ISP_CCM_EN BIT(0) + +/* 3DLUT */ +/* ISP_3DLUT_CTRL */ +#define ISP_3DLUT_EN BIT(0) +#define ISP_3DLUT_BYPASS BIT(1) + +/* DEBAYER */ +/* ISP_DEBAYER_CONTROL */ +#define ISP_DEBAYER_EN BIT(0) + static inline bool dmatx_is_stream_stopped(void __iomem *base) { return true; diff --git a/include/uapi/linux/rkisp2-config.h b/include/uapi/linux/rkisp2-config.h index 9c3581f2507e..3f4fa3bbd1d1 100644 --- a/include/uapi/linux/rkisp2-config.h +++ b/include/uapi/linux/rkisp2-config.h @@ -20,7 +20,7 @@ #define ISP2X_MODULE_LSC BIT_ULL(4) #define ISP2X_MODULE_AWB_GAIN BIT_ULL(5) #define ISP2X_MODULE_BDM BIT_ULL(7) -#define ISP2X_MODULE_CTK BIT_ULL(8) +#define ISP2X_MODULE_CCM BIT_ULL(8) #define ISP2X_MODULE_GOC BIT_ULL(9) #define ISP2X_MODULE_CPROC BIT_ULL(10) #define ISP2X_MODULE_SIAF BIT_ULL(11) @@ -45,6 +45,9 @@ #define ISP2X_MODULE_GIC BIT_ULL(30) #define ISP2X_MODULE_DHAZ BIT_ULL(31) #define ISP2X_MODULE_3DLUT BIT_ULL(32) +#define ISP2X_MODULE_LDCH BIT_ULL(33) +#define ISP2X_MODULE_GAIN BIT_ULL(34) +#define ISP2X_MODULE_DEBAYER BIT_ULL(35) /* * Measurement types @@ -64,6 +67,9 @@ #define ISP2X_STAT_RAWHSTCH0 BIT(12) #define ISP2X_STAT_RAWHSTCH1 BIT(13) #define ISP2X_STAT_RAWHSTCH2 BIT(14) +#define ISP2X_STAT_BLS BIT(15) +#define ISP2X_STAT_HDRTMO BIT(16) +#define ISP2X_STAT_DHAZ BIT(17) #define ISP2X_LSC_GRAD_TBL_SIZE 8 #define ISP2X_LSC_SIZE_TBL_SIZE 8 @@ -71,6 +77,10 @@ #define ISP2X_DEGAMMA_CURVE_SIZE 17 +#define ISP2X_GAIN_HDRMGE_GAIN_NUM 3 +#define ISP2X_GAIN_IDX_NUM 15 +#define ISP2X_GAIN_LUT_NUM 17 + #define ISP2X_AWB_MAX_GRID 1 #define ISP2X_RAWAWB_SUM_NUM 7 #define ISP2X_RAWAWB_MULWD_NUM 8 @@ -84,9 +94,10 @@ #define ISP2X_RAWHISTBIG_SUBWIN_NUM 225 #define ISP2X_RAWHISTLITE_SUBWIN_NUM 25 -#define ISP2X_HIST_WIN_NUM 4 +#define ISP2X_SIHIST_WIN_NUM 1 #define ISP2X_HIST_WEIGHT_NUM 225 #define ISP2X_HIST_BIN_N_MAX 256 +#define ISP2X_SIHIST_BIN_N_MAX 32 #define ISP2X_RAWAF_WIN_NUM 2 #define ISP2X_RAWAF_LINE_NUM 5 @@ -101,22 +112,21 @@ #define ISP2X_HDRMGE_L_CURVE_NUM 17 #define ISP2X_HDRMGE_E_CURVE_NUM 17 -#define ISP2X_RAWNR_LUMA_RATION_NUM 17 +#define ISP2X_RAWNR_LUMA_RATION_NUM 8 #define ISP2X_HDRTMO_MINMAX_NUM 32 +#define ISP2X_GIC_SIGMA_Y_NUM 15 + #define ISP2X_CCM_CURVE_NUM 17 -#define ISP2X_WDR_DY_NUM 32 -#define ISP2X_WDR_TONE_YN_NUM 16 -#define ISP2X_WDR_TONE_YM_NUM 32 -#define ISP2X_WDR_BLKMEAN_ROW_NUM 10 -#define ISP2X_WDR_BLKMEAN_DATA_NUM 8 +/* WDR */ +#define ISP2X_WDR_SIZE 48 #define ISP2X_DHAZ_CONV_COEFF_NUM 6 #define ISP2X_DHAZ_HIST_IIR_NUM 64 -#define ISP2X_GAMMA_OUT_MAX_SAMPLES 17 +#define ISP2X_GAMMA_OUT_MAX_SAMPLES 45 #define ISP2X_MIPI_LUMA_MEAN_MAX 16 #define ISP2X_MIPI_RAW_MAX 3 @@ -124,6 +134,8 @@ #define ISP2X_RAW1_Y_STATE (1 << 1) #define ISP2X_RAW2_Y_STATE (1 << 2) +#define ISP2X_3DLUT_DATA_NUM 729 + struct isp2x_window { u16 h_offs; u16 v_offs; @@ -359,22 +371,27 @@ struct isp2x_dpcc_cfg { } __attribute__ ((packed)); struct isp2x_hdrmge_curve { - u16 curve_1; - u16 curve_0; + u16 curve_1[ISP2X_HDRMGE_L_CURVE_NUM]; + u16 curve_0[ISP2X_HDRMGE_L_CURVE_NUM]; } __attribute__ ((packed)); struct isp2x_hdrmge_cfg { u8 mode; + u16 gain0_inv; u16 gain0; + u16 gain1_inv; u16 gain1; + u8 gain2; + u8 lm_dif_0p15; u8 lm_dif_0p9; u8 ms_diff_0p15; u8 ms_dif_0p8; - struct isp2x_hdrmge_curve curve[ISP2X_HDRMGE_L_CURVE_NUM]; + + struct isp2x_hdrmge_curve curve; u16 e_y[ISP2X_HDRMGE_E_CURVE_NUM]; } __attribute__ ((packed)); @@ -391,11 +408,18 @@ struct isp2x_rawnr_cfg { u32 dgain2; u16 luration[ISP2X_RAWNR_LUMA_RATION_NUM]; + u16 lulevel[ISP2X_RAWNR_LUMA_RATION_NUM]; + u32 gauss; u16 sigma; u16 pix_diff; + u32 thld_diff; + + u8 gas_weig_scl2; + u8 gas_weig_scl1; u16 thld_chanelw; + u16 lamda; u16 fixw0; @@ -412,18 +436,16 @@ struct isp2x_rawnr_cfg { } __attribute__ ((packed)); struct isp2x_lsc_cfg { - u32 r_data_tbl[ISP2X_LSC_DATA_TBL_SIZE]; - u32 gr_data_tbl[ISP2X_LSC_DATA_TBL_SIZE]; - u32 gb_data_tbl[ISP2X_LSC_DATA_TBL_SIZE]; - u32 b_data_tbl[ISP2X_LSC_DATA_TBL_SIZE]; + u16 r_data_tbl[ISP2X_LSC_DATA_TBL_SIZE]; + u16 gr_data_tbl[ISP2X_LSC_DATA_TBL_SIZE]; + u16 gb_data_tbl[ISP2X_LSC_DATA_TBL_SIZE]; + u16 b_data_tbl[ISP2X_LSC_DATA_TBL_SIZE]; - u32 x_grad_tbl[ISP2X_LSC_GRAD_TBL_SIZE]; - u32 y_grad_tbl[ISP2X_LSC_GRAD_TBL_SIZE]; + u16 x_grad_tbl[ISP2X_LSC_GRAD_TBL_SIZE]; + u16 y_grad_tbl[ISP2X_LSC_GRAD_TBL_SIZE]; - u32 x_size_tbl[ISP2X_LSC_SIZE_TBL_SIZE]; - u32 y_size_tbl[ISP2X_LSC_SIZE_TBL_SIZE]; - u16 cfg_width; - u16 cfg_height; + u16 x_size_tbl[ISP2X_LSC_SIZE_TBL_SIZE]; + u16 y_size_tbl[ISP2X_LSC_SIZE_TBL_SIZE]; } __attribute__ ((packed)); enum isp2x_goc_mode { @@ -433,35 +455,58 @@ enum isp2x_goc_mode { struct isp2x_goc_cfg { enum isp2x_goc_mode mode; - u8 gamma_y[ISP2X_GAMMA_OUT_MAX_SAMPLES]; + u8 gamma_y[17]; } __attribute__ ((packed)); struct isp2x_hdrtmo_cfg { + u16 cnt_vsize; + u8 gain_ld_off2; + u8 gain_ld_off1; + u8 big_en; + u8 nobig_en; + u8 newhst_en; + u8 cnt_mode; + + u16 expl_lgratio; + u8 lgscl_ratio; u8 cfg_alpha; + u16 set_gainoff; u16 set_palpha; + u16 set_lgmax; u16 set_lgmin; + u8 set_weightkey; u16 set_lgmean; + u16 set_lgrange1; u16 set_lgrange0; + u16 set_lgavgmax; + u8 clipgap1_i; u8 clipgap0_i; u8 clipratio1; u8 clipratio0; u8 ratiol; + u16 lgscl_inv; u16 lgscl; + u16 lgmax; + u16 hist_low; u16 hist_min; + u8 hist_shift; u16 hist_0p3; u16 hist_high; - u16 palpha_0p5; + + u16 palpha_lwscl; + u16 palpha_lw0p5; u16 palpha_0p18; + u16 maxgain; u16 maxpalpha; } __attribute__ ((packed)); @@ -504,42 +549,50 @@ struct isp2x_gic_cfg { u16 regmingradthr2; u16 regmingradthr1; + u8 gr_ratio; u16 dnloscale; u16 dnhiscale; u8 reglumapointsstep; + u16 gvaluelimitlo; u16 gvaluelimithi; u8 fusionratiohilimt1; u8 regstrength_fix; - u16 sigma_y1; + u16 sigma_y[ISP2X_GIC_SIGMA_Y_NUM]; + + u8 noise_cut_en; + u16 noise_coe_a; + + u16 noise_coe_b; + u16 diff_clip; } __attribute__ ((packed)); struct isp2x_debayer_cfg { u8 filter_c_en; u8 filter_g_en; - u8 gain_offset; - u16 hf_offset; u8 thed1; u8 thed0; u8 dist_scale; u8 max_ratio; u8 clip_en; - u8 filter1_coe5; - u8 filter1_coe4; - u8 filter1_coe3; - u8 filter1_coe2; - u8 filter1_coe1; + s8 filter1_coe5; + s8 filter1_coe4; + s8 filter1_coe3; + s8 filter1_coe2; + s8 filter1_coe1; - u8 filter2_coe5; - u8 filter2_coe4; - u8 filter2_coe3; - u8 filter2_coe2; - u8 filter2_coe1; + s8 filter2_coe5; + s8 filter2_coe4; + s8 filter2_coe3; + s8 filter2_coe2; + s8 filter2_coe1; + u16 hf_offset; + u8 gain_offset; u8 offset; u8 shift_num; @@ -548,20 +601,20 @@ struct isp2x_debayer_cfg { } __attribute__ ((packed)); struct isp2x_ccm_cfg { - u16 coeff0_r; - u16 coeff1_r; - u16 coeff2_r; - u16 offset_r; + s16 coeff0_r; + s16 coeff1_r; + s16 coeff2_r; + s16 offset_r; - u16 coeff0_g; - u16 coeff1_g; - u16 coeff2_g; - u16 offset_g; + s16 coeff0_g; + s16 coeff1_g; + s16 coeff2_g; + s16 offset_g; - u16 coeff0_b; - u16 coeff1_b; - u16 coeff2_b; - u16 offset_b; + s16 coeff0_b; + s16 coeff1_b; + s16 coeff2_b; + s16 offset_b; u16 coeff0_y; u16 coeff1_y; @@ -575,57 +628,27 @@ struct isp2x_ccm_cfg { struct isp2x_gammaout_cfg { u8 equ_segm; u16 offset; - u16 y[ISP2X_GAMMA_OUT_MAX_SAMPLES]; + u16 gamma_y[ISP2X_GAMMA_OUT_MAX_SAMPLES]; } __attribute__ ((packed)); +enum isp2x_wdr_mode { + ISP2X_WDR_MODE_BLOCK, + ISP2X_WDR_MODE_GLOBAL +}; + struct isp2x_wdr_cfg { - u8 wdr_dy[ISP2X_WDR_DY_NUM]; - u16 tonecurve_yn[ISP2X_WDR_TONE_YN_NUM]; - u16 tonecurve_ym[ISP2X_WDR_TONE_YM_NUM]; - - u16 lum_offset; - u16 rgb_offset; - - u8 pym_cc; - u8 epsilon; - u8 lvl_en; - u8 blkgain_gam; - u8 csc_sel; - u8 h_size_sel; - - u8 gain_max_en; - u8 gain_max; - u8 bavg_clip; - u8 nonl_segm; - u8 nonl_open; - u8 nonl_mode1; - u8 flt_sel; - u8 blk_sel; - - u8 gain_off1; - u8 gain_off2; - - u8 bestlight; - u8 noiseratio; - - u16 coe_0; - u16 coe_1; - u16 coe_2; - u32 coe_off; - u8 gain_off3; -} __attribute__ ((packed)); - -struct isp2x_wdr_stat { - u32 blkmean[ISP2X_WDR_BLKMEAN_ROW_NUM][ISP2X_WDR_BLKMEAN_DATA_NUM]; + enum isp2x_wdr_mode mode; + unsigned int c_wdr[ISP2X_WDR_SIZE]; } __attribute__ ((packed)); struct isp2x_dhaz_cfg { - u8 gain_en; u8 enhance_en; u8 hist_chn; u8 hpara_en; u8 hist_en; u8 dc_en; + u8 big_en; + u8 nobig_en; u8 yblk_th; u8 yhist_th; @@ -779,26 +802,33 @@ struct isp2x_sdg_cfg { } __attribute__ ((packed)); struct isp2x_bdm_config { - u8 demosaic_th; + unsigned char demosaic_th; +} __attribute__ ((packed)); + +struct isp2x_gain_cfg { + u8 dhaz_en; + u8 wdr_en; + u8 tmo_en; + u8 lsc_en; + u8 mge_en; + + u32 mge_gain[ISP2X_GAIN_HDRMGE_GAIN_NUM]; + u16 idx[ISP2X_GAIN_IDX_NUM]; + u16 lut[ISP2X_GAIN_LUT_NUM]; } __attribute__ ((packed)); struct isp2x_3dlut_cfg { - u8 dummy; + u8 bypass_en; + u32 actual_size; // word unit + u16 lut_r[ISP2X_3DLUT_DATA_NUM]; + u16 lut_g[ISP2X_3DLUT_DATA_NUM]; + u16 lut_b[ISP2X_3DLUT_DATA_NUM]; } __attribute__ ((packed)); -struct isp2x_ctk_cfg { - u16 coeff0; - u16 coeff1; - u16 coeff2; - u16 coeff3; - u16 coeff4; - u16 coeff5; - u16 coeff6; - u16 coeff7; - u16 coeff8; - u16 ct_offset_r; - u16 ct_offset_g; - u16 ct_offset_b; +struct isp2x_ldch_cfg { + u32 hsize; + u32 vsize; + u32 data[1]; } __attribute__ ((packed)); struct isp2x_awb_gain_cfg { @@ -823,8 +853,6 @@ struct isp2x_siawb_meas_cfg { struct isp2x_rawawb_meas_cfg { u8 rawawb_sel; - u8 sw_rawawb_meas_done; //CTRL - u8 ro_rawawb_working; //CTRL u8 sw_rawawb_light_num; //CTRL u8 sw_rawawb_wind_size; //CTRL u8 sw_rawawb_c_range; //CTRL @@ -835,7 +863,6 @@ struct isp2x_rawawb_meas_cfg { u8 sw_rawawb_3dyuv_ls_idx0; //CTRL u8 sw_rawawb_xy_en; //CTRL u8 sw_rawawb_uv_en; //CTRL - u8 sw_rawawb_en; //CTRL u8 sw_rawawb_blk_measure_mode; //BLK_CTRL u8 sw_rawawb_store_wp_flag_ls_idx2; //BLK_CTRL u8 sw_rawawb_store_wp_flag_ls_idx1; //BLK_CTRL @@ -1206,10 +1233,6 @@ struct isp2x_rawaebig_meas_cfg { struct isp2x_rawaelite_meas_cfg { u8 rawae_sel; u8 wnd_num; - u8 off; - u8 bcc; - u8 gcc; - u8 rcc; struct isp2x_window win; } __attribute__ ((packed)); @@ -1288,7 +1311,7 @@ struct isp2x_sihst_win_cfg { struct isp2x_sihst_cfg { u8 wnd_num; - struct isp2x_sihst_win_cfg win_cfg[ISP2X_HIST_WIN_NUM]; + struct isp2x_sihst_win_cfg win_cfg[ISP2X_SIHIST_WIN_NUM]; u8 hist_weight[ISP2X_HIST_WEIGHT_NUM]; } __attribute__ ((packed)); @@ -1299,7 +1322,7 @@ struct isp2x_isp_other_cfg { struct isp2x_rawnr_cfg rawnr_cfg; struct isp2x_lsc_cfg lsc_cfg; struct isp2x_awb_gain_cfg awb_gain_cfg; - struct isp2x_goc_cfg goc_cfg; + //struct isp2x_goc_cfg goc_cfg; struct isp2x_gic_cfg gic_cfg; struct isp2x_debayer_cfg debayer_cfg; struct isp2x_ccm_cfg ccm_cfg; @@ -1310,11 +1333,12 @@ struct isp2x_isp_other_cfg { struct isp2x_rkiesharp_cfg rkiesharp_cfg; struct isp2x_superimp_cfg superimp_cfg; struct isp2x_sdg_cfg sdg_cfg; - struct isp2x_ctk_cfg ctk_cfg; struct isp2x_bdm_config bdm_cfg; struct isp2x_hdrtmo_cfg hdrtmo_cfg; struct isp2x_dhaz_cfg dhaz_cfg; + struct isp2x_gain_cfg gain_cfg; struct isp2x_3dlut_cfg isp3dlut_cfg; + struct isp2x_ldch_cfg ldch_cfg; // must be last item } __attribute__ ((packed)); struct isp2x_isp_meas_cfg { @@ -1340,7 +1364,7 @@ struct isp2x_isp_params_cfg { u64 module_cfg_update; struct isp2x_isp_meas_cfg meas; - struct isp2x_isp_other_cfg others; + struct isp2x_isp_other_cfg others; // must be last item } __attribute__ ((packed)); struct isp2x_siawb_meas { @@ -1440,11 +1464,11 @@ struct isp2x_rawhistlite_stat { } __attribute__ ((packed)); struct isp2x_sihst_win_stat { - u32 hist_bins[ISP2X_HIST_BIN_N_MAX]; + u32 hist_bins[ISP2X_SIHIST_BIN_N_MAX]; } __attribute__ ((packed)); struct isp2x_sihst_stat { - struct isp2x_sihst_win_stat win_stat[ISP2X_HIST_WIN_NUM]; + struct isp2x_sihst_win_stat win_stat[ISP2X_SIHIST_WIN_NUM]; } __attribute__ ((packed)); struct isp2x_stat { @@ -1465,7 +1489,6 @@ struct isp2x_stat { struct isp2x_bls_stat bls; struct isp2x_hdrtmo_stat hdrtmo; - struct isp2x_wdr_stat wdr; struct isp2x_dhaz_stat dhaz; } __attribute__ ((packed));