Merge branch 'x86-pti-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git...
[sfrench/cifs-2.6.git] / sound / soc / soc-compress.c
1 /*
2  * soc-compress.c  --  ALSA SoC Compress
3  *
4  * Copyright (C) 2012 Intel Corp.
5  *
6  * Authors: Namarta Kohli <namartax.kohli@intel.com>
7  *          Ramesh Babu K V <ramesh.babu@linux.intel.com>
8  *          Vinod Koul <vinod.koul@linux.intel.com>
9  *
10  *  This program is free software; you can redistribute  it and/or modify it
11  *  under  the terms of  the GNU General  Public License as published by the
12  *  Free Software Foundation;  either version 2 of the  License, or (at your
13  *  option) any later version.
14  *
15  */
16
17 #include <linux/kernel.h>
18 #include <linux/init.h>
19 #include <linux/delay.h>
20 #include <linux/slab.h>
21 #include <linux/workqueue.h>
22 #include <sound/core.h>
23 #include <sound/compress_params.h>
24 #include <sound/compress_driver.h>
25 #include <sound/soc.h>
26 #include <sound/initval.h>
27 #include <sound/soc-dpcm.h>
28
29 static int soc_compr_open(struct snd_compr_stream *cstream)
30 {
31         struct snd_soc_pcm_runtime *rtd = cstream->private_data;
32         struct snd_soc_platform *platform = rtd->platform;
33         struct snd_soc_component *component;
34         struct snd_soc_rtdcom_list *rtdcom;
35         struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
36         int ret = 0, __ret;
37
38         mutex_lock_nested(&rtd->pcm_mutex, rtd->pcm_subclass);
39
40         if (cpu_dai->driver->cops && cpu_dai->driver->cops->startup) {
41                 ret = cpu_dai->driver->cops->startup(cstream, cpu_dai);
42                 if (ret < 0) {
43                         dev_err(cpu_dai->dev, "Compress ASoC: can't open interface %s: %d\n",
44                                 cpu_dai->name, ret);
45                         goto out;
46                 }
47         }
48
49         if (platform && platform->driver->compr_ops && platform->driver->compr_ops->open) {
50                 ret = platform->driver->compr_ops->open(cstream);
51                 if (ret < 0) {
52                         pr_err("compress asoc: can't open platform %s\n",
53                                 platform->component.name);
54                         goto plat_err;
55                 }
56         }
57
58         for_each_rtdcom(rtd, rtdcom) {
59                 component = rtdcom->component;
60
61                 /* ignore duplication for now */
62                 if (platform && (component == &platform->component))
63                         continue;
64
65                 if (!component->driver->compr_ops ||
66                     !component->driver->compr_ops->open)
67                         continue;
68
69                 __ret = component->driver->compr_ops->open(cstream);
70                 if (__ret < 0) {
71                         pr_err("compress asoc: can't open platform %s\n",
72                                component->name);
73                         ret = __ret;
74                 }
75         }
76         if (ret < 0)
77                 goto machine_err;
78
79         if (rtd->dai_link->compr_ops && rtd->dai_link->compr_ops->startup) {
80                 ret = rtd->dai_link->compr_ops->startup(cstream);
81                 if (ret < 0) {
82                         pr_err("compress asoc: %s startup failed\n", rtd->dai_link->name);
83                         goto machine_err;
84                 }
85         }
86
87         snd_soc_runtime_activate(rtd, cstream->direction);
88
89         mutex_unlock(&rtd->pcm_mutex);
90
91         return 0;
92
93 machine_err:
94         for_each_rtdcom(rtd, rtdcom) {
95                 component = rtdcom->component;
96
97                 /* ignore duplication for now */
98                 if (platform && (component == &platform->component))
99                         continue;
100
101                 if (!component->driver->compr_ops ||
102                     !component->driver->compr_ops->free)
103                         continue;
104
105                 component->driver->compr_ops->free(cstream);
106         }
107
108         if (platform && platform->driver->compr_ops && platform->driver->compr_ops->free)
109                 platform->driver->compr_ops->free(cstream);
110 plat_err:
111         if (cpu_dai->driver->cops && cpu_dai->driver->cops->shutdown)
112                 cpu_dai->driver->cops->shutdown(cstream, cpu_dai);
113 out:
114         mutex_unlock(&rtd->pcm_mutex);
115         return ret;
116 }
117
118 static int soc_compr_open_fe(struct snd_compr_stream *cstream)
119 {
120         struct snd_soc_pcm_runtime *fe = cstream->private_data;
121         struct snd_pcm_substream *fe_substream =
122                  fe->pcm->streams[cstream->direction].substream;
123         struct snd_soc_platform *platform = fe->platform;
124         struct snd_soc_component *component;
125         struct snd_soc_rtdcom_list *rtdcom;
126         struct snd_soc_dai *cpu_dai = fe->cpu_dai;
127         struct snd_soc_dpcm *dpcm;
128         struct snd_soc_dapm_widget_list *list;
129         int stream;
130         int ret = 0, __ret;
131
132         if (cstream->direction == SND_COMPRESS_PLAYBACK)
133                 stream = SNDRV_PCM_STREAM_PLAYBACK;
134         else
135                 stream = SNDRV_PCM_STREAM_CAPTURE;
136
137         mutex_lock_nested(&fe->card->mutex, SND_SOC_CARD_CLASS_RUNTIME);
138
139         if (cpu_dai->driver->cops && cpu_dai->driver->cops->startup) {
140                 ret = cpu_dai->driver->cops->startup(cstream, cpu_dai);
141                 if (ret < 0) {
142                         dev_err(cpu_dai->dev, "Compress ASoC: can't open interface %s: %d\n",
143                                 cpu_dai->name, ret);
144                         goto out;
145                 }
146         }
147
148
149         if (platform && platform->driver->compr_ops && platform->driver->compr_ops->open) {
150                 ret = platform->driver->compr_ops->open(cstream);
151                 if (ret < 0) {
152                         pr_err("compress asoc: can't open platform %s\n",
153                                 platform->component.name);
154                         goto plat_err;
155                 }
156         }
157
158         for_each_rtdcom(fe, rtdcom) {
159                 component = rtdcom->component;
160
161                 /* ignore duplication for now */
162                 if (platform && (component == &platform->component))
163                         continue;
164
165                 if (!component->driver->compr_ops ||
166                     !component->driver->compr_ops->open)
167                         continue;
168
169                 __ret = component->driver->compr_ops->open(cstream);
170                 if (__ret < 0) {
171                         pr_err("compress asoc: can't open platform %s\n",
172                                component->name);
173                         ret = __ret;
174                 }
175         }
176         if (ret < 0)
177                 goto machine_err;
178
179         if (fe->dai_link->compr_ops && fe->dai_link->compr_ops->startup) {
180                 ret = fe->dai_link->compr_ops->startup(cstream);
181                 if (ret < 0) {
182                         pr_err("compress asoc: %s startup failed\n", fe->dai_link->name);
183                         goto machine_err;
184                 }
185         }
186
187         fe->dpcm[stream].runtime = fe_substream->runtime;
188
189         ret = dpcm_path_get(fe, stream, &list);
190         if (ret < 0)
191                 goto fe_err;
192         else if (ret == 0)
193                 dev_dbg(fe->dev, "ASoC: %s no valid %s route\n",
194                         fe->dai_link->name, stream ? "capture" : "playback");
195
196         /* calculate valid and active FE <-> BE dpcms */
197         dpcm_process_paths(fe, stream, &list, 1);
198
199         fe->dpcm[stream].runtime_update = SND_SOC_DPCM_UPDATE_FE;
200
201         ret = dpcm_be_dai_startup(fe, stream);
202         if (ret < 0) {
203                 /* clean up all links */
204                 list_for_each_entry(dpcm, &fe->dpcm[stream].be_clients, list_be)
205                         dpcm->state = SND_SOC_DPCM_LINK_STATE_FREE;
206
207                 dpcm_be_disconnect(fe, stream);
208                 fe->dpcm[stream].runtime = NULL;
209                 goto path_err;
210         }
211
212         dpcm_clear_pending_state(fe, stream);
213         dpcm_path_put(&list);
214
215         fe->dpcm[stream].state = SND_SOC_DPCM_STATE_OPEN;
216         fe->dpcm[stream].runtime_update = SND_SOC_DPCM_UPDATE_NO;
217
218         snd_soc_runtime_activate(fe, stream);
219
220         mutex_unlock(&fe->card->mutex);
221
222         return 0;
223
224 path_err:
225         dpcm_path_put(&list);
226 fe_err:
227         if (fe->dai_link->compr_ops && fe->dai_link->compr_ops->shutdown)
228                 fe->dai_link->compr_ops->shutdown(cstream);
229 machine_err:
230         for_each_rtdcom(fe, rtdcom) {
231                 component = rtdcom->component;
232
233                 /* ignore duplication for now */
234                 if (platform && (component == &platform->component))
235                         continue;
236
237                 if (!component->driver->compr_ops ||
238                     !component->driver->compr_ops->free)
239                         continue;
240
241                 component->driver->compr_ops->free(cstream);
242         }
243
244         if (platform && platform->driver->compr_ops && platform->driver->compr_ops->free)
245                 platform->driver->compr_ops->free(cstream);
246 plat_err:
247         if (cpu_dai->driver->cops && cpu_dai->driver->cops->shutdown)
248                 cpu_dai->driver->cops->shutdown(cstream, cpu_dai);
249 out:
250         fe->dpcm[stream].runtime_update = SND_SOC_DPCM_UPDATE_NO;
251         mutex_unlock(&fe->card->mutex);
252         return ret;
253 }
254
255 /*
256  * Power down the audio subsystem pmdown_time msecs after close is called.
257  * This is to ensure there are no pops or clicks in between any music tracks
258  * due to DAPM power cycling.
259  */
260 static void close_delayed_work(struct work_struct *work)
261 {
262         struct snd_soc_pcm_runtime *rtd =
263                         container_of(work, struct snd_soc_pcm_runtime, delayed_work.work);
264         struct snd_soc_dai *codec_dai = rtd->codec_dai;
265
266         mutex_lock_nested(&rtd->pcm_mutex, rtd->pcm_subclass);
267
268         dev_dbg(rtd->dev, "ASoC: pop wq checking: %s status: %s waiting: %s\n",
269                  codec_dai->driver->playback.stream_name,
270                  codec_dai->playback_active ? "active" : "inactive",
271                  rtd->pop_wait ? "yes" : "no");
272
273         /* are we waiting on this codec DAI stream */
274         if (rtd->pop_wait == 1) {
275                 rtd->pop_wait = 0;
276                 snd_soc_dapm_stream_event(rtd, SNDRV_PCM_STREAM_PLAYBACK,
277                                           SND_SOC_DAPM_STREAM_STOP);
278         }
279
280         mutex_unlock(&rtd->pcm_mutex);
281 }
282
283 static int soc_compr_free(struct snd_compr_stream *cstream)
284 {
285         struct snd_soc_pcm_runtime *rtd = cstream->private_data;
286         struct snd_soc_platform *platform = rtd->platform;
287         struct snd_soc_component *component;
288         struct snd_soc_rtdcom_list *rtdcom;
289         struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
290         struct snd_soc_dai *codec_dai = rtd->codec_dai;
291         int stream;
292
293         mutex_lock_nested(&rtd->pcm_mutex, rtd->pcm_subclass);
294
295         if (cstream->direction == SND_COMPRESS_PLAYBACK)
296                 stream = SNDRV_PCM_STREAM_PLAYBACK;
297         else
298                 stream = SNDRV_PCM_STREAM_CAPTURE;
299
300         snd_soc_runtime_deactivate(rtd, stream);
301
302         snd_soc_dai_digital_mute(codec_dai, 1, cstream->direction);
303
304         if (!cpu_dai->active)
305                 cpu_dai->rate = 0;
306
307         if (!codec_dai->active)
308                 codec_dai->rate = 0;
309
310
311         if (rtd->dai_link->compr_ops && rtd->dai_link->compr_ops->shutdown)
312                 rtd->dai_link->compr_ops->shutdown(cstream);
313
314         for_each_rtdcom(rtd, rtdcom) {
315                 component = rtdcom->component;
316
317                 /* ignore duplication for now */
318                 if (platform && (component == &platform->component))
319                         continue;
320
321                 if (!component->driver->compr_ops ||
322                     !component->driver->compr_ops->free)
323                         continue;
324
325                 component->driver->compr_ops->free(cstream);
326         }
327
328         if (platform && platform->driver->compr_ops && platform->driver->compr_ops->free)
329                 platform->driver->compr_ops->free(cstream);
330
331         if (cpu_dai->driver->cops && cpu_dai->driver->cops->shutdown)
332                 cpu_dai->driver->cops->shutdown(cstream, cpu_dai);
333
334         if (cstream->direction == SND_COMPRESS_PLAYBACK) {
335                 if (snd_soc_runtime_ignore_pmdown_time(rtd)) {
336                         snd_soc_dapm_stream_event(rtd,
337                                         SNDRV_PCM_STREAM_PLAYBACK,
338                                         SND_SOC_DAPM_STREAM_STOP);
339                 } else {
340                         rtd->pop_wait = 1;
341                         queue_delayed_work(system_power_efficient_wq,
342                                            &rtd->delayed_work,
343                                            msecs_to_jiffies(rtd->pmdown_time));
344                 }
345         } else {
346                 /* capture streams can be powered down now */
347                 snd_soc_dapm_stream_event(rtd,
348                         SNDRV_PCM_STREAM_CAPTURE,
349                         SND_SOC_DAPM_STREAM_STOP);
350         }
351
352         mutex_unlock(&rtd->pcm_mutex);
353         return 0;
354 }
355
356 static int soc_compr_free_fe(struct snd_compr_stream *cstream)
357 {
358         struct snd_soc_pcm_runtime *fe = cstream->private_data;
359         struct snd_soc_platform *platform = fe->platform;
360         struct snd_soc_component *component;
361         struct snd_soc_rtdcom_list *rtdcom;
362         struct snd_soc_dai *cpu_dai = fe->cpu_dai;
363         struct snd_soc_dpcm *dpcm;
364         int stream, ret;
365
366         mutex_lock_nested(&fe->card->mutex, SND_SOC_CARD_CLASS_RUNTIME);
367
368         if (cstream->direction == SND_COMPRESS_PLAYBACK)
369                 stream = SNDRV_PCM_STREAM_PLAYBACK;
370         else
371                 stream = SNDRV_PCM_STREAM_CAPTURE;
372
373         snd_soc_runtime_deactivate(fe, stream);
374
375         fe->dpcm[stream].runtime_update = SND_SOC_DPCM_UPDATE_FE;
376
377         ret = dpcm_be_dai_hw_free(fe, stream);
378         if (ret < 0)
379                 dev_err(fe->dev, "compressed hw_free failed %d\n", ret);
380
381         ret = dpcm_be_dai_shutdown(fe, stream);
382
383         /* mark FE's links ready to prune */
384         list_for_each_entry(dpcm, &fe->dpcm[stream].be_clients, list_be)
385                 dpcm->state = SND_SOC_DPCM_LINK_STATE_FREE;
386
387         dpcm_dapm_stream_event(fe, stream, SND_SOC_DAPM_STREAM_STOP);
388
389         fe->dpcm[stream].state = SND_SOC_DPCM_STATE_CLOSE;
390         fe->dpcm[stream].runtime_update = SND_SOC_DPCM_UPDATE_NO;
391
392         dpcm_be_disconnect(fe, stream);
393
394         fe->dpcm[stream].runtime = NULL;
395
396         if (fe->dai_link->compr_ops && fe->dai_link->compr_ops->shutdown)
397                 fe->dai_link->compr_ops->shutdown(cstream);
398
399         if (platform && platform->driver->compr_ops && platform->driver->compr_ops->free)
400                 platform->driver->compr_ops->free(cstream);
401
402         for_each_rtdcom(fe, rtdcom) {
403                 component = rtdcom->component;
404
405                 /* ignore duplication for now */
406                 if (platform && (component == &platform->component))
407                         continue;
408
409                 if (!component->driver->compr_ops ||
410                     !component->driver->compr_ops->free)
411                         continue;
412
413                 component->driver->compr_ops->free(cstream);
414         }
415
416         if (cpu_dai->driver->cops && cpu_dai->driver->cops->shutdown)
417                 cpu_dai->driver->cops->shutdown(cstream, cpu_dai);
418
419         mutex_unlock(&fe->card->mutex);
420         return 0;
421 }
422
423 static int soc_compr_trigger(struct snd_compr_stream *cstream, int cmd)
424 {
425
426         struct snd_soc_pcm_runtime *rtd = cstream->private_data;
427         struct snd_soc_platform *platform = rtd->platform;
428         struct snd_soc_component *component;
429         struct snd_soc_rtdcom_list *rtdcom;
430         struct snd_soc_dai *codec_dai = rtd->codec_dai;
431         struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
432         int ret = 0, __ret;
433
434         mutex_lock_nested(&rtd->pcm_mutex, rtd->pcm_subclass);
435
436         if (platform && platform->driver->compr_ops && platform->driver->compr_ops->trigger) {
437                 ret = platform->driver->compr_ops->trigger(cstream, cmd);
438                 if (ret < 0)
439                         goto out;
440         }
441
442         for_each_rtdcom(rtd, rtdcom) {
443                 component = rtdcom->component;
444
445                 /* ignore duplication for now */
446                 if (platform && (component == &platform->component))
447                         continue;
448
449                 if (!component->driver->compr_ops ||
450                     !component->driver->compr_ops->trigger)
451                         continue;
452
453                 __ret = component->driver->compr_ops->trigger(cstream, cmd);
454                 if (__ret < 0)
455                         ret = __ret;
456         }
457         if (ret < 0)
458                 goto out;
459
460         if (cpu_dai->driver->cops && cpu_dai->driver->cops->trigger)
461                 cpu_dai->driver->cops->trigger(cstream, cmd, cpu_dai);
462
463
464         switch (cmd) {
465         case SNDRV_PCM_TRIGGER_START:
466                 snd_soc_dai_digital_mute(codec_dai, 0, cstream->direction);
467                 break;
468         case SNDRV_PCM_TRIGGER_STOP:
469                 snd_soc_dai_digital_mute(codec_dai, 1, cstream->direction);
470                 break;
471         }
472
473 out:
474         mutex_unlock(&rtd->pcm_mutex);
475         return ret;
476 }
477
478 static int soc_compr_trigger_fe(struct snd_compr_stream *cstream, int cmd)
479 {
480         struct snd_soc_pcm_runtime *fe = cstream->private_data;
481         struct snd_soc_platform *platform = fe->platform;
482         struct snd_soc_component *component;
483         struct snd_soc_rtdcom_list *rtdcom;
484         struct snd_soc_dai *cpu_dai = fe->cpu_dai;
485         int ret = 0, __ret, stream;
486
487         if (cmd == SND_COMPR_TRIGGER_PARTIAL_DRAIN ||
488                 cmd == SND_COMPR_TRIGGER_DRAIN) {
489
490                 if (platform &&
491                     platform->driver->compr_ops &&
492                     platform->driver->compr_ops->trigger)
493                         return platform->driver->compr_ops->trigger(cstream,
494                                                                     cmd);
495
496                 for_each_rtdcom(fe, rtdcom) {
497                         component = rtdcom->component;
498
499                         /* ignore duplication for now */
500                         if (platform && (component == &platform->component))
501                                 continue;
502
503                         if (!component->driver->compr_ops ||
504                             !component->driver->compr_ops->trigger)
505                                 continue;
506
507                         __ret = component->driver->compr_ops->trigger(cstream, cmd);
508                         if (__ret < 0)
509                                 ret = __ret;
510                 }
511                 return ret;
512         }
513
514         if (cstream->direction == SND_COMPRESS_PLAYBACK)
515                 stream = SNDRV_PCM_STREAM_PLAYBACK;
516         else
517                 stream = SNDRV_PCM_STREAM_CAPTURE;
518
519
520         mutex_lock_nested(&fe->card->mutex, SND_SOC_CARD_CLASS_RUNTIME);
521
522         if (cpu_dai->driver->cops && cpu_dai->driver->cops->trigger) {
523                 ret = cpu_dai->driver->cops->trigger(cstream, cmd, cpu_dai);
524                 if (ret < 0)
525                         goto out;
526         }
527
528         if (platform && platform->driver->compr_ops && platform->driver->compr_ops->trigger) {
529                 ret = platform->driver->compr_ops->trigger(cstream, cmd);
530                 if (ret < 0)
531                         goto out;
532         }
533
534         for_each_rtdcom(fe, rtdcom) {
535                 component = rtdcom->component;
536
537                 /* ignore duplication for now */
538                 if (platform && (component == &platform->component))
539                         continue;
540
541                 if (!component->driver->compr_ops ||
542                     !component->driver->compr_ops->trigger)
543                         continue;
544
545                 __ret = component->driver->compr_ops->trigger(cstream, cmd);
546                 if (__ret < 0)
547                         ret = __ret;
548         }
549         if (ret < 0)
550                 goto out;
551
552         fe->dpcm[stream].runtime_update = SND_SOC_DPCM_UPDATE_FE;
553
554         ret = dpcm_be_dai_trigger(fe, stream, cmd);
555
556         switch (cmd) {
557         case SNDRV_PCM_TRIGGER_START:
558         case SNDRV_PCM_TRIGGER_RESUME:
559         case SNDRV_PCM_TRIGGER_PAUSE_RELEASE:
560                 fe->dpcm[stream].state = SND_SOC_DPCM_STATE_START;
561                 break;
562         case SNDRV_PCM_TRIGGER_STOP:
563         case SNDRV_PCM_TRIGGER_SUSPEND:
564                 fe->dpcm[stream].state = SND_SOC_DPCM_STATE_STOP;
565                 break;
566         case SNDRV_PCM_TRIGGER_PAUSE_PUSH:
567                 fe->dpcm[stream].state = SND_SOC_DPCM_STATE_PAUSED;
568                 break;
569         }
570
571 out:
572         fe->dpcm[stream].runtime_update = SND_SOC_DPCM_UPDATE_NO;
573         mutex_unlock(&fe->card->mutex);
574         return ret;
575 }
576
577 static int soc_compr_set_params(struct snd_compr_stream *cstream,
578                                         struct snd_compr_params *params)
579 {
580         struct snd_soc_pcm_runtime *rtd = cstream->private_data;
581         struct snd_soc_platform *platform = rtd->platform;
582         struct snd_soc_component *component;
583         struct snd_soc_rtdcom_list *rtdcom;
584         struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
585         int ret = 0, __ret;
586
587         mutex_lock_nested(&rtd->pcm_mutex, rtd->pcm_subclass);
588
589         /* first we call set_params for the platform driver
590          * this should configure the soc side
591          * if the machine has compressed ops then we call that as well
592          * expectation is that platform and machine will configure everything
593          * for this compress path, like configuring pcm port for codec
594          */
595         if (cpu_dai->driver->cops && cpu_dai->driver->cops->set_params) {
596                 ret = cpu_dai->driver->cops->set_params(cstream, params, cpu_dai);
597                 if (ret < 0)
598                         goto err;
599         }
600
601         if (platform && platform->driver->compr_ops && platform->driver->compr_ops->set_params) {
602                 ret = platform->driver->compr_ops->set_params(cstream, params);
603                 if (ret < 0)
604                         goto err;
605         }
606
607         for_each_rtdcom(rtd, rtdcom) {
608                 component = rtdcom->component;
609
610                 /* ignore duplication for now */
611                 if (platform && (component == &platform->component))
612                         continue;
613
614                 if (!component->driver->compr_ops ||
615                     !component->driver->compr_ops->set_params)
616                         continue;
617
618                 __ret = component->driver->compr_ops->set_params(cstream, params);
619                 if (__ret < 0)
620                         ret = __ret;
621         }
622         if (ret < 0)
623                 goto err;
624
625         if (rtd->dai_link->compr_ops && rtd->dai_link->compr_ops->set_params) {
626                 ret = rtd->dai_link->compr_ops->set_params(cstream);
627                 if (ret < 0)
628                         goto err;
629         }
630
631         if (cstream->direction == SND_COMPRESS_PLAYBACK)
632                 snd_soc_dapm_stream_event(rtd, SNDRV_PCM_STREAM_PLAYBACK,
633                                         SND_SOC_DAPM_STREAM_START);
634         else
635                 snd_soc_dapm_stream_event(rtd, SNDRV_PCM_STREAM_CAPTURE,
636                                         SND_SOC_DAPM_STREAM_START);
637
638         /* cancel any delayed stream shutdown that is pending */
639         rtd->pop_wait = 0;
640         mutex_unlock(&rtd->pcm_mutex);
641
642         cancel_delayed_work_sync(&rtd->delayed_work);
643
644         return ret;
645
646 err:
647         mutex_unlock(&rtd->pcm_mutex);
648         return ret;
649 }
650
651 static int soc_compr_set_params_fe(struct snd_compr_stream *cstream,
652                                         struct snd_compr_params *params)
653 {
654         struct snd_soc_pcm_runtime *fe = cstream->private_data;
655         struct snd_pcm_substream *fe_substream =
656                  fe->pcm->streams[cstream->direction].substream;
657         struct snd_soc_platform *platform = fe->platform;
658         struct snd_soc_component *component;
659         struct snd_soc_rtdcom_list *rtdcom;
660         struct snd_soc_dai *cpu_dai = fe->cpu_dai;
661         int ret = 0, __ret, stream;
662
663         if (cstream->direction == SND_COMPRESS_PLAYBACK)
664                 stream = SNDRV_PCM_STREAM_PLAYBACK;
665         else
666                 stream = SNDRV_PCM_STREAM_CAPTURE;
667
668         mutex_lock_nested(&fe->card->mutex, SND_SOC_CARD_CLASS_RUNTIME);
669
670         if (cpu_dai->driver->cops && cpu_dai->driver->cops->set_params) {
671                 ret = cpu_dai->driver->cops->set_params(cstream, params, cpu_dai);
672                 if (ret < 0)
673                         goto out;
674         }
675
676         if (platform && platform->driver->compr_ops && platform->driver->compr_ops->set_params) {
677                 ret = platform->driver->compr_ops->set_params(cstream, params);
678                 if (ret < 0)
679                         goto out;
680         }
681
682         for_each_rtdcom(fe, rtdcom) {
683                 component = rtdcom->component;
684
685                 /* ignore duplication for now */
686                 if (platform && (component == &platform->component))
687                         continue;
688
689                 if (!component->driver->compr_ops ||
690                     !component->driver->compr_ops->set_params)
691                         continue;
692
693                 __ret = component->driver->compr_ops->set_params(cstream, params);
694                 if (__ret < 0)
695                         ret = __ret;
696         }
697         if (ret < 0)
698                 goto out;
699
700         if (fe->dai_link->compr_ops && fe->dai_link->compr_ops->set_params) {
701                 ret = fe->dai_link->compr_ops->set_params(cstream);
702                 if (ret < 0)
703                         goto out;
704         }
705
706         /*
707          * Create an empty hw_params for the BE as the machine driver must
708          * fix this up to match DSP decoder and ASRC configuration.
709          * I.e. machine driver fixup for compressed BE is mandatory.
710          */
711         memset(&fe->dpcm[fe_substream->stream].hw_params, 0,
712                 sizeof(struct snd_pcm_hw_params));
713
714         fe->dpcm[stream].runtime_update = SND_SOC_DPCM_UPDATE_FE;
715
716         ret = dpcm_be_dai_hw_params(fe, stream);
717         if (ret < 0)
718                 goto out;
719
720         ret = dpcm_be_dai_prepare(fe, stream);
721         if (ret < 0)
722                 goto out;
723
724         dpcm_dapm_stream_event(fe, stream, SND_SOC_DAPM_STREAM_START);
725         fe->dpcm[stream].state = SND_SOC_DPCM_STATE_PREPARE;
726
727 out:
728         fe->dpcm[stream].runtime_update = SND_SOC_DPCM_UPDATE_NO;
729         mutex_unlock(&fe->card->mutex);
730         return ret;
731 }
732
733 static int soc_compr_get_params(struct snd_compr_stream *cstream,
734                                         struct snd_codec *params)
735 {
736         struct snd_soc_pcm_runtime *rtd = cstream->private_data;
737         struct snd_soc_platform *platform = rtd->platform;
738         struct snd_soc_component *component;
739         struct snd_soc_rtdcom_list *rtdcom;
740         struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
741         int ret = 0, __ret;
742
743         mutex_lock_nested(&rtd->pcm_mutex, rtd->pcm_subclass);
744
745         if (cpu_dai->driver->cops && cpu_dai->driver->cops->get_params) {
746                 ret = cpu_dai->driver->cops->get_params(cstream, params, cpu_dai);
747                 if (ret < 0)
748                         goto err;
749         }
750
751         if (platform && platform->driver->compr_ops && platform->driver->compr_ops->get_params) {
752                 ret = platform->driver->compr_ops->get_params(cstream, params);
753                 if (ret < 0)
754                         goto err;
755         }
756
757         for_each_rtdcom(rtd, rtdcom) {
758                 component = rtdcom->component;
759
760                 /* ignore duplication for now */
761                 if (platform && (component == &platform->component))
762                         continue;
763
764                 if (!component->driver->compr_ops ||
765                     !component->driver->compr_ops->get_params)
766                         continue;
767
768                 __ret = component->driver->compr_ops->get_params(cstream, params);
769                 if (__ret < 0)
770                         ret = __ret;
771         }
772
773 err:
774         mutex_unlock(&rtd->pcm_mutex);
775         return ret;
776 }
777
778 static int soc_compr_get_caps(struct snd_compr_stream *cstream,
779                                 struct snd_compr_caps *caps)
780 {
781         struct snd_soc_pcm_runtime *rtd = cstream->private_data;
782         struct snd_soc_platform *platform = rtd->platform;
783         struct snd_soc_component *component;
784         struct snd_soc_rtdcom_list *rtdcom;
785         int ret = 0, __ret;
786
787         mutex_lock_nested(&rtd->pcm_mutex, rtd->pcm_subclass);
788
789         if (platform && platform->driver->compr_ops && platform->driver->compr_ops->get_caps) {
790                 ret = platform->driver->compr_ops->get_caps(cstream, caps);
791                 if (ret < 0)
792                         goto err;
793         }
794
795         for_each_rtdcom(rtd, rtdcom) {
796                 component = rtdcom->component;
797
798                 /* ignore duplication for now */
799                 if (platform && (component == &platform->component))
800                         continue;
801
802                 if (!component->driver->compr_ops ||
803                     !component->driver->compr_ops->get_caps)
804                         continue;
805
806                 __ret = component->driver->compr_ops->get_caps(cstream, caps);
807                 if (__ret < 0)
808                         ret = __ret;
809         }
810
811 err:
812         mutex_unlock(&rtd->pcm_mutex);
813         return ret;
814 }
815
816 static int soc_compr_get_codec_caps(struct snd_compr_stream *cstream,
817                                 struct snd_compr_codec_caps *codec)
818 {
819         struct snd_soc_pcm_runtime *rtd = cstream->private_data;
820         struct snd_soc_platform *platform = rtd->platform;
821         struct snd_soc_component *component;
822         struct snd_soc_rtdcom_list *rtdcom;
823         int ret = 0, __ret;
824
825         mutex_lock_nested(&rtd->pcm_mutex, rtd->pcm_subclass);
826
827         if (platform && platform->driver->compr_ops && platform->driver->compr_ops->get_codec_caps) {
828                 ret = platform->driver->compr_ops->get_codec_caps(cstream, codec);
829                 if (ret < 0)
830                         goto err;
831         }
832
833         for_each_rtdcom(rtd, rtdcom) {
834                 component = rtdcom->component;
835
836                 /* ignore duplication for now */
837                 if (platform && (component == &platform->component))
838                         continue;
839
840                 if (!component->driver->compr_ops ||
841                     !component->driver->compr_ops->get_codec_caps)
842                         continue;
843
844                 __ret = component->driver->compr_ops->get_codec_caps(cstream, codec);
845                 if (__ret < 0)
846                         ret = __ret;
847         }
848
849 err:
850         mutex_unlock(&rtd->pcm_mutex);
851         return ret;
852 }
853
854 static int soc_compr_ack(struct snd_compr_stream *cstream, size_t bytes)
855 {
856         struct snd_soc_pcm_runtime *rtd = cstream->private_data;
857         struct snd_soc_platform *platform = rtd->platform;
858         struct snd_soc_component *component;
859         struct snd_soc_rtdcom_list *rtdcom;
860         struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
861         int ret = 0, __ret;
862
863         mutex_lock_nested(&rtd->pcm_mutex, rtd->pcm_subclass);
864
865         if (cpu_dai->driver->cops && cpu_dai->driver->cops->ack) {
866                 ret = cpu_dai->driver->cops->ack(cstream, bytes, cpu_dai);
867                 if (ret < 0)
868                         goto err;
869         }
870
871         if (platform && platform->driver->compr_ops && platform->driver->compr_ops->ack) {
872                 ret = platform->driver->compr_ops->ack(cstream, bytes);
873                 if (ret < 0)
874                         goto err;
875         }
876
877         for_each_rtdcom(rtd, rtdcom) {
878                 component = rtdcom->component;
879
880                 /* ignore duplication for now */
881                 if (platform && (component == &platform->component))
882                         continue;
883
884                 if (!component->driver->compr_ops ||
885                     !component->driver->compr_ops->ack)
886                         continue;
887
888                 __ret = component->driver->compr_ops->ack(cstream, bytes);
889                 if (__ret < 0)
890                         ret = __ret;
891         }
892
893 err:
894         mutex_unlock(&rtd->pcm_mutex);
895         return ret;
896 }
897
898 static int soc_compr_pointer(struct snd_compr_stream *cstream,
899                         struct snd_compr_tstamp *tstamp)
900 {
901         struct snd_soc_pcm_runtime *rtd = cstream->private_data;
902         struct snd_soc_platform *platform = rtd->platform;
903         struct snd_soc_component *component;
904         struct snd_soc_rtdcom_list *rtdcom;
905         int ret = 0, __ret;
906         struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
907
908         mutex_lock_nested(&rtd->pcm_mutex, rtd->pcm_subclass);
909
910         if (cpu_dai->driver->cops && cpu_dai->driver->cops->pointer)
911                 cpu_dai->driver->cops->pointer(cstream, tstamp, cpu_dai);
912
913         if (platform && platform->driver->compr_ops && platform->driver->compr_ops->pointer) {
914                 ret = platform->driver->compr_ops->pointer(cstream, tstamp);
915                 if (ret < 0)
916                         goto err;
917         }
918
919         for_each_rtdcom(rtd, rtdcom) {
920                 component = rtdcom->component;
921
922                 /* ignore duplication for now */
923                 if (platform && (component == &platform->component))
924                         continue;
925
926                 if (!component->driver->compr_ops ||
927                     !component->driver->compr_ops->pointer)
928                         continue;
929
930                 __ret = component->driver->compr_ops->pointer(cstream, tstamp);
931                 if (__ret < 0)
932                         ret = __ret;
933         }
934
935 err:
936         mutex_unlock(&rtd->pcm_mutex);
937         return ret;
938 }
939
940 static int soc_compr_copy(struct snd_compr_stream *cstream,
941                           char __user *buf, size_t count)
942 {
943         struct snd_soc_pcm_runtime *rtd = cstream->private_data;
944         struct snd_soc_platform *platform = rtd->platform;
945         struct snd_soc_component *component;
946         struct snd_soc_rtdcom_list *rtdcom;
947         int ret = 0, __ret;
948
949         mutex_lock_nested(&rtd->pcm_mutex, rtd->pcm_subclass);
950
951         if (platform && platform->driver->compr_ops && platform->driver->compr_ops->copy) {
952                 ret = platform->driver->compr_ops->copy(cstream, buf, count);
953                 if (ret < 0)
954                         goto err;
955         }
956
957         for_each_rtdcom(rtd, rtdcom) {
958                 component = rtdcom->component;
959
960                 /* ignore duplication for now */
961                 if (platform && (component == &platform->component))
962                         continue;
963
964                 if (!component->driver->compr_ops ||
965                     !component->driver->compr_ops->copy)
966                         continue;
967
968                 __ret = component->driver->compr_ops->copy(cstream, buf, count);
969                 if (__ret < 0)
970                         ret = __ret;
971         }
972 err:
973         mutex_unlock(&rtd->pcm_mutex);
974         return ret;
975 }
976
977 static int soc_compr_set_metadata(struct snd_compr_stream *cstream,
978                                 struct snd_compr_metadata *metadata)
979 {
980         struct snd_soc_pcm_runtime *rtd = cstream->private_data;
981         struct snd_soc_platform *platform = rtd->platform;
982         struct snd_soc_component *component;
983         struct snd_soc_rtdcom_list *rtdcom;
984         struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
985         int ret = 0, __ret;
986
987         if (cpu_dai->driver->cops && cpu_dai->driver->cops->set_metadata) {
988                 ret = cpu_dai->driver->cops->set_metadata(cstream, metadata, cpu_dai);
989                 if (ret < 0)
990                         return ret;
991         }
992
993         if (platform && platform->driver->compr_ops && platform->driver->compr_ops->set_metadata) {
994                 ret = platform->driver->compr_ops->set_metadata(cstream, metadata);
995                 if (ret < 0)
996                         return ret;
997         }
998
999         for_each_rtdcom(rtd, rtdcom) {
1000                 component = rtdcom->component;
1001
1002                 /* ignore duplication for now */
1003                 if (platform && (component == &platform->component))
1004                         continue;
1005
1006                 if (!component->driver->compr_ops ||
1007                     !component->driver->compr_ops->set_metadata)
1008                         continue;
1009
1010                 __ret = component->driver->compr_ops->set_metadata(cstream, metadata);
1011                 if (__ret < 0)
1012                         ret = __ret;
1013         }
1014
1015         return ret;
1016 }
1017
1018 static int soc_compr_get_metadata(struct snd_compr_stream *cstream,
1019                                 struct snd_compr_metadata *metadata)
1020 {
1021         struct snd_soc_pcm_runtime *rtd = cstream->private_data;
1022         struct snd_soc_platform *platform = rtd->platform;
1023         struct snd_soc_component *component;
1024         struct snd_soc_rtdcom_list *rtdcom;
1025         struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
1026         int ret = 0, __ret;
1027
1028         if (cpu_dai->driver->cops && cpu_dai->driver->cops->get_metadata) {
1029                 ret = cpu_dai->driver->cops->get_metadata(cstream, metadata, cpu_dai);
1030                 if (ret < 0)
1031                         return ret;
1032         }
1033
1034         if (platform && platform->driver->compr_ops && platform->driver->compr_ops->get_metadata) {
1035                 ret = platform->driver->compr_ops->get_metadata(cstream, metadata);
1036                 if (ret < 0)
1037                         return ret;
1038         }
1039
1040         for_each_rtdcom(rtd, rtdcom) {
1041                 component = rtdcom->component;
1042
1043                 /* ignore duplication for now */
1044                 if (platform && (component == &platform->component))
1045                         continue;
1046
1047                 if (!component->driver->compr_ops ||
1048                     !component->driver->compr_ops->get_metadata)
1049                         continue;
1050
1051                 __ret = component->driver->compr_ops->get_metadata(cstream, metadata);
1052                 if (__ret < 0)
1053                         ret = __ret;
1054         }
1055
1056         return ret;
1057 }
1058
1059 /* ASoC Compress operations */
1060 static struct snd_compr_ops soc_compr_ops = {
1061         .open           = soc_compr_open,
1062         .free           = soc_compr_free,
1063         .set_params     = soc_compr_set_params,
1064         .set_metadata   = soc_compr_set_metadata,
1065         .get_metadata   = soc_compr_get_metadata,
1066         .get_params     = soc_compr_get_params,
1067         .trigger        = soc_compr_trigger,
1068         .pointer        = soc_compr_pointer,
1069         .ack            = soc_compr_ack,
1070         .get_caps       = soc_compr_get_caps,
1071         .get_codec_caps = soc_compr_get_codec_caps
1072 };
1073
1074 /* ASoC Dynamic Compress operations */
1075 static struct snd_compr_ops soc_compr_dyn_ops = {
1076         .open           = soc_compr_open_fe,
1077         .free           = soc_compr_free_fe,
1078         .set_params     = soc_compr_set_params_fe,
1079         .get_params     = soc_compr_get_params,
1080         .set_metadata   = soc_compr_set_metadata,
1081         .get_metadata   = soc_compr_get_metadata,
1082         .trigger        = soc_compr_trigger_fe,
1083         .pointer        = soc_compr_pointer,
1084         .ack            = soc_compr_ack,
1085         .get_caps       = soc_compr_get_caps,
1086         .get_codec_caps = soc_compr_get_codec_caps
1087 };
1088
1089 /**
1090  * snd_soc_new_compress - create a new compress.
1091  *
1092  * @rtd: The runtime for which we will create compress
1093  * @num: the device index number (zero based - shared with normal PCMs)
1094  *
1095  * Return: 0 for success, else error.
1096  */
1097 int snd_soc_new_compress(struct snd_soc_pcm_runtime *rtd, int num)
1098 {
1099         struct snd_soc_codec *codec = rtd->codec;
1100         struct snd_soc_platform *platform = rtd->platform;
1101         struct snd_soc_component *component;
1102         struct snd_soc_rtdcom_list *rtdcom;
1103         struct snd_soc_dai *codec_dai = rtd->codec_dai;
1104         struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
1105         struct snd_compr *compr;
1106         struct snd_pcm *be_pcm;
1107         char new_name[64];
1108         int ret = 0, direction = 0;
1109         int playback = 0, capture = 0;
1110
1111         if (rtd->num_codecs > 1) {
1112                 dev_err(rtd->card->dev, "Multicodec not supported for compressed stream\n");
1113                 return -EINVAL;
1114         }
1115
1116         /* check client and interface hw capabilities */
1117         if (codec_dai->driver->playback.channels_min)
1118                 playback = 1;
1119         if (codec_dai->driver->capture.channels_min)
1120                 capture = 1;
1121
1122         capture = capture && cpu_dai->driver->capture.channels_min;
1123         playback = playback && cpu_dai->driver->playback.channels_min;
1124
1125         /*
1126          * Compress devices are unidirectional so only one of the directions
1127          * should be set, check for that (xor)
1128          */
1129         if (playback + capture != 1) {
1130                 dev_err(rtd->card->dev, "Invalid direction for compress P %d, C %d\n",
1131                                 playback, capture);
1132                 return -EINVAL;
1133         }
1134
1135         if (playback)
1136                 direction = SND_COMPRESS_PLAYBACK;
1137         else
1138                 direction = SND_COMPRESS_CAPTURE;
1139
1140         compr = kzalloc(sizeof(*compr), GFP_KERNEL);
1141         if (!compr)
1142                 return -ENOMEM;
1143
1144         compr->ops = devm_kzalloc(rtd->card->dev, sizeof(soc_compr_ops),
1145                                   GFP_KERNEL);
1146         if (!compr->ops) {
1147                 ret = -ENOMEM;
1148                 goto compr_err;
1149         }
1150
1151         if (rtd->dai_link->dynamic) {
1152                 snprintf(new_name, sizeof(new_name), "(%s)",
1153                         rtd->dai_link->stream_name);
1154
1155                 ret = snd_pcm_new_internal(rtd->card->snd_card, new_name, num,
1156                                 rtd->dai_link->dpcm_playback,
1157                                 rtd->dai_link->dpcm_capture, &be_pcm);
1158                 if (ret < 0) {
1159                         dev_err(rtd->card->dev, "ASoC: can't create compressed for %s\n",
1160                                 rtd->dai_link->name);
1161                         goto compr_err;
1162                 }
1163
1164                 rtd->pcm = be_pcm;
1165                 rtd->fe_compr = 1;
1166                 if (rtd->dai_link->dpcm_playback)
1167                         be_pcm->streams[SNDRV_PCM_STREAM_PLAYBACK].substream->private_data = rtd;
1168                 else if (rtd->dai_link->dpcm_capture)
1169                         be_pcm->streams[SNDRV_PCM_STREAM_CAPTURE].substream->private_data = rtd;
1170                 memcpy(compr->ops, &soc_compr_dyn_ops, sizeof(soc_compr_dyn_ops));
1171         } else {
1172                 snprintf(new_name, sizeof(new_name), "%s %s-%d",
1173                         rtd->dai_link->stream_name, codec_dai->name, num);
1174
1175                 memcpy(compr->ops, &soc_compr_ops, sizeof(soc_compr_ops));
1176         }
1177
1178
1179         /* Add copy callback for not memory mapped DSPs */
1180         if (platform && platform->driver->compr_ops && platform->driver->compr_ops->copy)
1181                 compr->ops->copy = soc_compr_copy;
1182
1183         for_each_rtdcom(rtd, rtdcom) {
1184                 component = rtdcom->component;
1185
1186                 /* ignore duplication for now */
1187                 if (platform && (component == &platform->component))
1188                         continue;
1189
1190                 if (!component->driver->compr_ops ||
1191                     !component->driver->compr_ops->copy)
1192                         continue;
1193
1194                 compr->ops->copy = soc_compr_copy;
1195         }
1196
1197
1198         mutex_init(&compr->lock);
1199         ret = snd_compress_new(rtd->card->snd_card, num, direction,
1200                                 new_name, compr);
1201         if (ret < 0) {
1202                 pr_err("compress asoc: can't create compress for codec %s\n",
1203                         codec->component.name);
1204                 goto compr_err;
1205         }
1206
1207         /* DAPM dai link stream work */
1208         INIT_DELAYED_WORK(&rtd->delayed_work, close_delayed_work);
1209
1210         rtd->compr = compr;
1211         compr->private_data = rtd;
1212
1213         printk(KERN_INFO "compress asoc: %s <-> %s mapping ok\n", codec_dai->name,
1214                 cpu_dai->name);
1215         return ret;
1216
1217 compr_err:
1218         kfree(compr);
1219         return ret;
1220 }
1221 EXPORT_SYMBOL_GPL(snd_soc_new_compress);