Lines Matching refs:dpcm

25 #include <sound/soc-dpcm.h>
113 struct snd_pcm_hw_params *params = &fe->dpcm[stream].hw_params;
114 struct snd_soc_dpcm *dpcm;
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) {
144 struct snd_soc_pcm_runtime *be = dpcm->be;
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))
220 static void dpcm_create_debugfs_state(struct snd_soc_dpcm *dpcm, int stream)
224 name = kasprintf(GFP_KERNEL, "%s:%s", dpcm->be->dai_link->name,
227 dpcm->debugfs_state = debugfs_create_dir(
228 name, dpcm->fe->debugfs_dpcm_root);
229 debugfs_create_u32("state", 0644, dpcm->debugfs_state,
230 &dpcm->state);
235 static void dpcm_remove_debugfs_state(struct snd_soc_dpcm *dpcm)
237 debugfs_remove_recursive(dpcm->debugfs_state);
241 static inline void dpcm_create_debugfs_state(struct snd_soc_dpcm *dpcm,
246 static inline void dpcm_remove_debugfs_state(struct snd_soc_dpcm *dpcm)
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;
276 be->dpcm[stream].runtime_update = state;
358 struct snd_soc_dpcm *dpcm;
362 for_each_dpcm_be(fe, dir, dpcm) {
364 struct snd_soc_pcm_runtime *be = dpcm->be;
370 (be->dpcm[dir].users >= 1))
1245 struct snd_soc_dpcm *dpcm;
1250 for_each_dpcm_be(fe, stream, dpcm) {
1251 if (dpcm->be == be && dpcm->fe == fe)
1268 dpcm = kzalloc(sizeof(struct snd_soc_dpcm), GFP_KERNEL);
1269 if (!dpcm)
1272 dpcm->be = be;
1273 dpcm->fe = fe;
1274 dpcm->state = SND_SOC_DPCM_LINK_STATE_NEW;
1276 list_add(&dpcm->list_be, &fe->dpcm[stream].be_clients);
1277 list_add(&dpcm->list_fe, &be->dpcm[stream].fe_clients);
1284 dpcm_create_debugfs_state(dpcm, stream);
1293 struct snd_soc_dpcm *dpcm;
1297 if (!be->dpcm[stream].users)
1304 for_each_dpcm_fe(be, stream, dpcm) {
1305 if (dpcm->fe == fe)
1310 dpcm->fe->dai_link->name,
1311 stream ? "<-" : "->", dpcm->be->dai_link->name);
1313 fe_substream = snd_soc_dpcm_get_substream(dpcm->fe, stream);
1322 struct snd_soc_dpcm *dpcm, *d;
1328 for_each_dpcm_be_safe(fe, stream, dpcm, d) {
1331 dpcm->be->dai_link->name);
1333 if (dpcm->state != SND_SOC_DPCM_LINK_STATE_FREE)
1338 stream ? "<-" : "->", dpcm->be->dai_link->name);
1341 dpcm_be_reparent(fe, dpcm->be, stream);
1343 list_del(&dpcm->list_be);
1344 list_move(&dpcm->list_fe, &deleted_dpcms);
1349 dpcm = list_first_entry(&deleted_dpcms, struct snd_soc_dpcm,
1351 list_del(&dpcm->list_fe);
1352 dpcm_remove_debugfs_state(dpcm);
1353 kfree(dpcm);
1457 static bool dpcm_be_is_active(struct snd_soc_dpcm *dpcm, int stream,
1464 for_each_rtd_dais(dpcm->be, i, dai) {
1481 struct snd_soc_dpcm *dpcm;
1485 for_each_dpcm_be(fe, stream, dpcm) {
1486 if (dpcm_be_is_active(dpcm, stream, *list_))
1491 dpcm->be->dai_link->name, fe->dai_link->name);
1492 dpcm->state = SND_SOC_DPCM_LINK_STATE_FREE;
1493 dpcm_set_be_update_state(dpcm->be, stream, SND_SOC_DPCM_UPDATE_BE);
1545 (be->dpcm[stream].state != SND_SOC_DPCM_STATE_NEW) &&
1546 (be->dpcm[stream].state != SND_SOC_DPCM_STATE_CLOSE))
1582 struct snd_soc_dpcm *dpcm;
1584 for_each_dpcm_be(fe, stream, dpcm)
1585 dpcm_set_be_update_state(dpcm->be, stream, SND_SOC_DPCM_UPDATE_NO);
1591 struct snd_soc_dpcm *dpcm;
1594 for_each_dpcm_be(fe, stream, dpcm) {
1595 struct snd_soc_pcm_runtime *be = dpcm->be;
1599 if (dpcm == last)
1606 if (be->dpcm[stream].users == 0) {
1609 be->dpcm[stream].state);
1613 if (--be->dpcm[stream].users != 0)
1616 if (be->dpcm[stream].state != SND_SOC_DPCM_STATE_OPEN) {
1620 if (be->dpcm[stream].state != SND_SOC_DPCM_STATE_HW_FREE) {
1622 be->dpcm[stream].state = SND_SOC_DPCM_STATE_HW_FREE;
1628 be->dpcm[stream].state = SND_SOC_DPCM_STATE_CLOSE;
1636 struct snd_soc_dpcm *dpcm;
1640 for_each_dpcm_be(fe, stream, dpcm) {
1643 be = dpcm->be;
1656 /* first time the dpcm is open ? */
1657 if (be->dpcm[stream].users == DPCM_MAX_BE_USERS) {
1660 be->dpcm[stream].state);
1664 if (be->dpcm[stream].users++ != 0)
1667 if ((be->dpcm[stream].state != SND_SOC_DPCM_STATE_NEW) &&
1668 (be->dpcm[stream].state != SND_SOC_DPCM_STATE_CLOSE))
1677 be->dpcm[stream].users--;
1678 if (be->dpcm[stream].users < 0)
1681 be->dpcm[stream].state);
1683 be->dpcm[stream].state = SND_SOC_DPCM_STATE_CLOSE;
1686 be->dpcm[stream].be_start = 0;
1687 be->dpcm[stream].state = SND_SOC_DPCM_STATE_OPEN;
1694 dpcm_be_dai_startup_rollback(fe, stream, dpcm);
1739 struct snd_soc_dpcm *dpcm;
1751 for_each_dpcm_be(fe, stream, dpcm) {
1752 struct snd_soc_pcm_runtime *be = dpcm->be;
1777 struct snd_soc_dpcm *dpcm;
1788 for_each_dpcm_be(fe, stream, dpcm) {
1789 struct snd_soc_pcm_runtime *be = dpcm->be;
1825 struct snd_soc_dpcm *dpcm;
1836 for_each_dpcm_be(fe, stream, dpcm) {
1837 struct snd_soc_pcm_runtime *be = dpcm->be;
1860 struct snd_soc_dpcm *dpcm;
1877 for_each_dpcm_be(fe, stream, dpcm) {
1878 struct snd_soc_pcm_runtime *be = dpcm->be;
1923 fe->dpcm[stream].state = SND_SOC_DPCM_STATE_OPEN;
1962 fe->dpcm[stream].state = SND_SOC_DPCM_STATE_CLOSE;
1969 struct snd_soc_dpcm *dpcm;
1973 for_each_dpcm_be(fe, stream, dpcm) {
1975 struct snd_soc_pcm_runtime *be = dpcm->be;
1988 if (be->dpcm[stream].users > 1)
1991 if ((be->dpcm[stream].state != SND_SOC_DPCM_STATE_HW_PARAMS) &&
1992 (be->dpcm[stream].state != SND_SOC_DPCM_STATE_PREPARE) &&
1993 (be->dpcm[stream].state != SND_SOC_DPCM_STATE_HW_FREE) &&
1994 (be->dpcm[stream].state != SND_SOC_DPCM_STATE_PAUSED) &&
1995 (be->dpcm[stream].state != SND_SOC_DPCM_STATE_STOP) &&
1996 (be->dpcm[stream].state != SND_SOC_DPCM_STATE_SUSPEND))
2004 be->dpcm[stream].state = SND_SOC_DPCM_STATE_HW_FREE;
2025 fe->dpcm[stream].state = SND_SOC_DPCM_STATE_HW_FREE;
2036 struct snd_soc_dpcm *dpcm;
2039 for_each_dpcm_be(fe, stream, dpcm) {
2042 be = dpcm->be;
2049 /* copy params for each dpcm */
2050 memcpy(&hw_params, &fe->dpcm[stream].hw_params,
2059 memcpy(&be->dpcm[stream].hw_params, &hw_params,
2066 if ((be->dpcm[stream].state != SND_SOC_DPCM_STATE_OPEN) &&
2067 (be->dpcm[stream].state != SND_SOC_DPCM_STATE_HW_PARAMS) &&
2068 (be->dpcm[stream].state != SND_SOC_DPCM_STATE_HW_FREE))
2078 be->dpcm[stream].state = SND_SOC_DPCM_STATE_HW_PARAMS;
2087 for_each_dpcm_be_rollback(fe, stream, dpcm) {
2088 be = dpcm->be;
2098 if ((be->dpcm[stream].state != SND_SOC_DPCM_STATE_OPEN) &&
2099 (be->dpcm[stream].state != SND_SOC_DPCM_STATE_HW_PARAMS) &&
2100 (be->dpcm[stream].state != SND_SOC_DPCM_STATE_HW_FREE) &&
2101 (be->dpcm[stream].state != SND_SOC_DPCM_STATE_STOP))
2119 memcpy(&fe->dpcm[stream].hw_params, params,
2134 fe->dpcm[stream].state = SND_SOC_DPCM_STATE_HW_PARAMS;
2148 struct snd_soc_dpcm *dpcm;
2152 for_each_dpcm_be(fe, stream, dpcm) {
2155 be = dpcm->be;
2169 if (!be->dpcm[stream].be_start &&
2170 (be->dpcm[stream].state != SND_SOC_DPCM_STATE_PREPARE) &&
2171 (be->dpcm[stream].state != SND_SOC_DPCM_STATE_STOP) &&
2172 (be->dpcm[stream].state != SND_SOC_DPCM_STATE_PAUSED))
2175 be->dpcm[stream].be_start++;
2176 if (be->dpcm[stream].be_start != 1)
2179 if (be->dpcm[stream].state == SND_SOC_DPCM_STATE_PAUSED)
2186 be->dpcm[stream].be_start--;
2190 be->dpcm[stream].state = SND_SOC_DPCM_STATE_START;
2193 if ((be->dpcm[stream].state != SND_SOC_DPCM_STATE_SUSPEND))
2196 be->dpcm[stream].be_start++;
2197 if (be->dpcm[stream].be_start != 1)
2202 be->dpcm[stream].be_start--;
2206 be->dpcm[stream].state = SND_SOC_DPCM_STATE_START;
2209 if (!be->dpcm[stream].be_start &&
2210 (be->dpcm[stream].state != SND_SOC_DPCM_STATE_START) &&
2211 (be->dpcm[stream].state != SND_SOC_DPCM_STATE_PAUSED))
2214 fe->dpcm[stream].fe_pause = false;
2215 be->dpcm[stream].be_pause--;
2217 be->dpcm[stream].be_start++;
2218 if (be->dpcm[stream].be_start != 1)
2223 be->dpcm[stream].be_start--;
2227 be->dpcm[stream].state = SND_SOC_DPCM_STATE_START;
2230 if ((be->dpcm[stream].state != SND_SOC_DPCM_STATE_START) &&
2231 (be->dpcm[stream].state != SND_SOC_DPCM_STATE_PAUSED))
2234 if (be->dpcm[stream].state == SND_SOC_DPCM_STATE_START)
2235 be->dpcm[stream].be_start--;
2237 if (be->dpcm[stream].be_start != 0)
2241 if (fe->dpcm[stream].fe_pause) {
2243 fe->dpcm[stream].fe_pause = false;
2244 be->dpcm[stream].be_pause--;
2247 if (be->dpcm[stream].be_pause != 0)
2253 if (be->dpcm[stream].state == SND_SOC_DPCM_STATE_START)
2254 be->dpcm[stream].be_start++;
2256 fe->dpcm[stream].fe_pause = true;
2257 be->dpcm[stream].be_pause++;
2262 if (be->dpcm[stream].be_pause != 0)
2263 be->dpcm[stream].state = SND_SOC_DPCM_STATE_PAUSED;
2265 be->dpcm[stream].state = SND_SOC_DPCM_STATE_STOP;
2269 if (be->dpcm[stream].state != SND_SOC_DPCM_STATE_START)
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_SUSPEND;
2285 if (be->dpcm[stream].state != SND_SOC_DPCM_STATE_START)
2288 fe->dpcm[stream].fe_pause = true;
2289 be->dpcm[stream].be_pause++;
2291 be->dpcm[stream].be_start--;
2292 if (be->dpcm[stream].be_start != 0)
2297 be->dpcm[stream].be_start++;
2301 be->dpcm[stream].state = SND_SOC_DPCM_STATE_PAUSED;
2352 fe->dpcm[stream].runtime_update = SND_SOC_DPCM_UPDATE_FE;
2416 fe->dpcm[stream].state = SND_SOC_DPCM_STATE_START;
2420 fe->dpcm[stream].state = SND_SOC_DPCM_STATE_STOP;
2423 fe->dpcm[stream].state = SND_SOC_DPCM_STATE_PAUSED;
2428 fe->dpcm[stream].runtime_update = SND_SOC_DPCM_UPDATE_NO;
2440 if (fe->dpcm[stream].runtime_update != SND_SOC_DPCM_UPDATE_NO) {
2441 fe->dpcm[stream].trigger_pending = cmd + 1;
2451 struct snd_soc_dpcm *dpcm;
2454 for_each_dpcm_be(fe, stream, dpcm) {
2456 struct snd_soc_pcm_runtime *be = dpcm->be;
2467 if ((be->dpcm[stream].state != SND_SOC_DPCM_STATE_HW_PARAMS) &&
2468 (be->dpcm[stream].state != SND_SOC_DPCM_STATE_STOP) &&
2469 (be->dpcm[stream].state != SND_SOC_DPCM_STATE_SUSPEND) &&
2470 (be->dpcm[stream].state != SND_SOC_DPCM_STATE_PAUSED))
2480 be->dpcm[stream].state = SND_SOC_DPCM_STATE_PREPARE;
2498 if (list_empty(&fe->dpcm[stream].be_clients)) {
2517 fe->dpcm[stream].state = SND_SOC_DPCM_STATE_PREPARE;
2563 struct snd_soc_dpcm *dpcm;
2571 if (fe->dpcm[stream].state == SND_SOC_DPCM_STATE_HW_FREE ||
2572 fe->dpcm[stream].state == SND_SOC_DPCM_STATE_CLOSE) {
2574 fe->dai_link->name, fe->dpcm[stream].state);
2585 if (fe->dpcm[stream].state == SND_SOC_DPCM_STATE_OPEN)
2593 if (fe->dpcm[stream].state == SND_SOC_DPCM_STATE_HW_PARAMS)
2604 if (fe->dpcm[stream].state == SND_SOC_DPCM_STATE_PREPARE ||
2605 fe->dpcm[stream].state == SND_SOC_DPCM_STATE_STOP)
2634 for_each_dpcm_be(fe, stream, dpcm) {
2635 struct snd_soc_pcm_runtime *be = dpcm->be;
2641 if (be->dpcm[stream].state == SND_SOC_DPCM_STATE_CLOSE ||
2642 be->dpcm[stream].state == SND_SOC_DPCM_STATE_NEW)
2643 dpcm->state = SND_SOC_DPCM_LINK_STATE_FREE;
2740 struct snd_soc_dpcm *dpcm;
2746 for_each_dpcm_be(fe, stream, dpcm)
2747 dpcm->state = SND_SOC_DPCM_LINK_STATE_FREE;
3022 if (fe->dpcm[stream].runtime_update == SND_SOC_DPCM_UPDATE_FE)
3032 if ((fe->dpcm[stream].runtime_update == SND_SOC_DPCM_UPDATE_FE) ||
3033 ((fe->dpcm[stream].runtime_update == SND_SOC_DPCM_UPDATE_BE) &&
3034 be->dpcm[stream].runtime_update))
3054 struct snd_soc_dpcm *dpcm;
3059 for_each_dpcm_fe(be, stream, dpcm) {
3061 if (dpcm->fe == fe)
3064 state = dpcm->fe->dpcm[stream].state;