diff options
author | Russell King <rmk+kernel@arm.linux.org.uk> | 2015-06-29 12:52:16 -0400 |
---|---|---|
committer | Russell King <rmk+kernel@arm.linux.org.uk> | 2015-09-15 11:26:49 -0400 |
commit | 7c8f7e1abc75b853adf60d8ee0a589e058bcdb6b (patch) | |
tree | 71bd92451f11dbd7a7cc71e67eaf3257d5de997b | |
parent | 0fb2970b4b6bfc26817a731b8bc29a9bf9177c20 (diff) |
drm/armada: move vbl code into armada_crtc
Our vblank event code belongs in armada_crtc.c rather than the core of
the driver. Move it there.
Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
-rw-r--r-- | drivers/gpu/drm/armada/armada_crtc.c | 46 | ||||
-rw-r--r-- | drivers/gpu/drm/armada/armada_crtc.h | 17 | ||||
-rw-r--r-- | drivers/gpu/drm/armada/armada_drm.h | 16 | ||||
-rw-r--r-- | drivers/gpu/drm/armada/armada_drv.c | 23 |
4 files changed, 56 insertions, 46 deletions
diff --git a/drivers/gpu/drm/armada/armada_crtc.c b/drivers/gpu/drm/armada/armada_crtc.c index c7374a3ec67a..418594b19d1d 100644 --- a/drivers/gpu/drm/armada/armada_crtc.c +++ b/drivers/gpu/drm/armada/armada_crtc.c | |||
@@ -173,6 +173,44 @@ static unsigned armada_drm_crtc_calc_fb(struct drm_framebuffer *fb, | |||
173 | return i; | 173 | return i; |
174 | } | 174 | } |
175 | 175 | ||
176 | void armada_drm_vbl_event_add(struct armada_crtc *dcrtc, | ||
177 | struct armada_vbl_event *evt) | ||
178 | { | ||
179 | unsigned long flags; | ||
180 | bool not_on_list; | ||
181 | |||
182 | WARN_ON(drm_vblank_get(dcrtc->crtc.dev, dcrtc->num)); | ||
183 | |||
184 | spin_lock_irqsave(&dcrtc->irq_lock, flags); | ||
185 | not_on_list = list_empty(&evt->node); | ||
186 | if (not_on_list) | ||
187 | list_add_tail(&evt->node, &dcrtc->vbl_list); | ||
188 | spin_unlock_irqrestore(&dcrtc->irq_lock, flags); | ||
189 | |||
190 | if (!not_on_list) | ||
191 | drm_vblank_put(dcrtc->crtc.dev, dcrtc->num); | ||
192 | } | ||
193 | |||
194 | void armada_drm_vbl_event_remove(struct armada_crtc *dcrtc, | ||
195 | struct armada_vbl_event *evt) | ||
196 | { | ||
197 | if (!list_empty(&evt->node)) { | ||
198 | list_del_init(&evt->node); | ||
199 | drm_vblank_put(dcrtc->crtc.dev, dcrtc->num); | ||
200 | } | ||
201 | } | ||
202 | |||
203 | static void armada_drm_vbl_event_run(struct armada_crtc *dcrtc) | ||
204 | { | ||
205 | struct armada_vbl_event *e, *n; | ||
206 | |||
207 | list_for_each_entry_safe(e, n, &dcrtc->vbl_list, node) { | ||
208 | list_del_init(&e->node); | ||
209 | drm_vblank_put(dcrtc->crtc.dev, dcrtc->num); | ||
210 | e->fn(dcrtc, e->data); | ||
211 | } | ||
212 | } | ||
213 | |||
176 | static int armada_drm_crtc_queue_frame_work(struct armada_crtc *dcrtc, | 214 | static int armada_drm_crtc_queue_frame_work(struct armada_crtc *dcrtc, |
177 | struct armada_frame_work *work) | 215 | struct armada_frame_work *work) |
178 | { | 216 | { |
@@ -356,7 +394,6 @@ static bool armada_drm_crtc_mode_fixup(struct drm_crtc *crtc, | |||
356 | 394 | ||
357 | static void armada_drm_crtc_irq(struct armada_crtc *dcrtc, u32 stat) | 395 | static void armada_drm_crtc_irq(struct armada_crtc *dcrtc, u32 stat) |
358 | { | 396 | { |
359 | struct armada_vbl_event *e, *n; | ||
360 | void __iomem *base = dcrtc->base; | 397 | void __iomem *base = dcrtc->base; |
361 | 398 | ||
362 | if (stat & DMA_FF_UNDERFLOW) | 399 | if (stat & DMA_FF_UNDERFLOW) |
@@ -368,12 +405,7 @@ static void armada_drm_crtc_irq(struct armada_crtc *dcrtc, u32 stat) | |||
368 | drm_handle_vblank(dcrtc->crtc.dev, dcrtc->num); | 405 | drm_handle_vblank(dcrtc->crtc.dev, dcrtc->num); |
369 | 406 | ||
370 | spin_lock(&dcrtc->irq_lock); | 407 | spin_lock(&dcrtc->irq_lock); |
371 | 408 | armada_drm_vbl_event_run(dcrtc); | |
372 | list_for_each_entry_safe(e, n, &dcrtc->vbl_list, node) { | ||
373 | list_del_init(&e->node); | ||
374 | drm_vblank_put(dcrtc->crtc.dev, dcrtc->num); | ||
375 | e->fn(dcrtc, e->data); | ||
376 | } | ||
377 | 409 | ||
378 | if (stat & GRA_FRAME_IRQ && dcrtc->interlaced) { | 410 | if (stat & GRA_FRAME_IRQ && dcrtc->interlaced) { |
379 | int i = stat & GRA_FRAME_IRQ0 ? 0 : 1; | 411 | int i = stat & GRA_FRAME_IRQ0 ? 0 : 1; |
diff --git a/drivers/gpu/drm/armada/armada_crtc.h b/drivers/gpu/drm/armada/armada_crtc.h index a13469f5d72b..a86243ef4a51 100644 --- a/drivers/gpu/drm/armada/armada_crtc.h +++ b/drivers/gpu/drm/armada/armada_crtc.h | |||
@@ -75,6 +75,23 @@ struct armada_crtc { | |||
75 | }; | 75 | }; |
76 | #define drm_to_armada_crtc(c) container_of(c, struct armada_crtc, crtc) | 76 | #define drm_to_armada_crtc(c) container_of(c, struct armada_crtc, crtc) |
77 | 77 | ||
78 | struct armada_vbl_event { | ||
79 | struct list_head node; | ||
80 | void *data; | ||
81 | void (*fn)(struct armada_crtc *, void *); | ||
82 | }; | ||
83 | |||
84 | void armada_drm_vbl_event_add(struct armada_crtc *, | ||
85 | struct armada_vbl_event *); | ||
86 | void armada_drm_vbl_event_remove(struct armada_crtc *, | ||
87 | struct armada_vbl_event *); | ||
88 | #define armada_drm_vbl_event_init(_e, _f, _d) do { \ | ||
89 | struct armada_vbl_event *__e = _e; \ | ||
90 | INIT_LIST_HEAD(&__e->node); \ | ||
91 | __e->data = _d; \ | ||
92 | __e->fn = _f; \ | ||
93 | } while (0) | ||
94 | |||
78 | void armada_drm_crtc_gamma_set(struct drm_crtc *, u16, u16, u16, int); | 95 | void armada_drm_crtc_gamma_set(struct drm_crtc *, u16, u16, u16, int); |
79 | void armada_drm_crtc_gamma_get(struct drm_crtc *, u16 *, u16 *, u16 *, int); | 96 | void armada_drm_crtc_gamma_get(struct drm_crtc *, u16 *, u16 *, u16 *, int); |
80 | void armada_drm_crtc_disable_irq(struct armada_crtc *, u32); | 97 | void armada_drm_crtc_disable_irq(struct armada_crtc *, u32); |
diff --git a/drivers/gpu/drm/armada/armada_drm.h b/drivers/gpu/drm/armada/armada_drm.h index 5f6aef0dca59..4df6f2af2b21 100644 --- a/drivers/gpu/drm/armada/armada_drm.h +++ b/drivers/gpu/drm/armada/armada_drm.h | |||
@@ -37,22 +37,6 @@ static inline uint32_t armada_pitch(uint32_t width, uint32_t bpp) | |||
37 | return ALIGN(pitch, 128); | 37 | return ALIGN(pitch, 128); |
38 | } | 38 | } |
39 | 39 | ||
40 | struct armada_vbl_event { | ||
41 | struct list_head node; | ||
42 | void *data; | ||
43 | void (*fn)(struct armada_crtc *, void *); | ||
44 | }; | ||
45 | void armada_drm_vbl_event_add(struct armada_crtc *, | ||
46 | struct armada_vbl_event *); | ||
47 | void armada_drm_vbl_event_remove(struct armada_crtc *, | ||
48 | struct armada_vbl_event *); | ||
49 | #define armada_drm_vbl_event_init(_e, _f, _d) do { \ | ||
50 | struct armada_vbl_event *__e = _e; \ | ||
51 | INIT_LIST_HEAD(&__e->node); \ | ||
52 | __e->data = _d; \ | ||
53 | __e->fn = _f; \ | ||
54 | } while (0) | ||
55 | |||
56 | 40 | ||
57 | struct armada_private; | 41 | struct armada_private; |
58 | 42 | ||
diff --git a/drivers/gpu/drm/armada/armada_drv.c b/drivers/gpu/drm/armada/armada_drv.c index b373cf9b2f65..3f1396e673dd 100644 --- a/drivers/gpu/drm/armada/armada_drv.c +++ b/drivers/gpu/drm/armada/armada_drv.c | |||
@@ -148,29 +148,6 @@ static int armada_drm_unload(struct drm_device *dev) | |||
148 | return 0; | 148 | return 0; |
149 | } | 149 | } |
150 | 150 | ||
151 | void armada_drm_vbl_event_add(struct armada_crtc *dcrtc, | ||
152 | struct armada_vbl_event *evt) | ||
153 | { | ||
154 | unsigned long flags; | ||
155 | |||
156 | spin_lock_irqsave(&dcrtc->irq_lock, flags); | ||
157 | if (list_empty(&evt->node)) { | ||
158 | list_add_tail(&evt->node, &dcrtc->vbl_list); | ||
159 | |||
160 | drm_vblank_get(dcrtc->crtc.dev, dcrtc->num); | ||
161 | } | ||
162 | spin_unlock_irqrestore(&dcrtc->irq_lock, flags); | ||
163 | } | ||
164 | |||
165 | void armada_drm_vbl_event_remove(struct armada_crtc *dcrtc, | ||
166 | struct armada_vbl_event *evt) | ||
167 | { | ||
168 | if (!list_empty(&evt->node)) { | ||
169 | list_del_init(&evt->node); | ||
170 | drm_vblank_put(dcrtc->crtc.dev, dcrtc->num); | ||
171 | } | ||
172 | } | ||
173 | |||
174 | /* These are called under the vbl_lock. */ | 151 | /* These are called under the vbl_lock. */ |
175 | static int armada_drm_enable_vblank(struct drm_device *dev, int crtc) | 152 | static int armada_drm_enable_vblank(struct drm_device *dev, int crtc) |
176 | { | 153 | { |