drm/tilcdc: Write to LCDC_END_OF_INT_IND_REG at the end of IRQ function
Reorder the IRQ function so that the write to LCDC_END_OF_INT_IND_REG is done last. The write to LCDC_END_OF_INT_IND_REG indicates to LCDC that the interrupt service routine has completed (see section 13.3.6.1.6 in AM335x TRM). This is needed if LCDC's ipgvmodirq module is configured for pulse interrupts. Signed-off-by: Jyri Sarha <jsarha@ti.com>
This commit is contained in:
@@ -725,12 +725,16 @@ irqreturn_t tilcdc_crtc_irq(struct drm_crtc *crtc)
|
|||||||
tilcdc_crtc->frame_intact = true;
|
tilcdc_crtc->frame_intact = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (stat & LCDC_FIFO_UNDERFLOW)
|
||||||
|
dev_err_ratelimited(dev->dev, "%s(0x%08x): FIFO underfow",
|
||||||
|
__func__, stat);
|
||||||
|
|
||||||
|
/* For revision 2 only */
|
||||||
if (priv->rev == 2) {
|
if (priv->rev == 2) {
|
||||||
if (stat & LCDC_FRAME_DONE) {
|
if (stat & LCDC_FRAME_DONE) {
|
||||||
tilcdc_crtc->frame_done = true;
|
tilcdc_crtc->frame_done = true;
|
||||||
wake_up(&tilcdc_crtc->frame_done_wq);
|
wake_up(&tilcdc_crtc->frame_done_wq);
|
||||||
}
|
}
|
||||||
tilcdc_write(dev, LCDC_END_OF_INT_IND_REG, 0);
|
|
||||||
|
|
||||||
if (stat & LCDC_SYNC_LOST) {
|
if (stat & LCDC_SYNC_LOST) {
|
||||||
dev_err_ratelimited(dev->dev, "%s(0x%08x): Sync lost",
|
dev_err_ratelimited(dev->dev, "%s(0x%08x): Sync lost",
|
||||||
@@ -743,11 +747,12 @@ irqreturn_t tilcdc_crtc_irq(struct drm_crtc *crtc)
|
|||||||
LCDC_SYNC_LOST);
|
LCDC_SYNC_LOST);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
if (stat & LCDC_FIFO_UNDERFLOW)
|
/* Indicate to LCDC that the interrupt service routine has
|
||||||
dev_err_ratelimited(dev->dev, "%s(0x%08x): FIFO underfow",
|
* completed, see 13.3.6.1.6 in AM335x TRM.
|
||||||
__func__, stat);
|
*/
|
||||||
|
tilcdc_write(dev, LCDC_END_OF_INT_IND_REG, 0);
|
||||||
|
}
|
||||||
|
|
||||||
return IRQ_HANDLED;
|
return IRQ_HANDLED;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user