Skip to content

Commit 38c8c22

Browse files
danvetdliviu
authored andcommitted
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: Daniel Vetter <[email protected]> Acked-by: Liviu Dudau <[email protected]>
1 parent a95acec commit 38c8c22

File tree

3 files changed

+9
-29
lines changed

3 files changed

+9
-29
lines changed

drivers/gpu/drm/arm/hdlcd_crtc.c

Lines changed: 8 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -189,19 +189,17 @@ static void hdlcd_crtc_atomic_begin(struct drm_crtc *crtc,
189189
struct drm_crtc_state *state)
190190
{
191191
struct hdlcd_drm_private *hdlcd = crtc_to_hdlcd_priv(crtc);
192-
unsigned long flags;
193-
194-
if (crtc->state->event) {
195-
struct drm_pending_vblank_event *event = crtc->state->event;
192+
struct drm_pending_vblank_event *event = crtc->state->event;
196193

194+
if (event) {
197195
crtc->state->event = NULL;
198-
event->pipe = drm_crtc_index(crtc);
199-
200-
WARN_ON(drm_crtc_vblank_get(crtc) != 0);
201196

202-
spin_lock_irqsave(&crtc->dev->event_lock, flags);
203-
list_add_tail(&event->base.link, &hdlcd->event_list);
204-
spin_unlock_irqrestore(&crtc->dev->event_lock, flags);
197+
spin_lock_irq(&crtc->dev->event_lock);
198+
if (drm_crtc_vblank_get(crtc) == 0)
199+
drm_crtc_arm_vblank_event(crtc, event);
200+
else
201+
drm_crtc_send_vblank_event(crtc, event);
202+
spin_unlock_irq(&crtc->dev->event_lock);
205203
}
206204
}
207205

drivers/gpu/drm/arm/hdlcd_drv.c

Lines changed: 1 addition & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -49,8 +49,6 @@ static int hdlcd_load(struct drm_device *drm, unsigned long flags)
4949
atomic_set(&hdlcd->dma_end_count, 0);
5050
#endif
5151

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

162160
#endif
163-
if (irq_status & HDLCD_INTERRUPT_VSYNC) {
164-
bool events_sent = false;
165-
unsigned long flags;
166-
struct drm_pending_vblank_event *e, *t;
167-
161+
if (irq_status & HDLCD_INTERRUPT_VSYNC)
168162
drm_crtc_handle_vblank(&hdlcd->crtc);
169163

170-
spin_lock_irqsave(&drm->event_lock, flags);
171-
list_for_each_entry_safe(e, t, &hdlcd->event_list, base.link) {
172-
list_del(&e->base.link);
173-
drm_crtc_send_vblank_event(&hdlcd->crtc, e);
174-
events_sent = true;
175-
}
176-
if (events_sent)
177-
drm_crtc_vblank_put(&hdlcd->crtc);
178-
spin_unlock_irqrestore(&drm->event_lock, flags);
179-
}
180-
181164
/* acknowledge interrupt(s) */
182165
hdlcd_write(hdlcd, HDLCD_REG_INT_CLEAR, irq_status);
183166

drivers/gpu/drm/arm/hdlcd_drv.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@ struct hdlcd_drm_private {
1010
struct clk *clk;
1111
struct drm_fbdev_cma *fbdev;
1212
struct drm_framebuffer *fb;
13-
struct list_head event_list;
1413
struct drm_crtc crtc;
1514
struct drm_plane *plane;
1615
struct drm_atomic_state *state;

0 commit comments

Comments
 (0)