diff options
-rw-r--r-- | drivers/gpu/drm/omapdrm/omap_crtc.c | 83 |
1 files changed, 59 insertions, 24 deletions
diff --git a/drivers/gpu/drm/omapdrm/omap_crtc.c b/drivers/gpu/drm/omapdrm/omap_crtc.c index 94c1bb8448be..0359a67f8f8d 100644 --- a/drivers/gpu/drm/omapdrm/omap_crtc.c +++ b/drivers/gpu/drm/omapdrm/omap_crtc.c @@ -509,50 +509,70 @@ static void omap_crtc_destroy(struct drm_crtc *crtc) kfree(omap_crtc); } -static void omap_crtc_dpms(struct drm_crtc *crtc, int mode) +static bool omap_crtc_mode_fixup(struct drm_crtc *crtc, + const struct drm_display_mode *mode, + struct drm_display_mode *adjusted_mode) +{ + return true; +} + +static void omap_crtc_enable(struct drm_crtc *crtc) { struct omap_drm_private *priv = crtc->dev->dev_private; struct omap_crtc *omap_crtc = to_omap_crtc(crtc); - bool enable = (mode == DRM_MODE_DPMS_ON); - int i; + unsigned int i; - DBG("%s: %d", omap_crtc->name, mode); + DBG("%s", omap_crtc->name); - if (enable == omap_crtc->enabled) + if (omap_crtc->enabled) return; - if (!enable) { - omap_crtc_wait_page_flip(crtc); - dispc_runtime_get(); - drm_crtc_vblank_off(crtc); - dispc_runtime_put(); - } - - /* Enable/disable all planes associated with the CRTC. */ + /* Enable all planes associated with the CRTC. */ for (i = 0; i < priv->num_planes; i++) { struct drm_plane *plane = priv->planes[i]; if (plane->crtc == crtc) - WARN_ON(omap_plane_set_enable(plane, enable)); + WARN_ON(omap_plane_set_enable(plane, true)); } - omap_crtc->enabled = enable; + omap_crtc->enabled = true; omap_crtc_setup(crtc); omap_crtc_flush(crtc); - if (enable) { - dispc_runtime_get(); - drm_crtc_vblank_on(crtc); - dispc_runtime_put(); - } + dispc_runtime_get(); + drm_crtc_vblank_on(crtc); + dispc_runtime_put(); } -static bool omap_crtc_mode_fixup(struct drm_crtc *crtc, - const struct drm_display_mode *mode, - struct drm_display_mode *adjusted_mode) +static void omap_crtc_disable(struct drm_crtc *crtc) { - return true; + struct omap_drm_private *priv = crtc->dev->dev_private; + struct omap_crtc *omap_crtc = to_omap_crtc(crtc); + unsigned int i; + + DBG("%s", omap_crtc->name); + + if (!omap_crtc->enabled) + return; + + omap_crtc_wait_page_flip(crtc); + dispc_runtime_get(); + drm_crtc_vblank_off(crtc); + dispc_runtime_put(); + + /* Disable all planes associated with the CRTC. */ + for (i = 0; i < priv->num_planes; i++) { + struct drm_plane *plane = priv->planes[i]; + + if (plane->crtc == crtc) + WARN_ON(omap_plane_set_enable(plane, false)); + } + + omap_crtc->enabled = false; + + omap_crtc_setup(crtc); + omap_crtc_flush(crtc); } static int omap_crtc_mode_set(struct drm_crtc *crtc, @@ -587,6 +607,19 @@ static int omap_crtc_mode_set(struct drm_crtc *crtc, x, y, mode->hdisplay, mode->vdisplay); } +static void omap_crtc_dpms(struct drm_crtc *crtc, int mode) +{ + struct omap_crtc *omap_crtc = to_omap_crtc(crtc); + bool enable = (mode == DRM_MODE_DPMS_ON); + + DBG("%s: %d", omap_crtc->name, mode); + + if (enable) + omap_crtc_enable(crtc); + else + omap_crtc_disable(crtc); +} + static void omap_crtc_prepare(struct drm_crtc *crtc) { struct omap_crtc *omap_crtc = to_omap_crtc(crtc); @@ -751,6 +784,8 @@ static const struct drm_crtc_helper_funcs omap_crtc_helper_funcs = { .prepare = omap_crtc_prepare, .commit = omap_crtc_commit, .mode_set_base = omap_crtc_mode_set_base, + .disable = omap_crtc_disable, + .enable = omap_crtc_enable, }; /* ----------------------------------------------------------------------------- |