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+renesas@ideasonboard.com>
void rcar_du_crtc_resume(struct rcar_du_crtc *rcrtc)
{
void rcar_du_crtc_resume(struct rcar_du_crtc *rcrtc)
{
- if (rcrtc->dpms != DRM_MODE_DPMS_ON)
return;
rcar_du_crtc_get(rcrtc);
return;
rcar_du_crtc_get(rcrtc);
-static void rcar_du_crtc_dpms(struct drm_crtc *crtc, int mode)
+static void rcar_du_crtc_enable(struct drm_crtc *crtc)
{
struct rcar_du_crtc *rcrtc = to_rcar_crtc(crtc);
{
struct rcar_du_crtc *rcrtc = to_rcar_crtc(crtc);
- if (mode != DRM_MODE_DPMS_ON)
- mode = DRM_MODE_DPMS_OFF;
+ if (rcrtc->enabled)
+ return;
+
+ rcar_du_crtc_get(rcrtc);
+ rcar_du_crtc_start(rcrtc);
+
+ rcrtc->enabled = true;
+}
+
+static void rcar_du_crtc_disable(struct drm_crtc *crtc)
+{
+ struct rcar_du_crtc *rcrtc = to_rcar_crtc(crtc);
- if (rcrtc->dpms == mode)
- if (mode == DRM_MODE_DPMS_ON) {
- rcar_du_crtc_get(rcrtc);
- rcar_du_crtc_start(rcrtc);
- } else {
- rcar_du_crtc_stop(rcrtc);
- rcar_du_crtc_put(rcrtc);
- }
+ rcar_du_crtc_stop(rcrtc);
+ rcar_du_crtc_put(rcrtc);
+ rcrtc->enabled = false;
+}
+
+static void rcar_du_crtc_dpms(struct drm_crtc *crtc, int mode)
+{
+ if (mode == DRM_MODE_DPMS_ON)
+ rcar_du_crtc_enable(crtc);
+ else
+ rcar_du_crtc_disable(crtc);
}
static bool rcar_du_crtc_mode_fixup(struct drm_crtc *crtc,
}
static bool rcar_du_crtc_mode_fixup(struct drm_crtc *crtc,
*/
rcar_du_crtc_get(rcrtc);
*/
rcar_du_crtc_get(rcrtc);
- /* Stop the CRTC, force the DPMS mode to off as a result. */
+ /* Stop the CRTC, force enabled to false as a result. */
rcar_du_crtc_stop(rcrtc);
rcar_du_crtc_stop(rcrtc);
- rcrtc->dpms = DRM_MODE_DPMS_OFF;
+ rcrtc->enabled = false;
{
struct rcar_du_crtc *rcrtc = to_rcar_crtc(crtc);
{
struct rcar_du_crtc *rcrtc = to_rcar_crtc(crtc);
- /* We're done, restart the CRTC and set the DPMS mode to on. The
- * reference to the DU acquired at prepare() time will thus be released
- * by the DPMS handler (possibly called by the disable() handler).
+ /* We're done, restart the CRTC and set enabled to true. The reference
+ * to the DU acquired at prepare() time will thus be released by the
+ * disable() handler.
*/
rcar_du_crtc_start(rcrtc);
*/
rcar_du_crtc_start(rcrtc);
- rcrtc->dpms = DRM_MODE_DPMS_ON;
-}
-
-static void rcar_du_crtc_disable(struct drm_crtc *crtc)
-{
- rcar_du_crtc_dpms(crtc, DRM_MODE_DPMS_OFF);
}
static void rcar_du_crtc_atomic_begin(struct drm_crtc *crtc)
}
static void rcar_du_crtc_atomic_begin(struct drm_crtc *crtc)
.mode_set_nofb = rcar_du_crtc_mode_set_nofb,
.mode_set_base = drm_helper_crtc_mode_set_base,
.disable = rcar_du_crtc_disable,
.mode_set_nofb = rcar_du_crtc_mode_set_nofb,
.mode_set_base = drm_helper_crtc_mode_set_base,
.disable = rcar_du_crtc_disable,
+ .enable = rcar_du_crtc_enable,
.atomic_begin = rcar_du_crtc_atomic_begin,
.atomic_flush = rcar_du_crtc_atomic_flush,
};
.atomic_begin = rcar_du_crtc_atomic_begin,
.atomic_flush = rcar_du_crtc_atomic_flush,
};
rcrtc->group = rgrp;
rcrtc->mmio_offset = mmio_offsets[index];
rcrtc->index = index;
rcrtc->group = rgrp;
rcrtc->mmio_offset = mmio_offsets[index];
rcrtc->index = index;
- rcrtc->dpms = DRM_MODE_DPMS_OFF;
+ rcrtc->enabled = false;
rcrtc->plane = &rgrp->planes.planes[index % 2];
rcrtc->plane->crtc = crtc;
rcrtc->plane = &rgrp->planes.planes[index % 2];
rcrtc->plane->crtc = crtc;
wait_queue_head_t flip_wait;
unsigned int outputs;
wait_queue_head_t flip_wait;
unsigned int outputs;
struct rcar_du_group *group;
struct rcar_du_plane *plane;
struct rcar_du_group *group;
struct rcar_du_plane *plane;