static const struct snd_kcontrol_new vsense_switch =
        SOC_DAPM_SINGLE("Switch", TAS2770_PWR_CTRL, 2, 1, 1);
 
+static int sense_event(struct snd_soc_dapm_widget *w,
+                       struct snd_kcontrol *kcontrol, int event)
+{
+       struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm);
+       struct tas2770_priv *tas2770 = snd_soc_component_get_drvdata(component);
+
+       /*
+        * Powering up ISENSE/VSENSE requires a trip through the shutdown state.
+        * Do that here to ensure that our changes are applied properly, otherwise
+        * we might end up with non-functional IVSENSE if playback started earlier,
+        * which would break software speaker protection.
+        */
+       switch (event) {
+       case SND_SOC_DAPM_PRE_REG:
+               return snd_soc_component_update_bits(component, TAS2770_PWR_CTRL,
+                                                   TAS2770_PWR_CTRL_MASK,
+                                                   TAS2770_PWR_CTRL_SHUTDOWN);
+       case SND_SOC_DAPM_POST_REG:
+               return tas2770_update_pwr_ctrl(tas2770);
+       default:
+               return 0;
+       }
+}
+
 static const struct snd_soc_dapm_widget tas2770_dapm_widgets[] = {
        SND_SOC_DAPM_AIF_IN("ASI1", "ASI1 Playback", 0, SND_SOC_NOPM, 0, 0),
        SND_SOC_DAPM_MUX("ASI1 Sel", SND_SOC_NOPM, 0, 0, &tas2770_asi1_mux),
-       SND_SOC_DAPM_SWITCH("ISENSE", TAS2770_PWR_CTRL, 3, 1, &isense_switch),
-       SND_SOC_DAPM_SWITCH("VSENSE", TAS2770_PWR_CTRL, 2, 1, &vsense_switch),
+       SND_SOC_DAPM_SWITCH_E("ISENSE", TAS2770_PWR_CTRL, 3, 1, &isense_switch,
+               sense_event, SND_SOC_DAPM_PRE_REG | SND_SOC_DAPM_POST_REG),
+       SND_SOC_DAPM_SWITCH_E("VSENSE", TAS2770_PWR_CTRL, 2, 1, &vsense_switch,
+               sense_event, SND_SOC_DAPM_PRE_REG | SND_SOC_DAPM_POST_REG),
        SND_SOC_DAPM_DAC_E("DAC", NULL, SND_SOC_NOPM, 0, 0, tas2770_dac_event,
                           SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_PRE_PMD),
        SND_SOC_DAPM_OUTPUT("OUT"),