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

Commit 38c8c22c authored by Daniel Vetter's avatar Daniel Vetter Committed by Liviu Dudau
Browse files

drm/hdlcd: Fix up crtc_state->event handling



event_list just reimplemented what drm_crtc_arm_vblank_event does. And
we also need to send out drm events when shutting down a pipe.

With this it's possible to use the new nonblocking commit support in
the helpers.

Signed-off-by: default avatarDaniel Vetter <daniel.vetter@intel.com>
Acked-by: default avatarLiviu Dudau <Liviu.Dudau@arm.com>
parent a95acec1
Loading
Loading
Loading
Loading
+8 −10
Original line number Diff line number Diff line
@@ -189,19 +189,17 @@ static void hdlcd_crtc_atomic_begin(struct drm_crtc *crtc,
				    struct drm_crtc_state *state)
{
	struct hdlcd_drm_private *hdlcd = crtc_to_hdlcd_priv(crtc);
	unsigned long flags;

	if (crtc->state->event) {
	struct drm_pending_vblank_event *event = crtc->state->event;

	if (event) {
		crtc->state->event = NULL;
		event->pipe = drm_crtc_index(crtc);

		WARN_ON(drm_crtc_vblank_get(crtc) != 0);

		spin_lock_irqsave(&crtc->dev->event_lock, flags);
		list_add_tail(&event->base.link, &hdlcd->event_list);
		spin_unlock_irqrestore(&crtc->dev->event_lock, flags);
		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);
	}
}

+1 −18
Original line number Diff line number Diff line
@@ -49,8 +49,6 @@ static int hdlcd_load(struct drm_device *drm, unsigned long flags)
	atomic_set(&hdlcd->dma_end_count, 0);
#endif

	INIT_LIST_HEAD(&hdlcd->event_list);

	res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
	hdlcd->mmio = devm_ioremap_resource(drm->dev, res);
	if (IS_ERR(hdlcd->mmio)) {
@@ -160,24 +158,9 @@ static irqreturn_t hdlcd_irq(int irq, void *arg)
		atomic_inc(&hdlcd->vsync_count);

#endif
	if (irq_status & HDLCD_INTERRUPT_VSYNC) {
		bool events_sent = false;
		unsigned long flags;
		struct drm_pending_vblank_event	*e, *t;

	if (irq_status & HDLCD_INTERRUPT_VSYNC)
		drm_crtc_handle_vblank(&hdlcd->crtc);

		spin_lock_irqsave(&drm->event_lock, flags);
		list_for_each_entry_safe(e, t, &hdlcd->event_list, base.link) {
			list_del(&e->base.link);
			drm_crtc_send_vblank_event(&hdlcd->crtc, e);
			events_sent = true;
		}
		if (events_sent)
			drm_crtc_vblank_put(&hdlcd->crtc);
		spin_unlock_irqrestore(&drm->event_lock, flags);
	}

	/* acknowledge interrupt(s) */
	hdlcd_write(hdlcd, HDLCD_REG_INT_CLEAR, irq_status);

+0 −1
Original line number Diff line number Diff line
@@ -10,7 +10,6 @@ struct hdlcd_drm_private {
	struct clk			*clk;
	struct drm_fbdev_cma		*fbdev;
	struct drm_framebuffer		*fb;
	struct list_head		event_list;
	struct drm_crtc			crtc;
	struct drm_plane		*plane;
	struct drm_atomic_state		*state;