提交 edc72557 编写于 作者: L Laurent Pinchart

drm: omapdrm: Remove omap_plane enabled field

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: NLaurent Pinchart <laurent.pinchart@ideasonboard.com>
Signed-off-by: NTomi Valkeinen <tomi.valkeinen@ti.com>
上级 6cca481c
...@@ -452,19 +452,21 @@ static void omap_crtc_enable(struct drm_crtc *crtc) ...@@ -452,19 +452,21 @@ static void omap_crtc_enable(struct drm_crtc *crtc)
DBG("%s", omap_crtc->name); DBG("%s", omap_crtc->name);
dispc_runtime_get();
/* Enable all planes associated with the CRTC. */ /* Enable all planes associated with the CRTC. */
for (i = 0; i < priv->num_planes; i++) { for (i = 0; i < priv->num_planes; i++) {
struct drm_plane *plane = priv->planes[i]; struct drm_plane *plane = priv->planes[i];
if (plane->crtc == crtc) 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_encoder_setup(crtc, true);
omap_crtc_flush(crtc); omap_crtc_flush(crtc);
dispc_runtime_get();
drm_crtc_vblank_on(crtc); drm_crtc_vblank_on(crtc);
dispc_runtime_put(); dispc_runtime_put();
} }
...@@ -479,18 +481,19 @@ static void omap_crtc_disable(struct drm_crtc *crtc) ...@@ -479,18 +481,19 @@ static void omap_crtc_disable(struct drm_crtc *crtc)
omap_crtc_wait_page_flip(crtc); omap_crtc_wait_page_flip(crtc);
dispc_runtime_get(); dispc_runtime_get();
drm_crtc_vblank_off(crtc); drm_crtc_vblank_off(crtc);
dispc_runtime_put();
/* Disable all planes associated with the CRTC. */ /* Disable all planes associated with the CRTC. */
for (i = 0; i < priv->num_planes; i++) { for (i = 0; i < priv->num_planes; i++) {
struct drm_plane *plane = priv->planes[i]; struct drm_plane *plane = priv->planes[i];
if (plane->crtc == crtc) 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_encoder_setup(crtc, false);
omap_crtc_flush(crtc); omap_crtc_flush(crtc);
dispc_runtime_put();
} }
static void omap_crtc_mode_set_nofb(struct drm_crtc *crtc) static void omap_crtc_mode_set_nofb(struct drm_crtc *crtc)
......
...@@ -151,7 +151,7 @@ struct drm_crtc *omap_crtc_init(struct drm_device *dev, ...@@ -151,7 +151,7 @@ struct drm_crtc *omap_crtc_init(struct drm_device *dev,
struct drm_plane *omap_plane_init(struct drm_device *dev, struct drm_plane *omap_plane_init(struct drm_device *dev,
int id, enum drm_plane_type type); 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, void omap_plane_install_properties(struct drm_plane *plane,
struct drm_mode_object *obj); struct drm_mode_object *obj);
......
...@@ -40,8 +40,6 @@ struct omap_plane { ...@@ -40,8 +40,6 @@ struct omap_plane {
int id; /* TODO rename omap_plane -> omap_plane_id in omapdss so I can use the enum */ int id; /* TODO rename omap_plane -> omap_plane_id in omapdss so I can use the enum */
const char *name; const char *name;
bool enabled;
uint32_t nformats; uint32_t nformats;
uint32_t formats[32]; uint32_t formats[32];
...@@ -60,18 +58,19 @@ to_omap_plane_state(struct drm_plane_state *state) ...@@ -60,18 +58,19 @@ to_omap_plane_state(struct drm_plane_state *state)
return container_of(state, struct omap_plane_state, base); 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 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_overlay_info info;
struct omap_drm_window win; struct omap_drm_window win;
int ret; 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); dispc_ovl_enable(omap_plane->id, false);
return 0; return 0;
} }
...@@ -134,23 +133,6 @@ static int omap_plane_setup(struct omap_plane *omap_plane) ...@@ -134,23 +133,6 @@ static int omap_plane_setup(struct omap_plane *omap_plane)
return 0; 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, static int omap_plane_prepare_fb(struct drm_plane *plane,
struct drm_framebuffer *fb, struct drm_framebuffer *fb,
const struct drm_plane_state *new_state) const struct drm_plane_state *new_state)
...@@ -168,14 +150,7 @@ static void omap_plane_cleanup_fb(struct drm_plane *plane, ...@@ -168,14 +150,7 @@ static void omap_plane_cleanup_fb(struct drm_plane *plane,
static void omap_plane_atomic_update(struct drm_plane *plane, static void omap_plane_atomic_update(struct drm_plane *plane,
struct drm_plane_state *old_state) struct drm_plane_state *old_state)
{ {
struct omap_plane *omap_plane = to_omap_plane(plane); omap_plane_setup(plane);
struct drm_plane_state *state = plane->state;
if (!state->fb || !state->crtc)
return;
omap_plane->enabled = true;
omap_plane_setup(omap_plane);
} }
static void omap_plane_atomic_disable(struct drm_plane *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, ...@@ -188,11 +163,7 @@ static void omap_plane_atomic_disable(struct drm_plane *plane,
omap_state->zorder = plane->type == DRM_PLANE_TYPE_PRIMARY omap_state->zorder = plane->type == DRM_PLANE_TYPE_PRIMARY
? 0 : omap_plane->id; ? 0 : omap_plane->id;
if (!omap_plane->enabled) omap_plane_setup(plane);
return;
omap_plane->enabled = false;
omap_plane_setup(omap_plane);
} }
static const struct drm_plane_helper_funcs omap_plane_helper_funcs = { static const struct drm_plane_helper_funcs omap_plane_helper_funcs = {
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册