diff options
author | Guoniu.Zhou <guoniu.zhou@nxp.com> | 2019-03-19 17:29:01 +0800 |
---|---|---|
committer | Guoniu.Zhou <guoniu.zhou@nxp.com> | 2019-03-26 09:36:01 +0800 |
commit | 908bd97c03a8ed3d3be18bdbcf41af25d38c2e77 (patch) | |
tree | 313bf304db37d09601b41555b043a72d49be4925 /drivers/media | |
parent | 117dbcb1ce258587f8d162c0b3219f32d6de6fbc (diff) |
MLK-20694: media: m2m: add control for querying minimum buffer for capture and output
Add V4L2_CID_MIN_BUFFERS_FOR_CAPTURE and V4L2_CID_MIN_BUFFERS_FOR_OUTPUT control
ID for querying minimum buffer for capture and output
Signed-off-by: Guoniu.Zhou <guoniu.zhou@nxp.com>
Diffstat (limited to 'drivers/media')
-rw-r--r-- | drivers/media/platform/imx8/mxc-isi-core.h | 4 | ||||
-rw-r--r-- | drivers/media/platform/imx8/mxc-isi-m2m.c | 33 |
2 files changed, 37 insertions, 0 deletions
diff --git a/drivers/media/platform/imx8/mxc-isi-core.h b/drivers/media/platform/imx8/mxc-isi-core.h index c26060c0870d..7142aa99a544 100644 --- a/drivers/media/platform/imx8/mxc-isi-core.h +++ b/drivers/media/platform/imx8/mxc-isi-core.h @@ -173,6 +173,8 @@ struct mxc_isi_ctrls { struct v4l2_ctrl *hflip; struct v4l2_ctrl *vflip; struct v4l2_ctrl *alpha; + struct v4l2_ctrl *num_cap_buf; + struct v4l2_ctrl *num_out_buf; bool ready; }; @@ -291,6 +293,8 @@ struct mxc_isi_dev { u32 interface[MAX_PORTS]; u32 flags; u32 skip_m2m; + u32 req_cap_buf_num; + u32 req_out_buf_num; u8 chain_buf; atomic_t open_count; diff --git a/drivers/media/platform/imx8/mxc-isi-m2m.c b/drivers/media/platform/imx8/mxc-isi-m2m.c index 709ea0a19887..2774cb3c6655 100644 --- a/drivers/media/platform/imx8/mxc-isi-m2m.c +++ b/drivers/media/platform/imx8/mxc-isi-m2m.c @@ -187,12 +187,14 @@ static int m2m_vb2_queue_setup(struct vb2_queue *q, return -EINVAL; } frame = &mxc_isi->m2m.dst_f; + mxc_isi->req_cap_buf_num = *num_buffers; } else { if (*num_buffers < 1) { dev_err(dev, "%s at least need one buffer\n", __func__); return -EINVAL; } frame = &mxc_isi->m2m.src_f; + mxc_isi->req_out_buf_num = *num_buffers; } fmt = frame->fmt; @@ -935,8 +937,35 @@ unlock: return ret; } +static int mxc_isi_m2m_g_ctrl(struct v4l2_ctrl *ctrl) +{ + struct mxc_isi_dev *mxc_isi = ctrl_to_mxc_isi_m2m(ctrl); + unsigned long flags; + int ret = 0; + + spin_lock_irqsave(&mxc_isi->slock, flags); + + switch (ctrl->id) { + case V4L2_CID_MIN_BUFFERS_FOR_CAPTURE: + ctrl->val = mxc_isi->req_cap_buf_num; + break; + case V4L2_CID_MIN_BUFFERS_FOR_OUTPUT: + ctrl->val = mxc_isi->req_out_buf_num; + break; + default: + dev_err(&mxc_isi->pdev->dev, "%s: Not support %d CID\n", + __func__, ctrl->id); + ret = -EINVAL; + } + + spin_unlock_irqrestore(&mxc_isi->slock, flags); + return ret; + +} + static const struct v4l2_ctrl_ops mxc_isi_m2m_ctrl_ops = { .s_ctrl = mxc_isi_m2m_s_ctrl, + .g_volatile_ctrl = mxc_isi_m2m_g_ctrl, }; static int mxc_isi_m2m_ctrls_create(struct mxc_isi_dev *mxc_isi) @@ -955,6 +984,10 @@ static int mxc_isi_m2m_ctrls_create(struct mxc_isi_dev *mxc_isi) V4L2_CID_VFLIP, 0, 1, 1, 0); ctrls->alpha = v4l2_ctrl_new_std(handler, &mxc_isi_m2m_ctrl_ops, V4L2_CID_ALPHA_COMPONENT, 0, 0xff, 1, 0); + ctrls->num_cap_buf = v4l2_ctrl_new_std(handler, &mxc_isi_m2m_ctrl_ops, + V4L2_CID_MIN_BUFFERS_FOR_CAPTURE, 3, 16, 1, 3); + ctrls->num_out_buf = v4l2_ctrl_new_std(handler, &mxc_isi_m2m_ctrl_ops, + V4L2_CID_MIN_BUFFERS_FOR_OUTPUT, 1, 16, 1, 1); if (!handler->error) ctrls->ready = true; |