int v_sense_slot;
        int i_sense_slot;
+
+       bool dac_powered;
+       bool unmuted;
 };
 
 static void tas2764_reset(struct tas2764_priv *tas2764)
        usleep_range(1000, 2000);
 }
 
+static int tas2764_update_pwr_ctrl(struct tas2764_priv *tas2764)
+{
+       struct snd_soc_component *component = tas2764->component;
+       unsigned int val;
+       int ret;
+
+       if (tas2764->dac_powered)
+               val = tas2764->unmuted ?
+                       TAS2764_PWR_CTRL_ACTIVE : TAS2764_PWR_CTRL_MUTE;
+       else
+               val = TAS2764_PWR_CTRL_SHUTDOWN;
+
+       ret = snd_soc_component_update_bits(component, TAS2764_PWR_CTRL,
+                                           TAS2764_PWR_CTRL_MASK, val);
+       if (ret < 0)
+               return ret;
+
+       return 0;
+}
+
 #ifdef CONFIG_PM
 static int tas2764_codec_suspend(struct snd_soc_component *component)
 {
                usleep_range(1000, 2000);
        }
 
-       ret = snd_soc_component_update_bits(component, TAS2764_PWR_CTRL,
-                                           TAS2764_PWR_CTRL_MASK,
-                                           TAS2764_PWR_CTRL_ACTIVE);
+       ret = tas2764_update_pwr_ctrl(tas2764);
 
        if (ret < 0)
                return ret;
 
        switch (event) {
        case SND_SOC_DAPM_POST_PMU:
-               ret = snd_soc_component_update_bits(component, TAS2764_PWR_CTRL,
-                                                   TAS2764_PWR_CTRL_MASK,
-                                                   TAS2764_PWR_CTRL_MUTE);
+               tas2764->dac_powered = true;
+               ret = tas2764_update_pwr_ctrl(tas2764);
                break;
        case SND_SOC_DAPM_PRE_PMD:
-               ret = snd_soc_component_update_bits(component, TAS2764_PWR_CTRL,
-                                                   TAS2764_PWR_CTRL_MASK,
-                                                   TAS2764_PWR_CTRL_SHUTDOWN);
+               tas2764->dac_powered = false;
+               ret = tas2764_update_pwr_ctrl(tas2764);
                break;
        default:
                dev_err(tas2764->dev, "Unsupported event\n");
 
 static int tas2764_mute(struct snd_soc_dai *dai, int mute, int direction)
 {
-       struct snd_soc_component *component = dai->component;
-       int ret;
-
-       ret = snd_soc_component_update_bits(component, TAS2764_PWR_CTRL,
-                                           TAS2764_PWR_CTRL_MASK,
-                                           mute ? TAS2764_PWR_CTRL_MUTE : 0);
+       struct tas2764_priv *tas2764 =
+                       snd_soc_component_get_drvdata(dai->component);
 
-       if (ret < 0)
-               return ret;
-
-       return 0;
+       tas2764->unmuted = !mute;
+       return tas2764_update_pwr_ctrl(tas2764);
 }
 
 static int tas2764_set_bitwidth(struct tas2764_priv *tas2764, int bitwidth)
        if (ret < 0)
                return ret;
 
-       ret = snd_soc_component_update_bits(component, TAS2764_PWR_CTRL,
-                                           TAS2764_PWR_CTRL_MASK,
-                                           TAS2764_PWR_CTRL_MUTE);
-       if (ret < 0)
-               return ret;
-
        return 0;
 }