diff options
-rw-r--r-- | drivers/media/v4l2-core/v4l2-mem2mem.c | 12 |
1 files changed, 12 insertions, 0 deletions
diff --git a/drivers/media/v4l2-core/v4l2-mem2mem.c b/drivers/media/v4l2-core/v4l2-mem2mem.c index 796de3349303..73035ee0f4de 100644 --- a/drivers/media/v4l2-core/v4l2-mem2mem.c +++ b/drivers/media/v4l2-core/v4l2-mem2mem.c | |||
@@ -41,6 +41,8 @@ module_param(debug, bool, 0644); | |||
41 | #define TRANS_QUEUED (1 << 0) | 41 | #define TRANS_QUEUED (1 << 0) |
42 | /* Instance is currently running in hardware */ | 42 | /* Instance is currently running in hardware */ |
43 | #define TRANS_RUNNING (1 << 1) | 43 | #define TRANS_RUNNING (1 << 1) |
44 | /* Instance is currently aborting */ | ||
45 | #define TRANS_ABORT (1 << 2) | ||
44 | 46 | ||
45 | 47 | ||
46 | /* Offset base for buffers on the destination queue - used to distinguish | 48 | /* Offset base for buffers on the destination queue - used to distinguish |
@@ -221,6 +223,14 @@ static void v4l2_m2m_try_schedule(struct v4l2_m2m_ctx *m2m_ctx) | |||
221 | } | 223 | } |
222 | 224 | ||
223 | spin_lock_irqsave(&m2m_dev->job_spinlock, flags_job); | 225 | spin_lock_irqsave(&m2m_dev->job_spinlock, flags_job); |
226 | |||
227 | /* If the context is aborted then don't schedule it */ | ||
228 | if (m2m_ctx->job_flags & TRANS_ABORT) { | ||
229 | spin_unlock_irqrestore(&m2m_dev->job_spinlock, flags_job); | ||
230 | dprintk("Aborted context\n"); | ||
231 | return; | ||
232 | } | ||
233 | |||
224 | if (m2m_ctx->job_flags & TRANS_QUEUED) { | 234 | if (m2m_ctx->job_flags & TRANS_QUEUED) { |
225 | spin_unlock_irqrestore(&m2m_dev->job_spinlock, flags_job); | 235 | spin_unlock_irqrestore(&m2m_dev->job_spinlock, flags_job); |
226 | dprintk("On job queue already\n"); | 236 | dprintk("On job queue already\n"); |
@@ -280,6 +290,8 @@ static void v4l2_m2m_cancel_job(struct v4l2_m2m_ctx *m2m_ctx) | |||
280 | 290 | ||
281 | m2m_dev = m2m_ctx->m2m_dev; | 291 | m2m_dev = m2m_ctx->m2m_dev; |
282 | spin_lock_irqsave(&m2m_dev->job_spinlock, flags); | 292 | spin_lock_irqsave(&m2m_dev->job_spinlock, flags); |
293 | |||
294 | m2m_ctx->job_flags |= TRANS_ABORT; | ||
283 | if (m2m_ctx->job_flags & TRANS_RUNNING) { | 295 | if (m2m_ctx->job_flags & TRANS_RUNNING) { |
284 | spin_unlock_irqrestore(&m2m_dev->job_spinlock, flags); | 296 | spin_unlock_irqrestore(&m2m_dev->job_spinlock, flags); |
285 | m2m_dev->m2m_ops->job_abort(m2m_ctx->priv); | 297 | m2m_dev->m2m_ops->job_abort(m2m_ctx->priv); |