clk: mediatek: using CLK_MUX_ROUND_CLOSEST for the clock of dpi1_sel
[linux-2.6-microblaze.git] / sound / core / compress_offload.c
1 /*
2  *  compress_core.c - compress offload core
3  *
4  *  Copyright (C) 2011 Intel Corporation
5  *  Authors:    Vinod Koul <vinod.koul@linux.intel.com>
6  *              Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
7  *  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
8  *
9  *  This program is free software; you can redistribute it and/or modify
10  *  it under the terms of the GNU General Public License as published by
11  *  the Free Software Foundation; version 2 of the License.
12  *
13  *  This program is distributed in the hope that it will be useful, but
14  *  WITHOUT ANY WARRANTY; without even the implied warranty of
15  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
16  *  General Public License for more details.
17  *
18  *  You should have received a copy of the GNU General Public License along
19  *  with this program; if not, write to the Free Software Foundation, Inc.,
20  *  59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
21  *
22  * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
23  *
24  */
25 #define FORMAT(fmt) "%s: %d: " fmt, __func__, __LINE__
26 #define pr_fmt(fmt) KBUILD_MODNAME ": " FORMAT(fmt)
27
28 #include <linux/file.h>
29 #include <linux/fs.h>
30 #include <linux/list.h>
31 #include <linux/math64.h>
32 #include <linux/mm.h>
33 #include <linux/mutex.h>
34 #include <linux/poll.h>
35 #include <linux/slab.h>
36 #include <linux/sched.h>
37 #include <linux/types.h>
38 #include <linux/uio.h>
39 #include <linux/uaccess.h>
40 #include <linux/module.h>
41 #include <linux/compat.h>
42 #include <sound/core.h>
43 #include <sound/initval.h>
44 #include <sound/info.h>
45 #include <sound/compress_params.h>
46 #include <sound/compress_offload.h>
47 #include <sound/compress_driver.h>
48
49 /* struct snd_compr_codec_caps overflows the ioctl bit size for some
50  * architectures, so we need to disable the relevant ioctls.
51  */
52 #if _IOC_SIZEBITS < 14
53 #define COMPR_CODEC_CAPS_OVERFLOW
54 #endif
55
56 /* TODO:
57  * - add substream support for multiple devices in case of
58  *      SND_DYNAMIC_MINORS is not used
59  * - Multiple node representation
60  *      driver should be able to register multiple nodes
61  */
62
63 static DEFINE_MUTEX(device_mutex);
64
65 struct snd_compr_file {
66         unsigned long caps;
67         struct snd_compr_stream stream;
68 };
69
70 static void error_delayed_work(struct work_struct *work);
71
72 /*
73  * a note on stream states used:
74  * we use following states in the compressed core
75  * SNDRV_PCM_STATE_OPEN: When stream has been opened.
76  * SNDRV_PCM_STATE_SETUP: When stream has been initialized. This is done by
77  *      calling SNDRV_COMPRESS_SET_PARAMS. Running streams will come to this
78  *      state at stop by calling SNDRV_COMPRESS_STOP, or at end of drain.
79  * SNDRV_PCM_STATE_PREPARED: When a stream has been written to (for
80  *      playback only). User after setting up stream writes the data buffer
81  *      before starting the stream.
82  * SNDRV_PCM_STATE_RUNNING: When stream has been started and is
83  *      decoding/encoding and rendering/capturing data.
84  * SNDRV_PCM_STATE_DRAINING: When stream is draining current data. This is done
85  *      by calling SNDRV_COMPRESS_DRAIN.
86  * SNDRV_PCM_STATE_PAUSED: When stream is paused. This is done by calling
87  *      SNDRV_COMPRESS_PAUSE. It can be stopped or resumed by calling
88  *      SNDRV_COMPRESS_STOP or SNDRV_COMPRESS_RESUME respectively.
89  */
90 static int snd_compr_open(struct inode *inode, struct file *f)
91 {
92         struct snd_compr *compr;
93         struct snd_compr_file *data;
94         struct snd_compr_runtime *runtime;
95         enum snd_compr_direction dirn;
96         int maj = imajor(inode);
97         int ret;
98
99         if ((f->f_flags & O_ACCMODE) == O_WRONLY)
100                 dirn = SND_COMPRESS_PLAYBACK;
101         else if ((f->f_flags & O_ACCMODE) == O_RDONLY)
102                 dirn = SND_COMPRESS_CAPTURE;
103         else
104                 return -EINVAL;
105
106         if (maj == snd_major)
107                 compr = snd_lookup_minor_data(iminor(inode),
108                                         SNDRV_DEVICE_TYPE_COMPRESS);
109         else
110                 return -EBADFD;
111
112         if (compr == NULL) {
113                 pr_err("no device data!!!\n");
114                 return -ENODEV;
115         }
116
117         if (dirn != compr->direction) {
118                 pr_err("this device doesn't support this direction\n");
119                 snd_card_unref(compr->card);
120                 return -EINVAL;
121         }
122
123         data = kzalloc(sizeof(*data), GFP_KERNEL);
124         if (!data) {
125                 snd_card_unref(compr->card);
126                 return -ENOMEM;
127         }
128
129         INIT_DELAYED_WORK(&data->stream.error_work, error_delayed_work);
130
131         data->stream.ops = compr->ops;
132         data->stream.direction = dirn;
133         data->stream.private_data = compr->private_data;
134         data->stream.device = compr;
135         runtime = kzalloc(sizeof(*runtime), GFP_KERNEL);
136         if (!runtime) {
137                 kfree(data);
138                 snd_card_unref(compr->card);
139                 return -ENOMEM;
140         }
141         runtime->state = SNDRV_PCM_STATE_OPEN;
142         init_waitqueue_head(&runtime->sleep);
143         data->stream.runtime = runtime;
144         f->private_data = (void *)data;
145         mutex_lock(&compr->lock);
146         ret = compr->ops->open(&data->stream);
147         mutex_unlock(&compr->lock);
148         if (ret) {
149                 kfree(runtime);
150                 kfree(data);
151         }
152         snd_card_unref(compr->card);
153         return ret;
154 }
155
156 static int snd_compr_free(struct inode *inode, struct file *f)
157 {
158         struct snd_compr_file *data = f->private_data;
159         struct snd_compr_runtime *runtime = data->stream.runtime;
160
161         cancel_delayed_work_sync(&data->stream.error_work);
162
163         switch (runtime->state) {
164         case SNDRV_PCM_STATE_RUNNING:
165         case SNDRV_PCM_STATE_DRAINING:
166         case SNDRV_PCM_STATE_PAUSED:
167                 data->stream.ops->trigger(&data->stream, SNDRV_PCM_TRIGGER_STOP);
168                 break;
169         default:
170                 break;
171         }
172
173         data->stream.ops->free(&data->stream);
174         if (!data->stream.runtime->dma_buffer_p)
175                 kfree(data->stream.runtime->buffer);
176         kfree(data->stream.runtime);
177         kfree(data);
178         return 0;
179 }
180
181 static int snd_compr_update_tstamp(struct snd_compr_stream *stream,
182                 struct snd_compr_tstamp *tstamp)
183 {
184         if (!stream->ops->pointer)
185                 return -ENOTSUPP;
186         stream->ops->pointer(stream, tstamp);
187         pr_debug("dsp consumed till %d total %d bytes\n",
188                 tstamp->byte_offset, tstamp->copied_total);
189         if (stream->direction == SND_COMPRESS_PLAYBACK)
190                 stream->runtime->total_bytes_transferred = tstamp->copied_total;
191         else
192                 stream->runtime->total_bytes_available = tstamp->copied_total;
193         return 0;
194 }
195
196 static size_t snd_compr_calc_avail(struct snd_compr_stream *stream,
197                 struct snd_compr_avail *avail)
198 {
199         memset(avail, 0, sizeof(*avail));
200         snd_compr_update_tstamp(stream, &avail->tstamp);
201         /* Still need to return avail even if tstamp can't be filled in */
202
203         if (stream->runtime->total_bytes_available == 0 &&
204                         stream->runtime->state == SNDRV_PCM_STATE_SETUP &&
205                         stream->direction == SND_COMPRESS_PLAYBACK) {
206                 pr_debug("detected init and someone forgot to do a write\n");
207                 return stream->runtime->buffer_size;
208         }
209         pr_debug("app wrote %lld, DSP consumed %lld\n",
210                         stream->runtime->total_bytes_available,
211                         stream->runtime->total_bytes_transferred);
212         if (stream->runtime->total_bytes_available ==
213                                 stream->runtime->total_bytes_transferred) {
214                 if (stream->direction == SND_COMPRESS_PLAYBACK) {
215                         pr_debug("both pointers are same, returning full avail\n");
216                         return stream->runtime->buffer_size;
217                 } else {
218                         pr_debug("both pointers are same, returning no avail\n");
219                         return 0;
220                 }
221         }
222
223         avail->avail = stream->runtime->total_bytes_available -
224                         stream->runtime->total_bytes_transferred;
225         if (stream->direction == SND_COMPRESS_PLAYBACK)
226                 avail->avail = stream->runtime->buffer_size - avail->avail;
227
228         pr_debug("ret avail as %lld\n", avail->avail);
229         return avail->avail;
230 }
231
232 static inline size_t snd_compr_get_avail(struct snd_compr_stream *stream)
233 {
234         struct snd_compr_avail avail;
235
236         return snd_compr_calc_avail(stream, &avail);
237 }
238
239 static int
240 snd_compr_ioctl_avail(struct snd_compr_stream *stream, unsigned long arg)
241 {
242         struct snd_compr_avail ioctl_avail;
243         size_t avail;
244
245         avail = snd_compr_calc_avail(stream, &ioctl_avail);
246         ioctl_avail.avail = avail;
247
248         switch (stream->runtime->state) {
249         case SNDRV_PCM_STATE_OPEN:
250                 return -EBADFD;
251         case SNDRV_PCM_STATE_XRUN:
252                 return -EPIPE;
253         default:
254                 break;
255         }
256
257         if (copy_to_user((__u64 __user *)arg,
258                                 &ioctl_avail, sizeof(ioctl_avail)))
259                 return -EFAULT;
260         return 0;
261 }
262
263 static int snd_compr_write_data(struct snd_compr_stream *stream,
264                const char __user *buf, size_t count)
265 {
266         void *dstn;
267         size_t copy;
268         struct snd_compr_runtime *runtime = stream->runtime;
269         /* 64-bit Modulus */
270         u64 app_pointer = div64_u64(runtime->total_bytes_available,
271                                     runtime->buffer_size);
272         app_pointer = runtime->total_bytes_available -
273                       (app_pointer * runtime->buffer_size);
274
275         dstn = runtime->buffer + app_pointer;
276         pr_debug("copying %ld at %lld\n",
277                         (unsigned long)count, app_pointer);
278         if (count < runtime->buffer_size - app_pointer) {
279                 if (copy_from_user(dstn, buf, count))
280                         return -EFAULT;
281         } else {
282                 copy = runtime->buffer_size - app_pointer;
283                 if (copy_from_user(dstn, buf, copy))
284                         return -EFAULT;
285                 if (copy_from_user(runtime->buffer, buf + copy, count - copy))
286                         return -EFAULT;
287         }
288         /* if DSP cares, let it know data has been written */
289         if (stream->ops->ack)
290                 stream->ops->ack(stream, count);
291         return count;
292 }
293
294 static ssize_t snd_compr_write(struct file *f, const char __user *buf,
295                 size_t count, loff_t *offset)
296 {
297         struct snd_compr_file *data = f->private_data;
298         struct snd_compr_stream *stream;
299         size_t avail;
300         int retval;
301
302         if (snd_BUG_ON(!data))
303                 return -EFAULT;
304
305         stream = &data->stream;
306         mutex_lock(&stream->device->lock);
307         /* write is allowed when stream is running or has been steup */
308         switch (stream->runtime->state) {
309         case SNDRV_PCM_STATE_SETUP:
310         case SNDRV_PCM_STATE_PREPARED:
311         case SNDRV_PCM_STATE_RUNNING:
312                 break;
313         default:
314                 mutex_unlock(&stream->device->lock);
315                 return -EBADFD;
316         }
317
318         avail = snd_compr_get_avail(stream);
319         pr_debug("avail returned %ld\n", (unsigned long)avail);
320         /* calculate how much we can write to buffer */
321         if (avail > count)
322                 avail = count;
323
324         if (stream->ops->copy) {
325                 char __user* cbuf = (char __user*)buf;
326                 retval = stream->ops->copy(stream, cbuf, avail);
327         } else {
328                 retval = snd_compr_write_data(stream, buf, avail);
329         }
330         if (retval > 0)
331                 stream->runtime->total_bytes_available += retval;
332
333         /* while initiating the stream, write should be called before START
334          * call, so in setup move state */
335         if (stream->runtime->state == SNDRV_PCM_STATE_SETUP) {
336                 stream->runtime->state = SNDRV_PCM_STATE_PREPARED;
337                 pr_debug("stream prepared, Houston we are good to go\n");
338         }
339
340         mutex_unlock(&stream->device->lock);
341         return retval;
342 }
343
344
345 static ssize_t snd_compr_read(struct file *f, char __user *buf,
346                 size_t count, loff_t *offset)
347 {
348         struct snd_compr_file *data = f->private_data;
349         struct snd_compr_stream *stream;
350         size_t avail;
351         int retval;
352
353         if (snd_BUG_ON(!data))
354                 return -EFAULT;
355
356         stream = &data->stream;
357         mutex_lock(&stream->device->lock);
358
359         /* read is allowed when stream is running, paused, draining and setup
360          * (yes setup is state which we transition to after stop, so if user
361          * wants to read data after stop we allow that)
362          */
363         switch (stream->runtime->state) {
364         case SNDRV_PCM_STATE_OPEN:
365         case SNDRV_PCM_STATE_PREPARED:
366         case SNDRV_PCM_STATE_SUSPENDED:
367         case SNDRV_PCM_STATE_DISCONNECTED:
368                 retval = -EBADFD;
369                 goto out;
370         case SNDRV_PCM_STATE_XRUN:
371                 retval = -EPIPE;
372                 goto out;
373         }
374
375         avail = snd_compr_get_avail(stream);
376         pr_debug("avail returned %ld\n", (unsigned long)avail);
377         /* calculate how much we can read from buffer */
378         if (avail > count)
379                 avail = count;
380
381         if (stream->ops->copy) {
382                 retval = stream->ops->copy(stream, buf, avail);
383         } else {
384                 retval = -ENXIO;
385                 goto out;
386         }
387         if (retval > 0)
388                 stream->runtime->total_bytes_transferred += retval;
389
390 out:
391         mutex_unlock(&stream->device->lock);
392         return retval;
393 }
394
395 static int snd_compr_mmap(struct file *f, struct vm_area_struct *vma)
396 {
397         return -ENXIO;
398 }
399
400 static __poll_t snd_compr_get_poll(struct snd_compr_stream *stream)
401 {
402         if (stream->direction == SND_COMPRESS_PLAYBACK)
403                 return EPOLLOUT | EPOLLWRNORM;
404         else
405                 return EPOLLIN | EPOLLRDNORM;
406 }
407
408 static __poll_t snd_compr_poll(struct file *f, poll_table *wait)
409 {
410         struct snd_compr_file *data = f->private_data;
411         struct snd_compr_stream *stream;
412         size_t avail;
413         __poll_t retval = 0;
414
415         if (snd_BUG_ON(!data))
416                 return EPOLLERR;
417
418         stream = &data->stream;
419
420         mutex_lock(&stream->device->lock);
421
422         switch (stream->runtime->state) {
423         case SNDRV_PCM_STATE_OPEN:
424         case SNDRV_PCM_STATE_XRUN:
425                 retval = snd_compr_get_poll(stream) | EPOLLERR;
426                 goto out;
427         default:
428                 break;
429         }
430
431         poll_wait(f, &stream->runtime->sleep, wait);
432
433         avail = snd_compr_get_avail(stream);
434         pr_debug("avail is %ld\n", (unsigned long)avail);
435         /* check if we have at least one fragment to fill */
436         switch (stream->runtime->state) {
437         case SNDRV_PCM_STATE_DRAINING:
438                 /* stream has been woken up after drain is complete
439                  * draining done so set stream state to stopped
440                  */
441                 retval = snd_compr_get_poll(stream);
442                 stream->runtime->state = SNDRV_PCM_STATE_SETUP;
443                 break;
444         case SNDRV_PCM_STATE_RUNNING:
445         case SNDRV_PCM_STATE_PREPARED:
446         case SNDRV_PCM_STATE_PAUSED:
447                 if (avail >= stream->runtime->fragment_size)
448                         retval = snd_compr_get_poll(stream);
449                 break;
450         default:
451                 retval = snd_compr_get_poll(stream) | EPOLLERR;
452                 break;
453         }
454 out:
455         mutex_unlock(&stream->device->lock);
456         return retval;
457 }
458
459 static int
460 snd_compr_get_caps(struct snd_compr_stream *stream, unsigned long arg)
461 {
462         int retval;
463         struct snd_compr_caps caps;
464
465         if (!stream->ops->get_caps)
466                 return -ENXIO;
467
468         memset(&caps, 0, sizeof(caps));
469         retval = stream->ops->get_caps(stream, &caps);
470         if (retval)
471                 goto out;
472         if (copy_to_user((void __user *)arg, &caps, sizeof(caps)))
473                 retval = -EFAULT;
474 out:
475         return retval;
476 }
477
478 #ifndef COMPR_CODEC_CAPS_OVERFLOW
479 static int
480 snd_compr_get_codec_caps(struct snd_compr_stream *stream, unsigned long arg)
481 {
482         int retval;
483         struct snd_compr_codec_caps *caps;
484
485         if (!stream->ops->get_codec_caps)
486                 return -ENXIO;
487
488         caps = kzalloc(sizeof(*caps), GFP_KERNEL);
489         if (!caps)
490                 return -ENOMEM;
491
492         retval = stream->ops->get_codec_caps(stream, caps);
493         if (retval)
494                 goto out;
495         if (copy_to_user((void __user *)arg, caps, sizeof(*caps)))
496                 retval = -EFAULT;
497
498 out:
499         kfree(caps);
500         return retval;
501 }
502 #endif /* !COMPR_CODEC_CAPS_OVERFLOW */
503
504 /* revisit this with snd_pcm_preallocate_xxx */
505 static int snd_compr_allocate_buffer(struct snd_compr_stream *stream,
506                 struct snd_compr_params *params)
507 {
508         unsigned int buffer_size;
509         void *buffer = NULL;
510
511         buffer_size = params->buffer.fragment_size * params->buffer.fragments;
512         if (stream->ops->copy) {
513                 buffer = NULL;
514                 /* if copy is defined the driver will be required to copy
515                  * the data from core
516                  */
517         } else {
518                 if (stream->runtime->dma_buffer_p) {
519
520                         if (buffer_size > stream->runtime->dma_buffer_p->bytes)
521                                 dev_err(&stream->device->dev,
522                                                 "Not enough DMA buffer");
523                         else
524                                 buffer = stream->runtime->dma_buffer_p->area;
525
526                 } else {
527                         buffer = kmalloc(buffer_size, GFP_KERNEL);
528                 }
529
530                 if (!buffer)
531                         return -ENOMEM;
532         }
533         stream->runtime->fragment_size = params->buffer.fragment_size;
534         stream->runtime->fragments = params->buffer.fragments;
535         stream->runtime->buffer = buffer;
536         stream->runtime->buffer_size = buffer_size;
537         return 0;
538 }
539
540 static int snd_compress_check_input(struct snd_compr_params *params)
541 {
542         /* first let's check the buffer parameter's */
543         if (params->buffer.fragment_size == 0 ||
544             params->buffer.fragments > INT_MAX / params->buffer.fragment_size)
545                 return -EINVAL;
546
547         /* now codec parameters */
548         if (params->codec.id == 0 || params->codec.id > SND_AUDIOCODEC_MAX)
549                 return -EINVAL;
550
551         if (params->codec.ch_in == 0 || params->codec.ch_out == 0)
552                 return -EINVAL;
553
554         return 0;
555 }
556
557 static int
558 snd_compr_set_params(struct snd_compr_stream *stream, unsigned long arg)
559 {
560         struct snd_compr_params *params;
561         int retval;
562
563         if (stream->runtime->state == SNDRV_PCM_STATE_OPEN) {
564                 /*
565                  * we should allow parameter change only when stream has been
566                  * opened not in other cases
567                  */
568                 params = memdup_user((void __user *)arg, sizeof(*params));
569                 if (IS_ERR(params))
570                         return PTR_ERR(params);
571
572                 retval = snd_compress_check_input(params);
573                 if (retval)
574                         goto out;
575
576                 retval = snd_compr_allocate_buffer(stream, params);
577                 if (retval) {
578                         retval = -ENOMEM;
579                         goto out;
580                 }
581
582                 retval = stream->ops->set_params(stream, params);
583                 if (retval)
584                         goto out;
585
586                 stream->metadata_set = false;
587                 stream->next_track = false;
588
589                 if (stream->direction == SND_COMPRESS_PLAYBACK)
590                         stream->runtime->state = SNDRV_PCM_STATE_SETUP;
591                 else
592                         stream->runtime->state = SNDRV_PCM_STATE_PREPARED;
593         } else {
594                 return -EPERM;
595         }
596 out:
597         kfree(params);
598         return retval;
599 }
600
601 static int
602 snd_compr_get_params(struct snd_compr_stream *stream, unsigned long arg)
603 {
604         struct snd_codec *params;
605         int retval;
606
607         if (!stream->ops->get_params)
608                 return -EBADFD;
609
610         params = kzalloc(sizeof(*params), GFP_KERNEL);
611         if (!params)
612                 return -ENOMEM;
613         retval = stream->ops->get_params(stream, params);
614         if (retval)
615                 goto out;
616         if (copy_to_user((char __user *)arg, params, sizeof(*params)))
617                 retval = -EFAULT;
618
619 out:
620         kfree(params);
621         return retval;
622 }
623
624 static int
625 snd_compr_get_metadata(struct snd_compr_stream *stream, unsigned long arg)
626 {
627         struct snd_compr_metadata metadata;
628         int retval;
629
630         if (!stream->ops->get_metadata)
631                 return -ENXIO;
632
633         if (copy_from_user(&metadata, (void __user *)arg, sizeof(metadata)))
634                 return -EFAULT;
635
636         retval = stream->ops->get_metadata(stream, &metadata);
637         if (retval != 0)
638                 return retval;
639
640         if (copy_to_user((void __user *)arg, &metadata, sizeof(metadata)))
641                 return -EFAULT;
642
643         return 0;
644 }
645
646 static int
647 snd_compr_set_metadata(struct snd_compr_stream *stream, unsigned long arg)
648 {
649         struct snd_compr_metadata metadata;
650         int retval;
651
652         if (!stream->ops->set_metadata)
653                 return -ENXIO;
654         /*
655         * we should allow parameter change only when stream has been
656         * opened not in other cases
657         */
658         if (copy_from_user(&metadata, (void __user *)arg, sizeof(metadata)))
659                 return -EFAULT;
660
661         retval = stream->ops->set_metadata(stream, &metadata);
662         stream->metadata_set = true;
663
664         return retval;
665 }
666
667 static inline int
668 snd_compr_tstamp(struct snd_compr_stream *stream, unsigned long arg)
669 {
670         struct snd_compr_tstamp tstamp = {0};
671         int ret;
672
673         ret = snd_compr_update_tstamp(stream, &tstamp);
674         if (ret == 0)
675                 ret = copy_to_user((struct snd_compr_tstamp __user *)arg,
676                         &tstamp, sizeof(tstamp)) ? -EFAULT : 0;
677         return ret;
678 }
679
680 static int snd_compr_pause(struct snd_compr_stream *stream)
681 {
682         int retval;
683
684         if (stream->runtime->state != SNDRV_PCM_STATE_RUNNING)
685                 return -EPERM;
686         retval = stream->ops->trigger(stream, SNDRV_PCM_TRIGGER_PAUSE_PUSH);
687         if (!retval)
688                 stream->runtime->state = SNDRV_PCM_STATE_PAUSED;
689         return retval;
690 }
691
692 static int snd_compr_resume(struct snd_compr_stream *stream)
693 {
694         int retval;
695
696         if (stream->runtime->state != SNDRV_PCM_STATE_PAUSED)
697                 return -EPERM;
698         retval = stream->ops->trigger(stream, SNDRV_PCM_TRIGGER_PAUSE_RELEASE);
699         if (!retval)
700                 stream->runtime->state = SNDRV_PCM_STATE_RUNNING;
701         return retval;
702 }
703
704 static int snd_compr_start(struct snd_compr_stream *stream)
705 {
706         int retval;
707
708         if (stream->runtime->state != SNDRV_PCM_STATE_PREPARED)
709                 return -EPERM;
710         retval = stream->ops->trigger(stream, SNDRV_PCM_TRIGGER_START);
711         if (!retval)
712                 stream->runtime->state = SNDRV_PCM_STATE_RUNNING;
713         return retval;
714 }
715
716 static int snd_compr_stop(struct snd_compr_stream *stream)
717 {
718         int retval;
719
720         if (stream->runtime->state == SNDRV_PCM_STATE_PREPARED ||
721                         stream->runtime->state == SNDRV_PCM_STATE_SETUP)
722                 return -EPERM;
723         retval = stream->ops->trigger(stream, SNDRV_PCM_TRIGGER_STOP);
724         if (!retval) {
725                 snd_compr_drain_notify(stream);
726                 stream->runtime->total_bytes_available = 0;
727                 stream->runtime->total_bytes_transferred = 0;
728         }
729         return retval;
730 }
731
732 static void error_delayed_work(struct work_struct *work)
733 {
734         struct snd_compr_stream *stream;
735
736         stream = container_of(work, struct snd_compr_stream, error_work.work);
737
738         mutex_lock(&stream->device->lock);
739
740         stream->ops->trigger(stream, SNDRV_PCM_TRIGGER_STOP);
741         wake_up(&stream->runtime->sleep);
742
743         mutex_unlock(&stream->device->lock);
744 }
745
746 /*
747  * snd_compr_stop_error: Report a fatal error on a stream
748  * @stream: pointer to stream
749  * @state: state to transition the stream to
750  *
751  * Stop the stream and set its state.
752  *
753  * Should be called with compressed device lock held.
754  */
755 int snd_compr_stop_error(struct snd_compr_stream *stream,
756                          snd_pcm_state_t state)
757 {
758         if (stream->runtime->state == state)
759                 return 0;
760
761         stream->runtime->state = state;
762
763         pr_debug("Changing state to: %d\n", state);
764
765         queue_delayed_work(system_power_efficient_wq, &stream->error_work, 0);
766
767         return 0;
768 }
769 EXPORT_SYMBOL_GPL(snd_compr_stop_error);
770
771 static int snd_compress_wait_for_drain(struct snd_compr_stream *stream)
772 {
773         int ret;
774
775         /*
776          * We are called with lock held. So drop the lock while we wait for
777          * drain complete notification from the driver
778          *
779          * It is expected that driver will notify the drain completion and then
780          * stream will be moved to SETUP state, even if draining resulted in an
781          * error. We can trigger next track after this.
782          */
783         stream->runtime->state = SNDRV_PCM_STATE_DRAINING;
784         mutex_unlock(&stream->device->lock);
785
786         /* we wait for drain to complete here, drain can return when
787          * interruption occurred, wait returned error or success.
788          * For the first two cases we don't do anything different here and
789          * return after waking up
790          */
791
792         ret = wait_event_interruptible(stream->runtime->sleep,
793                         (stream->runtime->state != SNDRV_PCM_STATE_DRAINING));
794         if (ret == -ERESTARTSYS)
795                 pr_debug("wait aborted by a signal\n");
796         else if (ret)
797                 pr_debug("wait for drain failed with %d\n", ret);
798
799
800         wake_up(&stream->runtime->sleep);
801         mutex_lock(&stream->device->lock);
802
803         return ret;
804 }
805
806 static int snd_compr_drain(struct snd_compr_stream *stream)
807 {
808         int retval;
809
810         if (stream->runtime->state == SNDRV_PCM_STATE_PREPARED ||
811                         stream->runtime->state == SNDRV_PCM_STATE_SETUP)
812                 return -EPERM;
813
814         retval = stream->ops->trigger(stream, SND_COMPR_TRIGGER_DRAIN);
815         if (retval) {
816                 pr_debug("SND_COMPR_TRIGGER_DRAIN failed %d\n", retval);
817                 wake_up(&stream->runtime->sleep);
818                 return retval;
819         }
820
821         return snd_compress_wait_for_drain(stream);
822 }
823
824 static int snd_compr_next_track(struct snd_compr_stream *stream)
825 {
826         int retval;
827
828         /* only a running stream can transition to next track */
829         if (stream->runtime->state != SNDRV_PCM_STATE_RUNNING)
830                 return -EPERM;
831
832         /* you can signal next track if this is intended to be a gapless stream
833          * and current track metadata is set
834          */
835         if (stream->metadata_set == false)
836                 return -EPERM;
837
838         retval = stream->ops->trigger(stream, SND_COMPR_TRIGGER_NEXT_TRACK);
839         if (retval != 0)
840                 return retval;
841         stream->metadata_set = false;
842         stream->next_track = true;
843         return 0;
844 }
845
846 static int snd_compr_partial_drain(struct snd_compr_stream *stream)
847 {
848         int retval;
849         if (stream->runtime->state == SNDRV_PCM_STATE_PREPARED ||
850                         stream->runtime->state == SNDRV_PCM_STATE_SETUP)
851                 return -EPERM;
852         /* stream can be drained only when next track has been signalled */
853         if (stream->next_track == false)
854                 return -EPERM;
855
856         retval = stream->ops->trigger(stream, SND_COMPR_TRIGGER_PARTIAL_DRAIN);
857         if (retval) {
858                 pr_debug("Partial drain returned failure\n");
859                 wake_up(&stream->runtime->sleep);
860                 return retval;
861         }
862
863         stream->next_track = false;
864         return snd_compress_wait_for_drain(stream);
865 }
866
867 static long snd_compr_ioctl(struct file *f, unsigned int cmd, unsigned long arg)
868 {
869         struct snd_compr_file *data = f->private_data;
870         struct snd_compr_stream *stream;
871         int retval = -ENOTTY;
872
873         if (snd_BUG_ON(!data))
874                 return -EFAULT;
875
876         stream = &data->stream;
877
878         mutex_lock(&stream->device->lock);
879         switch (_IOC_NR(cmd)) {
880         case _IOC_NR(SNDRV_COMPRESS_IOCTL_VERSION):
881                 retval = put_user(SNDRV_COMPRESS_VERSION,
882                                 (int __user *)arg) ? -EFAULT : 0;
883                 break;
884         case _IOC_NR(SNDRV_COMPRESS_GET_CAPS):
885                 retval = snd_compr_get_caps(stream, arg);
886                 break;
887 #ifndef COMPR_CODEC_CAPS_OVERFLOW
888         case _IOC_NR(SNDRV_COMPRESS_GET_CODEC_CAPS):
889                 retval = snd_compr_get_codec_caps(stream, arg);
890                 break;
891 #endif
892         case _IOC_NR(SNDRV_COMPRESS_SET_PARAMS):
893                 retval = snd_compr_set_params(stream, arg);
894                 break;
895         case _IOC_NR(SNDRV_COMPRESS_GET_PARAMS):
896                 retval = snd_compr_get_params(stream, arg);
897                 break;
898         case _IOC_NR(SNDRV_COMPRESS_SET_METADATA):
899                 retval = snd_compr_set_metadata(stream, arg);
900                 break;
901         case _IOC_NR(SNDRV_COMPRESS_GET_METADATA):
902                 retval = snd_compr_get_metadata(stream, arg);
903                 break;
904         case _IOC_NR(SNDRV_COMPRESS_TSTAMP):
905                 retval = snd_compr_tstamp(stream, arg);
906                 break;
907         case _IOC_NR(SNDRV_COMPRESS_AVAIL):
908                 retval = snd_compr_ioctl_avail(stream, arg);
909                 break;
910         case _IOC_NR(SNDRV_COMPRESS_PAUSE):
911                 retval = snd_compr_pause(stream);
912                 break;
913         case _IOC_NR(SNDRV_COMPRESS_RESUME):
914                 retval = snd_compr_resume(stream);
915                 break;
916         case _IOC_NR(SNDRV_COMPRESS_START):
917                 retval = snd_compr_start(stream);
918                 break;
919         case _IOC_NR(SNDRV_COMPRESS_STOP):
920                 retval = snd_compr_stop(stream);
921                 break;
922         case _IOC_NR(SNDRV_COMPRESS_DRAIN):
923                 retval = snd_compr_drain(stream);
924                 break;
925         case _IOC_NR(SNDRV_COMPRESS_PARTIAL_DRAIN):
926                 retval = snd_compr_partial_drain(stream);
927                 break;
928         case _IOC_NR(SNDRV_COMPRESS_NEXT_TRACK):
929                 retval = snd_compr_next_track(stream);
930                 break;
931
932         }
933         mutex_unlock(&stream->device->lock);
934         return retval;
935 }
936
937 /* support of 32bit userspace on 64bit platforms */
938 #ifdef CONFIG_COMPAT
939 static long snd_compr_ioctl_compat(struct file *file, unsigned int cmd,
940                                                 unsigned long arg)
941 {
942         return snd_compr_ioctl(file, cmd, (unsigned long)compat_ptr(arg));
943 }
944 #endif
945
946 static const struct file_operations snd_compr_file_ops = {
947                 .owner =        THIS_MODULE,
948                 .open =         snd_compr_open,
949                 .release =      snd_compr_free,
950                 .write =        snd_compr_write,
951                 .read =         snd_compr_read,
952                 .unlocked_ioctl = snd_compr_ioctl,
953 #ifdef CONFIG_COMPAT
954                 .compat_ioctl = snd_compr_ioctl_compat,
955 #endif
956                 .mmap =         snd_compr_mmap,
957                 .poll =         snd_compr_poll,
958 };
959
960 static int snd_compress_dev_register(struct snd_device *device)
961 {
962         int ret = -EINVAL;
963         struct snd_compr *compr;
964
965         if (snd_BUG_ON(!device || !device->device_data))
966                 return -EBADFD;
967         compr = device->device_data;
968
969         pr_debug("reg device %s, direction %d\n", compr->name,
970                         compr->direction);
971         /* register compressed device */
972         ret = snd_register_device(SNDRV_DEVICE_TYPE_COMPRESS,
973                                   compr->card, compr->device,
974                                   &snd_compr_file_ops, compr, &compr->dev);
975         if (ret < 0) {
976                 pr_err("snd_register_device failed %d\n", ret);
977                 return ret;
978         }
979         return ret;
980
981 }
982
983 static int snd_compress_dev_disconnect(struct snd_device *device)
984 {
985         struct snd_compr *compr;
986
987         compr = device->device_data;
988         snd_unregister_device(&compr->dev);
989         return 0;
990 }
991
992 #ifdef CONFIG_SND_VERBOSE_PROCFS
993 static void snd_compress_proc_info_read(struct snd_info_entry *entry,
994                                         struct snd_info_buffer *buffer)
995 {
996         struct snd_compr *compr = (struct snd_compr *)entry->private_data;
997
998         snd_iprintf(buffer, "card: %d\n", compr->card->number);
999         snd_iprintf(buffer, "device: %d\n", compr->device);
1000         snd_iprintf(buffer, "stream: %s\n",
1001                         compr->direction == SND_COMPRESS_PLAYBACK
1002                                 ? "PLAYBACK" : "CAPTURE");
1003         snd_iprintf(buffer, "id: %s\n", compr->id);
1004 }
1005
1006 static int snd_compress_proc_init(struct snd_compr *compr)
1007 {
1008         struct snd_info_entry *entry;
1009         char name[16];
1010
1011         sprintf(name, "compr%i", compr->device);
1012         entry = snd_info_create_card_entry(compr->card, name,
1013                                            compr->card->proc_root);
1014         if (!entry)
1015                 return -ENOMEM;
1016         entry->mode = S_IFDIR | 0555;
1017         if (snd_info_register(entry) < 0) {
1018                 snd_info_free_entry(entry);
1019                 return -ENOMEM;
1020         }
1021         compr->proc_root = entry;
1022
1023         entry = snd_info_create_card_entry(compr->card, "info",
1024                                            compr->proc_root);
1025         if (entry) {
1026                 snd_info_set_text_ops(entry, compr,
1027                                       snd_compress_proc_info_read);
1028                 if (snd_info_register(entry) < 0) {
1029                         snd_info_free_entry(entry);
1030                         entry = NULL;
1031                 }
1032         }
1033         compr->proc_info_entry = entry;
1034
1035         return 0;
1036 }
1037
1038 static void snd_compress_proc_done(struct snd_compr *compr)
1039 {
1040         snd_info_free_entry(compr->proc_info_entry);
1041         compr->proc_info_entry = NULL;
1042         snd_info_free_entry(compr->proc_root);
1043         compr->proc_root = NULL;
1044 }
1045
1046 static inline void snd_compress_set_id(struct snd_compr *compr, const char *id)
1047 {
1048         strlcpy(compr->id, id, sizeof(compr->id));
1049 }
1050 #else
1051 static inline int snd_compress_proc_init(struct snd_compr *compr)
1052 {
1053         return 0;
1054 }
1055
1056 static inline void snd_compress_proc_done(struct snd_compr *compr)
1057 {
1058 }
1059
1060 static inline void snd_compress_set_id(struct snd_compr *compr, const char *id)
1061 {
1062 }
1063 #endif
1064
1065 static int snd_compress_dev_free(struct snd_device *device)
1066 {
1067         struct snd_compr *compr;
1068
1069         compr = device->device_data;
1070         snd_compress_proc_done(compr);
1071         put_device(&compr->dev);
1072         return 0;
1073 }
1074
1075 /*
1076  * snd_compress_new: create new compress device
1077  * @card: sound card pointer
1078  * @device: device number
1079  * @dirn: device direction, should be of type enum snd_compr_direction
1080  * @compr: compress device pointer
1081  */
1082 int snd_compress_new(struct snd_card *card, int device,
1083                         int dirn, const char *id, struct snd_compr *compr)
1084 {
1085         static struct snd_device_ops ops = {
1086                 .dev_free = snd_compress_dev_free,
1087                 .dev_register = snd_compress_dev_register,
1088                 .dev_disconnect = snd_compress_dev_disconnect,
1089         };
1090         int ret;
1091
1092         compr->card = card;
1093         compr->device = device;
1094         compr->direction = dirn;
1095
1096         snd_compress_set_id(compr, id);
1097
1098         snd_device_initialize(&compr->dev, card);
1099         dev_set_name(&compr->dev, "comprC%iD%i", card->number, device);
1100
1101         ret = snd_device_new(card, SNDRV_DEV_COMPRESS, compr, &ops);
1102         if (ret == 0)
1103                 snd_compress_proc_init(compr);
1104
1105         return ret;
1106 }
1107 EXPORT_SYMBOL_GPL(snd_compress_new);
1108
1109 static int snd_compress_add_device(struct snd_compr *device)
1110 {
1111         int ret;
1112
1113         if (!device->card)
1114                 return -EINVAL;
1115
1116         /* register the card */
1117         ret = snd_card_register(device->card);
1118         if (ret)
1119                 goto out;
1120         return 0;
1121
1122 out:
1123         pr_err("failed with %d\n", ret);
1124         return ret;
1125
1126 }
1127
1128 static int snd_compress_remove_device(struct snd_compr *device)
1129 {
1130         return snd_card_free(device->card);
1131 }
1132
1133 /**
1134  * snd_compress_register - register compressed device
1135  *
1136  * @device: compressed device to register
1137  */
1138 int snd_compress_register(struct snd_compr *device)
1139 {
1140         int retval;
1141
1142         if (device->name == NULL || device->ops == NULL)
1143                 return -EINVAL;
1144
1145         pr_debug("Registering compressed device %s\n", device->name);
1146         if (snd_BUG_ON(!device->ops->open))
1147                 return -EINVAL;
1148         if (snd_BUG_ON(!device->ops->free))
1149                 return -EINVAL;
1150         if (snd_BUG_ON(!device->ops->set_params))
1151                 return -EINVAL;
1152         if (snd_BUG_ON(!device->ops->trigger))
1153                 return -EINVAL;
1154
1155         mutex_init(&device->lock);
1156
1157         /* register a compressed card */
1158         mutex_lock(&device_mutex);
1159         retval = snd_compress_add_device(device);
1160         mutex_unlock(&device_mutex);
1161         return retval;
1162 }
1163 EXPORT_SYMBOL_GPL(snd_compress_register);
1164
1165 int snd_compress_deregister(struct snd_compr *device)
1166 {
1167         pr_debug("Removing compressed device %s\n", device->name);
1168         mutex_lock(&device_mutex);
1169         snd_compress_remove_device(device);
1170         mutex_unlock(&device_mutex);
1171         return 0;
1172 }
1173 EXPORT_SYMBOL_GPL(snd_compress_deregister);
1174
1175 MODULE_DESCRIPTION("ALSA Compressed offload framework");
1176 MODULE_AUTHOR("Vinod Koul <vinod.koul@linux.intel.com>");
1177 MODULE_LICENSE("GPL v2");