Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 30bb70ee authored by Daniel Vetter's avatar Daniel Vetter
Browse files

drm/hisilicon: Implement some semblance of vblank event handling



atomic_flush seems to be the right place, but I'm not entirely sure
whether this will catch them all. It could be that when disabling the
crtc we'll miss the vblank.

While at it nuke the dummy functions.

v2: Be more robust and either arm, when the CRTC is on, or just send
the event out right away.

Cc: Xinliang Liu <xinliang.liu@linaro.org>
Cc: Xinwei Kong <kong.kongxinwei@hisilicon.com>
Cc: Archit Taneja <architt@codeaurora.org>
Reviewed-by: default avatarMaarten Lankhorst <maarten.lankhorst@linux.intel.com>
Signed-off-by: default avatarDaniel Vetter <daniel.vetter@intel.com>
Link: http://patchwork.freedesktop.org/patch/msgid/1465388359-8070-5-git-send-email-daniel.vetter@ffwll.ch
parent 9433bd67
Loading
Loading
Loading
Loading
+12 −8
Original line number Original line Diff line number Diff line
@@ -502,13 +502,6 @@ static void ade_crtc_disable(struct drm_crtc *crtc)
	acrtc->enable = false;
	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)
static void ade_crtc_mode_set_nofb(struct drm_crtc *crtc)
{
{
	struct ade_crtc *acrtc = to_ade_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_crtc *acrtc = to_ade_crtc(crtc);
	struct ade_hw_ctx *ctx = acrtc->ctx;
	struct ade_hw_ctx *ctx = acrtc->ctx;
	struct drm_pending_vblank_event *event = crtc->state->event;
	void __iomem *base = ctx->base;
	void __iomem *base = ctx->base;


	/* only crtc is enabled regs take effect */
	/* only crtc is enabled regs take effect */
@@ -545,12 +539,22 @@ static void ade_crtc_atomic_flush(struct drm_crtc *crtc,
		/* flush ade registers */
		/* flush ade registers */
		writel(ADE_ENABLE, base + ADE_EN);
		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 = {
static const struct drm_crtc_helper_funcs ade_crtc_helper_funcs = {
	.enable		= ade_crtc_enable,
	.enable		= ade_crtc_enable,
	.disable	= ade_crtc_disable,
	.disable	= ade_crtc_disable,
	.atomic_check	= ade_crtc_atomic_check,
	.mode_set_nofb	= ade_crtc_mode_set_nofb,
	.mode_set_nofb	= ade_crtc_mode_set_nofb,
	.atomic_begin	= ade_crtc_atomic_begin,
	.atomic_begin	= ade_crtc_atomic_begin,
	.atomic_flush	= ade_crtc_atomic_flush,
	.atomic_flush	= ade_crtc_atomic_flush,