Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 0b4d221b authored by Liam Girdwood's avatar Liam Girdwood Committed by Jaroslav Kysela
Browse files

[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: default avatarLiam Girdwood <lg@opensource.wolfsonmicro.com>
Signed-off-by: default avatarMark Brown <broonie@opensource.wolfsonmicro.com>
Signed-off-by: default avatarTakashi Iwai <tiwai@suse.de>
Signed-off-by: default avatarJaroslav Kysela <perex@perex.cz>
parent 7570f29a
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -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);
+3 −0
Original line number Diff line number Diff line
@@ -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;
+11 −12
Original line number Diff line number Diff line
@@ -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);
			}
		}
	}
@@ -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);
@@ -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,
@@ -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);

+23 −0
Original line number Diff line number Diff line
@@ -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