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