]> Gitweb @ Texas Instruments - Open Source Git Repositories - git.TI.com/gitweb - rpmsg/rpmsg.git/commitdiff
drm/tidss: use spin_lock irqsave with event_lock
authorTomi Valkeinen <tomi.valkeinen@ti.com>
Mon, 18 Nov 2019 09:17:20 +0000 (11:17 +0200)
committerTomi Valkeinen <tomi.valkeinen@ti.com>
Wed, 27 Nov 2019 12:54:18 +0000 (14:54 +0200)
For some reason we are using spin_lock_irq & spin_unlock_irq with
event_lock in tidss_crtc.c. Documentation says about spin_lock_irq:
"[use it] if you are absolutely sure nothing else might have already
disabled interrupts on your processor".

I'm not absolutely sure about that for the current or future code. I
think it's safer to just use the spin_lock_irqsave. The minimal
performance improvements with spin_lock_irq should be so small that
they're not noticeable.

Signed-off-by: Tomi Valkeinen <tomi.valkeinen@ti.com>
Reviewed-by: Jyri Sarha <jsarha@ti.com>
drivers/gpu/drm/tidss/tidss_crtc.c

index 83d92efa8e69e7bc438234130be3934c8f347e5f..e7ee6c7a6387c9cf56153780dec01eac26290ed0 100644 (file)
@@ -110,6 +110,7 @@ static void tidss_crtc_atomic_flush(struct drm_crtc *crtc,
        struct tidss_crtc *tcrtc = to_tidss_crtc(crtc);
        struct drm_device *ddev = crtc->dev;
        struct tidss_device *tidss = ddev->dev_private;
+       unsigned long flags;
 
        dev_dbg(ddev->dev, "%s, crtc enabled %d, event %p\n",
                __func__, tcrtc->enabled, crtc->state->event);
@@ -133,7 +134,7 @@ static void tidss_crtc_atomic_flush(struct drm_crtc *crtc,
 
        WARN_ON(drm_crtc_vblank_get(crtc) != 0);
 
-       spin_lock_irq(&ddev->event_lock);
+       spin_lock_irqsave(&ddev->event_lock, flags);
        tidss->dispc_ops->vp_go(tidss->dispc, tcrtc->hw_videoport);
 
        WARN_ON(tcrtc->event);
@@ -141,7 +142,7 @@ static void tidss_crtc_atomic_flush(struct drm_crtc *crtc,
        tcrtc->event = crtc->state->event;
        crtc->state->event = NULL;
 
-       spin_unlock_irq(&ddev->event_lock);
+       spin_unlock_irqrestore(&ddev->event_lock, flags);
 }
 
 static void tidss_crtc_atomic_enable(struct drm_crtc *crtc,
@@ -152,6 +153,7 @@ static void tidss_crtc_atomic_enable(struct drm_crtc *crtc,
        struct tidss_device *tidss = ddev->dev_private;
        const struct drm_display_mode *mode = &crtc->state->adjusted_mode;
        int r;
+       unsigned long flags;
 
        dev_dbg(ddev->dev, "%s, event %p\n", __func__, crtc->state->event);
 
@@ -181,14 +183,14 @@ static void tidss_crtc_atomic_enable(struct drm_crtc *crtc,
        tidss->dispc_ops->vp_enable(tidss->dispc, tcrtc->hw_videoport,
                                    crtc->state);
 
-       spin_lock_irq(&ddev->event_lock);
+       spin_lock_irqsave(&ddev->event_lock, flags);
 
        if (crtc->state->event) {
                drm_crtc_send_vblank_event(crtc, crtc->state->event);
                crtc->state->event = NULL;
        }
 
-       spin_unlock_irq(&ddev->event_lock);
+       spin_unlock_irqrestore(&ddev->event_lock, flags);
 }
 
 static void tidss_crtc_atomic_disable(struct drm_crtc *crtc,
@@ -197,6 +199,7 @@ static void tidss_crtc_atomic_disable(struct drm_crtc *crtc,
        struct tidss_crtc *tcrtc = to_tidss_crtc(crtc);
        struct drm_device *ddev = crtc->dev;
        struct tidss_device *tidss = ddev->dev_private;
+       unsigned long flags;
 
        dev_dbg(ddev->dev, "%s, event %p\n", __func__, crtc->state->event);
 
@@ -213,12 +216,12 @@ static void tidss_crtc_atomic_disable(struct drm_crtc *crtc,
                tidss->dispc_ops->vp_unprepare(tidss->dispc,
                                               tcrtc->hw_videoport);
 
-       spin_lock_irq(&ddev->event_lock);
+       spin_lock_irqsave(&ddev->event_lock, flags);
        if (crtc->state->event) {
                drm_crtc_send_vblank_event(crtc, crtc->state->event);
                crtc->state->event = NULL;
        }
-       spin_unlock_irq(&ddev->event_lock);
+       spin_unlock_irqrestore(&ddev->event_lock, flags);
 
        tcrtc->enabled = false;