diff options
| author | Daniel Vetter <daniel.vetter@ffwll.ch> | 2016-05-31 12:21:13 -0400 |
|---|---|---|
| committer | Liviu Dudau <Liviu.Dudau@arm.com> | 2016-06-02 12:44:05 -0400 |
| commit | 38c8c22c12e99b70fc59ea7ef4d0bb24c11e5ddd (patch) | |
| tree | 6a739e94f0bbc1345acdef66852dea959961d8c8 /drivers/gpu/drm/arm | |
| parent | a95acec16d932ac78c2f70dc95a83bd162595d6c (diff) | |
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 <daniel.vetter@intel.com>
Acked-by: Liviu Dudau <Liviu.Dudau@arm.com>
Diffstat (limited to 'drivers/gpu/drm/arm')
| -rw-r--r-- | drivers/gpu/drm/arm/hdlcd_crtc.c | 18 | ||||
| -rw-r--r-- | drivers/gpu/drm/arm/hdlcd_drv.c | 19 | ||||
| -rw-r--r-- | drivers/gpu/drm/arm/hdlcd_drv.h | 1 |
3 files changed, 9 insertions, 29 deletions
diff --git a/drivers/gpu/drm/arm/hdlcd_crtc.c b/drivers/gpu/drm/arm/hdlcd_crtc.c index d1e8d31e37ee..97326c3d7a3a 100644 --- a/drivers/gpu/drm/arm/hdlcd_crtc.c +++ b/drivers/gpu/drm/arm/hdlcd_crtc.c | |||
| @@ -189,19 +189,17 @@ static void hdlcd_crtc_atomic_begin(struct drm_crtc *crtc, | |||
| 189 | struct drm_crtc_state *state) | 189 | struct drm_crtc_state *state) |
| 190 | { | 190 | { |
| 191 | struct hdlcd_drm_private *hdlcd = crtc_to_hdlcd_priv(crtc); | 191 | struct hdlcd_drm_private *hdlcd = crtc_to_hdlcd_priv(crtc); |
| 192 | unsigned long flags; | 192 | struct drm_pending_vblank_event *event = crtc->state->event; |
| 193 | |||
| 194 | if (crtc->state->event) { | ||
| 195 | struct drm_pending_vblank_event *event = crtc->state->event; | ||
| 196 | 193 | ||
| 194 | if (event) { | ||
| 197 | crtc->state->event = NULL; | 195 | crtc->state->event = NULL; |
| 198 | event->pipe = drm_crtc_index(crtc); | ||
| 199 | |||
| 200 | WARN_ON(drm_crtc_vblank_get(crtc) != 0); | ||
| 201 | 196 | ||
| 202 | spin_lock_irqsave(&crtc->dev->event_lock, flags); | 197 | spin_lock_irq(&crtc->dev->event_lock); |
| 203 | list_add_tail(&event->base.link, &hdlcd->event_list); | 198 | if (drm_crtc_vblank_get(crtc) == 0) |
| 204 | spin_unlock_irqrestore(&crtc->dev->event_lock, flags); | 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); | ||
| 205 | } | 203 | } |
| 206 | } | 204 | } |
| 207 | 205 | ||
diff --git a/drivers/gpu/drm/arm/hdlcd_drv.c b/drivers/gpu/drm/arm/hdlcd_drv.c index 21b1427fc918..fb172d252492 100644 --- a/drivers/gpu/drm/arm/hdlcd_drv.c +++ b/drivers/gpu/drm/arm/hdlcd_drv.c | |||
| @@ -49,8 +49,6 @@ static int hdlcd_load(struct drm_device *drm, unsigned long flags) | |||
| 49 | atomic_set(&hdlcd->dma_end_count, 0); | 49 | atomic_set(&hdlcd->dma_end_count, 0); |
| 50 | #endif | 50 | #endif |
| 51 | 51 | ||
| 52 | INIT_LIST_HEAD(&hdlcd->event_list); | ||
| 53 | |||
| 54 | res = platform_get_resource(pdev, IORESOURCE_MEM, 0); | 52 | res = platform_get_resource(pdev, IORESOURCE_MEM, 0); |
| 55 | hdlcd->mmio = devm_ioremap_resource(drm->dev, res); | 53 | hdlcd->mmio = devm_ioremap_resource(drm->dev, res); |
| 56 | if (IS_ERR(hdlcd->mmio)) { | 54 | if (IS_ERR(hdlcd->mmio)) { |
| @@ -160,24 +158,9 @@ static irqreturn_t hdlcd_irq(int irq, void *arg) | |||
| 160 | atomic_inc(&hdlcd->vsync_count); | 158 | atomic_inc(&hdlcd->vsync_count); |
| 161 | 159 | ||
| 162 | #endif | 160 | #endif |
| 163 | if (irq_status & HDLCD_INTERRUPT_VSYNC) { | 161 | if (irq_status & HDLCD_INTERRUPT_VSYNC) |
| 164 | bool events_sent = false; | ||
| 165 | unsigned long flags; | ||
| 166 | struct drm_pending_vblank_event *e, *t; | ||
| 167 | |||
| 168 | drm_crtc_handle_vblank(&hdlcd->crtc); | 162 | drm_crtc_handle_vblank(&hdlcd->crtc); |
| 169 | 163 | ||
| 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 | |||
| 181 | /* acknowledge interrupt(s) */ | 164 | /* acknowledge interrupt(s) */ |
| 182 | hdlcd_write(hdlcd, HDLCD_REG_INT_CLEAR, irq_status); | 165 | hdlcd_write(hdlcd, HDLCD_REG_INT_CLEAR, irq_status); |
| 183 | 166 | ||
diff --git a/drivers/gpu/drm/arm/hdlcd_drv.h b/drivers/gpu/drm/arm/hdlcd_drv.h index e7cea8233958..922a1dc7cb88 100644 --- a/drivers/gpu/drm/arm/hdlcd_drv.h +++ b/drivers/gpu/drm/arm/hdlcd_drv.h | |||
| @@ -10,7 +10,6 @@ struct hdlcd_drm_private { | |||
| 10 | struct clk *clk; | 10 | struct clk *clk; |
| 11 | struct drm_fbdev_cma *fbdev; | 11 | struct drm_fbdev_cma *fbdev; |
| 12 | struct drm_framebuffer *fb; | 12 | struct drm_framebuffer *fb; |
| 13 | struct list_head event_list; | ||
| 14 | struct drm_crtc crtc; | 13 | struct drm_crtc crtc; |
| 15 | struct drm_plane *plane; | 14 | struct drm_plane *plane; |
| 16 | struct drm_atomic_state *state; | 15 | struct drm_atomic_state *state; |
