ARIZONA_MIXER_INPUT_ROUTES(name " Input 4")
 
 #define ARIZONA_DSP_ROUTES(name) \
-       { name, NULL, name " Aux 1" }, \
-       { name, NULL, name " Aux 2" }, \
-       { name, NULL, name " Aux 3" }, \
-       { name, NULL, name " Aux 4" }, \
-       { name, NULL, name " Aux 5" }, \
-       { name, NULL, name " Aux 6" }, \
+       { name, NULL, name " Preloader"}, \
+       { name " Preloader", NULL, name " Aux 1" }, \
+       { name " Preloader", NULL, name " Aux 2" }, \
+       { name " Preloader", NULL, name " Aux 3" }, \
+       { name " Preloader", NULL, name " Aux 4" }, \
+       { name " Preloader", NULL, name " Aux 5" }, \
+       { name " Preloader", NULL, name " Aux 6" }, \
        ARIZONA_MIXER_INPUT_ROUTES(name " Aux 1"), \
        ARIZONA_MIXER_INPUT_ROUTES(name " Aux 2"), \
        ARIZONA_MIXER_INPUT_ROUTES(name " Aux 3"), \
        ARIZONA_MIXER_INPUT_ROUTES(name " Aux 4"), \
        ARIZONA_MIXER_INPUT_ROUTES(name " Aux 5"), \
        ARIZONA_MIXER_INPUT_ROUTES(name " Aux 6"), \
-       ARIZONA_MIXER_ROUTES(name, name "L"), \
-       ARIZONA_MIXER_ROUTES(name, name "R")
+       ARIZONA_MIXER_ROUTES(name " Preloader", name "L"), \
+       ARIZONA_MIXER_ROUTES(name " Preloader", name "R")
 
 #define ARIZONA_RATE_ENUM_SIZE 4
 extern const char *arizona_rate_text[ARIZONA_RATE_ENUM_SIZE];
 
                           ADSP2_SYS_ENA | ADSP2_CORE_ENA | ADSP2_START, 0);
 }
 
+int wm_adsp2_early_event(struct snd_soc_dapm_widget *w,
+                  struct snd_kcontrol *kcontrol, int event)
+{
+       struct snd_soc_codec *codec = w->codec;
+       struct wm_adsp *dsps = snd_soc_codec_get_drvdata(codec);
+       struct wm_adsp *dsp = &dsps[w->shift];
+
+       dsp->card = codec->card;
+
+       switch (event) {
+       case SND_SOC_DAPM_PRE_PMU:
+               queue_work(system_unbound_wq, &dsp->boot_work);
+               break;
+       default:
+               break;
+       };
+
+       return 0;
+}
+EXPORT_SYMBOL_GPL(wm_adsp2_early_event);
+
 int wm_adsp2_event(struct snd_soc_dapm_widget *w,
                   struct snd_kcontrol *kcontrol, int event)
 {
        struct wm_coeff_ctl *ctl;
        int ret;
 
-       dsp->card = codec->card;
-
        switch (event) {
        case SND_SOC_DAPM_POST_PMU:
-               queue_work(system_unbound_wq, &dsp->boot_work);
                flush_work(&dsp->boot_work);
 
                if (!dsp->running)
 
                wm_adsp1_event, SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_PRE_PMD)
 
 #define WM_ADSP2(wname, num) \
-       SND_SOC_DAPM_PGA_E(wname, SND_SOC_NOPM, num, 0, NULL, 0, \
-               wm_adsp2_event, SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_PRE_PMD)
+{      .id = snd_soc_dapm_dai_link, .name = wname " Preloader", \
+       .reg = SND_SOC_NOPM, .shift = num, .event = wm_adsp2_early_event, \
+       .event_flags = SND_SOC_DAPM_PRE_PMU }, \
+{      .id = snd_soc_dapm_out_drv, .name = wname, \
+       .reg = SND_SOC_NOPM, .shift = num, .event = wm_adsp2_event, \
+       .event_flags = SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_PRE_PMD }
 
 extern const struct snd_kcontrol_new wm_adsp1_fw_controls[];
 extern const struct snd_kcontrol_new wm_adsp2_fw_controls[];
 int wm_adsp2_init(struct wm_adsp *adsp, bool dvfs);
 int wm_adsp1_event(struct snd_soc_dapm_widget *w,
                   struct snd_kcontrol *kcontrol, int event);
+int wm_adsp2_early_event(struct snd_soc_dapm_widget *w,
+                        struct snd_kcontrol *kcontrol, int event);
 int wm_adsp2_event(struct snd_soc_dapm_widget *w,
                   struct snd_kcontrol *kcontrol, int event);