diff options
| author | Daniel Mack <daniel@caiaq.de> | 2010-03-22 05:11:15 -0400 |
|---|---|---|
| committer | Mark Brown <broonie@opensource.wolfsonmicro.com> | 2010-04-05 14:14:11 -0400 |
| commit | 5f712b2b73a9fc87fcc52124cfe8adefaa0c92f5 (patch) | |
| tree | 0e7ab3cedba6b50cdf603c433b79ceebf23972b0 /include | |
| parent | d522ffbfb9fccf6eca283cd2e8b03cf3d21fb616 (diff) | |
ALSA: ASoC: move dma_data from snd_soc_dai to snd_soc_pcm_stream
This fixes a memory corruption when ASoC devices are used in
full-duplex mode. Specifically for pxa-ssp code, where this pointer
is dynamically allocated for each direction and destroyed upon each
stream start.
All other platforms are fixed blindly, I couldn't even compile-test
them. Sorry for any breakage I may have caused.
[Note that this is a backported version for 2.6.34.
Upstream commit is fd23b7dee]
Signed-off-by: Daniel Mack <daniel@caiaq.de>
Reported-by: Sven Neumann <s.neumann@raumfeld.com>
Reported-by: Michael Hirsch <m.hirsch@raumfeld.com>
Acked-by: Liam Girdwood <lrg@slimlogic.co.uk>
Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
Diffstat (limited to 'include')
| -rw-r--r-- | include/sound/soc-dai.h | 18 | ||||
| -rw-r--r-- | include/sound/soc.h | 1 |
2 files changed, 18 insertions, 1 deletions
diff --git a/include/sound/soc-dai.h b/include/sound/soc-dai.h index 061f16d4c878..0a0b019d41ad 100644 --- a/include/sound/soc-dai.h +++ b/include/sound/soc-dai.h | |||
| @@ -219,7 +219,6 @@ struct snd_soc_dai { | |||
| 219 | struct snd_soc_codec *codec; | 219 | struct snd_soc_codec *codec; |
| 220 | unsigned int active; | 220 | unsigned int active; |
| 221 | unsigned char pop_wait:1; | 221 | unsigned char pop_wait:1; |
| 222 | void *dma_data; | ||
| 223 | 222 | ||
| 224 | /* DAI private data */ | 223 | /* DAI private data */ |
| 225 | void *private_data; | 224 | void *private_data; |
| @@ -230,4 +229,21 @@ struct snd_soc_dai { | |||
| 230 | struct list_head list; | 229 | struct list_head list; |
| 231 | }; | 230 | }; |
| 232 | 231 | ||
| 232 | static inline void *snd_soc_dai_get_dma_data(const struct snd_soc_dai *dai, | ||
| 233 | const struct snd_pcm_substream *ss) | ||
| 234 | { | ||
| 235 | return (ss->stream == SNDRV_PCM_STREAM_PLAYBACK) ? | ||
| 236 | dai->playback.dma_data : dai->capture.dma_data; | ||
| 237 | } | ||
| 238 | |||
| 239 | static inline void snd_soc_dai_set_dma_data(struct snd_soc_dai *dai, | ||
| 240 | const struct snd_pcm_substream *ss, | ||
| 241 | void *data) | ||
| 242 | { | ||
| 243 | if (ss->stream == SNDRV_PCM_STREAM_PLAYBACK) | ||
| 244 | dai->playback.dma_data = data; | ||
| 245 | else | ||
| 246 | dai->capture.dma_data = data; | ||
| 247 | } | ||
| 248 | |||
| 233 | #endif | 249 | #endif |
diff --git a/include/sound/soc.h b/include/sound/soc.h index 5d234a8c2506..a57fbfcd4c8f 100644 --- a/include/sound/soc.h +++ b/include/sound/soc.h | |||
| @@ -375,6 +375,7 @@ struct snd_soc_pcm_stream { | |||
| 375 | unsigned int channels_min; /* min channels */ | 375 | unsigned int channels_min; /* min channels */ |
| 376 | unsigned int channels_max; /* max channels */ | 376 | unsigned int channels_max; /* max channels */ |
| 377 | unsigned int active:1; /* stream is in use */ | 377 | unsigned int active:1; /* stream is in use */ |
| 378 | void *dma_data; /* used by platform code */ | ||
| 378 | }; | 379 | }; |
| 379 | 380 | ||
| 380 | /* SoC audio ops */ | 381 | /* SoC audio ops */ |
