aboutsummaryrefslogtreecommitdiffstats
path: root/include/sound
diff options
context:
space:
mode:
authorDaniel Mack <daniel@caiaq.de>2010-03-19 10:52:55 -0400
committerMark Brown <broonie@opensource.wolfsonmicro.com>2010-03-19 15:37:29 -0400
commitfd23b7dee5e4d369f620979cb120f53629389355 (patch)
treebbfa4637b0b97662b8ee63922eccb01913baaf1d /include/sound
parent093208f5d03980d7216b706e3c54432d0f299e26 (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.h18
-rw-r--r--include/sound/soc.h1
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
237static 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
244static 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 */