aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/gpu/drm/omapdrm/omap_irq.c')
-rw-r--r--drivers/gpu/drm/omapdrm/omap_irq.c18
1 files changed, 18 insertions, 0 deletions
diff --git a/drivers/gpu/drm/omapdrm/omap_irq.c b/drivers/gpu/drm/omapdrm/omap_irq.c
index 7e5374f201b7..1fa68a206253 100644
--- a/drivers/gpu/drm/omapdrm/omap_irq.c
+++ b/drivers/gpu/drm/omapdrm/omap_irq.c
@@ -18,6 +18,7 @@
18 */ 18 */
19 19
20#include "omap_drv.h" 20#include "omap_drv.h"
21#include <video/omapdss.h>
21 22
22static DEFINE_SPINLOCK(list_lock); 23static DEFINE_SPINLOCK(list_lock);
23 24
@@ -187,6 +188,12 @@ void omap_irq_disable_vblank(struct drm_device *dev, unsigned int pipe)
187 spin_unlock_irqrestore(&list_lock, flags); 188 spin_unlock_irqrestore(&list_lock, flags);
188} 189}
189 190
191#define A15_DSS_IRQ_MASK (DISPC_IRQ_VSYNC | DISPC_IRQ_FRAMEDONE | DISPC_IRQ_SYNC_LOST | \
192 DISPC_IRQ_EVSYNC_ODD | DISPC_IRQ_EVSYNC_EVEN | DISPC_IRQ_FRAMEDONETV | \
193 DISPC_IRQ_SYNC_LOST_DIGIT | DISPC_IRQ_VSYNC2 | DISPC_IRQ_FRAMEDONE2 | \
194 DISPC_IRQ_VSYNC3 | DISPC_IRQ_FRAMEDONE3 | DISPC_IRQ_SYNC_LOST3 | \
195 DISPC_IRQ_GFX_FIFO_UNDERFLOW | DISPC_IRQ_VID1_FIFO_UNDERFLOW)
196
190static irqreturn_t omap_irq_handler(int irq, void *arg) 197static irqreturn_t omap_irq_handler(int irq, void *arg)
191{ 198{
192 struct drm_device *dev = (struct drm_device *) arg; 199 struct drm_device *dev = (struct drm_device *) arg;
@@ -195,8 +202,19 @@ static irqreturn_t omap_irq_handler(int irq, void *arg)
195 unsigned long flags; 202 unsigned long flags;
196 unsigned int id; 203 unsigned int id;
197 u32 irqstatus; 204 u32 irqstatus;
205 u32 irqenable;
198 206
199 irqstatus = priv->dispc_ops->read_irqstatus(); 207 irqstatus = priv->dispc_ops->read_irqstatus();
208 irqenable = priv->dispc_ops->read_irqenable();
209 irqstatus &= irqenable;
210
211 if (omapdss_display_share()) {
212 if ((irqstatus & A15_DSS_IRQ_MASK) == 0x0000) {
213 udelay(1000);
214 return IRQ_HANDLED;
215 }
216 }
217
200 priv->dispc_ops->clear_irqstatus(irqstatus); 218 priv->dispc_ops->clear_irqstatus(irqstatus);
201 priv->dispc_ops->read_irqstatus(); /* flush posted write */ 219 priv->dispc_ops->read_irqstatus(); /* flush posted write */
202 220