drm/exynos: Set the encoder's dpms state once we successfully set it.
authorStéphane Marchesin <marcheu@chromium.org>
Tue, 9 Oct 2012 02:42:14 +0000 (19:42 -0700)
committerGerrit <chrome-bot@google.com>
Tue, 9 Oct 2012 19:11:28 +0000 (12:11 -0700)
Otherwise we try to go to suspend, set the state, fail to change the
actual dpms state. Then we try to resume and we get an unbalanced irq
error because we reenable something which is already enabled.

BUG=none
TEST=by hand: compiles, runs, try suspend/resume

Change-Id: I81d5bf2abe95baad73a40c2970033b3b2146a8c5
Reviewed-on: https://gerrit.chromium.org/gerrit/34978
Tested-by: Stéphane Marchesin <marcheu@chromium.org>
Reviewed-by: Daniel Erat <derat@chromium.org>
Commit-Ready: Stéphane Marchesin <marcheu@chromium.org>

drivers/gpu/drm/exynos/exynos_drm_encoder.c

index 82a20d3..1a3ec71 100644 (file)
@@ -55,6 +55,7 @@ static void exynos_drm_display_power(struct drm_encoder *encoder, int mode)
        struct drm_device *dev = encoder->dev;
        struct drm_connector *connector;
        struct exynos_drm_manager *manager = exynos_drm_get_manager(encoder);
+       struct exynos_drm_encoder *exynos_encoder = to_exynos_encoder(encoder);
 
        list_for_each_entry(connector, &dev->mode_config.connector_list, head) {
                if (connector->encoder == encoder) {
@@ -65,6 +66,7 @@ static void exynos_drm_display_power(struct drm_encoder *encoder, int mode)
                                        connector->base.id, mode);
                        if (display_ops && display_ops->power_on)
                                display_ops->power_on(manager->dev, mode);
+                       exynos_encoder->dpms = mode;
                }
        }
 }
@@ -90,13 +92,11 @@ static void exynos_drm_encoder_dpms(struct drm_encoder *encoder, int mode)
                if (manager_ops && manager_ops->apply)
                        manager_ops->apply(manager->dev);
                exynos_drm_display_power(encoder, mode);
-               exynos_encoder->dpms = mode;
                break;
        case DRM_MODE_DPMS_STANDBY:
        case DRM_MODE_DPMS_SUSPEND:
        case DRM_MODE_DPMS_OFF:
                exynos_drm_display_power(encoder, mode);
-               exynos_encoder->dpms = mode;
                break;
        default:
                DRM_ERROR("unspecified mode %d\n", mode);