The field tracks the plane state to avoid double-enable or -disable. This isn't required anymore, as - the DRM atomic core guarantees that the plane atomic_update and atomic_disable functions will never be called on an enabled/disabled plane - the CRTC enable/disable operations that enable/disable the plane are already guarded against double enable/disable We can thus remove the enabled field completely. The omap_plane_set_enable() function then becomes a wrapper around omap_plane_setup() which can be called directly. Signed-off-by: Laurent Pinchart <laurent.pinchart@xxxxxxxxxxxxxxxx> --- drivers/gpu/drm/omapdrm/omap_crtc.c | 11 +++++---- drivers/gpu/drm/omapdrm/omap_drv.h | 2 +- drivers/gpu/drm/omapdrm/omap_plane.c | 45 +++++++----------------------------- 3 files changed, 16 insertions(+), 42 deletions(-) diff --git a/drivers/gpu/drm/omapdrm/omap_crtc.c b/drivers/gpu/drm/omapdrm/omap_crtc.c index d02b54d..5d0356f 100644 --- a/drivers/gpu/drm/omapdrm/omap_crtc.c +++ b/drivers/gpu/drm/omapdrm/omap_crtc.c @@ -453,19 +453,21 @@ static void omap_crtc_enable(struct drm_crtc *crtc) DBG("%s", omap_crtc->name); + dispc_runtime_get(); + /* 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)); + WARN_ON(omap_plane_setup(plane)); } omap_crtc_encoder_setup(crtc, true); omap_crtc_flush(crtc); - dispc_runtime_get(); drm_crtc_vblank_on(crtc); + dispc_runtime_put(); } @@ -480,18 +482,19 @@ static void omap_crtc_disable(struct drm_crtc *crtc) 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)); + WARN_ON(omap_plane_setup(plane)); } omap_crtc_encoder_setup(crtc, false); omap_crtc_flush(crtc); + + dispc_runtime_put(); } static void omap_crtc_mode_set_nofb(struct drm_crtc *crtc) diff --git a/drivers/gpu/drm/omapdrm/omap_drv.h b/drivers/gpu/drm/omapdrm/omap_drv.h index bef3002..56b8ee6 100644 --- a/drivers/gpu/drm/omapdrm/omap_drv.h +++ b/drivers/gpu/drm/omapdrm/omap_drv.h @@ -150,7 +150,7 @@ struct drm_crtc *omap_crtc_init(struct drm_device *dev, struct drm_plane *omap_plane_init(struct drm_device *dev, int id, enum drm_plane_type type); -int omap_plane_set_enable(struct drm_plane *plane, bool enable); +int omap_plane_setup(struct drm_plane *plane); void omap_plane_install_properties(struct drm_plane *plane, struct drm_mode_object *obj); diff --git a/drivers/gpu/drm/omapdrm/omap_plane.c b/drivers/gpu/drm/omapdrm/omap_plane.c index ac6b72c..a3c5d1f 100644 --- a/drivers/gpu/drm/omapdrm/omap_plane.c +++ b/drivers/gpu/drm/omapdrm/omap_plane.c @@ -40,8 +40,6 @@ struct omap_plane { int id; /* TODO rename omap_plane -> omap_plane_id in omapdss so I can use the enum */ const char *name; - bool enabled; - uint32_t nformats; uint32_t formats[32]; @@ -60,18 +58,19 @@ to_omap_plane_state(struct drm_plane_state *state) return container_of(state, struct omap_plane_state, base); } -static int omap_plane_setup(struct omap_plane *omap_plane) +int omap_plane_setup(struct drm_plane *plane) { - struct drm_plane_state *state = omap_plane->base.state; + struct omap_plane *omap_plane = to_omap_plane(plane); + struct drm_plane_state *state = plane->state; struct omap_plane_state *omap_state = to_omap_plane_state(state); - struct drm_device *dev = omap_plane->base.dev; + struct drm_device *dev = plane->dev; struct omap_overlay_info info; struct omap_drm_window win; int ret; - DBG("%s, enabled=%d", omap_plane->name, omap_plane->enabled); + DBG("%s, crtc=%p fb=%p", omap_plane->name, state->crtc, state->fb); - if (!omap_plane->enabled) { + if (!state->crtc) { dispc_ovl_enable(omap_plane->id, false); return 0; } @@ -134,23 +133,6 @@ static int omap_plane_setup(struct omap_plane *omap_plane) return 0; } -int omap_plane_set_enable(struct drm_plane *plane, bool enable) -{ - struct omap_plane *omap_plane = to_omap_plane(plane); - int ret; - - if (enable == omap_plane->enabled) - return 0; - - omap_plane->enabled = enable; - - dispc_runtime_get(); - ret = omap_plane_setup(omap_plane); - dispc_runtime_put(); - - return ret; -} - static int omap_plane_prepare_fb(struct drm_plane *plane, struct drm_framebuffer *fb, const struct drm_plane_state *new_state) @@ -168,14 +150,7 @@ static void omap_plane_cleanup_fb(struct drm_plane *plane, static void omap_plane_atomic_update(struct drm_plane *plane, struct drm_plane_state *old_state) { - struct omap_plane *omap_plane = to_omap_plane(plane); - struct drm_plane_state *state = plane->state; - - if (!state->fb || !state->crtc) - return; - - omap_plane->enabled = true; - omap_plane_setup(omap_plane); + omap_plane_setup(plane); } static void omap_plane_atomic_disable(struct drm_plane *plane, @@ -188,11 +163,7 @@ static void omap_plane_atomic_disable(struct drm_plane *plane, omap_state->zorder = plane->type == DRM_PLANE_TYPE_PRIMARY ? 0 : omap_plane->id; - if (!omap_plane->enabled) - return; - - omap_plane->enabled = false; - omap_plane_setup(omap_plane); + omap_plane_setup(plane); } static const struct drm_plane_helper_funcs omap_plane_helper_funcs = { -- 2.0.5 _______________________________________________ dri-devel mailing list dri-devel@xxxxxxxxxxxxxxxxxxxxx http://lists.freedesktop.org/mailman/listinfo/dri-devel