Commit 571e70db authored by Kieran Bingham's avatar Kieran Bingham Committed by Mauro Carvalho Chehab

media: uvcvideo: Split uvc_video_enable into two

uvc_video_enable() is used both to start and stop the video stream
object, however the single function entry point shares no code between
the two operations.

Split the function into two distinct calls, and rename to
uvc_video_start_streaming() and uvc_video_stop_streaming() as
appropriate.
Signed-off-by: default avatarKieran Bingham <kieran.bingham@ideasonboard.com>
Signed-off-by: default avatarLaurent Pinchart <laurent.pinchart@ideasonboard.com>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab+samsung@kernel.org>
parent b012186a
...@@ -176,7 +176,7 @@ static int uvc_start_streaming(struct vb2_queue *vq, unsigned int count) ...@@ -176,7 +176,7 @@ static int uvc_start_streaming(struct vb2_queue *vq, unsigned int count)
queue->buf_used = 0; queue->buf_used = 0;
ret = uvc_video_enable(stream, 1); ret = uvc_video_start_streaming(stream);
if (ret == 0) if (ret == 0)
return 0; return 0;
...@@ -194,7 +194,7 @@ static void uvc_stop_streaming(struct vb2_queue *vq) ...@@ -194,7 +194,7 @@ static void uvc_stop_streaming(struct vb2_queue *vq)
lockdep_assert_irqs_enabled(); lockdep_assert_irqs_enabled();
if (vq->type != V4L2_BUF_TYPE_META_CAPTURE) if (vq->type != V4L2_BUF_TYPE_META_CAPTURE)
uvc_video_enable(uvc_queue_to_stream(queue), 0); uvc_video_stop_streaming(uvc_queue_to_stream(queue));
spin_lock_irq(&queue->irqlock); spin_lock_irq(&queue->irqlock);
uvc_queue_return_buffers(queue, UVC_BUF_STATE_ERROR); uvc_queue_return_buffers(queue, UVC_BUF_STATE_ERROR);
......
...@@ -2076,38 +2076,10 @@ int uvc_video_init(struct uvc_streaming *stream) ...@@ -2076,38 +2076,10 @@ int uvc_video_init(struct uvc_streaming *stream)
return 0; return 0;
} }
/* int uvc_video_start_streaming(struct uvc_streaming *stream)
* Enable or disable the video stream.
*/
int uvc_video_enable(struct uvc_streaming *stream, int enable)
{ {
int ret; int ret;
if (!enable) {
uvc_uninit_video(stream, 1);
if (stream->intf->num_altsetting > 1) {
usb_set_interface(stream->dev->udev,
stream->intfnum, 0);
} else {
/* UVC doesn't specify how to inform a bulk-based device
* when the video stream is stopped. Windows sends a
* CLEAR_FEATURE(HALT) request to the video streaming
* bulk endpoint, mimic the same behaviour.
*/
unsigned int epnum = stream->header.bEndpointAddress
& USB_ENDPOINT_NUMBER_MASK;
unsigned int dir = stream->header.bEndpointAddress
& USB_ENDPOINT_DIR_MASK;
unsigned int pipe;
pipe = usb_sndbulkpipe(stream->dev->udev, epnum) | dir;
usb_clear_halt(stream->dev->udev, pipe);
}
uvc_video_clock_cleanup(stream);
return 0;
}
ret = uvc_video_clock_init(stream); ret = uvc_video_clock_init(stream);
if (ret < 0) if (ret < 0)
return ret; return ret;
...@@ -2130,3 +2102,28 @@ int uvc_video_enable(struct uvc_streaming *stream, int enable) ...@@ -2130,3 +2102,28 @@ int uvc_video_enable(struct uvc_streaming *stream, int enable)
return ret; return ret;
} }
void uvc_video_stop_streaming(struct uvc_streaming *stream)
{
uvc_uninit_video(stream, 1);
if (stream->intf->num_altsetting > 1) {
usb_set_interface(stream->dev->udev, stream->intfnum, 0);
} else {
/* UVC doesn't specify how to inform a bulk-based device
* when the video stream is stopped. Windows sends a
* CLEAR_FEATURE(HALT) request to the video streaming
* bulk endpoint, mimic the same behaviour.
*/
unsigned int epnum = stream->header.bEndpointAddress
& USB_ENDPOINT_NUMBER_MASK;
unsigned int dir = stream->header.bEndpointAddress
& USB_ENDPOINT_DIR_MASK;
unsigned int pipe;
pipe = usb_sndbulkpipe(stream->dev->udev, epnum) | dir;
usb_clear_halt(stream->dev->udev, pipe);
}
uvc_video_clock_cleanup(stream);
}
...@@ -787,7 +787,8 @@ void uvc_mc_cleanup_entity(struct uvc_entity *entity); ...@@ -787,7 +787,8 @@ void uvc_mc_cleanup_entity(struct uvc_entity *entity);
int uvc_video_init(struct uvc_streaming *stream); int uvc_video_init(struct uvc_streaming *stream);
int uvc_video_suspend(struct uvc_streaming *stream); int uvc_video_suspend(struct uvc_streaming *stream);
int uvc_video_resume(struct uvc_streaming *stream, int reset); int uvc_video_resume(struct uvc_streaming *stream, int reset);
int uvc_video_enable(struct uvc_streaming *stream, int enable); int uvc_video_start_streaming(struct uvc_streaming *stream);
void uvc_video_stop_streaming(struct uvc_streaming *stream);
int uvc_probe_video(struct uvc_streaming *stream, int uvc_probe_video(struct uvc_streaming *stream,
struct uvc_streaming_control *probe); struct uvc_streaming_control *probe);
int uvc_query_ctrl(struct uvc_device *dev, u8 query, u8 unit, int uvc_query_ctrl(struct uvc_device *dev, u8 query, u8 unit,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment