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 | |
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>
-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; |