diff options
Diffstat (limited to 'sound/soc/soc-pcm.c')
| -rw-r--r-- | sound/soc/soc-pcm.c | 29 | 
1 files changed, 13 insertions, 16 deletions
| diff --git a/sound/soc/soc-pcm.c b/sound/soc/soc-pcm.c index 2cedf09f6d96..54d18f22a33e 100644 --- a/sound/soc/soc-pcm.c +++ b/sound/soc/soc-pcm.c @@ -555,7 +555,6 @@ static int soc_pcm_close(struct snd_pcm_substream *substream)  	if (platform->driver->ops && platform->driver->ops->close)  		platform->driver->ops->close(substream); -	cpu_dai->runtime = NULL;  	if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {  		if (snd_soc_runtime_ignore_pmdown_time(rtd)) { @@ -819,6 +818,13 @@ static int soc_pcm_trigger(struct snd_pcm_substream *substream, int cmd)  		if (ret < 0)  			return ret;  	} + +	if (rtd->dai_link->ops && rtd->dai_link->ops->trigger) { +		ret = rtd->dai_link->ops->trigger(substream, cmd); +		if (ret < 0) +			return ret; +	} +  	return 0;  } @@ -1012,21 +1018,12 @@ static struct snd_soc_pcm_runtime *dpcm_get_be(struct snd_soc_card *card,  }  static inline struct snd_soc_dapm_widget * -	rtd_get_cpu_widget(struct snd_soc_pcm_runtime *rtd, int stream) -{ -	if (stream == SNDRV_PCM_STREAM_PLAYBACK) -		return rtd->cpu_dai->playback_widget; -	else -		return rtd->cpu_dai->capture_widget; -} - -static inline struct snd_soc_dapm_widget * -	rtd_get_codec_widget(struct snd_soc_pcm_runtime *rtd, int stream) +	dai_get_widget(struct snd_soc_dai *dai, int stream)  {  	if (stream == SNDRV_PCM_STREAM_PLAYBACK) -		return rtd->codec_dai->playback_widget; +		return dai->playback_widget;  	else -		return rtd->codec_dai->capture_widget; +		return dai->capture_widget;  }  static int widget_in_list(struct snd_soc_dapm_widget_list *list, @@ -1076,14 +1073,14 @@ static int dpcm_prune_paths(struct snd_soc_pcm_runtime *fe, int stream,  	list_for_each_entry(dpcm, &fe->dpcm[stream].be_clients, list_be) {  		/* is there a valid CPU DAI widget for this BE */ -		widget = rtd_get_cpu_widget(dpcm->be, stream); +		widget = dai_get_widget(dpcm->be->cpu_dai, stream);  		/* prune the BE if it's no longer in our active list */  		if (widget && widget_in_list(list, widget))  			continue;  		/* is there a valid CODEC DAI widget for this BE */ -		widget = rtd_get_codec_widget(dpcm->be, stream); +		widget = dai_get_widget(dpcm->be->codec_dai, stream);  		/* prune the BE if it's no longer in our active list */  		if (widget && widget_in_list(list, widget)) @@ -1675,7 +1672,7 @@ int dpcm_be_dai_trigger(struct snd_soc_pcm_runtime *fe, int stream,  			be->dpcm[stream].state = SND_SOC_DPCM_STATE_STOP;  			break;  		case SNDRV_PCM_TRIGGER_SUSPEND: -			if (be->dpcm[stream].state != SND_SOC_DPCM_STATE_STOP) +			if (be->dpcm[stream].state != SND_SOC_DPCM_STATE_START)  				continue;  			if (!snd_soc_dpcm_can_be_free_stop(fe, be, stream)) | 
