@@ -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,
};
/* -----------------------------------------------------------------------------