From 79028a4b3b07394a899b2f3943330938cbe92216 Mon Sep 17 00:00:00 2001 From: "dalon.zhang" Date: Wed, 28 Jan 2015 10:12:32 +0800 Subject: [PATCH] rk312x: fix usb otg camera issues --- drivers/media/usb/uvc/uvc_video.c | 2 ++ drivers/media/v4l2-core/videobuf2-core.c | 16 ++++++++++++++++ 2 files changed, 18 insertions(+) diff --git a/drivers/media/usb/uvc/uvc_video.c b/drivers/media/usb/uvc/uvc_video.c index 956ebb96292a..72333f258fbc 100755 --- a/drivers/media/usb/uvc/uvc_video.c +++ b/drivers/media/usb/uvc/uvc_video.c @@ -1048,6 +1048,7 @@ static int uvc_video_decode_start(struct uvc_streaming *stream, uvc_trace(UVC_TRACE_FRAME, "Frame complete (FID bit " "toggled).\n"); buf->state = UVC_BUF_STATE_READY; + buf->error = 1; return -EAGAIN; } @@ -1076,6 +1077,7 @@ static void uvc_video_decode_data(struct uvc_streaming *stream, if (len > maxlen) { uvc_trace(UVC_TRACE_FRAME, "Frame complete (overflow).\n"); buf->state = UVC_BUF_STATE_READY; + buf->error = 1; } } diff --git a/drivers/media/v4l2-core/videobuf2-core.c b/drivers/media/v4l2-core/videobuf2-core.c index e3bdc3be91e1..440872ad4985 100644 --- a/drivers/media/v4l2-core/videobuf2-core.c +++ b/drivers/media/v4l2-core/videobuf2-core.c @@ -1383,6 +1383,7 @@ EXPORT_SYMBOL_GPL(vb2_qbuf); */ static int __vb2_wait_for_done_vb(struct vb2_queue *q, int nonblocking) { + int count = 0; /* * All operations on vb_done_list are performed under done_lock * spinlock protection. However, buffers may be removed from @@ -1424,18 +1425,33 @@ static int __vb2_wait_for_done_vb(struct vb2_queue *q, int nonblocking) * All locks have been released, it is safe to sleep now. */ dprintk(3, "Will sleep waiting for buffers\n"); + /* ret = wait_event_interruptible(q->done_wq, !list_empty(&q->done_list) || !q->streaming); + */ + + ret = wait_event_interruptible_timeout(q->done_wq, + !list_empty(&q->done_list) || !q->streaming, msecs_to_jiffies(500)); /* * We need to reevaluate both conditions again after reacquiring * the locks or return an error if one occurred. */ call_qop(q, wait_finish, q); + /* if (ret) { dprintk(1, "Sleep was interrupted\n"); return ret; } + */ + if (ret < 0) { + dprintk(1, "Sleep was interrupted\n"); + return ret; + } else if (ret == 0) { + count ++; + if(count >= 5) + return -EIO; + } } return 0; } -- 2.34.1