drm: omapdrm: Rework CRTC enable/disable for atomic updates

When using atomic updates the CRTC .enable() and .disable() helper
operations are preferred over the (then legacy) .prepare() and .commit()
operations. Implement .enable() and rework .disable() to not depend on
DPMS, easing DPMS removal later on.

Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Signed-off-by: Tomi Valkeinen <tomi.valkeinen@ti.com>
This commit is contained in:
Laurent Pinchart 2015-03-05 22:13:22 +02:00
parent 4343f0f857
commit f1d57fb517
1 changed files with 74 additions and 39 deletions

View File

@ -509,45 +509,6 @@ static void omap_crtc_destroy(struct drm_crtc *crtc)
kfree(omap_crtc);
}
static void omap_crtc_dpms(struct drm_crtc *crtc, int mode)
{
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;
DBG("%s: %d", omap_crtc->name, mode);
if (enable == 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. */
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));
}
omap_crtc->enabled = enable;
omap_crtc_setup(crtc);
omap_crtc_flush(crtc);
if (enable) {
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)
@ -555,6 +516,65 @@ static bool omap_crtc_mode_fixup(struct drm_crtc *crtc,
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);
unsigned int i;
DBG("%s", omap_crtc->name);
if (omap_crtc->enabled)
return;
/* 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, true));
}
omap_crtc->enabled = true;
omap_crtc_setup(crtc);
omap_crtc_flush(crtc);
dispc_runtime_get();
drm_crtc_vblank_on(crtc);
dispc_runtime_put();
}
static void omap_crtc_disable(struct drm_crtc *crtc)
{
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,
struct drm_display_mode *mode,
struct drm_display_mode *adjusted_mode,
@ -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,
};
/* -----------------------------------------------------------------------------