@@ -269,22 +269,27 @@ int vimc_streamer_s_stream(struct vimc_stream *stream,
struct vimc_ent_device *ved,
int enable)
{
+ static DEFINE_MUTEX(vimc_streamer_lock);
int ret;
if (!stream || !ved)
return -EINVAL;
+ ret = mutex_lock_interruptible(&vimc_streamer_lock);
+ if (ret)
+ return ret;
+
if (enable) {
if (stream->kthread)
return 0;
ret = vimc_streamer_stream_start(ved);
if (ret)
- return ret;
+ goto out;
ret = vimc_streamer_pipeline_init(stream, ved);
if (ret)
- return ret;
+ goto out;
stream->kthread = kthread_run(vimc_streamer_thread, stream,
"vimc-streamer thread");
@@ -294,17 +299,16 @@ int vimc_streamer_s_stream(struct vimc_stream *stream,
dev_err(ved->dev, "kthread_run failed with %d\n", ret);
vimc_streamer_stream_terminate(ved);
vimc_streamer_pipeline_terminate(stream);
- stream->kthread = NULL;
- return ret;
}
} else {
if (!stream->kthread)
- return 0;
+ goto out;
vimc_streamer_stream_terminate(ved);
vimc_streamer_pipeline_terminate(stream);
}
-
- return 0;
+out:
+ mutex_unlock(&vimc_streamer_lock);
+ return ret;
}