diff options
author | Daniel Mack <daniel@caiaq.de> | 2010-03-19 10:52:55 -0400 |
---|---|---|
committer | Mark Brown <broonie@opensource.wolfsonmicro.com> | 2010-03-19 15:37:29 -0400 |
commit | fd23b7dee5e4d369f620979cb120f53629389355 (patch) | |
tree | bbfa4637b0b97662b8ee63922eccb01913baaf1d /include/sound | |
parent | 093208f5d03980d7216b706e3c54432d0f299e26 (diff) |
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.
Reported-by: Sven Neumann <s.neumann@raumfeld.com>
Reported-by: Michael Hirsch <m.hirsch@raumfeld.com>
Signed-off-by: Daniel Mack <daniel@caiaq.de>
Acked-by: Peter Ujfalusi <peter.ujfalusi@nokia.com>
Acked-by: Jarkko Nikula <jhnikula@gmail.com>
Acked-by: Liam Girdwood <lrg@slimlogic.co.uk>
Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
Diffstat (limited to 'include/sound')
-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 6cf76a41501e..377693a14385 100644 --- a/include/sound/soc-dai.h +++ b/include/sound/soc-dai.h | |||
@@ -224,7 +224,6 @@ struct snd_soc_dai { | |||
224 | struct snd_soc_codec *codec; | 224 | struct snd_soc_codec *codec; |
225 | unsigned int active; | 225 | unsigned int active; |
226 | unsigned char pop_wait:1; | 226 | unsigned char pop_wait:1; |
227 | void *dma_data; | ||
228 | 227 | ||
229 | /* DAI private data */ | 228 | /* DAI private data */ |
230 | void *private_data; | 229 | void *private_data; |
@@ -235,4 +234,21 @@ struct snd_soc_dai { | |||
235 | struct list_head list; | 234 | struct list_head list; |
236 | }; | 235 | }; |
237 | 236 | ||
237 | static inline void *snd_soc_dai_get_dma_data(const struct snd_soc_dai *dai, | ||
238 | const struct snd_pcm_substream *ss) | ||
239 | { | ||
240 | return (ss->stream == SNDRV_PCM_STREAM_PLAYBACK) ? | ||
241 | dai->playback.dma_data : dai->capture.dma_data; | ||
242 | } | ||
243 | |||
244 | static inline void snd_soc_dai_set_dma_data(struct snd_soc_dai *dai, | ||
245 | const struct snd_pcm_substream *ss, | ||
246 | void *data) | ||
247 | { | ||
248 | if (ss->stream == SNDRV_PCM_STREAM_PLAYBACK) | ||
249 | dai->playback.dma_data = data; | ||
250 | else | ||
251 | dai->capture.dma_data = data; | ||
252 | } | ||
253 | |||
238 | #endif | 254 | #endif |
diff --git a/include/sound/soc.h b/include/sound/soc.h index dbfec16015de..b8bac6ae6244 100644 --- a/include/sound/soc.h +++ b/include/sound/soc.h | |||
@@ -376,6 +376,7 @@ struct snd_soc_pcm_stream { | |||
376 | unsigned int channels_min; /* min channels */ | 376 | unsigned int channels_min; /* min channels */ |
377 | unsigned int channels_max; /* max channels */ | 377 | unsigned int channels_max; /* max channels */ |
378 | unsigned int active; /* num of active users of the stream */ | 378 | unsigned int active; /* num of active users of the stream */ |
379 | void *dma_data; /* used by platform code */ | ||
379 | }; | 380 | }; |
380 | 381 | ||
381 | /* SoC audio ops */ | 382 | /* SoC audio ops */ |