Date: | 2012-06-16 20:03:28 (11 years 9 months ago) |
---|---|
Author: | Paul Cercueil |
Commit: | 5d267d626cc872b61c21dcd15f4a4ec91dc6cca7 |
Message: | ASoC: JZ4740: Use msleep() to wait before enabling the DAC. This fixes commit ef84c71ff3983379d031ec1eedf2ebb7567a43aa which used a non-standard and ugly way to delay execution. |
Files: |
sound/soc/codecs/jz4740.c (5 diffs) |
Change Details
sound/soc/codecs/jz4740.c | ||
---|---|---|
18 | 18 | #include <linux/io.h> |
19 | 19 | |
20 | 20 | #include <linux/delay.h> |
21 | #include <linux/completion.h> | |
22 | 21 | |
23 | 22 | #include <sound/core.h> |
24 | 23 | #include <sound/pcm.h> |
... | ... | |
75 | 74 | struct jz4740_codec { |
76 | 75 | void __iomem *base; |
77 | 76 | struct resource *mem; |
78 | ||
79 | struct snd_soc_codec *codec; | |
80 | struct delayed_work dma_work; | |
81 | struct completion completion; | |
82 | 77 | }; |
83 | 78 | |
84 | 79 | static unsigned int jz4740_codec_read(struct snd_soc_codec *codec, |
... | ... | |
252 | 247 | jz4740_codec_write(codec, i, cache[i]); |
253 | 248 | } |
254 | 249 | |
255 | static void jz4740_dma_work(struct work_struct *work) | |
256 | { | |
257 | struct jz4740_codec *jz4740_codec = | |
258 | container_of(work, struct jz4740_codec, dma_work.work); | |
259 | ||
260 | unsigned int mask = JZ4740_CODEC_1_VREF_DISABLE | | |
261 | JZ4740_CODEC_1_VREF_AMP_DISABLE; | |
262 | snd_soc_update_bits(jz4740_codec->codec, | |
263 | JZ4740_REG_CODEC_1, mask, 0); | |
264 | complete_all(&jz4740_codec->completion); | |
265 | } | |
266 | ||
267 | 250 | static int jz4740_codec_set_bias_level(struct snd_soc_codec *codec, |
268 | 251 | enum snd_soc_bias_level level) |
269 | 252 | { |
270 | 253 | unsigned int mask; |
271 | 254 | unsigned int value; |
272 | struct jz4740_codec *jz4740_codec = snd_soc_codec_get_drvdata(codec); | |
273 | 255 | |
274 | 256 | switch (level) { |
275 | 257 | case SND_SOC_BIAS_ON: |
... | ... | |
279 | 261 | value = 0; |
280 | 262 | snd_soc_update_bits(codec, JZ4740_REG_CODEC_1, mask, value); |
281 | 263 | |
282 | INIT_COMPLETION(jz4740_codec->completion); | |
283 | schedule_delayed_work(&jz4740_codec->dma_work, HZ / 2); | |
284 | wait_for_completion_interruptible(&jz4740_codec->completion); | |
264 | msleep(500); | |
265 | mask = JZ4740_CODEC_1_VREF_DISABLE | | |
266 | JZ4740_CODEC_1_VREF_AMP_DISABLE; | |
267 | snd_soc_update_bits(codec, JZ4740_REG_CODEC_1, mask, 0); | |
285 | 268 | break; |
286 | 269 | case SND_SOC_BIAS_STANDBY: |
287 | 270 | /* The only way to clear the suspend flag is to reset the codec */ |
... | ... | |
314 | 297 | |
315 | 298 | static int jz4740_codec_dev_probe(struct snd_soc_codec *codec) |
316 | 299 | { |
317 | struct jz4740_codec *jz4740_codec = snd_soc_codec_get_drvdata(codec); | |
318 | ||
319 | jz4740_codec->codec = codec; | |
320 | init_completion(&jz4740_codec->completion); | |
321 | INIT_DELAYED_WORK(&jz4740_codec->dma_work, jz4740_dma_work); | |
322 | ||
323 | 300 | snd_soc_update_bits(codec, JZ4740_REG_CODEC_1, |
324 | 301 | JZ4740_CODEC_1_SW2_ENABLE, JZ4740_CODEC_1_SW2_ENABLE); |
325 | 302 |
Branches:
ben-wpan
ben-wpan-stefan
5396a9238205f20f811ea57898980d3ca82df0b6
jz-2.6.34
jz-2.6.34-rc5
jz-2.6.34-rc6
jz-2.6.34-rc7
jz-2.6.35
jz-2.6.36
jz-2.6.37
jz-2.6.38
jz-2.6.39
jz-3.0
jz-3.1
jz-3.11
jz-3.12
jz-3.13
jz-3.15
jz-3.16
jz-3.18-dt
jz-3.2
jz-3.3
jz-3.4
jz-3.5
jz-3.6
jz-3.6-rc2-pwm
jz-3.9
jz-3.9-clk
jz-3.9-rc8
jz47xx
jz47xx-2.6.38
master
Tags:
od-2011-09-04
od-2011-09-18
v2.6.34-rc5
v2.6.34-rc6
v2.6.34-rc7
v3.9