Enable micfil error interrupt, in the error handler,
FIFO state and OUT state need to be cleared.

Signed-off-by: Shengjiu Wang <shengjiu.w...@nxp.com>
---
 sound/soc/fsl/fsl_micfil.c | 16 ++++++++++++++--
 1 file changed, 14 insertions(+), 2 deletions(-)

diff --git a/sound/soc/fsl/fsl_micfil.c b/sound/soc/fsl/fsl_micfil.c
index 6ecf46e9ac4c..0930d8c9b8d7 100644
--- a/sound/soc/fsl/fsl_micfil.c
+++ b/sound/soc/fsl/fsl_micfil.c
@@ -651,7 +651,7 @@ static int fsl_micfil_trigger(struct snd_pcm_substream 
*substream, int cmd,
 
                /* Enable the module */
                ret = regmap_set_bits(micfil->regmap, REG_MICFIL_CTRL1,
-                                     MICFIL_CTRL1_PDMIEN);
+                                     MICFIL_CTRL1_PDMIEN | MICFIL_CTRL1_ERREN);
                if (ret)
                        return ret;
 
@@ -667,7 +667,7 @@ static int fsl_micfil_trigger(struct snd_pcm_substream 
*substream, int cmd,
 
                /* Disable the module */
                ret = regmap_clear_bits(micfil->regmap, REG_MICFIL_CTRL1,
-                                       MICFIL_CTRL1_PDMIEN);
+                                       MICFIL_CTRL1_PDMIEN | 
MICFIL_CTRL1_ERREN);
                if (ret)
                        return ret;
 
@@ -940,6 +940,7 @@ static bool fsl_micfil_volatile_reg(struct device *dev, 
unsigned int reg)
 {
        switch (reg) {
        case REG_MICFIL_STAT:
+       case REG_MICFIL_FIFO_STAT:
        case REG_MICFIL_DATACH0:
        case REG_MICFIL_DATACH1:
        case REG_MICFIL_DATACH2:
@@ -948,6 +949,7 @@ static bool fsl_micfil_volatile_reg(struct device *dev, 
unsigned int reg)
        case REG_MICFIL_DATACH5:
        case REG_MICFIL_DATACH6:
        case REG_MICFIL_DATACH7:
+       case REG_MICFIL_OUT_STAT:
        case REG_MICFIL_VERID:
        case REG_MICFIL_PARAM:
        case REG_MICFIL_VAD0_STAT:
@@ -1024,6 +1026,8 @@ static irqreturn_t micfil_err_isr(int irq, void *devid)
 {
        struct fsl_micfil *micfil = (struct fsl_micfil *)devid;
        struct platform_device *pdev = micfil->pdev;
+       u32 fifo_stat_reg;
+       u32 out_stat_reg;
        u32 stat_reg;
 
        regmap_read(micfil->regmap, REG_MICFIL_STAT, &stat_reg);
@@ -1040,6 +1044,14 @@ static irqreturn_t micfil_err_isr(int irq, void *devid)
                                  MICFIL_STAT_LOWFREQF, MICFIL_STAT_LOWFREQF);
        }
 
+       regmap_read(micfil->regmap, REG_MICFIL_FIFO_STAT, &fifo_stat_reg);
+       regmap_write_bits(micfil->regmap, REG_MICFIL_FIFO_STAT,
+                         fifo_stat_reg, fifo_stat_reg);
+
+       regmap_read(micfil->regmap, REG_MICFIL_OUT_STAT, &out_stat_reg);
+       regmap_write_bits(micfil->regmap, REG_MICFIL_OUT_STAT,
+                         out_stat_reg, out_stat_reg);
+
        return IRQ_HANDLED;
 }
 
-- 
2.34.1


Reply via email to