media: rockchip: isp: aiisp for isp39

Change-Id: Ibcbcfd1865fb8a20f1fe190e09b8bd91133c4b98
Signed-off-by: Cai YiWei <cyw@rock-chips.com>
This commit is contained in:
Cai YiWei
2024-02-21 15:50:33 +08:00
committed by Tao Huang
parent 4d27e391e5
commit 04928950a5
6 changed files with 295 additions and 18 deletions

View File

@@ -286,7 +286,10 @@ struct rkisp_device {
struct mutex buf_lock;
spinlock_t cmsk_lock;
spinlock_t aiisp_lock;
struct rkisp_cmsk_cfg cmsk_cfg;
struct rkisp_aiisp_cfg aiisp_cfg;
bool is_cmsk_upd;
bool is_hw_link;
bool is_bigmode;
@@ -298,6 +301,8 @@ struct rkisp_device {
bool is_suspend;
bool suspend_sync;
bool is_suspend_one_frame;
bool is_aiisp_en;
bool is_aiisp_upd;
struct rkisp_vicap_input vicap_in;

View File

@@ -3245,12 +3245,25 @@ isp_bay3d_enable(struct rkisp_isp_params_vdev *params_vdev, bool en)
value = priv_val->buf_3dnr_iir.dma_addr;
isp3_param_write(params_vdev, value, ISP3X_MI_BAY3D_IIR_WR_BASE);
isp3_param_write(params_vdev, value, ISP3X_MI_BAY3D_IIR_RD_BASE);
isp3_param_write(params_vdev, value, ISP39_AIISP_RD_BASE);
if (priv_val->buf_gain.mem_priv) {
value = priv_val->buf_gain.size;
isp3_param_write(params_vdev, value, ISP3X_MI_GAIN_WR_SIZE);
isp3_param_write(params_vdev, value, ISP32_MI_RAW0_RD_SIZE);
value = priv_val->buf_gain.dma_addr;
isp3_param_write(params_vdev, value, ISP3X_MI_GAIN_WR_BASE);
isp3_param_write(params_vdev, value, ISP3X_MI_RAW0_RD_BASE);
value = isp3_param_read_cache(params_vdev, ISP3X_GAIN_CTRL);
value |= ISP3X_GAIN_2DDR_MODE(1) | ISP3X_GAIN_2DDR_EN;
isp3_param_write(params_vdev, value, ISP3X_GAIN_CTRL);
}
bay3d_ctrl |= ISP39_MODULE_EN;
isp3_param_write(params_vdev, bay3d_ctrl, ISP3X_BAY3D_CTRL);
value = ISP3X_BAY3D_IIR_WR_AUTO_UPD | ISP3X_BAY3D_IIRSELF_UPD |
ISP3X_BAY3D_RDSELF_UPD;
ISP3X_BAY3D_RDSELF_UPD | ISP3X_GAIN_WR_AUTO_UPD | ISP3X_GAINSELF_UPD;
isp3_param_set_bits(params_vdev, MI_WR_CTRL2, value);
isp3_param_set_bits(params_vdev, ISP3X_ISP_CTRL1, ISP3X_RAW3D_FST_FRAME);
@@ -4077,7 +4090,24 @@ rkisp_alloc_internal_buf(struct rkisp_isp_params_vdev *params_vdev,
ret = rkisp_alloc_buffer(dev, &priv_val->buf_3dnr_iir);
if (ret) {
dev_err(dev->dev, "alloc bay3d iir buf fail:%d\n", ret);
goto err_3dnr;
goto err_3dnr_iir;
}
}
val = ALIGN(w * h / 4, 16);
is_alloc = iirsparse_en ? true : false;
if (priv_val->buf_gain.mem_priv) {
if (val > priv_val->buf_gain.size)
rkisp_free_buffer(dev, &priv_val->buf_gain);
else
is_alloc = false;
}
if (is_alloc) {
priv_val->buf_gain.size = val;
ret = rkisp_alloc_buffer(dev, &priv_val->buf_gain);
if (ret) {
dev_err(dev->dev, "alloc gain buf fail:%d\n", ret);
goto free_3dnr_iir;
}
}
}
@@ -4099,7 +4129,7 @@ rkisp_alloc_internal_buf(struct rkisp_isp_params_vdev *params_vdev,
ret = rkisp_alloc_buffer(dev, &priv_val->buf_3dnr_cur);
if (ret) {
dev_err(dev->dev, "alloc yuvme cur buf fail:%d\n", ret);
goto free_3dnr;
goto free_gain;
}
}
@@ -4111,13 +4141,17 @@ rkisp_alloc_internal_buf(struct rkisp_isp_params_vdev *params_vdev,
if (ret) {
dev->hw_dev->is_frm_buf = false;
dev_err(dev->dev, "alloc frm buf fail:%d\n", ret);
goto free_3dnr;
goto free_3dnr_cur;
}
}
return 0;
free_3dnr:
free_3dnr_cur:
rkisp_free_buffer(dev, &priv_val->buf_3dnr_cur);
free_gain:
rkisp_free_buffer(dev, &priv_val->buf_gain);
free_3dnr_iir:
rkisp_free_buffer(dev, &priv_val->buf_3dnr_iir);
err_3dnr:
err_3dnr_iir:
i = ISP39_3DLUT_BUF_NUM;
err_3dlut:
for (i -= 1; i >= 0; i--)
@@ -4528,8 +4562,8 @@ rkisp_params_info2ddr_cfg_v39(struct rkisp_isp_params_vdev *params_vdev, void *a
u32 reg, ctrl, mask, size, val, wsize = 0, vsize = 0;
int i, ret;
if (cfg->owner == RKISP_INFO2DRR_OWNER_GAIN) {
dev_err(dev->dev, "%s no support gain for lite\n", __func__);
if (dev->is_aiisp_en) {
dev_err(dev->dev, "%s no support for aiisp enable\n", __func__);
return -EINVAL;
}
priv_val = params_vdev->priv_val;
@@ -4637,6 +4671,26 @@ err:
return -ENOMEM;
}
static void
rkisp_params_get_bay3d_buffd_v39(struct rkisp_isp_params_vdev *params_vdev,
struct rkisp_bay3dbuf_info *bay3dbuf)
{
struct rkisp_isp_params_val_v39 *priv_val = params_vdev->priv_val;
struct rkisp_dummy_buffer *buf;
buf = &priv_val->buf_3dnr_iir;
if (rkisp_buf_get_fd(params_vdev->dev, buf, true) < 0)
return;
bay3dbuf->iir_fd = buf->dma_fd;
bay3dbuf->iir_size = buf->size;
buf = &priv_val->buf_gain;
if (rkisp_buf_get_fd(params_vdev->dev, buf, true) < 0)
return;
bay3dbuf->u.v39.gain_fd = buf->dma_fd;
bay3dbuf->u.v39.gain_size = buf->size;
}
static void
rkisp_params_stream_stop_v39(struct rkisp_isp_params_vdev *params_vdev)
{
@@ -4646,6 +4700,7 @@ rkisp_params_stream_stop_v39(struct rkisp_isp_params_vdev *params_vdev)
priv_val = (struct rkisp_isp_params_val_v39 *)params_vdev->priv_val;
rkisp_free_buffer(ispdev, &priv_val->buf_frm);
rkisp_free_buffer(ispdev, &priv_val->buf_gain);
rkisp_free_buffer(ispdev, &priv_val->buf_3dnr_iir);
rkisp_free_buffer(ispdev, &priv_val->buf_3dnr_cur);
for (i = 0; i < ISP39_3DLUT_BUF_NUM; i++)
@@ -4858,6 +4913,7 @@ static struct rkisp_isp_params_ops rkisp_isp_params_ops_tbl = {
.fop_release = rkisp_params_fop_release_v39,
.check_bigmode = rkisp_params_check_bigmode_v39,
.info2ddr_cfg = rkisp_params_info2ddr_cfg_v39,
.get_bay3d_buffd = rkisp_params_get_bay3d_buffd_v39,
};
int rkisp_init_params_vdev_v39(struct rkisp_isp_params_vdev *params_vdev)

View File

@@ -142,6 +142,7 @@ struct rkisp_isp_params_val_v39 {
u32 buf_info_cnt;
int buf_info_idx;
struct rkisp_dummy_buffer buf_gain;
struct rkisp_dummy_buffer buf_3dnr_iir;
struct rkisp_dummy_buffer buf_3dnr_cur;

View File

@@ -186,6 +186,8 @@
#define ISP32_ISP_DEBUG4 (ISP3X_ISP_BASE + 0x00254)
#define ISP32_YNR_LUMA_RCTRL (ISP3X_ISP_BASE + 0x00290)
#define ISP32_YNR_LUMA_RDATA (ISP3X_ISP_BASE + 0x00294)
#define ISP39_SLICE_ST_CTRL (ISP3X_ISP_BASE + 0x002a4)
#define ISP39_AIISP_LINE_CNT (ISP3X_ISP_BASE + 0x002a8)
#define ISP3X_FLASH_BASE 0x00000660
#define ISP3X_FLASH_CMD (ISP3X_FLASH_BASE + 0x00000)
@@ -673,6 +675,7 @@
#define ISP3X_MI_DBR_WR_LENGTH (ISP3X_MI_BASE + 0x00568)
#define ISP3X_MI_DBR_WR_BASE_SHD (ISP3X_MI_BASE + 0x0056C)
#define ISP3X_MI_DBR_RD_BASE (ISP3X_MI_BASE + 0x00570)
#define ISP39_AIISP_RD_BASE (ISP3X_MI_BASE + 0x00570)
#define ISP3X_MI_DBR_RD_LENGTH (ISP3X_MI_BASE + 0x00574)
#define ISP3X_MI_DBR_RD_BASE_SHD (ISP3X_MI_BASE + 0x00578)
#define ISP3X_MI_3A_WR_BASE (ISP3X_MI_BASE + 0x0057C)
@@ -2455,6 +2458,7 @@
#define ISP3X_LSC_LUT_ERR BIT(16)
#define ISP3X_FLASH_CAP BIT(17)
#define ISP3X_EXP_END BIT(18)
#define ISP39_AIISP_LINECNT_DONE BIT(18)
#define ISP3X_HDR_DONE BIT(20)
#define ISP3X_DHAZ_DONE BIT(21)
#define ISP3X_GIAN_ERR BIT(22)
@@ -2488,6 +2492,14 @@
#define ISP32_YNR_LUMA_RDBK_OFFS(a) (((a) & 0x3fff) << 16)
#define ISP32_YNR_LUMA_RDBK_RDY BIT(31)
#define ISP39_SLICE_ST BIT(0)
#define ISP39_SLICE_EN BIT(1)
#define ISP39_OUT_LINE(a) (((a) >> 16) & 0x3fff)
#define ISP39_SLICE_DONE BIT(31)
#define ISP39_AIISP_RD_LINECNT(x) ((x) >> 16)
#define ISP39_AIISP_WR_LINECNT(x) ((x) & 0xffff)
/* DUAL CROP */
#define ISP3X_DUAL_CROP_FBC_MODE BIT(8)
@@ -2580,6 +2592,10 @@
#define ISP3X_DBR_ST_MODE BIT(30)
#define ISP3X_DBR_ST BIT(31)
/* MI_RD_CTRL2 */
#define ISP39_AIISP_ST BIT(8)
#define ISP39_AIISP_EN BIT(9)
/* WR_OUTPUT_FORMAT */
#define ISP32_MI_OUTPUT_MASK GENMASK(10, 8)
#define ISP32_MI_OUTPUT_YUV400 0

View File

@@ -86,6 +86,7 @@
*/
static void rkisp_config_cmsk(struct rkisp_device *dev);
static void rkisp_config_aiisp(struct rkisp_device *dev);
static inline struct rkisp_device *sd_to_isp_dev(struct v4l2_subdev *sd)
{
@@ -639,6 +640,7 @@ void rkisp_trigger_read_back(struct rkisp_device *dev, u8 dma2frm, u32 mode, boo
dev->isp_sdev.quantization);
rkisp_params_cfg(params_vdev, cur_frame_id);
rkisp_config_cmsk(dev);
rkisp_config_aiisp(dev);
rkisp_stream_frame_start(dev, 0);
}
@@ -1795,6 +1797,7 @@ static int rkisp_config_isp(struct rkisp_device *dev)
}
rkisp_config_cmsk(dev);
rkisp_config_aiisp(dev);
return 0;
}
@@ -3438,13 +3441,10 @@ rkisp_isp_queue_event_sof(struct rkisp_isp_subdev *isp)
}
static int rkisp_isp_sd_subs_evt(struct v4l2_subdev *sd, struct v4l2_fh *fh,
struct v4l2_event_subscription *sub)
struct v4l2_event_subscription *sub)
{
if (sub->type != V4L2_EVENT_FRAME_SYNC)
return -EINVAL;
/* Line number. For now only zero accepted. */
if (sub->id != 0)
if (sub->type != V4L2_EVENT_FRAME_SYNC &&
sub->type != RKISP_V4L2_EVENT_AIISP_LINECNT)
return -EINVAL;
return v4l2_event_subscribe(fh, sub, ISP_V4L2_EVENT_ELEMS, NULL);
@@ -3553,6 +3553,139 @@ static int rkisp_set_work_mode_by_vicap(struct rkisp_device *isp_dev,
return 0;
}
static void rkisp_queue_event_aiisp(struct rkisp_device *dev, u32 irq)
{
struct v4l2_event ev = { 0 };
struct rkisp_aiisp_ev_info *ev_info;
u32 h = dev->isp_sdev.out_crop.height;
u32 val, wr_line, rd_line;
if (dev->isp_ver != ISP_V39)
return;
if (sizeof(*ev_info) > sizeof(ev.u)) {
v4l2_err(&dev->v4l2_dev, "aiisp_ev_info too large\n");
return;
}
ev_info = (struct rkisp_aiisp_ev_info *)ev.u.data;
val = rkisp_read(dev, ISP39_AIISP_LINE_CNT, false);
if (irq & ISP3X_OUT_FRM_QUARTER) {
rd_line = ISP39_AIISP_RD_LINECNT(val);
ev.id = RKISP_AIISP_RD_LINECNT_ID;
ev_info->height = !rd_line ? h : rd_line;
if (dev->aiisp_cfg.rd_mode) {
rd_line += dev->aiisp_cfg.rd_linecnt;
if (rd_line > h)
rd_line = h - 1;
rkisp_write(dev, ISP32_ISP_IRQ_CFG0, rd_line, true);
}
} else {
wr_line = ISP39_AIISP_WR_LINECNT(val);
ev.id = RKISP_AIISP_WR_LINECNT_ID;
ev_info->height = !wr_line ? h : wr_line;
if (dev->aiisp_cfg.wr_mode) {
wr_line += dev->aiisp_cfg.wr_linecnt;
if (wr_line > h)
wr_line = h - 1;
rkisp_write(dev, ISP32_ISP_IRQ_CFG1, wr_line << 16, true);
}
}
rkisp_dmarx_get_frame(dev, &ev_info->sequence, NULL, NULL, true);
ev.type = RKISP_V4L2_EVENT_AIISP_LINECNT;
v4l2_event_queue(dev->isp_sdev.sd.devnode, &ev);
v4l2_dbg(2, rkisp_debug, &dev->v4l2_dev,
"%s seq:%d ev.id:%d height:%d\n", __func__,
ev_info->sequence, ev.id, ev_info->height);
}
static void rkisp_config_aiisp(struct rkisp_device *dev)
{
unsigned long lock_flags = 0;
u32 wr_line, rd_line, irq, irq_mask, en, en_mask;
spin_lock_irqsave(&dev->aiisp_lock, lock_flags);
if (!dev->is_aiisp_upd)
goto unlock;
dev->is_aiisp_upd = false;
if (dev->is_aiisp_en) {
en = ISP39_AIISP_EN;
irq = ISP39_AIISP_LINECNT_DONE;
if (dev->aiisp_cfg.rd_linecnt)
irq |= ISP3X_OUT_FRM_QUARTER;
} else {
irq = 0;
en = 0;
}
irq_mask = ISP39_AIISP_LINECNT_DONE | ISP3X_OUT_FRM_QUARTER;
en_mask = ISP39_AIISP_EN;
rd_line = dev->aiisp_cfg.rd_linecnt;
wr_line = dev->aiisp_cfg.wr_linecnt << 16;
rkisp_write(dev, ISP32_ISP_IRQ_CFG0, rd_line, false);
rkisp_write(dev, ISP32_ISP_IRQ_CFG1, wr_line, false);
rkisp_write(dev, ISP39_SLICE_ST_CTRL, 0, false);
rkisp_set_bits(dev, CIF_ISP_IMSC, irq_mask, irq, false);
rkisp_set_bits(dev, ISP3X_MI_RD_CTRL2, en_mask, en, false);
unlock:
spin_unlock_irqrestore(&dev->aiisp_lock, lock_flags);
}
static int rkisp_set_aiisp_linecnt(struct rkisp_device *dev,
struct rkisp_aiisp_cfg *cfg)
{
unsigned long lock_flags = 0;
bool en = false;
if (dev->isp_ver != ISP_V39)
return -EINVAL;
spin_lock_irqsave(&dev->aiisp_lock, lock_flags);
if (cfg->wr_linecnt)
en = true;
if (en != dev->is_aiisp_en) {
dev->is_aiisp_en = en;
dev->is_aiisp_upd = true;
}
memcpy(&dev->aiisp_cfg, cfg, sizeof(*cfg));
spin_unlock_irqrestore(&dev->aiisp_lock, lock_flags);
return 0;
}
static int rkisp_get_aiisp_linecnt(struct rkisp_device *dev,
struct rkisp_aiisp_cfg *cfg)
{
unsigned long lock_flags = 0;
if (dev->isp_ver != ISP_V39)
return -EINVAL;
spin_lock_irqsave(&dev->aiisp_lock, lock_flags);
memcpy(cfg, &dev->aiisp_cfg, sizeof(*cfg));
spin_unlock_irqrestore(&dev->aiisp_lock, lock_flags);
return 0;
}
static void rkisp_aiisp_rd_start(struct rkisp_device *dev)
{
u32 val;
if (!dev->is_aiisp_en)
return;
val = rkisp_read(dev, ISP39_AIISP_LINE_CNT, true);
if (!ISP39_AIISP_RD_LINECNT(val)) {
if (dev->aiisp_cfg.rd_linecnt)
rkisp_write(dev, ISP39_SLICE_ST_CTRL, ISP39_SLICE_EN, true);
rkisp_set_bits(dev, ISP3X_MI_RD_CTRL2, 0, ISP39_AIISP_ST, true);
} else {
val = ISP39_SLICE_EN | ISP39_SLICE_ST;
rkisp_write(dev, ISP39_SLICE_ST_CTRL, val, true);
}
v4l2_dbg(2, rkisp_debug, &dev->v4l2_dev,
"%s 0x%x:0x%x\n", __func__, ISP39_AIISP_LINE_CNT, val);
}
static long rkisp_ioctl(struct v4l2_subdev *sd, unsigned int cmd, void *arg)
{
struct rkisp_device *isp_dev = sd_to_isp_dev(sd);
@@ -3567,7 +3700,8 @@ static long rkisp_ioctl(struct v4l2_subdev *sd, unsigned int cmd, void *arg)
if (!arg &&
(cmd != RKISP_CMD_FREE_SHARED_BUF &&
cmd != RKISP_CMD_MULTI_DEV_FORCE_ENUM))
cmd != RKISP_CMD_MULTI_DEV_FORCE_ENUM &&
cmd != RKISP_CMD_AIISP_RD_START))
return -EINVAL;
switch (cmd) {
@@ -3696,6 +3830,15 @@ static long rkisp_ioctl(struct v4l2_subdev *sd, unsigned int cmd, void *arg)
case RKISP_CMD_GET_BAY3D_BUFFD:
rkisp_params_get_bay3d_buffd(&isp_dev->params_vdev, arg);
break;
case RKISP_CMD_SET_AIISP_LINECNT:
ret = rkisp_set_aiisp_linecnt(isp_dev, arg);
break;
case RKISP_CMD_GET_AIISP_LINECNT:
ret = rkisp_get_aiisp_linecnt(isp_dev, arg);
break;
case RKISP_CMD_AIISP_RD_START:
rkisp_aiisp_rd_start(isp_dev);
break;
default:
ret = -ENOIOCTLCMD;
}
@@ -3715,7 +3858,8 @@ static long rkisp_compat_ioctl32(struct v4l2_subdev *sd,
if (!up &&
cmd != RKISP_CMD_FREE_SHARED_BUF &&
cmd != RKISP_CMD_MULTI_DEV_FORCE_ENUM)
cmd != RKISP_CMD_MULTI_DEV_FORCE_ENUM &&
cmd != RKISP_CMD_AIISP_RD_START)
return -EINVAL;
switch (cmd) {
@@ -3733,6 +3877,7 @@ static long rkisp_compat_ioctl32(struct v4l2_subdev *sd,
if (!IS_ENABLED(CONFIG_VIDEO_ROCKCHIP_THUNDER_BOOT_ISP))
return -ENOIOCTLCMD;
case RKISP_CMD_MULTI_DEV_FORCE_ENUM:
case RKISP_CMD_AIISP_RD_START:
break;
case RKISP_CMD_GET_LDCHBUF_INFO:
size = sizeof(struct rkisp_ldchbuf_info);
@@ -3775,6 +3920,14 @@ static long rkisp_compat_ioctl32(struct v4l2_subdev *sd,
size = sizeof(struct rkisp_bay3dbuf_info);
cp_t_us = true;
break;
case RKISP_CMD_SET_AIISP_LINECNT:
size = sizeof(struct rkisp_aiisp_cfg);
cp_f_us = true;
break;
case RKISP_CMD_GET_AIISP_LINECNT:
size = sizeof(struct rkisp_aiisp_cfg);
cp_t_us = true;
break;
default:
return -ENOIOCTLCMD;
}
@@ -3869,6 +4022,7 @@ int rkisp_register_isp_subdev(struct rkisp_device *isp_dev,
mutex_init(&isp_dev->buf_lock);
spin_lock_init(&isp_dev->cmsk_lock);
spin_lock_init(&isp_dev->rdbk_lock);
spin_lock_init(&isp_dev->aiisp_lock);
ret = kfifo_alloc(&isp_dev->rdbk_kfifo,
16 * sizeof(struct isp2x_csi_trigger), GFP_KERNEL);
if (ret < 0) {
@@ -4273,6 +4427,11 @@ vs_skip:
isp_mis_tmp);
}
if (isp_mis & ISP39_AIISP_LINECNT_DONE && dev->isp_ver == ISP_V39) {
writel(ISP39_AIISP_LINECNT_DONE, base + CIF_ISP_ICR);
rkisp_queue_event_aiisp(dev, isp_mis);
}
if ((isp_mis & (CIF_ISP_DATA_LOSS | CIF_ISP_PIC_SIZE_ERROR))) {
if ((isp_mis & CIF_ISP_PIC_SIZE_ERROR)) {
/* Clear pic_size_error */
@@ -4389,8 +4548,10 @@ vs_skip:
if ((isp_mis & CIF_ISP_FRAME) && dev->stats_vdev.rdbk_mode)
rkisp_stats_rdbk_enable(&dev->stats_vdev, false);
if (!IS_HDR_RDBK(dev->hdr.op_mode))
if (!IS_HDR_RDBK(dev->hdr.op_mode)) {
rkisp_config_aiisp(dev);
rkisp_config_cmsk(dev);
}
}
if (isp_mis & CIF_ISP_FRAME) {
@@ -4423,6 +4584,7 @@ vs_skip:
if (isp_mis & ISP3X_OUT_FRM_QUARTER) {
writel(ISP3X_OUT_FRM_QUARTER, base + CIF_ISP_ICR);
rkisp_queue_event_aiisp(dev, isp_mis);
rkisp_dvbm_event(dev, ISP3X_OUT_FRM_QUARTER);
}
if (isp_mis & ISP3X_OUT_FRM_HALF) {

View File

@@ -62,6 +62,15 @@
#define RKISP_CMD_GET_BAY3D_BUFFD \
_IOR('V', BASE_VIDIOC_PRIVATE + 15, struct rkisp_bay3dbuf_info)
#define RKISP_CMD_SET_AIISP_LINECNT \
_IOW('V', BASE_VIDIOC_PRIVATE + 16, struct rkisp_aiisp_cfg)
#define RKISP_CMD_GET_AIISP_LINECNT \
_IOR('V', BASE_VIDIOC_PRIVATE + 17, struct rkisp_aiisp_cfg)
#define RKISP_CMD_AIISP_RD_START \
_IO('V', BASE_VIDIOC_PRIVATE + 18)
/****************ISP VIDEO IOCTL******************************/
#define RKISP_CMD_GET_CSI_MEMORY_MODE \
@@ -108,8 +117,11 @@
#define RKISP_CMD_SET_EXPANDER \
_IOW('V', BASE_VIDIOC_PRIVATE + 114, struct rkmodule_hdr_cfg)
/*************************************************************/
/**********************EVENT_PRIVATE***************************/
#define RKISP_V4L2_EVENT_AIISP_LINECNT (V4L2_EVENT_PRIVATE_START + 1)
/*************************************************************/
#define ISP2X_ID_DPCC (0)
#define ISP2X_ID_BLS (1)
#define ISP2X_ID_SDG (2)
@@ -325,6 +337,27 @@ struct isp2x_mesh_head {
__u32 data_oft;
} __attribute__ ((packed));
#define RKISP_AIISP_WR_LINECNT_ID 0
#define RKISP_AIISP_RD_LINECNT_ID 1
struct rkisp_aiisp_ev_info {
int sequence;
int height;
} __attribute__ ((packed));
/* struct rkisp_aiisp_cfg
* wr_mode: 0: only one RKISP_AIISP_WR_LINECNT_ID event, else event per wr_linecnt
* rd_mode: 0: only one RKISP_AIISP_RD_LINECNT_ID event, else event per rd_linecnt
* wr_linecnt: aiisp write irq line, 0 isn't RKISP_AIISP_WR_LINECNT_ID event, and aiisp no enable
* rd_linecnt: aiisp read irq line, 0 isn't RKISP_AIISP_RD_LINECNT_ID event
*/
struct rkisp_aiisp_cfg {
char wr_mode;
char rd_mode;
int wr_linecnt;
int rd_linecnt;
} __attribute__ ((packed));
struct rkisp_bay3dbuf_info {
int iir_fd;
int iir_size;
@@ -339,6 +372,10 @@ struct rkisp_bay3dbuf_info {
int ds_fd;
int ds_size;
} v32;
struct {
int gain_fd;
int gain_size;
} v39;
} u;
} __attribute__ ((packed));