]> Pileus Git - ~andy/linux/blobdiff - drivers/gpu/drm/omapdrm/omap_irq.c
drm/omap: fix (un)registering irqs inside an irq handler
[~andy/linux] / drivers / gpu / drm / omapdrm / omap_irq.c
index cb858600185f8051c7f92997e5e7e8ad7d8a6173..da690d0e0f0318b6bc46e8cb12b161096d16d384 100644 (file)
@@ -45,12 +45,11 @@ static void omap_irq_update(struct drm_device *dev)
        dispc_read_irqenable();        /* flush posted write */
 }
 
-void omap_irq_register(struct drm_device *dev, struct omap_drm_irq *irq)
+void __omap_irq_register(struct drm_device *dev, struct omap_drm_irq *irq)
 {
        struct omap_drm_private *priv = dev->dev_private;
        unsigned long flags;
 
-       dispc_runtime_get();
        spin_lock_irqsave(&list_lock, flags);
 
        if (!WARN_ON(irq->registered)) {
@@ -60,14 +59,21 @@ void omap_irq_register(struct drm_device *dev, struct omap_drm_irq *irq)
        }
 
        spin_unlock_irqrestore(&list_lock, flags);
+}
+
+void omap_irq_register(struct drm_device *dev, struct omap_drm_irq *irq)
+{
+       dispc_runtime_get();
+
+       __omap_irq_register(dev, irq);
+
        dispc_runtime_put();
 }
 
-void omap_irq_unregister(struct drm_device *dev, struct omap_drm_irq *irq)
+void __omap_irq_unregister(struct drm_device *dev, struct omap_drm_irq *irq)
 {
        unsigned long flags;
 
-       dispc_runtime_get();
        spin_lock_irqsave(&list_lock, flags);
 
        if (!WARN_ON(!irq->registered)) {
@@ -77,6 +83,14 @@ void omap_irq_unregister(struct drm_device *dev, struct omap_drm_irq *irq)
        }
 
        spin_unlock_irqrestore(&list_lock, flags);
+}
+
+void omap_irq_unregister(struct drm_device *dev, struct omap_drm_irq *irq)
+{
+       dispc_runtime_get();
+
+       __omap_irq_unregister(dev, irq);
+
        dispc_runtime_put();
 }