Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit a11a03e5 authored by Laurent Pinchart's avatar Laurent Pinchart Committed by Mauro Carvalho Chehab
Browse files

[media] uvcvideo: Implement vb2 queue start and stop stream operations



To work propertly the videobuf2 core code needs to be in charge of
stream start/stop control. Implement the start_streaming and
stop_streaming vb2 operations and move video enable/disable code to
them.

Signed-off-by: default avatarLaurent Pinchart <laurent.pinchart@ideasonboard.com>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab@osg.samsung.com>
parent bc75d5a0
Loading
Loading
Loading
Loading
+28 −15
Original line number Original line Diff line number Diff line
@@ -135,6 +135,29 @@ static void uvc_wait_finish(struct vb2_queue *vq)
	mutex_lock(&queue->mutex);
	mutex_lock(&queue->mutex);
}
}


static int uvc_start_streaming(struct vb2_queue *vq, unsigned int count)
{
	struct uvc_video_queue *queue = vb2_get_drv_priv(vq);
	struct uvc_streaming *stream = uvc_queue_to_stream(queue);

	queue->buf_used = 0;

	return uvc_video_enable(stream, 1);
}

static void uvc_stop_streaming(struct vb2_queue *vq)
{
	struct uvc_video_queue *queue = vb2_get_drv_priv(vq);
	struct uvc_streaming *stream = uvc_queue_to_stream(queue);
	unsigned long flags;

	uvc_video_enable(stream, 0);

	spin_lock_irqsave(&queue->irqlock, flags);
	INIT_LIST_HEAD(&queue->irqqueue);
	spin_unlock_irqrestore(&queue->irqlock, flags);
}

static struct vb2_ops uvc_queue_qops = {
static struct vb2_ops uvc_queue_qops = {
	.queue_setup = uvc_queue_setup,
	.queue_setup = uvc_queue_setup,
	.buf_prepare = uvc_buffer_prepare,
	.buf_prepare = uvc_buffer_prepare,
@@ -142,6 +165,8 @@ static struct vb2_ops uvc_queue_qops = {
	.buf_finish = uvc_buffer_finish,
	.buf_finish = uvc_buffer_finish,
	.wait_prepare = uvc_wait_prepare,
	.wait_prepare = uvc_wait_prepare,
	.wait_finish = uvc_wait_finish,
	.wait_finish = uvc_wait_finish,
	.start_streaming = uvc_start_streaming,
	.stop_streaming = uvc_stop_streaming,
};
};


int uvc_queue_init(struct uvc_video_queue *queue, enum v4l2_buf_type type,
int uvc_queue_init(struct uvc_video_queue *queue, enum v4l2_buf_type type,
@@ -310,27 +335,15 @@ int uvc_queue_allocated(struct uvc_video_queue *queue)
 */
 */
int uvc_queue_enable(struct uvc_video_queue *queue, int enable)
int uvc_queue_enable(struct uvc_video_queue *queue, int enable)
{
{
	unsigned long flags;
	int ret;
	int ret;


	mutex_lock(&queue->mutex);
	mutex_lock(&queue->mutex);
	if (enable) {
		ret = vb2_streamon(&queue->queue, queue->queue.type);
		if (ret < 0)
			goto done;


		queue->buf_used = 0;
	if (enable)
	} else {
		ret = vb2_streamon(&queue->queue, queue->queue.type);
	else
		ret = vb2_streamoff(&queue->queue, queue->queue.type);
		ret = vb2_streamoff(&queue->queue, queue->queue.type);
		if (ret < 0)
			goto done;

		spin_lock_irqsave(&queue->irqlock, flags);
		INIT_LIST_HEAD(&queue->irqqueue);
		spin_unlock_irqrestore(&queue->irqlock, flags);
	}


done:
	mutex_unlock(&queue->mutex);
	mutex_unlock(&queue->mutex);
	return ret;
	return ret;
}
}
+0 −10
Original line number Original line Diff line number Diff line
@@ -531,7 +531,6 @@ static int uvc_v4l2_release(struct file *file)


	/* Only free resources if this is a privileged handle. */
	/* Only free resources if this is a privileged handle. */
	if (uvc_has_privileges(handle)) {
	if (uvc_has_privileges(handle)) {
		uvc_video_enable(stream, 0);
		uvc_queue_enable(&stream->queue, 0);
		uvc_queue_enable(&stream->queue, 0);
		uvc_free_buffers(&stream->queue);
		uvc_free_buffers(&stream->queue);
	}
	}
@@ -768,14 +767,6 @@ static int uvc_ioctl_streamon(struct file *file, void *fh,


	mutex_lock(&stream->mutex);
	mutex_lock(&stream->mutex);
	ret = uvc_queue_enable(&stream->queue, 1);
	ret = uvc_queue_enable(&stream->queue, 1);
	if (ret < 0)
		goto done;

	ret = uvc_video_enable(stream, 1);
	if (ret < 0)
		uvc_queue_enable(&stream->queue, 0);

done:
	mutex_unlock(&stream->mutex);
	mutex_unlock(&stream->mutex);


	return ret;
	return ret;
@@ -794,7 +785,6 @@ static int uvc_ioctl_streamoff(struct file *file, void *fh,
		return -EBUSY;
		return -EBUSY;


	mutex_lock(&stream->mutex);
	mutex_lock(&stream->mutex);
	uvc_video_enable(stream, 0);
	uvc_queue_enable(&stream->queue, 0);
	uvc_queue_enable(&stream->queue, 0);
	mutex_unlock(&stream->mutex);
	mutex_unlock(&stream->mutex);