]> asedeno.scripts.mit.edu Git - linux.git/blob - sound/soc/soc-pcm.c
Merge tag 'misc-habanalabs-fixes-2019-12-14' of git://people.freedesktop.org/~gabbayo...
[linux.git] / sound / soc / soc-pcm.c
1 // SPDX-License-Identifier: GPL-2.0+
2 //
3 // soc-pcm.c  --  ALSA SoC PCM
4 //
5 // Copyright 2005 Wolfson Microelectronics PLC.
6 // Copyright 2005 Openedhand Ltd.
7 // Copyright (C) 2010 Slimlogic Ltd.
8 // Copyright (C) 2010 Texas Instruments Inc.
9 //
10 // Authors: Liam Girdwood <lrg@ti.com>
11 //          Mark Brown <broonie@opensource.wolfsonmicro.com>
12
13 #include <linux/kernel.h>
14 #include <linux/init.h>
15 #include <linux/delay.h>
16 #include <linux/pinctrl/consumer.h>
17 #include <linux/pm_runtime.h>
18 #include <linux/slab.h>
19 #include <linux/workqueue.h>
20 #include <linux/export.h>
21 #include <linux/debugfs.h>
22 #include <sound/core.h>
23 #include <sound/pcm.h>
24 #include <sound/pcm_params.h>
25 #include <sound/soc.h>
26 #include <sound/soc-dpcm.h>
27 #include <sound/initval.h>
28
29 #define DPCM_MAX_BE_USERS       8
30
31 /**
32  * snd_soc_runtime_activate() - Increment active count for PCM runtime components
33  * @rtd: ASoC PCM runtime that is activated
34  * @stream: Direction of the PCM stream
35  *
36  * Increments the active count for all the DAIs and components attached to a PCM
37  * runtime. Should typically be called when a stream is opened.
38  *
39  * Must be called with the rtd->card->pcm_mutex being held
40  */
41 void snd_soc_runtime_activate(struct snd_soc_pcm_runtime *rtd, int stream)
42 {
43         struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
44         struct snd_soc_dai *codec_dai;
45         int i;
46
47         lockdep_assert_held(&rtd->card->pcm_mutex);
48
49         if (stream == SNDRV_PCM_STREAM_PLAYBACK) {
50                 cpu_dai->playback_active++;
51                 for_each_rtd_codec_dai(rtd, i, codec_dai)
52                         codec_dai->playback_active++;
53         } else {
54                 cpu_dai->capture_active++;
55                 for_each_rtd_codec_dai(rtd, i, codec_dai)
56                         codec_dai->capture_active++;
57         }
58
59         cpu_dai->active++;
60         cpu_dai->component->active++;
61         for_each_rtd_codec_dai(rtd, i, codec_dai) {
62                 codec_dai->active++;
63                 codec_dai->component->active++;
64         }
65 }
66
67 /**
68  * snd_soc_runtime_deactivate() - Decrement active count for PCM runtime components
69  * @rtd: ASoC PCM runtime that is deactivated
70  * @stream: Direction of the PCM stream
71  *
72  * Decrements the active count for all the DAIs and components attached to a PCM
73  * runtime. Should typically be called when a stream is closed.
74  *
75  * Must be called with the rtd->card->pcm_mutex being held
76  */
77 void snd_soc_runtime_deactivate(struct snd_soc_pcm_runtime *rtd, int stream)
78 {
79         struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
80         struct snd_soc_dai *codec_dai;
81         int i;
82
83         lockdep_assert_held(&rtd->card->pcm_mutex);
84
85         if (stream == SNDRV_PCM_STREAM_PLAYBACK) {
86                 cpu_dai->playback_active--;
87                 for_each_rtd_codec_dai(rtd, i, codec_dai)
88                         codec_dai->playback_active--;
89         } else {
90                 cpu_dai->capture_active--;
91                 for_each_rtd_codec_dai(rtd, i, codec_dai)
92                         codec_dai->capture_active--;
93         }
94
95         cpu_dai->active--;
96         cpu_dai->component->active--;
97         for_each_rtd_codec_dai(rtd, i, codec_dai) {
98                 codec_dai->component->active--;
99                 codec_dai->active--;
100         }
101 }
102
103 /**
104  * snd_soc_runtime_ignore_pmdown_time() - Check whether to ignore the power down delay
105  * @rtd: The ASoC PCM runtime that should be checked.
106  *
107  * This function checks whether the power down delay should be ignored for a
108  * specific PCM runtime. Returns true if the delay is 0, if it the DAI link has
109  * been configured to ignore the delay, or if none of the components benefits
110  * from having the delay.
111  */
112 bool snd_soc_runtime_ignore_pmdown_time(struct snd_soc_pcm_runtime *rtd)
113 {
114         struct snd_soc_rtdcom_list *rtdcom;
115         struct snd_soc_component *component;
116         bool ignore = true;
117
118         if (!rtd->pmdown_time || rtd->dai_link->ignore_pmdown_time)
119                 return true;
120
121         for_each_rtd_components(rtd, rtdcom, component)
122                 ignore &= !component->driver->use_pmdown_time;
123
124         return ignore;
125 }
126
127 /**
128  * snd_soc_set_runtime_hwparams - set the runtime hardware parameters
129  * @substream: the pcm substream
130  * @hw: the hardware parameters
131  *
132  * Sets the substream runtime hardware parameters.
133  */
134 int snd_soc_set_runtime_hwparams(struct snd_pcm_substream *substream,
135         const struct snd_pcm_hardware *hw)
136 {
137         struct snd_pcm_runtime *runtime = substream->runtime;
138         runtime->hw.info = hw->info;
139         runtime->hw.formats = hw->formats;
140         runtime->hw.period_bytes_min = hw->period_bytes_min;
141         runtime->hw.period_bytes_max = hw->period_bytes_max;
142         runtime->hw.periods_min = hw->periods_min;
143         runtime->hw.periods_max = hw->periods_max;
144         runtime->hw.buffer_bytes_max = hw->buffer_bytes_max;
145         runtime->hw.fifo_size = hw->fifo_size;
146         return 0;
147 }
148 EXPORT_SYMBOL_GPL(snd_soc_set_runtime_hwparams);
149
150 /* DPCM stream event, send event to FE and all active BEs. */
151 int dpcm_dapm_stream_event(struct snd_soc_pcm_runtime *fe, int dir,
152         int event)
153 {
154         struct snd_soc_dpcm *dpcm;
155
156         for_each_dpcm_be(fe, dir, dpcm) {
157
158                 struct snd_soc_pcm_runtime *be = dpcm->be;
159
160                 dev_dbg(be->dev, "ASoC: BE %s event %d dir %d\n",
161                                 be->dai_link->name, event, dir);
162
163                 if ((event == SND_SOC_DAPM_STREAM_STOP) &&
164                     (be->dpcm[dir].users >= 1))
165                         continue;
166
167                 snd_soc_dapm_stream_event(be, dir, event);
168         }
169
170         snd_soc_dapm_stream_event(fe, dir, event);
171
172         return 0;
173 }
174
175 static int soc_pcm_apply_symmetry(struct snd_pcm_substream *substream,
176                                         struct snd_soc_dai *soc_dai)
177 {
178         struct snd_soc_pcm_runtime *rtd = substream->private_data;
179         int ret;
180
181         if (soc_dai->rate && (soc_dai->driver->symmetric_rates ||
182                                 rtd->dai_link->symmetric_rates)) {
183                 dev_dbg(soc_dai->dev, "ASoC: Symmetry forces %dHz rate\n",
184                                 soc_dai->rate);
185
186                 ret = snd_pcm_hw_constraint_single(substream->runtime,
187                                                 SNDRV_PCM_HW_PARAM_RATE,
188                                                 soc_dai->rate);
189                 if (ret < 0) {
190                         dev_err(soc_dai->dev,
191                                 "ASoC: Unable to apply rate constraint: %d\n",
192                                 ret);
193                         return ret;
194                 }
195         }
196
197         if (soc_dai->channels && (soc_dai->driver->symmetric_channels ||
198                                 rtd->dai_link->symmetric_channels)) {
199                 dev_dbg(soc_dai->dev, "ASoC: Symmetry forces %d channel(s)\n",
200                                 soc_dai->channels);
201
202                 ret = snd_pcm_hw_constraint_single(substream->runtime,
203                                                 SNDRV_PCM_HW_PARAM_CHANNELS,
204                                                 soc_dai->channels);
205                 if (ret < 0) {
206                         dev_err(soc_dai->dev,
207                                 "ASoC: Unable to apply channel symmetry constraint: %d\n",
208                                 ret);
209                         return ret;
210                 }
211         }
212
213         if (soc_dai->sample_bits && (soc_dai->driver->symmetric_samplebits ||
214                                 rtd->dai_link->symmetric_samplebits)) {
215                 dev_dbg(soc_dai->dev, "ASoC: Symmetry forces %d sample bits\n",
216                                 soc_dai->sample_bits);
217
218                 ret = snd_pcm_hw_constraint_single(substream->runtime,
219                                                 SNDRV_PCM_HW_PARAM_SAMPLE_BITS,
220                                                 soc_dai->sample_bits);
221                 if (ret < 0) {
222                         dev_err(soc_dai->dev,
223                                 "ASoC: Unable to apply sample bits symmetry constraint: %d\n",
224                                 ret);
225                         return ret;
226                 }
227         }
228
229         return 0;
230 }
231
232 static int soc_pcm_params_symmetry(struct snd_pcm_substream *substream,
233                                 struct snd_pcm_hw_params *params)
234 {
235         struct snd_soc_pcm_runtime *rtd = substream->private_data;
236         struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
237         struct snd_soc_dai *codec_dai;
238         unsigned int rate, channels, sample_bits, symmetry, i;
239
240         rate = params_rate(params);
241         channels = params_channels(params);
242         sample_bits = snd_pcm_format_physical_width(params_format(params));
243
244         /* reject unmatched parameters when applying symmetry */
245         symmetry = cpu_dai->driver->symmetric_rates ||
246                 rtd->dai_link->symmetric_rates;
247
248         for_each_rtd_codec_dai(rtd, i, codec_dai)
249                 symmetry |= codec_dai->driver->symmetric_rates;
250
251         if (symmetry && cpu_dai->rate && cpu_dai->rate != rate) {
252                 dev_err(rtd->dev, "ASoC: unmatched rate symmetry: %d - %d\n",
253                                 cpu_dai->rate, rate);
254                 return -EINVAL;
255         }
256
257         symmetry = cpu_dai->driver->symmetric_channels ||
258                 rtd->dai_link->symmetric_channels;
259
260         for_each_rtd_codec_dai(rtd, i, codec_dai)
261                 symmetry |= codec_dai->driver->symmetric_channels;
262
263         if (symmetry && cpu_dai->channels && cpu_dai->channels != channels) {
264                 dev_err(rtd->dev, "ASoC: unmatched channel symmetry: %d - %d\n",
265                                 cpu_dai->channels, channels);
266                 return -EINVAL;
267         }
268
269         symmetry = cpu_dai->driver->symmetric_samplebits ||
270                 rtd->dai_link->symmetric_samplebits;
271
272         for_each_rtd_codec_dai(rtd, i, codec_dai)
273                 symmetry |= codec_dai->driver->symmetric_samplebits;
274
275         if (symmetry && cpu_dai->sample_bits && cpu_dai->sample_bits != sample_bits) {
276                 dev_err(rtd->dev, "ASoC: unmatched sample bits symmetry: %d - %d\n",
277                                 cpu_dai->sample_bits, sample_bits);
278                 return -EINVAL;
279         }
280
281         return 0;
282 }
283
284 static bool soc_pcm_has_symmetry(struct snd_pcm_substream *substream)
285 {
286         struct snd_soc_pcm_runtime *rtd = substream->private_data;
287         struct snd_soc_dai_driver *cpu_driver = rtd->cpu_dai->driver;
288         struct snd_soc_dai_link *link = rtd->dai_link;
289         struct snd_soc_dai *codec_dai;
290         unsigned int symmetry, i;
291
292         symmetry = cpu_driver->symmetric_rates || link->symmetric_rates ||
293                 cpu_driver->symmetric_channels || link->symmetric_channels ||
294                 cpu_driver->symmetric_samplebits || link->symmetric_samplebits;
295
296         for_each_rtd_codec_dai(rtd, i, codec_dai)
297                 symmetry = symmetry ||
298                         codec_dai->driver->symmetric_rates ||
299                         codec_dai->driver->symmetric_channels ||
300                         codec_dai->driver->symmetric_samplebits;
301
302         return symmetry;
303 }
304
305 static void soc_pcm_set_msb(struct snd_pcm_substream *substream, int bits)
306 {
307         struct snd_soc_pcm_runtime *rtd = substream->private_data;
308         int ret;
309
310         if (!bits)
311                 return;
312
313         ret = snd_pcm_hw_constraint_msbits(substream->runtime, 0, 0, bits);
314         if (ret != 0)
315                 dev_warn(rtd->dev, "ASoC: Failed to set MSB %d: %d\n",
316                                  bits, ret);
317 }
318
319 static void soc_pcm_apply_msb(struct snd_pcm_substream *substream)
320 {
321         struct snd_soc_pcm_runtime *rtd = substream->private_data;
322         struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
323         struct snd_soc_dai *codec_dai;
324         int i;
325         unsigned int bits = 0, cpu_bits;
326
327         if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
328                 for_each_rtd_codec_dai(rtd, i, codec_dai) {
329                         if (codec_dai->driver->playback.sig_bits == 0) {
330                                 bits = 0;
331                                 break;
332                         }
333                         bits = max(codec_dai->driver->playback.sig_bits, bits);
334                 }
335                 cpu_bits = cpu_dai->driver->playback.sig_bits;
336         } else {
337                 for_each_rtd_codec_dai(rtd, i, codec_dai) {
338                         if (codec_dai->driver->capture.sig_bits == 0) {
339                                 bits = 0;
340                                 break;
341                         }
342                         bits = max(codec_dai->driver->capture.sig_bits, bits);
343                 }
344                 cpu_bits = cpu_dai->driver->capture.sig_bits;
345         }
346
347         soc_pcm_set_msb(substream, bits);
348         soc_pcm_set_msb(substream, cpu_bits);
349 }
350
351 static void soc_pcm_init_runtime_hw(struct snd_pcm_substream *substream)
352 {
353         struct snd_pcm_runtime *runtime = substream->runtime;
354         struct snd_pcm_hardware *hw = &runtime->hw;
355         struct snd_soc_pcm_runtime *rtd = substream->private_data;
356         struct snd_soc_dai *codec_dai;
357         struct snd_soc_dai_driver *cpu_dai_drv = rtd->cpu_dai->driver;
358         struct snd_soc_dai_driver *codec_dai_drv;
359         struct snd_soc_pcm_stream *codec_stream;
360         struct snd_soc_pcm_stream *cpu_stream;
361         unsigned int chan_min = 0, chan_max = UINT_MAX;
362         unsigned int rate_min = 0, rate_max = UINT_MAX;
363         unsigned int rates = UINT_MAX;
364         u64 formats = ULLONG_MAX;
365         int i;
366
367         if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
368                 cpu_stream = &cpu_dai_drv->playback;
369         else
370                 cpu_stream = &cpu_dai_drv->capture;
371
372         /* first calculate min/max only for CODECs in the DAI link */
373         for_each_rtd_codec_dai(rtd, i, codec_dai) {
374
375                 /*
376                  * Skip CODECs which don't support the current stream type.
377                  * Otherwise, since the rate, channel, and format values will
378                  * zero in that case, we would have no usable settings left,
379                  * causing the resulting setup to fail.
380                  * At least one CODEC should match, otherwise we should have
381                  * bailed out on a higher level, since there would be no
382                  * CODEC to support the transfer direction in that case.
383                  */
384                 if (!snd_soc_dai_stream_valid(codec_dai,
385                                               substream->stream))
386                         continue;
387
388                 codec_dai_drv = codec_dai->driver;
389                 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
390                         codec_stream = &codec_dai_drv->playback;
391                 else
392                         codec_stream = &codec_dai_drv->capture;
393                 chan_min = max(chan_min, codec_stream->channels_min);
394                 chan_max = min(chan_max, codec_stream->channels_max);
395                 rate_min = max(rate_min, codec_stream->rate_min);
396                 rate_max = min_not_zero(rate_max, codec_stream->rate_max);
397                 formats &= codec_stream->formats;
398                 rates = snd_pcm_rate_mask_intersect(codec_stream->rates, rates);
399         }
400
401         /*
402          * chan min/max cannot be enforced if there are multiple CODEC DAIs
403          * connected to a single CPU DAI, use CPU DAI's directly and let
404          * channel allocation be fixed up later
405          */
406         if (rtd->num_codecs > 1) {
407                 chan_min = cpu_stream->channels_min;
408                 chan_max = cpu_stream->channels_max;
409         }
410
411         hw->channels_min = max(chan_min, cpu_stream->channels_min);
412         hw->channels_max = min(chan_max, cpu_stream->channels_max);
413         if (hw->formats)
414                 hw->formats &= formats & cpu_stream->formats;
415         else
416                 hw->formats = formats & cpu_stream->formats;
417         hw->rates = snd_pcm_rate_mask_intersect(rates, cpu_stream->rates);
418
419         snd_pcm_limit_hw_rates(runtime);
420
421         hw->rate_min = max(hw->rate_min, cpu_stream->rate_min);
422         hw->rate_min = max(hw->rate_min, rate_min);
423         hw->rate_max = min_not_zero(hw->rate_max, cpu_stream->rate_max);
424         hw->rate_max = min_not_zero(hw->rate_max, rate_max);
425 }
426
427 static int soc_pcm_components_open(struct snd_pcm_substream *substream,
428                                    struct snd_soc_component **last)
429 {
430         struct snd_soc_pcm_runtime *rtd = substream->private_data;
431         struct snd_soc_rtdcom_list *rtdcom;
432         struct snd_soc_component *component;
433         int ret = 0;
434
435         for_each_rtd_components(rtd, rtdcom, component) {
436                 *last = component;
437
438                 ret = snd_soc_component_module_get_when_open(component);
439                 if (ret < 0) {
440                         dev_err(component->dev,
441                                 "ASoC: can't get module %s\n",
442                                 component->name);
443                         return ret;
444                 }
445
446                 ret = snd_soc_component_open(component, substream);
447                 if (ret < 0) {
448                         dev_err(component->dev,
449                                 "ASoC: can't open component %s: %d\n",
450                                 component->name, ret);
451                         return ret;
452                 }
453         }
454         *last = NULL;
455         return 0;
456 }
457
458 static int soc_pcm_components_close(struct snd_pcm_substream *substream,
459                                     struct snd_soc_component *last)
460 {
461         struct snd_soc_pcm_runtime *rtd = substream->private_data;
462         struct snd_soc_rtdcom_list *rtdcom;
463         struct snd_soc_component *component;
464         int ret = 0;
465
466         for_each_rtd_components(rtd, rtdcom, component) {
467                 if (component == last)
468                         break;
469
470                 ret |= snd_soc_component_close(component, substream);
471                 snd_soc_component_module_put_when_close(component);
472         }
473
474         return ret;
475 }
476
477 /*
478  * Called by ALSA when a PCM substream is opened, the runtime->hw record is
479  * then initialized and any private data can be allocated. This also calls
480  * startup for the cpu DAI, component, machine and codec DAI.
481  */
482 static int soc_pcm_open(struct snd_pcm_substream *substream)
483 {
484         struct snd_soc_pcm_runtime *rtd = substream->private_data;
485         struct snd_pcm_runtime *runtime = substream->runtime;
486         struct snd_soc_component *component;
487         struct snd_soc_rtdcom_list *rtdcom;
488         struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
489         struct snd_soc_dai *codec_dai;
490         const char *codec_dai_name = "multicodec";
491         int i, ret = 0;
492
493         pinctrl_pm_select_default_state(cpu_dai->dev);
494         for_each_rtd_codec_dai(rtd, i, codec_dai)
495                 pinctrl_pm_select_default_state(codec_dai->dev);
496
497         for_each_rtd_components(rtd, rtdcom, component) {
498                 pm_runtime_get_sync(component->dev);
499         }
500
501         mutex_lock_nested(&rtd->card->pcm_mutex, rtd->card->pcm_subclass);
502
503         /* startup the audio subsystem */
504         ret = snd_soc_dai_startup(cpu_dai, substream);
505         if (ret < 0) {
506                 dev_err(cpu_dai->dev, "ASoC: can't open interface %s: %d\n",
507                         cpu_dai->name, ret);
508                 goto out;
509         }
510
511         ret = soc_pcm_components_open(substream, &component);
512         if (ret < 0)
513                 goto component_err;
514
515         for_each_rtd_codec_dai(rtd, i, codec_dai) {
516                 ret = snd_soc_dai_startup(codec_dai, substream);
517                 if (ret < 0) {
518                         dev_err(codec_dai->dev,
519                                 "ASoC: can't open codec %s: %d\n",
520                                 codec_dai->name, ret);
521                         goto codec_dai_err;
522                 }
523
524                 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
525                         codec_dai->tx_mask = 0;
526                 else
527                         codec_dai->rx_mask = 0;
528         }
529
530         if (rtd->dai_link->ops->startup) {
531                 ret = rtd->dai_link->ops->startup(substream);
532                 if (ret < 0) {
533                         pr_err("ASoC: %s startup failed: %d\n",
534                                rtd->dai_link->name, ret);
535                         goto machine_err;
536                 }
537         }
538
539         /* Dynamic PCM DAI links compat checks use dynamic capabilities */
540         if (rtd->dai_link->dynamic || rtd->dai_link->no_pcm)
541                 goto dynamic;
542
543         /* Check that the codec and cpu DAIs are compatible */
544         soc_pcm_init_runtime_hw(substream);
545
546         if (rtd->num_codecs == 1)
547                 codec_dai_name = rtd->codec_dai->name;
548
549         if (soc_pcm_has_symmetry(substream))
550                 runtime->hw.info |= SNDRV_PCM_INFO_JOINT_DUPLEX;
551
552         ret = -EINVAL;
553         if (!runtime->hw.rates) {
554                 printk(KERN_ERR "ASoC: %s <-> %s No matching rates\n",
555                         codec_dai_name, cpu_dai->name);
556                 goto config_err;
557         }
558         if (!runtime->hw.formats) {
559                 printk(KERN_ERR "ASoC: %s <-> %s No matching formats\n",
560                         codec_dai_name, cpu_dai->name);
561                 goto config_err;
562         }
563         if (!runtime->hw.channels_min || !runtime->hw.channels_max ||
564             runtime->hw.channels_min > runtime->hw.channels_max) {
565                 printk(KERN_ERR "ASoC: %s <-> %s No matching channels\n",
566                                 codec_dai_name, cpu_dai->name);
567                 goto config_err;
568         }
569
570         soc_pcm_apply_msb(substream);
571
572         /* Symmetry only applies if we've already got an active stream. */
573         if (cpu_dai->active) {
574                 ret = soc_pcm_apply_symmetry(substream, cpu_dai);
575                 if (ret != 0)
576                         goto config_err;
577         }
578
579         for_each_rtd_codec_dai(rtd, i, codec_dai) {
580                 if (codec_dai->active) {
581                         ret = soc_pcm_apply_symmetry(substream, codec_dai);
582                         if (ret != 0)
583                                 goto config_err;
584                 }
585         }
586
587         pr_debug("ASoC: %s <-> %s info:\n",
588                         codec_dai_name, cpu_dai->name);
589         pr_debug("ASoC: rate mask 0x%x\n", runtime->hw.rates);
590         pr_debug("ASoC: min ch %d max ch %d\n", runtime->hw.channels_min,
591                  runtime->hw.channels_max);
592         pr_debug("ASoC: min rate %d max rate %d\n", runtime->hw.rate_min,
593                  runtime->hw.rate_max);
594
595 dynamic:
596
597         snd_soc_runtime_activate(rtd, substream->stream);
598
599         mutex_unlock(&rtd->card->pcm_mutex);
600         return 0;
601
602 config_err:
603         if (rtd->dai_link->ops->shutdown)
604                 rtd->dai_link->ops->shutdown(substream);
605
606 machine_err:
607         i = rtd->num_codecs;
608
609 codec_dai_err:
610         for_each_rtd_codec_dai_rollback(rtd, i, codec_dai)
611                 snd_soc_dai_shutdown(codec_dai, substream);
612
613 component_err:
614         soc_pcm_components_close(substream, component);
615
616         snd_soc_dai_shutdown(cpu_dai, substream);
617 out:
618         mutex_unlock(&rtd->card->pcm_mutex);
619
620         for_each_rtd_components(rtd, rtdcom, component) {
621                 pm_runtime_mark_last_busy(component->dev);
622                 pm_runtime_put_autosuspend(component->dev);
623         }
624
625         for_each_rtd_codec_dai(rtd, i, codec_dai) {
626                 if (!codec_dai->active)
627                         pinctrl_pm_select_sleep_state(codec_dai->dev);
628         }
629         if (!cpu_dai->active)
630                 pinctrl_pm_select_sleep_state(cpu_dai->dev);
631
632         return ret;
633 }
634
635 /*
636  * Power down the audio subsystem pmdown_time msecs after close is called.
637  * This is to ensure there are no pops or clicks in between any music tracks
638  * due to DAPM power cycling.
639  */
640 static void close_delayed_work(struct work_struct *work)
641 {
642         struct snd_soc_pcm_runtime *rtd =
643                         container_of(work, struct snd_soc_pcm_runtime, delayed_work.work);
644         struct snd_soc_dai *codec_dai = rtd->codec_dais[0];
645
646         mutex_lock_nested(&rtd->card->pcm_mutex, rtd->card->pcm_subclass);
647
648         dev_dbg(rtd->dev, "ASoC: pop wq checking: %s status: %s waiting: %s\n",
649                  codec_dai->driver->playback.stream_name,
650                  codec_dai->playback_active ? "active" : "inactive",
651                  rtd->pop_wait ? "yes" : "no");
652
653         /* are we waiting on this codec DAI stream */
654         if (rtd->pop_wait == 1) {
655                 rtd->pop_wait = 0;
656                 snd_soc_dapm_stream_event(rtd, SNDRV_PCM_STREAM_PLAYBACK,
657                                           SND_SOC_DAPM_STREAM_STOP);
658         }
659
660         mutex_unlock(&rtd->card->pcm_mutex);
661 }
662
663 static void codec2codec_close_delayed_work(struct work_struct *work)
664 {
665         /*
666          * Currently nothing to do for c2c links
667          * Since c2c links are internal nodes in the DAPM graph and
668          * don't interface with the outside world or application layer
669          * we don't have to do any special handling on close.
670          */
671 }
672
673 /*
674  * Called by ALSA when a PCM substream is closed. Private data can be
675  * freed here. The cpu DAI, codec DAI, machine and components are also
676  * shutdown.
677  */
678 static int soc_pcm_close(struct snd_pcm_substream *substream)
679 {
680         struct snd_soc_pcm_runtime *rtd = substream->private_data;
681         struct snd_soc_component *component;
682         struct snd_soc_rtdcom_list *rtdcom;
683         struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
684         struct snd_soc_dai *codec_dai;
685         int i;
686
687         mutex_lock_nested(&rtd->card->pcm_mutex, rtd->card->pcm_subclass);
688
689         snd_soc_runtime_deactivate(rtd, substream->stream);
690
691         /* clear the corresponding DAIs rate when inactive */
692         if (!cpu_dai->active)
693                 cpu_dai->rate = 0;
694
695         for_each_rtd_codec_dai(rtd, i, codec_dai) {
696                 if (!codec_dai->active)
697                         codec_dai->rate = 0;
698         }
699
700         snd_soc_dai_digital_mute(cpu_dai, 1, substream->stream);
701
702         snd_soc_dai_shutdown(cpu_dai, substream);
703
704         for_each_rtd_codec_dai(rtd, i, codec_dai)
705                 snd_soc_dai_shutdown(codec_dai, substream);
706
707         if (rtd->dai_link->ops->shutdown)
708                 rtd->dai_link->ops->shutdown(substream);
709
710         soc_pcm_components_close(substream, NULL);
711
712         if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
713                 if (snd_soc_runtime_ignore_pmdown_time(rtd)) {
714                         /* powered down playback stream now */
715                         snd_soc_dapm_stream_event(rtd,
716                                                   SNDRV_PCM_STREAM_PLAYBACK,
717                                                   SND_SOC_DAPM_STREAM_STOP);
718                 } else {
719                         /* start delayed pop wq here for playback streams */
720                         rtd->pop_wait = 1;
721                         queue_delayed_work(system_power_efficient_wq,
722                                            &rtd->delayed_work,
723                                            msecs_to_jiffies(rtd->pmdown_time));
724                 }
725         } else {
726                 /* capture streams can be powered down now */
727                 snd_soc_dapm_stream_event(rtd, SNDRV_PCM_STREAM_CAPTURE,
728                                           SND_SOC_DAPM_STREAM_STOP);
729         }
730
731         mutex_unlock(&rtd->card->pcm_mutex);
732
733         for_each_rtd_components(rtd, rtdcom, component) {
734                 pm_runtime_mark_last_busy(component->dev);
735                 pm_runtime_put_autosuspend(component->dev);
736         }
737
738         for_each_rtd_codec_dai(rtd, i, codec_dai) {
739                 if (!codec_dai->active)
740                         pinctrl_pm_select_sleep_state(codec_dai->dev);
741         }
742         if (!cpu_dai->active)
743                 pinctrl_pm_select_sleep_state(cpu_dai->dev);
744
745         return 0;
746 }
747
748 /*
749  * Called by ALSA when the PCM substream is prepared, can set format, sample
750  * rate, etc.  This function is non atomic and can be called multiple times,
751  * it can refer to the runtime info.
752  */
753 static int soc_pcm_prepare(struct snd_pcm_substream *substream)
754 {
755         struct snd_soc_pcm_runtime *rtd = substream->private_data;
756         struct snd_soc_component *component;
757         struct snd_soc_rtdcom_list *rtdcom;
758         struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
759         struct snd_soc_dai *codec_dai;
760         int i, ret = 0;
761
762         mutex_lock_nested(&rtd->card->pcm_mutex, rtd->card->pcm_subclass);
763
764         if (rtd->dai_link->ops->prepare) {
765                 ret = rtd->dai_link->ops->prepare(substream);
766                 if (ret < 0) {
767                         dev_err(rtd->card->dev, "ASoC: machine prepare error:"
768                                 " %d\n", ret);
769                         goto out;
770                 }
771         }
772
773         for_each_rtd_components(rtd, rtdcom, component) {
774                 ret = snd_soc_component_prepare(component, substream);
775                 if (ret < 0) {
776                         dev_err(component->dev,
777                                 "ASoC: platform prepare error: %d\n", ret);
778                         goto out;
779                 }
780         }
781
782         for_each_rtd_codec_dai(rtd, i, codec_dai) {
783                 ret = snd_soc_dai_prepare(codec_dai, substream);
784                 if (ret < 0) {
785                         dev_err(codec_dai->dev,
786                                 "ASoC: codec DAI prepare error: %d\n",
787                                 ret);
788                         goto out;
789                 }
790         }
791
792         ret = snd_soc_dai_prepare(cpu_dai, substream);
793         if (ret < 0) {
794                 dev_err(cpu_dai->dev,
795                         "ASoC: cpu DAI prepare error: %d\n", ret);
796                 goto out;
797         }
798
799         /* cancel any delayed stream shutdown that is pending */
800         if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK &&
801             rtd->pop_wait) {
802                 rtd->pop_wait = 0;
803                 cancel_delayed_work(&rtd->delayed_work);
804         }
805
806         snd_soc_dapm_stream_event(rtd, substream->stream,
807                         SND_SOC_DAPM_STREAM_START);
808
809         for_each_rtd_codec_dai(rtd, i, codec_dai)
810                 snd_soc_dai_digital_mute(codec_dai, 0,
811                                          substream->stream);
812         snd_soc_dai_digital_mute(cpu_dai, 0, substream->stream);
813
814 out:
815         mutex_unlock(&rtd->card->pcm_mutex);
816         return ret;
817 }
818
819 static void soc_pcm_codec_params_fixup(struct snd_pcm_hw_params *params,
820                                        unsigned int mask)
821 {
822         struct snd_interval *interval;
823         int channels = hweight_long(mask);
824
825         interval = hw_param_interval(params, SNDRV_PCM_HW_PARAM_CHANNELS);
826         interval->min = channels;
827         interval->max = channels;
828 }
829
830 static int soc_pcm_components_hw_free(struct snd_pcm_substream *substream,
831                                       struct snd_soc_component *last)
832 {
833         struct snd_soc_pcm_runtime *rtd = substream->private_data;
834         struct snd_soc_rtdcom_list *rtdcom;
835         struct snd_soc_component *component;
836         int ret = 0;
837
838         for_each_rtd_components(rtd, rtdcom, component) {
839                 if (component == last)
840                         break;
841
842                 ret |= snd_soc_component_hw_free(component, substream);
843         }
844
845         return ret;
846 }
847
848 /*
849  * Called by ALSA when the hardware params are set by application. This
850  * function can also be called multiple times and can allocate buffers
851  * (using snd_pcm_lib_* ). It's non-atomic.
852  */
853 static int soc_pcm_hw_params(struct snd_pcm_substream *substream,
854                                 struct snd_pcm_hw_params *params)
855 {
856         struct snd_soc_pcm_runtime *rtd = substream->private_data;
857         struct snd_soc_component *component;
858         struct snd_soc_rtdcom_list *rtdcom;
859         struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
860         struct snd_soc_dai *codec_dai;
861         int i, ret = 0;
862
863         mutex_lock_nested(&rtd->card->pcm_mutex, rtd->card->pcm_subclass);
864
865         ret = soc_pcm_params_symmetry(substream, params);
866         if (ret)
867                 goto out;
868
869         if (rtd->dai_link->ops->hw_params) {
870                 ret = rtd->dai_link->ops->hw_params(substream, params);
871                 if (ret < 0) {
872                         dev_err(rtd->card->dev, "ASoC: machine hw_params"
873                                 " failed: %d\n", ret);
874                         goto out;
875                 }
876         }
877
878         for_each_rtd_codec_dai(rtd, i, codec_dai) {
879                 struct snd_pcm_hw_params codec_params;
880
881                 /*
882                  * Skip CODECs which don't support the current stream type,
883                  * the idea being that if a CODEC is not used for the currently
884                  * set up transfer direction, it should not need to be
885                  * configured, especially since the configuration used might
886                  * not even be supported by that CODEC. There may be cases
887                  * however where a CODEC needs to be set up although it is
888                  * actually not being used for the transfer, e.g. if a
889                  * capture-only CODEC is acting as an LRCLK and/or BCLK master
890                  * for the DAI link including a playback-only CODEC.
891                  * If this becomes necessary, we will have to augment the
892                  * machine driver setup with information on how to act, so
893                  * we can do the right thing here.
894                  */
895                 if (!snd_soc_dai_stream_valid(codec_dai, substream->stream))
896                         continue;
897
898                 /* copy params for each codec */
899                 codec_params = *params;
900
901                 /* fixup params based on TDM slot masks */
902                 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK &&
903                     codec_dai->tx_mask)
904                         soc_pcm_codec_params_fixup(&codec_params,
905                                                    codec_dai->tx_mask);
906
907                 if (substream->stream == SNDRV_PCM_STREAM_CAPTURE &&
908                     codec_dai->rx_mask)
909                         soc_pcm_codec_params_fixup(&codec_params,
910                                                    codec_dai->rx_mask);
911
912                 ret = snd_soc_dai_hw_params(codec_dai, substream,
913                                             &codec_params);
914                 if(ret < 0)
915                         goto codec_err;
916
917                 codec_dai->rate = params_rate(&codec_params);
918                 codec_dai->channels = params_channels(&codec_params);
919                 codec_dai->sample_bits = snd_pcm_format_physical_width(
920                                                 params_format(&codec_params));
921
922                 snd_soc_dapm_update_dai(substream, &codec_params, codec_dai);
923         }
924
925         ret = snd_soc_dai_hw_params(cpu_dai, substream, params);
926         if (ret < 0)
927                 goto interface_err;
928
929         /* store the parameters for each DAIs */
930         cpu_dai->rate = params_rate(params);
931         cpu_dai->channels = params_channels(params);
932         cpu_dai->sample_bits =
933                 snd_pcm_format_physical_width(params_format(params));
934
935         snd_soc_dapm_update_dai(substream, params, cpu_dai);
936
937         for_each_rtd_components(rtd, rtdcom, component) {
938                 ret = snd_soc_component_hw_params(component, substream, params);
939                 if (ret < 0) {
940                         dev_err(component->dev,
941                                 "ASoC: %s hw params failed: %d\n",
942                                 component->name, ret);
943                         goto component_err;
944                 }
945         }
946         component = NULL;
947
948 out:
949         mutex_unlock(&rtd->card->pcm_mutex);
950         return ret;
951
952 component_err:
953         soc_pcm_components_hw_free(substream, component);
954
955         snd_soc_dai_hw_free(cpu_dai, substream);
956         cpu_dai->rate = 0;
957
958 interface_err:
959         i = rtd->num_codecs;
960
961 codec_err:
962         for_each_rtd_codec_dai_rollback(rtd, i, codec_dai) {
963                 if (!snd_soc_dai_stream_valid(codec_dai, substream->stream))
964                         continue;
965
966                 snd_soc_dai_hw_free(codec_dai, substream);
967                 codec_dai->rate = 0;
968         }
969
970         if (rtd->dai_link->ops->hw_free)
971                 rtd->dai_link->ops->hw_free(substream);
972
973         mutex_unlock(&rtd->card->pcm_mutex);
974         return ret;
975 }
976
977 /*
978  * Frees resources allocated by hw_params, can be called multiple times
979  */
980 static int soc_pcm_hw_free(struct snd_pcm_substream *substream)
981 {
982         struct snd_soc_pcm_runtime *rtd = substream->private_data;
983         struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
984         struct snd_soc_dai *codec_dai;
985         bool playback = substream->stream == SNDRV_PCM_STREAM_PLAYBACK;
986         int i;
987
988         mutex_lock_nested(&rtd->card->pcm_mutex, rtd->card->pcm_subclass);
989
990         /* clear the corresponding DAIs parameters when going to be inactive */
991         if (cpu_dai->active == 1) {
992                 cpu_dai->rate = 0;
993                 cpu_dai->channels = 0;
994                 cpu_dai->sample_bits = 0;
995         }
996
997         for_each_rtd_codec_dai(rtd, i, codec_dai) {
998                 if (codec_dai->active == 1) {
999                         codec_dai->rate = 0;
1000                         codec_dai->channels = 0;
1001                         codec_dai->sample_bits = 0;
1002                 }
1003         }
1004
1005         /* apply codec digital mute */
1006         for_each_rtd_codec_dai(rtd, i, codec_dai) {
1007                 if ((playback && codec_dai->playback_active == 1) ||
1008                     (!playback && codec_dai->capture_active == 1))
1009                         snd_soc_dai_digital_mute(codec_dai, 1,
1010                                                  substream->stream);
1011         }
1012
1013         /* free any machine hw params */
1014         if (rtd->dai_link->ops->hw_free)
1015                 rtd->dai_link->ops->hw_free(substream);
1016
1017         /* free any component resources */
1018         soc_pcm_components_hw_free(substream, NULL);
1019
1020         /* now free hw params for the DAIs  */
1021         for_each_rtd_codec_dai(rtd, i, codec_dai) {
1022                 if (!snd_soc_dai_stream_valid(codec_dai, substream->stream))
1023                         continue;
1024
1025                 snd_soc_dai_hw_free(codec_dai, substream);
1026         }
1027
1028         snd_soc_dai_hw_free(cpu_dai, substream);
1029
1030         mutex_unlock(&rtd->card->pcm_mutex);
1031         return 0;
1032 }
1033
1034 static int soc_pcm_trigger_start(struct snd_pcm_substream *substream, int cmd)
1035 {
1036         struct snd_soc_pcm_runtime *rtd = substream->private_data;
1037         struct snd_soc_component *component;
1038         struct snd_soc_rtdcom_list *rtdcom;
1039         struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
1040         struct snd_soc_dai *codec_dai;
1041         int i, ret;
1042
1043         if (rtd->dai_link->ops->trigger) {
1044                 ret = rtd->dai_link->ops->trigger(substream, cmd);
1045                 if (ret < 0)
1046                         return ret;
1047         }
1048
1049         for_each_rtd_components(rtd, rtdcom, component) {
1050                 ret = snd_soc_component_trigger(component, substream, cmd);
1051                 if (ret < 0)
1052                         return ret;
1053         }
1054
1055         ret = snd_soc_dai_trigger(cpu_dai, substream, cmd);
1056         if (ret < 0)
1057                 return ret;
1058
1059         for_each_rtd_codec_dai(rtd, i, codec_dai) {
1060                 ret = snd_soc_dai_trigger(codec_dai, substream, cmd);
1061                 if (ret < 0)
1062                         return ret;
1063         }
1064
1065         return 0;
1066 }
1067
1068 static int soc_pcm_trigger_stop(struct snd_pcm_substream *substream, int cmd)
1069 {
1070         struct snd_soc_pcm_runtime *rtd = substream->private_data;
1071         struct snd_soc_component *component;
1072         struct snd_soc_rtdcom_list *rtdcom;
1073         struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
1074         struct snd_soc_dai *codec_dai;
1075         int i, ret;
1076
1077         for_each_rtd_codec_dai(rtd, i, codec_dai) {
1078                 ret = snd_soc_dai_trigger(codec_dai, substream, cmd);
1079                 if (ret < 0)
1080                         return ret;
1081         }
1082
1083         ret = snd_soc_dai_trigger(cpu_dai, substream, cmd);
1084         if (ret < 0)
1085                 return ret;
1086
1087         for_each_rtd_components(rtd, rtdcom, component) {
1088                 ret = snd_soc_component_trigger(component, substream, cmd);
1089                 if (ret < 0)
1090                         return ret;
1091         }
1092
1093         if (rtd->dai_link->ops->trigger) {
1094                 ret = rtd->dai_link->ops->trigger(substream, cmd);
1095                 if (ret < 0)
1096                         return ret;
1097         }
1098
1099         return 0;
1100 }
1101
1102 static int soc_pcm_trigger(struct snd_pcm_substream *substream, int cmd)
1103 {
1104         int ret;
1105
1106         switch (cmd) {
1107         case SNDRV_PCM_TRIGGER_START:
1108         case SNDRV_PCM_TRIGGER_RESUME:
1109         case SNDRV_PCM_TRIGGER_PAUSE_RELEASE:
1110                 ret = soc_pcm_trigger_start(substream, cmd);
1111                 break;
1112         case SNDRV_PCM_TRIGGER_STOP:
1113         case SNDRV_PCM_TRIGGER_SUSPEND:
1114         case SNDRV_PCM_TRIGGER_PAUSE_PUSH:
1115                 ret = soc_pcm_trigger_stop(substream, cmd);
1116                 break;
1117         default:
1118                 return -EINVAL;
1119         }
1120
1121         return ret;
1122 }
1123
1124 static int soc_pcm_bespoke_trigger(struct snd_pcm_substream *substream,
1125                                    int cmd)
1126 {
1127         struct snd_soc_pcm_runtime *rtd = substream->private_data;
1128         struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
1129         struct snd_soc_dai *codec_dai;
1130         int i, ret;
1131
1132         for_each_rtd_codec_dai(rtd, i, codec_dai) {
1133                 ret = snd_soc_dai_bespoke_trigger(codec_dai, substream, cmd);
1134                 if (ret < 0)
1135                         return ret;
1136         }
1137
1138         ret = snd_soc_dai_bespoke_trigger(cpu_dai, substream, cmd);
1139         if (ret < 0)
1140                 return ret;
1141
1142         return 0;
1143 }
1144 /*
1145  * soc level wrapper for pointer callback
1146  * If cpu_dai, codec_dai, component driver has the delay callback, then
1147  * the runtime->delay will be updated accordingly.
1148  */
1149 static snd_pcm_uframes_t soc_pcm_pointer(struct snd_pcm_substream *substream)
1150 {
1151         struct snd_soc_pcm_runtime *rtd = substream->private_data;
1152         struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
1153         struct snd_soc_dai *codec_dai;
1154         struct snd_pcm_runtime *runtime = substream->runtime;
1155         snd_pcm_uframes_t offset = 0;
1156         snd_pcm_sframes_t delay = 0;
1157         snd_pcm_sframes_t codec_delay = 0;
1158         int i;
1159
1160         /* clearing the previous total delay */
1161         runtime->delay = 0;
1162
1163         offset = snd_soc_pcm_component_pointer(substream);
1164
1165         /* base delay if assigned in pointer callback */
1166         delay = runtime->delay;
1167
1168         delay += snd_soc_dai_delay(cpu_dai, substream);
1169
1170         for_each_rtd_codec_dai(rtd, i, codec_dai) {
1171                 codec_delay = max(codec_delay,
1172                                   snd_soc_dai_delay(codec_dai, substream));
1173         }
1174         delay += codec_delay;
1175
1176         runtime->delay = delay;
1177
1178         return offset;
1179 }
1180
1181 /* connect a FE and BE */
1182 static int dpcm_be_connect(struct snd_soc_pcm_runtime *fe,
1183                 struct snd_soc_pcm_runtime *be, int stream)
1184 {
1185         struct snd_soc_dpcm *dpcm;
1186         unsigned long flags;
1187 #ifdef CONFIG_DEBUG_FS
1188         char *name;
1189 #endif
1190
1191         /* only add new dpcms */
1192         for_each_dpcm_be(fe, stream, dpcm) {
1193                 if (dpcm->be == be && dpcm->fe == fe)
1194                         return 0;
1195         }
1196
1197         dpcm = kzalloc(sizeof(struct snd_soc_dpcm), GFP_KERNEL);
1198         if (!dpcm)
1199                 return -ENOMEM;
1200
1201         dpcm->be = be;
1202         dpcm->fe = fe;
1203         be->dpcm[stream].runtime = fe->dpcm[stream].runtime;
1204         dpcm->state = SND_SOC_DPCM_LINK_STATE_NEW;
1205         spin_lock_irqsave(&fe->card->dpcm_lock, flags);
1206         list_add(&dpcm->list_be, &fe->dpcm[stream].be_clients);
1207         list_add(&dpcm->list_fe, &be->dpcm[stream].fe_clients);
1208         spin_unlock_irqrestore(&fe->card->dpcm_lock, flags);
1209
1210         dev_dbg(fe->dev, "connected new DPCM %s path %s %s %s\n",
1211                         stream ? "capture" : "playback",  fe->dai_link->name,
1212                         stream ? "<-" : "->", be->dai_link->name);
1213
1214 #ifdef CONFIG_DEBUG_FS
1215         name = kasprintf(GFP_KERNEL, "%s:%s", be->dai_link->name,
1216                          stream ? "capture" : "playback");
1217         if (name) {
1218                 dpcm->debugfs_state = debugfs_create_dir(name,
1219                                                          fe->debugfs_dpcm_root);
1220                 debugfs_create_u32("state", 0644, dpcm->debugfs_state,
1221                                    &dpcm->state);
1222                 kfree(name);
1223         }
1224 #endif
1225         return 1;
1226 }
1227
1228 /* reparent a BE onto another FE */
1229 static void dpcm_be_reparent(struct snd_soc_pcm_runtime *fe,
1230                         struct snd_soc_pcm_runtime *be, int stream)
1231 {
1232         struct snd_soc_dpcm *dpcm;
1233         struct snd_pcm_substream *fe_substream, *be_substream;
1234
1235         /* reparent if BE is connected to other FEs */
1236         if (!be->dpcm[stream].users)
1237                 return;
1238
1239         be_substream = snd_soc_dpcm_get_substream(be, stream);
1240
1241         for_each_dpcm_fe(be, stream, dpcm) {
1242                 if (dpcm->fe == fe)
1243                         continue;
1244
1245                 dev_dbg(fe->dev, "reparent %s path %s %s %s\n",
1246                         stream ? "capture" : "playback",
1247                         dpcm->fe->dai_link->name,
1248                         stream ? "<-" : "->", dpcm->be->dai_link->name);
1249
1250                 fe_substream = snd_soc_dpcm_get_substream(dpcm->fe, stream);
1251                 be_substream->runtime = fe_substream->runtime;
1252                 break;
1253         }
1254 }
1255
1256 /* disconnect a BE and FE */
1257 void dpcm_be_disconnect(struct snd_soc_pcm_runtime *fe, int stream)
1258 {
1259         struct snd_soc_dpcm *dpcm, *d;
1260         unsigned long flags;
1261
1262         for_each_dpcm_be_safe(fe, stream, dpcm, d) {
1263                 dev_dbg(fe->dev, "ASoC: BE %s disconnect check for %s\n",
1264                                 stream ? "capture" : "playback",
1265                                 dpcm->be->dai_link->name);
1266
1267                 if (dpcm->state != SND_SOC_DPCM_LINK_STATE_FREE)
1268                         continue;
1269
1270                 dev_dbg(fe->dev, "freed DSP %s path %s %s %s\n",
1271                         stream ? "capture" : "playback", fe->dai_link->name,
1272                         stream ? "<-" : "->", dpcm->be->dai_link->name);
1273
1274                 /* BEs still alive need new FE */
1275                 dpcm_be_reparent(fe, dpcm->be, stream);
1276
1277 #ifdef CONFIG_DEBUG_FS
1278                 debugfs_remove_recursive(dpcm->debugfs_state);
1279 #endif
1280                 spin_lock_irqsave(&fe->card->dpcm_lock, flags);
1281                 list_del(&dpcm->list_be);
1282                 list_del(&dpcm->list_fe);
1283                 spin_unlock_irqrestore(&fe->card->dpcm_lock, flags);
1284                 kfree(dpcm);
1285         }
1286 }
1287
1288 /* get BE for DAI widget and stream */
1289 static struct snd_soc_pcm_runtime *dpcm_get_be(struct snd_soc_card *card,
1290                 struct snd_soc_dapm_widget *widget, int stream)
1291 {
1292         struct snd_soc_pcm_runtime *be;
1293         struct snd_soc_dai *dai;
1294         int i;
1295
1296         dev_dbg(card->dev, "ASoC: find BE for widget %s\n", widget->name);
1297
1298         if (stream == SNDRV_PCM_STREAM_PLAYBACK) {
1299                 for_each_card_rtds(card, be) {
1300
1301                         if (!be->dai_link->no_pcm)
1302                                 continue;
1303
1304                         dev_dbg(card->dev, "ASoC: try BE : %s\n",
1305                                 be->cpu_dai->playback_widget ?
1306                                 be->cpu_dai->playback_widget->name : "(not set)");
1307
1308                         if (be->cpu_dai->playback_widget == widget)
1309                                 return be;
1310
1311                         for_each_rtd_codec_dai(be, i, dai) {
1312                                 if (dai->playback_widget == widget)
1313                                         return be;
1314                         }
1315                 }
1316         } else {
1317
1318                 for_each_card_rtds(card, be) {
1319
1320                         if (!be->dai_link->no_pcm)
1321                                 continue;
1322
1323                         dev_dbg(card->dev, "ASoC: try BE %s\n",
1324                                 be->cpu_dai->capture_widget ?
1325                                 be->cpu_dai->capture_widget->name : "(not set)");
1326
1327                         if (be->cpu_dai->capture_widget == widget)
1328                                 return be;
1329
1330                         for_each_rtd_codec_dai(be, i, dai) {
1331                                 if (dai->capture_widget == widget)
1332                                         return be;
1333                         }
1334                 }
1335         }
1336
1337         /* dai link name and stream name set correctly ? */
1338         dev_err(card->dev, "ASoC: can't get %s BE for %s\n",
1339                 stream ? "capture" : "playback", widget->name);
1340         return NULL;
1341 }
1342
1343 static inline struct snd_soc_dapm_widget *
1344         dai_get_widget(struct snd_soc_dai *dai, int stream)
1345 {
1346         if (stream == SNDRV_PCM_STREAM_PLAYBACK)
1347                 return dai->playback_widget;
1348         else
1349                 return dai->capture_widget;
1350 }
1351
1352 static int widget_in_list(struct snd_soc_dapm_widget_list *list,
1353                 struct snd_soc_dapm_widget *widget)
1354 {
1355         int i;
1356
1357         for (i = 0; i < list->num_widgets; i++) {
1358                 if (widget == list->widgets[i])
1359                         return 1;
1360         }
1361
1362         return 0;
1363 }
1364
1365 static bool dpcm_end_walk_at_be(struct snd_soc_dapm_widget *widget,
1366                 enum snd_soc_dapm_direction dir)
1367 {
1368         struct snd_soc_card *card = widget->dapm->card;
1369         struct snd_soc_pcm_runtime *rtd;
1370         struct snd_soc_dai *dai;
1371         int i;
1372
1373         if (dir == SND_SOC_DAPM_DIR_OUT) {
1374                 for_each_card_rtds(card, rtd) {
1375                         if (!rtd->dai_link->no_pcm)
1376                                 continue;
1377
1378                         if (rtd->cpu_dai->playback_widget == widget)
1379                                 return true;
1380
1381                         for_each_rtd_codec_dai(rtd, i, dai) {
1382                                 if (dai->playback_widget == widget)
1383                                         return true;
1384                         }
1385                 }
1386         } else { /* SND_SOC_DAPM_DIR_IN */
1387                 for_each_card_rtds(card, rtd) {
1388                         if (!rtd->dai_link->no_pcm)
1389                                 continue;
1390
1391                         if (rtd->cpu_dai->capture_widget == widget)
1392                                 return true;
1393
1394                         for_each_rtd_codec_dai(rtd, i, dai) {
1395                                 if (dai->capture_widget == widget)
1396                                         return true;
1397                         }
1398                 }
1399         }
1400
1401         return false;
1402 }
1403
1404 int dpcm_path_get(struct snd_soc_pcm_runtime *fe,
1405         int stream, struct snd_soc_dapm_widget_list **list)
1406 {
1407         struct snd_soc_dai *cpu_dai = fe->cpu_dai;
1408         int paths;
1409
1410         /* get number of valid DAI paths and their widgets */
1411         paths = snd_soc_dapm_dai_get_connected_widgets(cpu_dai, stream, list,
1412                         dpcm_end_walk_at_be);
1413
1414         dev_dbg(fe->dev, "ASoC: found %d audio %s paths\n", paths,
1415                         stream ? "capture" : "playback");
1416
1417         return paths;
1418 }
1419
1420 static int dpcm_prune_paths(struct snd_soc_pcm_runtime *fe, int stream,
1421         struct snd_soc_dapm_widget_list **list_)
1422 {
1423         struct snd_soc_dpcm *dpcm;
1424         struct snd_soc_dapm_widget_list *list = *list_;
1425         struct snd_soc_dapm_widget *widget;
1426         struct snd_soc_dai *dai;
1427         int prune = 0;
1428         int do_prune;
1429
1430         /* Destroy any old FE <--> BE connections */
1431         for_each_dpcm_be(fe, stream, dpcm) {
1432                 unsigned int i;
1433
1434                 /* is there a valid CPU DAI widget for this BE */
1435                 widget = dai_get_widget(dpcm->be->cpu_dai, stream);
1436
1437                 /* prune the BE if it's no longer in our active list */
1438                 if (widget && widget_in_list(list, widget))
1439                         continue;
1440
1441                 /* is there a valid CODEC DAI widget for this BE */
1442                 do_prune = 1;
1443                 for_each_rtd_codec_dai(dpcm->be, i, dai) {
1444                         widget = dai_get_widget(dai, stream);
1445
1446                         /* prune the BE if it's no longer in our active list */
1447                         if (widget && widget_in_list(list, widget))
1448                                 do_prune = 0;
1449                 }
1450                 if (!do_prune)
1451                         continue;
1452
1453                 dev_dbg(fe->dev, "ASoC: pruning %s BE %s for %s\n",
1454                         stream ? "capture" : "playback",
1455                         dpcm->be->dai_link->name, fe->dai_link->name);
1456                 dpcm->state = SND_SOC_DPCM_LINK_STATE_FREE;
1457                 dpcm->be->dpcm[stream].runtime_update = SND_SOC_DPCM_UPDATE_BE;
1458                 prune++;
1459         }
1460
1461         dev_dbg(fe->dev, "ASoC: found %d old BE paths for pruning\n", prune);
1462         return prune;
1463 }
1464
1465 static int dpcm_add_paths(struct snd_soc_pcm_runtime *fe, int stream,
1466         struct snd_soc_dapm_widget_list **list_)
1467 {
1468         struct snd_soc_card *card = fe->card;
1469         struct snd_soc_dapm_widget_list *list = *list_;
1470         struct snd_soc_pcm_runtime *be;
1471         int i, new = 0, err;
1472
1473         /* Create any new FE <--> BE connections */
1474         for (i = 0; i < list->num_widgets; i++) {
1475
1476                 switch (list->widgets[i]->id) {
1477                 case snd_soc_dapm_dai_in:
1478                         if (stream != SNDRV_PCM_STREAM_PLAYBACK)
1479                                 continue;
1480                         break;
1481                 case snd_soc_dapm_dai_out:
1482                         if (stream != SNDRV_PCM_STREAM_CAPTURE)
1483                                 continue;
1484                         break;
1485                 default:
1486                         continue;
1487                 }
1488
1489                 /* is there a valid BE rtd for this widget */
1490                 be = dpcm_get_be(card, list->widgets[i], stream);
1491                 if (!be) {
1492                         dev_err(fe->dev, "ASoC: no BE found for %s\n",
1493                                         list->widgets[i]->name);
1494                         continue;
1495                 }
1496
1497                 /* make sure BE is a real BE */
1498                 if (!be->dai_link->no_pcm)
1499                         continue;
1500
1501                 /* don't connect if FE is not running */
1502                 if (!fe->dpcm[stream].runtime && !fe->fe_compr)
1503                         continue;
1504
1505                 /* newly connected FE and BE */
1506                 err = dpcm_be_connect(fe, be, stream);
1507                 if (err < 0) {
1508                         dev_err(fe->dev, "ASoC: can't connect %s\n",
1509                                 list->widgets[i]->name);
1510                         break;
1511                 } else if (err == 0) /* already connected */
1512                         continue;
1513
1514                 /* new */
1515                 be->dpcm[stream].runtime_update = SND_SOC_DPCM_UPDATE_BE;
1516                 new++;
1517         }
1518
1519         dev_dbg(fe->dev, "ASoC: found %d new BE paths\n", new);
1520         return new;
1521 }
1522
1523 /*
1524  * Find the corresponding BE DAIs that source or sink audio to this
1525  * FE substream.
1526  */
1527 int dpcm_process_paths(struct snd_soc_pcm_runtime *fe,
1528         int stream, struct snd_soc_dapm_widget_list **list, int new)
1529 {
1530         if (new)
1531                 return dpcm_add_paths(fe, stream, list);
1532         else
1533                 return dpcm_prune_paths(fe, stream, list);
1534 }
1535
1536 void dpcm_clear_pending_state(struct snd_soc_pcm_runtime *fe, int stream)
1537 {
1538         struct snd_soc_dpcm *dpcm;
1539         unsigned long flags;
1540
1541         spin_lock_irqsave(&fe->card->dpcm_lock, flags);
1542         for_each_dpcm_be(fe, stream, dpcm)
1543                 dpcm->be->dpcm[stream].runtime_update =
1544                                                 SND_SOC_DPCM_UPDATE_NO;
1545         spin_unlock_irqrestore(&fe->card->dpcm_lock, flags);
1546 }
1547
1548 static void dpcm_be_dai_startup_unwind(struct snd_soc_pcm_runtime *fe,
1549         int stream)
1550 {
1551         struct snd_soc_dpcm *dpcm;
1552
1553         /* disable any enabled and non active backends */
1554         for_each_dpcm_be(fe, stream, dpcm) {
1555
1556                 struct snd_soc_pcm_runtime *be = dpcm->be;
1557                 struct snd_pcm_substream *be_substream =
1558                         snd_soc_dpcm_get_substream(be, stream);
1559
1560                 if (be->dpcm[stream].users == 0)
1561                         dev_err(be->dev, "ASoC: no users %s at close - state %d\n",
1562                                 stream ? "capture" : "playback",
1563                                 be->dpcm[stream].state);
1564
1565                 if (--be->dpcm[stream].users != 0)
1566                         continue;
1567
1568                 if (be->dpcm[stream].state != SND_SOC_DPCM_STATE_OPEN)
1569                         continue;
1570
1571                 soc_pcm_close(be_substream);
1572                 be_substream->runtime = NULL;
1573                 be->dpcm[stream].state = SND_SOC_DPCM_STATE_CLOSE;
1574         }
1575 }
1576
1577 int dpcm_be_dai_startup(struct snd_soc_pcm_runtime *fe, int stream)
1578 {
1579         struct snd_soc_dpcm *dpcm;
1580         int err, count = 0;
1581
1582         /* only startup BE DAIs that are either sinks or sources to this FE DAI */
1583         for_each_dpcm_be(fe, stream, dpcm) {
1584
1585                 struct snd_soc_pcm_runtime *be = dpcm->be;
1586                 struct snd_pcm_substream *be_substream =
1587                         snd_soc_dpcm_get_substream(be, stream);
1588
1589                 if (!be_substream) {
1590                         dev_err(be->dev, "ASoC: no backend %s stream\n",
1591                                 stream ? "capture" : "playback");
1592                         continue;
1593                 }
1594
1595                 /* is this op for this BE ? */
1596                 if (!snd_soc_dpcm_be_can_update(fe, be, stream))
1597                         continue;
1598
1599                 /* first time the dpcm is open ? */
1600                 if (be->dpcm[stream].users == DPCM_MAX_BE_USERS)
1601                         dev_err(be->dev, "ASoC: too many users %s at open %d\n",
1602                                 stream ? "capture" : "playback",
1603                                 be->dpcm[stream].state);
1604
1605                 if (be->dpcm[stream].users++ != 0)
1606                         continue;
1607
1608                 if ((be->dpcm[stream].state != SND_SOC_DPCM_STATE_NEW) &&
1609                     (be->dpcm[stream].state != SND_SOC_DPCM_STATE_CLOSE))
1610                         continue;
1611
1612                 dev_dbg(be->dev, "ASoC: open %s BE %s\n",
1613                         stream ? "capture" : "playback", be->dai_link->name);
1614
1615                 be_substream->runtime = be->dpcm[stream].runtime;
1616                 err = soc_pcm_open(be_substream);
1617                 if (err < 0) {
1618                         dev_err(be->dev, "ASoC: BE open failed %d\n", err);
1619                         be->dpcm[stream].users--;
1620                         if (be->dpcm[stream].users < 0)
1621                                 dev_err(be->dev, "ASoC: no users %s at unwind %d\n",
1622                                         stream ? "capture" : "playback",
1623                                         be->dpcm[stream].state);
1624
1625                         be->dpcm[stream].state = SND_SOC_DPCM_STATE_CLOSE;
1626                         goto unwind;
1627                 }
1628
1629                 be->dpcm[stream].state = SND_SOC_DPCM_STATE_OPEN;
1630                 count++;
1631         }
1632
1633         return count;
1634
1635 unwind:
1636         /* disable any enabled and non active backends */
1637         for_each_dpcm_be_rollback(fe, stream, dpcm) {
1638                 struct snd_soc_pcm_runtime *be = dpcm->be;
1639                 struct snd_pcm_substream *be_substream =
1640                         snd_soc_dpcm_get_substream(be, stream);
1641
1642                 if (!snd_soc_dpcm_be_can_update(fe, be, stream))
1643                         continue;
1644
1645                 if (be->dpcm[stream].users == 0)
1646                         dev_err(be->dev, "ASoC: no users %s at close %d\n",
1647                                 stream ? "capture" : "playback",
1648                                 be->dpcm[stream].state);
1649
1650                 if (--be->dpcm[stream].users != 0)
1651                         continue;
1652
1653                 if (be->dpcm[stream].state != SND_SOC_DPCM_STATE_OPEN)
1654                         continue;
1655
1656                 soc_pcm_close(be_substream);
1657                 be_substream->runtime = NULL;
1658                 be->dpcm[stream].state = SND_SOC_DPCM_STATE_CLOSE;
1659         }
1660
1661         return err;
1662 }
1663
1664 static void dpcm_init_runtime_hw(struct snd_pcm_runtime *runtime,
1665                                  struct snd_soc_pcm_stream *stream)
1666 {
1667         runtime->hw.rate_min = stream->rate_min;
1668         runtime->hw.rate_max = min_not_zero(stream->rate_max, UINT_MAX);
1669         runtime->hw.channels_min = stream->channels_min;
1670         runtime->hw.channels_max = stream->channels_max;
1671         if (runtime->hw.formats)
1672                 runtime->hw.formats &= stream->formats;
1673         else
1674                 runtime->hw.formats = stream->formats;
1675         runtime->hw.rates = stream->rates;
1676 }
1677
1678 static void dpcm_runtime_merge_format(struct snd_pcm_substream *substream,
1679                                       u64 *formats)
1680 {
1681         struct snd_soc_pcm_runtime *fe = substream->private_data;
1682         struct snd_soc_dpcm *dpcm;
1683         struct snd_soc_dai *dai;
1684         int stream = substream->stream;
1685
1686         if (!fe->dai_link->dpcm_merged_format)
1687                 return;
1688
1689         /*
1690          * It returns merged BE codec format
1691          * if FE want to use it (= dpcm_merged_format)
1692          */
1693
1694         for_each_dpcm_be(fe, stream, dpcm) {
1695                 struct snd_soc_pcm_runtime *be = dpcm->be;
1696                 struct snd_soc_dai_driver *codec_dai_drv;
1697                 struct snd_soc_pcm_stream *codec_stream;
1698                 int i;
1699
1700                 for_each_rtd_codec_dai(be, i, dai) {
1701                         /*
1702                          * Skip CODECs which don't support the current stream
1703                          * type. See soc_pcm_init_runtime_hw() for more details
1704                          */
1705                         if (!snd_soc_dai_stream_valid(dai, stream))
1706                                 continue;
1707
1708                         codec_dai_drv = dai->driver;
1709                         if (stream == SNDRV_PCM_STREAM_PLAYBACK)
1710                                 codec_stream = &codec_dai_drv->playback;
1711                         else
1712                                 codec_stream = &codec_dai_drv->capture;
1713
1714                         *formats &= codec_stream->formats;
1715                 }
1716         }
1717 }
1718
1719 static void dpcm_runtime_merge_chan(struct snd_pcm_substream *substream,
1720                                     unsigned int *channels_min,
1721                                     unsigned int *channels_max)
1722 {
1723         struct snd_soc_pcm_runtime *fe = substream->private_data;
1724         struct snd_soc_dpcm *dpcm;
1725         int stream = substream->stream;
1726
1727         if (!fe->dai_link->dpcm_merged_chan)
1728                 return;
1729
1730         /*
1731          * It returns merged BE codec channel;
1732          * if FE want to use it (= dpcm_merged_chan)
1733          */
1734
1735         for_each_dpcm_be(fe, stream, dpcm) {
1736                 struct snd_soc_pcm_runtime *be = dpcm->be;
1737                 struct snd_soc_dai_driver *cpu_dai_drv =  be->cpu_dai->driver;
1738                 struct snd_soc_dai_driver *codec_dai_drv;
1739                 struct snd_soc_pcm_stream *codec_stream;
1740                 struct snd_soc_pcm_stream *cpu_stream;
1741
1742                 if (stream == SNDRV_PCM_STREAM_PLAYBACK)
1743                         cpu_stream = &cpu_dai_drv->playback;
1744                 else
1745                         cpu_stream = &cpu_dai_drv->capture;
1746
1747                 *channels_min = max(*channels_min, cpu_stream->channels_min);
1748                 *channels_max = min(*channels_max, cpu_stream->channels_max);
1749
1750                 /*
1751                  * chan min/max cannot be enforced if there are multiple CODEC
1752                  * DAIs connected to a single CPU DAI, use CPU DAI's directly
1753                  */
1754                 if (be->num_codecs == 1) {
1755                         codec_dai_drv = be->codec_dais[0]->driver;
1756
1757                         if (stream == SNDRV_PCM_STREAM_PLAYBACK)
1758                                 codec_stream = &codec_dai_drv->playback;
1759                         else
1760                                 codec_stream = &codec_dai_drv->capture;
1761
1762                         *channels_min = max(*channels_min,
1763                                             codec_stream->channels_min);
1764                         *channels_max = min(*channels_max,
1765                                             codec_stream->channels_max);
1766                 }
1767         }
1768 }
1769
1770 static void dpcm_runtime_merge_rate(struct snd_pcm_substream *substream,
1771                                     unsigned int *rates,
1772                                     unsigned int *rate_min,
1773                                     unsigned int *rate_max)
1774 {
1775         struct snd_soc_pcm_runtime *fe = substream->private_data;
1776         struct snd_soc_dpcm *dpcm;
1777         int stream = substream->stream;
1778
1779         if (!fe->dai_link->dpcm_merged_rate)
1780                 return;
1781
1782         /*
1783          * It returns merged BE codec channel;
1784          * if FE want to use it (= dpcm_merged_chan)
1785          */
1786
1787         for_each_dpcm_be(fe, stream, dpcm) {
1788                 struct snd_soc_pcm_runtime *be = dpcm->be;
1789                 struct snd_soc_dai_driver *cpu_dai_drv =  be->cpu_dai->driver;
1790                 struct snd_soc_dai_driver *codec_dai_drv;
1791                 struct snd_soc_pcm_stream *codec_stream;
1792                 struct snd_soc_pcm_stream *cpu_stream;
1793                 struct snd_soc_dai *dai;
1794                 int i;
1795
1796                 if (stream == SNDRV_PCM_STREAM_PLAYBACK)
1797                         cpu_stream = &cpu_dai_drv->playback;
1798                 else
1799                         cpu_stream = &cpu_dai_drv->capture;
1800
1801                 *rate_min = max(*rate_min, cpu_stream->rate_min);
1802                 *rate_max = min_not_zero(*rate_max, cpu_stream->rate_max);
1803                 *rates = snd_pcm_rate_mask_intersect(*rates, cpu_stream->rates);
1804
1805                 for_each_rtd_codec_dai(be, i, dai) {
1806                         /*
1807                          * Skip CODECs which don't support the current stream
1808                          * type. See soc_pcm_init_runtime_hw() for more details
1809                          */
1810                         if (!snd_soc_dai_stream_valid(dai, stream))
1811                                 continue;
1812
1813                         codec_dai_drv = dai->driver;
1814                         if (stream == SNDRV_PCM_STREAM_PLAYBACK)
1815                                 codec_stream = &codec_dai_drv->playback;
1816                         else
1817                                 codec_stream = &codec_dai_drv->capture;
1818
1819                         *rate_min = max(*rate_min, codec_stream->rate_min);
1820                         *rate_max = min_not_zero(*rate_max,
1821                                                  codec_stream->rate_max);
1822                         *rates = snd_pcm_rate_mask_intersect(*rates,
1823                                                 codec_stream->rates);
1824                 }
1825         }
1826 }
1827
1828 static void dpcm_set_fe_runtime(struct snd_pcm_substream *substream)
1829 {
1830         struct snd_pcm_runtime *runtime = substream->runtime;
1831         struct snd_soc_pcm_runtime *rtd = substream->private_data;
1832         struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
1833         struct snd_soc_dai_driver *cpu_dai_drv = cpu_dai->driver;
1834
1835         if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
1836                 dpcm_init_runtime_hw(runtime, &cpu_dai_drv->playback);
1837         else
1838                 dpcm_init_runtime_hw(runtime, &cpu_dai_drv->capture);
1839
1840         dpcm_runtime_merge_format(substream, &runtime->hw.formats);
1841         dpcm_runtime_merge_chan(substream, &runtime->hw.channels_min,
1842                                 &runtime->hw.channels_max);
1843         dpcm_runtime_merge_rate(substream, &runtime->hw.rates,
1844                                 &runtime->hw.rate_min, &runtime->hw.rate_max);
1845 }
1846
1847 static int dpcm_fe_dai_do_trigger(struct snd_pcm_substream *substream, int cmd);
1848
1849 /* Set FE's runtime_update state; the state is protected via PCM stream lock
1850  * for avoiding the race with trigger callback.
1851  * If the state is unset and a trigger is pending while the previous operation,
1852  * process the pending trigger action here.
1853  */
1854 static void dpcm_set_fe_update_state(struct snd_soc_pcm_runtime *fe,
1855                                      int stream, enum snd_soc_dpcm_update state)
1856 {
1857         struct snd_pcm_substream *substream =
1858                 snd_soc_dpcm_get_substream(fe, stream);
1859
1860         snd_pcm_stream_lock_irq(substream);
1861         if (state == SND_SOC_DPCM_UPDATE_NO && fe->dpcm[stream].trigger_pending) {
1862                 dpcm_fe_dai_do_trigger(substream,
1863                                        fe->dpcm[stream].trigger_pending - 1);
1864                 fe->dpcm[stream].trigger_pending = 0;
1865         }
1866         fe->dpcm[stream].runtime_update = state;
1867         snd_pcm_stream_unlock_irq(substream);
1868 }
1869
1870 static int dpcm_apply_symmetry(struct snd_pcm_substream *fe_substream,
1871                                int stream)
1872 {
1873         struct snd_soc_dpcm *dpcm;
1874         struct snd_soc_pcm_runtime *fe = fe_substream->private_data;
1875         struct snd_soc_dai *fe_cpu_dai = fe->cpu_dai;
1876         int err;
1877
1878         /* apply symmetry for FE */
1879         if (soc_pcm_has_symmetry(fe_substream))
1880                 fe_substream->runtime->hw.info |= SNDRV_PCM_INFO_JOINT_DUPLEX;
1881
1882         /* Symmetry only applies if we've got an active stream. */
1883         if (fe_cpu_dai->active) {
1884                 err = soc_pcm_apply_symmetry(fe_substream, fe_cpu_dai);
1885                 if (err < 0)
1886                         return err;
1887         }
1888
1889         /* apply symmetry for BE */
1890         for_each_dpcm_be(fe, stream, dpcm) {
1891                 struct snd_soc_pcm_runtime *be = dpcm->be;
1892                 struct snd_pcm_substream *be_substream =
1893                         snd_soc_dpcm_get_substream(be, stream);
1894                 struct snd_soc_pcm_runtime *rtd;
1895                 struct snd_soc_dai *codec_dai;
1896                 int i;
1897
1898                 /* A backend may not have the requested substream */
1899                 if (!be_substream)
1900                         continue;
1901
1902                 rtd = be_substream->private_data;
1903                 if (rtd->dai_link->be_hw_params_fixup)
1904                         continue;
1905
1906                 if (soc_pcm_has_symmetry(be_substream))
1907                         be_substream->runtime->hw.info |= SNDRV_PCM_INFO_JOINT_DUPLEX;
1908
1909                 /* Symmetry only applies if we've got an active stream. */
1910                 if (rtd->cpu_dai->active) {
1911                         err = soc_pcm_apply_symmetry(fe_substream,
1912                                                      rtd->cpu_dai);
1913                         if (err < 0)
1914                                 return err;
1915                 }
1916
1917                 for_each_rtd_codec_dai(rtd, i, codec_dai) {
1918                         if (codec_dai->active) {
1919                                 err = soc_pcm_apply_symmetry(fe_substream,
1920                                                              codec_dai);
1921                                 if (err < 0)
1922                                         return err;
1923                         }
1924                 }
1925         }
1926
1927         return 0;
1928 }
1929
1930 static int dpcm_fe_dai_startup(struct snd_pcm_substream *fe_substream)
1931 {
1932         struct snd_soc_pcm_runtime *fe = fe_substream->private_data;
1933         struct snd_pcm_runtime *runtime = fe_substream->runtime;
1934         int stream = fe_substream->stream, ret = 0;
1935
1936         dpcm_set_fe_update_state(fe, stream, SND_SOC_DPCM_UPDATE_FE);
1937
1938         ret = dpcm_be_dai_startup(fe, fe_substream->stream);
1939         if (ret < 0) {
1940                 dev_err(fe->dev,"ASoC: failed to start some BEs %d\n", ret);
1941                 goto be_err;
1942         }
1943
1944         dev_dbg(fe->dev, "ASoC: open FE %s\n", fe->dai_link->name);
1945
1946         /* start the DAI frontend */
1947         ret = soc_pcm_open(fe_substream);
1948         if (ret < 0) {
1949                 dev_err(fe->dev,"ASoC: failed to start FE %d\n", ret);
1950                 goto unwind;
1951         }
1952
1953         fe->dpcm[stream].state = SND_SOC_DPCM_STATE_OPEN;
1954
1955         dpcm_set_fe_runtime(fe_substream);
1956         snd_pcm_limit_hw_rates(runtime);
1957
1958         ret = dpcm_apply_symmetry(fe_substream, stream);
1959         if (ret < 0) {
1960                 dev_err(fe->dev, "ASoC: failed to apply dpcm symmetry %d\n",
1961                         ret);
1962                 goto unwind;
1963         }
1964
1965         dpcm_set_fe_update_state(fe, stream, SND_SOC_DPCM_UPDATE_NO);
1966         return 0;
1967
1968 unwind:
1969         dpcm_be_dai_startup_unwind(fe, fe_substream->stream);
1970 be_err:
1971         dpcm_set_fe_update_state(fe, stream, SND_SOC_DPCM_UPDATE_NO);
1972         return ret;
1973 }
1974
1975 int dpcm_be_dai_shutdown(struct snd_soc_pcm_runtime *fe, int stream)
1976 {
1977         struct snd_soc_dpcm *dpcm;
1978
1979         /* only shutdown BEs that are either sinks or sources to this FE DAI */
1980         for_each_dpcm_be(fe, stream, dpcm) {
1981
1982                 struct snd_soc_pcm_runtime *be = dpcm->be;
1983                 struct snd_pcm_substream *be_substream =
1984                         snd_soc_dpcm_get_substream(be, stream);
1985
1986                 /* is this op for this BE ? */
1987                 if (!snd_soc_dpcm_be_can_update(fe, be, stream))
1988                         continue;
1989
1990                 if (be->dpcm[stream].users == 0)
1991                         dev_err(be->dev, "ASoC: no users %s at close - state %d\n",
1992                                 stream ? "capture" : "playback",
1993                                 be->dpcm[stream].state);
1994
1995                 if (--be->dpcm[stream].users != 0)
1996                         continue;
1997
1998                 if ((be->dpcm[stream].state != SND_SOC_DPCM_STATE_HW_FREE) &&
1999                     (be->dpcm[stream].state != SND_SOC_DPCM_STATE_OPEN)) {
2000                         soc_pcm_hw_free(be_substream);
2001                         be->dpcm[stream].state = SND_SOC_DPCM_STATE_HW_FREE;
2002                 }
2003
2004                 dev_dbg(be->dev, "ASoC: close BE %s\n",
2005                         be->dai_link->name);
2006
2007                 soc_pcm_close(be_substream);
2008                 be_substream->runtime = NULL;
2009
2010                 be->dpcm[stream].state = SND_SOC_DPCM_STATE_CLOSE;
2011         }
2012         return 0;
2013 }
2014
2015 static int dpcm_fe_dai_shutdown(struct snd_pcm_substream *substream)
2016 {
2017         struct snd_soc_pcm_runtime *fe = substream->private_data;
2018         int stream = substream->stream;
2019
2020         dpcm_set_fe_update_state(fe, stream, SND_SOC_DPCM_UPDATE_FE);
2021
2022         /* shutdown the BEs */
2023         dpcm_be_dai_shutdown(fe, substream->stream);
2024
2025         dev_dbg(fe->dev, "ASoC: close FE %s\n", fe->dai_link->name);
2026
2027         /* now shutdown the frontend */
2028         soc_pcm_close(substream);
2029
2030         /* run the stream event for each BE */
2031         dpcm_dapm_stream_event(fe, stream, SND_SOC_DAPM_STREAM_STOP);
2032
2033         fe->dpcm[stream].state = SND_SOC_DPCM_STATE_CLOSE;
2034         dpcm_set_fe_update_state(fe, stream, SND_SOC_DPCM_UPDATE_NO);
2035         return 0;
2036 }
2037
2038 int dpcm_be_dai_hw_free(struct snd_soc_pcm_runtime *fe, int stream)
2039 {
2040         struct snd_soc_dpcm *dpcm;
2041
2042         /* only hw_params backends that are either sinks or sources
2043          * to this frontend DAI */
2044         for_each_dpcm_be(fe, stream, dpcm) {
2045
2046                 struct snd_soc_pcm_runtime *be = dpcm->be;
2047                 struct snd_pcm_substream *be_substream =
2048                         snd_soc_dpcm_get_substream(be, stream);
2049
2050                 /* is this op for this BE ? */
2051                 if (!snd_soc_dpcm_be_can_update(fe, be, stream))
2052                         continue;
2053
2054                 /* only free hw when no longer used - check all FEs */
2055                 if (!snd_soc_dpcm_can_be_free_stop(fe, be, stream))
2056                                 continue;
2057
2058                 /* do not free hw if this BE is used by other FE */
2059                 if (be->dpcm[stream].users > 1)
2060                         continue;
2061
2062                 if ((be->dpcm[stream].state != SND_SOC_DPCM_STATE_HW_PARAMS) &&
2063                     (be->dpcm[stream].state != SND_SOC_DPCM_STATE_PREPARE) &&
2064                     (be->dpcm[stream].state != SND_SOC_DPCM_STATE_HW_FREE) &&
2065                     (be->dpcm[stream].state != SND_SOC_DPCM_STATE_PAUSED) &&
2066                     (be->dpcm[stream].state != SND_SOC_DPCM_STATE_STOP) &&
2067                     (be->dpcm[stream].state != SND_SOC_DPCM_STATE_SUSPEND))
2068                         continue;
2069
2070                 dev_dbg(be->dev, "ASoC: hw_free BE %s\n",
2071                         be->dai_link->name);
2072
2073                 soc_pcm_hw_free(be_substream);
2074
2075                 be->dpcm[stream].state = SND_SOC_DPCM_STATE_HW_FREE;
2076         }
2077
2078         return 0;
2079 }
2080
2081 static int dpcm_fe_dai_hw_free(struct snd_pcm_substream *substream)
2082 {
2083         struct snd_soc_pcm_runtime *fe = substream->private_data;
2084         int err, stream = substream->stream;
2085
2086         mutex_lock_nested(&fe->card->mutex, SND_SOC_CARD_CLASS_RUNTIME);
2087         dpcm_set_fe_update_state(fe, stream, SND_SOC_DPCM_UPDATE_FE);
2088
2089         dev_dbg(fe->dev, "ASoC: hw_free FE %s\n", fe->dai_link->name);
2090
2091         /* call hw_free on the frontend */
2092         err = soc_pcm_hw_free(substream);
2093         if (err < 0)
2094                 dev_err(fe->dev,"ASoC: hw_free FE %s failed\n",
2095                         fe->dai_link->name);
2096
2097         /* only hw_params backends that are either sinks or sources
2098          * to this frontend DAI */
2099         err = dpcm_be_dai_hw_free(fe, stream);
2100
2101         fe->dpcm[stream].state = SND_SOC_DPCM_STATE_HW_FREE;
2102         dpcm_set_fe_update_state(fe, stream, SND_SOC_DPCM_UPDATE_NO);
2103
2104         mutex_unlock(&fe->card->mutex);
2105         return 0;
2106 }
2107
2108 int dpcm_be_dai_hw_params(struct snd_soc_pcm_runtime *fe, int stream)
2109 {
2110         struct snd_soc_dpcm *dpcm;
2111         int ret;
2112
2113         for_each_dpcm_be(fe, stream, dpcm) {
2114
2115                 struct snd_soc_pcm_runtime *be = dpcm->be;
2116                 struct snd_pcm_substream *be_substream =
2117                         snd_soc_dpcm_get_substream(be, stream);
2118
2119                 /* is this op for this BE ? */
2120                 if (!snd_soc_dpcm_be_can_update(fe, be, stream))
2121                         continue;
2122
2123                 /* copy params for each dpcm */
2124                 memcpy(&dpcm->hw_params, &fe->dpcm[stream].hw_params,
2125                                 sizeof(struct snd_pcm_hw_params));
2126
2127                 /* perform any hw_params fixups */
2128                 if (be->dai_link->be_hw_params_fixup) {
2129                         ret = be->dai_link->be_hw_params_fixup(be,
2130                                         &dpcm->hw_params);
2131                         if (ret < 0) {
2132                                 dev_err(be->dev,
2133                                         "ASoC: hw_params BE fixup failed %d\n",
2134                                         ret);
2135                                 goto unwind;
2136                         }
2137                 }
2138
2139                 /* copy the fixed-up hw params for BE dai */
2140                 memcpy(&be->dpcm[stream].hw_params, &dpcm->hw_params,
2141                        sizeof(struct snd_pcm_hw_params));
2142
2143                 /* only allow hw_params() if no connected FEs are running */
2144                 if (!snd_soc_dpcm_can_be_params(fe, be, stream))
2145                         continue;
2146
2147                 if ((be->dpcm[stream].state != SND_SOC_DPCM_STATE_OPEN) &&
2148                     (be->dpcm[stream].state != SND_SOC_DPCM_STATE_HW_PARAMS) &&
2149                     (be->dpcm[stream].state != SND_SOC_DPCM_STATE_HW_FREE))
2150                         continue;
2151
2152                 dev_dbg(be->dev, "ASoC: hw_params BE %s\n",
2153                         be->dai_link->name);
2154
2155                 ret = soc_pcm_hw_params(be_substream, &dpcm->hw_params);
2156                 if (ret < 0) {
2157                         dev_err(dpcm->be->dev,
2158                                 "ASoC: hw_params BE failed %d\n", ret);
2159                         goto unwind;
2160                 }
2161
2162                 be->dpcm[stream].state = SND_SOC_DPCM_STATE_HW_PARAMS;
2163         }
2164         return 0;
2165
2166 unwind:
2167         /* disable any enabled and non active backends */
2168         for_each_dpcm_be_rollback(fe, stream, dpcm) {
2169                 struct snd_soc_pcm_runtime *be = dpcm->be;
2170                 struct snd_pcm_substream *be_substream =
2171                         snd_soc_dpcm_get_substream(be, stream);
2172
2173                 if (!snd_soc_dpcm_be_can_update(fe, be, stream))
2174                         continue;
2175
2176                 /* only allow hw_free() if no connected FEs are running */
2177                 if (!snd_soc_dpcm_can_be_free_stop(fe, be, stream))
2178                         continue;
2179
2180                 if ((be->dpcm[stream].state != SND_SOC_DPCM_STATE_OPEN) &&
2181                    (be->dpcm[stream].state != SND_SOC_DPCM_STATE_HW_PARAMS) &&
2182                    (be->dpcm[stream].state != SND_SOC_DPCM_STATE_HW_FREE) &&
2183                    (be->dpcm[stream].state != SND_SOC_DPCM_STATE_STOP))
2184                         continue;
2185
2186                 soc_pcm_hw_free(be_substream);
2187         }
2188
2189         return ret;
2190 }
2191
2192 static int dpcm_fe_dai_hw_params(struct snd_pcm_substream *substream,
2193                                  struct snd_pcm_hw_params *params)
2194 {
2195         struct snd_soc_pcm_runtime *fe = substream->private_data;
2196         int ret, stream = substream->stream;
2197
2198         mutex_lock_nested(&fe->card->mutex, SND_SOC_CARD_CLASS_RUNTIME);
2199         dpcm_set_fe_update_state(fe, stream, SND_SOC_DPCM_UPDATE_FE);
2200
2201         memcpy(&fe->dpcm[substream->stream].hw_params, params,
2202                         sizeof(struct snd_pcm_hw_params));
2203         ret = dpcm_be_dai_hw_params(fe, substream->stream);
2204         if (ret < 0) {
2205                 dev_err(fe->dev,"ASoC: hw_params BE failed %d\n", ret);
2206                 goto out;
2207         }
2208
2209         dev_dbg(fe->dev, "ASoC: hw_params FE %s rate %d chan %x fmt %d\n",
2210                         fe->dai_link->name, params_rate(params),
2211                         params_channels(params), params_format(params));
2212
2213         /* call hw_params on the frontend */
2214         ret = soc_pcm_hw_params(substream, params);
2215         if (ret < 0) {
2216                 dev_err(fe->dev,"ASoC: hw_params FE failed %d\n", ret);
2217                 dpcm_be_dai_hw_free(fe, stream);
2218          } else
2219                 fe->dpcm[stream].state = SND_SOC_DPCM_STATE_HW_PARAMS;
2220
2221 out:
2222         dpcm_set_fe_update_state(fe, stream, SND_SOC_DPCM_UPDATE_NO);
2223         mutex_unlock(&fe->card->mutex);
2224         return ret;
2225 }
2226
2227 static int dpcm_do_trigger(struct snd_soc_dpcm *dpcm,
2228                 struct snd_pcm_substream *substream, int cmd)
2229 {
2230         int ret;
2231
2232         dev_dbg(dpcm->be->dev, "ASoC: trigger BE %s cmd %d\n",
2233                         dpcm->be->dai_link->name, cmd);
2234
2235         ret = soc_pcm_trigger(substream, cmd);
2236         if (ret < 0)
2237                 dev_err(dpcm->be->dev,"ASoC: trigger BE failed %d\n", ret);
2238
2239         return ret;
2240 }
2241
2242 int dpcm_be_dai_trigger(struct snd_soc_pcm_runtime *fe, int stream,
2243                                int cmd)
2244 {
2245         struct snd_soc_dpcm *dpcm;
2246         int ret = 0;
2247
2248         for_each_dpcm_be(fe, stream, dpcm) {
2249
2250                 struct snd_soc_pcm_runtime *be = dpcm->be;
2251                 struct snd_pcm_substream *be_substream =
2252                         snd_soc_dpcm_get_substream(be, stream);
2253
2254                 /* is this op for this BE ? */
2255                 if (!snd_soc_dpcm_be_can_update(fe, be, stream))
2256                         continue;
2257
2258                 switch (cmd) {
2259                 case SNDRV_PCM_TRIGGER_START:
2260                         if ((be->dpcm[stream].state != SND_SOC_DPCM_STATE_PREPARE) &&
2261                             (be->dpcm[stream].state != SND_SOC_DPCM_STATE_STOP))
2262                                 continue;
2263
2264                         ret = dpcm_do_trigger(dpcm, be_substream, cmd);
2265                         if (ret)
2266                                 return ret;
2267
2268                         be->dpcm[stream].state = SND_SOC_DPCM_STATE_START;
2269                         break;
2270                 case SNDRV_PCM_TRIGGER_RESUME:
2271                         if ((be->dpcm[stream].state != SND_SOC_DPCM_STATE_SUSPEND))
2272                                 continue;
2273
2274                         ret = dpcm_do_trigger(dpcm, be_substream, cmd);
2275                         if (ret)
2276                                 return ret;
2277
2278                         be->dpcm[stream].state = SND_SOC_DPCM_STATE_START;
2279                         break;
2280                 case SNDRV_PCM_TRIGGER_PAUSE_RELEASE:
2281                         if ((be->dpcm[stream].state != SND_SOC_DPCM_STATE_PAUSED))
2282                                 continue;
2283
2284                         ret = dpcm_do_trigger(dpcm, be_substream, cmd);
2285                         if (ret)
2286                                 return ret;
2287
2288                         be->dpcm[stream].state = SND_SOC_DPCM_STATE_START;
2289                         break;
2290                 case SNDRV_PCM_TRIGGER_STOP:
2291                         if (be->dpcm[stream].state != SND_SOC_DPCM_STATE_START)
2292                                 continue;
2293
2294                         if (!snd_soc_dpcm_can_be_free_stop(fe, be, stream))
2295                                 continue;
2296
2297                         ret = dpcm_do_trigger(dpcm, be_substream, cmd);
2298                         if (ret)
2299                                 return ret;
2300
2301                         be->dpcm[stream].state = SND_SOC_DPCM_STATE_STOP;
2302                         break;
2303                 case SNDRV_PCM_TRIGGER_SUSPEND:
2304                         if (be->dpcm[stream].state != SND_SOC_DPCM_STATE_START)
2305                                 continue;
2306
2307                         if (!snd_soc_dpcm_can_be_free_stop(fe, be, stream))
2308                                 continue;
2309
2310                         ret = dpcm_do_trigger(dpcm, be_substream, cmd);
2311                         if (ret)
2312                                 return ret;
2313
2314                         be->dpcm[stream].state = SND_SOC_DPCM_STATE_SUSPEND;
2315                         break;
2316                 case SNDRV_PCM_TRIGGER_PAUSE_PUSH:
2317                         if (be->dpcm[stream].state != SND_SOC_DPCM_STATE_START)
2318                                 continue;
2319
2320                         if (!snd_soc_dpcm_can_be_free_stop(fe, be, stream))
2321                                 continue;
2322
2323                         ret = dpcm_do_trigger(dpcm, be_substream, cmd);
2324                         if (ret)
2325                                 return ret;
2326
2327                         be->dpcm[stream].state = SND_SOC_DPCM_STATE_PAUSED;
2328                         break;
2329                 }
2330         }
2331
2332         return ret;
2333 }
2334 EXPORT_SYMBOL_GPL(dpcm_be_dai_trigger);
2335
2336 static int dpcm_dai_trigger_fe_be(struct snd_pcm_substream *substream,
2337                                   int cmd, bool fe_first)
2338 {
2339         struct snd_soc_pcm_runtime *fe = substream->private_data;
2340         int ret;
2341
2342         /* call trigger on the frontend before the backend. */
2343         if (fe_first) {
2344                 dev_dbg(fe->dev, "ASoC: pre trigger FE %s cmd %d\n",
2345                         fe->dai_link->name, cmd);
2346
2347                 ret = soc_pcm_trigger(substream, cmd);
2348                 if (ret < 0)
2349                         return ret;
2350
2351                 ret = dpcm_be_dai_trigger(fe, substream->stream, cmd);
2352                 return ret;
2353         }
2354
2355         /* call trigger on the frontend after the backend. */
2356         ret = dpcm_be_dai_trigger(fe, substream->stream, cmd);
2357         if (ret < 0)
2358                 return ret;
2359
2360         dev_dbg(fe->dev, "ASoC: post trigger FE %s cmd %d\n",
2361                 fe->dai_link->name, cmd);
2362
2363         ret = soc_pcm_trigger(substream, cmd);
2364
2365         return ret;
2366 }
2367
2368 static int dpcm_fe_dai_do_trigger(struct snd_pcm_substream *substream, int cmd)
2369 {
2370         struct snd_soc_pcm_runtime *fe = substream->private_data;
2371         int stream = substream->stream;
2372         int ret = 0;
2373         enum snd_soc_dpcm_trigger trigger = fe->dai_link->trigger[stream];
2374
2375         fe->dpcm[stream].runtime_update = SND_SOC_DPCM_UPDATE_FE;
2376
2377         switch (trigger) {
2378         case SND_SOC_DPCM_TRIGGER_PRE:
2379                 switch (cmd) {
2380                 case SNDRV_PCM_TRIGGER_START:
2381                 case SNDRV_PCM_TRIGGER_RESUME:
2382                 case SNDRV_PCM_TRIGGER_PAUSE_RELEASE:
2383                         ret = dpcm_dai_trigger_fe_be(substream, cmd, true);
2384                         break;
2385                 case SNDRV_PCM_TRIGGER_STOP:
2386                 case SNDRV_PCM_TRIGGER_SUSPEND:
2387                 case SNDRV_PCM_TRIGGER_PAUSE_PUSH:
2388                         ret = dpcm_dai_trigger_fe_be(substream, cmd, false);
2389                         break;
2390                 default:
2391                         ret = -EINVAL;
2392                         break;
2393                 }
2394                 break;
2395         case SND_SOC_DPCM_TRIGGER_POST:
2396                 switch (cmd) {
2397                 case SNDRV_PCM_TRIGGER_START:
2398                 case SNDRV_PCM_TRIGGER_RESUME:
2399                 case SNDRV_PCM_TRIGGER_PAUSE_RELEASE:
2400                         ret = dpcm_dai_trigger_fe_be(substream, cmd, false);
2401                         break;
2402                 case SNDRV_PCM_TRIGGER_STOP:
2403                 case SNDRV_PCM_TRIGGER_SUSPEND:
2404                 case SNDRV_PCM_TRIGGER_PAUSE_PUSH:
2405                         ret = dpcm_dai_trigger_fe_be(substream, cmd, true);
2406                         break;
2407                 default:
2408                         ret = -EINVAL;
2409                         break;
2410                 }
2411                 break;
2412         case SND_SOC_DPCM_TRIGGER_BESPOKE:
2413                 /* bespoke trigger() - handles both FE and BEs */
2414
2415                 dev_dbg(fe->dev, "ASoC: bespoke trigger FE %s cmd %d\n",
2416                                 fe->dai_link->name, cmd);
2417
2418                 ret = soc_pcm_bespoke_trigger(substream, cmd);
2419                 break;
2420         default:
2421                 dev_err(fe->dev, "ASoC: invalid trigger cmd %d for %s\n", cmd,
2422                                 fe->dai_link->name);
2423                 ret = -EINVAL;
2424                 goto out;
2425         }
2426
2427         if (ret < 0) {
2428                 dev_err(fe->dev, "ASoC: trigger FE cmd: %d failed: %d\n",
2429                         cmd, ret);
2430                 goto out;
2431         }
2432
2433         switch (cmd) {
2434         case SNDRV_PCM_TRIGGER_START:
2435         case SNDRV_PCM_TRIGGER_RESUME:
2436         case SNDRV_PCM_TRIGGER_PAUSE_RELEASE:
2437                 fe->dpcm[stream].state = SND_SOC_DPCM_STATE_START;
2438                 break;
2439         case SNDRV_PCM_TRIGGER_STOP:
2440         case SNDRV_PCM_TRIGGER_SUSPEND:
2441                 fe->dpcm[stream].state = SND_SOC_DPCM_STATE_STOP;
2442                 break;
2443         case SNDRV_PCM_TRIGGER_PAUSE_PUSH:
2444                 fe->dpcm[stream].state = SND_SOC_DPCM_STATE_PAUSED;
2445                 break;
2446         }
2447
2448 out:
2449         fe->dpcm[stream].runtime_update = SND_SOC_DPCM_UPDATE_NO;
2450         return ret;
2451 }
2452
2453 static int dpcm_fe_dai_trigger(struct snd_pcm_substream *substream, int cmd)
2454 {
2455         struct snd_soc_pcm_runtime *fe = substream->private_data;
2456         int stream = substream->stream;
2457
2458         /* if FE's runtime_update is already set, we're in race;
2459          * process this trigger later at exit
2460          */
2461         if (fe->dpcm[stream].runtime_update != SND_SOC_DPCM_UPDATE_NO) {
2462                 fe->dpcm[stream].trigger_pending = cmd + 1;
2463                 return 0; /* delayed, assuming it's successful */
2464         }
2465
2466         /* we're alone, let's trigger */
2467         return dpcm_fe_dai_do_trigger(substream, cmd);
2468 }
2469
2470 int dpcm_be_dai_prepare(struct snd_soc_pcm_runtime *fe, int stream)
2471 {
2472         struct snd_soc_dpcm *dpcm;
2473         int ret = 0;
2474
2475         for_each_dpcm_be(fe, stream, dpcm) {
2476
2477                 struct snd_soc_pcm_runtime *be = dpcm->be;
2478                 struct snd_pcm_substream *be_substream =
2479                         snd_soc_dpcm_get_substream(be, stream);
2480
2481                 /* is this op for this BE ? */
2482                 if (!snd_soc_dpcm_be_can_update(fe, be, stream))
2483                         continue;
2484
2485                 if ((be->dpcm[stream].state != SND_SOC_DPCM_STATE_HW_PARAMS) &&
2486                     (be->dpcm[stream].state != SND_SOC_DPCM_STATE_STOP) &&
2487                     (be->dpcm[stream].state != SND_SOC_DPCM_STATE_SUSPEND) &&
2488                     (be->dpcm[stream].state != SND_SOC_DPCM_STATE_PAUSED))
2489                         continue;
2490
2491                 dev_dbg(be->dev, "ASoC: prepare BE %s\n",
2492                         be->dai_link->name);
2493
2494                 ret = soc_pcm_prepare(be_substream);
2495                 if (ret < 0) {
2496                         dev_err(be->dev, "ASoC: backend prepare failed %d\n",
2497                                 ret);
2498                         break;
2499                 }
2500
2501                 be->dpcm[stream].state = SND_SOC_DPCM_STATE_PREPARE;
2502         }
2503         return ret;
2504 }
2505
2506 static int dpcm_fe_dai_prepare(struct snd_pcm_substream *substream)
2507 {
2508         struct snd_soc_pcm_runtime *fe = substream->private_data;
2509         int stream = substream->stream, ret = 0;
2510
2511         mutex_lock_nested(&fe->card->mutex, SND_SOC_CARD_CLASS_RUNTIME);
2512
2513         dev_dbg(fe->dev, "ASoC: prepare FE %s\n", fe->dai_link->name);
2514
2515         dpcm_set_fe_update_state(fe, stream, SND_SOC_DPCM_UPDATE_FE);
2516
2517         /* there is no point preparing this FE if there are no BEs */
2518         if (list_empty(&fe->dpcm[stream].be_clients)) {
2519                 dev_err(fe->dev, "ASoC: no backend DAIs enabled for %s\n",
2520                                 fe->dai_link->name);
2521                 ret = -EINVAL;
2522                 goto out;
2523         }
2524
2525         ret = dpcm_be_dai_prepare(fe, substream->stream);
2526         if (ret < 0)
2527                 goto out;
2528
2529         /* call prepare on the frontend */
2530         ret = soc_pcm_prepare(substream);
2531         if (ret < 0) {
2532                 dev_err(fe->dev,"ASoC: prepare FE %s failed\n",
2533                         fe->dai_link->name);
2534                 goto out;
2535         }
2536
2537         /* run the stream event for each BE */
2538         dpcm_dapm_stream_event(fe, stream, SND_SOC_DAPM_STREAM_START);
2539         fe->dpcm[stream].state = SND_SOC_DPCM_STATE_PREPARE;
2540
2541 out:
2542         dpcm_set_fe_update_state(fe, stream, SND_SOC_DPCM_UPDATE_NO);
2543         mutex_unlock(&fe->card->mutex);
2544
2545         return ret;
2546 }
2547
2548 static int dpcm_run_update_shutdown(struct snd_soc_pcm_runtime *fe, int stream)
2549 {
2550         struct snd_pcm_substream *substream =
2551                 snd_soc_dpcm_get_substream(fe, stream);
2552         enum snd_soc_dpcm_trigger trigger = fe->dai_link->trigger[stream];
2553         int err;
2554
2555         dev_dbg(fe->dev, "ASoC: runtime %s close on FE %s\n",
2556                         stream ? "capture" : "playback", fe->dai_link->name);
2557
2558         if (trigger == SND_SOC_DPCM_TRIGGER_BESPOKE) {
2559                 /* call bespoke trigger - FE takes care of all BE triggers */
2560                 dev_dbg(fe->dev, "ASoC: bespoke trigger FE %s cmd stop\n",
2561                                 fe->dai_link->name);
2562
2563                 err = soc_pcm_bespoke_trigger(substream, SNDRV_PCM_TRIGGER_STOP);
2564                 if (err < 0)
2565                         dev_err(fe->dev,"ASoC: trigger FE failed %d\n", err);
2566         } else {
2567                 dev_dbg(fe->dev, "ASoC: trigger FE %s cmd stop\n",
2568                         fe->dai_link->name);
2569
2570                 err = dpcm_be_dai_trigger(fe, stream, SNDRV_PCM_TRIGGER_STOP);
2571                 if (err < 0)
2572                         dev_err(fe->dev,"ASoC: trigger FE failed %d\n", err);
2573         }
2574
2575         err = dpcm_be_dai_hw_free(fe, stream);
2576         if (err < 0)
2577                 dev_err(fe->dev,"ASoC: hw_free FE failed %d\n", err);
2578
2579         err = dpcm_be_dai_shutdown(fe, stream);
2580         if (err < 0)
2581                 dev_err(fe->dev,"ASoC: shutdown FE failed %d\n", err);
2582
2583         /* run the stream event for each BE */
2584         dpcm_dapm_stream_event(fe, stream, SND_SOC_DAPM_STREAM_NOP);
2585
2586         return 0;
2587 }
2588
2589 static int dpcm_run_update_startup(struct snd_soc_pcm_runtime *fe, int stream)
2590 {
2591         struct snd_pcm_substream *substream =
2592                 snd_soc_dpcm_get_substream(fe, stream);
2593         struct snd_soc_dpcm *dpcm;
2594         enum snd_soc_dpcm_trigger trigger = fe->dai_link->trigger[stream];
2595         int ret;
2596         unsigned long flags;
2597
2598         dev_dbg(fe->dev, "ASoC: runtime %s open on FE %s\n",
2599                         stream ? "capture" : "playback", fe->dai_link->name);
2600
2601         /* Only start the BE if the FE is ready */
2602         if (fe->dpcm[stream].state == SND_SOC_DPCM_STATE_HW_FREE ||
2603                 fe->dpcm[stream].state == SND_SOC_DPCM_STATE_CLOSE)
2604                 return -EINVAL;
2605
2606         /* startup must always be called for new BEs */
2607         ret = dpcm_be_dai_startup(fe, stream);
2608         if (ret < 0)
2609                 goto disconnect;
2610
2611         /* keep going if FE state is > open */
2612         if (fe->dpcm[stream].state == SND_SOC_DPCM_STATE_OPEN)
2613                 return 0;
2614
2615         ret = dpcm_be_dai_hw_params(fe, stream);
2616         if (ret < 0)
2617                 goto close;
2618
2619         /* keep going if FE state is > hw_params */
2620         if (fe->dpcm[stream].state == SND_SOC_DPCM_STATE_HW_PARAMS)
2621                 return 0;
2622
2623
2624         ret = dpcm_be_dai_prepare(fe, stream);
2625         if (ret < 0)
2626                 goto hw_free;
2627
2628         /* run the stream event for each BE */
2629         dpcm_dapm_stream_event(fe, stream, SND_SOC_DAPM_STREAM_NOP);
2630
2631         /* keep going if FE state is > prepare */
2632         if (fe->dpcm[stream].state == SND_SOC_DPCM_STATE_PREPARE ||
2633                 fe->dpcm[stream].state == SND_SOC_DPCM_STATE_STOP)
2634                 return 0;
2635
2636         if (trigger == SND_SOC_DPCM_TRIGGER_BESPOKE) {
2637                 /* call trigger on the frontend - FE takes care of all BE triggers */
2638                 dev_dbg(fe->dev, "ASoC: bespoke trigger FE %s cmd start\n",
2639                                 fe->dai_link->name);
2640
2641                 ret = soc_pcm_bespoke_trigger(substream, SNDRV_PCM_TRIGGER_START);
2642                 if (ret < 0) {
2643                         dev_err(fe->dev,"ASoC: bespoke trigger FE failed %d\n", ret);
2644                         goto hw_free;
2645                 }
2646         } else {
2647                 dev_dbg(fe->dev, "ASoC: trigger FE %s cmd start\n",
2648                         fe->dai_link->name);
2649
2650                 ret = dpcm_be_dai_trigger(fe, stream,
2651                                         SNDRV_PCM_TRIGGER_START);
2652                 if (ret < 0) {
2653                         dev_err(fe->dev,"ASoC: trigger FE failed %d\n", ret);
2654                         goto hw_free;
2655                 }
2656         }
2657
2658         return 0;
2659
2660 hw_free:
2661         dpcm_be_dai_hw_free(fe, stream);
2662 close:
2663         dpcm_be_dai_shutdown(fe, stream);
2664 disconnect:
2665         /* disconnect any non started BEs */
2666         spin_lock_irqsave(&fe->card->dpcm_lock, flags);
2667         for_each_dpcm_be(fe, stream, dpcm) {
2668                 struct snd_soc_pcm_runtime *be = dpcm->be;
2669                 if (be->dpcm[stream].state != SND_SOC_DPCM_STATE_START)
2670                                 dpcm->state = SND_SOC_DPCM_LINK_STATE_FREE;
2671         }
2672         spin_unlock_irqrestore(&fe->card->dpcm_lock, flags);
2673
2674         return ret;
2675 }
2676
2677 static int dpcm_run_new_update(struct snd_soc_pcm_runtime *fe, int stream)
2678 {
2679         int ret;
2680
2681         dpcm_set_fe_update_state(fe, stream, SND_SOC_DPCM_UPDATE_BE);
2682         ret = dpcm_run_update_startup(fe, stream);
2683         if (ret < 0)
2684                 dev_err(fe->dev, "ASoC: failed to startup some BEs\n");
2685         dpcm_set_fe_update_state(fe, stream, SND_SOC_DPCM_UPDATE_NO);
2686
2687         return ret;
2688 }
2689
2690 static int dpcm_run_old_update(struct snd_soc_pcm_runtime *fe, int stream)
2691 {
2692         int ret;
2693
2694         dpcm_set_fe_update_state(fe, stream, SND_SOC_DPCM_UPDATE_BE);
2695         ret = dpcm_run_update_shutdown(fe, stream);
2696         if (ret < 0)
2697                 dev_err(fe->dev, "ASoC: failed to shutdown some BEs\n");
2698         dpcm_set_fe_update_state(fe, stream, SND_SOC_DPCM_UPDATE_NO);
2699
2700         return ret;
2701 }
2702
2703 static int soc_dpcm_fe_runtime_update(struct snd_soc_pcm_runtime *fe, int new)
2704 {
2705         struct snd_soc_dapm_widget_list *list;
2706         int count, paths;
2707
2708         if (!fe->dai_link->dynamic)
2709                 return 0;
2710
2711         /* only check active links */
2712         if (!fe->cpu_dai->active)
2713                 return 0;
2714
2715         /* DAPM sync will call this to update DSP paths */
2716         dev_dbg(fe->dev, "ASoC: DPCM %s runtime update for FE %s\n",
2717                 new ? "new" : "old", fe->dai_link->name);
2718
2719         /* skip if FE doesn't have playback capability */
2720         if (!snd_soc_dai_stream_valid(fe->cpu_dai,   SNDRV_PCM_STREAM_PLAYBACK) ||
2721             !snd_soc_dai_stream_valid(fe->codec_dai, SNDRV_PCM_STREAM_PLAYBACK))
2722                 goto capture;
2723
2724         /* skip if FE isn't currently playing */
2725         if (!fe->cpu_dai->playback_active || !fe->codec_dai->playback_active)
2726                 goto capture;
2727
2728         paths = dpcm_path_get(fe, SNDRV_PCM_STREAM_PLAYBACK, &list);
2729         if (paths < 0) {
2730                 dev_warn(fe->dev, "ASoC: %s no valid %s path\n",
2731                          fe->dai_link->name,  "playback");
2732                 return paths;
2733         }
2734
2735         /* update any playback paths */
2736         count = dpcm_process_paths(fe, SNDRV_PCM_STREAM_PLAYBACK, &list, new);
2737         if (count) {
2738                 if (new)
2739                         dpcm_run_new_update(fe, SNDRV_PCM_STREAM_PLAYBACK);
2740                 else
2741                         dpcm_run_old_update(fe, SNDRV_PCM_STREAM_PLAYBACK);
2742
2743                 dpcm_clear_pending_state(fe, SNDRV_PCM_STREAM_PLAYBACK);
2744                 dpcm_be_disconnect(fe, SNDRV_PCM_STREAM_PLAYBACK);
2745         }
2746
2747         dpcm_path_put(&list);
2748
2749 capture:
2750         /* skip if FE doesn't have capture capability */
2751         if (!snd_soc_dai_stream_valid(fe->cpu_dai,   SNDRV_PCM_STREAM_CAPTURE) ||
2752             !snd_soc_dai_stream_valid(fe->codec_dai, SNDRV_PCM_STREAM_CAPTURE))
2753                 return 0;
2754
2755         /* skip if FE isn't currently capturing */
2756         if (!fe->cpu_dai->capture_active || !fe->codec_dai->capture_active)
2757                 return 0;
2758
2759         paths = dpcm_path_get(fe, SNDRV_PCM_STREAM_CAPTURE, &list);
2760         if (paths < 0) {
2761                 dev_warn(fe->dev, "ASoC: %s no valid %s path\n",
2762                          fe->dai_link->name,  "capture");
2763                 return paths;
2764         }
2765
2766         /* update any old capture paths */
2767         count = dpcm_process_paths(fe, SNDRV_PCM_STREAM_CAPTURE, &list, new);
2768         if (count) {
2769                 if (new)
2770                         dpcm_run_new_update(fe, SNDRV_PCM_STREAM_CAPTURE);
2771                 else
2772                         dpcm_run_old_update(fe, SNDRV_PCM_STREAM_CAPTURE);
2773
2774                 dpcm_clear_pending_state(fe, SNDRV_PCM_STREAM_CAPTURE);
2775                 dpcm_be_disconnect(fe, SNDRV_PCM_STREAM_CAPTURE);
2776         }
2777
2778         dpcm_path_put(&list);
2779
2780         return 0;
2781 }
2782
2783 /* Called by DAPM mixer/mux changes to update audio routing between PCMs and
2784  * any DAI links.
2785  */
2786 int soc_dpcm_runtime_update(struct snd_soc_card *card)
2787 {
2788         struct snd_soc_pcm_runtime *fe;
2789         int ret = 0;
2790
2791         mutex_lock_nested(&card->mutex, SND_SOC_CARD_CLASS_RUNTIME);
2792         /* shutdown all old paths first */
2793         for_each_card_rtds(card, fe) {
2794                 ret = soc_dpcm_fe_runtime_update(fe, 0);
2795                 if (ret)
2796                         goto out;
2797         }
2798
2799         /* bring new paths up */
2800         for_each_card_rtds(card, fe) {
2801                 ret = soc_dpcm_fe_runtime_update(fe, 1);
2802                 if (ret)
2803                         goto out;
2804         }
2805
2806 out:
2807         mutex_unlock(&card->mutex);
2808         return ret;
2809 }
2810 int soc_dpcm_be_digital_mute(struct snd_soc_pcm_runtime *fe, int mute)
2811 {
2812         struct snd_soc_dpcm *dpcm;
2813         struct snd_soc_dai *dai;
2814
2815         for_each_dpcm_be(fe, SNDRV_PCM_STREAM_PLAYBACK, dpcm) {
2816
2817                 struct snd_soc_pcm_runtime *be = dpcm->be;
2818                 int i;
2819
2820                 if (be->dai_link->ignore_suspend)
2821                         continue;
2822
2823                 for_each_rtd_codec_dai(be, i, dai) {
2824                         struct snd_soc_dai_driver *drv = dai->driver;
2825
2826                         dev_dbg(be->dev, "ASoC: BE digital mute %s\n",
2827                                          be->dai_link->name);
2828
2829                         if (drv->ops && drv->ops->digital_mute &&
2830                                                         dai->playback_active)
2831                                 drv->ops->digital_mute(dai, mute);
2832                 }
2833         }
2834
2835         return 0;
2836 }
2837
2838 static int dpcm_fe_dai_open(struct snd_pcm_substream *fe_substream)
2839 {
2840         struct snd_soc_pcm_runtime *fe = fe_substream->private_data;
2841         struct snd_soc_dpcm *dpcm;
2842         struct snd_soc_dapm_widget_list *list;
2843         int ret;
2844         int stream = fe_substream->stream;
2845
2846         mutex_lock_nested(&fe->card->mutex, SND_SOC_CARD_CLASS_RUNTIME);
2847         fe->dpcm[stream].runtime = fe_substream->runtime;
2848
2849         ret = dpcm_path_get(fe, stream, &list);
2850         if (ret < 0) {
2851                 mutex_unlock(&fe->card->mutex);
2852                 return ret;
2853         } else if (ret == 0) {
2854                 dev_dbg(fe->dev, "ASoC: %s no valid %s route\n",
2855                         fe->dai_link->name, stream ? "capture" : "playback");
2856         }
2857
2858         /* calculate valid and active FE <-> BE dpcms */
2859         dpcm_process_paths(fe, stream, &list, 1);
2860
2861         ret = dpcm_fe_dai_startup(fe_substream);
2862         if (ret < 0) {
2863                 /* clean up all links */
2864                 for_each_dpcm_be(fe, stream, dpcm)
2865                         dpcm->state = SND_SOC_DPCM_LINK_STATE_FREE;
2866
2867                 dpcm_be_disconnect(fe, stream);
2868                 fe->dpcm[stream].runtime = NULL;
2869         }
2870
2871         dpcm_clear_pending_state(fe, stream);
2872         dpcm_path_put(&list);
2873         mutex_unlock(&fe->card->mutex);
2874         return ret;
2875 }
2876
2877 static int dpcm_fe_dai_close(struct snd_pcm_substream *fe_substream)
2878 {
2879         struct snd_soc_pcm_runtime *fe = fe_substream->private_data;
2880         struct snd_soc_dpcm *dpcm;
2881         int stream = fe_substream->stream, ret;
2882
2883         mutex_lock_nested(&fe->card->mutex, SND_SOC_CARD_CLASS_RUNTIME);
2884         ret = dpcm_fe_dai_shutdown(fe_substream);
2885
2886         /* mark FE's links ready to prune */
2887         for_each_dpcm_be(fe, stream, dpcm)
2888                 dpcm->state = SND_SOC_DPCM_LINK_STATE_FREE;
2889
2890         dpcm_be_disconnect(fe, stream);
2891
2892         fe->dpcm[stream].runtime = NULL;
2893         mutex_unlock(&fe->card->mutex);
2894         return ret;
2895 }
2896
2897 /* create a new pcm */
2898 int soc_new_pcm(struct snd_soc_pcm_runtime *rtd, int num)
2899 {
2900         struct snd_soc_dai *codec_dai;
2901         struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
2902         struct snd_soc_rtdcom_list *rtdcom;
2903         struct snd_soc_component *component;
2904         struct snd_pcm *pcm;
2905         char new_name[64];
2906         int ret = 0, playback = 0, capture = 0;
2907         int i;
2908
2909         if (rtd->dai_link->dynamic || rtd->dai_link->no_pcm) {
2910                 playback = rtd->dai_link->dpcm_playback;
2911                 capture = rtd->dai_link->dpcm_capture;
2912         } else {
2913                 /* Adapt stream for codec2codec links */
2914                 struct snd_soc_pcm_stream *cpu_capture = rtd->dai_link->params ?
2915                         &cpu_dai->driver->playback : &cpu_dai->driver->capture;
2916                 struct snd_soc_pcm_stream *cpu_playback = rtd->dai_link->params ?
2917                         &cpu_dai->driver->capture : &cpu_dai->driver->playback;
2918
2919                 for_each_rtd_codec_dai(rtd, i, codec_dai) {
2920                         if (snd_soc_dai_stream_valid(codec_dai, SNDRV_PCM_STREAM_PLAYBACK) &&
2921                             snd_soc_dai_stream_valid(cpu_dai,   SNDRV_PCM_STREAM_PLAYBACK))
2922                                 playback = 1;
2923                         if (snd_soc_dai_stream_valid(codec_dai, SNDRV_PCM_STREAM_CAPTURE) &&
2924                             snd_soc_dai_stream_valid(cpu_dai,   SNDRV_PCM_STREAM_CAPTURE))
2925                                 capture = 1;
2926                 }
2927
2928                 capture = capture && cpu_capture->channels_min;
2929                 playback = playback && cpu_playback->channels_min;
2930         }
2931
2932         if (rtd->dai_link->playback_only) {
2933                 playback = 1;
2934                 capture = 0;
2935         }
2936
2937         if (rtd->dai_link->capture_only) {
2938                 playback = 0;
2939                 capture = 1;
2940         }
2941
2942         /* create the PCM */
2943         if (rtd->dai_link->params) {
2944                 snprintf(new_name, sizeof(new_name), "codec2codec(%s)",
2945                          rtd->dai_link->stream_name);
2946
2947                 ret = snd_pcm_new_internal(rtd->card->snd_card, new_name, num,
2948                                            playback, capture, &pcm);
2949         } else if (rtd->dai_link->no_pcm) {
2950                 snprintf(new_name, sizeof(new_name), "(%s)",
2951                         rtd->dai_link->stream_name);
2952
2953                 ret = snd_pcm_new_internal(rtd->card->snd_card, new_name, num,
2954                                 playback, capture, &pcm);
2955         } else {
2956                 if (rtd->dai_link->dynamic)
2957                         snprintf(new_name, sizeof(new_name), "%s (*)",
2958                                 rtd->dai_link->stream_name);
2959                 else
2960                         snprintf(new_name, sizeof(new_name), "%s %s-%d",
2961                                 rtd->dai_link->stream_name,
2962                                 (rtd->num_codecs > 1) ?
2963                                 "multicodec" : rtd->codec_dai->name, num);
2964
2965                 ret = snd_pcm_new(rtd->card->snd_card, new_name, num, playback,
2966                         capture, &pcm);
2967         }
2968         if (ret < 0) {
2969                 dev_err(rtd->card->dev, "ASoC: can't create pcm for %s\n",
2970                         rtd->dai_link->name);
2971                 return ret;
2972         }
2973         dev_dbg(rtd->card->dev, "ASoC: registered pcm #%d %s\n",num, new_name);
2974
2975         /* DAPM dai link stream work */
2976         if (rtd->dai_link->params)
2977                 INIT_DELAYED_WORK(&rtd->delayed_work,
2978                                   codec2codec_close_delayed_work);
2979         else
2980                 INIT_DELAYED_WORK(&rtd->delayed_work, close_delayed_work);
2981
2982         pcm->nonatomic = rtd->dai_link->nonatomic;
2983         rtd->pcm = pcm;
2984         pcm->private_data = rtd;
2985
2986         if (rtd->dai_link->no_pcm || rtd->dai_link->params) {
2987                 if (playback)
2988                         pcm->streams[SNDRV_PCM_STREAM_PLAYBACK].substream->private_data = rtd;
2989                 if (capture)
2990                         pcm->streams[SNDRV_PCM_STREAM_CAPTURE].substream->private_data = rtd;
2991                 goto out;
2992         }
2993
2994         /* ASoC PCM operations */
2995         if (rtd->dai_link->dynamic) {
2996                 rtd->ops.open           = dpcm_fe_dai_open;
2997                 rtd->ops.hw_params      = dpcm_fe_dai_hw_params;
2998                 rtd->ops.prepare        = dpcm_fe_dai_prepare;
2999                 rtd->ops.trigger        = dpcm_fe_dai_trigger;
3000                 rtd->ops.hw_free        = dpcm_fe_dai_hw_free;
3001                 rtd->ops.close          = dpcm_fe_dai_close;
3002                 rtd->ops.pointer        = soc_pcm_pointer;
3003         } else {
3004                 rtd->ops.open           = soc_pcm_open;
3005                 rtd->ops.hw_params      = soc_pcm_hw_params;
3006                 rtd->ops.prepare        = soc_pcm_prepare;
3007                 rtd->ops.trigger        = soc_pcm_trigger;
3008                 rtd->ops.hw_free        = soc_pcm_hw_free;
3009                 rtd->ops.close          = soc_pcm_close;
3010                 rtd->ops.pointer        = soc_pcm_pointer;
3011         }
3012
3013         for_each_rtd_components(rtd, rtdcom, component) {
3014                 const struct snd_soc_component_driver *drv = component->driver;
3015
3016                 if (drv->ioctl)
3017                         rtd->ops.ioctl          = snd_soc_pcm_component_ioctl;
3018                 if (drv->sync_stop)
3019                         rtd->ops.sync_stop      = snd_soc_pcm_component_sync_stop;
3020                 if (drv->copy_user)
3021                         rtd->ops.copy_user      = snd_soc_pcm_component_copy_user;
3022                 if (drv->page)
3023                         rtd->ops.page           = snd_soc_pcm_component_page;
3024                 if (drv->mmap)
3025                         rtd->ops.mmap           = snd_soc_pcm_component_mmap;
3026         }
3027
3028         if (playback)
3029                 snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_PLAYBACK, &rtd->ops);
3030
3031         if (capture)
3032                 snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_CAPTURE, &rtd->ops);
3033
3034         ret = snd_soc_pcm_component_new(rtd);
3035         if (ret < 0) {
3036                 dev_err(rtd->dev, "ASoC: pcm constructor failed: %d\n", ret);
3037                 return ret;
3038         }
3039
3040         pcm->no_device_suspend = true;
3041 out:
3042         dev_info(rtd->card->dev, "%s <-> %s mapping ok\n",
3043                  (rtd->num_codecs > 1) ? "multicodec" : rtd->codec_dai->name,
3044                  cpu_dai->name);
3045         return ret;
3046 }
3047
3048 /* is the current PCM operation for this FE ? */
3049 int snd_soc_dpcm_fe_can_update(struct snd_soc_pcm_runtime *fe, int stream)
3050 {
3051         if (fe->dpcm[stream].runtime_update == SND_SOC_DPCM_UPDATE_FE)
3052                 return 1;
3053         return 0;
3054 }
3055 EXPORT_SYMBOL_GPL(snd_soc_dpcm_fe_can_update);
3056
3057 /* is the current PCM operation for this BE ? */
3058 int snd_soc_dpcm_be_can_update(struct snd_soc_pcm_runtime *fe,
3059                 struct snd_soc_pcm_runtime *be, int stream)
3060 {
3061         if ((fe->dpcm[stream].runtime_update == SND_SOC_DPCM_UPDATE_FE) ||
3062            ((fe->dpcm[stream].runtime_update == SND_SOC_DPCM_UPDATE_BE) &&
3063                   be->dpcm[stream].runtime_update))
3064                 return 1;
3065         return 0;
3066 }
3067 EXPORT_SYMBOL_GPL(snd_soc_dpcm_be_can_update);
3068
3069 /* get the substream for this BE */
3070 struct snd_pcm_substream *
3071         snd_soc_dpcm_get_substream(struct snd_soc_pcm_runtime *be, int stream)
3072 {
3073         return be->pcm->streams[stream].substream;
3074 }
3075 EXPORT_SYMBOL_GPL(snd_soc_dpcm_get_substream);
3076
3077 /* get the BE runtime state */
3078 enum snd_soc_dpcm_state
3079         snd_soc_dpcm_be_get_state(struct snd_soc_pcm_runtime *be, int stream)
3080 {
3081         return be->dpcm[stream].state;
3082 }
3083 EXPORT_SYMBOL_GPL(snd_soc_dpcm_be_get_state);
3084
3085 /* set the BE runtime state */
3086 void snd_soc_dpcm_be_set_state(struct snd_soc_pcm_runtime *be,
3087                 int stream, enum snd_soc_dpcm_state state)
3088 {
3089         be->dpcm[stream].state = state;
3090 }
3091 EXPORT_SYMBOL_GPL(snd_soc_dpcm_be_set_state);
3092
3093 /*
3094  * We can only hw_free, stop, pause or suspend a BE DAI if any of it's FE
3095  * are not running, paused or suspended for the specified stream direction.
3096  */
3097 int snd_soc_dpcm_can_be_free_stop(struct snd_soc_pcm_runtime *fe,
3098                 struct snd_soc_pcm_runtime *be, int stream)
3099 {
3100         struct snd_soc_dpcm *dpcm;
3101         int state;
3102         int ret = 1;
3103         unsigned long flags;
3104
3105         spin_lock_irqsave(&fe->card->dpcm_lock, flags);
3106         for_each_dpcm_fe(be, stream, dpcm) {
3107
3108                 if (dpcm->fe == fe)
3109                         continue;
3110
3111                 state = dpcm->fe->dpcm[stream].state;
3112                 if (state == SND_SOC_DPCM_STATE_START ||
3113                         state == SND_SOC_DPCM_STATE_PAUSED ||
3114                         state == SND_SOC_DPCM_STATE_SUSPEND) {
3115                         ret = 0;
3116                         break;
3117                 }
3118         }
3119         spin_unlock_irqrestore(&fe->card->dpcm_lock, flags);
3120
3121         /* it's safe to free/stop this BE DAI */
3122         return ret;
3123 }
3124 EXPORT_SYMBOL_GPL(snd_soc_dpcm_can_be_free_stop);
3125
3126 /*
3127  * We can only change hw params a BE DAI if any of it's FE are not prepared,
3128  * running, paused or suspended for the specified stream direction.
3129  */
3130 int snd_soc_dpcm_can_be_params(struct snd_soc_pcm_runtime *fe,
3131                 struct snd_soc_pcm_runtime *be, int stream)
3132 {
3133         struct snd_soc_dpcm *dpcm;
3134         int state;
3135         int ret = 1;
3136         unsigned long flags;
3137
3138         spin_lock_irqsave(&fe->card->dpcm_lock, flags);
3139         for_each_dpcm_fe(be, stream, dpcm) {
3140
3141                 if (dpcm->fe == fe)
3142                         continue;
3143
3144                 state = dpcm->fe->dpcm[stream].state;
3145                 if (state == SND_SOC_DPCM_STATE_START ||
3146                         state == SND_SOC_DPCM_STATE_PAUSED ||
3147                         state == SND_SOC_DPCM_STATE_SUSPEND ||
3148                         state == SND_SOC_DPCM_STATE_PREPARE) {
3149                         ret = 0;
3150                         break;
3151                 }
3152         }
3153         spin_unlock_irqrestore(&fe->card->dpcm_lock, flags);
3154
3155         /* it's safe to change hw_params */
3156         return ret;
3157 }
3158 EXPORT_SYMBOL_GPL(snd_soc_dpcm_can_be_params);
3159
3160 #ifdef CONFIG_DEBUG_FS
3161 static const char *dpcm_state_string(enum snd_soc_dpcm_state state)
3162 {
3163         switch (state) {
3164         case SND_SOC_DPCM_STATE_NEW:
3165                 return "new";
3166         case SND_SOC_DPCM_STATE_OPEN:
3167                 return "open";
3168         case SND_SOC_DPCM_STATE_HW_PARAMS:
3169                 return "hw_params";
3170         case SND_SOC_DPCM_STATE_PREPARE:
3171                 return "prepare";
3172         case SND_SOC_DPCM_STATE_START:
3173                 return "start";
3174         case SND_SOC_DPCM_STATE_STOP:
3175                 return "stop";
3176         case SND_SOC_DPCM_STATE_SUSPEND:
3177                 return "suspend";
3178         case SND_SOC_DPCM_STATE_PAUSED:
3179                 return "paused";
3180         case SND_SOC_DPCM_STATE_HW_FREE:
3181                 return "hw_free";
3182         case SND_SOC_DPCM_STATE_CLOSE:
3183                 return "close";
3184         }
3185
3186         return "unknown";
3187 }
3188
3189 static ssize_t dpcm_show_state(struct snd_soc_pcm_runtime *fe,
3190                                 int stream, char *buf, size_t size)
3191 {
3192         struct snd_pcm_hw_params *params = &fe->dpcm[stream].hw_params;
3193         struct snd_soc_dpcm *dpcm;
3194         ssize_t offset = 0;
3195         unsigned long flags;
3196
3197         /* FE state */
3198         offset += snprintf(buf + offset, size - offset,
3199                         "[%s - %s]\n", fe->dai_link->name,
3200                         stream ? "Capture" : "Playback");
3201
3202         offset += snprintf(buf + offset, size - offset, "State: %s\n",
3203                         dpcm_state_string(fe->dpcm[stream].state));
3204
3205         if ((fe->dpcm[stream].state >= SND_SOC_DPCM_STATE_HW_PARAMS) &&
3206             (fe->dpcm[stream].state <= SND_SOC_DPCM_STATE_STOP))
3207                 offset += snprintf(buf + offset, size - offset,
3208                                 "Hardware Params: "
3209                                 "Format = %s, Channels = %d, Rate = %d\n",
3210                                 snd_pcm_format_name(params_format(params)),
3211                                 params_channels(params),
3212                                 params_rate(params));
3213
3214         /* BEs state */
3215         offset += snprintf(buf + offset, size - offset, "Backends:\n");
3216
3217         if (list_empty(&fe->dpcm[stream].be_clients)) {
3218                 offset += snprintf(buf + offset, size - offset,
3219                                 " No active DSP links\n");
3220                 goto out;
3221         }
3222
3223         spin_lock_irqsave(&fe->card->dpcm_lock, flags);
3224         for_each_dpcm_be(fe, stream, dpcm) {
3225                 struct snd_soc_pcm_runtime *be = dpcm->be;
3226                 params = &dpcm->hw_params;
3227
3228                 offset += snprintf(buf + offset, size - offset,
3229                                 "- %s\n", be->dai_link->name);
3230
3231                 offset += snprintf(buf + offset, size - offset,
3232                                 "   State: %s\n",
3233                                 dpcm_state_string(be->dpcm[stream].state));
3234
3235                 if ((be->dpcm[stream].state >= SND_SOC_DPCM_STATE_HW_PARAMS) &&
3236                     (be->dpcm[stream].state <= SND_SOC_DPCM_STATE_STOP))
3237                         offset += snprintf(buf + offset, size - offset,
3238                                 "   Hardware Params: "
3239                                 "Format = %s, Channels = %d, Rate = %d\n",
3240                                 snd_pcm_format_name(params_format(params)),
3241                                 params_channels(params),
3242                                 params_rate(params));
3243         }
3244         spin_unlock_irqrestore(&fe->card->dpcm_lock, flags);
3245 out:
3246         return offset;
3247 }
3248
3249 static ssize_t dpcm_state_read_file(struct file *file, char __user *user_buf,
3250                                 size_t count, loff_t *ppos)
3251 {
3252         struct snd_soc_pcm_runtime *fe = file->private_data;
3253         ssize_t out_count = PAGE_SIZE, offset = 0, ret = 0;
3254         char *buf;
3255
3256         buf = kmalloc(out_count, GFP_KERNEL);
3257         if (!buf)
3258                 return -ENOMEM;
3259
3260         if (snd_soc_dai_stream_valid(fe->cpu_dai, SNDRV_PCM_STREAM_PLAYBACK))
3261                 offset += dpcm_show_state(fe, SNDRV_PCM_STREAM_PLAYBACK,
3262                                         buf + offset, out_count - offset);
3263
3264         if (snd_soc_dai_stream_valid(fe->cpu_dai, SNDRV_PCM_STREAM_CAPTURE))
3265                 offset += dpcm_show_state(fe, SNDRV_PCM_STREAM_CAPTURE,
3266                                         buf + offset, out_count - offset);
3267
3268         ret = simple_read_from_buffer(user_buf, count, ppos, buf, offset);
3269
3270         kfree(buf);
3271         return ret;
3272 }
3273
3274 static const struct file_operations dpcm_state_fops = {
3275         .open = simple_open,
3276         .read = dpcm_state_read_file,
3277         .llseek = default_llseek,
3278 };
3279
3280 void soc_dpcm_debugfs_add(struct snd_soc_pcm_runtime *rtd)
3281 {
3282         if (!rtd->dai_link)
3283                 return;
3284
3285         if (!rtd->dai_link->dynamic)
3286                 return;
3287
3288         if (!rtd->card->debugfs_card_root)
3289                 return;
3290
3291         rtd->debugfs_dpcm_root = debugfs_create_dir(rtd->dai_link->name,
3292                         rtd->card->debugfs_card_root);
3293
3294         debugfs_create_file("state", 0444, rtd->debugfs_dpcm_root,
3295                             rtd, &dpcm_state_fops);
3296 }
3297 #endif