Lines Matching refs:stream
53 int stream)
55 snd_pcm_stream_lock_irq(snd_soc_dpcm_get_substream(rtd, stream));
58 #define snd_soc_dpcm_stream_lock_irqsave_nested(rtd, stream, flags) \
59 snd_pcm_stream_lock_irqsave_nested(snd_soc_dpcm_get_substream(rtd, stream), flags)
62 int stream)
64 snd_pcm_stream_unlock_irq(snd_soc_dpcm_get_substream(rtd, stream));
67 #define snd_soc_dpcm_stream_unlock_irqrestore(rtd, stream, flags) \
68 snd_pcm_stream_unlock_irqrestore(snd_soc_dpcm_get_substream(rtd, stream), flags)
111 int stream, char *buf, size_t size)
113 struct snd_pcm_hw_params *params = &fe->dpcm[stream].hw_params;
120 stream ? "Capture" : "Playback");
123 dpcm_state_string(fe->dpcm[stream].state));
125 if ((fe->dpcm[stream].state >= SND_SOC_DPCM_STATE_HW_PARAMS) &&
126 (fe->dpcm[stream].state <= SND_SOC_DPCM_STATE_STOP))
137 if (list_empty(&fe->dpcm[stream].be_clients)) {
143 for_each_dpcm_be(fe, stream, dpcm) {
145 params = &be->dpcm[stream].hw_params;
152 dpcm_state_string(be->dpcm[stream].state));
154 if ((be->dpcm[stream].state >= SND_SOC_DPCM_STATE_HW_PARAMS) &&
155 (be->dpcm[stream].state <= SND_SOC_DPCM_STATE_STOP))
172 int stream;
186 for_each_pcm_streams(stream)
187 if (snd_soc_dai_stream_valid(asoc_rtd_to_cpu(fe, 0), stream))
188 offset += dpcm_show_state(fe, stream,
220 static void dpcm_create_debugfs_state(struct snd_soc_dpcm *dpcm, int stream)
225 stream ? "capture" : "playback");
242 int stream)
251 /* Set FE's runtime_update state; the state is protected via PCM stream lock
258 int stream, enum snd_soc_dpcm_update state)
261 snd_soc_dpcm_get_substream(fe, stream);
263 snd_soc_dpcm_stream_lock_irq(fe, stream);
264 if (state == SND_SOC_DPCM_UPDATE_NO && fe->dpcm[stream].trigger_pending) {
266 fe->dpcm[stream].trigger_pending - 1);
267 fe->dpcm[stream].trigger_pending = 0;
269 fe->dpcm[stream].runtime_update = state;
270 snd_soc_dpcm_stream_unlock_irq(fe, stream);
274 int stream, enum snd_soc_dpcm_update state)
276 be->dpcm[stream].runtime_update = state;
283 * @stream: Direction of the PCM stream
284 * @action: Activate stream if 1. Deactivate if -1.
288 * Should typically be called when a stream is opened.
293 int stream, int action)
301 snd_soc_dai_action(dai, stream, action);
345 /* DPCM stream event, send event to FE and all active BEs. */
493 int stream = substream->stream;
498 struct snd_soc_pcm_stream *pcm_codec = snd_soc_dai_get_pcm_stream(codec_dai, stream);
508 struct snd_soc_pcm_stream *pcm_cpu = snd_soc_dai_get_pcm_stream(cpu_dai, stream);
558 * snd_soc_runtime_calc_hw() - Calculate hw limits for a PCM stream
561 * @stream: Direction of the PCM stream
563 * Calculates the subset of stream parameters supported by all DAIs
564 * associated with the PCM stream.
567 struct snd_pcm_hardware *hw, int stream)
582 * Skip CPUs which don't support the current stream type.
587 if (!snd_soc_dai_stream_valid(cpu_dai, stream))
590 cpu_stream = snd_soc_dai_get_pcm_stream(cpu_dai, stream);
603 * Skip CODECs which don't support the current stream type.
608 if (!snd_soc_dai_stream_valid(codec_dai, stream))
611 codec_stream = snd_soc_dai_get_pcm_stream(codec_dai, stream);
647 snd_soc_runtime_calc_hw(rtd, hw, substream->stream);
700 snd_soc_runtime_deactivate(rtd, substream->stream);
836 /* Symmetry only applies if we've already got an active stream. */
843 snd_soc_runtime_activate(rtd, substream->stream);
889 /* cancel any delayed stream shutdown that is pending */
890 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK &&
896 snd_soc_dapm_stream_event(rtd, substream->stream,
901 snd_soc_dai_digital_mute(dai, 0, substream->stream);
944 if (snd_soc_dai_stream_active(dai, substream->stream) == 1) {
946 snd_soc_dai_digital_mute(dai, 1, substream->stream);
950 /* run the stream event */
951 snd_soc_dapm_stream_stop(rtd, substream->stream);
961 if (snd_soc_dai_stream_valid(dai, substream->stream))
1013 unsigned int tdm_mask = snd_soc_dai_tdm_mask_get(codec_dai, substream->stream);
1016 * Skip CODECs which don't support the current stream type,
1029 if (!snd_soc_dai_stream_valid(codec_dai, substream->stream))
1053 * Skip CPUs which don't support the current stream
1056 if (!snd_soc_dai_stream_valid(cpu_dai, substream->stream))
1224 struct snd_soc_pcm_runtime *be, int stream)
1233 for_each_dpcm_be(fe, stream, dpcm) {
1238 fe_substream = snd_soc_dpcm_get_substream(fe, stream);
1239 be_substream = snd_soc_dpcm_get_substream(be, stream);
1258 snd_soc_dpcm_stream_lock_irq(fe, stream);
1259 list_add(&dpcm->list_be, &fe->dpcm[stream].be_clients);
1260 list_add(&dpcm->list_fe, &be->dpcm[stream].fe_clients);
1261 snd_soc_dpcm_stream_unlock_irq(fe, stream);
1264 stream ? "capture" : "playback", fe->dai_link->name,
1265 stream ? "<-" : "->", be->dai_link->name);
1267 dpcm_create_debugfs_state(dpcm, stream);
1274 struct snd_soc_pcm_runtime *be, int stream)
1280 if (!be->dpcm[stream].users)
1283 be_substream = snd_soc_dpcm_get_substream(be, stream);
1287 for_each_dpcm_fe(be, stream, dpcm) {
1292 stream ? "capture" : "playback",
1294 stream ? "<-" : "->", dpcm->be->dai_link->name);
1296 fe_substream = snd_soc_dpcm_get_substream(dpcm->fe, stream);
1303 void dpcm_be_disconnect(struct snd_soc_pcm_runtime *fe, int stream)
1310 snd_soc_dpcm_stream_lock_irq(fe, stream);
1311 for_each_dpcm_be_safe(fe, stream, dpcm, d) {
1313 stream ? "capture" : "playback",
1320 stream ? "capture" : "playback", fe->dai_link->name,
1321 stream ? "<-" : "->", dpcm->be->dai_link->name);
1324 dpcm_be_reparent(fe, dpcm->be, stream);
1329 snd_soc_dpcm_stream_unlock_irq(fe, stream);
1340 /* get BE for DAI widget and stream */
1342 struct snd_soc_dapm_widget *widget, int stream)
1356 if (!snd_soc_dpcm_get_substream(be, stream))
1360 w = snd_soc_dai_get_widget(dai, stream);
1392 int stream;
1394 /* adjust dir to stream */
1396 stream = SNDRV_PCM_STREAM_PLAYBACK;
1398 stream = SNDRV_PCM_STREAM_CAPTURE;
1400 rtd = dpcm_get_be(card, widget, stream);
1409 int stream, struct snd_soc_dapm_widget_list **list)
1421 paths = snd_soc_dapm_dai_get_connected_widgets(cpu_dai, stream, list,
1427 stream ? "capture" : "playback");
1430 stream ? "capture" : "playback");
1440 static bool dpcm_be_is_active(struct snd_soc_dpcm *dpcm, int stream,
1448 struct snd_soc_dapm_widget *widget = snd_soc_dai_get_widget(dai, stream);
1461 static int dpcm_prune_paths(struct snd_soc_pcm_runtime *fe, int stream,
1468 for_each_dpcm_be(fe, stream, dpcm) {
1469 if (dpcm_be_is_active(dpcm, stream, *list_))
1473 stream ? "capture" : "playback",
1476 dpcm_set_be_update_state(dpcm->be, stream, SND_SOC_DPCM_UPDATE_BE);
1484 static int dpcm_add_paths(struct snd_soc_pcm_runtime *fe, int stream,
1491 struct snd_pcm_substream *fe_substream = snd_soc_dpcm_get_substream(fe, stream);
1503 if (stream != SNDRV_PCM_STREAM_PLAYBACK)
1507 if (stream != SNDRV_PCM_STREAM_CAPTURE)
1515 be = dpcm_get_be(card, widget, stream);
1528 (be->dpcm[stream].state != SND_SOC_DPCM_STATE_NEW) &&
1529 (be->dpcm[stream].state != SND_SOC_DPCM_STATE_CLOSE))
1533 err = dpcm_be_connect(fe, be, stream);
1542 dpcm_set_be_update_state(be, stream, SND_SOC_DPCM_UPDATE_BE);
1555 int stream, struct snd_soc_dapm_widget_list **list, int new)
1558 return dpcm_add_paths(fe, stream, list);
1560 return dpcm_prune_paths(fe, stream, list);
1563 void dpcm_clear_pending_state(struct snd_soc_pcm_runtime *fe, int stream)
1567 for_each_dpcm_be(fe, stream, dpcm)
1568 dpcm_set_be_update_state(dpcm->be, stream, SND_SOC_DPCM_UPDATE_NO);
1571 void dpcm_be_dai_stop(struct snd_soc_pcm_runtime *fe, int stream,
1577 for_each_dpcm_be(fe, stream, dpcm) {
1580 snd_soc_dpcm_get_substream(be, stream);
1586 if (!snd_soc_dpcm_be_can_update(fe, be, stream))
1589 if (be->dpcm[stream].users == 0) {
1591 stream ? "capture" : "playback",
1592 be->dpcm[stream].state);
1596 if (--be->dpcm[stream].users != 0)
1599 if (be->dpcm[stream].state != SND_SOC_DPCM_STATE_OPEN) {
1603 if (be->dpcm[stream].state != SND_SOC_DPCM_STATE_HW_FREE) {
1605 be->dpcm[stream].state = SND_SOC_DPCM_STATE_HW_FREE;
1611 be->dpcm[stream].state = SND_SOC_DPCM_STATE_CLOSE;
1615 int dpcm_be_dai_startup(struct snd_soc_pcm_runtime *fe, int stream)
1617 struct snd_pcm_substream *fe_substream = snd_soc_dpcm_get_substream(fe, stream);
1623 for_each_dpcm_be(fe, stream, dpcm) {
1627 be_substream = snd_soc_dpcm_get_substream(be, stream);
1630 dev_err(be->dev, "ASoC: no backend %s stream\n",
1631 stream ? "capture" : "playback");
1636 if (!snd_soc_dpcm_be_can_update(fe, be, stream))
1640 if (be->dpcm[stream].users == DPCM_MAX_BE_USERS) {
1642 stream ? "capture" : "playback",
1643 be->dpcm[stream].state);
1647 if (be->dpcm[stream].users++ != 0)
1650 if ((be->dpcm[stream].state != SND_SOC_DPCM_STATE_NEW) &&
1651 (be->dpcm[stream].state != SND_SOC_DPCM_STATE_CLOSE))
1655 stream ? "capture" : "playback", be->dai_link->name);
1660 be->dpcm[stream].users--;
1661 if (be->dpcm[stream].users < 0)
1663 stream ? "capture" : "playback",
1664 be->dpcm[stream].state);
1666 be->dpcm[stream].state = SND_SOC_DPCM_STATE_CLOSE;
1669 be->dpcm[stream].be_start = 0;
1670 be->dpcm[stream].state = SND_SOC_DPCM_STATE_OPEN;
1677 dpcm_be_dai_startup_rollback(fe, stream, dpcm);
1688 int stream = substream->stream;
1701 * Skip CPUs which don't support the current stream
1704 if (!snd_soc_dai_stream_valid(dai, stream))
1707 cpu_stream = snd_soc_dai_get_pcm_stream(dai, stream);
1723 int stream = substream->stream;
1733 for_each_dpcm_be(fe, stream, dpcm) {
1740 * Skip CODECs which don't support the current stream
1743 if (!snd_soc_dai_stream_valid(dai, stream))
1746 codec_stream = snd_soc_dai_get_pcm_stream(dai, stream);
1759 int stream = substream->stream;
1769 for_each_dpcm_be(fe, stream, dpcm) {
1777 * Skip CPUs which don't support the current stream
1780 if (!snd_soc_dai_stream_valid(dai, stream))
1783 cpu_stream = snd_soc_dai_get_pcm_stream(dai, stream);
1794 asoc_rtd_to_codec(be, 0), stream);
1807 int stream = substream->stream;
1817 for_each_dpcm_be(fe, stream, dpcm) {
1825 * Skip DAIs which don't support the current stream
1828 if (!snd_soc_dai_stream_valid(dai, stream))
1831 pcm = snd_soc_dai_get_pcm_stream(dai, stream);
1839 int stream)
1851 /* Symmetry only applies if we've got an active stream. */
1858 for_each_dpcm_be(fe, stream, dpcm) {
1861 snd_soc_dpcm_get_substream(be, stream);
1875 /* Symmetry only applies if we've got an active stream. */
1889 int stream = fe_substream->stream, ret = 0;
1891 dpcm_set_fe_update_state(fe, stream, SND_SOC_DPCM_UPDATE_FE);
1893 ret = dpcm_be_dai_startup(fe, stream);
1904 fe->dpcm[stream].state = SND_SOC_DPCM_STATE_OPEN;
1912 ret = dpcm_apply_symmetry(fe_substream, stream);
1916 dpcm_be_dai_startup_unwind(fe, stream);
1918 dpcm_set_fe_update_state(fe, stream, SND_SOC_DPCM_UPDATE_NO);
1926 int stream = substream->stream;
1930 dpcm_set_fe_update_state(fe, stream, SND_SOC_DPCM_UPDATE_FE);
1933 dpcm_be_dai_shutdown(fe, stream);
1940 /* run the stream stop event */
1941 dpcm_dapm_stream_event(fe, stream, SND_SOC_DAPM_STREAM_STOP);
1943 fe->dpcm[stream].state = SND_SOC_DPCM_STATE_CLOSE;
1944 dpcm_set_fe_update_state(fe, stream, SND_SOC_DPCM_UPDATE_NO);
1948 void dpcm_be_dai_hw_free(struct snd_soc_pcm_runtime *fe, int stream)
1954 for_each_dpcm_be(fe, stream, dpcm) {
1958 snd_soc_dpcm_get_substream(be, stream);
1961 if (!snd_soc_dpcm_be_can_update(fe, be, stream))
1965 if (!snd_soc_dpcm_can_be_free_stop(fe, be, stream))
1969 if (be->dpcm[stream].users > 1)
1972 if ((be->dpcm[stream].state != SND_SOC_DPCM_STATE_HW_PARAMS) &&
1973 (be->dpcm[stream].state != SND_SOC_DPCM_STATE_PREPARE) &&
1974 (be->dpcm[stream].state != SND_SOC_DPCM_STATE_HW_FREE) &&
1975 (be->dpcm[stream].state != SND_SOC_DPCM_STATE_PAUSED) &&
1976 (be->dpcm[stream].state != SND_SOC_DPCM_STATE_STOP) &&
1977 (be->dpcm[stream].state != SND_SOC_DPCM_STATE_SUSPEND))
1985 be->dpcm[stream].state = SND_SOC_DPCM_STATE_HW_FREE;
1992 int stream = substream->stream;
1995 dpcm_set_fe_update_state(fe, stream, SND_SOC_DPCM_UPDATE_FE);
2004 dpcm_be_dai_hw_free(fe, stream);
2006 fe->dpcm[stream].state = SND_SOC_DPCM_STATE_HW_FREE;
2007 dpcm_set_fe_update_state(fe, stream, SND_SOC_DPCM_UPDATE_NO);
2013 int dpcm_be_dai_hw_params(struct snd_soc_pcm_runtime *fe, int stream)
2020 for_each_dpcm_be(fe, stream, dpcm) {
2024 be_substream = snd_soc_dpcm_get_substream(be, stream);
2027 if (!snd_soc_dpcm_be_can_update(fe, be, stream))
2031 memcpy(&hw_params, &fe->dpcm[stream].hw_params,
2040 memcpy(&be->dpcm[stream].hw_params, &hw_params,
2044 if (!snd_soc_dpcm_can_be_params(fe, be, stream))
2047 if ((be->dpcm[stream].state != SND_SOC_DPCM_STATE_OPEN) &&
2048 (be->dpcm[stream].state != SND_SOC_DPCM_STATE_HW_PARAMS) &&
2049 (be->dpcm[stream].state != SND_SOC_DPCM_STATE_HW_FREE))
2059 be->dpcm[stream].state = SND_SOC_DPCM_STATE_HW_PARAMS;
2068 for_each_dpcm_be_rollback(fe, stream, dpcm) {
2070 be_substream = snd_soc_dpcm_get_substream(be, stream);
2072 if (!snd_soc_dpcm_be_can_update(fe, be, stream))
2076 if (!snd_soc_dpcm_can_be_free_stop(fe, be, stream))
2079 if ((be->dpcm[stream].state != SND_SOC_DPCM_STATE_OPEN) &&
2080 (be->dpcm[stream].state != SND_SOC_DPCM_STATE_HW_PARAMS) &&
2081 (be->dpcm[stream].state != SND_SOC_DPCM_STATE_HW_FREE) &&
2082 (be->dpcm[stream].state != SND_SOC_DPCM_STATE_STOP))
2095 int ret, stream = substream->stream;
2098 dpcm_set_fe_update_state(fe, stream, SND_SOC_DPCM_UPDATE_FE);
2100 memcpy(&fe->dpcm[stream].hw_params, params,
2102 ret = dpcm_be_dai_hw_params(fe, stream);
2113 dpcm_be_dai_hw_free(fe, stream);
2115 fe->dpcm[stream].state = SND_SOC_DPCM_STATE_HW_PARAMS;
2118 dpcm_set_fe_update_state(fe, stream, SND_SOC_DPCM_UPDATE_NO);
2124 int dpcm_be_dai_trigger(struct snd_soc_pcm_runtime *fe, int stream,
2133 for_each_dpcm_be(fe, stream, dpcm) {
2137 be_substream = snd_soc_dpcm_get_substream(be, stream);
2139 snd_soc_dpcm_stream_lock_irqsave_nested(be, stream, flags);
2142 if (!snd_soc_dpcm_be_can_update(fe, be, stream))
2150 if (!be->dpcm[stream].be_start &&
2151 (be->dpcm[stream].state != SND_SOC_DPCM_STATE_PREPARE) &&
2152 (be->dpcm[stream].state != SND_SOC_DPCM_STATE_STOP) &&
2153 (be->dpcm[stream].state != SND_SOC_DPCM_STATE_PAUSED))
2156 be->dpcm[stream].be_start++;
2157 if (be->dpcm[stream].be_start != 1)
2160 if (be->dpcm[stream].state == SND_SOC_DPCM_STATE_PAUSED)
2167 be->dpcm[stream].be_start--;
2171 be->dpcm[stream].state = SND_SOC_DPCM_STATE_START;
2174 if ((be->dpcm[stream].state != SND_SOC_DPCM_STATE_SUSPEND))
2177 be->dpcm[stream].be_start++;
2178 if (be->dpcm[stream].be_start != 1)
2183 be->dpcm[stream].be_start--;
2187 be->dpcm[stream].state = SND_SOC_DPCM_STATE_START;
2190 if (!be->dpcm[stream].be_start &&
2191 (be->dpcm[stream].state != SND_SOC_DPCM_STATE_START) &&
2192 (be->dpcm[stream].state != SND_SOC_DPCM_STATE_PAUSED))
2195 fe->dpcm[stream].fe_pause = false;
2196 be->dpcm[stream].be_pause--;
2198 be->dpcm[stream].be_start++;
2199 if (be->dpcm[stream].be_start != 1)
2204 be->dpcm[stream].be_start--;
2208 be->dpcm[stream].state = SND_SOC_DPCM_STATE_START;
2211 if ((be->dpcm[stream].state != SND_SOC_DPCM_STATE_START) &&
2212 (be->dpcm[stream].state != SND_SOC_DPCM_STATE_PAUSED))
2215 if (be->dpcm[stream].state == SND_SOC_DPCM_STATE_START)
2216 be->dpcm[stream].be_start--;
2218 if (be->dpcm[stream].be_start != 0)
2222 if (fe->dpcm[stream].fe_pause) {
2224 fe->dpcm[stream].fe_pause = false;
2225 be->dpcm[stream].be_pause--;
2228 if (be->dpcm[stream].be_pause != 0)
2234 if (be->dpcm[stream].state == SND_SOC_DPCM_STATE_START)
2235 be->dpcm[stream].be_start++;
2237 fe->dpcm[stream].fe_pause = true;
2238 be->dpcm[stream].be_pause++;
2243 if (be->dpcm[stream].be_pause != 0)
2244 be->dpcm[stream].state = SND_SOC_DPCM_STATE_PAUSED;
2246 be->dpcm[stream].state = SND_SOC_DPCM_STATE_STOP;
2250 if (be->dpcm[stream].state != SND_SOC_DPCM_STATE_START)
2253 be->dpcm[stream].be_start--;
2254 if (be->dpcm[stream].be_start != 0)
2259 be->dpcm[stream].be_start++;
2263 be->dpcm[stream].state = SND_SOC_DPCM_STATE_SUSPEND;
2266 if (be->dpcm[stream].state != SND_SOC_DPCM_STATE_START)
2269 fe->dpcm[stream].fe_pause = true;
2270 be->dpcm[stream].be_pause++;
2272 be->dpcm[stream].be_start--;
2273 if (be->dpcm[stream].be_start != 0)
2278 be->dpcm[stream].be_start++;
2282 be->dpcm[stream].state = SND_SOC_DPCM_STATE_PAUSED;
2286 snd_soc_dpcm_stream_unlock_irqrestore(be, stream, flags);
2309 ret = dpcm_be_dai_trigger(fe, substream->stream, cmd);
2314 ret = dpcm_be_dai_trigger(fe, substream->stream, cmd);
2329 int stream = substream->stream;
2331 enum snd_soc_dpcm_trigger trigger = fe->dai_link->trigger[stream];
2333 fe->dpcm[stream].runtime_update = SND_SOC_DPCM_UPDATE_FE;
2397 fe->dpcm[stream].state = SND_SOC_DPCM_STATE_START;
2401 fe->dpcm[stream].state = SND_SOC_DPCM_STATE_STOP;
2404 fe->dpcm[stream].state = SND_SOC_DPCM_STATE_PAUSED;
2409 fe->dpcm[stream].runtime_update = SND_SOC_DPCM_UPDATE_NO;
2416 int stream = substream->stream;
2421 if (fe->dpcm[stream].runtime_update != SND_SOC_DPCM_UPDATE_NO) {
2422 fe->dpcm[stream].trigger_pending = cmd + 1;
2430 int dpcm_be_dai_prepare(struct snd_soc_pcm_runtime *fe, int stream)
2435 for_each_dpcm_be(fe, stream, dpcm) {
2439 snd_soc_dpcm_get_substream(be, stream);
2442 if (!snd_soc_dpcm_be_can_update(fe, be, stream))
2445 if (!snd_soc_dpcm_can_be_prepared(fe, be, stream))
2448 if ((be->dpcm[stream].state != SND_SOC_DPCM_STATE_HW_PARAMS) &&
2449 (be->dpcm[stream].state != SND_SOC_DPCM_STATE_STOP) &&
2450 (be->dpcm[stream].state != SND_SOC_DPCM_STATE_SUSPEND) &&
2451 (be->dpcm[stream].state != SND_SOC_DPCM_STATE_PAUSED))
2461 be->dpcm[stream].state = SND_SOC_DPCM_STATE_PREPARE;
2470 int stream = substream->stream, ret = 0;
2476 dpcm_set_fe_update_state(fe, stream, SND_SOC_DPCM_UPDATE_FE);
2479 if (list_empty(&fe->dpcm[stream].be_clients)) {
2489 ret = dpcm_be_dai_prepare(fe, stream);
2498 fe->dpcm[stream].state = SND_SOC_DPCM_STATE_PREPARE;
2501 dpcm_set_fe_update_state(fe, stream, SND_SOC_DPCM_UPDATE_NO);
2507 static int dpcm_run_update_shutdown(struct snd_soc_pcm_runtime *fe, int stream)
2510 snd_soc_dpcm_get_substream(fe, stream);
2511 enum snd_soc_dpcm_trigger trigger = fe->dai_link->trigger[stream];
2515 stream ? "capture" : "playback", fe->dai_link->name);
2527 err = dpcm_be_dai_trigger(fe, stream, SNDRV_PCM_TRIGGER_STOP);
2530 dpcm_be_dai_hw_free(fe, stream);
2532 dpcm_be_dai_shutdown(fe, stream);
2534 /* run the stream event for each BE */
2535 dpcm_dapm_stream_event(fe, stream, SND_SOC_DAPM_STREAM_NOP);
2540 static int dpcm_run_update_startup(struct snd_soc_pcm_runtime *fe, int stream)
2543 snd_soc_dpcm_get_substream(fe, stream);
2545 enum snd_soc_dpcm_trigger trigger = fe->dai_link->trigger[stream];
2549 stream ? "capture" : "playback", fe->dai_link->name);
2552 if (fe->dpcm[stream].state == SND_SOC_DPCM_STATE_HW_FREE ||
2553 fe->dpcm[stream].state == SND_SOC_DPCM_STATE_CLOSE) {
2555 fe->dai_link->name, fe->dpcm[stream].state);
2561 ret = dpcm_be_dai_startup(fe, stream);
2566 if (fe->dpcm[stream].state == SND_SOC_DPCM_STATE_OPEN)
2569 ret = dpcm_be_dai_hw_params(fe, stream);
2574 if (fe->dpcm[stream].state == SND_SOC_DPCM_STATE_HW_PARAMS)
2577 ret = dpcm_be_dai_prepare(fe, stream);
2581 /* run the stream event for each BE */
2582 dpcm_dapm_stream_event(fe, stream, SND_SOC_DAPM_STREAM_NOP);
2585 if (fe->dpcm[stream].state == SND_SOC_DPCM_STATE_PREPARE ||
2586 fe->dpcm[stream].state == SND_SOC_DPCM_STATE_STOP)
2601 ret = dpcm_be_dai_trigger(fe, stream,
2610 dpcm_be_dai_hw_free(fe, stream);
2612 dpcm_be_dai_shutdown(fe, stream);
2615 for_each_dpcm_be(fe, stream, dpcm) {
2619 if (!snd_soc_dpcm_be_can_update(fe, be, stream))
2622 if (be->dpcm[stream].state == SND_SOC_DPCM_STATE_CLOSE ||
2623 be->dpcm[stream].state == SND_SOC_DPCM_STATE_NEW)
2633 int stream;
2653 for_each_pcm_streams(stream) {
2656 if (!snd_soc_dai_stream_valid(asoc_rtd_to_cpu(fe, 0), stream) ||
2657 !snd_soc_dai_stream_valid(asoc_rtd_to_codec(fe, 0), stream))
2661 if (!snd_soc_dai_stream_active(asoc_rtd_to_cpu(fe, 0), stream) ||
2662 !snd_soc_dai_stream_active(asoc_rtd_to_codec(fe, 0), stream))
2665 paths = dpcm_path_get(fe, stream, &list);
2670 count = dpcm_process_paths(fe, stream, &list, new);
2672 dpcm_set_fe_update_state(fe, stream, SND_SOC_DPCM_UPDATE_BE);
2674 dpcm_run_update_startup(fe, stream);
2676 dpcm_run_update_shutdown(fe, stream);
2677 dpcm_set_fe_update_state(fe, stream, SND_SOC_DPCM_UPDATE_NO);
2679 dpcm_clear_pending_state(fe, stream);
2680 dpcm_be_disconnect(fe, stream);
2722 int stream = fe_substream->stream;
2727 for_each_dpcm_be(fe, stream, dpcm)
2730 dpcm_be_disconnect(fe, stream);
2752 int stream = fe_substream->stream;
2756 ret = dpcm_path_get(fe, stream, &list);
2761 dpcm_process_paths(fe, stream, &list, 1);
2767 dpcm_clear_pending_state(fe, stream);
2789 int stream;
2792 stream = SNDRV_PCM_STREAM_PLAYBACK;
2795 if (snd_soc_dai_stream_valid(cpu_dai, stream)) {
2802 "No CPU DAIs support playback for stream %s\n",
2808 stream = SNDRV_PCM_STREAM_CAPTURE;
2811 if (snd_soc_dai_stream_valid(cpu_dai, stream)) {
2819 "No CPU DAIs support capture for stream %s\n",
2827 /* Adapt stream for codec2codec links */
2941 /* DAPM dai link stream work */
3016 int snd_soc_dpcm_fe_can_update(struct snd_soc_pcm_runtime *fe, int stream)
3018 if (fe->dpcm[stream].runtime_update == SND_SOC_DPCM_UPDATE_FE)
3026 struct snd_soc_pcm_runtime *be, int stream)
3028 if ((fe->dpcm[stream].runtime_update == SND_SOC_DPCM_UPDATE_FE) ||
3029 ((fe->dpcm[stream].runtime_update == SND_SOC_DPCM_UPDATE_BE) &&
3030 be->dpcm[stream].runtime_update))
3038 snd_soc_dpcm_get_substream(struct snd_soc_pcm_runtime *be, int stream)
3040 return be->pcm->streams[stream].substream;
3046 int stream,
3055 for_each_dpcm_fe(be, stream, dpcm) {
3060 state = dpcm->fe->dpcm[stream].state;
3075 * are not running, paused or suspended for the specified stream direction.
3078 struct snd_soc_pcm_runtime *be, int stream)
3086 return snd_soc_dpcm_check_state(fe, be, stream, state, ARRAY_SIZE(state));
3092 * running, paused or suspended for the specified stream direction.
3095 struct snd_soc_pcm_runtime *be, int stream)
3104 return snd_soc_dpcm_check_state(fe, be, stream, state, ARRAY_SIZE(state));
3110 * running or paused for the specified stream direction.
3113 struct snd_soc_pcm_runtime *be, int stream)
3121 return snd_soc_dpcm_check_state(fe, be, stream, state, ARRAY_SIZE(state));