summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEric Anholt <eric@anholt.net>2015-05-27 16:30:18 -0700
committerEric Anholt <eric@anholt.net>2015-06-04 14:15:37 -0700
commit31831905d175291d9c2c504c89ba167b327ee939 (patch)
tree25d09dd117d6607b7aa55d63dbc261f56c562932
parentc142c62b580d988adf2baa40e5f09302f3a0f9d9 (diff)
downloadlinux-31831905d175291d9c2c504c89ba167b327ee939.tar.gz
drm/vc4: Don't forget to irqsave/restore in the reset path.
Fixes another deadlock error from lockdep. Signed-off-by: Eric Anholt <eric@anholt.net>
-rw-r--r--drivers/gpu/drm/vc4/vc4_irq.c12
1 files changed, 6 insertions, 6 deletions
diff --git a/drivers/gpu/drm/vc4/vc4_irq.c b/drivers/gpu/drm/vc4/vc4_irq.c
index df9c4c86fa34..b5a1a273f83f 100644
--- a/drivers/gpu/drm/vc4/vc4_irq.c
+++ b/drivers/gpu/drm/vc4/vc4_irq.c
@@ -88,18 +88,13 @@ vc4_irq_finish_job(struct drm_device *dev)
struct vc4_dev *vc4 = to_vc4_dev(dev);
struct vc4_exec_info *exec = vc4_first_job(vc4);
- spin_lock(&vc4->job_lock);
- if (!exec) {
- spin_unlock(&vc4->job_lock);
+ if (!exec)
return;
- }
vc4->finished_seqno++;
list_move_tail(&exec->head, &vc4->job_done_list);
vc4_submit_next_job(dev);
- spin_unlock(&vc4->job_lock);
-
wake_up_all(&vc4->job_wait_queue);
schedule_work(&vc4->job_done_work);
}
@@ -123,7 +118,9 @@ vc4_irq(int irq, void *arg)
}
if (intctl & V3D_INT_FRDONE) {
+ spin_lock(&vc4->job_lock);
vc4_irq_finish_job(dev);
+ spin_unlock(&vc4->job_lock);
status = IRQ_HANDLED;
}
@@ -180,10 +177,13 @@ vc4_irq_uninstall(struct drm_device *dev)
void vc4_irq_reset(struct drm_device *dev)
{
struct vc4_dev *vc4 = to_vc4_dev(dev);
+ unsigned long irqflags;
V3D_WRITE(V3D_INTCTL, V3D_DRIVER_IRQS);
V3D_WRITE(V3D_INTDIS, 0);
V3D_WRITE(V3D_INTENA, V3D_DRIVER_IRQS);
+ spin_lock_irqsave(&vc4->job_lock, irqflags);
vc4_irq_finish_job(dev);
+ spin_unlock_irqrestore(&vc4->job_lock, irqflags);
}