|
@@ -502,13 +502,6 @@ static void ade_crtc_disable(struct drm_crtc *crtc)
|
|
|
acrtc->enable = false;
|
|
|
}
|
|
|
|
|
|
-static int ade_crtc_atomic_check(struct drm_crtc *crtc,
|
|
|
- struct drm_crtc_state *state)
|
|
|
-{
|
|
|
- /* do nothing */
|
|
|
- return 0;
|
|
|
-}
|
|
|
-
|
|
|
static void ade_crtc_mode_set_nofb(struct drm_crtc *crtc)
|
|
|
{
|
|
|
struct ade_crtc *acrtc = to_ade_crtc(crtc);
|
|
@@ -537,6 +530,7 @@ static void ade_crtc_atomic_flush(struct drm_crtc *crtc,
|
|
|
{
|
|
|
struct ade_crtc *acrtc = to_ade_crtc(crtc);
|
|
|
struct ade_hw_ctx *ctx = acrtc->ctx;
|
|
|
+ struct drm_pending_vblank_event *event = crtc->state->event;
|
|
|
void __iomem *base = ctx->base;
|
|
|
|
|
|
/* only crtc is enabled regs take effect */
|
|
@@ -545,12 +539,22 @@ static void ade_crtc_atomic_flush(struct drm_crtc *crtc,
|
|
|
/* flush ade registers */
|
|
|
writel(ADE_ENABLE, base + ADE_EN);
|
|
|
}
|
|
|
+
|
|
|
+ if (event) {
|
|
|
+ crtc->state->event = NULL;
|
|
|
+
|
|
|
+ spin_lock_irq(&crtc->dev->event_lock);
|
|
|
+ if (drm_crtc_vblank_get(crtc) == 0)
|
|
|
+ drm_crtc_arm_vblank_event(crtc, event);
|
|
|
+ else
|
|
|
+ drm_crtc_send_vblank_event(crtc, event);
|
|
|
+ spin_unlock_irq(&crtc->dev->event_lock);
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
static const struct drm_crtc_helper_funcs ade_crtc_helper_funcs = {
|
|
|
.enable = ade_crtc_enable,
|
|
|
.disable = ade_crtc_disable,
|
|
|
- .atomic_check = ade_crtc_atomic_check,
|
|
|
.mode_set_nofb = ade_crtc_mode_set_nofb,
|
|
|
.atomic_begin = ade_crtc_atomic_begin,
|
|
|
.atomic_flush = ade_crtc_atomic_flush,
|