diff options
author | Liam Girdwood <lg@opensource.wolfsonmicro.com> | 2008-01-10 08:36:20 -0500 |
---|---|---|
committer | Jaroslav Kysela <perex@perex.cz> | 2008-01-31 11:29:50 -0500 |
commit | 0b4d221b8d56deefca4984d01b3a010107ae1f72 (patch) | |
tree | fb4d9923416fedeee04632eac5a8ee760bf37f0e /sound/soc | |
parent | 7570f29a545c7fdf29e913860320e0c09e60e45b (diff) |
[ALSA] soc - Add device level DAPM event
Added a device level dapm event so that both the machine and codec are informed
when dapm events occur.
Signed-off-by: Liam Girdwood <lg@opensource.wolfsonmicro.com>
Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
Signed-off-by: Takashi Iwai <tiwai@suse.de>
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
Diffstat (limited to 'sound/soc')
-rw-r--r-- | sound/soc/soc-core.c | 23 | ||||
-rw-r--r-- | sound/soc/soc-dapm.c | 23 |
2 files changed, 34 insertions, 12 deletions
diff --git a/sound/soc/soc-core.c b/sound/soc/soc-core.c index 94075256638c..bd656db347ee 100644 --- a/sound/soc/soc-core.c +++ b/sound/soc/soc-core.c | |||
@@ -288,15 +288,16 @@ static void close_delayed_work(struct work_struct *work) | |||
288 | if (codec_dai->pop_wait == 1) { | 288 | if (codec_dai->pop_wait == 1) { |
289 | 289 | ||
290 | codec_dai->pop_wait = 0; | 290 | codec_dai->pop_wait = 0; |
291 | snd_soc_dapm_stream_event(codec, codec_dai->playback.stream_name, | 291 | snd_soc_dapm_stream_event(codec, |
292 | codec_dai->playback.stream_name, | ||
292 | SND_SOC_DAPM_STREAM_STOP); | 293 | SND_SOC_DAPM_STREAM_STOP); |
293 | 294 | ||
294 | /* power down the codec power domain if no longer active */ | 295 | /* power down the codec power domain if no longer active */ |
295 | if (codec->active == 0) { | 296 | if (codec->active == 0) { |
296 | dbg("pop wq D3 %s %s\n", codec->name, | 297 | dbg("pop wq D3 %s %s\n", codec->name, |
297 | codec_dai->playback.stream_name); | 298 | codec_dai->playback.stream_name); |
298 | if (codec->dapm_event) | 299 | snd_soc_dapm_device_event(socdev, |
299 | codec->dapm_event(codec, SNDRV_CTL_POWER_D3hot); | 300 | SNDRV_CTL_POWER_D3hot); |
300 | } | 301 | } |
301 | } | 302 | } |
302 | } | 303 | } |
@@ -352,12 +353,12 @@ static int soc_codec_close(struct snd_pcm_substream *substream) | |||
352 | } else { | 353 | } else { |
353 | /* capture streams can be powered down now */ | 354 | /* capture streams can be powered down now */ |
354 | snd_soc_dapm_stream_event(codec, | 355 | snd_soc_dapm_stream_event(codec, |
355 | codec_dai->capture.stream_name, SND_SOC_DAPM_STREAM_STOP); | 356 | codec_dai->capture.stream_name, |
357 | SND_SOC_DAPM_STREAM_STOP); | ||
356 | 358 | ||
357 | if (codec->active == 0 && codec_dai->pop_wait == 0){ | 359 | if (codec->active == 0 && codec_dai->pop_wait == 0) |
358 | if (codec->dapm_event) | 360 | snd_soc_dapm_device_event(socdev, |
359 | codec->dapm_event(codec, SNDRV_CTL_POWER_D3hot); | 361 | SNDRV_CTL_POWER_D3hot); |
360 | } | ||
361 | } | 362 | } |
362 | 363 | ||
363 | mutex_unlock(&pcm_mutex); | 364 | mutex_unlock(&pcm_mutex); |
@@ -432,8 +433,7 @@ static int soc_pcm_prepare(struct snd_pcm_substream *substream) | |||
432 | /* no delayed work - do we need to power up codec */ | 433 | /* no delayed work - do we need to power up codec */ |
433 | if (codec->dapm_state != SNDRV_CTL_POWER_D0) { | 434 | if (codec->dapm_state != SNDRV_CTL_POWER_D0) { |
434 | 435 | ||
435 | if (codec->dapm_event) | 436 | snd_soc_dapm_device_event(socdev, SNDRV_CTL_POWER_D1); |
436 | codec->dapm_event(codec, SNDRV_CTL_POWER_D1); | ||
437 | 437 | ||
438 | if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) | 438 | if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) |
439 | snd_soc_dapm_stream_event(codec, | 439 | snd_soc_dapm_stream_event(codec, |
@@ -444,8 +444,7 @@ static int soc_pcm_prepare(struct snd_pcm_substream *substream) | |||
444 | codec_dai->capture.stream_name, | 444 | codec_dai->capture.stream_name, |
445 | SND_SOC_DAPM_STREAM_START); | 445 | SND_SOC_DAPM_STREAM_START); |
446 | 446 | ||
447 | if (codec->dapm_event) | 447 | snd_soc_dapm_device_event(socdev, SNDRV_CTL_POWER_D0); |
448 | codec->dapm_event(codec, SNDRV_CTL_POWER_D0); | ||
449 | if (codec_dai->dai_ops.digital_mute) | 448 | if (codec_dai->dai_ops.digital_mute) |
450 | codec_dai->dai_ops.digital_mute(codec_dai, 0); | 449 | codec_dai->dai_ops.digital_mute(codec_dai, 0); |
451 | 450 | ||
diff --git a/sound/soc/soc-dapm.c b/sound/soc/soc-dapm.c index 3b8f94af7e27..16ebb60ed3d4 100644 --- a/sound/soc/soc-dapm.c +++ b/sound/soc/soc-dapm.c | |||
@@ -1279,6 +1279,29 @@ int snd_soc_dapm_stream_event(struct snd_soc_codec *codec, | |||
1279 | EXPORT_SYMBOL_GPL(snd_soc_dapm_stream_event); | 1279 | EXPORT_SYMBOL_GPL(snd_soc_dapm_stream_event); |
1280 | 1280 | ||
1281 | /** | 1281 | /** |
1282 | * snd_soc_dapm_device_event - send a device event to the dapm core | ||
1283 | * @socdev: audio device | ||
1284 | * @event: device event | ||
1285 | * | ||
1286 | * Sends a device event to the dapm core. The core then makes any | ||
1287 | * necessary machine or codec power changes.. | ||
1288 | * | ||
1289 | * Returns 0 for success else error. | ||
1290 | */ | ||
1291 | int snd_soc_dapm_device_event(struct snd_soc_device *socdev, int event) | ||
1292 | { | ||
1293 | struct snd_soc_codec *codec = socdev->codec; | ||
1294 | struct snd_soc_machine *machine = socdev->machine; | ||
1295 | |||
1296 | if (machine->dapm_event) | ||
1297 | machine->dapm_event(machine, event); | ||
1298 | if (codec->dapm_event) | ||
1299 | codec->dapm_event(codec, event); | ||
1300 | return 0; | ||
1301 | } | ||
1302 | EXPORT_SYMBOL_GPL(snd_soc_dapm_device_event); | ||
1303 | |||
1304 | /** | ||
1282 | * snd_soc_dapm_set_endpoint - set audio endpoint status | 1305 | * snd_soc_dapm_set_endpoint - set audio endpoint status |
1283 | * @codec: audio codec | 1306 | * @codec: audio codec |
1284 | * @endpoint: audio signal endpoint (or start point) | 1307 | * @endpoint: audio signal endpoint (or start point) |