Loading include/sound/soc-dpcm.h +2 −0 Original line number Diff line number Diff line Loading @@ -148,6 +148,8 @@ int dpcm_be_dai_hw_free(struct snd_soc_pcm_runtime *fe, int stream); int dpcm_be_dai_hw_params(struct snd_soc_pcm_runtime *fe, int tream); int dpcm_be_dai_trigger(struct snd_soc_pcm_runtime *fe, int stream, int cmd); int dpcm_be_dai_prepare(struct snd_soc_pcm_runtime *fe, int stream); int dpcm_dapm_stream_event(struct snd_soc_pcm_runtime *fe, int dir, int event); static inline void dpcm_path_put(struct snd_soc_dapm_widget_list **list) { Loading sound/soc/soc-compress.c +38 −1 Original line number Diff line number Diff line Loading @@ -121,6 +121,8 @@ static int soc_compr_open_fe(struct snd_compr_stream *cstream) /* calculate valid and active FE <-> BE dpcms */ dpcm_process_paths(fe, stream, &list, 1); fe->dpcm[stream].runtime_update = SND_SOC_DPCM_UPDATE_FE; ret = dpcm_be_dai_startup(fe, stream); if (ret < 0) { /* clean up all links */ Loading @@ -135,6 +137,8 @@ static int soc_compr_open_fe(struct snd_compr_stream *cstream) dpcm_clear_pending_state(fe, stream); dpcm_path_put(&list); fe->dpcm[stream].state = SND_SOC_DPCM_STATE_OPEN; fe->dpcm[stream].runtime_update = SND_SOC_DPCM_UPDATE_NO; mutex_unlock(&fe->card->mutex); return 0; Loading @@ -146,6 +150,7 @@ machine_err: if (platform->driver->compr_ops && platform->driver->compr_ops->free) platform->driver->compr_ops->free(cstream); out: fe->dpcm[stream].runtime_update = SND_SOC_DPCM_UPDATE_NO; mutex_unlock(&fe->card->mutex); return ret; } Loading Loading @@ -252,6 +257,8 @@ static int soc_compr_free_fe(struct snd_compr_stream *cstream) mutex_lock_nested(&fe->card->mutex, SND_SOC_CARD_CLASS_RUNTIME); fe->dpcm[stream].runtime_update = SND_SOC_DPCM_UPDATE_FE; ret = dpcm_be_dai_hw_free(fe, stream); if (ret < 0) dev_err(fe->dev, "compressed hw_free failed %d\n", ret); Loading @@ -262,6 +269,11 @@ static int soc_compr_free_fe(struct snd_compr_stream *cstream) list_for_each_entry(dpcm, &fe->dpcm[stream].be_clients, list_be) dpcm->state = SND_SOC_DPCM_LINK_STATE_FREE; dpcm_dapm_stream_event(fe, stream, SND_SOC_DAPM_STREAM_STOP); fe->dpcm[stream].state = SND_SOC_DPCM_STATE_CLOSE; fe->dpcm[stream].runtime_update = SND_SOC_DPCM_UPDATE_NO; dpcm_be_disconnect(fe, stream); fe->dpcm[stream].runtime = NULL; Loading Loading @@ -328,9 +340,27 @@ static int soc_compr_trigger_fe(struct snd_compr_stream *cstream, int cmd) goto out; } fe->dpcm[stream].runtime_update = SND_SOC_DPCM_UPDATE_FE; ret = dpcm_be_dai_trigger(fe, stream, cmd); switch (cmd) { case SNDRV_PCM_TRIGGER_START: case SNDRV_PCM_TRIGGER_RESUME: case SNDRV_PCM_TRIGGER_PAUSE_RELEASE: fe->dpcm[stream].state = SND_SOC_DPCM_STATE_START; break; case SNDRV_PCM_TRIGGER_STOP: case SNDRV_PCM_TRIGGER_SUSPEND: fe->dpcm[stream].state = SND_SOC_DPCM_STATE_STOP; break; case SNDRV_PCM_TRIGGER_PAUSE_PUSH: fe->dpcm[stream].state = SND_SOC_DPCM_STATE_PAUSED; break; } out: fe->dpcm[stream].runtime_update = SND_SOC_DPCM_UPDATE_NO; mutex_unlock(&fe->card->mutex); return ret; } Loading Loading @@ -421,9 +451,11 @@ static int soc_compr_set_params_fe(struct snd_compr_stream *cstream, goto out; } memcpy(&fe->dpcm[fe_substream->stream].hw_params, params, sizeof(struct snd_pcm_hw_params)); fe->dpcm[stream].runtime_update = SND_SOC_DPCM_UPDATE_FE; ret = dpcm_be_dai_hw_params(fe, stream); if (ret < 0) goto out; Loading @@ -432,7 +464,12 @@ static int soc_compr_set_params_fe(struct snd_compr_stream *cstream, if (ret < 0) goto out; dpcm_dapm_stream_event(fe, stream, SND_SOC_DAPM_STREAM_START); fe->dpcm[stream].state = SND_SOC_DPCM_STATE_PREPARE; out: fe->dpcm[stream].runtime_update = SND_SOC_DPCM_UPDATE_NO; mutex_unlock(&fe->card->mutex); return ret; } Loading sound/soc/soc-pcm.c +8 −2 Original line number Diff line number Diff line Loading @@ -50,7 +50,7 @@ static const struct snd_pcm_hardware no_host_hardware = { }; /* DPCM stream event, send event to FE and all active BEs. */ static int dpcm_dapm_stream_event(struct snd_soc_pcm_runtime *fe, int dir, int dpcm_dapm_stream_event(struct snd_soc_pcm_runtime *fe, int dir, int event) { struct snd_soc_dpcm *dpcm; Loading Loading @@ -736,6 +736,11 @@ static int dpcm_be_connect(struct snd_soc_pcm_runtime *fe, { struct snd_soc_dpcm *dpcm; if (!fe->dpcm[stream].runtime && !fe->fe_compr) { dev_err(fe->dev, "%s no runtime\n", fe->dai_link->name); return -ENODEV; } /* only add new dpcms */ list_for_each_entry(dpcm, &fe->dpcm[stream].be_clients, list_be) { if (dpcm->be == be && dpcm->fe == fe) Loading Loading @@ -980,7 +985,7 @@ static int dpcm_add_paths(struct snd_soc_pcm_runtime *fe, int stream, continue; /* don't connect if FE is not running */ if (!fe->dpcm[stream].runtime) if (!fe->dpcm[stream].runtime && !fe->fe_compr) continue; /* newly connected FE and BE */ Loading Loading @@ -1686,6 +1691,7 @@ static int dpcm_fe_dai_prepare(struct snd_pcm_substream *substream) /* run the stream event for each BE */ dpcm_dapm_stream_event(fe, stream, SND_SOC_DAPM_STREAM_START); fe->dpcm[stream].state = SND_SOC_DPCM_STATE_PREPARE; out: Loading Loading
include/sound/soc-dpcm.h +2 −0 Original line number Diff line number Diff line Loading @@ -148,6 +148,8 @@ int dpcm_be_dai_hw_free(struct snd_soc_pcm_runtime *fe, int stream); int dpcm_be_dai_hw_params(struct snd_soc_pcm_runtime *fe, int tream); int dpcm_be_dai_trigger(struct snd_soc_pcm_runtime *fe, int stream, int cmd); int dpcm_be_dai_prepare(struct snd_soc_pcm_runtime *fe, int stream); int dpcm_dapm_stream_event(struct snd_soc_pcm_runtime *fe, int dir, int event); static inline void dpcm_path_put(struct snd_soc_dapm_widget_list **list) { Loading
sound/soc/soc-compress.c +38 −1 Original line number Diff line number Diff line Loading @@ -121,6 +121,8 @@ static int soc_compr_open_fe(struct snd_compr_stream *cstream) /* calculate valid and active FE <-> BE dpcms */ dpcm_process_paths(fe, stream, &list, 1); fe->dpcm[stream].runtime_update = SND_SOC_DPCM_UPDATE_FE; ret = dpcm_be_dai_startup(fe, stream); if (ret < 0) { /* clean up all links */ Loading @@ -135,6 +137,8 @@ static int soc_compr_open_fe(struct snd_compr_stream *cstream) dpcm_clear_pending_state(fe, stream); dpcm_path_put(&list); fe->dpcm[stream].state = SND_SOC_DPCM_STATE_OPEN; fe->dpcm[stream].runtime_update = SND_SOC_DPCM_UPDATE_NO; mutex_unlock(&fe->card->mutex); return 0; Loading @@ -146,6 +150,7 @@ machine_err: if (platform->driver->compr_ops && platform->driver->compr_ops->free) platform->driver->compr_ops->free(cstream); out: fe->dpcm[stream].runtime_update = SND_SOC_DPCM_UPDATE_NO; mutex_unlock(&fe->card->mutex); return ret; } Loading Loading @@ -252,6 +257,8 @@ static int soc_compr_free_fe(struct snd_compr_stream *cstream) mutex_lock_nested(&fe->card->mutex, SND_SOC_CARD_CLASS_RUNTIME); fe->dpcm[stream].runtime_update = SND_SOC_DPCM_UPDATE_FE; ret = dpcm_be_dai_hw_free(fe, stream); if (ret < 0) dev_err(fe->dev, "compressed hw_free failed %d\n", ret); Loading @@ -262,6 +269,11 @@ static int soc_compr_free_fe(struct snd_compr_stream *cstream) list_for_each_entry(dpcm, &fe->dpcm[stream].be_clients, list_be) dpcm->state = SND_SOC_DPCM_LINK_STATE_FREE; dpcm_dapm_stream_event(fe, stream, SND_SOC_DAPM_STREAM_STOP); fe->dpcm[stream].state = SND_SOC_DPCM_STATE_CLOSE; fe->dpcm[stream].runtime_update = SND_SOC_DPCM_UPDATE_NO; dpcm_be_disconnect(fe, stream); fe->dpcm[stream].runtime = NULL; Loading Loading @@ -328,9 +340,27 @@ static int soc_compr_trigger_fe(struct snd_compr_stream *cstream, int cmd) goto out; } fe->dpcm[stream].runtime_update = SND_SOC_DPCM_UPDATE_FE; ret = dpcm_be_dai_trigger(fe, stream, cmd); switch (cmd) { case SNDRV_PCM_TRIGGER_START: case SNDRV_PCM_TRIGGER_RESUME: case SNDRV_PCM_TRIGGER_PAUSE_RELEASE: fe->dpcm[stream].state = SND_SOC_DPCM_STATE_START; break; case SNDRV_PCM_TRIGGER_STOP: case SNDRV_PCM_TRIGGER_SUSPEND: fe->dpcm[stream].state = SND_SOC_DPCM_STATE_STOP; break; case SNDRV_PCM_TRIGGER_PAUSE_PUSH: fe->dpcm[stream].state = SND_SOC_DPCM_STATE_PAUSED; break; } out: fe->dpcm[stream].runtime_update = SND_SOC_DPCM_UPDATE_NO; mutex_unlock(&fe->card->mutex); return ret; } Loading Loading @@ -421,9 +451,11 @@ static int soc_compr_set_params_fe(struct snd_compr_stream *cstream, goto out; } memcpy(&fe->dpcm[fe_substream->stream].hw_params, params, sizeof(struct snd_pcm_hw_params)); fe->dpcm[stream].runtime_update = SND_SOC_DPCM_UPDATE_FE; ret = dpcm_be_dai_hw_params(fe, stream); if (ret < 0) goto out; Loading @@ -432,7 +464,12 @@ static int soc_compr_set_params_fe(struct snd_compr_stream *cstream, if (ret < 0) goto out; dpcm_dapm_stream_event(fe, stream, SND_SOC_DAPM_STREAM_START); fe->dpcm[stream].state = SND_SOC_DPCM_STATE_PREPARE; out: fe->dpcm[stream].runtime_update = SND_SOC_DPCM_UPDATE_NO; mutex_unlock(&fe->card->mutex); return ret; } Loading
sound/soc/soc-pcm.c +8 −2 Original line number Diff line number Diff line Loading @@ -50,7 +50,7 @@ static const struct snd_pcm_hardware no_host_hardware = { }; /* DPCM stream event, send event to FE and all active BEs. */ static int dpcm_dapm_stream_event(struct snd_soc_pcm_runtime *fe, int dir, int dpcm_dapm_stream_event(struct snd_soc_pcm_runtime *fe, int dir, int event) { struct snd_soc_dpcm *dpcm; Loading Loading @@ -736,6 +736,11 @@ static int dpcm_be_connect(struct snd_soc_pcm_runtime *fe, { struct snd_soc_dpcm *dpcm; if (!fe->dpcm[stream].runtime && !fe->fe_compr) { dev_err(fe->dev, "%s no runtime\n", fe->dai_link->name); return -ENODEV; } /* only add new dpcms */ list_for_each_entry(dpcm, &fe->dpcm[stream].be_clients, list_be) { if (dpcm->be == be && dpcm->fe == fe) Loading Loading @@ -980,7 +985,7 @@ static int dpcm_add_paths(struct snd_soc_pcm_runtime *fe, int stream, continue; /* don't connect if FE is not running */ if (!fe->dpcm[stream].runtime) if (!fe->dpcm[stream].runtime && !fe->fe_compr) continue; /* newly connected FE and BE */ Loading Loading @@ -1686,6 +1691,7 @@ static int dpcm_fe_dai_prepare(struct snd_pcm_substream *substream) /* run the stream event for each BE */ dpcm_dapm_stream_event(fe, stream, SND_SOC_DAPM_STREAM_START); fe->dpcm[stream].state = SND_SOC_DPCM_STATE_PREPARE; out: Loading