#define ACP_ERROR_STAT 29
 #define PDM_DECIMATION_FACTOR  2
 #define ACP_PDM_CLK_FREQ_MASK  7
-#define ACP_WOV_MISC_CTRL_MASK 0x18
+#define ACP_WOV_GAIN_CONTROL   GENMASK(4, 3)
 #define ACP_PDM_ENABLE         1
 #define ACP_PDM_DISABLE                0
 #define ACP_PDM_DMA_EN_STATUS  2
 
 
 #include <linux/platform_device.h>
 #include <linux/module.h>
+#include <linux/bitfield.h>
 #include <linux/err.h>
 #include <linux/io.h>
 #include <sound/pcm_params.h>
 
 #define DRV_NAME "acp_ps_pdm_dma"
 
+static int pdm_gain = 3;
+module_param(pdm_gain, int, 0644);
+MODULE_PARM_DESC(pdm_gain, "Gain control (0-3)");
+
 static const struct snd_pcm_hardware acp63_pdm_hardware_capture = {
        .info = SNDRV_PCM_INFO_INTERLEAVED |
                SNDRV_PCM_INFO_BLOCK_TRANSFER |
 
        acp63_writel(pdm_clk_enable, acp_base + ACP_WOV_CLK_CTRL);
        pdm_ctrl = acp63_readl(acp_base + ACP_WOV_MISC_CTRL);
-       pdm_ctrl |= ACP_WOV_MISC_CTRL_MASK;
+       pdm_ctrl &= ~ACP_WOV_GAIN_CONTROL;
+       pdm_ctrl |= FIELD_PREP(ACP_WOV_GAIN_CONTROL, clamp(pdm_gain, 0, 3));
        acp63_writel(pdm_ctrl, acp_base + ACP_WOV_MISC_CTRL);
 }