diff options
author | Mark Brown <broonie@opensource.wolfsonmicro.com> | 2009-05-14 15:35:51 -0400 |
---|---|---|
committer | Mark Brown <broonie@opensource.wolfsonmicro.com> | 2009-05-14 15:35:51 -0400 |
commit | c13cb78ace34ef9e4cfa2a2fae9a7772d90d6ace (patch) | |
tree | ec347add163ca9383c76bb3685f989e57fc2d7b0 /sound/soc | |
parent | d34c43078236b41146877c49af341ab85b5fb8db (diff) | |
parent | 916465a841937a60baac6144ae3f41b0d1560f3b (diff) |
Merge branch 'pxa2xx-i2s' into for-2.6.31
Diffstat (limited to 'sound/soc')
-rw-r--r-- | sound/soc/pxa/pxa2xx-i2s.c | 25 |
1 files changed, 9 insertions, 16 deletions
diff --git a/sound/soc/pxa/pxa2xx-i2s.c b/sound/soc/pxa/pxa2xx-i2s.c index fce8a2894e2c..4743e262895d 100644 --- a/sound/soc/pxa/pxa2xx-i2s.c +++ b/sound/soc/pxa/pxa2xx-i2s.c | |||
@@ -106,10 +106,8 @@ static int pxa2xx_i2s_startup(struct snd_pcm_substream *substream, | |||
106 | if (IS_ERR(clk_i2s)) | 106 | if (IS_ERR(clk_i2s)) |
107 | return PTR_ERR(clk_i2s); | 107 | return PTR_ERR(clk_i2s); |
108 | 108 | ||
109 | if (!cpu_dai->active) { | 109 | if (!cpu_dai->active) |
110 | SACR0 |= SACR0_RST; | ||
111 | SACR0 = 0; | 110 | SACR0 = 0; |
112 | } | ||
113 | 111 | ||
114 | return 0; | 112 | return 0; |
115 | } | 113 | } |
@@ -178,9 +176,7 @@ static int pxa2xx_i2s_hw_params(struct snd_pcm_substream *substream, | |||
178 | 176 | ||
179 | /* is port used by another stream */ | 177 | /* is port used by another stream */ |
180 | if (!(SACR0 & SACR0_ENB)) { | 178 | if (!(SACR0 & SACR0_ENB)) { |
181 | |||
182 | SACR0 = 0; | 179 | SACR0 = 0; |
183 | SACR1 = 0; | ||
184 | if (pxa_i2s.master) | 180 | if (pxa_i2s.master) |
185 | SACR0 |= SACR0_BCKD; | 181 | SACR0 |= SACR0_BCKD; |
186 | 182 | ||
@@ -226,6 +222,10 @@ static int pxa2xx_i2s_trigger(struct snd_pcm_substream *substream, int cmd, | |||
226 | 222 | ||
227 | switch (cmd) { | 223 | switch (cmd) { |
228 | case SNDRV_PCM_TRIGGER_START: | 224 | case SNDRV_PCM_TRIGGER_START: |
225 | if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) | ||
226 | SACR1 &= ~SACR1_DRPL; | ||
227 | else | ||
228 | SACR1 &= ~SACR1_DREC; | ||
229 | SACR0 |= SACR0_ENB; | 229 | SACR0 |= SACR0_ENB; |
230 | break; | 230 | break; |
231 | case SNDRV_PCM_TRIGGER_RESUME: | 231 | case SNDRV_PCM_TRIGGER_RESUME: |
@@ -252,21 +252,16 @@ static void pxa2xx_i2s_shutdown(struct snd_pcm_substream *substream, | |||
252 | SAIMR &= ~SAIMR_RFS; | 252 | SAIMR &= ~SAIMR_RFS; |
253 | } | 253 | } |
254 | 254 | ||
255 | if (SACR1 & (SACR1_DREC | SACR1_DRPL)) { | 255 | if ((SACR1 & (SACR1_DREC | SACR1_DRPL)) == (SACR1_DREC | SACR1_DRPL)) { |
256 | SACR0 &= ~SACR0_ENB; | 256 | SACR0 &= ~SACR0_ENB; |
257 | pxa_i2s_wait(); | 257 | pxa_i2s_wait(); |
258 | clk_disable(clk_i2s); | 258 | clk_disable(clk_i2s); |
259 | } | 259 | } |
260 | |||
261 | clk_put(clk_i2s); | ||
262 | } | 260 | } |
263 | 261 | ||
264 | #ifdef CONFIG_PM | 262 | #ifdef CONFIG_PM |
265 | static int pxa2xx_i2s_suspend(struct snd_soc_dai *dai) | 263 | static int pxa2xx_i2s_suspend(struct snd_soc_dai *dai) |
266 | { | 264 | { |
267 | if (!dai->active) | ||
268 | return 0; | ||
269 | |||
270 | /* store registers */ | 265 | /* store registers */ |
271 | pxa_i2s.sacr0 = SACR0; | 266 | pxa_i2s.sacr0 = SACR0; |
272 | pxa_i2s.sacr1 = SACR1; | 267 | pxa_i2s.sacr1 = SACR1; |
@@ -281,16 +276,14 @@ static int pxa2xx_i2s_suspend(struct snd_soc_dai *dai) | |||
281 | 276 | ||
282 | static int pxa2xx_i2s_resume(struct snd_soc_dai *dai) | 277 | static int pxa2xx_i2s_resume(struct snd_soc_dai *dai) |
283 | { | 278 | { |
284 | if (!dai->active) | ||
285 | return 0; | ||
286 | |||
287 | pxa_i2s_wait(); | 279 | pxa_i2s_wait(); |
288 | 280 | ||
289 | SACR0 = pxa_i2s.sacr0 &= ~SACR0_ENB; | 281 | SACR0 = pxa_i2s.sacr0 & ~SACR0_ENB; |
290 | SACR1 = pxa_i2s.sacr1; | 282 | SACR1 = pxa_i2s.sacr1; |
291 | SAIMR = pxa_i2s.saimr; | 283 | SAIMR = pxa_i2s.saimr; |
292 | SADIV = pxa_i2s.sadiv; | 284 | SADIV = pxa_i2s.sadiv; |
293 | SACR0 |= SACR0_ENB; | 285 | |
286 | SACR0 = pxa_i2s.sacr0; | ||
294 | 287 | ||
295 | return 0; | 288 | return 0; |
296 | } | 289 | } |