From: bui duc phuc <[email protected]> The IRQ is shared, so fsl_sai_isr() may run while the SAI is runtime suspended. The regmap is then in cache-only mode, so regmap_read() fails and xcsr is used uninitialized.
Check the return value of regmap_read() for both TCSR and RCSR, and skip the handling of the corresponding direction on failure. Signed-off-by: bui duc phuc <[email protected]> --- sound/soc/fsl/fsl_sai.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/sound/soc/fsl/fsl_sai.c b/sound/soc/fsl/fsl_sai.c index 25243b6859d6..5c50ed7c2258 100644 --- a/sound/soc/fsl/fsl_sai.c +++ b/sound/soc/fsl/fsl_sai.c @@ -148,7 +148,8 @@ static irqreturn_t fsl_sai_isr(int irq, void *devid) mask = (FSL_SAI_FLAGS >> FSL_SAI_CSR_xIE_SHIFT) << FSL_SAI_CSR_xF_SHIFT; /* Tx IRQ */ - regmap_read(sai->regmap, FSL_SAI_TCSR(ofs), &xcsr); + if (regmap_read(sai->regmap, FSL_SAI_TCSR(ofs), &xcsr)) + return IRQ_NONE; flags = xcsr & mask; if (flags) @@ -179,7 +180,8 @@ static irqreturn_t fsl_sai_isr(int irq, void *devid) irq_rx: /* Rx IRQ */ - regmap_read(sai->regmap, FSL_SAI_RCSR(ofs), &xcsr); + if (regmap_read(sai->regmap, FSL_SAI_RCSR(ofs), &xcsr)) + goto out; flags = xcsr & mask; if (flags) -- 2.43.0
