#define DA7210_STARTUP1                        0x03
 #define DA7210_MIC_L                   0x07
 #define DA7210_MIC_R                   0x08
+#define DA7210_AUX2                    0x0B
 #define DA7210_INMIX_L                 0x0D
 #define DA7210_INMIX_R                 0x0E
 #define DA7210_ADC_HPF                 0x0F
 #define DA7210_DAC_L                   0x15
 #define DA7210_DAC_R                   0x16
 #define DA7210_DAC_SEL                 0x17
+#define DA7210_SOFTMUTE                        0x18
 #define DA7210_DAC_EQ1_2               0x19
 #define DA7210_DAC_EQ3_4               0x1A
 #define DA7210_DAC_EQ5                 0x1B
 #define DA7210_HP_L_VOL                        0x21
 #define DA7210_HP_R_VOL                        0x22
 #define DA7210_HP_CFG                  0x23
+#define DA7210_ZERO_CROSS              0x24
 #define DA7210_DAI_SRC_SEL             0x25
 #define DA7210_DAI_CFG1                        0x26
 #define DA7210_DAI_CFG3                        0x28
 #define DA7210_PLL_FS_96000            (0xF << 0)
 #define DA7210_PLL_EN                  (0x1 << 7)
 
+/* SOFTMUTE bit fields */
+#define DA7210_RAMP_EN                 (1 << 6)
+
 #define DA7210_VERSION "0.0.1"
 
 /*
 static const struct soc_enum da7210_adc_vf_cutoff =
        SOC_ENUM_SINGLE(DA7210_ADC_HPF, 4, 8, da7210_vf_cutoff_txt);
 
+static const char *da7210_hp_mode_txt[] = {
+       "Class H", "Class G"
+};
+
+static const struct soc_enum da7210_hp_mode_sel =
+       SOC_ENUM_SINGLE(DA7210_HP_CFG, 0, 2, da7210_hp_mode_txt);
+
 static const struct snd_kcontrol_new da7210_snd_controls[] = {
 
        SOC_DOUBLE_R_TLV("HeadPhone Playback Volume",
        SOC_ENUM("ADC HPF Cutoff", da7210_adc_hpf_cutoff),
        SOC_SINGLE("ADC Voice Mode Switch", DA7210_ADC_HPF, 7, 1, 0),
        SOC_ENUM("ADC Voice Cutoff", da7210_adc_vf_cutoff),
+
+       /* Mute controls */
+       SOC_DOUBLE_R("Mic Capture Switch", DA7210_MIC_L, DA7210_MIC_R, 3, 1, 0),
+       SOC_SINGLE("Aux2 Capture Switch", DA7210_AUX2, 2, 1, 0),
+       SOC_DOUBLE("ADC Capture Switch", DA7210_ADC, 2, 6, 1, 0),
+       SOC_SINGLE("Digital Soft Mute Switch", DA7210_SOFTMUTE, 7, 1, 0),
+       SOC_SINGLE("Digital Soft Mute Rate", DA7210_SOFTMUTE, 0, 0x7, 0),
+
+       /* Zero cross controls */
+       SOC_DOUBLE("Aux1 ZC Switch", DA7210_ZERO_CROSS, 0, 1, 1, 0),
+       SOC_DOUBLE("In PGA ZC Switch", DA7210_ZERO_CROSS, 2, 3, 1, 0),
+       SOC_DOUBLE("Lineout ZC Switch", DA7210_ZERO_CROSS, 4, 5, 1, 0),
+       SOC_DOUBLE("Headphone ZC Switch", DA7210_ZERO_CROSS, 6, 7, 1, 0),
+
+       SOC_ENUM("Headphone Class", da7210_hp_mode_sel),
 };
 
 /* Codec private data */
        return 0;
 }
 
+static int da7210_mute(struct snd_soc_dai *dai, int mute)
+{
+       struct snd_soc_codec *codec = dai->codec;
+       u8 mute_reg = snd_soc_read(codec, DA7210_DAC_HPF) & 0xFB;
+
+       if (mute)
+               snd_soc_write(codec, DA7210_DAC_HPF, mute_reg | 0x4);
+       else
+               snd_soc_write(codec, DA7210_DAC_HPF, mute_reg);
+       return 0;
+}
+
 #define DA7210_FORMATS (SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S20_3LE |\
                        SNDRV_PCM_FMTBIT_S24_LE | SNDRV_PCM_FMTBIT_S32_LE)
 
        .startup        = da7210_startup,
        .hw_params      = da7210_hw_params,
        .set_fmt        = da7210_set_dai_fmt,
+       .digital_mute   = da7210_mute,
 };
 
 static struct snd_soc_dai_driver da7210_dai = {
                     DA7210_HP_2CAP_MODE | DA7210_HP_SENSE_EN |
                     DA7210_HP_L_EN | DA7210_HP_MODE | DA7210_HP_R_EN);
 
+       /* Enable ramp mode for DAC gain update */
+       snd_soc_write(codec, DA7210_SOFTMUTE, DA7210_RAMP_EN);
+
        /* Diable PLL and bypass it */
        snd_soc_write(codec, DA7210_PLL, DA7210_PLL_FS_48000);