|
@@ -2323,6 +2323,7 @@ int wm_adsp2_early_event(struct snd_soc_dapm_widget *w,
|
|
|
struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm);
|
|
|
struct wm_adsp *dsps = snd_soc_codec_get_drvdata(codec);
|
|
|
struct wm_adsp *dsp = &dsps[w->shift];
|
|
|
+ struct wm_coeff_ctl *ctl;
|
|
|
|
|
|
dsp->card = codec->component.card;
|
|
|
|
|
@@ -2331,6 +2332,24 @@ int wm_adsp2_early_event(struct snd_soc_dapm_widget *w,
|
|
|
wm_adsp2_set_dspclk(dsp, freq);
|
|
|
queue_work(system_unbound_wq, &dsp->boot_work);
|
|
|
break;
|
|
|
+ case SND_SOC_DAPM_PRE_PMD:
|
|
|
+ wm_adsp_debugfs_clear(dsp);
|
|
|
+
|
|
|
+ dsp->fw_id = 0;
|
|
|
+ dsp->fw_id_version = 0;
|
|
|
+
|
|
|
+ dsp->booted = false;
|
|
|
+
|
|
|
+ regmap_update_bits(dsp->regmap, dsp->base + ADSP2_CONTROL,
|
|
|
+ ADSP2_MEM_ENA, 0);
|
|
|
+
|
|
|
+ list_for_each_entry(ctl, &dsp->ctl_list, list)
|
|
|
+ ctl->enabled = 0;
|
|
|
+
|
|
|
+ wm_adsp_free_alg_regions(dsp);
|
|
|
+
|
|
|
+ adsp_dbg(dsp, "Shutdown complete\n");
|
|
|
+ break;
|
|
|
default:
|
|
|
break;
|
|
|
}
|
|
@@ -2345,7 +2364,6 @@ int wm_adsp2_event(struct snd_soc_dapm_widget *w,
|
|
|
struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm);
|
|
|
struct wm_adsp *dsps = snd_soc_codec_get_drvdata(codec);
|
|
|
struct wm_adsp *dsp = &dsps[w->shift];
|
|
|
- struct wm_coeff_ctl *ctl;
|
|
|
int ret;
|
|
|
|
|
|
switch (event) {
|
|
@@ -2388,17 +2406,10 @@ int wm_adsp2_event(struct snd_soc_dapm_widget *w,
|
|
|
|
|
|
mutex_lock(&dsp->pwr_lock);
|
|
|
|
|
|
- wm_adsp_debugfs_clear(dsp);
|
|
|
-
|
|
|
- dsp->fw_id = 0;
|
|
|
- dsp->fw_id_version = 0;
|
|
|
-
|
|
|
dsp->running = false;
|
|
|
- dsp->booted = false;
|
|
|
|
|
|
regmap_update_bits(dsp->regmap, dsp->base + ADSP2_CONTROL,
|
|
|
- ADSP2_MEM_ENA | ADSP2_CORE_ENA | ADSP2_START,
|
|
|
- 0);
|
|
|
+ ADSP2_CORE_ENA | ADSP2_START, 0);
|
|
|
|
|
|
/* Make sure DMAs are quiesced */
|
|
|
regmap_write(dsp->regmap, dsp->base + ADSP2_RDMA_CONFIG_1, 0);
|
|
@@ -2408,17 +2419,12 @@ int wm_adsp2_event(struct snd_soc_dapm_widget *w,
|
|
|
regmap_update_bits(dsp->regmap, dsp->base + ADSP2_CONTROL,
|
|
|
ADSP2_SYS_ENA, 0);
|
|
|
|
|
|
- list_for_each_entry(ctl, &dsp->ctl_list, list)
|
|
|
- ctl->enabled = 0;
|
|
|
-
|
|
|
- wm_adsp_free_alg_regions(dsp);
|
|
|
-
|
|
|
if (wm_adsp_fw[dsp->fw].num_caps != 0)
|
|
|
wm_adsp_buffer_free(dsp);
|
|
|
|
|
|
mutex_unlock(&dsp->pwr_lock);
|
|
|
|
|
|
- adsp_dbg(dsp, "Shutdown complete\n");
|
|
|
+ adsp_dbg(dsp, "Execution stopped\n");
|
|
|
break;
|
|
|
|
|
|
default:
|