diff options
Diffstat (limited to 'drivers/gpu/drm/omapdrm/omap_irq.c')
-rw-r--r-- | drivers/gpu/drm/omapdrm/omap_irq.c | 18 |
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 | ||
22 | static DEFINE_SPINLOCK(list_lock); | 23 | static 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 | |||
190 | static irqreturn_t omap_irq_handler(int irq, void *arg) | 197 | static 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 | ||