media: rockchip: ispp: add trigger mode ioctl

sync trigger on/off status with user

Change-Id: Ifc567cc760f5fc106644ce80a6a96c7c5fc1afd2
Signed-off-by: Cai YiWei <cyw@rock-chips.com>
This commit is contained in:
Cai YiWei
2021-01-15 17:33:40 +08:00
committed by Tao Huang
parent 5358e9d0b6
commit 8ad3589e44
4 changed files with 33 additions and 1 deletions

View File

@@ -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;
}

View File

@@ -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)

View File

@@ -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);

View File

@@ -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;