diff options
author | Mark Brown <broonie@opensource.wolfsonmicro.com> | 2013-01-28 07:18:17 -0500 |
---|---|---|
committer | Mark Brown <broonie@opensource.wolfsonmicro.com> | 2013-01-28 11:49:09 -0500 |
commit | 2d30b5751d3fdcc589985929ffb3969520f6c828 (patch) | |
tree | 3bc815ba504c76faf9db55dc7774d2a36b71aea9 /sound/soc/codecs/wm_adsp.c | |
parent | a4cdbec758d2491a86ba94263b847768fa004fde (diff) |
ASoC: wm_adsp: Ensure ADSP2 DMAs are quiesced when DSP is halted
Maximise robustness for the widest range of firmwares by ensuring the DSP
is in a consistent state when halted.
Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
Diffstat (limited to 'sound/soc/codecs/wm_adsp.c')
-rw-r--r-- | sound/soc/codecs/wm_adsp.c | 14 |
1 files changed, 11 insertions, 3 deletions
diff --git a/sound/soc/codecs/wm_adsp.c b/sound/soc/codecs/wm_adsp.c index b6b654837585..93d03bc0661b 100644 --- a/sound/soc/codecs/wm_adsp.c +++ b/sound/soc/codecs/wm_adsp.c | |||
@@ -103,9 +103,12 @@ | |||
103 | #define ADSP1_START_SHIFT 0 /* DSP1_START */ | 103 | #define ADSP1_START_SHIFT 0 /* DSP1_START */ |
104 | #define ADSP1_START_WIDTH 1 /* DSP1_START */ | 104 | #define ADSP1_START_WIDTH 1 /* DSP1_START */ |
105 | 105 | ||
106 | #define ADSP2_CONTROL 0 | 106 | #define ADSP2_CONTROL 0x0 |
107 | #define ADSP2_CLOCKING 1 | 107 | #define ADSP2_CLOCKING 0x1 |
108 | #define ADSP2_STATUS1 4 | 108 | #define ADSP2_STATUS1 0x4 |
109 | #define ADSP2_WDMA_CONFIG_1 0x30 | ||
110 | #define ADSP2_WDMA_CONFIG_2 0x31 | ||
111 | #define ADSP2_RDMA_CONFIG_1 0x34 | ||
109 | 112 | ||
110 | /* | 113 | /* |
111 | * ADSP2 Control | 114 | * ADSP2 Control |
@@ -642,6 +645,11 @@ int wm_adsp2_event(struct snd_soc_dapm_widget *w, | |||
642 | ADSP2_SYS_ENA | ADSP2_CORE_ENA | | 645 | ADSP2_SYS_ENA | ADSP2_CORE_ENA | |
643 | ADSP2_START, 0); | 646 | ADSP2_START, 0); |
644 | 647 | ||
648 | /* Make sure DMAs are quiesced */ | ||
649 | regmap_write(dsp->regmap, dsp->base + ADSP2_WDMA_CONFIG_1, 0); | ||
650 | regmap_write(dsp->regmap, dsp->base + ADSP2_WDMA_CONFIG_2, 0); | ||
651 | regmap_write(dsp->regmap, dsp->base + ADSP2_RDMA_CONFIG_1, 0); | ||
652 | |||
645 | if (dsp->dvfs) { | 653 | if (dsp->dvfs) { |
646 | ret = regulator_set_voltage(dsp->dvfs, 1200000, | 654 | ret = regulator_set_voltage(dsp->dvfs, 1200000, |
647 | 1800000); | 655 | 1800000); |