|
@@ -45,6 +45,7 @@ struct meson_crtc {
|
|
|
struct drm_crtc base;
|
|
|
struct drm_pending_vblank_event *event;
|
|
|
struct meson_drm *priv;
|
|
|
+ bool enabled;
|
|
|
};
|
|
|
#define to_meson_crtc(x) container_of(x, struct meson_crtc, base)
|
|
|
|
|
@@ -80,8 +81,7 @@ static const struct drm_crtc_funcs meson_crtc_funcs = {
|
|
|
|
|
|
};
|
|
|
|
|
|
-static void meson_crtc_atomic_enable(struct drm_crtc *crtc,
|
|
|
- struct drm_crtc_state *old_state)
|
|
|
+static void meson_crtc_enable(struct drm_crtc *crtc)
|
|
|
{
|
|
|
struct meson_crtc *meson_crtc = to_meson_crtc(crtc);
|
|
|
struct drm_crtc_state *crtc_state = crtc->state;
|
|
@@ -101,6 +101,22 @@ static void meson_crtc_atomic_enable(struct drm_crtc *crtc,
|
|
|
writel_bits_relaxed(VPP_POSTBLEND_ENABLE, VPP_POSTBLEND_ENABLE,
|
|
|
priv->io_base + _REG(VPP_MISC));
|
|
|
|
|
|
+ drm_crtc_vblank_on(crtc);
|
|
|
+
|
|
|
+ meson_crtc->enabled = true;
|
|
|
+}
|
|
|
+
|
|
|
+static void meson_crtc_atomic_enable(struct drm_crtc *crtc,
|
|
|
+ struct drm_crtc_state *old_state)
|
|
|
+{
|
|
|
+ struct meson_crtc *meson_crtc = to_meson_crtc(crtc);
|
|
|
+ struct meson_drm *priv = meson_crtc->priv;
|
|
|
+
|
|
|
+ DRM_DEBUG_DRIVER("\n");
|
|
|
+
|
|
|
+ if (!meson_crtc->enabled)
|
|
|
+ meson_crtc_enable(crtc);
|
|
|
+
|
|
|
priv->viu.osd1_enabled = true;
|
|
|
}
|
|
|
|
|
@@ -110,6 +126,8 @@ static void meson_crtc_atomic_disable(struct drm_crtc *crtc,
|
|
|
struct meson_crtc *meson_crtc = to_meson_crtc(crtc);
|
|
|
struct meson_drm *priv = meson_crtc->priv;
|
|
|
|
|
|
+ drm_crtc_vblank_off(crtc);
|
|
|
+
|
|
|
priv->viu.osd1_enabled = false;
|
|
|
priv->viu.osd1_commit = false;
|
|
|
|
|
@@ -124,6 +142,8 @@ static void meson_crtc_atomic_disable(struct drm_crtc *crtc,
|
|
|
|
|
|
crtc->state->event = NULL;
|
|
|
}
|
|
|
+
|
|
|
+ meson_crtc->enabled = false;
|
|
|
}
|
|
|
|
|
|
static void meson_crtc_atomic_begin(struct drm_crtc *crtc,
|
|
@@ -132,6 +152,9 @@ static void meson_crtc_atomic_begin(struct drm_crtc *crtc,
|
|
|
struct meson_crtc *meson_crtc = to_meson_crtc(crtc);
|
|
|
unsigned long flags;
|
|
|
|
|
|
+ if (crtc->state->enable && !meson_crtc->enabled)
|
|
|
+ meson_crtc_enable(crtc);
|
|
|
+
|
|
|
if (crtc->state->event) {
|
|
|
WARN_ON(drm_crtc_vblank_get(crtc) != 0);
|
|
|
|