diff --git a/drivers/media/platform/rockchip/ispp/ispp.c b/drivers/media/platform/rockchip/ispp/ispp.c index 9ee64a433b4a..18b58e4885c6 100644 --- a/drivers/media/platform/rockchip/ispp/ispp.c +++ b/drivers/media/platform/rockchip/ispp/ispp.c @@ -405,6 +405,9 @@ static long rkispp_ioctl(struct v4l2_subdev *sd, unsigned int cmd, void *arg) case RKISPP_CMD_GET_TNRBUF_FD: ret = rkispp_get_tnrbuf_fd(ispp_dev, (struct rkispp_buf_idxfd *)arg); break; + case RKISPP_CMD_TRIGGER_MODE: + rkispp_set_trigger_mode(ispp_dev, (struct rkispp_trigger_mode *)arg); + break; default: ret = -ENOIOCTLCMD; } @@ -421,6 +424,7 @@ static long rkispp_compat_ioctl32(struct v4l2_subdev *sd, struct rkispp_fecbuf_size fecsize; struct rkispp_tnr_inf tnr_inf; struct rkispp_buf_idxfd idxfd; + struct rkispp_trigger_mode t_mode; long ret = 0; if (!up) @@ -447,6 +451,11 @@ static long rkispp_compat_ioctl32(struct v4l2_subdev *sd, if (!ret) ret = copy_to_user(up, &idxfd, sizeof(idxfd)); break; + case RKISPP_CMD_TRIGGER_MODE: + ret = copy_from_user(&t_mode, up, sizeof(t_mode)); + if (!ret) + ret = rkispp_ioctl(sd, cmd, &t_mode); + break; default: ret = -ENOIOCTLCMD; } diff --git a/drivers/media/platform/rockchip/ispp/stream.c b/drivers/media/platform/rockchip/ispp/stream.c index fbb53d65224c..9b70caba5a09 100644 --- a/drivers/media/platform/rockchip/ispp/stream.c +++ b/drivers/media/platform/rockchip/ispp/stream.c @@ -588,6 +588,7 @@ static void tnr_free_buf(struct rkispp_device *dev) rkispp_free_buffer(dev, &vdev->tnr.buf.iir + i); vdev->tnr.is_but_init = false; + vdev->tnr.is_trigger = false; } static int tnr_init_buf(struct rkispp_device *dev, @@ -2699,7 +2700,7 @@ static void tnr_work_event(struct rkispp_device *dev, if (vdev->tnr.cur_wr) { struct rkispp_tnr_inf tnr_inf; - if (!vdev->tnr.cur_wr->is_move_judge) { + if (!vdev->tnr.cur_wr->is_move_judge || !vdev->tnr.is_trigger) { /* tnr write buf to nr */ rkispp_module_work_event(dev, vdev->tnr.cur_wr, NULL, ISPP_MODULE_NR, is_isr); @@ -3027,6 +3028,15 @@ void rkispp_sendbuf_to_nr(struct rkispp_device *dev, spin_unlock_irqrestore(&vdev->tnr.buf_lock, lock_flags); } +void rkispp_set_trigger_mode(struct rkispp_device *dev, + struct rkispp_trigger_mode *mode) +{ + struct rkispp_stream_vdev *vdev = &dev->stream_vdev; + + if (mode->module & ISPP_MODULE_TNR) + vdev->tnr.is_trigger = mode->on; +} + void rkispp_module_work_event(struct rkispp_device *dev, void *buf_rd, void *buf_wr, u32 module, bool is_isr) diff --git a/drivers/media/platform/rockchip/ispp/stream.h b/drivers/media/platform/rockchip/ispp/stream.h index 1c92d1006c75..7c1ab80f305a 100644 --- a/drivers/media/platform/rockchip/ispp/stream.h +++ b/drivers/media/platform/rockchip/ispp/stream.h @@ -103,6 +103,7 @@ struct tnr_module { bool is_end; bool is_3to1; bool is_but_init; + bool is_trigger; }; struct nr_module { @@ -231,6 +232,8 @@ struct rkispp_stream_vdev { int rkispp_get_tnrbuf_fd(struct rkispp_device *dev, struct rkispp_buf_idxfd *idxfd); void rkispp_sendbuf_to_nr(struct rkispp_device *dev, struct rkispp_tnr_inf *tnr_inf); +void rkispp_set_trigger_mode(struct rkispp_device *dev, + struct rkispp_trigger_mode *mode); void rkispp_module_work_event(struct rkispp_device *dev, void *buf_rd, void *buf_wr, u32 module, bool is_isr); diff --git a/include/uapi/linux/rkispp-config.h b/include/uapi/linux/rkispp-config.h index a8444a68d91d..1c4f3ab4fb46 100644 --- a/include/uapi/linux/rkispp-config.h +++ b/include/uapi/linux/rkispp-config.h @@ -83,6 +83,7 @@ #define TNR_BUF_IDXFD_NUM 64 +/************VIDIOC_PRIVATE*************/ #define RKISPP_CMD_GET_FECBUF_INFO \ _IOR('V', BASE_VIDIOC_PRIVATE + 0, struct rkispp_fecbuf_info) @@ -98,6 +99,10 @@ #define RKISPP_CMD_GET_TNRBUF_FD \ _IOR('V', BASE_VIDIOC_PRIVATE + 12, struct rkispp_buf_idxfd) +#define RKISPP_CMD_TRIGGER_MODE \ + _IOW('V', BASE_VIDIOC_PRIVATE + 13, struct rkispp_trigger_mode) + +/************EVENT_PRIVATE**************/ #define RKISPP_V4L2_EVENT_TNR_COMPLETE \ (V4L2_EVENT_PRIVATE_START + 3) @@ -129,6 +134,11 @@ struct rkispp_buf_idxfd { s32 dmafd[TNR_BUF_IDXFD_NUM]; } __attribute__ ((packed)); +struct rkispp_trigger_mode { + u32 module; + u32 on; +} __attribute__ ((packed)); + struct rkispp_tnr_config { u8 opty_en; u8 optc_en;