mirror of
https://github.com/torvalds/linux.git
synced 2026-05-31 10:33:41 +02:00
media: omap3isp: implement create/prepare_bufs
Add missing ioctls. This makes v4l2-compliance happier: warn: v4l2-test-buffers.cpp(813): VIDIOC_CREATE_BUFS not supported test VIDIOC_REQBUFS/CREATE_BUFS/QUERYBUF: OK Signed-off-by: Hans Verkuil <hverkuil+cisco@kernel.org> Acked-by: Sakari Ailus <sakari.ailus@linux.intel.com>
This commit is contained in:
parent
93ee7d61dc
commit
5c1f16ec60
|
|
@ -329,6 +329,13 @@ static int isp_video_queue_setup(struct vb2_queue *queue,
|
|||
struct isp_video_fh *vfh = vb2_get_drv_priv(queue);
|
||||
struct isp_video *video = vfh->video;
|
||||
|
||||
if (*num_planes) {
|
||||
if (*num_planes != 1)
|
||||
return -EINVAL;
|
||||
if (sizes[0] < vfh->format.fmt.pix.sizeimage)
|
||||
return -EINVAL;
|
||||
return 0;
|
||||
}
|
||||
*num_planes = 1;
|
||||
|
||||
sizes[0] = vfh->format.fmt.pix.sizeimage;
|
||||
|
|
@ -344,6 +351,7 @@ static int isp_video_buffer_prepare(struct vb2_buffer *buf)
|
|||
{
|
||||
struct vb2_v4l2_buffer *vbuf = to_vb2_v4l2_buffer(buf);
|
||||
struct isp_video_fh *vfh = vb2_get_drv_priv(buf->vb2_queue);
|
||||
unsigned int size = vfh->format.fmt.pix.sizeimage;
|
||||
struct isp_buffer *buffer = to_isp_buffer(vbuf);
|
||||
struct isp_video *video = vfh->video;
|
||||
dma_addr_t addr;
|
||||
|
|
@ -364,8 +372,13 @@ static int isp_video_buffer_prepare(struct vb2_buffer *buf)
|
|||
return -EINVAL;
|
||||
}
|
||||
|
||||
vb2_set_plane_payload(&buffer->vb.vb2_buf, 0,
|
||||
vfh->format.fmt.pix.sizeimage);
|
||||
if (vb2_plane_size(&buffer->vb.vb2_buf, 0) < size) {
|
||||
dev_dbg(video->isp->dev,
|
||||
"data will not fit into plane (%lu < %u)\n",
|
||||
vb2_plane_size(&buffer->vb.vb2_buf, 0), size);
|
||||
return -EINVAL;
|
||||
}
|
||||
vb2_set_plane_payload(&buffer->vb.vb2_buf, 0, size);
|
||||
buffer->dma = addr;
|
||||
|
||||
return 0;
|
||||
|
|
@ -935,6 +948,20 @@ isp_video_reqbufs(struct file *file, void *fh, struct v4l2_requestbuffers *rb)
|
|||
return ret;
|
||||
}
|
||||
|
||||
static int
|
||||
isp_video_create_bufs(struct file *file, void *fh, struct v4l2_create_buffers *p)
|
||||
{
|
||||
struct isp_video_fh *vfh = file_to_isp_video_fh(file);
|
||||
struct isp_video *video = video_drvdata(file);
|
||||
int ret;
|
||||
|
||||
mutex_lock(&video->queue_lock);
|
||||
ret = vb2_create_bufs(&vfh->queue, p);
|
||||
mutex_unlock(&video->queue_lock);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int
|
||||
isp_video_querybuf(struct file *file, void *fh, struct v4l2_buffer *b)
|
||||
{
|
||||
|
|
@ -949,6 +976,20 @@ isp_video_querybuf(struct file *file, void *fh, struct v4l2_buffer *b)
|
|||
return ret;
|
||||
}
|
||||
|
||||
static int
|
||||
isp_video_prepare_buf(struct file *file, void *fh, struct v4l2_buffer *b)
|
||||
{
|
||||
struct isp_video_fh *vfh = file_to_isp_video_fh(file);
|
||||
struct isp_video *video = video_drvdata(file);
|
||||
int ret;
|
||||
|
||||
mutex_lock(&video->queue_lock);
|
||||
ret = vb2_prepare_buf(&vfh->queue, video->video.v4l2_dev->mdev, b);
|
||||
mutex_unlock(&video->queue_lock);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int
|
||||
isp_video_qbuf(struct file *file, void *fh, struct v4l2_buffer *b)
|
||||
{
|
||||
|
|
@ -1303,7 +1344,9 @@ static const struct v4l2_ioctl_ops isp_video_ioctl_ops = {
|
|||
.vidioc_g_parm = isp_video_get_param,
|
||||
.vidioc_s_parm = isp_video_set_param,
|
||||
.vidioc_reqbufs = isp_video_reqbufs,
|
||||
.vidioc_create_bufs = isp_video_create_bufs,
|
||||
.vidioc_querybuf = isp_video_querybuf,
|
||||
.vidioc_prepare_buf = isp_video_prepare_buf,
|
||||
.vidioc_qbuf = isp_video_qbuf,
|
||||
.vidioc_dqbuf = isp_video_dqbuf,
|
||||
.vidioc_streamon = isp_video_streamon,
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user