aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRussell King <rmk+kernel@arm.linux.org.uk>2015-06-29 12:52:16 -0400
committerRussell King <rmk+kernel@arm.linux.org.uk>2015-09-15 11:26:49 -0400
commit7c8f7e1abc75b853adf60d8ee0a589e058bcdb6b (patch)
tree71bd92451f11dbd7a7cc71e67eaf3257d5de997b
parent0fb2970b4b6bfc26817a731b8bc29a9bf9177c20 (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.c46
-rw-r--r--drivers/gpu/drm/armada/armada_crtc.h17
-rw-r--r--drivers/gpu/drm/armada/armada_drm.h16
-rw-r--r--drivers/gpu/drm/armada/armada_drv.c23
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
176void 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
194void 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
203static 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
176static int armada_drm_crtc_queue_frame_work(struct armada_crtc *dcrtc, 214static 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
357static void armada_drm_crtc_irq(struct armada_crtc *dcrtc, u32 stat) 395static 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
78struct armada_vbl_event {
79 struct list_head node;
80 void *data;
81 void (*fn)(struct armada_crtc *, void *);
82};
83
84void armada_drm_vbl_event_add(struct armada_crtc *,
85 struct armada_vbl_event *);
86void 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
78void armada_drm_crtc_gamma_set(struct drm_crtc *, u16, u16, u16, int); 95void armada_drm_crtc_gamma_set(struct drm_crtc *, u16, u16, u16, int);
79void armada_drm_crtc_gamma_get(struct drm_crtc *, u16 *, u16 *, u16 *, int); 96void armada_drm_crtc_gamma_get(struct drm_crtc *, u16 *, u16 *, u16 *, int);
80void armada_drm_crtc_disable_irq(struct armada_crtc *, u32); 97void 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
40struct armada_vbl_event {
41 struct list_head node;
42 void *data;
43 void (*fn)(struct armada_crtc *, void *);
44};
45void armada_drm_vbl_event_add(struct armada_crtc *,
46 struct armada_vbl_event *);
47void 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
57struct armada_private; 41struct 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
151void 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
165void 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. */
175static int armada_drm_enable_vblank(struct drm_device *dev, int crtc) 152static int armada_drm_enable_vblank(struct drm_device *dev, int crtc)
176{ 153{