rk312x: fix usb otg camera issues
authordalon.zhang <dalon.zhang@rock-chips.com>
Wed, 28 Jan 2015 02:12:32 +0000 (10:12 +0800)
committerdalon.zhang <dalon.zhang@rock-chips.com>
Wed, 28 Jan 2015 02:12:32 +0000 (10:12 +0800)
drivers/media/usb/uvc/uvc_video.c
drivers/media/v4l2-core/videobuf2-core.c

index 956ebb96292aec5a0851ccecc265e38e305af3b1..72333f258fbc03769f705ddb0037b665f992dd75 100755 (executable)
@@ -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;
        }
 }
 
index e3bdc3be91e12822bcf92c4538433522a2aaa886..440872ad4985b264698c97a82ac434b0772b3226 100644 (file)
@@ -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;
 }