xref: /linux/sound/soc/soc-pcm.c (revision f49f4ab95c301dbccad0efe85296d908b8ae7ad4)
1 /*
2  * soc-pcm.c  --  ALSA SoC PCM
3  *
4  * Copyright 2005 Wolfson Microelectronics PLC.
5  * Copyright 2005 Openedhand Ltd.
6  * Copyright (C) 2010 Slimlogic Ltd.
7  * Copyright (C) 2010 Texas Instruments Inc.
8  *
9  * Authors: Liam Girdwood <lrg@ti.com>
10  *          Mark Brown <broonie@opensource.wolfsonmicro.com>
11  *
12  *  This program is free software; you can redistribute  it and/or modify it
13  *  under  the terms of  the GNU General  Public License as published by the
14  *  Free Software Foundation;  either version 2 of the  License, or (at your
15  *  option) any later version.
16  *
17  */
18 
19 #include <linux/kernel.h>
20 #include <linux/init.h>
21 #include <linux/delay.h>
22 #include <linux/pm_runtime.h>
23 #include <linux/slab.h>
24 #include <linux/workqueue.h>
25 #include <linux/export.h>
26 #include <linux/debugfs.h>
27 #include <sound/core.h>
28 #include <sound/pcm.h>
29 #include <sound/pcm_params.h>
30 #include <sound/soc.h>
31 #include <sound/soc-dpcm.h>
32 #include <sound/initval.h>
33 
34 #define DPCM_MAX_BE_USERS	8
35 
36 /* DPCM stream event, send event to FE and all active BEs. */
37 static int dpcm_dapm_stream_event(struct snd_soc_pcm_runtime *fe, int dir,
38 	int event)
39 {
40 	struct snd_soc_dpcm *dpcm;
41 
42 	list_for_each_entry(dpcm, &fe->dpcm[dir].be_clients, list_be) {
43 
44 		struct snd_soc_pcm_runtime *be = dpcm->be;
45 
46 		dev_dbg(be->dev, "pm: BE %s event %d dir %d\n",
47 				be->dai_link->name, event, dir);
48 
49 		snd_soc_dapm_stream_event(be, dir, event);
50 	}
51 
52 	snd_soc_dapm_stream_event(fe, dir, event);
53 
54 	return 0;
55 }
56 
57 static int soc_pcm_apply_symmetry(struct snd_pcm_substream *substream,
58 					struct snd_soc_dai *soc_dai)
59 {
60 	struct snd_soc_pcm_runtime *rtd = substream->private_data;
61 	int ret;
62 
63 	if (!soc_dai->driver->symmetric_rates &&
64 	    !rtd->dai_link->symmetric_rates)
65 		return 0;
66 
67 	/* This can happen if multiple streams are starting simultaneously -
68 	 * the second can need to get its constraints before the first has
69 	 * picked a rate.  Complain and allow the application to carry on.
70 	 */
71 	if (!soc_dai->rate) {
72 		dev_warn(soc_dai->dev,
73 			 "Not enforcing symmetric_rates due to race\n");
74 		return 0;
75 	}
76 
77 	dev_dbg(soc_dai->dev, "Symmetry forces %dHz rate\n", soc_dai->rate);
78 
79 	ret = snd_pcm_hw_constraint_minmax(substream->runtime,
80 					   SNDRV_PCM_HW_PARAM_RATE,
81 					   soc_dai->rate, soc_dai->rate);
82 	if (ret < 0) {
83 		dev_err(soc_dai->dev,
84 			"Unable to apply rate symmetry constraint: %d\n", ret);
85 		return ret;
86 	}
87 
88 	return 0;
89 }
90 
91 /*
92  * List of sample sizes that might go over the bus for parameter
93  * application.  There ought to be a wildcard sample size for things
94  * like the DAC/ADC resolution to use but there isn't right now.
95  */
96 static int sample_sizes[] = {
97 	24, 32,
98 };
99 
100 static void soc_pcm_apply_msb(struct snd_pcm_substream *substream,
101 			      struct snd_soc_dai *dai)
102 {
103 	int ret, i, bits;
104 
105 	if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
106 		bits = dai->driver->playback.sig_bits;
107 	else
108 		bits = dai->driver->capture.sig_bits;
109 
110 	if (!bits)
111 		return;
112 
113 	for (i = 0; i < ARRAY_SIZE(sample_sizes); i++) {
114 		if (bits >= sample_sizes[i])
115 			continue;
116 
117 		ret = snd_pcm_hw_constraint_msbits(substream->runtime, 0,
118 						   sample_sizes[i], bits);
119 		if (ret != 0)
120 			dev_warn(dai->dev,
121 				 "Failed to set MSB %d/%d: %d\n",
122 				 bits, sample_sizes[i], ret);
123 	}
124 }
125 
126 /*
127  * Called by ALSA when a PCM substream is opened, the runtime->hw record is
128  * then initialized and any private data can be allocated. This also calls
129  * startup for the cpu DAI, platform, machine and codec DAI.
130  */
131 static int soc_pcm_open(struct snd_pcm_substream *substream)
132 {
133 	struct snd_soc_pcm_runtime *rtd = substream->private_data;
134 	struct snd_pcm_runtime *runtime = substream->runtime;
135 	struct snd_soc_platform *platform = rtd->platform;
136 	struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
137 	struct snd_soc_dai *codec_dai = rtd->codec_dai;
138 	struct snd_soc_dai_driver *cpu_dai_drv = cpu_dai->driver;
139 	struct snd_soc_dai_driver *codec_dai_drv = codec_dai->driver;
140 	int ret = 0;
141 
142 	pm_runtime_get_sync(cpu_dai->dev);
143 	pm_runtime_get_sync(codec_dai->dev);
144 	pm_runtime_get_sync(platform->dev);
145 
146 	mutex_lock_nested(&rtd->pcm_mutex, rtd->pcm_subclass);
147 
148 	/* startup the audio subsystem */
149 	if (cpu_dai->driver->ops->startup) {
150 		ret = cpu_dai->driver->ops->startup(substream, cpu_dai);
151 		if (ret < 0) {
152 			dev_err(cpu_dai->dev, "can't open interface %s: %d\n",
153 				cpu_dai->name, ret);
154 			goto out;
155 		}
156 	}
157 
158 	if (platform->driver->ops && platform->driver->ops->open) {
159 		ret = platform->driver->ops->open(substream);
160 		if (ret < 0) {
161 			dev_err(platform->dev, "can't open platform %s: %d\n",
162 				platform->name, ret);
163 			goto platform_err;
164 		}
165 	}
166 
167 	if (codec_dai->driver->ops->startup) {
168 		ret = codec_dai->driver->ops->startup(substream, codec_dai);
169 		if (ret < 0) {
170 			dev_err(codec_dai->dev, "can't open codec %s: %d\n",
171 				codec_dai->name, ret);
172 			goto codec_dai_err;
173 		}
174 	}
175 
176 	if (rtd->dai_link->ops && rtd->dai_link->ops->startup) {
177 		ret = rtd->dai_link->ops->startup(substream);
178 		if (ret < 0) {
179 			pr_err("asoc: %s startup failed: %d\n",
180 			       rtd->dai_link->name, ret);
181 			goto machine_err;
182 		}
183 	}
184 
185 	/* Dynamic PCM DAI links compat checks use dynamic capabilities */
186 	if (rtd->dai_link->dynamic || rtd->dai_link->no_pcm)
187 		goto dynamic;
188 
189 	/* Check that the codec and cpu DAIs are compatible */
190 	if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
191 		runtime->hw.rate_min =
192 			max(codec_dai_drv->playback.rate_min,
193 			    cpu_dai_drv->playback.rate_min);
194 		runtime->hw.rate_max =
195 			min(codec_dai_drv->playback.rate_max,
196 			    cpu_dai_drv->playback.rate_max);
197 		runtime->hw.channels_min =
198 			max(codec_dai_drv->playback.channels_min,
199 				cpu_dai_drv->playback.channels_min);
200 		runtime->hw.channels_max =
201 			min(codec_dai_drv->playback.channels_max,
202 				cpu_dai_drv->playback.channels_max);
203 		runtime->hw.formats =
204 			codec_dai_drv->playback.formats & cpu_dai_drv->playback.formats;
205 		runtime->hw.rates =
206 			codec_dai_drv->playback.rates & cpu_dai_drv->playback.rates;
207 		if (codec_dai_drv->playback.rates
208 			   & (SNDRV_PCM_RATE_KNOT | SNDRV_PCM_RATE_CONTINUOUS))
209 			runtime->hw.rates |= cpu_dai_drv->playback.rates;
210 		if (cpu_dai_drv->playback.rates
211 			   & (SNDRV_PCM_RATE_KNOT | SNDRV_PCM_RATE_CONTINUOUS))
212 			runtime->hw.rates |= codec_dai_drv->playback.rates;
213 	} else {
214 		runtime->hw.rate_min =
215 			max(codec_dai_drv->capture.rate_min,
216 			    cpu_dai_drv->capture.rate_min);
217 		runtime->hw.rate_max =
218 			min(codec_dai_drv->capture.rate_max,
219 			    cpu_dai_drv->capture.rate_max);
220 		runtime->hw.channels_min =
221 			max(codec_dai_drv->capture.channels_min,
222 				cpu_dai_drv->capture.channels_min);
223 		runtime->hw.channels_max =
224 			min(codec_dai_drv->capture.channels_max,
225 				cpu_dai_drv->capture.channels_max);
226 		runtime->hw.formats =
227 			codec_dai_drv->capture.formats & cpu_dai_drv->capture.formats;
228 		runtime->hw.rates =
229 			codec_dai_drv->capture.rates & cpu_dai_drv->capture.rates;
230 		if (codec_dai_drv->capture.rates
231 			   & (SNDRV_PCM_RATE_KNOT | SNDRV_PCM_RATE_CONTINUOUS))
232 			runtime->hw.rates |= cpu_dai_drv->capture.rates;
233 		if (cpu_dai_drv->capture.rates
234 			   & (SNDRV_PCM_RATE_KNOT | SNDRV_PCM_RATE_CONTINUOUS))
235 			runtime->hw.rates |= codec_dai_drv->capture.rates;
236 	}
237 
238 	ret = -EINVAL;
239 	snd_pcm_limit_hw_rates(runtime);
240 	if (!runtime->hw.rates) {
241 		printk(KERN_ERR "asoc: %s <-> %s No matching rates\n",
242 			codec_dai->name, cpu_dai->name);
243 		goto config_err;
244 	}
245 	if (!runtime->hw.formats) {
246 		printk(KERN_ERR "asoc: %s <-> %s No matching formats\n",
247 			codec_dai->name, cpu_dai->name);
248 		goto config_err;
249 	}
250 	if (!runtime->hw.channels_min || !runtime->hw.channels_max ||
251 	    runtime->hw.channels_min > runtime->hw.channels_max) {
252 		printk(KERN_ERR "asoc: %s <-> %s No matching channels\n",
253 				codec_dai->name, cpu_dai->name);
254 		goto config_err;
255 	}
256 
257 	soc_pcm_apply_msb(substream, codec_dai);
258 	soc_pcm_apply_msb(substream, cpu_dai);
259 
260 	/* Symmetry only applies if we've already got an active stream. */
261 	if (cpu_dai->active) {
262 		ret = soc_pcm_apply_symmetry(substream, cpu_dai);
263 		if (ret != 0)
264 			goto config_err;
265 	}
266 
267 	if (codec_dai->active) {
268 		ret = soc_pcm_apply_symmetry(substream, codec_dai);
269 		if (ret != 0)
270 			goto config_err;
271 	}
272 
273 	pr_debug("asoc: %s <-> %s info:\n",
274 			codec_dai->name, cpu_dai->name);
275 	pr_debug("asoc: rate mask 0x%x\n", runtime->hw.rates);
276 	pr_debug("asoc: min ch %d max ch %d\n", runtime->hw.channels_min,
277 		 runtime->hw.channels_max);
278 	pr_debug("asoc: min rate %d max rate %d\n", runtime->hw.rate_min,
279 		 runtime->hw.rate_max);
280 
281 dynamic:
282 	if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
283 		cpu_dai->playback_active++;
284 		codec_dai->playback_active++;
285 	} else {
286 		cpu_dai->capture_active++;
287 		codec_dai->capture_active++;
288 	}
289 	cpu_dai->active++;
290 	codec_dai->active++;
291 	rtd->codec->active++;
292 	mutex_unlock(&rtd->pcm_mutex);
293 	return 0;
294 
295 config_err:
296 	if (rtd->dai_link->ops && rtd->dai_link->ops->shutdown)
297 		rtd->dai_link->ops->shutdown(substream);
298 
299 machine_err:
300 	if (codec_dai->driver->ops->shutdown)
301 		codec_dai->driver->ops->shutdown(substream, codec_dai);
302 
303 codec_dai_err:
304 	if (platform->driver->ops && platform->driver->ops->close)
305 		platform->driver->ops->close(substream);
306 
307 platform_err:
308 	if (cpu_dai->driver->ops->shutdown)
309 		cpu_dai->driver->ops->shutdown(substream, cpu_dai);
310 out:
311 	mutex_unlock(&rtd->pcm_mutex);
312 
313 	pm_runtime_put(platform->dev);
314 	pm_runtime_put(codec_dai->dev);
315 	pm_runtime_put(cpu_dai->dev);
316 
317 	return ret;
318 }
319 
320 /*
321  * Power down the audio subsystem pmdown_time msecs after close is called.
322  * This is to ensure there are no pops or clicks in between any music tracks
323  * due to DAPM power cycling.
324  */
325 static void close_delayed_work(struct work_struct *work)
326 {
327 	struct snd_soc_pcm_runtime *rtd =
328 			container_of(work, struct snd_soc_pcm_runtime, delayed_work.work);
329 	struct snd_soc_dai *codec_dai = rtd->codec_dai;
330 
331 	mutex_lock_nested(&rtd->pcm_mutex, rtd->pcm_subclass);
332 
333 	pr_debug("pop wq checking: %s status: %s waiting: %s\n",
334 		 codec_dai->driver->playback.stream_name,
335 		 codec_dai->playback_active ? "active" : "inactive",
336 		 codec_dai->pop_wait ? "yes" : "no");
337 
338 	/* are we waiting on this codec DAI stream */
339 	if (codec_dai->pop_wait == 1) {
340 		codec_dai->pop_wait = 0;
341 		snd_soc_dapm_stream_event(rtd, SNDRV_PCM_STREAM_PLAYBACK,
342 					  SND_SOC_DAPM_STREAM_STOP);
343 	}
344 
345 	mutex_unlock(&rtd->pcm_mutex);
346 }
347 
348 /*
349  * Called by ALSA when a PCM substream is closed. Private data can be
350  * freed here. The cpu DAI, codec DAI, machine and platform are also
351  * shutdown.
352  */
353 static int soc_pcm_close(struct snd_pcm_substream *substream)
354 {
355 	struct snd_soc_pcm_runtime *rtd = substream->private_data;
356 	struct snd_soc_platform *platform = rtd->platform;
357 	struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
358 	struct snd_soc_dai *codec_dai = rtd->codec_dai;
359 	struct snd_soc_codec *codec = rtd->codec;
360 
361 	mutex_lock_nested(&rtd->pcm_mutex, rtd->pcm_subclass);
362 
363 	if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
364 		cpu_dai->playback_active--;
365 		codec_dai->playback_active--;
366 	} else {
367 		cpu_dai->capture_active--;
368 		codec_dai->capture_active--;
369 	}
370 
371 	cpu_dai->active--;
372 	codec_dai->active--;
373 	codec->active--;
374 
375 	/* clear the corresponding DAIs rate when inactive */
376 	if (!cpu_dai->active)
377 		cpu_dai->rate = 0;
378 
379 	if (!codec_dai->active)
380 		codec_dai->rate = 0;
381 
382 	/* Muting the DAC suppresses artifacts caused during digital
383 	 * shutdown, for example from stopping clocks.
384 	 */
385 	if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
386 		snd_soc_dai_digital_mute(codec_dai, 1);
387 
388 	if (cpu_dai->driver->ops->shutdown)
389 		cpu_dai->driver->ops->shutdown(substream, cpu_dai);
390 
391 	if (codec_dai->driver->ops->shutdown)
392 		codec_dai->driver->ops->shutdown(substream, codec_dai);
393 
394 	if (rtd->dai_link->ops && rtd->dai_link->ops->shutdown)
395 		rtd->dai_link->ops->shutdown(substream);
396 
397 	if (platform->driver->ops && platform->driver->ops->close)
398 		platform->driver->ops->close(substream);
399 	cpu_dai->runtime = NULL;
400 
401 	if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
402 		if (!rtd->pmdown_time || codec->ignore_pmdown_time ||
403 		    rtd->dai_link->ignore_pmdown_time) {
404 			/* powered down playback stream now */
405 			snd_soc_dapm_stream_event(rtd,
406 						  SNDRV_PCM_STREAM_PLAYBACK,
407 						  SND_SOC_DAPM_STREAM_STOP);
408 		} else {
409 			/* start delayed pop wq here for playback streams */
410 			codec_dai->pop_wait = 1;
411 			schedule_delayed_work(&rtd->delayed_work,
412 				msecs_to_jiffies(rtd->pmdown_time));
413 		}
414 	} else {
415 		/* capture streams can be powered down now */
416 		snd_soc_dapm_stream_event(rtd, SNDRV_PCM_STREAM_CAPTURE,
417 					  SND_SOC_DAPM_STREAM_STOP);
418 	}
419 
420 	mutex_unlock(&rtd->pcm_mutex);
421 
422 	pm_runtime_put(platform->dev);
423 	pm_runtime_put(codec_dai->dev);
424 	pm_runtime_put(cpu_dai->dev);
425 
426 	return 0;
427 }
428 
429 /*
430  * Called by ALSA when the PCM substream is prepared, can set format, sample
431  * rate, etc.  This function is non atomic and can be called multiple times,
432  * it can refer to the runtime info.
433  */
434 static int soc_pcm_prepare(struct snd_pcm_substream *substream)
435 {
436 	struct snd_soc_pcm_runtime *rtd = substream->private_data;
437 	struct snd_soc_platform *platform = rtd->platform;
438 	struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
439 	struct snd_soc_dai *codec_dai = rtd->codec_dai;
440 	int ret = 0;
441 
442 	mutex_lock_nested(&rtd->pcm_mutex, rtd->pcm_subclass);
443 
444 	if (rtd->dai_link->ops && rtd->dai_link->ops->prepare) {
445 		ret = rtd->dai_link->ops->prepare(substream);
446 		if (ret < 0) {
447 			pr_err("asoc: machine prepare error: %d\n", ret);
448 			goto out;
449 		}
450 	}
451 
452 	if (platform->driver->ops && platform->driver->ops->prepare) {
453 		ret = platform->driver->ops->prepare(substream);
454 		if (ret < 0) {
455 			dev_err(platform->dev, "platform prepare error: %d\n",
456 				ret);
457 			goto out;
458 		}
459 	}
460 
461 	if (codec_dai->driver->ops->prepare) {
462 		ret = codec_dai->driver->ops->prepare(substream, codec_dai);
463 		if (ret < 0) {
464 			dev_err(codec_dai->dev, "DAI prepare error: %d\n",
465 				ret);
466 			goto out;
467 		}
468 	}
469 
470 	if (cpu_dai->driver->ops->prepare) {
471 		ret = cpu_dai->driver->ops->prepare(substream, cpu_dai);
472 		if (ret < 0) {
473 			dev_err(cpu_dai->dev, "DAI prepare error: %d\n",
474 				ret);
475 			goto out;
476 		}
477 	}
478 
479 	/* cancel any delayed stream shutdown that is pending */
480 	if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK &&
481 	    codec_dai->pop_wait) {
482 		codec_dai->pop_wait = 0;
483 		cancel_delayed_work(&rtd->delayed_work);
484 	}
485 
486 	snd_soc_dapm_stream_event(rtd, substream->stream,
487 			SND_SOC_DAPM_STREAM_START);
488 
489 	snd_soc_dai_digital_mute(codec_dai, 0);
490 
491 out:
492 	mutex_unlock(&rtd->pcm_mutex);
493 	return ret;
494 }
495 
496 /*
497  * Called by ALSA when the hardware params are set by application. This
498  * function can also be called multiple times and can allocate buffers
499  * (using snd_pcm_lib_* ). It's non-atomic.
500  */
501 static int soc_pcm_hw_params(struct snd_pcm_substream *substream,
502 				struct snd_pcm_hw_params *params)
503 {
504 	struct snd_soc_pcm_runtime *rtd = substream->private_data;
505 	struct snd_soc_platform *platform = rtd->platform;
506 	struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
507 	struct snd_soc_dai *codec_dai = rtd->codec_dai;
508 	int ret = 0;
509 
510 	mutex_lock_nested(&rtd->pcm_mutex, rtd->pcm_subclass);
511 
512 	if (rtd->dai_link->ops && rtd->dai_link->ops->hw_params) {
513 		ret = rtd->dai_link->ops->hw_params(substream, params);
514 		if (ret < 0) {
515 			pr_err("asoc: machine hw_params failed: %d\n", ret);
516 			goto out;
517 		}
518 	}
519 
520 	if (codec_dai->driver->ops->hw_params) {
521 		ret = codec_dai->driver->ops->hw_params(substream, params, codec_dai);
522 		if (ret < 0) {
523 			dev_err(codec_dai->dev, "can't set %s hw params: %d\n",
524 				codec_dai->name, ret);
525 			goto codec_err;
526 		}
527 	}
528 
529 	if (cpu_dai->driver->ops->hw_params) {
530 		ret = cpu_dai->driver->ops->hw_params(substream, params, cpu_dai);
531 		if (ret < 0) {
532 			dev_err(cpu_dai->dev, "%s hw params failed: %d\n",
533 				cpu_dai->name, ret);
534 			goto interface_err;
535 		}
536 	}
537 
538 	if (platform->driver->ops && platform->driver->ops->hw_params) {
539 		ret = platform->driver->ops->hw_params(substream, params);
540 		if (ret < 0) {
541 			dev_err(platform->dev, "%s hw params failed: %d\n",
542 			       platform->name, ret);
543 			goto platform_err;
544 		}
545 	}
546 
547 	/* store the rate for each DAIs */
548 	cpu_dai->rate = params_rate(params);
549 	codec_dai->rate = params_rate(params);
550 
551 out:
552 	mutex_unlock(&rtd->pcm_mutex);
553 	return ret;
554 
555 platform_err:
556 	if (cpu_dai->driver->ops->hw_free)
557 		cpu_dai->driver->ops->hw_free(substream, cpu_dai);
558 
559 interface_err:
560 	if (codec_dai->driver->ops->hw_free)
561 		codec_dai->driver->ops->hw_free(substream, codec_dai);
562 
563 codec_err:
564 	if (rtd->dai_link->ops && rtd->dai_link->ops->hw_free)
565 		rtd->dai_link->ops->hw_free(substream);
566 
567 	mutex_unlock(&rtd->pcm_mutex);
568 	return ret;
569 }
570 
571 /*
572  * Frees resources allocated by hw_params, can be called multiple times
573  */
574 static int soc_pcm_hw_free(struct snd_pcm_substream *substream)
575 {
576 	struct snd_soc_pcm_runtime *rtd = substream->private_data;
577 	struct snd_soc_platform *platform = rtd->platform;
578 	struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
579 	struct snd_soc_dai *codec_dai = rtd->codec_dai;
580 	struct snd_soc_codec *codec = rtd->codec;
581 
582 	mutex_lock_nested(&rtd->pcm_mutex, rtd->pcm_subclass);
583 
584 	/* apply codec digital mute */
585 	if (!codec->active)
586 		snd_soc_dai_digital_mute(codec_dai, 1);
587 
588 	/* free any machine hw params */
589 	if (rtd->dai_link->ops && rtd->dai_link->ops->hw_free)
590 		rtd->dai_link->ops->hw_free(substream);
591 
592 	/* free any DMA resources */
593 	if (platform->driver->ops && platform->driver->ops->hw_free)
594 		platform->driver->ops->hw_free(substream);
595 
596 	/* now free hw params for the DAIs  */
597 	if (codec_dai->driver->ops->hw_free)
598 		codec_dai->driver->ops->hw_free(substream, codec_dai);
599 
600 	if (cpu_dai->driver->ops->hw_free)
601 		cpu_dai->driver->ops->hw_free(substream, cpu_dai);
602 
603 	mutex_unlock(&rtd->pcm_mutex);
604 	return 0;
605 }
606 
607 static int soc_pcm_trigger(struct snd_pcm_substream *substream, int cmd)
608 {
609 	struct snd_soc_pcm_runtime *rtd = substream->private_data;
610 	struct snd_soc_platform *platform = rtd->platform;
611 	struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
612 	struct snd_soc_dai *codec_dai = rtd->codec_dai;
613 	int ret;
614 
615 	if (codec_dai->driver->ops->trigger) {
616 		ret = codec_dai->driver->ops->trigger(substream, cmd, codec_dai);
617 		if (ret < 0)
618 			return ret;
619 	}
620 
621 	if (platform->driver->ops && platform->driver->ops->trigger) {
622 		ret = platform->driver->ops->trigger(substream, cmd);
623 		if (ret < 0)
624 			return ret;
625 	}
626 
627 	if (cpu_dai->driver->ops->trigger) {
628 		ret = cpu_dai->driver->ops->trigger(substream, cmd, cpu_dai);
629 		if (ret < 0)
630 			return ret;
631 	}
632 	return 0;
633 }
634 
635 static int soc_pcm_bespoke_trigger(struct snd_pcm_substream *substream,
636 				   int cmd)
637 {
638 	struct snd_soc_pcm_runtime *rtd = substream->private_data;
639 	struct snd_soc_platform *platform = rtd->platform;
640 	struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
641 	struct snd_soc_dai *codec_dai = rtd->codec_dai;
642 	int ret;
643 
644 	if (codec_dai->driver->ops->bespoke_trigger) {
645 		ret = codec_dai->driver->ops->bespoke_trigger(substream, cmd, codec_dai);
646 		if (ret < 0)
647 			return ret;
648 	}
649 
650 	if (platform->driver->bespoke_trigger) {
651 		ret = platform->driver->bespoke_trigger(substream, cmd);
652 		if (ret < 0)
653 			return ret;
654 	}
655 
656 	if (cpu_dai->driver->ops->bespoke_trigger) {
657 		ret = cpu_dai->driver->ops->bespoke_trigger(substream, cmd, cpu_dai);
658 		if (ret < 0)
659 			return ret;
660 	}
661 	return 0;
662 }
663 /*
664  * soc level wrapper for pointer callback
665  * If cpu_dai, codec_dai, platform driver has the delay callback, than
666  * the runtime->delay will be updated accordingly.
667  */
668 static snd_pcm_uframes_t soc_pcm_pointer(struct snd_pcm_substream *substream)
669 {
670 	struct snd_soc_pcm_runtime *rtd = substream->private_data;
671 	struct snd_soc_platform *platform = rtd->platform;
672 	struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
673 	struct snd_soc_dai *codec_dai = rtd->codec_dai;
674 	struct snd_pcm_runtime *runtime = substream->runtime;
675 	snd_pcm_uframes_t offset = 0;
676 	snd_pcm_sframes_t delay = 0;
677 
678 	if (platform->driver->ops && platform->driver->ops->pointer)
679 		offset = platform->driver->ops->pointer(substream);
680 
681 	if (cpu_dai->driver->ops->delay)
682 		delay += cpu_dai->driver->ops->delay(substream, cpu_dai);
683 
684 	if (codec_dai->driver->ops->delay)
685 		delay += codec_dai->driver->ops->delay(substream, codec_dai);
686 
687 	if (platform->driver->delay)
688 		delay += platform->driver->delay(substream, codec_dai);
689 
690 	runtime->delay = delay;
691 
692 	return offset;
693 }
694 
695 /* connect a FE and BE */
696 static int dpcm_be_connect(struct snd_soc_pcm_runtime *fe,
697 		struct snd_soc_pcm_runtime *be, int stream)
698 {
699 	struct snd_soc_dpcm *dpcm;
700 
701 	/* only add new dpcms */
702 	list_for_each_entry(dpcm, &fe->dpcm[stream].be_clients, list_be) {
703 		if (dpcm->be == be && dpcm->fe == fe)
704 			return 0;
705 	}
706 
707 	dpcm = kzalloc(sizeof(struct snd_soc_dpcm), GFP_KERNEL);
708 	if (!dpcm)
709 		return -ENOMEM;
710 
711 	dpcm->be = be;
712 	dpcm->fe = fe;
713 	be->dpcm[stream].runtime = fe->dpcm[stream].runtime;
714 	dpcm->state = SND_SOC_DPCM_LINK_STATE_NEW;
715 	list_add(&dpcm->list_be, &fe->dpcm[stream].be_clients);
716 	list_add(&dpcm->list_fe, &be->dpcm[stream].fe_clients);
717 
718 	dev_dbg(fe->dev, "  connected new DPCM %s path %s %s %s\n",
719 			stream ? "capture" : "playback",  fe->dai_link->name,
720 			stream ? "<-" : "->", be->dai_link->name);
721 
722 #ifdef CONFIG_DEBUG_FS
723 	dpcm->debugfs_state = debugfs_create_u32(be->dai_link->name, 0644,
724 			fe->debugfs_dpcm_root, &dpcm->state);
725 #endif
726 	return 1;
727 }
728 
729 /* reparent a BE onto another FE */
730 static void dpcm_be_reparent(struct snd_soc_pcm_runtime *fe,
731 			struct snd_soc_pcm_runtime *be, int stream)
732 {
733 	struct snd_soc_dpcm *dpcm;
734 	struct snd_pcm_substream *fe_substream, *be_substream;
735 
736 	/* reparent if BE is connected to other FEs */
737 	if (!be->dpcm[stream].users)
738 		return;
739 
740 	be_substream = snd_soc_dpcm_get_substream(be, stream);
741 
742 	list_for_each_entry(dpcm, &be->dpcm[stream].fe_clients, list_fe) {
743 		if (dpcm->fe == fe)
744 			continue;
745 
746 		dev_dbg(fe->dev, "  reparent %s path %s %s %s\n",
747 			stream ? "capture" : "playback",
748 			dpcm->fe->dai_link->name,
749 			stream ? "<-" : "->", dpcm->be->dai_link->name);
750 
751 		fe_substream = snd_soc_dpcm_get_substream(dpcm->fe, stream);
752 		be_substream->runtime = fe_substream->runtime;
753 		break;
754 	}
755 }
756 
757 /* disconnect a BE and FE */
758 static void dpcm_be_disconnect(struct snd_soc_pcm_runtime *fe, int stream)
759 {
760 	struct snd_soc_dpcm *dpcm, *d;
761 
762 	list_for_each_entry_safe(dpcm, d, &fe->dpcm[stream].be_clients, list_be) {
763 		dev_dbg(fe->dev, "BE %s disconnect check for %s\n",
764 				stream ? "capture" : "playback",
765 				dpcm->be->dai_link->name);
766 
767 		if (dpcm->state != SND_SOC_DPCM_LINK_STATE_FREE)
768 			continue;
769 
770 		dev_dbg(fe->dev, "  freed DSP %s path %s %s %s\n",
771 			stream ? "capture" : "playback", fe->dai_link->name,
772 			stream ? "<-" : "->", dpcm->be->dai_link->name);
773 
774 		/* BEs still alive need new FE */
775 		dpcm_be_reparent(fe, dpcm->be, stream);
776 
777 #ifdef CONFIG_DEBUG_FS
778 		debugfs_remove(dpcm->debugfs_state);
779 #endif
780 		list_del(&dpcm->list_be);
781 		list_del(&dpcm->list_fe);
782 		kfree(dpcm);
783 	}
784 }
785 
786 /* get BE for DAI widget and stream */
787 static struct snd_soc_pcm_runtime *dpcm_get_be(struct snd_soc_card *card,
788 		struct snd_soc_dapm_widget *widget, int stream)
789 {
790 	struct snd_soc_pcm_runtime *be;
791 	int i;
792 
793 	if (stream == SNDRV_PCM_STREAM_PLAYBACK) {
794 		for (i = 0; i < card->num_links; i++) {
795 			be = &card->rtd[i];
796 
797 			if (!be->dai_link->no_pcm)
798 				continue;
799 
800 			if (be->cpu_dai->playback_widget == widget ||
801 				be->codec_dai->playback_widget == widget)
802 				return be;
803 		}
804 	} else {
805 
806 		for (i = 0; i < card->num_links; i++) {
807 			be = &card->rtd[i];
808 
809 			if (!be->dai_link->no_pcm)
810 				continue;
811 
812 			if (be->cpu_dai->capture_widget == widget ||
813 				be->codec_dai->capture_widget == widget)
814 				return be;
815 		}
816 	}
817 
818 	dev_err(card->dev, "can't get %s BE for %s\n",
819 		stream ? "capture" : "playback", widget->name);
820 	return NULL;
821 }
822 
823 static inline struct snd_soc_dapm_widget *
824 	rtd_get_cpu_widget(struct snd_soc_pcm_runtime *rtd, int stream)
825 {
826 	if (stream == SNDRV_PCM_STREAM_PLAYBACK)
827 		return rtd->cpu_dai->playback_widget;
828 	else
829 		return rtd->cpu_dai->capture_widget;
830 }
831 
832 static inline struct snd_soc_dapm_widget *
833 	rtd_get_codec_widget(struct snd_soc_pcm_runtime *rtd, int stream)
834 {
835 	if (stream == SNDRV_PCM_STREAM_PLAYBACK)
836 		return rtd->codec_dai->playback_widget;
837 	else
838 		return rtd->codec_dai->capture_widget;
839 }
840 
841 static int widget_in_list(struct snd_soc_dapm_widget_list *list,
842 		struct snd_soc_dapm_widget *widget)
843 {
844 	int i;
845 
846 	for (i = 0; i < list->num_widgets; i++) {
847 		if (widget == list->widgets[i])
848 			return 1;
849 	}
850 
851 	return 0;
852 }
853 
854 static int dpcm_path_get(struct snd_soc_pcm_runtime *fe,
855 	int stream, struct snd_soc_dapm_widget_list **list_)
856 {
857 	struct snd_soc_dai *cpu_dai = fe->cpu_dai;
858 	struct snd_soc_dapm_widget_list *list;
859 	int paths;
860 
861 	list = kzalloc(sizeof(struct snd_soc_dapm_widget_list) +
862 			sizeof(struct snd_soc_dapm_widget *), GFP_KERNEL);
863 	if (list == NULL)
864 		return -ENOMEM;
865 
866 	/* get number of valid DAI paths and their widgets */
867 	paths = snd_soc_dapm_dai_get_connected_widgets(cpu_dai, stream, &list);
868 
869 	dev_dbg(fe->dev, "found %d audio %s paths\n", paths,
870 			stream ? "capture" : "playback");
871 
872 	*list_ = list;
873 	return paths;
874 }
875 
876 static inline void dpcm_path_put(struct snd_soc_dapm_widget_list **list)
877 {
878 	kfree(*list);
879 }
880 
881 static int dpcm_prune_paths(struct snd_soc_pcm_runtime *fe, int stream,
882 	struct snd_soc_dapm_widget_list **list_)
883 {
884 	struct snd_soc_dpcm *dpcm;
885 	struct snd_soc_dapm_widget_list *list = *list_;
886 	struct snd_soc_dapm_widget *widget;
887 	int prune = 0;
888 
889 	/* Destroy any old FE <--> BE connections */
890 	list_for_each_entry(dpcm, &fe->dpcm[stream].be_clients, list_be) {
891 
892 		/* is there a valid CPU DAI widget for this BE */
893 		widget = rtd_get_cpu_widget(dpcm->be, stream);
894 
895 		/* prune the BE if it's no longer in our active list */
896 		if (widget && widget_in_list(list, widget))
897 			continue;
898 
899 		/* is there a valid CODEC DAI widget for this BE */
900 		widget = rtd_get_codec_widget(dpcm->be, stream);
901 
902 		/* prune the BE if it's no longer in our active list */
903 		if (widget && widget_in_list(list, widget))
904 			continue;
905 
906 		dev_dbg(fe->dev, "pruning %s BE %s for %s\n",
907 			stream ? "capture" : "playback",
908 			dpcm->be->dai_link->name, fe->dai_link->name);
909 		dpcm->state = SND_SOC_DPCM_LINK_STATE_FREE;
910 		dpcm->be->dpcm[stream].runtime_update = SND_SOC_DPCM_UPDATE_BE;
911 		prune++;
912 	}
913 
914 	dev_dbg(fe->dev, "found %d old BE paths for pruning\n", prune);
915 	return prune;
916 }
917 
918 static int dpcm_add_paths(struct snd_soc_pcm_runtime *fe, int stream,
919 	struct snd_soc_dapm_widget_list **list_)
920 {
921 	struct snd_soc_card *card = fe->card;
922 	struct snd_soc_dapm_widget_list *list = *list_;
923 	struct snd_soc_pcm_runtime *be;
924 	int i, new = 0, err;
925 
926 	/* Create any new FE <--> BE connections */
927 	for (i = 0; i < list->num_widgets; i++) {
928 
929 		if (list->widgets[i]->id != snd_soc_dapm_dai)
930 			continue;
931 
932 		/* is there a valid BE rtd for this widget */
933 		be = dpcm_get_be(card, list->widgets[i], stream);
934 		if (!be) {
935 			dev_err(fe->dev, "no BE found for %s\n",
936 					list->widgets[i]->name);
937 			continue;
938 		}
939 
940 		/* make sure BE is a real BE */
941 		if (!be->dai_link->no_pcm)
942 			continue;
943 
944 		/* don't connect if FE is not running */
945 		if (!fe->dpcm[stream].runtime)
946 			continue;
947 
948 		/* newly connected FE and BE */
949 		err = dpcm_be_connect(fe, be, stream);
950 		if (err < 0) {
951 			dev_err(fe->dev, "can't connect %s\n",
952 				list->widgets[i]->name);
953 			break;
954 		} else if (err == 0) /* already connected */
955 			continue;
956 
957 		/* new */
958 		be->dpcm[stream].runtime_update = SND_SOC_DPCM_UPDATE_BE;
959 		new++;
960 	}
961 
962 	dev_dbg(fe->dev, "found %d new BE paths\n", new);
963 	return new;
964 }
965 
966 /*
967  * Find the corresponding BE DAIs that source or sink audio to this
968  * FE substream.
969  */
970 static int dpcm_process_paths(struct snd_soc_pcm_runtime *fe,
971 	int stream, struct snd_soc_dapm_widget_list **list, int new)
972 {
973 	if (new)
974 		return dpcm_add_paths(fe, stream, list);
975 	else
976 		return dpcm_prune_paths(fe, stream, list);
977 }
978 
979 static void dpcm_clear_pending_state(struct snd_soc_pcm_runtime *fe, int stream)
980 {
981 	struct snd_soc_dpcm *dpcm;
982 
983 	list_for_each_entry(dpcm, &fe->dpcm[stream].be_clients, list_be)
984 		dpcm->be->dpcm[stream].runtime_update =
985 						SND_SOC_DPCM_UPDATE_NO;
986 }
987 
988 static void dpcm_be_dai_startup_unwind(struct snd_soc_pcm_runtime *fe,
989 	int stream)
990 {
991 	struct snd_soc_dpcm *dpcm;
992 
993 	/* disable any enabled and non active backends */
994 	list_for_each_entry(dpcm, &fe->dpcm[stream].be_clients, list_be) {
995 
996 		struct snd_soc_pcm_runtime *be = dpcm->be;
997 		struct snd_pcm_substream *be_substream =
998 			snd_soc_dpcm_get_substream(be, stream);
999 
1000 		if (be->dpcm[stream].users == 0)
1001 			dev_err(be->dev, "no users %s at close - state %d\n",
1002 				stream ? "capture" : "playback",
1003 				be->dpcm[stream].state);
1004 
1005 		if (--be->dpcm[stream].users != 0)
1006 			continue;
1007 
1008 		if (be->dpcm[stream].state != SND_SOC_DPCM_STATE_OPEN)
1009 			continue;
1010 
1011 		soc_pcm_close(be_substream);
1012 		be_substream->runtime = NULL;
1013 		be->dpcm[stream].state = SND_SOC_DPCM_STATE_CLOSE;
1014 	}
1015 }
1016 
1017 static int dpcm_be_dai_startup(struct snd_soc_pcm_runtime *fe, int stream)
1018 {
1019 	struct snd_soc_dpcm *dpcm;
1020 	int err, count = 0;
1021 
1022 	/* only startup BE DAIs that are either sinks or sources to this FE DAI */
1023 	list_for_each_entry(dpcm, &fe->dpcm[stream].be_clients, list_be) {
1024 
1025 		struct snd_soc_pcm_runtime *be = dpcm->be;
1026 		struct snd_pcm_substream *be_substream =
1027 			snd_soc_dpcm_get_substream(be, stream);
1028 
1029 		/* is this op for this BE ? */
1030 		if (!snd_soc_dpcm_be_can_update(fe, be, stream))
1031 			continue;
1032 
1033 		/* first time the dpcm is open ? */
1034 		if (be->dpcm[stream].users == DPCM_MAX_BE_USERS)
1035 			dev_err(be->dev, "too many users %s at open %d\n",
1036 				stream ? "capture" : "playback",
1037 				be->dpcm[stream].state);
1038 
1039 		if (be->dpcm[stream].users++ != 0)
1040 			continue;
1041 
1042 		if ((be->dpcm[stream].state != SND_SOC_DPCM_STATE_NEW) &&
1043 		    (be->dpcm[stream].state != SND_SOC_DPCM_STATE_CLOSE))
1044 			continue;
1045 
1046 		dev_dbg(be->dev, "dpcm: open BE %s\n", be->dai_link->name);
1047 
1048 		be_substream->runtime = be->dpcm[stream].runtime;
1049 		err = soc_pcm_open(be_substream);
1050 		if (err < 0) {
1051 			dev_err(be->dev, "BE open failed %d\n", err);
1052 			be->dpcm[stream].users--;
1053 			if (be->dpcm[stream].users < 0)
1054 				dev_err(be->dev, "no users %s at unwind %d\n",
1055 					stream ? "capture" : "playback",
1056 					be->dpcm[stream].state);
1057 
1058 			be->dpcm[stream].state = SND_SOC_DPCM_STATE_CLOSE;
1059 			goto unwind;
1060 		}
1061 
1062 		be->dpcm[stream].state = SND_SOC_DPCM_STATE_OPEN;
1063 		count++;
1064 	}
1065 
1066 	return count;
1067 
1068 unwind:
1069 	/* disable any enabled and non active backends */
1070 	list_for_each_entry_continue_reverse(dpcm, &fe->dpcm[stream].be_clients, list_be) {
1071 		struct snd_soc_pcm_runtime *be = dpcm->be;
1072 		struct snd_pcm_substream *be_substream =
1073 			snd_soc_dpcm_get_substream(be, stream);
1074 
1075 		if (!snd_soc_dpcm_be_can_update(fe, be, stream))
1076 			continue;
1077 
1078 		if (be->dpcm[stream].users == 0)
1079 			dev_err(be->dev, "no users %s at close %d\n",
1080 				stream ? "capture" : "playback",
1081 				be->dpcm[stream].state);
1082 
1083 		if (--be->dpcm[stream].users != 0)
1084 			continue;
1085 
1086 		if (be->dpcm[stream].state != SND_SOC_DPCM_STATE_OPEN)
1087 			continue;
1088 
1089 		soc_pcm_close(be_substream);
1090 		be_substream->runtime = NULL;
1091 		be->dpcm[stream].state = SND_SOC_DPCM_STATE_CLOSE;
1092 	}
1093 
1094 	return err;
1095 }
1096 
1097 static void dpcm_set_fe_runtime(struct snd_pcm_substream *substream)
1098 {
1099 	struct snd_pcm_runtime *runtime = substream->runtime;
1100 	struct snd_soc_pcm_runtime *rtd = substream->private_data;
1101 	struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
1102 	struct snd_soc_dai_driver *cpu_dai_drv = cpu_dai->driver;
1103 
1104 	if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
1105 		runtime->hw.rate_min = cpu_dai_drv->playback.rate_min;
1106 		runtime->hw.rate_max = cpu_dai_drv->playback.rate_max;
1107 		runtime->hw.channels_min = cpu_dai_drv->playback.channels_min;
1108 		runtime->hw.channels_max = cpu_dai_drv->playback.channels_max;
1109 		runtime->hw.formats &= cpu_dai_drv->playback.formats;
1110 		runtime->hw.rates = cpu_dai_drv->playback.rates;
1111 	} else {
1112 		runtime->hw.rate_min = cpu_dai_drv->capture.rate_min;
1113 		runtime->hw.rate_max = cpu_dai_drv->capture.rate_max;
1114 		runtime->hw.channels_min = cpu_dai_drv->capture.channels_min;
1115 		runtime->hw.channels_max = cpu_dai_drv->capture.channels_max;
1116 		runtime->hw.formats &= cpu_dai_drv->capture.formats;
1117 		runtime->hw.rates = cpu_dai_drv->capture.rates;
1118 	}
1119 }
1120 
1121 static int dpcm_fe_dai_startup(struct snd_pcm_substream *fe_substream)
1122 {
1123 	struct snd_soc_pcm_runtime *fe = fe_substream->private_data;
1124 	struct snd_pcm_runtime *runtime = fe_substream->runtime;
1125 	int stream = fe_substream->stream, ret = 0;
1126 
1127 	fe->dpcm[stream].runtime_update = SND_SOC_DPCM_UPDATE_FE;
1128 
1129 	ret = dpcm_be_dai_startup(fe, fe_substream->stream);
1130 	if (ret < 0) {
1131 		dev_err(fe->dev,"dpcm: failed to start some BEs %d\n", ret);
1132 		goto be_err;
1133 	}
1134 
1135 	dev_dbg(fe->dev, "dpcm: open FE %s\n", fe->dai_link->name);
1136 
1137 	/* start the DAI frontend */
1138 	ret = soc_pcm_open(fe_substream);
1139 	if (ret < 0) {
1140 		dev_err(fe->dev,"dpcm: failed to start FE %d\n", ret);
1141 		goto unwind;
1142 	}
1143 
1144 	fe->dpcm[stream].state = SND_SOC_DPCM_STATE_OPEN;
1145 
1146 	dpcm_set_fe_runtime(fe_substream);
1147 	snd_pcm_limit_hw_rates(runtime);
1148 
1149 	fe->dpcm[stream].runtime_update = SND_SOC_DPCM_UPDATE_NO;
1150 	return 0;
1151 
1152 unwind:
1153 	dpcm_be_dai_startup_unwind(fe, fe_substream->stream);
1154 be_err:
1155 	fe->dpcm[stream].runtime_update = SND_SOC_DPCM_UPDATE_NO;
1156 	return ret;
1157 }
1158 
1159 static int dpcm_be_dai_shutdown(struct snd_soc_pcm_runtime *fe, int stream)
1160 {
1161 	struct snd_soc_dpcm *dpcm;
1162 
1163 	/* only shutdown BEs that are either sinks or sources to this FE DAI */
1164 	list_for_each_entry(dpcm, &fe->dpcm[stream].be_clients, list_be) {
1165 
1166 		struct snd_soc_pcm_runtime *be = dpcm->be;
1167 		struct snd_pcm_substream *be_substream =
1168 			snd_soc_dpcm_get_substream(be, stream);
1169 
1170 		/* is this op for this BE ? */
1171 		if (!snd_soc_dpcm_be_can_update(fe, be, stream))
1172 			continue;
1173 
1174 		if (be->dpcm[stream].users == 0)
1175 			dev_err(be->dev, "no users %s at close - state %d\n",
1176 				stream ? "capture" : "playback",
1177 				be->dpcm[stream].state);
1178 
1179 		if (--be->dpcm[stream].users != 0)
1180 			continue;
1181 
1182 		if ((be->dpcm[stream].state != SND_SOC_DPCM_STATE_HW_FREE) &&
1183 		    (be->dpcm[stream].state != SND_SOC_DPCM_STATE_OPEN))
1184 			continue;
1185 
1186 		dev_dbg(be->dev, "dpcm: close BE %s\n",
1187 			dpcm->fe->dai_link->name);
1188 
1189 		soc_pcm_close(be_substream);
1190 		be_substream->runtime = NULL;
1191 
1192 		be->dpcm[stream].state = SND_SOC_DPCM_STATE_CLOSE;
1193 	}
1194 	return 0;
1195 }
1196 
1197 static int dpcm_fe_dai_shutdown(struct snd_pcm_substream *substream)
1198 {
1199 	struct snd_soc_pcm_runtime *fe = substream->private_data;
1200 	int stream = substream->stream;
1201 
1202 	fe->dpcm[stream].runtime_update = SND_SOC_DPCM_UPDATE_FE;
1203 
1204 	/* shutdown the BEs */
1205 	dpcm_be_dai_shutdown(fe, substream->stream);
1206 
1207 	dev_dbg(fe->dev, "dpcm: close FE %s\n", fe->dai_link->name);
1208 
1209 	/* now shutdown the frontend */
1210 	soc_pcm_close(substream);
1211 
1212 	/* run the stream event for each BE */
1213 	dpcm_dapm_stream_event(fe, stream, SND_SOC_DAPM_STREAM_STOP);
1214 
1215 	fe->dpcm[stream].state = SND_SOC_DPCM_STATE_CLOSE;
1216 	fe->dpcm[stream].runtime_update = SND_SOC_DPCM_UPDATE_NO;
1217 	return 0;
1218 }
1219 
1220 static int dpcm_be_dai_hw_free(struct snd_soc_pcm_runtime *fe, int stream)
1221 {
1222 	struct snd_soc_dpcm *dpcm;
1223 
1224 	/* only hw_params backends that are either sinks or sources
1225 	 * to this frontend DAI */
1226 	list_for_each_entry(dpcm, &fe->dpcm[stream].be_clients, list_be) {
1227 
1228 		struct snd_soc_pcm_runtime *be = dpcm->be;
1229 		struct snd_pcm_substream *be_substream =
1230 			snd_soc_dpcm_get_substream(be, stream);
1231 
1232 		/* is this op for this BE ? */
1233 		if (!snd_soc_dpcm_be_can_update(fe, be, stream))
1234 			continue;
1235 
1236 		/* only free hw when no longer used - check all FEs */
1237 		if (!snd_soc_dpcm_can_be_free_stop(fe, be, stream))
1238 				continue;
1239 
1240 		if ((be->dpcm[stream].state != SND_SOC_DPCM_STATE_HW_PARAMS) &&
1241 		    (be->dpcm[stream].state != SND_SOC_DPCM_STATE_PREPARE) &&
1242 		    (be->dpcm[stream].state != SND_SOC_DPCM_STATE_HW_FREE) &&
1243 		    (be->dpcm[stream].state != SND_SOC_DPCM_STATE_STOP))
1244 			continue;
1245 
1246 		dev_dbg(be->dev, "dpcm: hw_free BE %s\n",
1247 			dpcm->fe->dai_link->name);
1248 
1249 		soc_pcm_hw_free(be_substream);
1250 
1251 		be->dpcm[stream].state = SND_SOC_DPCM_STATE_HW_FREE;
1252 	}
1253 
1254 	return 0;
1255 }
1256 
1257 static int dpcm_fe_dai_hw_free(struct snd_pcm_substream *substream)
1258 {
1259 	struct snd_soc_pcm_runtime *fe = substream->private_data;
1260 	int err, stream = substream->stream;
1261 
1262 	mutex_lock_nested(&fe->card->mutex, SND_SOC_CARD_CLASS_RUNTIME);
1263 	fe->dpcm[stream].runtime_update = SND_SOC_DPCM_UPDATE_FE;
1264 
1265 	dev_dbg(fe->dev, "dpcm: hw_free FE %s\n", fe->dai_link->name);
1266 
1267 	/* call hw_free on the frontend */
1268 	err = soc_pcm_hw_free(substream);
1269 	if (err < 0)
1270 		dev_err(fe->dev,"dpcm: hw_free FE %s failed\n",
1271 			fe->dai_link->name);
1272 
1273 	/* only hw_params backends that are either sinks or sources
1274 	 * to this frontend DAI */
1275 	err = dpcm_be_dai_hw_free(fe, stream);
1276 
1277 	fe->dpcm[stream].state = SND_SOC_DPCM_STATE_HW_FREE;
1278 	fe->dpcm[stream].runtime_update = SND_SOC_DPCM_UPDATE_NO;
1279 
1280 	mutex_unlock(&fe->card->mutex);
1281 	return 0;
1282 }
1283 
1284 static int dpcm_be_dai_hw_params(struct snd_soc_pcm_runtime *fe, int stream)
1285 {
1286 	struct snd_soc_dpcm *dpcm;
1287 	int ret;
1288 
1289 	list_for_each_entry(dpcm, &fe->dpcm[stream].be_clients, list_be) {
1290 
1291 		struct snd_soc_pcm_runtime *be = dpcm->be;
1292 		struct snd_pcm_substream *be_substream =
1293 			snd_soc_dpcm_get_substream(be, stream);
1294 
1295 		/* is this op for this BE ? */
1296 		if (!snd_soc_dpcm_be_can_update(fe, be, stream))
1297 			continue;
1298 
1299 		/* only allow hw_params() if no connected FEs are running */
1300 		if (!snd_soc_dpcm_can_be_params(fe, be, stream))
1301 			continue;
1302 
1303 		if ((be->dpcm[stream].state != SND_SOC_DPCM_STATE_OPEN) &&
1304 		    (be->dpcm[stream].state != SND_SOC_DPCM_STATE_HW_PARAMS) &&
1305 		    (be->dpcm[stream].state != SND_SOC_DPCM_STATE_HW_FREE))
1306 			continue;
1307 
1308 		dev_dbg(be->dev, "dpcm: hw_params BE %s\n",
1309 			dpcm->fe->dai_link->name);
1310 
1311 		/* copy params for each dpcm */
1312 		memcpy(&dpcm->hw_params, &fe->dpcm[stream].hw_params,
1313 				sizeof(struct snd_pcm_hw_params));
1314 
1315 		/* perform any hw_params fixups */
1316 		if (be->dai_link->be_hw_params_fixup) {
1317 			ret = be->dai_link->be_hw_params_fixup(be,
1318 					&dpcm->hw_params);
1319 			if (ret < 0) {
1320 				dev_err(be->dev,
1321 					"dpcm: hw_params BE fixup failed %d\n",
1322 					ret);
1323 				goto unwind;
1324 			}
1325 		}
1326 
1327 		ret = soc_pcm_hw_params(be_substream, &dpcm->hw_params);
1328 		if (ret < 0) {
1329 			dev_err(dpcm->be->dev,
1330 				"dpcm: hw_params BE failed %d\n", ret);
1331 			goto unwind;
1332 		}
1333 
1334 		be->dpcm[stream].state = SND_SOC_DPCM_STATE_HW_PARAMS;
1335 	}
1336 	return 0;
1337 
1338 unwind:
1339 	/* disable any enabled and non active backends */
1340 	list_for_each_entry_continue_reverse(dpcm, &fe->dpcm[stream].be_clients, list_be) {
1341 		struct snd_soc_pcm_runtime *be = dpcm->be;
1342 		struct snd_pcm_substream *be_substream =
1343 			snd_soc_dpcm_get_substream(be, stream);
1344 
1345 		if (!snd_soc_dpcm_be_can_update(fe, be, stream))
1346 			continue;
1347 
1348 		/* only allow hw_free() if no connected FEs are running */
1349 		if (!snd_soc_dpcm_can_be_free_stop(fe, be, stream))
1350 			continue;
1351 
1352 		if ((be->dpcm[stream].state != SND_SOC_DPCM_STATE_OPEN) &&
1353 		   (be->dpcm[stream].state != SND_SOC_DPCM_STATE_HW_PARAMS) &&
1354 		   (be->dpcm[stream].state != SND_SOC_DPCM_STATE_HW_FREE) &&
1355 		   (be->dpcm[stream].state != SND_SOC_DPCM_STATE_STOP))
1356 			continue;
1357 
1358 		soc_pcm_hw_free(be_substream);
1359 	}
1360 
1361 	return ret;
1362 }
1363 
1364 static int dpcm_fe_dai_hw_params(struct snd_pcm_substream *substream,
1365 				 struct snd_pcm_hw_params *params)
1366 {
1367 	struct snd_soc_pcm_runtime *fe = substream->private_data;
1368 	int ret, stream = substream->stream;
1369 
1370 	mutex_lock_nested(&fe->card->mutex, SND_SOC_CARD_CLASS_RUNTIME);
1371 	fe->dpcm[stream].runtime_update = SND_SOC_DPCM_UPDATE_FE;
1372 
1373 	memcpy(&fe->dpcm[substream->stream].hw_params, params,
1374 			sizeof(struct snd_pcm_hw_params));
1375 	ret = dpcm_be_dai_hw_params(fe, substream->stream);
1376 	if (ret < 0) {
1377 		dev_err(fe->dev,"dpcm: hw_params BE failed %d\n", ret);
1378 		goto out;
1379 	}
1380 
1381 	dev_dbg(fe->dev, "dpcm: hw_params FE %s rate %d chan %x fmt %d\n",
1382 			fe->dai_link->name, params_rate(params),
1383 			params_channels(params), params_format(params));
1384 
1385 	/* call hw_params on the frontend */
1386 	ret = soc_pcm_hw_params(substream, params);
1387 	if (ret < 0) {
1388 		dev_err(fe->dev,"dpcm: hw_params FE failed %d\n", ret);
1389 		dpcm_be_dai_hw_free(fe, stream);
1390 	 } else
1391 		fe->dpcm[stream].state = SND_SOC_DPCM_STATE_HW_PARAMS;
1392 
1393 out:
1394 	fe->dpcm[stream].runtime_update = SND_SOC_DPCM_UPDATE_NO;
1395 	mutex_unlock(&fe->card->mutex);
1396 	return ret;
1397 }
1398 
1399 static int dpcm_do_trigger(struct snd_soc_dpcm *dpcm,
1400 		struct snd_pcm_substream *substream, int cmd)
1401 {
1402 	int ret;
1403 
1404 	dev_dbg(dpcm->be->dev, "dpcm: trigger BE %s cmd %d\n",
1405 			dpcm->fe->dai_link->name, cmd);
1406 
1407 	ret = soc_pcm_trigger(substream, cmd);
1408 	if (ret < 0)
1409 		dev_err(dpcm->be->dev,"dpcm: trigger BE failed %d\n", ret);
1410 
1411 	return ret;
1412 }
1413 
1414 static int dpcm_be_dai_trigger(struct snd_soc_pcm_runtime *fe, int stream,
1415 			       int cmd)
1416 {
1417 	struct snd_soc_dpcm *dpcm;
1418 	int ret = 0;
1419 
1420 	list_for_each_entry(dpcm, &fe->dpcm[stream].be_clients, list_be) {
1421 
1422 		struct snd_soc_pcm_runtime *be = dpcm->be;
1423 		struct snd_pcm_substream *be_substream =
1424 			snd_soc_dpcm_get_substream(be, stream);
1425 
1426 		/* is this op for this BE ? */
1427 		if (!snd_soc_dpcm_be_can_update(fe, be, stream))
1428 			continue;
1429 
1430 		switch (cmd) {
1431 		case SNDRV_PCM_TRIGGER_START:
1432 			if ((be->dpcm[stream].state != SND_SOC_DPCM_STATE_PREPARE) &&
1433 			    (be->dpcm[stream].state != SND_SOC_DPCM_STATE_STOP))
1434 				continue;
1435 
1436 			ret = dpcm_do_trigger(dpcm, be_substream, cmd);
1437 			if (ret)
1438 				return ret;
1439 
1440 			be->dpcm[stream].state = SND_SOC_DPCM_STATE_START;
1441 			break;
1442 		case SNDRV_PCM_TRIGGER_RESUME:
1443 			if ((be->dpcm[stream].state != SND_SOC_DPCM_STATE_SUSPEND))
1444 				continue;
1445 
1446 			ret = dpcm_do_trigger(dpcm, be_substream, cmd);
1447 			if (ret)
1448 				return ret;
1449 
1450 			be->dpcm[stream].state = SND_SOC_DPCM_STATE_START;
1451 			break;
1452 		case SNDRV_PCM_TRIGGER_PAUSE_RELEASE:
1453 			if ((be->dpcm[stream].state != SND_SOC_DPCM_STATE_PAUSED))
1454 				continue;
1455 
1456 			ret = dpcm_do_trigger(dpcm, be_substream, cmd);
1457 			if (ret)
1458 				return ret;
1459 
1460 			be->dpcm[stream].state = SND_SOC_DPCM_STATE_START;
1461 			break;
1462 		case SNDRV_PCM_TRIGGER_STOP:
1463 			if (be->dpcm[stream].state != SND_SOC_DPCM_STATE_START)
1464 				continue;
1465 
1466 			if (!snd_soc_dpcm_can_be_free_stop(fe, be, stream))
1467 				continue;
1468 
1469 			ret = dpcm_do_trigger(dpcm, be_substream, cmd);
1470 			if (ret)
1471 				return ret;
1472 
1473 			be->dpcm[stream].state = SND_SOC_DPCM_STATE_STOP;
1474 			break;
1475 		case SNDRV_PCM_TRIGGER_SUSPEND:
1476 			if (be->dpcm[stream].state != SND_SOC_DPCM_STATE_STOP)
1477 				continue;
1478 
1479 			if (!snd_soc_dpcm_can_be_free_stop(fe, be, stream))
1480 				continue;
1481 
1482 			ret = dpcm_do_trigger(dpcm, be_substream, cmd);
1483 			if (ret)
1484 				return ret;
1485 
1486 			be->dpcm[stream].state = SND_SOC_DPCM_STATE_SUSPEND;
1487 			break;
1488 		case SNDRV_PCM_TRIGGER_PAUSE_PUSH:
1489 			if (be->dpcm[stream].state != SND_SOC_DPCM_STATE_START)
1490 				continue;
1491 
1492 			if (!snd_soc_dpcm_can_be_free_stop(fe, be, stream))
1493 				continue;
1494 
1495 			ret = dpcm_do_trigger(dpcm, be_substream, cmd);
1496 			if (ret)
1497 				return ret;
1498 
1499 			be->dpcm[stream].state = SND_SOC_DPCM_STATE_PAUSED;
1500 			break;
1501 		}
1502 	}
1503 
1504 	return ret;
1505 }
1506 EXPORT_SYMBOL_GPL(dpcm_be_dai_trigger);
1507 
1508 static int dpcm_fe_dai_trigger(struct snd_pcm_substream *substream, int cmd)
1509 {
1510 	struct snd_soc_pcm_runtime *fe = substream->private_data;
1511 	int stream = substream->stream, ret;
1512 	enum snd_soc_dpcm_trigger trigger = fe->dai_link->trigger[stream];
1513 
1514 	fe->dpcm[stream].runtime_update = SND_SOC_DPCM_UPDATE_FE;
1515 
1516 	switch (trigger) {
1517 	case SND_SOC_DPCM_TRIGGER_PRE:
1518 		/* call trigger on the frontend before the backend. */
1519 
1520 		dev_dbg(fe->dev, "dpcm: pre trigger FE %s cmd %d\n",
1521 				fe->dai_link->name, cmd);
1522 
1523 		ret = soc_pcm_trigger(substream, cmd);
1524 		if (ret < 0) {
1525 			dev_err(fe->dev,"dpcm: trigger FE failed %d\n", ret);
1526 			goto out;
1527 		}
1528 
1529 		ret = dpcm_be_dai_trigger(fe, substream->stream, cmd);
1530 		break;
1531 	case SND_SOC_DPCM_TRIGGER_POST:
1532 		/* call trigger on the frontend after the backend. */
1533 
1534 		ret = dpcm_be_dai_trigger(fe, substream->stream, cmd);
1535 		if (ret < 0) {
1536 			dev_err(fe->dev,"dpcm: trigger FE failed %d\n", ret);
1537 			goto out;
1538 		}
1539 
1540 		dev_dbg(fe->dev, "dpcm: post trigger FE %s cmd %d\n",
1541 				fe->dai_link->name, cmd);
1542 
1543 		ret = soc_pcm_trigger(substream, cmd);
1544 		break;
1545 	case SND_SOC_DPCM_TRIGGER_BESPOKE:
1546 		/* bespoke trigger() - handles both FE and BEs */
1547 
1548 		dev_dbg(fe->dev, "dpcm: bespoke trigger FE %s cmd %d\n",
1549 				fe->dai_link->name, cmd);
1550 
1551 		ret = soc_pcm_bespoke_trigger(substream, cmd);
1552 		if (ret < 0) {
1553 			dev_err(fe->dev,"dpcm: trigger FE failed %d\n", ret);
1554 			goto out;
1555 		}
1556 		break;
1557 	default:
1558 		dev_err(fe->dev, "dpcm: invalid trigger cmd %d for %s\n", cmd,
1559 				fe->dai_link->name);
1560 		ret = -EINVAL;
1561 		goto out;
1562 	}
1563 
1564 	switch (cmd) {
1565 	case SNDRV_PCM_TRIGGER_START:
1566 	case SNDRV_PCM_TRIGGER_RESUME:
1567 	case SNDRV_PCM_TRIGGER_PAUSE_RELEASE:
1568 		fe->dpcm[stream].state = SND_SOC_DPCM_STATE_START;
1569 		break;
1570 	case SNDRV_PCM_TRIGGER_STOP:
1571 	case SNDRV_PCM_TRIGGER_SUSPEND:
1572 	case SNDRV_PCM_TRIGGER_PAUSE_PUSH:
1573 		fe->dpcm[stream].state = SND_SOC_DPCM_STATE_STOP;
1574 		break;
1575 	}
1576 
1577 out:
1578 	fe->dpcm[stream].runtime_update = SND_SOC_DPCM_UPDATE_NO;
1579 	return ret;
1580 }
1581 
1582 static int dpcm_be_dai_prepare(struct snd_soc_pcm_runtime *fe, int stream)
1583 {
1584 	struct snd_soc_dpcm *dpcm;
1585 	int ret = 0;
1586 
1587 	list_for_each_entry(dpcm, &fe->dpcm[stream].be_clients, list_be) {
1588 
1589 		struct snd_soc_pcm_runtime *be = dpcm->be;
1590 		struct snd_pcm_substream *be_substream =
1591 			snd_soc_dpcm_get_substream(be, stream);
1592 
1593 		/* is this op for this BE ? */
1594 		if (!snd_soc_dpcm_be_can_update(fe, be, stream))
1595 			continue;
1596 
1597 		if ((be->dpcm[stream].state != SND_SOC_DPCM_STATE_HW_PARAMS) &&
1598 		    (be->dpcm[stream].state != SND_SOC_DPCM_STATE_STOP))
1599 			continue;
1600 
1601 		dev_dbg(be->dev, "dpcm: prepare BE %s\n",
1602 			dpcm->fe->dai_link->name);
1603 
1604 		ret = soc_pcm_prepare(be_substream);
1605 		if (ret < 0) {
1606 			dev_err(be->dev, "dpcm: backend prepare failed %d\n",
1607 				ret);
1608 			break;
1609 		}
1610 
1611 		be->dpcm[stream].state = SND_SOC_DPCM_STATE_PREPARE;
1612 	}
1613 	return ret;
1614 }
1615 
1616 static int dpcm_fe_dai_prepare(struct snd_pcm_substream *substream)
1617 {
1618 	struct snd_soc_pcm_runtime *fe = substream->private_data;
1619 	int stream = substream->stream, ret = 0;
1620 
1621 	mutex_lock_nested(&fe->card->mutex, SND_SOC_CARD_CLASS_RUNTIME);
1622 
1623 	dev_dbg(fe->dev, "dpcm: prepare FE %s\n", fe->dai_link->name);
1624 
1625 	fe->dpcm[stream].runtime_update = SND_SOC_DPCM_UPDATE_FE;
1626 
1627 	/* there is no point preparing this FE if there are no BEs */
1628 	if (list_empty(&fe->dpcm[stream].be_clients)) {
1629 		dev_err(fe->dev, "dpcm: no backend DAIs enabled for %s\n",
1630 				fe->dai_link->name);
1631 		ret = -EINVAL;
1632 		goto out;
1633 	}
1634 
1635 	ret = dpcm_be_dai_prepare(fe, substream->stream);
1636 	if (ret < 0)
1637 		goto out;
1638 
1639 	/* call prepare on the frontend */
1640 	ret = soc_pcm_prepare(substream);
1641 	if (ret < 0) {
1642 		dev_err(fe->dev,"dpcm: prepare FE %s failed\n",
1643 			fe->dai_link->name);
1644 		goto out;
1645 	}
1646 
1647 	/* run the stream event for each BE */
1648 	dpcm_dapm_stream_event(fe, stream, SND_SOC_DAPM_STREAM_START);
1649 	fe->dpcm[stream].state = SND_SOC_DPCM_STATE_PREPARE;
1650 
1651 out:
1652 	fe->dpcm[stream].runtime_update = SND_SOC_DPCM_UPDATE_NO;
1653 	mutex_unlock(&fe->card->mutex);
1654 
1655 	return ret;
1656 }
1657 
1658 static int soc_pcm_ioctl(struct snd_pcm_substream *substream,
1659 		     unsigned int cmd, void *arg)
1660 {
1661 	struct snd_soc_pcm_runtime *rtd = substream->private_data;
1662 	struct snd_soc_platform *platform = rtd->platform;
1663 
1664 	if (platform->driver->ops->ioctl)
1665 		return platform->driver->ops->ioctl(substream, cmd, arg);
1666 	return snd_pcm_lib_ioctl(substream, cmd, arg);
1667 }
1668 
1669 static int dpcm_run_update_shutdown(struct snd_soc_pcm_runtime *fe, int stream)
1670 {
1671 	struct snd_pcm_substream *substream =
1672 		snd_soc_dpcm_get_substream(fe, stream);
1673 	enum snd_soc_dpcm_trigger trigger = fe->dai_link->trigger[stream];
1674 	int err;
1675 
1676 	dev_dbg(fe->dev, "runtime %s close on FE %s\n",
1677 			stream ? "capture" : "playback", fe->dai_link->name);
1678 
1679 	if (trigger == SND_SOC_DPCM_TRIGGER_BESPOKE) {
1680 		/* call bespoke trigger - FE takes care of all BE triggers */
1681 		dev_dbg(fe->dev, "dpcm: bespoke trigger FE %s cmd stop\n",
1682 				fe->dai_link->name);
1683 
1684 		err = soc_pcm_bespoke_trigger(substream, SNDRV_PCM_TRIGGER_STOP);
1685 		if (err < 0)
1686 			dev_err(fe->dev,"dpcm: trigger FE failed %d\n", err);
1687 	} else {
1688 		dev_dbg(fe->dev, "dpcm: trigger FE %s cmd stop\n",
1689 			fe->dai_link->name);
1690 
1691 		err = dpcm_be_dai_trigger(fe, stream, SNDRV_PCM_TRIGGER_STOP);
1692 		if (err < 0)
1693 			dev_err(fe->dev,"dpcm: trigger FE failed %d\n", err);
1694 	}
1695 
1696 	err = dpcm_be_dai_hw_free(fe, stream);
1697 	if (err < 0)
1698 		dev_err(fe->dev,"dpcm: hw_free FE failed %d\n", err);
1699 
1700 	err = dpcm_be_dai_shutdown(fe, stream);
1701 	if (err < 0)
1702 		dev_err(fe->dev,"dpcm: shutdown FE failed %d\n", err);
1703 
1704 	/* run the stream event for each BE */
1705 	dpcm_dapm_stream_event(fe, stream, SND_SOC_DAPM_STREAM_NOP);
1706 
1707 	return 0;
1708 }
1709 
1710 static int dpcm_run_update_startup(struct snd_soc_pcm_runtime *fe, int stream)
1711 {
1712 	struct snd_pcm_substream *substream =
1713 		snd_soc_dpcm_get_substream(fe, stream);
1714 	struct snd_soc_dpcm *dpcm;
1715 	enum snd_soc_dpcm_trigger trigger = fe->dai_link->trigger[stream];
1716 	int ret;
1717 
1718 	dev_dbg(fe->dev, "runtime %s open on FE %s\n",
1719 			stream ? "capture" : "playback", fe->dai_link->name);
1720 
1721 	/* Only start the BE if the FE is ready */
1722 	if (fe->dpcm[stream].state == SND_SOC_DPCM_STATE_HW_FREE ||
1723 		fe->dpcm[stream].state == SND_SOC_DPCM_STATE_CLOSE)
1724 		return -EINVAL;
1725 
1726 	/* startup must always be called for new BEs */
1727 	ret = dpcm_be_dai_startup(fe, stream);
1728 	if (ret < 0) {
1729 		goto disconnect;
1730 		return ret;
1731 	}
1732 
1733 	/* keep going if FE state is > open */
1734 	if (fe->dpcm[stream].state == SND_SOC_DPCM_STATE_OPEN)
1735 		return 0;
1736 
1737 	ret = dpcm_be_dai_hw_params(fe, stream);
1738 	if (ret < 0) {
1739 		goto close;
1740 		return ret;
1741 	}
1742 
1743 	/* keep going if FE state is > hw_params */
1744 	if (fe->dpcm[stream].state == SND_SOC_DPCM_STATE_HW_PARAMS)
1745 		return 0;
1746 
1747 
1748 	ret = dpcm_be_dai_prepare(fe, stream);
1749 	if (ret < 0) {
1750 		goto hw_free;
1751 		return ret;
1752 	}
1753 
1754 	/* run the stream event for each BE */
1755 	dpcm_dapm_stream_event(fe, stream, SND_SOC_DAPM_STREAM_NOP);
1756 
1757 	/* keep going if FE state is > prepare */
1758 	if (fe->dpcm[stream].state == SND_SOC_DPCM_STATE_PREPARE ||
1759 		fe->dpcm[stream].state == SND_SOC_DPCM_STATE_STOP)
1760 		return 0;
1761 
1762 	if (trigger == SND_SOC_DPCM_TRIGGER_BESPOKE) {
1763 		/* call trigger on the frontend - FE takes care of all BE triggers */
1764 		dev_dbg(fe->dev, "dpcm: bespoke trigger FE %s cmd start\n",
1765 				fe->dai_link->name);
1766 
1767 		ret = soc_pcm_bespoke_trigger(substream, SNDRV_PCM_TRIGGER_START);
1768 		if (ret < 0) {
1769 			dev_err(fe->dev,"dpcm: bespoke trigger FE failed %d\n", ret);
1770 			goto hw_free;
1771 		}
1772 	} else {
1773 		dev_dbg(fe->dev, "dpcm: trigger FE %s cmd start\n",
1774 			fe->dai_link->name);
1775 
1776 		ret = dpcm_be_dai_trigger(fe, stream,
1777 					SNDRV_PCM_TRIGGER_START);
1778 		if (ret < 0) {
1779 			dev_err(fe->dev,"dpcm: trigger FE failed %d\n", ret);
1780 			goto hw_free;
1781 		}
1782 	}
1783 
1784 	return 0;
1785 
1786 hw_free:
1787 	dpcm_be_dai_hw_free(fe, stream);
1788 close:
1789 	dpcm_be_dai_shutdown(fe, stream);
1790 disconnect:
1791 	/* disconnect any non started BEs */
1792 	list_for_each_entry(dpcm, &fe->dpcm[stream].be_clients, list_be) {
1793 		struct snd_soc_pcm_runtime *be = dpcm->be;
1794 		if (be->dpcm[stream].state != SND_SOC_DPCM_STATE_START)
1795 				dpcm->state = SND_SOC_DPCM_LINK_STATE_FREE;
1796 	}
1797 
1798 	return ret;
1799 }
1800 
1801 static int dpcm_run_new_update(struct snd_soc_pcm_runtime *fe, int stream)
1802 {
1803 	int ret;
1804 
1805 	fe->dpcm[stream].runtime_update = SND_SOC_DPCM_UPDATE_BE;
1806 	ret = dpcm_run_update_startup(fe, stream);
1807 	if (ret < 0)
1808 		dev_err(fe->dev, "failed to startup some BEs\n");
1809 	fe->dpcm[stream].runtime_update = SND_SOC_DPCM_UPDATE_NO;
1810 
1811 	return ret;
1812 }
1813 
1814 static int dpcm_run_old_update(struct snd_soc_pcm_runtime *fe, int stream)
1815 {
1816 	int ret;
1817 
1818 	fe->dpcm[stream].runtime_update = SND_SOC_DPCM_UPDATE_BE;
1819 	ret = dpcm_run_update_shutdown(fe, stream);
1820 	if (ret < 0)
1821 		dev_err(fe->dev, "failed to shutdown some BEs\n");
1822 	fe->dpcm[stream].runtime_update = SND_SOC_DPCM_UPDATE_NO;
1823 
1824 	return ret;
1825 }
1826 
1827 /* Called by DAPM mixer/mux changes to update audio routing between PCMs and
1828  * any DAI links.
1829  */
1830 int soc_dpcm_runtime_update(struct snd_soc_dapm_widget *widget)
1831 {
1832 	struct snd_soc_card *card;
1833 	int i, old, new, paths;
1834 
1835 	if (widget->codec)
1836 		card = widget->codec->card;
1837 	else if (widget->platform)
1838 		card = widget->platform->card;
1839 	else
1840 		return -EINVAL;
1841 
1842 	mutex_lock_nested(&card->mutex, SND_SOC_CARD_CLASS_RUNTIME);
1843 	for (i = 0; i < card->num_rtd; i++) {
1844 		struct snd_soc_dapm_widget_list *list;
1845 		struct snd_soc_pcm_runtime *fe = &card->rtd[i];
1846 
1847 		/* make sure link is FE */
1848 		if (!fe->dai_link->dynamic)
1849 			continue;
1850 
1851 		/* only check active links */
1852 		if (!fe->cpu_dai->active)
1853 			continue;
1854 
1855 		/* DAPM sync will call this to update DSP paths */
1856 		dev_dbg(fe->dev, "DPCM runtime update for FE %s\n",
1857 			fe->dai_link->name);
1858 
1859 		/* skip if FE doesn't have playback capability */
1860 		if (!fe->cpu_dai->driver->playback.channels_min)
1861 			goto capture;
1862 
1863 		paths = dpcm_path_get(fe, SNDRV_PCM_STREAM_PLAYBACK, &list);
1864 		if (paths < 0) {
1865 			dev_warn(fe->dev, "%s no valid %s path\n",
1866 					fe->dai_link->name,  "playback");
1867 			mutex_unlock(&card->mutex);
1868 			return paths;
1869 		}
1870 
1871 		/* update any new playback paths */
1872 		new = dpcm_process_paths(fe, SNDRV_PCM_STREAM_PLAYBACK, &list, 1);
1873 		if (new) {
1874 			dpcm_run_new_update(fe, SNDRV_PCM_STREAM_PLAYBACK);
1875 			dpcm_clear_pending_state(fe, SNDRV_PCM_STREAM_PLAYBACK);
1876 			dpcm_be_disconnect(fe, SNDRV_PCM_STREAM_PLAYBACK);
1877 		}
1878 
1879 		/* update any old playback paths */
1880 		old = dpcm_process_paths(fe, SNDRV_PCM_STREAM_PLAYBACK, &list, 0);
1881 		if (old) {
1882 			dpcm_run_old_update(fe, SNDRV_PCM_STREAM_PLAYBACK);
1883 			dpcm_clear_pending_state(fe, SNDRV_PCM_STREAM_PLAYBACK);
1884 			dpcm_be_disconnect(fe, SNDRV_PCM_STREAM_PLAYBACK);
1885 		}
1886 
1887 capture:
1888 		/* skip if FE doesn't have capture capability */
1889 		if (!fe->cpu_dai->driver->capture.channels_min)
1890 			continue;
1891 
1892 		paths = dpcm_path_get(fe, SNDRV_PCM_STREAM_CAPTURE, &list);
1893 		if (paths < 0) {
1894 			dev_warn(fe->dev, "%s no valid %s path\n",
1895 					fe->dai_link->name,  "capture");
1896 			mutex_unlock(&card->mutex);
1897 			return paths;
1898 		}
1899 
1900 		/* update any new capture paths */
1901 		new = dpcm_process_paths(fe, SNDRV_PCM_STREAM_CAPTURE, &list, 1);
1902 		if (new) {
1903 			dpcm_run_new_update(fe, SNDRV_PCM_STREAM_CAPTURE);
1904 			dpcm_clear_pending_state(fe, SNDRV_PCM_STREAM_CAPTURE);
1905 			dpcm_be_disconnect(fe, SNDRV_PCM_STREAM_CAPTURE);
1906 		}
1907 
1908 		/* update any old capture paths */
1909 		old = dpcm_process_paths(fe, SNDRV_PCM_STREAM_CAPTURE, &list, 0);
1910 		if (old) {
1911 			dpcm_run_old_update(fe, SNDRV_PCM_STREAM_CAPTURE);
1912 			dpcm_clear_pending_state(fe, SNDRV_PCM_STREAM_CAPTURE);
1913 			dpcm_be_disconnect(fe, SNDRV_PCM_STREAM_CAPTURE);
1914 		}
1915 
1916 		dpcm_path_put(&list);
1917 	}
1918 
1919 	mutex_unlock(&card->mutex);
1920 	return 0;
1921 }
1922 int soc_dpcm_be_digital_mute(struct snd_soc_pcm_runtime *fe, int mute)
1923 {
1924 	struct snd_soc_dpcm *dpcm;
1925 	struct list_head *clients =
1926 		&fe->dpcm[SNDRV_PCM_STREAM_PLAYBACK].be_clients;
1927 
1928 	list_for_each_entry(dpcm, clients, list_be) {
1929 
1930 		struct snd_soc_pcm_runtime *be = dpcm->be;
1931 		struct snd_soc_dai *dai = be->codec_dai;
1932 		struct snd_soc_dai_driver *drv = dai->driver;
1933 
1934 		if (be->dai_link->ignore_suspend)
1935 			continue;
1936 
1937 		dev_dbg(be->dev, "BE digital mute %s\n", be->dai_link->name);
1938 
1939 		if (drv->ops->digital_mute && dai->playback_active)
1940 				drv->ops->digital_mute(dai, mute);
1941 	}
1942 
1943 	return 0;
1944 }
1945 
1946 static int dpcm_fe_dai_open(struct snd_pcm_substream *fe_substream)
1947 {
1948 	struct snd_soc_pcm_runtime *fe = fe_substream->private_data;
1949 	struct snd_soc_dpcm *dpcm;
1950 	struct snd_soc_dapm_widget_list *list;
1951 	int ret;
1952 	int stream = fe_substream->stream;
1953 
1954 	mutex_lock_nested(&fe->card->mutex, SND_SOC_CARD_CLASS_RUNTIME);
1955 	fe->dpcm[stream].runtime = fe_substream->runtime;
1956 
1957 	if (dpcm_path_get(fe, stream, &list) <= 0) {
1958 		dev_dbg(fe->dev, "asoc: %s no valid %s route\n",
1959 			fe->dai_link->name, stream ? "capture" : "playback");
1960 	}
1961 
1962 	/* calculate valid and active FE <-> BE dpcms */
1963 	dpcm_process_paths(fe, stream, &list, 1);
1964 
1965 	ret = dpcm_fe_dai_startup(fe_substream);
1966 	if (ret < 0) {
1967 		/* clean up all links */
1968 		list_for_each_entry(dpcm, &fe->dpcm[stream].be_clients, list_be)
1969 			dpcm->state = SND_SOC_DPCM_LINK_STATE_FREE;
1970 
1971 		dpcm_be_disconnect(fe, stream);
1972 		fe->dpcm[stream].runtime = NULL;
1973 	}
1974 
1975 	dpcm_clear_pending_state(fe, stream);
1976 	dpcm_path_put(&list);
1977 	mutex_unlock(&fe->card->mutex);
1978 	return ret;
1979 }
1980 
1981 static int dpcm_fe_dai_close(struct snd_pcm_substream *fe_substream)
1982 {
1983 	struct snd_soc_pcm_runtime *fe = fe_substream->private_data;
1984 	struct snd_soc_dpcm *dpcm;
1985 	int stream = fe_substream->stream, ret;
1986 
1987 	mutex_lock_nested(&fe->card->mutex, SND_SOC_CARD_CLASS_RUNTIME);
1988 	ret = dpcm_fe_dai_shutdown(fe_substream);
1989 
1990 	/* mark FE's links ready to prune */
1991 	list_for_each_entry(dpcm, &fe->dpcm[stream].be_clients, list_be)
1992 		dpcm->state = SND_SOC_DPCM_LINK_STATE_FREE;
1993 
1994 	dpcm_be_disconnect(fe, stream);
1995 
1996 	fe->dpcm[stream].runtime = NULL;
1997 	mutex_unlock(&fe->card->mutex);
1998 	return ret;
1999 }
2000 
2001 /* create a new pcm */
2002 int soc_new_pcm(struct snd_soc_pcm_runtime *rtd, int num)
2003 {
2004 	struct snd_soc_platform *platform = rtd->platform;
2005 	struct snd_soc_dai *codec_dai = rtd->codec_dai;
2006 	struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
2007 	struct snd_pcm *pcm;
2008 	char new_name[64];
2009 	int ret = 0, playback = 0, capture = 0;
2010 
2011 	if (rtd->dai_link->dynamic || rtd->dai_link->no_pcm) {
2012 		if (cpu_dai->driver->playback.channels_min)
2013 			playback = 1;
2014 		if (cpu_dai->driver->capture.channels_min)
2015 			capture = 1;
2016 	} else {
2017 		if (codec_dai->driver->playback.channels_min)
2018 			playback = 1;
2019 		if (codec_dai->driver->capture.channels_min)
2020 			capture = 1;
2021 	}
2022 
2023 	/* create the PCM */
2024 	if (rtd->dai_link->no_pcm) {
2025 		snprintf(new_name, sizeof(new_name), "(%s)",
2026 			rtd->dai_link->stream_name);
2027 
2028 		ret = snd_pcm_new_internal(rtd->card->snd_card, new_name, num,
2029 				playback, capture, &pcm);
2030 	} else {
2031 		if (rtd->dai_link->dynamic)
2032 			snprintf(new_name, sizeof(new_name), "%s (*)",
2033 				rtd->dai_link->stream_name);
2034 		else
2035 			snprintf(new_name, sizeof(new_name), "%s %s-%d",
2036 				rtd->dai_link->stream_name, codec_dai->name, num);
2037 
2038 		ret = snd_pcm_new(rtd->card->snd_card, new_name, num, playback,
2039 			capture, &pcm);
2040 	}
2041 	if (ret < 0) {
2042 		dev_err(rtd->card->dev, "can't create pcm for %s\n",
2043 			rtd->dai_link->name);
2044 		return ret;
2045 	}
2046 	dev_dbg(rtd->card->dev, "registered pcm #%d %s\n",num, new_name);
2047 
2048 	/* DAPM dai link stream work */
2049 	INIT_DELAYED_WORK(&rtd->delayed_work, close_delayed_work);
2050 
2051 	rtd->pcm = pcm;
2052 	pcm->private_data = rtd;
2053 
2054 	if (rtd->dai_link->no_pcm) {
2055 		if (playback)
2056 			pcm->streams[SNDRV_PCM_STREAM_PLAYBACK].substream->private_data = rtd;
2057 		if (capture)
2058 			pcm->streams[SNDRV_PCM_STREAM_CAPTURE].substream->private_data = rtd;
2059 		goto out;
2060 	}
2061 
2062 	/* ASoC PCM operations */
2063 	if (rtd->dai_link->dynamic) {
2064 		rtd->ops.open		= dpcm_fe_dai_open;
2065 		rtd->ops.hw_params	= dpcm_fe_dai_hw_params;
2066 		rtd->ops.prepare	= dpcm_fe_dai_prepare;
2067 		rtd->ops.trigger	= dpcm_fe_dai_trigger;
2068 		rtd->ops.hw_free	= dpcm_fe_dai_hw_free;
2069 		rtd->ops.close		= dpcm_fe_dai_close;
2070 		rtd->ops.pointer	= soc_pcm_pointer;
2071 		rtd->ops.ioctl		= soc_pcm_ioctl;
2072 	} else {
2073 		rtd->ops.open		= soc_pcm_open;
2074 		rtd->ops.hw_params	= soc_pcm_hw_params;
2075 		rtd->ops.prepare	= soc_pcm_prepare;
2076 		rtd->ops.trigger	= soc_pcm_trigger;
2077 		rtd->ops.hw_free	= soc_pcm_hw_free;
2078 		rtd->ops.close		= soc_pcm_close;
2079 		rtd->ops.pointer	= soc_pcm_pointer;
2080 		rtd->ops.ioctl		= soc_pcm_ioctl;
2081 	}
2082 
2083 	if (platform->driver->ops) {
2084 		rtd->ops.ack		= platform->driver->ops->ack;
2085 		rtd->ops.copy		= platform->driver->ops->copy;
2086 		rtd->ops.silence	= platform->driver->ops->silence;
2087 		rtd->ops.page		= platform->driver->ops->page;
2088 		rtd->ops.mmap		= platform->driver->ops->mmap;
2089 	}
2090 
2091 	if (playback)
2092 		snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_PLAYBACK, &rtd->ops);
2093 
2094 	if (capture)
2095 		snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_CAPTURE, &rtd->ops);
2096 
2097 	if (platform->driver->pcm_new) {
2098 		ret = platform->driver->pcm_new(rtd);
2099 		if (ret < 0) {
2100 			dev_err(platform->dev, "pcm constructor failed\n");
2101 			return ret;
2102 		}
2103 	}
2104 
2105 	pcm->private_free = platform->driver->pcm_free;
2106 out:
2107 	dev_info(rtd->card->dev, " %s <-> %s mapping ok\n", codec_dai->name,
2108 		cpu_dai->name);
2109 	return ret;
2110 }
2111 
2112 /* is the current PCM operation for this FE ? */
2113 int snd_soc_dpcm_fe_can_update(struct snd_soc_pcm_runtime *fe, int stream)
2114 {
2115 	if (fe->dpcm[stream].runtime_update == SND_SOC_DPCM_UPDATE_FE)
2116 		return 1;
2117 	return 0;
2118 }
2119 EXPORT_SYMBOL_GPL(snd_soc_dpcm_fe_can_update);
2120 
2121 /* is the current PCM operation for this BE ? */
2122 int snd_soc_dpcm_be_can_update(struct snd_soc_pcm_runtime *fe,
2123 		struct snd_soc_pcm_runtime *be, int stream)
2124 {
2125 	if ((fe->dpcm[stream].runtime_update == SND_SOC_DPCM_UPDATE_FE) ||
2126 	   ((fe->dpcm[stream].runtime_update == SND_SOC_DPCM_UPDATE_BE) &&
2127 		  be->dpcm[stream].runtime_update))
2128 		return 1;
2129 	return 0;
2130 }
2131 EXPORT_SYMBOL_GPL(snd_soc_dpcm_be_can_update);
2132 
2133 /* get the substream for this BE */
2134 struct snd_pcm_substream *
2135 	snd_soc_dpcm_get_substream(struct snd_soc_pcm_runtime *be, int stream)
2136 {
2137 	return be->pcm->streams[stream].substream;
2138 }
2139 EXPORT_SYMBOL_GPL(snd_soc_dpcm_get_substream);
2140 
2141 /* get the BE runtime state */
2142 enum snd_soc_dpcm_state
2143 	snd_soc_dpcm_be_get_state(struct snd_soc_pcm_runtime *be, int stream)
2144 {
2145 	return be->dpcm[stream].state;
2146 }
2147 EXPORT_SYMBOL_GPL(snd_soc_dpcm_be_get_state);
2148 
2149 /* set the BE runtime state */
2150 void snd_soc_dpcm_be_set_state(struct snd_soc_pcm_runtime *be,
2151 		int stream, enum snd_soc_dpcm_state state)
2152 {
2153 	be->dpcm[stream].state = state;
2154 }
2155 EXPORT_SYMBOL_GPL(snd_soc_dpcm_be_set_state);
2156 
2157 /*
2158  * We can only hw_free, stop, pause or suspend a BE DAI if any of it's FE
2159  * are not running, paused or suspended for the specified stream direction.
2160  */
2161 int snd_soc_dpcm_can_be_free_stop(struct snd_soc_pcm_runtime *fe,
2162 		struct snd_soc_pcm_runtime *be, int stream)
2163 {
2164 	struct snd_soc_dpcm *dpcm;
2165 	int state;
2166 
2167 	list_for_each_entry(dpcm, &be->dpcm[stream].fe_clients, list_fe) {
2168 
2169 		if (dpcm->fe == fe)
2170 			continue;
2171 
2172 		state = dpcm->fe->dpcm[stream].state;
2173 		if (state == SND_SOC_DPCM_STATE_START ||
2174 			state == SND_SOC_DPCM_STATE_PAUSED ||
2175 			state == SND_SOC_DPCM_STATE_SUSPEND)
2176 			return 0;
2177 	}
2178 
2179 	/* it's safe to free/stop this BE DAI */
2180 	return 1;
2181 }
2182 EXPORT_SYMBOL_GPL(snd_soc_dpcm_can_be_free_stop);
2183 
2184 /*
2185  * We can only change hw params a BE DAI if any of it's FE are not prepared,
2186  * running, paused or suspended for the specified stream direction.
2187  */
2188 int snd_soc_dpcm_can_be_params(struct snd_soc_pcm_runtime *fe,
2189 		struct snd_soc_pcm_runtime *be, int stream)
2190 {
2191 	struct snd_soc_dpcm *dpcm;
2192 	int state;
2193 
2194 	list_for_each_entry(dpcm, &be->dpcm[stream].fe_clients, list_fe) {
2195 
2196 		if (dpcm->fe == fe)
2197 			continue;
2198 
2199 		state = dpcm->fe->dpcm[stream].state;
2200 		if (state == SND_SOC_DPCM_STATE_START ||
2201 			state == SND_SOC_DPCM_STATE_PAUSED ||
2202 			state == SND_SOC_DPCM_STATE_SUSPEND ||
2203 			state == SND_SOC_DPCM_STATE_PREPARE)
2204 			return 0;
2205 	}
2206 
2207 	/* it's safe to change hw_params */
2208 	return 1;
2209 }
2210 EXPORT_SYMBOL_GPL(snd_soc_dpcm_can_be_params);
2211 
2212 int snd_soc_platform_trigger(struct snd_pcm_substream *substream,
2213 		int cmd, struct snd_soc_platform *platform)
2214 {
2215 	if (platform->driver->ops->trigger)
2216 		return platform->driver->ops->trigger(substream, cmd);
2217 	return 0;
2218 }
2219 EXPORT_SYMBOL_GPL(snd_soc_platform_trigger);
2220 
2221 #ifdef CONFIG_DEBUG_FS
2222 static char *dpcm_state_string(enum snd_soc_dpcm_state state)
2223 {
2224 	switch (state) {
2225 	case SND_SOC_DPCM_STATE_NEW:
2226 		return "new";
2227 	case SND_SOC_DPCM_STATE_OPEN:
2228 		return "open";
2229 	case SND_SOC_DPCM_STATE_HW_PARAMS:
2230 		return "hw_params";
2231 	case SND_SOC_DPCM_STATE_PREPARE:
2232 		return "prepare";
2233 	case SND_SOC_DPCM_STATE_START:
2234 		return "start";
2235 	case SND_SOC_DPCM_STATE_STOP:
2236 		return "stop";
2237 	case SND_SOC_DPCM_STATE_SUSPEND:
2238 		return "suspend";
2239 	case SND_SOC_DPCM_STATE_PAUSED:
2240 		return "paused";
2241 	case SND_SOC_DPCM_STATE_HW_FREE:
2242 		return "hw_free";
2243 	case SND_SOC_DPCM_STATE_CLOSE:
2244 		return "close";
2245 	}
2246 
2247 	return "unknown";
2248 }
2249 
2250 static ssize_t dpcm_show_state(struct snd_soc_pcm_runtime *fe,
2251 				int stream, char *buf, size_t size)
2252 {
2253 	struct snd_pcm_hw_params *params = &fe->dpcm[stream].hw_params;
2254 	struct snd_soc_dpcm *dpcm;
2255 	ssize_t offset = 0;
2256 
2257 	/* FE state */
2258 	offset += snprintf(buf + offset, size - offset,
2259 			"[%s - %s]\n", fe->dai_link->name,
2260 			stream ? "Capture" : "Playback");
2261 
2262 	offset += snprintf(buf + offset, size - offset, "State: %s\n",
2263 	                dpcm_state_string(fe->dpcm[stream].state));
2264 
2265 	if ((fe->dpcm[stream].state >= SND_SOC_DPCM_STATE_HW_PARAMS) &&
2266 	    (fe->dpcm[stream].state <= SND_SOC_DPCM_STATE_STOP))
2267 		offset += snprintf(buf + offset, size - offset,
2268 				"Hardware Params: "
2269 				"Format = %s, Channels = %d, Rate = %d\n",
2270 				snd_pcm_format_name(params_format(params)),
2271 				params_channels(params),
2272 				params_rate(params));
2273 
2274 	/* BEs state */
2275 	offset += snprintf(buf + offset, size - offset, "Backends:\n");
2276 
2277 	if (list_empty(&fe->dpcm[stream].be_clients)) {
2278 		offset += snprintf(buf + offset, size - offset,
2279 				" No active DSP links\n");
2280 		goto out;
2281 	}
2282 
2283 	list_for_each_entry(dpcm, &fe->dpcm[stream].be_clients, list_be) {
2284 		struct snd_soc_pcm_runtime *be = dpcm->be;
2285 		params = &dpcm->hw_params;
2286 
2287 		offset += snprintf(buf + offset, size - offset,
2288 				"- %s\n", be->dai_link->name);
2289 
2290 		offset += snprintf(buf + offset, size - offset,
2291 				"   State: %s\n",
2292 				dpcm_state_string(be->dpcm[stream].state));
2293 
2294 		if ((be->dpcm[stream].state >= SND_SOC_DPCM_STATE_HW_PARAMS) &&
2295 		    (be->dpcm[stream].state <= SND_SOC_DPCM_STATE_STOP))
2296 			offset += snprintf(buf + offset, size - offset,
2297 				"   Hardware Params: "
2298 				"Format = %s, Channels = %d, Rate = %d\n",
2299 				snd_pcm_format_name(params_format(params)),
2300 				params_channels(params),
2301 				params_rate(params));
2302 	}
2303 
2304 out:
2305 	return offset;
2306 }
2307 
2308 static ssize_t dpcm_state_read_file(struct file *file, char __user *user_buf,
2309 				size_t count, loff_t *ppos)
2310 {
2311 	struct snd_soc_pcm_runtime *fe = file->private_data;
2312 	ssize_t out_count = PAGE_SIZE, offset = 0, ret = 0;
2313 	char *buf;
2314 
2315 	buf = kmalloc(out_count, GFP_KERNEL);
2316 	if (!buf)
2317 		return -ENOMEM;
2318 
2319 	if (fe->cpu_dai->driver->playback.channels_min)
2320 		offset += dpcm_show_state(fe, SNDRV_PCM_STREAM_PLAYBACK,
2321 					buf + offset, out_count - offset);
2322 
2323 	if (fe->cpu_dai->driver->capture.channels_min)
2324 		offset += dpcm_show_state(fe, SNDRV_PCM_STREAM_CAPTURE,
2325 					buf + offset, out_count - offset);
2326 
2327 	ret = simple_read_from_buffer(user_buf, count, ppos, buf, offset);
2328 
2329 	kfree(buf);
2330 	return ret;
2331 }
2332 
2333 static const struct file_operations dpcm_state_fops = {
2334 	.open = simple_open,
2335 	.read = dpcm_state_read_file,
2336 	.llseek = default_llseek,
2337 };
2338 
2339 int soc_dpcm_debugfs_add(struct snd_soc_pcm_runtime *rtd)
2340 {
2341 	if (!rtd->dai_link)
2342 		return 0;
2343 
2344 	rtd->debugfs_dpcm_root = debugfs_create_dir(rtd->dai_link->name,
2345 			rtd->card->debugfs_card_root);
2346 	if (!rtd->debugfs_dpcm_root) {
2347 		dev_dbg(rtd->dev,
2348 			 "ASoC: Failed to create dpcm debugfs directory %s\n",
2349 			 rtd->dai_link->name);
2350 		return -EINVAL;
2351 	}
2352 
2353 	rtd->debugfs_dpcm_state = debugfs_create_file("state", 0444,
2354 						rtd->debugfs_dpcm_root,
2355 						rtd, &dpcm_state_fops);
2356 
2357 	return 0;
2358 }
2359 #endif
2360