Skip to content

Commit

Permalink
[ALSA] soc - Add device level DAPM event
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Liam Girdwood authored and Jaroslav Kysela committed Jan 31, 2008
1 parent 7570f29 commit 0b4d221
Show file tree
Hide file tree
Showing 4 changed files with 38 additions and 12 deletions.
1 change: 1 addition & 0 deletions include/sound/soc-dapm.h
Original file line number Diff line number Diff line change
Expand Up @@ -199,6 +199,7 @@ void snd_soc_dapm_free(struct snd_soc_device *socdev);
/* dapm events */
int snd_soc_dapm_stream_event(struct snd_soc_codec *codec, char *stream,
int event);
int snd_soc_dapm_device_event(struct snd_soc_device *socdev, int event);

/* dapm sys fs - used by the core */
int snd_soc_dapm_sys_add(struct device *dev);
Expand Down
3 changes: 3 additions & 0 deletions include/sound/soc.h
Original file line number Diff line number Diff line change
Expand Up @@ -425,6 +425,9 @@ struct snd_soc_machine {
int (*resume_pre)(struct platform_device *pdev);
int (*resume_post)(struct platform_device *pdev);

/* callbacks */
int (*dapm_event)(struct snd_soc_machine *, int event);

/* CPU <--> Codec DAI links */
struct snd_soc_dai_link *dai_link;
int num_links;
Expand Down
23 changes: 11 additions & 12 deletions sound/soc/soc-core.c
Original file line number Diff line number Diff line change
Expand Up @@ -288,15 +288,16 @@ static void close_delayed_work(struct work_struct *work)
if (codec_dai->pop_wait == 1) {

codec_dai->pop_wait = 0;
snd_soc_dapm_stream_event(codec, codec_dai->playback.stream_name,
snd_soc_dapm_stream_event(codec,
codec_dai->playback.stream_name,
SND_SOC_DAPM_STREAM_STOP);

/* power down the codec power domain if no longer active */
if (codec->active == 0) {
dbg("pop wq D3 %s %s\n", codec->name,
codec_dai->playback.stream_name);
if (codec->dapm_event)
codec->dapm_event(codec, SNDRV_CTL_POWER_D3hot);
snd_soc_dapm_device_event(socdev,
SNDRV_CTL_POWER_D3hot);
}
}
}
Expand Down Expand Up @@ -352,12 +353,12 @@ static int soc_codec_close(struct snd_pcm_substream *substream)
} else {
/* capture streams can be powered down now */
snd_soc_dapm_stream_event(codec,
codec_dai->capture.stream_name, SND_SOC_DAPM_STREAM_STOP);
codec_dai->capture.stream_name,
SND_SOC_DAPM_STREAM_STOP);

if (codec->active == 0 && codec_dai->pop_wait == 0){
if (codec->dapm_event)
codec->dapm_event(codec, SNDRV_CTL_POWER_D3hot);
}
if (codec->active == 0 && codec_dai->pop_wait == 0)
snd_soc_dapm_device_event(socdev,
SNDRV_CTL_POWER_D3hot);
}

mutex_unlock(&pcm_mutex);
Expand Down Expand Up @@ -432,8 +433,7 @@ static int soc_pcm_prepare(struct snd_pcm_substream *substream)
/* no delayed work - do we need to power up codec */
if (codec->dapm_state != SNDRV_CTL_POWER_D0) {

if (codec->dapm_event)
codec->dapm_event(codec, SNDRV_CTL_POWER_D1);
snd_soc_dapm_device_event(socdev, SNDRV_CTL_POWER_D1);

if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
snd_soc_dapm_stream_event(codec,
Expand All @@ -444,8 +444,7 @@ static int soc_pcm_prepare(struct snd_pcm_substream *substream)
codec_dai->capture.stream_name,
SND_SOC_DAPM_STREAM_START);

if (codec->dapm_event)
codec->dapm_event(codec, SNDRV_CTL_POWER_D0);
snd_soc_dapm_device_event(socdev, SNDRV_CTL_POWER_D0);
if (codec_dai->dai_ops.digital_mute)
codec_dai->dai_ops.digital_mute(codec_dai, 0);

Expand Down
23 changes: 23 additions & 0 deletions sound/soc/soc-dapm.c
Original file line number Diff line number Diff line change
Expand Up @@ -1278,6 +1278,29 @@ int snd_soc_dapm_stream_event(struct snd_soc_codec *codec,
}
EXPORT_SYMBOL_GPL(snd_soc_dapm_stream_event);

/**
* snd_soc_dapm_device_event - send a device event to the dapm core
* @socdev: audio device
* @event: device event
*
* Sends a device event to the dapm core. The core then makes any
* necessary machine or codec power changes..
*
* Returns 0 for success else error.
*/
int snd_soc_dapm_device_event(struct snd_soc_device *socdev, int event)
{
struct snd_soc_codec *codec = socdev->codec;
struct snd_soc_machine *machine = socdev->machine;

if (machine->dapm_event)
machine->dapm_event(machine, event);
if (codec->dapm_event)
codec->dapm_event(codec, event);
return 0;
}
EXPORT_SYMBOL_GPL(snd_soc_dapm_device_event);

/**
* snd_soc_dapm_set_endpoint - set audio endpoint status
* @codec: audio codec
Expand Down

0 comments on commit 0b4d221

Please sign in to comment.