drm/exynos: Fix up encoder->dpms locking
authorSean Paul <seanpaul@chromium.org>
Thu, 8 Nov 2012 16:44:14 +0000 (11:44 -0500)
committerGerrit <chrome-bot@google.com>
Tue, 13 Nov 2012 17:31:09 +0000 (09:31 -0800)
encoder->dpms was both being read and written without the struct mutex
lock. Fix this so we're synchronized.

BUG=None
TEST=Tested on snow, ensured we only called dpms once

Change-Id: I7d2b34e908273660c31c0290e3c6c632556297fc
Signed-off-by: Sean Paul <seanpaul@chromium.org>
Reviewed-on: https://gerrit.chromium.org/gerrit/37643
Reviewed-by: Mandeep Singh Baines <msb@chromium.org>
Reviewed-by: Stéphane Marchesin <marcheu@chromium.org>
drivers/gpu/drm/exynos/exynos_drm_encoder.c

index 1a3ec71..bf6e597 100644 (file)
@@ -80,13 +80,14 @@ static void exynos_drm_encoder_dpms(struct drm_encoder *encoder, int mode)
 
        DRM_DEBUG_KMS("%s, encoder dpms: %d\n", __FILE__, mode);
 
+       mutex_lock(&dev->struct_mutex);
+
        if (exynos_encoder->dpms == mode) {
                DRM_DEBUG_KMS("desired dpms mode is same as previous one.\n");
+               mutex_unlock(&dev->struct_mutex);
                return;
        }
 
-       mutex_lock(&dev->struct_mutex);
-
        switch (mode) {
        case DRM_MODE_DPMS_ON:
                if (manager_ops && manager_ops->apply)
@@ -373,14 +374,11 @@ void exynos_drm_encoder_crtc_commit(struct drm_encoder *encoder, void *data)
 
 void exynos_drm_encoder_dpms_from_crtc(struct drm_encoder *encoder, void *data)
 {
-       struct exynos_drm_encoder *exynos_encoder = to_exynos_encoder(encoder);
        int mode = *(int *)data;
 
        DRM_DEBUG_KMS("%s\n", __FILE__);
 
        exynos_drm_encoder_dpms(encoder, mode);
-
-       exynos_encoder->dpms = mode;
 }
 
 void exynos_drm_encoder_crtc_dpms(struct drm_encoder *encoder, void *data)