|
|
@@ -439,7 +439,7 @@ static ssize_t hdpvr_read(struct file *file, char __user *buffer, size_t count,
|
|
|
/* wait for the first buffer */
|
|
|
if (!(file->f_flags & O_NONBLOCK)) {
|
|
|
if (wait_event_interruptible(dev->wait_data,
|
|
|
- hdpvr_get_next_buffer(dev)))
|
|
|
+ !list_empty_careful(&dev->rec_buff_list)))
|
|
|
return -ERESTARTSYS;
|
|
|
}
|
|
|
|
|
|
@@ -465,10 +465,17 @@ static ssize_t hdpvr_read(struct file *file, char __user *buffer, size_t count,
|
|
|
goto err;
|
|
|
}
|
|
|
if (!err) {
|
|
|
- v4l2_dbg(MSG_INFO, hdpvr_debug, &dev->v4l2_dev,
|
|
|
- "timeout: restart streaming\n");
|
|
|
+ v4l2_info(&dev->v4l2_dev,
|
|
|
+ "timeout: restart streaming\n");
|
|
|
+ mutex_lock(&dev->io_mutex);
|
|
|
hdpvr_stop_streaming(dev);
|
|
|
- msecs_to_jiffies(4000);
|
|
|
+ mutex_unlock(&dev->io_mutex);
|
|
|
+ /*
|
|
|
+ * The FW needs about 4 seconds after streaming
|
|
|
+ * stopped before it is ready to restart
|
|
|
+ * streaming.
|
|
|
+ */
|
|
|
+ msleep(4000);
|
|
|
err = hdpvr_start_streaming(dev);
|
|
|
if (err) {
|
|
|
ret = err;
|
|
|
@@ -1133,9 +1140,7 @@ static void hdpvr_device_release(struct video_device *vdev)
|
|
|
struct hdpvr_device *dev = video_get_drvdata(vdev);
|
|
|
|
|
|
hdpvr_delete(dev);
|
|
|
- mutex_lock(&dev->io_mutex);
|
|
|
flush_work(&dev->worker);
|
|
|
- mutex_unlock(&dev->io_mutex);
|
|
|
|
|
|
v4l2_device_unregister(&dev->v4l2_dev);
|
|
|
v4l2_ctrl_handler_free(&dev->hdl);
|