diff options
author | Laurent Pinchart <laurent.pinchart@ideasonboard.com> | 2016-04-18 20:07:59 -0400 |
---|---|---|
committer | Laurent Pinchart <laurent.pinchart@ideasonboard.com> | 2016-12-19 04:25:04 -0500 |
commit | 84e1d4578fe9de486b367cc22a405f4a299ab17c (patch) | |
tree | 9011bc8711fd0bf6836bfb55fb009552c9285437 /drivers/gpu/drm/omapdrm/omap_irq.c | |
parent | 80f91bffb784940fca9ac56b97ac0c3101f6e806 (diff) |
drm: omapdrm: Remove global variables
Move the list of pending IRQ wait instances to the omap_drm_private
structure and the wait queue head to the IRQ wait structure.
Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Reviewed-by: Tomi Valkeinen <tomi.valkeinen@ti.com>
Diffstat (limited to 'drivers/gpu/drm/omapdrm/omap_irq.c')
-rw-r--r-- | drivers/gpu/drm/omapdrm/omap_irq.c | 42 |
1 files changed, 22 insertions, 20 deletions
diff --git a/drivers/gpu/drm/omapdrm/omap_irq.c b/drivers/gpu/drm/omapdrm/omap_irq.c index 0ef2d609653e..9adfa7c99695 100644 --- a/drivers/gpu/drm/omapdrm/omap_irq.c +++ b/drivers/gpu/drm/omapdrm/omap_irq.c | |||
@@ -19,22 +19,21 @@ | |||
19 | 19 | ||
20 | #include "omap_drv.h" | 20 | #include "omap_drv.h" |
21 | 21 | ||
22 | static DEFINE_SPINLOCK(list_lock); | ||
23 | |||
24 | struct omap_irq_wait { | 22 | struct omap_irq_wait { |
25 | struct list_head node; | 23 | struct list_head node; |
24 | wait_queue_head_t wq; | ||
26 | uint32_t irqmask; | 25 | uint32_t irqmask; |
27 | int count; | 26 | int count; |
28 | }; | 27 | }; |
29 | 28 | ||
30 | /* call with list_lock and dispc runtime held */ | 29 | /* call with wait_lock and dispc runtime held */ |
31 | static void omap_irq_update(struct drm_device *dev) | 30 | static void omap_irq_update(struct drm_device *dev) |
32 | { | 31 | { |
33 | struct omap_drm_private *priv = dev->dev_private; | 32 | struct omap_drm_private *priv = dev->dev_private; |
34 | struct omap_irq_wait *wait; | 33 | struct omap_irq_wait *wait; |
35 | uint32_t irqmask = priv->irq_mask; | 34 | uint32_t irqmask = priv->irq_mask; |
36 | 35 | ||
37 | assert_spin_locked(&list_lock); | 36 | assert_spin_locked(&priv->wait_lock); |
38 | 37 | ||
39 | list_for_each_entry(wait, &priv->wait_list, node) | 38 | list_for_each_entry(wait, &priv->wait_list, node) |
40 | irqmask |= wait->irqmask; | 39 | irqmask |= wait->irqmask; |
@@ -45,12 +44,10 @@ static void omap_irq_update(struct drm_device *dev) | |||
45 | dispc_read_irqenable(); /* flush posted write */ | 44 | dispc_read_irqenable(); /* flush posted write */ |
46 | } | 45 | } |
47 | 46 | ||
48 | static DECLARE_WAIT_QUEUE_HEAD(wait_event); | ||
49 | |||
50 | static void omap_irq_wait_handler(struct omap_irq_wait *wait) | 47 | static void omap_irq_wait_handler(struct omap_irq_wait *wait) |
51 | { | 48 | { |
52 | wait->count--; | 49 | wait->count--; |
53 | wake_up(&wait_event); | 50 | wake_up(&wait->wq); |
54 | } | 51 | } |
55 | 52 | ||
56 | struct omap_irq_wait * omap_irq_wait_init(struct drm_device *dev, | 53 | struct omap_irq_wait * omap_irq_wait_init(struct drm_device *dev, |
@@ -60,13 +57,14 @@ struct omap_irq_wait * omap_irq_wait_init(struct drm_device *dev, | |||
60 | struct omap_irq_wait *wait = kzalloc(sizeof(*wait), GFP_KERNEL); | 57 | struct omap_irq_wait *wait = kzalloc(sizeof(*wait), GFP_KERNEL); |
61 | unsigned long flags; | 58 | unsigned long flags; |
62 | 59 | ||
60 | init_waitqueue_head(&wait->wq); | ||
63 | wait->irqmask = irqmask; | 61 | wait->irqmask = irqmask; |
64 | wait->count = count; | 62 | wait->count = count; |
65 | 63 | ||
66 | spin_lock_irqsave(&list_lock, flags); | 64 | spin_lock_irqsave(&priv->wait_lock, flags); |
67 | list_add(&wait->node, &priv->wait_list); | 65 | list_add(&wait->node, &priv->wait_list); |
68 | omap_irq_update(dev); | 66 | omap_irq_update(dev); |
69 | spin_unlock_irqrestore(&list_lock, flags); | 67 | spin_unlock_irqrestore(&priv->wait_lock, flags); |
70 | 68 | ||
71 | return wait; | 69 | return wait; |
72 | } | 70 | } |
@@ -74,13 +72,16 @@ struct omap_irq_wait * omap_irq_wait_init(struct drm_device *dev, | |||
74 | int omap_irq_wait(struct drm_device *dev, struct omap_irq_wait *wait, | 72 | int omap_irq_wait(struct drm_device *dev, struct omap_irq_wait *wait, |
75 | unsigned long timeout) | 73 | unsigned long timeout) |
76 | { | 74 | { |
77 | int ret = wait_event_timeout(wait_event, (wait->count <= 0), timeout); | 75 | struct omap_drm_private *priv = dev->dev_private; |
78 | unsigned long flags; | 76 | unsigned long flags; |
77 | int ret; | ||
78 | |||
79 | ret = wait_event_timeout(wait->wq, (wait->count <= 0), timeout); | ||
79 | 80 | ||
80 | spin_lock_irqsave(&list_lock, flags); | 81 | spin_lock_irqsave(&priv->wait_lock, flags); |
81 | list_del(&wait->node); | 82 | list_del(&wait->node); |
82 | omap_irq_update(dev); | 83 | omap_irq_update(dev); |
83 | spin_unlock_irqrestore(&list_lock, flags); | 84 | spin_unlock_irqrestore(&priv->wait_lock, flags); |
84 | 85 | ||
85 | kfree(wait); | 86 | kfree(wait); |
86 | 87 | ||
@@ -108,10 +109,10 @@ int omap_irq_enable_vblank(struct drm_device *dev, unsigned int pipe) | |||
108 | 109 | ||
109 | DBG("dev=%p, crtc=%u", dev, pipe); | 110 | DBG("dev=%p, crtc=%u", dev, pipe); |
110 | 111 | ||
111 | spin_lock_irqsave(&list_lock, flags); | 112 | spin_lock_irqsave(&priv->wait_lock, flags); |
112 | priv->irq_mask |= dispc_mgr_get_vsync_irq(omap_crtc_channel(crtc)); | 113 | priv->irq_mask |= dispc_mgr_get_vsync_irq(omap_crtc_channel(crtc)); |
113 | omap_irq_update(dev); | 114 | omap_irq_update(dev); |
114 | spin_unlock_irqrestore(&list_lock, flags); | 115 | spin_unlock_irqrestore(&priv->wait_lock, flags); |
115 | 116 | ||
116 | return 0; | 117 | return 0; |
117 | } | 118 | } |
@@ -133,10 +134,10 @@ void omap_irq_disable_vblank(struct drm_device *dev, unsigned int pipe) | |||
133 | 134 | ||
134 | DBG("dev=%p, crtc=%u", dev, pipe); | 135 | DBG("dev=%p, crtc=%u", dev, pipe); |
135 | 136 | ||
136 | spin_lock_irqsave(&list_lock, flags); | 137 | spin_lock_irqsave(&priv->wait_lock, flags); |
137 | priv->irq_mask &= ~dispc_mgr_get_vsync_irq(omap_crtc_channel(crtc)); | 138 | priv->irq_mask &= ~dispc_mgr_get_vsync_irq(omap_crtc_channel(crtc)); |
138 | omap_irq_update(dev); | 139 | omap_irq_update(dev); |
139 | spin_unlock_irqrestore(&list_lock, flags); | 140 | spin_unlock_irqrestore(&priv->wait_lock, flags); |
140 | } | 141 | } |
141 | 142 | ||
142 | static void omap_irq_fifo_underflow(struct omap_drm_private *priv, | 143 | static void omap_irq_fifo_underflow(struct omap_drm_private *priv, |
@@ -160,9 +161,9 @@ static void omap_irq_fifo_underflow(struct omap_drm_private *priv, | |||
160 | | DISPC_IRQ_VID3_FIFO_UNDERFLOW; | 161 | | DISPC_IRQ_VID3_FIFO_UNDERFLOW; |
161 | unsigned int i; | 162 | unsigned int i; |
162 | 163 | ||
163 | spin_lock(&list_lock); | 164 | spin_lock(&priv->wait_lock); |
164 | irqstatus &= priv->irq_mask & mask; | 165 | irqstatus &= priv->irq_mask & mask; |
165 | spin_unlock(&list_lock); | 166 | spin_unlock(&priv->wait_lock); |
166 | 167 | ||
167 | if (!irqstatus) | 168 | if (!irqstatus) |
168 | return; | 169 | return; |
@@ -219,12 +220,12 @@ static irqreturn_t omap_irq_handler(int irq, void *arg) | |||
219 | omap_irq_ocp_error_handler(irqstatus); | 220 | omap_irq_ocp_error_handler(irqstatus); |
220 | omap_irq_fifo_underflow(priv, irqstatus); | 221 | omap_irq_fifo_underflow(priv, irqstatus); |
221 | 222 | ||
222 | spin_lock_irqsave(&list_lock, flags); | 223 | spin_lock_irqsave(&priv->wait_lock, flags); |
223 | list_for_each_entry_safe(wait, n, &priv->wait_list, node) { | 224 | list_for_each_entry_safe(wait, n, &priv->wait_list, node) { |
224 | if (wait->irqmask & irqstatus) | 225 | if (wait->irqmask & irqstatus) |
225 | omap_irq_wait_handler(wait); | 226 | omap_irq_wait_handler(wait); |
226 | } | 227 | } |
227 | spin_unlock_irqrestore(&list_lock, flags); | 228 | spin_unlock_irqrestore(&priv->wait_lock, flags); |
228 | 229 | ||
229 | return IRQ_HANDLED; | 230 | return IRQ_HANDLED; |
230 | } | 231 | } |
@@ -251,6 +252,7 @@ int omap_drm_irq_install(struct drm_device *dev) | |||
251 | unsigned int i; | 252 | unsigned int i; |
252 | int ret; | 253 | int ret; |
253 | 254 | ||
255 | spin_lock_init(&priv->wait_lock); | ||
254 | INIT_LIST_HEAD(&priv->wait_list); | 256 | INIT_LIST_HEAD(&priv->wait_list); |
255 | 257 | ||
256 | priv->irq_mask = DISPC_IRQ_OCP_ERR; | 258 | priv->irq_mask = DISPC_IRQ_OCP_ERR; |