0x3f, 1, mixer_tlv)
 };
 
-static int cs42l42_hpdrv_evt(struct snd_soc_dapm_widget *w,
-                               struct snd_kcontrol *kcontrol, int event)
-{
-       struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm);
-
-       if (event & SND_SOC_DAPM_POST_PMU) {
-               /* Enable the channels */
-               snd_soc_component_update_bits(component, CS42L42_ASP_RX_DAI0_EN,
-                               CS42L42_ASP_RX0_CH_EN_MASK,
-                               (CS42L42_ASP_RX0_CH1_EN |
-                               CS42L42_ASP_RX0_CH2_EN) <<
-                               CS42L42_ASP_RX0_CH_EN_SHIFT);
-
-               /* Power up */
-               snd_soc_component_update_bits(component, CS42L42_PWR_CTL1,
-                       CS42L42_ASP_DAI_PDN_MASK | CS42L42_MIXER_PDN_MASK |
-                               CS42L42_HP_PDN_MASK, 0);
-       } else if (event & SND_SOC_DAPM_PRE_PMD) {
-               /* Disable the channels */
-               snd_soc_component_update_bits(component, CS42L42_ASP_RX_DAI0_EN,
-                               CS42L42_ASP_RX0_CH_EN_MASK, 0);
-
-               /* Power down */
-               snd_soc_component_update_bits(component, CS42L42_PWR_CTL1,
-                       CS42L42_ASP_DAI_PDN_MASK | CS42L42_MIXER_PDN_MASK |
-                               CS42L42_HP_PDN_MASK,
-                       CS42L42_ASP_DAI_PDN_MASK | CS42L42_MIXER_PDN_MASK |
-                               CS42L42_HP_PDN_MASK);
-       } else {
-               dev_err(component->dev, "Invalid event 0x%x\n", event);
-       }
-       return 0;
-}
-
 static const struct snd_soc_dapm_widget cs42l42_dapm_widgets[] = {
+       /* Playback Path */
        SND_SOC_DAPM_OUTPUT("HP"),
-       SND_SOC_DAPM_AIF_IN("SDIN", NULL, 0, CS42L42_ASP_CLK_CFG,
-                                       CS42L42_ASP_SCLK_EN_SHIFT, false),
-       SND_SOC_DAPM_OUT_DRV_E("HPDRV", SND_SOC_NOPM, 0,
-                                       0, NULL, 0, cs42l42_hpdrv_evt,
-                                       SND_SOC_DAPM_POST_PMU |
-                                       SND_SOC_DAPM_PRE_PMD)
+       SND_SOC_DAPM_DAC("DAC", NULL, CS42L42_PWR_CTL1, CS42L42_HP_PDN_SHIFT, 1),
+       SND_SOC_DAPM_MIXER("MIXER", CS42L42_PWR_CTL1, CS42L42_MIXER_PDN_SHIFT, 1, NULL, 0),
+       SND_SOC_DAPM_AIF_IN("SDIN1", NULL, 0, CS42L42_ASP_RX_DAI0_EN, CS42L42_ASP_RX0_CH1_SHIFT, 0),
+       SND_SOC_DAPM_AIF_IN("SDIN2", NULL, 1, CS42L42_ASP_RX_DAI0_EN, CS42L42_ASP_RX0_CH2_SHIFT, 0),
+
+       /* Playback Requirements */
+       SND_SOC_DAPM_SUPPLY("ASP DAI0", CS42L42_PWR_CTL1, CS42L42_ASP_DAI_PDN_SHIFT, 1, NULL, 0),
+       SND_SOC_DAPM_SUPPLY("SCLK", CS42L42_ASP_CLK_CFG, CS42L42_ASP_SCLK_EN_SHIFT, 0, NULL, 0),
 };
 
 static const struct snd_soc_dapm_route cs42l42_audio_map[] = {
-       {"SDIN", NULL, "Playback"},
-       {"HPDRV", NULL, "SDIN"},
-       {"HP", NULL, "HPDRV"}
+       /* Playback Path */
+       {"HP", NULL, "DAC"},
+       {"DAC", NULL, "MIXER"},
+       {"MIXER", NULL, "SDIN1"},
+       {"MIXER", NULL, "SDIN2"},
+       {"SDIN1", NULL, "Playback"},
+       {"SDIN2", NULL, "Playback"},
+
+       /* Playback Requirements */
+       {"SDIN1", NULL, "ASP DAI0"},
+       {"SDIN2", NULL, "ASP DAI0"},
+       {"SDIN1", NULL, "SCLK"},
+       {"SDIN2", NULL, "SCLK"},
 };
 
 static int cs42l42_component_probe(struct snd_soc_component *component)