MLK-20546-2: drm/imx/dcss: check status bit when handling interrupts

Double check that the DTG IRQ STATUS register bit is set when handling
the vblank and CTXLD kick interrupts to make sure we avoid spurious
interrupts and kick the CTXLD in a bad moment.

Signed-off-by: Laurentiu Palcu <laurentiu.palcu@nxp.com>
Reviewed-by: Robert Chiras <robert.chiras@nxp.com>
(cherry picked from commit cc56e4e07f)
This commit is contained in:
Laurentiu Palcu 2019-03-25 14:29:17 +02:00
parent dd083eddfc
commit fd4a0405a9
3 changed files with 16 additions and 0 deletions

View File

@ -358,6 +358,9 @@ static irqreturn_t dcss_crtc_irq_handler(int irq, void *dev_id)
dcss_trace_module(TRACE_DRM_CRTC, TRACE_VBLANK);
if (!dcss_dtg_vblank_irq_valid(dcss))
return IRQ_HANDLED;
complete(&dcss_crtc->en_completion);
if (dcss_ctxld_is_flushed(dcss))

View File

@ -197,6 +197,9 @@ static irqreturn_t dcss_dtg_irq_handler(int irq, void *data)
status = dcss_readl(dtg->base_reg + DCSS_DTG_INT_STATUS);
if (!(status & LINE0_IRQ))
return IRQ_HANDLED;
dcss_ctxld_kick(dtg->dcss);
dcss_writel(status & LINE0_IRQ, dtg->base_reg + DCSS_DTG_INT_CONTROL);
@ -757,3 +760,12 @@ void dcss_dtg_vblank_irq_clear(struct dcss_soc *dcss)
dcss_update(LINE1_IRQ, LINE1_IRQ, reg);
}
bool dcss_dtg_vblank_irq_valid(struct dcss_soc *dcss)
{
struct dcss_dtg_priv *dtg = dcss->dtg_priv;
return !!(dcss_readl(dtg->base_reg + DCSS_DTG_INT_STATUS) & LINE1_IRQ);
}
EXPORT_SYMBOL(dcss_dtg_vblank_irq_valid);

View File

@ -100,6 +100,7 @@ bool dcss_dtg_global_alpha_changed(struct dcss_soc *dcss, int ch_num,
int use_global_alpha);
void dcss_dtg_css_set(struct dcss_soc *dcss, u32 pix_format);
void dcss_dtg_ctxld_kick_irq_enable(struct dcss_soc *dcss, bool en);
bool dcss_dtg_vblank_irq_valid(struct dcss_soc *dcss);
/* SUBSAM */
void dcss_ss_sync_set(struct dcss_soc *dcss, struct videomode *vm,