bool use_verid;
        bool volume_sx;
        u64  formats;
+       int  fifo_offset;
 };
 
 static struct fsl_micfil_soc_data fsl_micfil_imx8mm = {
        .dataline =  0xf,
        .formats = SNDRV_PCM_FMTBIT_S16_LE,
        .volume_sx = true,
+       .fifo_offset = 0,
 };
 
 static struct fsl_micfil_soc_data fsl_micfil_imx8mp = {
        .dataline =  0xf,
        .formats = SNDRV_PCM_FMTBIT_S32_LE,
        .volume_sx = false,
+       .fifo_offset = 0,
 };
 
 static struct fsl_micfil_soc_data fsl_micfil_imx93 = {
        .use_edma = true,
        .use_verid = true,
        .volume_sx = false,
+       .fifo_offset = 0,
+};
+
+static struct fsl_micfil_soc_data fsl_micfil_imx943 = {
+       .imx = true,
+       .fifos = 8,
+       .fifo_depth = 32,
+       .dataline =  0xf,
+       .formats = SNDRV_PCM_FMTBIT_S32_LE,
+       .use_edma = true,
+       .use_verid = true,
+       .volume_sx = false,
+       .fifo_offset = -4,
 };
 
 static const struct of_device_id fsl_micfil_dt_ids[] = {
        { .compatible = "fsl,imx8mm-micfil", .data = &fsl_micfil_imx8mm },
        { .compatible = "fsl,imx8mp-micfil", .data = &fsl_micfil_imx8mp },
        { .compatible = "fsl,imx93-micfil", .data = &fsl_micfil_imx93 },
+       { .compatible = "fsl,imx943-micfil", .data = &fsl_micfil_imx943 },
        {}
 };
 MODULE_DEVICE_TABLE(of, fsl_micfil_dt_ids);
        ret = regmap_update_bits(micfil->regmap, REG_MICFIL_CTRL2,
                                 MICFIL_CTRL2_CLKDIV | MICFIL_CTRL2_CICOSR,
                                 FIELD_PREP(MICFIL_CTRL2_CLKDIV, clk_div) |
-                                FIELD_PREP(MICFIL_CTRL2_CICOSR, 16 - osr));
+                                FIELD_PREP(MICFIL_CTRL2_CICOSR, 32 - osr));
 
        /* Configure CIC OSR in VADCICOSR */
        regmap_update_bits(micfil->regmap, REG_MICFIL_VAD0_CTRL1,
        {REG_MICFIL_VAD0_ZCD,           0x00000004},
 };
 
+static const struct reg_default fsl_micfil_reg_defaults_v2[] = {
+       {REG_MICFIL_CTRL1,              0x00000000},
+       {REG_MICFIL_CTRL2,              0x00000000},
+       {REG_MICFIL_STAT,               0x00000000},
+       {REG_MICFIL_FIFO_CTRL,          0x0000001F},
+       {REG_MICFIL_FIFO_STAT,          0x00000000},
+       {REG_MICFIL_DATACH0 - 0x4,      0x00000000},
+       {REG_MICFIL_DATACH1 - 0x4,      0x00000000},
+       {REG_MICFIL_DATACH2 - 0x4,      0x00000000},
+       {REG_MICFIL_DATACH3 - 0x4,      0x00000000},
+       {REG_MICFIL_DATACH4 - 0x4,      0x00000000},
+       {REG_MICFIL_DATACH5 - 0x4,      0x00000000},
+       {REG_MICFIL_DATACH6 - 0x4,      0x00000000},
+       {REG_MICFIL_DATACH7 - 0x4,      0x00000000},
+       {REG_MICFIL_DC_CTRL,            0x00000000},
+       {REG_MICFIL_OUT_CTRL,           0x00000000},
+       {REG_MICFIL_OUT_STAT,           0x00000000},
+       {REG_MICFIL_VAD0_CTRL1,         0x00000000},
+       {REG_MICFIL_VAD0_CTRL2,         0x000A0000},
+       {REG_MICFIL_VAD0_STAT,          0x00000000},
+       {REG_MICFIL_VAD0_SCONFIG,       0x00000000},
+       {REG_MICFIL_VAD0_NCONFIG,       0x80000000},
+       {REG_MICFIL_VAD0_NDATA,         0x00000000},
+       {REG_MICFIL_VAD0_ZCD,           0x00000004},
+};
+
 static bool fsl_micfil_readable_reg(struct device *dev, unsigned int reg)
 {
        struct fsl_micfil *micfil = dev_get_drvdata(dev);
+       int ofs = micfil->soc->fifo_offset;
+
+       if (reg >= (REG_MICFIL_DATACH0 + ofs) && reg <= (REG_MICFIL_DATACH7 + ofs))
+               return true;
 
        switch (reg) {
        case REG_MICFIL_CTRL1:
        case REG_MICFIL_STAT:
        case REG_MICFIL_FIFO_CTRL:
        case REG_MICFIL_FIFO_STAT:
-       case REG_MICFIL_DATACH0:
-       case REG_MICFIL_DATACH1:
-       case REG_MICFIL_DATACH2:
-       case REG_MICFIL_DATACH3:
-       case REG_MICFIL_DATACH4:
-       case REG_MICFIL_DATACH5:
-       case REG_MICFIL_DATACH6:
-       case REG_MICFIL_DATACH7:
        case REG_MICFIL_DC_CTRL:
        case REG_MICFIL_OUT_CTRL:
        case REG_MICFIL_OUT_STAT:
 
 static bool fsl_micfil_volatile_reg(struct device *dev, unsigned int reg)
 {
+       struct fsl_micfil *micfil = dev_get_drvdata(dev);
+       int ofs = micfil->soc->fifo_offset;
+
+       if (reg >= (REG_MICFIL_DATACH0 + ofs) && reg <= (REG_MICFIL_DATACH7 + ofs))
+               return true;
+
        switch (reg) {
        case REG_MICFIL_STAT:
        case REG_MICFIL_FIFO_STAT:
-       case REG_MICFIL_DATACH0:
-       case REG_MICFIL_DATACH1:
-       case REG_MICFIL_DATACH2:
-       case REG_MICFIL_DATACH3:
-       case REG_MICFIL_DATACH4:
-       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:
        .cache_type = REGCACHE_MAPLE,
 };
 
+static const struct regmap_config fsl_micfil_regmap_config_v2 = {
+       .reg_bits = 32,
+       .reg_stride = 4,
+       .val_bits = 32,
+
+       .max_register = REG_MICFIL_VAD0_ZCD,
+       .reg_defaults = fsl_micfil_reg_defaults_v2,
+       .num_reg_defaults = ARRAY_SIZE(fsl_micfil_reg_defaults_v2),
+       .readable_reg = fsl_micfil_readable_reg,
+       .volatile_reg = fsl_micfil_volatile_reg,
+       .writeable_reg = fsl_micfil_writeable_reg,
+       .cache_type = REGCACHE_MAPLE,
+};
+
 /* END OF REGMAP */
 
 static irqreturn_t micfil_isr(int irq, void *devid)
        if (IS_ERR(regs))
                return PTR_ERR(regs);
 
-       micfil->regmap = devm_regmap_init_mmio(&pdev->dev,
-                                              regs,
-                                              &fsl_micfil_regmap_config);
+       if (of_device_is_compatible(np, "fsl,imx943-micfil"))
+               micfil->regmap = devm_regmap_init_mmio(&pdev->dev,
+                                                      regs,
+                                                      &fsl_micfil_regmap_config_v2);
+       else
+               micfil->regmap = devm_regmap_init_mmio(&pdev->dev,
+                                                      regs,
+                                                      &fsl_micfil_regmap_config);
        if (IS_ERR(micfil->regmap)) {
                dev_err(&pdev->dev, "failed to init MICFIL regmap: %ld\n",
                        PTR_ERR(micfil->regmap));
        }
 
        micfil->dma_params_rx.chan_name = "rx";
-       micfil->dma_params_rx.addr = res->start + REG_MICFIL_DATACH0;
+       micfil->dma_params_rx.addr = res->start + REG_MICFIL_DATACH0 + micfil->soc->fifo_offset;
        micfil->dma_params_rx.maxburst = MICFIL_DMA_MAXBURST_RX;
 
        platform_set_drvdata(pdev, micfil);