1/*
2 *  Digital Audio (PCM) abstract layer
3 *  Copyright (c) by Jaroslav Kysela <perex@perex.cz>
4 *                   Abramo Bagnara <abramo@alsa-project.org>
5 *
6 *
7 *   This program is free software; you can redistribute it and/or modify
8 *   it under the terms of the GNU General Public License as published by
9 *   the Free Software Foundation; either version 2 of the License, or
10 *   (at your option) any later version.
11 *
12 *   This program is distributed in the hope that it will be useful,
13 *   but WITHOUT ANY WARRANTY; without even the implied warranty of
14 *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15 *   GNU General Public License for more details.
16 *
17 *   You should have received a copy of the GNU General Public License
18 *   along with this program; if not, write to the Free Software
19 *   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
20 *
21 */
22
23#include <linux/slab.h>
24#include <linux/time.h>
25#include <linux/math64.h>
26#include <linux/export.h>
27#include <sound/core.h>
28#include <sound/control.h>
29#include <sound/tlv.h>
30#include <sound/info.h>
31#include <sound/pcm.h>
32#include <sound/pcm_params.h>
33#include <sound/timer.h>
34
35#ifdef CONFIG_SND_PCM_XRUN_DEBUG
36#define CREATE_TRACE_POINTS
37#include "pcm_trace.h"
38#else
39#define trace_hwptr(substream, pos, in_interrupt)
40#define trace_xrun(substream)
41#define trace_hw_ptr_error(substream, reason)
42#endif
43
44/*
45 * fill ring buffer with silence
46 * runtime->silence_start: starting pointer to silence area
47 * runtime->silence_filled: size filled with silence
48 * runtime->silence_threshold: threshold from application
49 * runtime->silence_size: maximal size from application
50 *
51 * when runtime->silence_size >= runtime->boundary - fill processed area with silence immediately
52 */
53void snd_pcm_playback_silence(struct snd_pcm_substream *substream, snd_pcm_uframes_t new_hw_ptr)
54{
55	struct snd_pcm_runtime *runtime = substream->runtime;
56	snd_pcm_uframes_t frames, ofs, transfer;
57
58	if (runtime->silence_size < runtime->boundary) {
59		snd_pcm_sframes_t noise_dist, n;
60		if (runtime->silence_start != runtime->control->appl_ptr) {
61			n = runtime->control->appl_ptr - runtime->silence_start;
62			if (n < 0)
63				n += runtime->boundary;
64			if ((snd_pcm_uframes_t)n < runtime->silence_filled)
65				runtime->silence_filled -= n;
66			else
67				runtime->silence_filled = 0;
68			runtime->silence_start = runtime->control->appl_ptr;
69		}
70		if (runtime->silence_filled >= runtime->buffer_size)
71			return;
72		noise_dist = snd_pcm_playback_hw_avail(runtime) + runtime->silence_filled;
73		if (noise_dist >= (snd_pcm_sframes_t) runtime->silence_threshold)
74			return;
75		frames = runtime->silence_threshold - noise_dist;
76		if (frames > runtime->silence_size)
77			frames = runtime->silence_size;
78	} else {
79		if (new_hw_ptr == ULONG_MAX) {	/* initialization */
80			snd_pcm_sframes_t avail = snd_pcm_playback_hw_avail(runtime);
81			if (avail > runtime->buffer_size)
82				avail = runtime->buffer_size;
83			runtime->silence_filled = avail > 0 ? avail : 0;
84			runtime->silence_start = (runtime->status->hw_ptr +
85						  runtime->silence_filled) %
86						 runtime->boundary;
87		} else {
88			ofs = runtime->status->hw_ptr;
89			frames = new_hw_ptr - ofs;
90			if ((snd_pcm_sframes_t)frames < 0)
91				frames += runtime->boundary;
92			runtime->silence_filled -= frames;
93			if ((snd_pcm_sframes_t)runtime->silence_filled < 0) {
94				runtime->silence_filled = 0;
95				runtime->silence_start = new_hw_ptr;
96			} else {
97				runtime->silence_start = ofs;
98			}
99		}
100		frames = runtime->buffer_size - runtime->silence_filled;
101	}
102	if (snd_BUG_ON(frames > runtime->buffer_size))
103		return;
104	if (frames == 0)
105		return;
106	ofs = runtime->silence_start % runtime->buffer_size;
107	while (frames > 0) {
108		transfer = ofs + frames > runtime->buffer_size ? runtime->buffer_size - ofs : frames;
109		if (runtime->access == SNDRV_PCM_ACCESS_RW_INTERLEAVED ||
110		    runtime->access == SNDRV_PCM_ACCESS_MMAP_INTERLEAVED) {
111			if (substream->ops->silence) {
112				int err;
113				err = substream->ops->silence(substream, -1, ofs, transfer);
114				snd_BUG_ON(err < 0);
115			} else {
116				char *hwbuf = runtime->dma_area + frames_to_bytes(runtime, ofs);
117				snd_pcm_format_set_silence(runtime->format, hwbuf, transfer * runtime->channels);
118			}
119		} else {
120			unsigned int c;
121			unsigned int channels = runtime->channels;
122			if (substream->ops->silence) {
123				for (c = 0; c < channels; ++c) {
124					int err;
125					err = substream->ops->silence(substream, c, ofs, transfer);
126					snd_BUG_ON(err < 0);
127				}
128			} else {
129				size_t dma_csize = runtime->dma_bytes / channels;
130				for (c = 0; c < channels; ++c) {
131					char *hwbuf = runtime->dma_area + (c * dma_csize) + samples_to_bytes(runtime, ofs);
132					snd_pcm_format_set_silence(runtime->format, hwbuf, transfer);
133				}
134			}
135		}
136		runtime->silence_filled += transfer;
137		frames -= transfer;
138		ofs = 0;
139	}
140}
141
142#ifdef CONFIG_SND_DEBUG
143void snd_pcm_debug_name(struct snd_pcm_substream *substream,
144			   char *name, size_t len)
145{
146	snprintf(name, len, "pcmC%dD%d%c:%d",
147		 substream->pcm->card->number,
148		 substream->pcm->device,
149		 substream->stream ? 'c' : 'p',
150		 substream->number);
151}
152EXPORT_SYMBOL(snd_pcm_debug_name);
153#endif
154
155#define XRUN_DEBUG_BASIC	(1<<0)
156#define XRUN_DEBUG_STACK	(1<<1)	/* dump also stack */
157#define XRUN_DEBUG_JIFFIESCHECK	(1<<2)	/* do jiffies check */
158
159#ifdef CONFIG_SND_PCM_XRUN_DEBUG
160
161#define xrun_debug(substream, mask) \
162			((substream)->pstr->xrun_debug & (mask))
163#else
164#define xrun_debug(substream, mask)	0
165#endif
166
167#define dump_stack_on_xrun(substream) do {			\
168		if (xrun_debug(substream, XRUN_DEBUG_STACK))	\
169			dump_stack();				\
170	} while (0)
171
172static void xrun(struct snd_pcm_substream *substream)
173{
174	struct snd_pcm_runtime *runtime = substream->runtime;
175
176	trace_xrun(substream);
177	if (runtime->tstamp_mode == SNDRV_PCM_TSTAMP_ENABLE)
178		snd_pcm_gettime(runtime, (struct timespec *)&runtime->status->tstamp);
179	snd_pcm_stop(substream, SNDRV_PCM_STATE_XRUN);
180	if (xrun_debug(substream, XRUN_DEBUG_BASIC)) {
181		char name[16];
182		snd_pcm_debug_name(substream, name, sizeof(name));
183		pcm_warn(substream->pcm, "XRUN: %s\n", name);
184		dump_stack_on_xrun(substream);
185	}
186}
187
188#ifdef CONFIG_SND_PCM_XRUN_DEBUG
189#define hw_ptr_error(substream, in_interrupt, reason, fmt, args...)	\
190	do {								\
191		trace_hw_ptr_error(substream, reason);	\
192		if (xrun_debug(substream, XRUN_DEBUG_BASIC)) {		\
193			pr_err_ratelimited("ALSA: PCM: [%c] " reason ": " fmt, \
194					   (in_interrupt) ? 'Q' : 'P', ##args);	\
195			dump_stack_on_xrun(substream);			\
196		}							\
197	} while (0)
198
199#else /* ! CONFIG_SND_PCM_XRUN_DEBUG */
200
201#define hw_ptr_error(substream, fmt, args...) do { } while (0)
202
203#endif
204
205int snd_pcm_update_state(struct snd_pcm_substream *substream,
206			 struct snd_pcm_runtime *runtime)
207{
208	snd_pcm_uframes_t avail;
209
210	if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
211		avail = snd_pcm_playback_avail(runtime);
212	else
213		avail = snd_pcm_capture_avail(runtime);
214	if (avail > runtime->avail_max)
215		runtime->avail_max = avail;
216	if (runtime->status->state == SNDRV_PCM_STATE_DRAINING) {
217		if (avail >= runtime->buffer_size) {
218			snd_pcm_drain_done(substream);
219			return -EPIPE;
220		}
221	} else {
222		if (avail >= runtime->stop_threshold) {
223			xrun(substream);
224			return -EPIPE;
225		}
226	}
227	if (runtime->twake) {
228		if (avail >= runtime->twake)
229			wake_up(&runtime->tsleep);
230	} else if (avail >= runtime->control->avail_min)
231		wake_up(&runtime->sleep);
232	return 0;
233}
234
235static void update_audio_tstamp(struct snd_pcm_substream *substream,
236				struct timespec *curr_tstamp,
237				struct timespec *audio_tstamp)
238{
239	struct snd_pcm_runtime *runtime = substream->runtime;
240	u64 audio_frames, audio_nsecs;
241	struct timespec driver_tstamp;
242
243	if (runtime->tstamp_mode != SNDRV_PCM_TSTAMP_ENABLE)
244		return;
245
246	if (!(substream->ops->get_time_info) ||
247		(runtime->audio_tstamp_report.actual_type ==
248			SNDRV_PCM_AUDIO_TSTAMP_TYPE_DEFAULT)) {
249
250		/*
251		 * provide audio timestamp derived from pointer position
252		 * add delay only if requested
253		 */
254
255		audio_frames = runtime->hw_ptr_wrap + runtime->status->hw_ptr;
256
257		if (runtime->audio_tstamp_config.report_delay) {
258			if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
259				audio_frames -=  runtime->delay;
260			else
261				audio_frames +=  runtime->delay;
262		}
263		audio_nsecs = div_u64(audio_frames * 1000000000LL,
264				runtime->rate);
265		*audio_tstamp = ns_to_timespec(audio_nsecs);
266	}
267	runtime->status->audio_tstamp = *audio_tstamp;
268	runtime->status->tstamp = *curr_tstamp;
269
270	/*
271	 * re-take a driver timestamp to let apps detect if the reference tstamp
272	 * read by low-level hardware was provided with a delay
273	 */
274	snd_pcm_gettime(substream->runtime, (struct timespec *)&driver_tstamp);
275	runtime->driver_tstamp = driver_tstamp;
276}
277
278static int snd_pcm_update_hw_ptr0(struct snd_pcm_substream *substream,
279				  unsigned int in_interrupt)
280{
281	struct snd_pcm_runtime *runtime = substream->runtime;
282	snd_pcm_uframes_t pos;
283	snd_pcm_uframes_t old_hw_ptr, new_hw_ptr, hw_base;
284	snd_pcm_sframes_t hdelta, delta;
285	unsigned long jdelta;
286	unsigned long curr_jiffies;
287	struct timespec curr_tstamp;
288	struct timespec audio_tstamp;
289	int crossed_boundary = 0;
290
291	old_hw_ptr = runtime->status->hw_ptr;
292
293	/*
294	 * group pointer, time and jiffies reads to allow for more
295	 * accurate correlations/corrections.
296	 * The values are stored at the end of this routine after
297	 * corrections for hw_ptr position
298	 */
299	pos = substream->ops->pointer(substream);
300	curr_jiffies = jiffies;
301	if (runtime->tstamp_mode == SNDRV_PCM_TSTAMP_ENABLE) {
302		if ((substream->ops->get_time_info) &&
303			(runtime->audio_tstamp_config.type_requested != SNDRV_PCM_AUDIO_TSTAMP_TYPE_DEFAULT)) {
304			substream->ops->get_time_info(substream, &curr_tstamp,
305						&audio_tstamp,
306						&runtime->audio_tstamp_config,
307						&runtime->audio_tstamp_report);
308
309			/* re-test in case tstamp type is not supported in hardware and was demoted to DEFAULT */
310			if (runtime->audio_tstamp_report.actual_type == SNDRV_PCM_AUDIO_TSTAMP_TYPE_DEFAULT)
311				snd_pcm_gettime(runtime, (struct timespec *)&curr_tstamp);
312		} else
313			snd_pcm_gettime(runtime, (struct timespec *)&curr_tstamp);
314	}
315
316	if (pos == SNDRV_PCM_POS_XRUN) {
317		xrun(substream);
318		return -EPIPE;
319	}
320	if (pos >= runtime->buffer_size) {
321		if (printk_ratelimit()) {
322			char name[16];
323			snd_pcm_debug_name(substream, name, sizeof(name));
324			pcm_err(substream->pcm,
325				"BUG: %s, pos = %ld, buffer size = %ld, period size = %ld\n",
326				name, pos, runtime->buffer_size,
327				runtime->period_size);
328		}
329		pos = 0;
330	}
331	pos -= pos % runtime->min_align;
332	trace_hwptr(substream, pos, in_interrupt);
333	hw_base = runtime->hw_ptr_base;
334	new_hw_ptr = hw_base + pos;
335	if (in_interrupt) {
336		/* we know that one period was processed */
337		/* delta = "expected next hw_ptr" for in_interrupt != 0 */
338		delta = runtime->hw_ptr_interrupt + runtime->period_size;
339		if (delta > new_hw_ptr) {
340			/* check for double acknowledged interrupts */
341			hdelta = curr_jiffies - runtime->hw_ptr_jiffies;
342			if (hdelta > runtime->hw_ptr_buffer_jiffies/2 + 1) {
343				hw_base += runtime->buffer_size;
344				if (hw_base >= runtime->boundary) {
345					hw_base = 0;
346					crossed_boundary++;
347				}
348				new_hw_ptr = hw_base + pos;
349				goto __delta;
350			}
351		}
352	}
353	/* new_hw_ptr might be lower than old_hw_ptr in case when */
354	/* pointer crosses the end of the ring buffer */
355	if (new_hw_ptr < old_hw_ptr) {
356		hw_base += runtime->buffer_size;
357		if (hw_base >= runtime->boundary) {
358			hw_base = 0;
359			crossed_boundary++;
360		}
361		new_hw_ptr = hw_base + pos;
362	}
363      __delta:
364	delta = new_hw_ptr - old_hw_ptr;
365	if (delta < 0)
366		delta += runtime->boundary;
367
368	if (runtime->no_period_wakeup) {
369		snd_pcm_sframes_t xrun_threshold;
370		/*
371		 * Without regular period interrupts, we have to check
372		 * the elapsed time to detect xruns.
373		 */
374		jdelta = curr_jiffies - runtime->hw_ptr_jiffies;
375		if (jdelta < runtime->hw_ptr_buffer_jiffies / 2)
376			goto no_delta_check;
377		hdelta = jdelta - delta * HZ / runtime->rate;
378		xrun_threshold = runtime->hw_ptr_buffer_jiffies / 2 + 1;
379		while (hdelta > xrun_threshold) {
380			delta += runtime->buffer_size;
381			hw_base += runtime->buffer_size;
382			if (hw_base >= runtime->boundary) {
383				hw_base = 0;
384				crossed_boundary++;
385			}
386			new_hw_ptr = hw_base + pos;
387			hdelta -= runtime->hw_ptr_buffer_jiffies;
388		}
389		goto no_delta_check;
390	}
391
392	/* something must be really wrong */
393	if (delta >= runtime->buffer_size + runtime->period_size) {
394		hw_ptr_error(substream, in_interrupt, "Unexpected hw_ptr",
395			     "(stream=%i, pos=%ld, new_hw_ptr=%ld, old_hw_ptr=%ld)\n",
396			     substream->stream, (long)pos,
397			     (long)new_hw_ptr, (long)old_hw_ptr);
398		return 0;
399	}
400
401	/* Do jiffies check only in xrun_debug mode */
402	if (!xrun_debug(substream, XRUN_DEBUG_JIFFIESCHECK))
403		goto no_jiffies_check;
404
405	/* Skip the jiffies check for hardwares with BATCH flag.
406	 * Such hardware usually just increases the position at each IRQ,
407	 * thus it can't give any strange position.
408	 */
409	if (runtime->hw.info & SNDRV_PCM_INFO_BATCH)
410		goto no_jiffies_check;
411	hdelta = delta;
412	if (hdelta < runtime->delay)
413		goto no_jiffies_check;
414	hdelta -= runtime->delay;
415	jdelta = curr_jiffies - runtime->hw_ptr_jiffies;
416	if (((hdelta * HZ) / runtime->rate) > jdelta + HZ/100) {
417		delta = jdelta /
418			(((runtime->period_size * HZ) / runtime->rate)
419								+ HZ/100);
420		/* move new_hw_ptr according jiffies not pos variable */
421		new_hw_ptr = old_hw_ptr;
422		hw_base = delta;
423		/* use loop to avoid checks for delta overflows */
424		/* the delta value is small or zero in most cases */
425		while (delta > 0) {
426			new_hw_ptr += runtime->period_size;
427			if (new_hw_ptr >= runtime->boundary) {
428				new_hw_ptr -= runtime->boundary;
429				crossed_boundary--;
430			}
431			delta--;
432		}
433		/* align hw_base to buffer_size */
434		hw_ptr_error(substream, in_interrupt, "hw_ptr skipping",
435			     "(pos=%ld, delta=%ld, period=%ld, jdelta=%lu/%lu/%lu, hw_ptr=%ld/%ld)\n",
436			     (long)pos, (long)hdelta,
437			     (long)runtime->period_size, jdelta,
438			     ((hdelta * HZ) / runtime->rate), hw_base,
439			     (unsigned long)old_hw_ptr,
440			     (unsigned long)new_hw_ptr);
441		/* reset values to proper state */
442		delta = 0;
443		hw_base = new_hw_ptr - (new_hw_ptr % runtime->buffer_size);
444	}
445 no_jiffies_check:
446	if (delta > runtime->period_size + runtime->period_size / 2) {
447		hw_ptr_error(substream, in_interrupt,
448			     "Lost interrupts?",
449			     "(stream=%i, delta=%ld, new_hw_ptr=%ld, old_hw_ptr=%ld)\n",
450			     substream->stream, (long)delta,
451			     (long)new_hw_ptr,
452			     (long)old_hw_ptr);
453	}
454
455 no_delta_check:
456	if (runtime->status->hw_ptr == new_hw_ptr) {
457		update_audio_tstamp(substream, &curr_tstamp, &audio_tstamp);
458		return 0;
459	}
460
461	if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK &&
462	    runtime->silence_size > 0)
463		snd_pcm_playback_silence(substream, new_hw_ptr);
464
465	if (in_interrupt) {
466		delta = new_hw_ptr - runtime->hw_ptr_interrupt;
467		if (delta < 0)
468			delta += runtime->boundary;
469		delta -= (snd_pcm_uframes_t)delta % runtime->period_size;
470		runtime->hw_ptr_interrupt += delta;
471		if (runtime->hw_ptr_interrupt >= runtime->boundary)
472			runtime->hw_ptr_interrupt -= runtime->boundary;
473	}
474	runtime->hw_ptr_base = hw_base;
475	runtime->status->hw_ptr = new_hw_ptr;
476	runtime->hw_ptr_jiffies = curr_jiffies;
477	if (crossed_boundary) {
478		snd_BUG_ON(crossed_boundary != 1);
479		runtime->hw_ptr_wrap += runtime->boundary;
480	}
481
482	update_audio_tstamp(substream, &curr_tstamp, &audio_tstamp);
483
484	return snd_pcm_update_state(substream, runtime);
485}
486
487/* CAUTION: call it with irq disabled */
488int snd_pcm_update_hw_ptr(struct snd_pcm_substream *substream)
489{
490	return snd_pcm_update_hw_ptr0(substream, 0);
491}
492
493/**
494 * snd_pcm_set_ops - set the PCM operators
495 * @pcm: the pcm instance
496 * @direction: stream direction, SNDRV_PCM_STREAM_XXX
497 * @ops: the operator table
498 *
499 * Sets the given PCM operators to the pcm instance.
500 */
501void snd_pcm_set_ops(struct snd_pcm *pcm, int direction,
502		     const struct snd_pcm_ops *ops)
503{
504	struct snd_pcm_str *stream = &pcm->streams[direction];
505	struct snd_pcm_substream *substream;
506
507	for (substream = stream->substream; substream != NULL; substream = substream->next)
508		substream->ops = ops;
509}
510
511EXPORT_SYMBOL(snd_pcm_set_ops);
512
513/**
514 * snd_pcm_sync - set the PCM sync id
515 * @substream: the pcm substream
516 *
517 * Sets the PCM sync identifier for the card.
518 */
519void snd_pcm_set_sync(struct snd_pcm_substream *substream)
520{
521	struct snd_pcm_runtime *runtime = substream->runtime;
522
523	runtime->sync.id32[0] = substream->pcm->card->number;
524	runtime->sync.id32[1] = -1;
525	runtime->sync.id32[2] = -1;
526	runtime->sync.id32[3] = -1;
527}
528
529EXPORT_SYMBOL(snd_pcm_set_sync);
530
531/*
532 *  Standard ioctl routine
533 */
534
535static inline unsigned int div32(unsigned int a, unsigned int b,
536				 unsigned int *r)
537{
538	if (b == 0) {
539		*r = 0;
540		return UINT_MAX;
541	}
542	*r = a % b;
543	return a / b;
544}
545
546static inline unsigned int div_down(unsigned int a, unsigned int b)
547{
548	if (b == 0)
549		return UINT_MAX;
550	return a / b;
551}
552
553static inline unsigned int div_up(unsigned int a, unsigned int b)
554{
555	unsigned int r;
556	unsigned int q;
557	if (b == 0)
558		return UINT_MAX;
559	q = div32(a, b, &r);
560	if (r)
561		++q;
562	return q;
563}
564
565static inline unsigned int mul(unsigned int a, unsigned int b)
566{
567	if (a == 0)
568		return 0;
569	if (div_down(UINT_MAX, a) < b)
570		return UINT_MAX;
571	return a * b;
572}
573
574static inline unsigned int muldiv32(unsigned int a, unsigned int b,
575				    unsigned int c, unsigned int *r)
576{
577	u_int64_t n = (u_int64_t) a * b;
578	if (c == 0) {
579		snd_BUG_ON(!n);
580		*r = 0;
581		return UINT_MAX;
582	}
583	n = div_u64_rem(n, c, r);
584	if (n >= UINT_MAX) {
585		*r = 0;
586		return UINT_MAX;
587	}
588	return n;
589}
590
591/**
592 * snd_interval_refine - refine the interval value of configurator
593 * @i: the interval value to refine
594 * @v: the interval value to refer to
595 *
596 * Refines the interval value with the reference value.
597 * The interval is changed to the range satisfying both intervals.
598 * The interval status (min, max, integer, etc.) are evaluated.
599 *
600 * Return: Positive if the value is changed, zero if it's not changed, or a
601 * negative error code.
602 */
603int snd_interval_refine(struct snd_interval *i, const struct snd_interval *v)
604{
605	int changed = 0;
606	if (snd_BUG_ON(snd_interval_empty(i)))
607		return -EINVAL;
608	if (i->min < v->min) {
609		i->min = v->min;
610		i->openmin = v->openmin;
611		changed = 1;
612	} else if (i->min == v->min && !i->openmin && v->openmin) {
613		i->openmin = 1;
614		changed = 1;
615	}
616	if (i->max > v->max) {
617		i->max = v->max;
618		i->openmax = v->openmax;
619		changed = 1;
620	} else if (i->max == v->max && !i->openmax && v->openmax) {
621		i->openmax = 1;
622		changed = 1;
623	}
624	if (!i->integer && v->integer) {
625		i->integer = 1;
626		changed = 1;
627	}
628	if (i->integer) {
629		if (i->openmin) {
630			i->min++;
631			i->openmin = 0;
632		}
633		if (i->openmax) {
634			i->max--;
635			i->openmax = 0;
636		}
637	} else if (!i->openmin && !i->openmax && i->min == i->max)
638		i->integer = 1;
639	if (snd_interval_checkempty(i)) {
640		snd_interval_none(i);
641		return -EINVAL;
642	}
643	return changed;
644}
645
646EXPORT_SYMBOL(snd_interval_refine);
647
648static int snd_interval_refine_first(struct snd_interval *i)
649{
650	if (snd_BUG_ON(snd_interval_empty(i)))
651		return -EINVAL;
652	if (snd_interval_single(i))
653		return 0;
654	i->max = i->min;
655	i->openmax = i->openmin;
656	if (i->openmax)
657		i->max++;
658	return 1;
659}
660
661static int snd_interval_refine_last(struct snd_interval *i)
662{
663	if (snd_BUG_ON(snd_interval_empty(i)))
664		return -EINVAL;
665	if (snd_interval_single(i))
666		return 0;
667	i->min = i->max;
668	i->openmin = i->openmax;
669	if (i->openmin)
670		i->min--;
671	return 1;
672}
673
674void snd_interval_mul(const struct snd_interval *a, const struct snd_interval *b, struct snd_interval *c)
675{
676	if (a->empty || b->empty) {
677		snd_interval_none(c);
678		return;
679	}
680	c->empty = 0;
681	c->min = mul(a->min, b->min);
682	c->openmin = (a->openmin || b->openmin);
683	c->max = mul(a->max,  b->max);
684	c->openmax = (a->openmax || b->openmax);
685	c->integer = (a->integer && b->integer);
686}
687
688/**
689 * snd_interval_div - refine the interval value with division
690 * @a: dividend
691 * @b: divisor
692 * @c: quotient
693 *
694 * c = a / b
695 *
696 * Returns non-zero if the value is changed, zero if not changed.
697 */
698void snd_interval_div(const struct snd_interval *a, const struct snd_interval *b, struct snd_interval *c)
699{
700	unsigned int r;
701	if (a->empty || b->empty) {
702		snd_interval_none(c);
703		return;
704	}
705	c->empty = 0;
706	c->min = div32(a->min, b->max, &r);
707	c->openmin = (r || a->openmin || b->openmax);
708	if (b->min > 0) {
709		c->max = div32(a->max, b->min, &r);
710		if (r) {
711			c->max++;
712			c->openmax = 1;
713		} else
714			c->openmax = (a->openmax || b->openmin);
715	} else {
716		c->max = UINT_MAX;
717		c->openmax = 0;
718	}
719	c->integer = 0;
720}
721
722/**
723 * snd_interval_muldivk - refine the interval value
724 * @a: dividend 1
725 * @b: dividend 2
726 * @k: divisor (as integer)
727 * @c: result
728  *
729 * c = a * b / k
730 *
731 * Returns non-zero if the value is changed, zero if not changed.
732 */
733void snd_interval_muldivk(const struct snd_interval *a, const struct snd_interval *b,
734		      unsigned int k, struct snd_interval *c)
735{
736	unsigned int r;
737	if (a->empty || b->empty) {
738		snd_interval_none(c);
739		return;
740	}
741	c->empty = 0;
742	c->min = muldiv32(a->min, b->min, k, &r);
743	c->openmin = (r || a->openmin || b->openmin);
744	c->max = muldiv32(a->max, b->max, k, &r);
745	if (r) {
746		c->max++;
747		c->openmax = 1;
748	} else
749		c->openmax = (a->openmax || b->openmax);
750	c->integer = 0;
751}
752
753/**
754 * snd_interval_mulkdiv - refine the interval value
755 * @a: dividend 1
756 * @k: dividend 2 (as integer)
757 * @b: divisor
758 * @c: result
759 *
760 * c = a * k / b
761 *
762 * Returns non-zero if the value is changed, zero if not changed.
763 */
764void snd_interval_mulkdiv(const struct snd_interval *a, unsigned int k,
765		      const struct snd_interval *b, struct snd_interval *c)
766{
767	unsigned int r;
768	if (a->empty || b->empty) {
769		snd_interval_none(c);
770		return;
771	}
772	c->empty = 0;
773	c->min = muldiv32(a->min, k, b->max, &r);
774	c->openmin = (r || a->openmin || b->openmax);
775	if (b->min > 0) {
776		c->max = muldiv32(a->max, k, b->min, &r);
777		if (r) {
778			c->max++;
779			c->openmax = 1;
780		} else
781			c->openmax = (a->openmax || b->openmin);
782	} else {
783		c->max = UINT_MAX;
784		c->openmax = 0;
785	}
786	c->integer = 0;
787}
788
789/* ---- */
790
791
792/**
793 * snd_interval_ratnum - refine the interval value
794 * @i: interval to refine
795 * @rats_count: number of ratnum_t
796 * @rats: ratnum_t array
797 * @nump: pointer to store the resultant numerator
798 * @denp: pointer to store the resultant denominator
799 *
800 * Return: Positive if the value is changed, zero if it's not changed, or a
801 * negative error code.
802 */
803int snd_interval_ratnum(struct snd_interval *i,
804			unsigned int rats_count, struct snd_ratnum *rats,
805			unsigned int *nump, unsigned int *denp)
806{
807	unsigned int best_num, best_den;
808	int best_diff;
809	unsigned int k;
810	struct snd_interval t;
811	int err;
812	unsigned int result_num, result_den;
813	int result_diff;
814
815	best_num = best_den = best_diff = 0;
816	for (k = 0; k < rats_count; ++k) {
817		unsigned int num = rats[k].num;
818		unsigned int den;
819		unsigned int q = i->min;
820		int diff;
821		if (q == 0)
822			q = 1;
823		den = div_up(num, q);
824		if (den < rats[k].den_min)
825			continue;
826		if (den > rats[k].den_max)
827			den = rats[k].den_max;
828		else {
829			unsigned int r;
830			r = (den - rats[k].den_min) % rats[k].den_step;
831			if (r != 0)
832				den -= r;
833		}
834		diff = num - q * den;
835		if (diff < 0)
836			diff = -diff;
837		if (best_num == 0 ||
838		    diff * best_den < best_diff * den) {
839			best_diff = diff;
840			best_den = den;
841			best_num = num;
842		}
843	}
844	if (best_den == 0) {
845		i->empty = 1;
846		return -EINVAL;
847	}
848	t.min = div_down(best_num, best_den);
849	t.openmin = !!(best_num % best_den);
850
851	result_num = best_num;
852	result_diff = best_diff;
853	result_den = best_den;
854	best_num = best_den = best_diff = 0;
855	for (k = 0; k < rats_count; ++k) {
856		unsigned int num = rats[k].num;
857		unsigned int den;
858		unsigned int q = i->max;
859		int diff;
860		if (q == 0) {
861			i->empty = 1;
862			return -EINVAL;
863		}
864		den = div_down(num, q);
865		if (den > rats[k].den_max)
866			continue;
867		if (den < rats[k].den_min)
868			den = rats[k].den_min;
869		else {
870			unsigned int r;
871			r = (den - rats[k].den_min) % rats[k].den_step;
872			if (r != 0)
873				den += rats[k].den_step - r;
874		}
875		diff = q * den - num;
876		if (diff < 0)
877			diff = -diff;
878		if (best_num == 0 ||
879		    diff * best_den < best_diff * den) {
880			best_diff = diff;
881			best_den = den;
882			best_num = num;
883		}
884	}
885	if (best_den == 0) {
886		i->empty = 1;
887		return -EINVAL;
888	}
889	t.max = div_up(best_num, best_den);
890	t.openmax = !!(best_num % best_den);
891	t.integer = 0;
892	err = snd_interval_refine(i, &t);
893	if (err < 0)
894		return err;
895
896	if (snd_interval_single(i)) {
897		if (best_diff * result_den < result_diff * best_den) {
898			result_num = best_num;
899			result_den = best_den;
900		}
901		if (nump)
902			*nump = result_num;
903		if (denp)
904			*denp = result_den;
905	}
906	return err;
907}
908
909EXPORT_SYMBOL(snd_interval_ratnum);
910
911/**
912 * snd_interval_ratden - refine the interval value
913 * @i: interval to refine
914 * @rats_count: number of struct ratden
915 * @rats: struct ratden array
916 * @nump: pointer to store the resultant numerator
917 * @denp: pointer to store the resultant denominator
918 *
919 * Return: Positive if the value is changed, zero if it's not changed, or a
920 * negative error code.
921 */
922static int snd_interval_ratden(struct snd_interval *i,
923			       unsigned int rats_count, struct snd_ratden *rats,
924			       unsigned int *nump, unsigned int *denp)
925{
926	unsigned int best_num, best_diff, best_den;
927	unsigned int k;
928	struct snd_interval t;
929	int err;
930
931	best_num = best_den = best_diff = 0;
932	for (k = 0; k < rats_count; ++k) {
933		unsigned int num;
934		unsigned int den = rats[k].den;
935		unsigned int q = i->min;
936		int diff;
937		num = mul(q, den);
938		if (num > rats[k].num_max)
939			continue;
940		if (num < rats[k].num_min)
941			num = rats[k].num_max;
942		else {
943			unsigned int r;
944			r = (num - rats[k].num_min) % rats[k].num_step;
945			if (r != 0)
946				num += rats[k].num_step - r;
947		}
948		diff = num - q * den;
949		if (best_num == 0 ||
950		    diff * best_den < best_diff * den) {
951			best_diff = diff;
952			best_den = den;
953			best_num = num;
954		}
955	}
956	if (best_den == 0) {
957		i->empty = 1;
958		return -EINVAL;
959	}
960	t.min = div_down(best_num, best_den);
961	t.openmin = !!(best_num % best_den);
962
963	best_num = best_den = best_diff = 0;
964	for (k = 0; k < rats_count; ++k) {
965		unsigned int num;
966		unsigned int den = rats[k].den;
967		unsigned int q = i->max;
968		int diff;
969		num = mul(q, den);
970		if (num < rats[k].num_min)
971			continue;
972		if (num > rats[k].num_max)
973			num = rats[k].num_max;
974		else {
975			unsigned int r;
976			r = (num - rats[k].num_min) % rats[k].num_step;
977			if (r != 0)
978				num -= r;
979		}
980		diff = q * den - num;
981		if (best_num == 0 ||
982		    diff * best_den < best_diff * den) {
983			best_diff = diff;
984			best_den = den;
985			best_num = num;
986		}
987	}
988	if (best_den == 0) {
989		i->empty = 1;
990		return -EINVAL;
991	}
992	t.max = div_up(best_num, best_den);
993	t.openmax = !!(best_num % best_den);
994	t.integer = 0;
995	err = snd_interval_refine(i, &t);
996	if (err < 0)
997		return err;
998
999	if (snd_interval_single(i)) {
1000		if (nump)
1001			*nump = best_num;
1002		if (denp)
1003			*denp = best_den;
1004	}
1005	return err;
1006}
1007
1008/**
1009 * snd_interval_list - refine the interval value from the list
1010 * @i: the interval value to refine
1011 * @count: the number of elements in the list
1012 * @list: the value list
1013 * @mask: the bit-mask to evaluate
1014 *
1015 * Refines the interval value from the list.
1016 * When mask is non-zero, only the elements corresponding to bit 1 are
1017 * evaluated.
1018 *
1019 * Return: Positive if the value is changed, zero if it's not changed, or a
1020 * negative error code.
1021 */
1022int snd_interval_list(struct snd_interval *i, unsigned int count,
1023		      const unsigned int *list, unsigned int mask)
1024{
1025        unsigned int k;
1026	struct snd_interval list_range;
1027
1028	if (!count) {
1029		i->empty = 1;
1030		return -EINVAL;
1031	}
1032	snd_interval_any(&list_range);
1033	list_range.min = UINT_MAX;
1034	list_range.max = 0;
1035        for (k = 0; k < count; k++) {
1036		if (mask && !(mask & (1 << k)))
1037			continue;
1038		if (!snd_interval_test(i, list[k]))
1039			continue;
1040		list_range.min = min(list_range.min, list[k]);
1041		list_range.max = max(list_range.max, list[k]);
1042        }
1043	return snd_interval_refine(i, &list_range);
1044}
1045
1046EXPORT_SYMBOL(snd_interval_list);
1047
1048/**
1049 * snd_interval_ranges - refine the interval value from the list of ranges
1050 * @i: the interval value to refine
1051 * @count: the number of elements in the list of ranges
1052 * @ranges: the ranges list
1053 * @mask: the bit-mask to evaluate
1054 *
1055 * Refines the interval value from the list of ranges.
1056 * When mask is non-zero, only the elements corresponding to bit 1 are
1057 * evaluated.
1058 *
1059 * Return: Positive if the value is changed, zero if it's not changed, or a
1060 * negative error code.
1061 */
1062int snd_interval_ranges(struct snd_interval *i, unsigned int count,
1063			const struct snd_interval *ranges, unsigned int mask)
1064{
1065	unsigned int k;
1066	struct snd_interval range_union;
1067	struct snd_interval range;
1068
1069	if (!count) {
1070		snd_interval_none(i);
1071		return -EINVAL;
1072	}
1073	snd_interval_any(&range_union);
1074	range_union.min = UINT_MAX;
1075	range_union.max = 0;
1076	for (k = 0; k < count; k++) {
1077		if (mask && !(mask & (1 << k)))
1078			continue;
1079		snd_interval_copy(&range, &ranges[k]);
1080		if (snd_interval_refine(&range, i) < 0)
1081			continue;
1082		if (snd_interval_empty(&range))
1083			continue;
1084
1085		if (range.min < range_union.min) {
1086			range_union.min = range.min;
1087			range_union.openmin = 1;
1088		}
1089		if (range.min == range_union.min && !range.openmin)
1090			range_union.openmin = 0;
1091		if (range.max > range_union.max) {
1092			range_union.max = range.max;
1093			range_union.openmax = 1;
1094		}
1095		if (range.max == range_union.max && !range.openmax)
1096			range_union.openmax = 0;
1097	}
1098	return snd_interval_refine(i, &range_union);
1099}
1100EXPORT_SYMBOL(snd_interval_ranges);
1101
1102static int snd_interval_step(struct snd_interval *i, unsigned int step)
1103{
1104	unsigned int n;
1105	int changed = 0;
1106	n = i->min % step;
1107	if (n != 0 || i->openmin) {
1108		i->min += step - n;
1109		i->openmin = 0;
1110		changed = 1;
1111	}
1112	n = i->max % step;
1113	if (n != 0 || i->openmax) {
1114		i->max -= n;
1115		i->openmax = 0;
1116		changed = 1;
1117	}
1118	if (snd_interval_checkempty(i)) {
1119		i->empty = 1;
1120		return -EINVAL;
1121	}
1122	return changed;
1123}
1124
1125/* Info constraints helpers */
1126
1127/**
1128 * snd_pcm_hw_rule_add - add the hw-constraint rule
1129 * @runtime: the pcm runtime instance
1130 * @cond: condition bits
1131 * @var: the variable to evaluate
1132 * @func: the evaluation function
1133 * @private: the private data pointer passed to function
1134 * @dep: the dependent variables
1135 *
1136 * Return: Zero if successful, or a negative error code on failure.
1137 */
1138int snd_pcm_hw_rule_add(struct snd_pcm_runtime *runtime, unsigned int cond,
1139			int var,
1140			snd_pcm_hw_rule_func_t func, void *private,
1141			int dep, ...)
1142{
1143	struct snd_pcm_hw_constraints *constrs = &runtime->hw_constraints;
1144	struct snd_pcm_hw_rule *c;
1145	unsigned int k;
1146	va_list args;
1147	va_start(args, dep);
1148	if (constrs->rules_num >= constrs->rules_all) {
1149		struct snd_pcm_hw_rule *new;
1150		unsigned int new_rules = constrs->rules_all + 16;
1151		new = kcalloc(new_rules, sizeof(*c), GFP_KERNEL);
1152		if (!new) {
1153			va_end(args);
1154			return -ENOMEM;
1155		}
1156		if (constrs->rules) {
1157			memcpy(new, constrs->rules,
1158			       constrs->rules_num * sizeof(*c));
1159			kfree(constrs->rules);
1160		}
1161		constrs->rules = new;
1162		constrs->rules_all = new_rules;
1163	}
1164	c = &constrs->rules[constrs->rules_num];
1165	c->cond = cond;
1166	c->func = func;
1167	c->var = var;
1168	c->private = private;
1169	k = 0;
1170	while (1) {
1171		if (snd_BUG_ON(k >= ARRAY_SIZE(c->deps))) {
1172			va_end(args);
1173			return -EINVAL;
1174		}
1175		c->deps[k++] = dep;
1176		if (dep < 0)
1177			break;
1178		dep = va_arg(args, int);
1179	}
1180	constrs->rules_num++;
1181	va_end(args);
1182	return 0;
1183}
1184
1185EXPORT_SYMBOL(snd_pcm_hw_rule_add);
1186
1187/**
1188 * snd_pcm_hw_constraint_mask - apply the given bitmap mask constraint
1189 * @runtime: PCM runtime instance
1190 * @var: hw_params variable to apply the mask
1191 * @mask: the bitmap mask
1192 *
1193 * Apply the constraint of the given bitmap mask to a 32-bit mask parameter.
1194 *
1195 * Return: Zero if successful, or a negative error code on failure.
1196 */
1197int snd_pcm_hw_constraint_mask(struct snd_pcm_runtime *runtime, snd_pcm_hw_param_t var,
1198			       u_int32_t mask)
1199{
1200	struct snd_pcm_hw_constraints *constrs = &runtime->hw_constraints;
1201	struct snd_mask *maskp = constrs_mask(constrs, var);
1202	*maskp->bits &= mask;
1203	memset(maskp->bits + 1, 0, (SNDRV_MASK_MAX-32) / 8); /* clear rest */
1204	if (*maskp->bits == 0)
1205		return -EINVAL;
1206	return 0;
1207}
1208
1209/**
1210 * snd_pcm_hw_constraint_mask64 - apply the given bitmap mask constraint
1211 * @runtime: PCM runtime instance
1212 * @var: hw_params variable to apply the mask
1213 * @mask: the 64bit bitmap mask
1214 *
1215 * Apply the constraint of the given bitmap mask to a 64-bit mask parameter.
1216 *
1217 * Return: Zero if successful, or a negative error code on failure.
1218 */
1219int snd_pcm_hw_constraint_mask64(struct snd_pcm_runtime *runtime, snd_pcm_hw_param_t var,
1220				 u_int64_t mask)
1221{
1222	struct snd_pcm_hw_constraints *constrs = &runtime->hw_constraints;
1223	struct snd_mask *maskp = constrs_mask(constrs, var);
1224	maskp->bits[0] &= (u_int32_t)mask;
1225	maskp->bits[1] &= (u_int32_t)(mask >> 32);
1226	memset(maskp->bits + 2, 0, (SNDRV_MASK_MAX-64) / 8); /* clear rest */
1227	if (! maskp->bits[0] && ! maskp->bits[1])
1228		return -EINVAL;
1229	return 0;
1230}
1231EXPORT_SYMBOL(snd_pcm_hw_constraint_mask64);
1232
1233/**
1234 * snd_pcm_hw_constraint_integer - apply an integer constraint to an interval
1235 * @runtime: PCM runtime instance
1236 * @var: hw_params variable to apply the integer constraint
1237 *
1238 * Apply the constraint of integer to an interval parameter.
1239 *
1240 * Return: Positive if the value is changed, zero if it's not changed, or a
1241 * negative error code.
1242 */
1243int snd_pcm_hw_constraint_integer(struct snd_pcm_runtime *runtime, snd_pcm_hw_param_t var)
1244{
1245	struct snd_pcm_hw_constraints *constrs = &runtime->hw_constraints;
1246	return snd_interval_setinteger(constrs_interval(constrs, var));
1247}
1248
1249EXPORT_SYMBOL(snd_pcm_hw_constraint_integer);
1250
1251/**
1252 * snd_pcm_hw_constraint_minmax - apply a min/max range constraint to an interval
1253 * @runtime: PCM runtime instance
1254 * @var: hw_params variable to apply the range
1255 * @min: the minimal value
1256 * @max: the maximal value
1257 *
1258 * Apply the min/max range constraint to an interval parameter.
1259 *
1260 * Return: Positive if the value is changed, zero if it's not changed, or a
1261 * negative error code.
1262 */
1263int snd_pcm_hw_constraint_minmax(struct snd_pcm_runtime *runtime, snd_pcm_hw_param_t var,
1264				 unsigned int min, unsigned int max)
1265{
1266	struct snd_pcm_hw_constraints *constrs = &runtime->hw_constraints;
1267	struct snd_interval t;
1268	t.min = min;
1269	t.max = max;
1270	t.openmin = t.openmax = 0;
1271	t.integer = 0;
1272	return snd_interval_refine(constrs_interval(constrs, var), &t);
1273}
1274
1275EXPORT_SYMBOL(snd_pcm_hw_constraint_minmax);
1276
1277static int snd_pcm_hw_rule_list(struct snd_pcm_hw_params *params,
1278				struct snd_pcm_hw_rule *rule)
1279{
1280	struct snd_pcm_hw_constraint_list *list = rule->private;
1281	return snd_interval_list(hw_param_interval(params, rule->var), list->count, list->list, list->mask);
1282}
1283
1284
1285/**
1286 * snd_pcm_hw_constraint_list - apply a list of constraints to a parameter
1287 * @runtime: PCM runtime instance
1288 * @cond: condition bits
1289 * @var: hw_params variable to apply the list constraint
1290 * @l: list
1291 *
1292 * Apply the list of constraints to an interval parameter.
1293 *
1294 * Return: Zero if successful, or a negative error code on failure.
1295 */
1296int snd_pcm_hw_constraint_list(struct snd_pcm_runtime *runtime,
1297			       unsigned int cond,
1298			       snd_pcm_hw_param_t var,
1299			       const struct snd_pcm_hw_constraint_list *l)
1300{
1301	return snd_pcm_hw_rule_add(runtime, cond, var,
1302				   snd_pcm_hw_rule_list, (void *)l,
1303				   var, -1);
1304}
1305
1306EXPORT_SYMBOL(snd_pcm_hw_constraint_list);
1307
1308static int snd_pcm_hw_rule_ranges(struct snd_pcm_hw_params *params,
1309				  struct snd_pcm_hw_rule *rule)
1310{
1311	struct snd_pcm_hw_constraint_ranges *r = rule->private;
1312	return snd_interval_ranges(hw_param_interval(params, rule->var),
1313				   r->count, r->ranges, r->mask);
1314}
1315
1316
1317/**
1318 * snd_pcm_hw_constraint_ranges - apply list of range constraints to a parameter
1319 * @runtime: PCM runtime instance
1320 * @cond: condition bits
1321 * @var: hw_params variable to apply the list of range constraints
1322 * @r: ranges
1323 *
1324 * Apply the list of range constraints to an interval parameter.
1325 *
1326 * Return: Zero if successful, or a negative error code on failure.
1327 */
1328int snd_pcm_hw_constraint_ranges(struct snd_pcm_runtime *runtime,
1329				 unsigned int cond,
1330				 snd_pcm_hw_param_t var,
1331				 const struct snd_pcm_hw_constraint_ranges *r)
1332{
1333	return snd_pcm_hw_rule_add(runtime, cond, var,
1334				   snd_pcm_hw_rule_ranges, (void *)r,
1335				   var, -1);
1336}
1337EXPORT_SYMBOL(snd_pcm_hw_constraint_ranges);
1338
1339static int snd_pcm_hw_rule_ratnums(struct snd_pcm_hw_params *params,
1340				   struct snd_pcm_hw_rule *rule)
1341{
1342	struct snd_pcm_hw_constraint_ratnums *r = rule->private;
1343	unsigned int num = 0, den = 0;
1344	int err;
1345	err = snd_interval_ratnum(hw_param_interval(params, rule->var),
1346				  r->nrats, r->rats, &num, &den);
1347	if (err >= 0 && den && rule->var == SNDRV_PCM_HW_PARAM_RATE) {
1348		params->rate_num = num;
1349		params->rate_den = den;
1350	}
1351	return err;
1352}
1353
1354/**
1355 * snd_pcm_hw_constraint_ratnums - apply ratnums constraint to a parameter
1356 * @runtime: PCM runtime instance
1357 * @cond: condition bits
1358 * @var: hw_params variable to apply the ratnums constraint
1359 * @r: struct snd_ratnums constriants
1360 *
1361 * Return: Zero if successful, or a negative error code on failure.
1362 */
1363int snd_pcm_hw_constraint_ratnums(struct snd_pcm_runtime *runtime,
1364				  unsigned int cond,
1365				  snd_pcm_hw_param_t var,
1366				  struct snd_pcm_hw_constraint_ratnums *r)
1367{
1368	return snd_pcm_hw_rule_add(runtime, cond, var,
1369				   snd_pcm_hw_rule_ratnums, r,
1370				   var, -1);
1371}
1372
1373EXPORT_SYMBOL(snd_pcm_hw_constraint_ratnums);
1374
1375static int snd_pcm_hw_rule_ratdens(struct snd_pcm_hw_params *params,
1376				   struct snd_pcm_hw_rule *rule)
1377{
1378	struct snd_pcm_hw_constraint_ratdens *r = rule->private;
1379	unsigned int num = 0, den = 0;
1380	int err = snd_interval_ratden(hw_param_interval(params, rule->var),
1381				  r->nrats, r->rats, &num, &den);
1382	if (err >= 0 && den && rule->var == SNDRV_PCM_HW_PARAM_RATE) {
1383		params->rate_num = num;
1384		params->rate_den = den;
1385	}
1386	return err;
1387}
1388
1389/**
1390 * snd_pcm_hw_constraint_ratdens - apply ratdens constraint to a parameter
1391 * @runtime: PCM runtime instance
1392 * @cond: condition bits
1393 * @var: hw_params variable to apply the ratdens constraint
1394 * @r: struct snd_ratdens constriants
1395 *
1396 * Return: Zero if successful, or a negative error code on failure.
1397 */
1398int snd_pcm_hw_constraint_ratdens(struct snd_pcm_runtime *runtime,
1399				  unsigned int cond,
1400				  snd_pcm_hw_param_t var,
1401				  struct snd_pcm_hw_constraint_ratdens *r)
1402{
1403	return snd_pcm_hw_rule_add(runtime, cond, var,
1404				   snd_pcm_hw_rule_ratdens, r,
1405				   var, -1);
1406}
1407
1408EXPORT_SYMBOL(snd_pcm_hw_constraint_ratdens);
1409
1410static int snd_pcm_hw_rule_msbits(struct snd_pcm_hw_params *params,
1411				  struct snd_pcm_hw_rule *rule)
1412{
1413	unsigned int l = (unsigned long) rule->private;
1414	int width = l & 0xffff;
1415	unsigned int msbits = l >> 16;
1416	struct snd_interval *i = hw_param_interval(params, SNDRV_PCM_HW_PARAM_SAMPLE_BITS);
1417
1418	if (!snd_interval_single(i))
1419		return 0;
1420
1421	if ((snd_interval_value(i) == width) ||
1422	    (width == 0 && snd_interval_value(i) > msbits))
1423		params->msbits = min_not_zero(params->msbits, msbits);
1424
1425	return 0;
1426}
1427
1428/**
1429 * snd_pcm_hw_constraint_msbits - add a hw constraint msbits rule
1430 * @runtime: PCM runtime instance
1431 * @cond: condition bits
1432 * @width: sample bits width
1433 * @msbits: msbits width
1434 *
1435 * This constraint will set the number of most significant bits (msbits) if a
1436 * sample format with the specified width has been select. If width is set to 0
1437 * the msbits will be set for any sample format with a width larger than the
1438 * specified msbits.
1439 *
1440 * Return: Zero if successful, or a negative error code on failure.
1441 */
1442int snd_pcm_hw_constraint_msbits(struct snd_pcm_runtime *runtime,
1443				 unsigned int cond,
1444				 unsigned int width,
1445				 unsigned int msbits)
1446{
1447	unsigned long l = (msbits << 16) | width;
1448	return snd_pcm_hw_rule_add(runtime, cond, -1,
1449				    snd_pcm_hw_rule_msbits,
1450				    (void*) l,
1451				    SNDRV_PCM_HW_PARAM_SAMPLE_BITS, -1);
1452}
1453
1454EXPORT_SYMBOL(snd_pcm_hw_constraint_msbits);
1455
1456static int snd_pcm_hw_rule_step(struct snd_pcm_hw_params *params,
1457				struct snd_pcm_hw_rule *rule)
1458{
1459	unsigned long step = (unsigned long) rule->private;
1460	return snd_interval_step(hw_param_interval(params, rule->var), step);
1461}
1462
1463/**
1464 * snd_pcm_hw_constraint_step - add a hw constraint step rule
1465 * @runtime: PCM runtime instance
1466 * @cond: condition bits
1467 * @var: hw_params variable to apply the step constraint
1468 * @step: step size
1469 *
1470 * Return: Zero if successful, or a negative error code on failure.
1471 */
1472int snd_pcm_hw_constraint_step(struct snd_pcm_runtime *runtime,
1473			       unsigned int cond,
1474			       snd_pcm_hw_param_t var,
1475			       unsigned long step)
1476{
1477	return snd_pcm_hw_rule_add(runtime, cond, var,
1478				   snd_pcm_hw_rule_step, (void *) step,
1479				   var, -1);
1480}
1481
1482EXPORT_SYMBOL(snd_pcm_hw_constraint_step);
1483
1484static int snd_pcm_hw_rule_pow2(struct snd_pcm_hw_params *params, struct snd_pcm_hw_rule *rule)
1485{
1486	static unsigned int pow2_sizes[] = {
1487		1<<0, 1<<1, 1<<2, 1<<3, 1<<4, 1<<5, 1<<6, 1<<7,
1488		1<<8, 1<<9, 1<<10, 1<<11, 1<<12, 1<<13, 1<<14, 1<<15,
1489		1<<16, 1<<17, 1<<18, 1<<19, 1<<20, 1<<21, 1<<22, 1<<23,
1490		1<<24, 1<<25, 1<<26, 1<<27, 1<<28, 1<<29, 1<<30
1491	};
1492	return snd_interval_list(hw_param_interval(params, rule->var),
1493				 ARRAY_SIZE(pow2_sizes), pow2_sizes, 0);
1494}
1495
1496/**
1497 * snd_pcm_hw_constraint_pow2 - add a hw constraint power-of-2 rule
1498 * @runtime: PCM runtime instance
1499 * @cond: condition bits
1500 * @var: hw_params variable to apply the power-of-2 constraint
1501 *
1502 * Return: Zero if successful, or a negative error code on failure.
1503 */
1504int snd_pcm_hw_constraint_pow2(struct snd_pcm_runtime *runtime,
1505			       unsigned int cond,
1506			       snd_pcm_hw_param_t var)
1507{
1508	return snd_pcm_hw_rule_add(runtime, cond, var,
1509				   snd_pcm_hw_rule_pow2, NULL,
1510				   var, -1);
1511}
1512
1513EXPORT_SYMBOL(snd_pcm_hw_constraint_pow2);
1514
1515static int snd_pcm_hw_rule_noresample_func(struct snd_pcm_hw_params *params,
1516					   struct snd_pcm_hw_rule *rule)
1517{
1518	unsigned int base_rate = (unsigned int)(uintptr_t)rule->private;
1519	struct snd_interval *rate;
1520
1521	rate = hw_param_interval(params, SNDRV_PCM_HW_PARAM_RATE);
1522	return snd_interval_list(rate, 1, &base_rate, 0);
1523}
1524
1525/**
1526 * snd_pcm_hw_rule_noresample - add a rule to allow disabling hw resampling
1527 * @runtime: PCM runtime instance
1528 * @base_rate: the rate at which the hardware does not resample
1529 *
1530 * Return: Zero if successful, or a negative error code on failure.
1531 */
1532int snd_pcm_hw_rule_noresample(struct snd_pcm_runtime *runtime,
1533			       unsigned int base_rate)
1534{
1535	return snd_pcm_hw_rule_add(runtime, SNDRV_PCM_HW_PARAMS_NORESAMPLE,
1536				   SNDRV_PCM_HW_PARAM_RATE,
1537				   snd_pcm_hw_rule_noresample_func,
1538				   (void *)(uintptr_t)base_rate,
1539				   SNDRV_PCM_HW_PARAM_RATE, -1);
1540}
1541EXPORT_SYMBOL(snd_pcm_hw_rule_noresample);
1542
1543static void _snd_pcm_hw_param_any(struct snd_pcm_hw_params *params,
1544				  snd_pcm_hw_param_t var)
1545{
1546	if (hw_is_mask(var)) {
1547		snd_mask_any(hw_param_mask(params, var));
1548		params->cmask |= 1 << var;
1549		params->rmask |= 1 << var;
1550		return;
1551	}
1552	if (hw_is_interval(var)) {
1553		snd_interval_any(hw_param_interval(params, var));
1554		params->cmask |= 1 << var;
1555		params->rmask |= 1 << var;
1556		return;
1557	}
1558	snd_BUG();
1559}
1560
1561void _snd_pcm_hw_params_any(struct snd_pcm_hw_params *params)
1562{
1563	unsigned int k;
1564	memset(params, 0, sizeof(*params));
1565	for (k = SNDRV_PCM_HW_PARAM_FIRST_MASK; k <= SNDRV_PCM_HW_PARAM_LAST_MASK; k++)
1566		_snd_pcm_hw_param_any(params, k);
1567	for (k = SNDRV_PCM_HW_PARAM_FIRST_INTERVAL; k <= SNDRV_PCM_HW_PARAM_LAST_INTERVAL; k++)
1568		_snd_pcm_hw_param_any(params, k);
1569	params->info = ~0U;
1570}
1571
1572EXPORT_SYMBOL(_snd_pcm_hw_params_any);
1573
1574/**
1575 * snd_pcm_hw_param_value - return @params field @var value
1576 * @params: the hw_params instance
1577 * @var: parameter to retrieve
1578 * @dir: pointer to the direction (-1,0,1) or %NULL
1579 *
1580 * Return: The value for field @var if it's fixed in configuration space
1581 * defined by @params. -%EINVAL otherwise.
1582 */
1583int snd_pcm_hw_param_value(const struct snd_pcm_hw_params *params,
1584			   snd_pcm_hw_param_t var, int *dir)
1585{
1586	if (hw_is_mask(var)) {
1587		const struct snd_mask *mask = hw_param_mask_c(params, var);
1588		if (!snd_mask_single(mask))
1589			return -EINVAL;
1590		if (dir)
1591			*dir = 0;
1592		return snd_mask_value(mask);
1593	}
1594	if (hw_is_interval(var)) {
1595		const struct snd_interval *i = hw_param_interval_c(params, var);
1596		if (!snd_interval_single(i))
1597			return -EINVAL;
1598		if (dir)
1599			*dir = i->openmin;
1600		return snd_interval_value(i);
1601	}
1602	return -EINVAL;
1603}
1604
1605EXPORT_SYMBOL(snd_pcm_hw_param_value);
1606
1607void _snd_pcm_hw_param_setempty(struct snd_pcm_hw_params *params,
1608				snd_pcm_hw_param_t var)
1609{
1610	if (hw_is_mask(var)) {
1611		snd_mask_none(hw_param_mask(params, var));
1612		params->cmask |= 1 << var;
1613		params->rmask |= 1 << var;
1614	} else if (hw_is_interval(var)) {
1615		snd_interval_none(hw_param_interval(params, var));
1616		params->cmask |= 1 << var;
1617		params->rmask |= 1 << var;
1618	} else {
1619		snd_BUG();
1620	}
1621}
1622
1623EXPORT_SYMBOL(_snd_pcm_hw_param_setempty);
1624
1625static int _snd_pcm_hw_param_first(struct snd_pcm_hw_params *params,
1626				   snd_pcm_hw_param_t var)
1627{
1628	int changed;
1629	if (hw_is_mask(var))
1630		changed = snd_mask_refine_first(hw_param_mask(params, var));
1631	else if (hw_is_interval(var))
1632		changed = snd_interval_refine_first(hw_param_interval(params, var));
1633	else
1634		return -EINVAL;
1635	if (changed) {
1636		params->cmask |= 1 << var;
1637		params->rmask |= 1 << var;
1638	}
1639	return changed;
1640}
1641
1642
1643/**
1644 * snd_pcm_hw_param_first - refine config space and return minimum value
1645 * @pcm: PCM instance
1646 * @params: the hw_params instance
1647 * @var: parameter to retrieve
1648 * @dir: pointer to the direction (-1,0,1) or %NULL
1649 *
1650 * Inside configuration space defined by @params remove from @var all
1651 * values > minimum. Reduce configuration space accordingly.
1652 *
1653 * Return: The minimum, or a negative error code on failure.
1654 */
1655int snd_pcm_hw_param_first(struct snd_pcm_substream *pcm,
1656			   struct snd_pcm_hw_params *params,
1657			   snd_pcm_hw_param_t var, int *dir)
1658{
1659	int changed = _snd_pcm_hw_param_first(params, var);
1660	if (changed < 0)
1661		return changed;
1662	if (params->rmask) {
1663		int err = snd_pcm_hw_refine(pcm, params);
1664		if (snd_BUG_ON(err < 0))
1665			return err;
1666	}
1667	return snd_pcm_hw_param_value(params, var, dir);
1668}
1669
1670EXPORT_SYMBOL(snd_pcm_hw_param_first);
1671
1672static int _snd_pcm_hw_param_last(struct snd_pcm_hw_params *params,
1673				  snd_pcm_hw_param_t var)
1674{
1675	int changed;
1676	if (hw_is_mask(var))
1677		changed = snd_mask_refine_last(hw_param_mask(params, var));
1678	else if (hw_is_interval(var))
1679		changed = snd_interval_refine_last(hw_param_interval(params, var));
1680	else
1681		return -EINVAL;
1682	if (changed) {
1683		params->cmask |= 1 << var;
1684		params->rmask |= 1 << var;
1685	}
1686	return changed;
1687}
1688
1689
1690/**
1691 * snd_pcm_hw_param_last - refine config space and return maximum value
1692 * @pcm: PCM instance
1693 * @params: the hw_params instance
1694 * @var: parameter to retrieve
1695 * @dir: pointer to the direction (-1,0,1) or %NULL
1696 *
1697 * Inside configuration space defined by @params remove from @var all
1698 * values < maximum. Reduce configuration space accordingly.
1699 *
1700 * Return: The maximum, or a negative error code on failure.
1701 */
1702int snd_pcm_hw_param_last(struct snd_pcm_substream *pcm,
1703			  struct snd_pcm_hw_params *params,
1704			  snd_pcm_hw_param_t var, int *dir)
1705{
1706	int changed = _snd_pcm_hw_param_last(params, var);
1707	if (changed < 0)
1708		return changed;
1709	if (params->rmask) {
1710		int err = snd_pcm_hw_refine(pcm, params);
1711		if (snd_BUG_ON(err < 0))
1712			return err;
1713	}
1714	return snd_pcm_hw_param_value(params, var, dir);
1715}
1716
1717EXPORT_SYMBOL(snd_pcm_hw_param_last);
1718
1719/**
1720 * snd_pcm_hw_param_choose - choose a configuration defined by @params
1721 * @pcm: PCM instance
1722 * @params: the hw_params instance
1723 *
1724 * Choose one configuration from configuration space defined by @params.
1725 * The configuration chosen is that obtained fixing in this order:
1726 * first access, first format, first subformat, min channels,
1727 * min rate, min period time, max buffer size, min tick time
1728 *
1729 * Return: Zero if successful, or a negative error code on failure.
1730 */
1731int snd_pcm_hw_params_choose(struct snd_pcm_substream *pcm,
1732			     struct snd_pcm_hw_params *params)
1733{
1734	static int vars[] = {
1735		SNDRV_PCM_HW_PARAM_ACCESS,
1736		SNDRV_PCM_HW_PARAM_FORMAT,
1737		SNDRV_PCM_HW_PARAM_SUBFORMAT,
1738		SNDRV_PCM_HW_PARAM_CHANNELS,
1739		SNDRV_PCM_HW_PARAM_RATE,
1740		SNDRV_PCM_HW_PARAM_PERIOD_TIME,
1741		SNDRV_PCM_HW_PARAM_BUFFER_SIZE,
1742		SNDRV_PCM_HW_PARAM_TICK_TIME,
1743		-1
1744	};
1745	int err, *v;
1746
1747	for (v = vars; *v != -1; v++) {
1748		if (*v != SNDRV_PCM_HW_PARAM_BUFFER_SIZE)
1749			err = snd_pcm_hw_param_first(pcm, params, *v, NULL);
1750		else
1751			err = snd_pcm_hw_param_last(pcm, params, *v, NULL);
1752		if (snd_BUG_ON(err < 0))
1753			return err;
1754	}
1755	return 0;
1756}
1757
1758static int snd_pcm_lib_ioctl_reset(struct snd_pcm_substream *substream,
1759				   void *arg)
1760{
1761	struct snd_pcm_runtime *runtime = substream->runtime;
1762	unsigned long flags;
1763	snd_pcm_stream_lock_irqsave(substream, flags);
1764	if (snd_pcm_running(substream) &&
1765	    snd_pcm_update_hw_ptr(substream) >= 0)
1766		runtime->status->hw_ptr %= runtime->buffer_size;
1767	else {
1768		runtime->status->hw_ptr = 0;
1769		runtime->hw_ptr_wrap = 0;
1770	}
1771	snd_pcm_stream_unlock_irqrestore(substream, flags);
1772	return 0;
1773}
1774
1775static int snd_pcm_lib_ioctl_channel_info(struct snd_pcm_substream *substream,
1776					  void *arg)
1777{
1778	struct snd_pcm_channel_info *info = arg;
1779	struct snd_pcm_runtime *runtime = substream->runtime;
1780	int width;
1781	if (!(runtime->info & SNDRV_PCM_INFO_MMAP)) {
1782		info->offset = -1;
1783		return 0;
1784	}
1785	width = snd_pcm_format_physical_width(runtime->format);
1786	if (width < 0)
1787		return width;
1788	info->offset = 0;
1789	switch (runtime->access) {
1790	case SNDRV_PCM_ACCESS_MMAP_INTERLEAVED:
1791	case SNDRV_PCM_ACCESS_RW_INTERLEAVED:
1792		info->first = info->channel * width;
1793		info->step = runtime->channels * width;
1794		break;
1795	case SNDRV_PCM_ACCESS_MMAP_NONINTERLEAVED:
1796	case SNDRV_PCM_ACCESS_RW_NONINTERLEAVED:
1797	{
1798		size_t size = runtime->dma_bytes / runtime->channels;
1799		info->first = info->channel * size * 8;
1800		info->step = width;
1801		break;
1802	}
1803	default:
1804		snd_BUG();
1805		break;
1806	}
1807	return 0;
1808}
1809
1810static int snd_pcm_lib_ioctl_fifo_size(struct snd_pcm_substream *substream,
1811				       void *arg)
1812{
1813	struct snd_pcm_hw_params *params = arg;
1814	snd_pcm_format_t format;
1815	int channels;
1816	ssize_t frame_size;
1817
1818	params->fifo_size = substream->runtime->hw.fifo_size;
1819	if (!(substream->runtime->hw.info & SNDRV_PCM_INFO_FIFO_IN_FRAMES)) {
1820		format = params_format(params);
1821		channels = params_channels(params);
1822		frame_size = snd_pcm_format_size(format, channels);
1823		if (frame_size > 0)
1824			params->fifo_size /= (unsigned)frame_size;
1825	}
1826	return 0;
1827}
1828
1829/**
1830 * snd_pcm_lib_ioctl - a generic PCM ioctl callback
1831 * @substream: the pcm substream instance
1832 * @cmd: ioctl command
1833 * @arg: ioctl argument
1834 *
1835 * Processes the generic ioctl commands for PCM.
1836 * Can be passed as the ioctl callback for PCM ops.
1837 *
1838 * Return: Zero if successful, or a negative error code on failure.
1839 */
1840int snd_pcm_lib_ioctl(struct snd_pcm_substream *substream,
1841		      unsigned int cmd, void *arg)
1842{
1843	switch (cmd) {
1844	case SNDRV_PCM_IOCTL1_INFO:
1845		return 0;
1846	case SNDRV_PCM_IOCTL1_RESET:
1847		return snd_pcm_lib_ioctl_reset(substream, arg);
1848	case SNDRV_PCM_IOCTL1_CHANNEL_INFO:
1849		return snd_pcm_lib_ioctl_channel_info(substream, arg);
1850	case SNDRV_PCM_IOCTL1_FIFO_SIZE:
1851		return snd_pcm_lib_ioctl_fifo_size(substream, arg);
1852	}
1853	return -ENXIO;
1854}
1855
1856EXPORT_SYMBOL(snd_pcm_lib_ioctl);
1857
1858/**
1859 * snd_pcm_period_elapsed - update the pcm status for the next period
1860 * @substream: the pcm substream instance
1861 *
1862 * This function is called from the interrupt handler when the
1863 * PCM has processed the period size.  It will update the current
1864 * pointer, wake up sleepers, etc.
1865 *
1866 * Even if more than one periods have elapsed since the last call, you
1867 * have to call this only once.
1868 */
1869void snd_pcm_period_elapsed(struct snd_pcm_substream *substream)
1870{
1871	struct snd_pcm_runtime *runtime;
1872	unsigned long flags;
1873
1874	if (PCM_RUNTIME_CHECK(substream))
1875		return;
1876	runtime = substream->runtime;
1877
1878	if (runtime->transfer_ack_begin)
1879		runtime->transfer_ack_begin(substream);
1880
1881	snd_pcm_stream_lock_irqsave(substream, flags);
1882	if (!snd_pcm_running(substream) ||
1883	    snd_pcm_update_hw_ptr0(substream, 1) < 0)
1884		goto _end;
1885
1886	if (substream->timer_running)
1887		snd_timer_interrupt(substream->timer, 1);
1888 _end:
1889	snd_pcm_stream_unlock_irqrestore(substream, flags);
1890	if (runtime->transfer_ack_end)
1891		runtime->transfer_ack_end(substream);
1892	kill_fasync(&runtime->fasync, SIGIO, POLL_IN);
1893}
1894
1895EXPORT_SYMBOL(snd_pcm_period_elapsed);
1896
1897/*
1898 * Wait until avail_min data becomes available
1899 * Returns a negative error code if any error occurs during operation.
1900 * The available space is stored on availp.  When err = 0 and avail = 0
1901 * on the capture stream, it indicates the stream is in DRAINING state.
1902 */
1903static int wait_for_avail(struct snd_pcm_substream *substream,
1904			      snd_pcm_uframes_t *availp)
1905{
1906	struct snd_pcm_runtime *runtime = substream->runtime;
1907	int is_playback = substream->stream == SNDRV_PCM_STREAM_PLAYBACK;
1908	wait_queue_t wait;
1909	int err = 0;
1910	snd_pcm_uframes_t avail = 0;
1911	long wait_time, tout;
1912
1913	init_waitqueue_entry(&wait, current);
1914	set_current_state(TASK_INTERRUPTIBLE);
1915	add_wait_queue(&runtime->tsleep, &wait);
1916
1917	if (runtime->no_period_wakeup)
1918		wait_time = MAX_SCHEDULE_TIMEOUT;
1919	else {
1920		wait_time = 10;
1921		if (runtime->rate) {
1922			long t = runtime->period_size * 2 / runtime->rate;
1923			wait_time = max(t, wait_time);
1924		}
1925		wait_time = msecs_to_jiffies(wait_time * 1000);
1926	}
1927
1928	for (;;) {
1929		if (signal_pending(current)) {
1930			err = -ERESTARTSYS;
1931			break;
1932		}
1933
1934		/*
1935		 * We need to check if space became available already
1936		 * (and thus the wakeup happened already) first to close
1937		 * the race of space already having become available.
1938		 * This check must happen after been added to the waitqueue
1939		 * and having current state be INTERRUPTIBLE.
1940		 */
1941		if (is_playback)
1942			avail = snd_pcm_playback_avail(runtime);
1943		else
1944			avail = snd_pcm_capture_avail(runtime);
1945		if (avail >= runtime->twake)
1946			break;
1947		snd_pcm_stream_unlock_irq(substream);
1948
1949		tout = schedule_timeout(wait_time);
1950
1951		snd_pcm_stream_lock_irq(substream);
1952		set_current_state(TASK_INTERRUPTIBLE);
1953		switch (runtime->status->state) {
1954		case SNDRV_PCM_STATE_SUSPENDED:
1955			err = -ESTRPIPE;
1956			goto _endloop;
1957		case SNDRV_PCM_STATE_XRUN:
1958			err = -EPIPE;
1959			goto _endloop;
1960		case SNDRV_PCM_STATE_DRAINING:
1961			if (is_playback)
1962				err = -EPIPE;
1963			else
1964				avail = 0; /* indicate draining */
1965			goto _endloop;
1966		case SNDRV_PCM_STATE_OPEN:
1967		case SNDRV_PCM_STATE_SETUP:
1968		case SNDRV_PCM_STATE_DISCONNECTED:
1969			err = -EBADFD;
1970			goto _endloop;
1971		case SNDRV_PCM_STATE_PAUSED:
1972			continue;
1973		}
1974		if (!tout) {
1975			pcm_dbg(substream->pcm,
1976				"%s write error (DMA or IRQ trouble?)\n",
1977				is_playback ? "playback" : "capture");
1978			err = -EIO;
1979			break;
1980		}
1981	}
1982 _endloop:
1983	set_current_state(TASK_RUNNING);
1984	remove_wait_queue(&runtime->tsleep, &wait);
1985	*availp = avail;
1986	return err;
1987}
1988
1989static int snd_pcm_lib_write_transfer(struct snd_pcm_substream *substream,
1990				      unsigned int hwoff,
1991				      unsigned long data, unsigned int off,
1992				      snd_pcm_uframes_t frames)
1993{
1994	struct snd_pcm_runtime *runtime = substream->runtime;
1995	int err;
1996	char __user *buf = (char __user *) data + frames_to_bytes(runtime, off);
1997	if (substream->ops->copy) {
1998		if ((err = substream->ops->copy(substream, -1, hwoff, buf, frames)) < 0)
1999			return err;
2000	} else {
2001		char *hwbuf = runtime->dma_area + frames_to_bytes(runtime, hwoff);
2002		if (copy_from_user(hwbuf, buf, frames_to_bytes(runtime, frames)))
2003			return -EFAULT;
2004	}
2005	return 0;
2006}
2007
2008typedef int (*transfer_f)(struct snd_pcm_substream *substream, unsigned int hwoff,
2009			  unsigned long data, unsigned int off,
2010			  snd_pcm_uframes_t size);
2011
2012static snd_pcm_sframes_t snd_pcm_lib_write1(struct snd_pcm_substream *substream,
2013					    unsigned long data,
2014					    snd_pcm_uframes_t size,
2015					    int nonblock,
2016					    transfer_f transfer)
2017{
2018	struct snd_pcm_runtime *runtime = substream->runtime;
2019	snd_pcm_uframes_t xfer = 0;
2020	snd_pcm_uframes_t offset = 0;
2021	snd_pcm_uframes_t avail;
2022	int err = 0;
2023
2024	if (size == 0)
2025		return 0;
2026
2027	snd_pcm_stream_lock_irq(substream);
2028	switch (runtime->status->state) {
2029	case SNDRV_PCM_STATE_PREPARED:
2030	case SNDRV_PCM_STATE_RUNNING:
2031	case SNDRV_PCM_STATE_PAUSED:
2032		break;
2033	case SNDRV_PCM_STATE_XRUN:
2034		err = -EPIPE;
2035		goto _end_unlock;
2036	case SNDRV_PCM_STATE_SUSPENDED:
2037		err = -ESTRPIPE;
2038		goto _end_unlock;
2039	default:
2040		err = -EBADFD;
2041		goto _end_unlock;
2042	}
2043
2044	runtime->twake = runtime->control->avail_min ? : 1;
2045	if (runtime->status->state == SNDRV_PCM_STATE_RUNNING)
2046		snd_pcm_update_hw_ptr(substream);
2047	avail = snd_pcm_playback_avail(runtime);
2048	while (size > 0) {
2049		snd_pcm_uframes_t frames, appl_ptr, appl_ofs;
2050		snd_pcm_uframes_t cont;
2051		if (!avail) {
2052			if (nonblock) {
2053				err = -EAGAIN;
2054				goto _end_unlock;
2055			}
2056			runtime->twake = min_t(snd_pcm_uframes_t, size,
2057					runtime->control->avail_min ? : 1);
2058			err = wait_for_avail(substream, &avail);
2059			if (err < 0)
2060				goto _end_unlock;
2061		}
2062		frames = size > avail ? avail : size;
2063		cont = runtime->buffer_size - runtime->control->appl_ptr % runtime->buffer_size;
2064		if (frames > cont)
2065			frames = cont;
2066		if (snd_BUG_ON(!frames)) {
2067			runtime->twake = 0;
2068			snd_pcm_stream_unlock_irq(substream);
2069			return -EINVAL;
2070		}
2071		appl_ptr = runtime->control->appl_ptr;
2072		appl_ofs = appl_ptr % runtime->buffer_size;
2073		snd_pcm_stream_unlock_irq(substream);
2074		err = transfer(substream, appl_ofs, data, offset, frames);
2075		snd_pcm_stream_lock_irq(substream);
2076		if (err < 0)
2077			goto _end_unlock;
2078		switch (runtime->status->state) {
2079		case SNDRV_PCM_STATE_XRUN:
2080			err = -EPIPE;
2081			goto _end_unlock;
2082		case SNDRV_PCM_STATE_SUSPENDED:
2083			err = -ESTRPIPE;
2084			goto _end_unlock;
2085		default:
2086			break;
2087		}
2088		appl_ptr += frames;
2089		if (appl_ptr >= runtime->boundary)
2090			appl_ptr -= runtime->boundary;
2091		runtime->control->appl_ptr = appl_ptr;
2092		if (substream->ops->ack)
2093			substream->ops->ack(substream);
2094
2095		offset += frames;
2096		size -= frames;
2097		xfer += frames;
2098		avail -= frames;
2099		if (runtime->status->state == SNDRV_PCM_STATE_PREPARED &&
2100		    snd_pcm_playback_hw_avail(runtime) >= (snd_pcm_sframes_t)runtime->start_threshold) {
2101			err = snd_pcm_start(substream);
2102			if (err < 0)
2103				goto _end_unlock;
2104		}
2105	}
2106 _end_unlock:
2107	runtime->twake = 0;
2108	if (xfer > 0 && err >= 0)
2109		snd_pcm_update_state(substream, runtime);
2110	snd_pcm_stream_unlock_irq(substream);
2111	return xfer > 0 ? (snd_pcm_sframes_t)xfer : err;
2112}
2113
2114/* sanity-check for read/write methods */
2115static int pcm_sanity_check(struct snd_pcm_substream *substream)
2116{
2117	struct snd_pcm_runtime *runtime;
2118	if (PCM_RUNTIME_CHECK(substream))
2119		return -ENXIO;
2120	runtime = substream->runtime;
2121	if (snd_BUG_ON(!substream->ops->copy && !runtime->dma_area))
2122		return -EINVAL;
2123	if (runtime->status->state == SNDRV_PCM_STATE_OPEN)
2124		return -EBADFD;
2125	return 0;
2126}
2127
2128snd_pcm_sframes_t snd_pcm_lib_write(struct snd_pcm_substream *substream, const void __user *buf, snd_pcm_uframes_t size)
2129{
2130	struct snd_pcm_runtime *runtime;
2131	int nonblock;
2132	int err;
2133
2134	err = pcm_sanity_check(substream);
2135	if (err < 0)
2136		return err;
2137	runtime = substream->runtime;
2138	nonblock = !!(substream->f_flags & O_NONBLOCK);
2139
2140	if (runtime->access != SNDRV_PCM_ACCESS_RW_INTERLEAVED &&
2141	    runtime->channels > 1)
2142		return -EINVAL;
2143	return snd_pcm_lib_write1(substream, (unsigned long)buf, size, nonblock,
2144				  snd_pcm_lib_write_transfer);
2145}
2146
2147EXPORT_SYMBOL(snd_pcm_lib_write);
2148
2149static int snd_pcm_lib_writev_transfer(struct snd_pcm_substream *substream,
2150				       unsigned int hwoff,
2151				       unsigned long data, unsigned int off,
2152				       snd_pcm_uframes_t frames)
2153{
2154	struct snd_pcm_runtime *runtime = substream->runtime;
2155	int err;
2156	void __user **bufs = (void __user **)data;
2157	int channels = runtime->channels;
2158	int c;
2159	if (substream->ops->copy) {
2160		if (snd_BUG_ON(!substream->ops->silence))
2161			return -EINVAL;
2162		for (c = 0; c < channels; ++c, ++bufs) {
2163			if (*bufs == NULL) {
2164				if ((err = substream->ops->silence(substream, c, hwoff, frames)) < 0)
2165					return err;
2166			} else {
2167				char __user *buf = *bufs + samples_to_bytes(runtime, off);
2168				if ((err = substream->ops->copy(substream, c, hwoff, buf, frames)) < 0)
2169					return err;
2170			}
2171		}
2172	} else {
2173		/* default transfer behaviour */
2174		size_t dma_csize = runtime->dma_bytes / channels;
2175		for (c = 0; c < channels; ++c, ++bufs) {
2176			char *hwbuf = runtime->dma_area + (c * dma_csize) + samples_to_bytes(runtime, hwoff);
2177			if (*bufs == NULL) {
2178				snd_pcm_format_set_silence(runtime->format, hwbuf, frames);
2179			} else {
2180				char __user *buf = *bufs + samples_to_bytes(runtime, off);
2181				if (copy_from_user(hwbuf, buf, samples_to_bytes(runtime, frames)))
2182					return -EFAULT;
2183			}
2184		}
2185	}
2186	return 0;
2187}
2188
2189snd_pcm_sframes_t snd_pcm_lib_writev(struct snd_pcm_substream *substream,
2190				     void __user **bufs,
2191				     snd_pcm_uframes_t frames)
2192{
2193	struct snd_pcm_runtime *runtime;
2194	int nonblock;
2195	int err;
2196
2197	err = pcm_sanity_check(substream);
2198	if (err < 0)
2199		return err;
2200	runtime = substream->runtime;
2201	nonblock = !!(substream->f_flags & O_NONBLOCK);
2202
2203	if (runtime->access != SNDRV_PCM_ACCESS_RW_NONINTERLEAVED)
2204		return -EINVAL;
2205	return snd_pcm_lib_write1(substream, (unsigned long)bufs, frames,
2206				  nonblock, snd_pcm_lib_writev_transfer);
2207}
2208
2209EXPORT_SYMBOL(snd_pcm_lib_writev);
2210
2211static int snd_pcm_lib_read_transfer(struct snd_pcm_substream *substream,
2212				     unsigned int hwoff,
2213				     unsigned long data, unsigned int off,
2214				     snd_pcm_uframes_t frames)
2215{
2216	struct snd_pcm_runtime *runtime = substream->runtime;
2217	int err;
2218	char __user *buf = (char __user *) data + frames_to_bytes(runtime, off);
2219	if (substream->ops->copy) {
2220		if ((err = substream->ops->copy(substream, -1, hwoff, buf, frames)) < 0)
2221			return err;
2222	} else {
2223		char *hwbuf = runtime->dma_area + frames_to_bytes(runtime, hwoff);
2224		if (copy_to_user(buf, hwbuf, frames_to_bytes(runtime, frames)))
2225			return -EFAULT;
2226	}
2227	return 0;
2228}
2229
2230static snd_pcm_sframes_t snd_pcm_lib_read1(struct snd_pcm_substream *substream,
2231					   unsigned long data,
2232					   snd_pcm_uframes_t size,
2233					   int nonblock,
2234					   transfer_f transfer)
2235{
2236	struct snd_pcm_runtime *runtime = substream->runtime;
2237	snd_pcm_uframes_t xfer = 0;
2238	snd_pcm_uframes_t offset = 0;
2239	snd_pcm_uframes_t avail;
2240	int err = 0;
2241
2242	if (size == 0)
2243		return 0;
2244
2245	snd_pcm_stream_lock_irq(substream);
2246	switch (runtime->status->state) {
2247	case SNDRV_PCM_STATE_PREPARED:
2248		if (size >= runtime->start_threshold) {
2249			err = snd_pcm_start(substream);
2250			if (err < 0)
2251				goto _end_unlock;
2252		}
2253		break;
2254	case SNDRV_PCM_STATE_DRAINING:
2255	case SNDRV_PCM_STATE_RUNNING:
2256	case SNDRV_PCM_STATE_PAUSED:
2257		break;
2258	case SNDRV_PCM_STATE_XRUN:
2259		err = -EPIPE;
2260		goto _end_unlock;
2261	case SNDRV_PCM_STATE_SUSPENDED:
2262		err = -ESTRPIPE;
2263		goto _end_unlock;
2264	default:
2265		err = -EBADFD;
2266		goto _end_unlock;
2267	}
2268
2269	runtime->twake = runtime->control->avail_min ? : 1;
2270	if (runtime->status->state == SNDRV_PCM_STATE_RUNNING)
2271		snd_pcm_update_hw_ptr(substream);
2272	avail = snd_pcm_capture_avail(runtime);
2273	while (size > 0) {
2274		snd_pcm_uframes_t frames, appl_ptr, appl_ofs;
2275		snd_pcm_uframes_t cont;
2276		if (!avail) {
2277			if (runtime->status->state ==
2278			    SNDRV_PCM_STATE_DRAINING) {
2279				snd_pcm_stop(substream, SNDRV_PCM_STATE_SETUP);
2280				goto _end_unlock;
2281			}
2282			if (nonblock) {
2283				err = -EAGAIN;
2284				goto _end_unlock;
2285			}
2286			runtime->twake = min_t(snd_pcm_uframes_t, size,
2287					runtime->control->avail_min ? : 1);
2288			err = wait_for_avail(substream, &avail);
2289			if (err < 0)
2290				goto _end_unlock;
2291			if (!avail)
2292				continue; /* draining */
2293		}
2294		frames = size > avail ? avail : size;
2295		cont = runtime->buffer_size - runtime->control->appl_ptr % runtime->buffer_size;
2296		if (frames > cont)
2297			frames = cont;
2298		if (snd_BUG_ON(!frames)) {
2299			runtime->twake = 0;
2300			snd_pcm_stream_unlock_irq(substream);
2301			return -EINVAL;
2302		}
2303		appl_ptr = runtime->control->appl_ptr;
2304		appl_ofs = appl_ptr % runtime->buffer_size;
2305		snd_pcm_stream_unlock_irq(substream);
2306		err = transfer(substream, appl_ofs, data, offset, frames);
2307		snd_pcm_stream_lock_irq(substream);
2308		if (err < 0)
2309			goto _end_unlock;
2310		switch (runtime->status->state) {
2311		case SNDRV_PCM_STATE_XRUN:
2312			err = -EPIPE;
2313			goto _end_unlock;
2314		case SNDRV_PCM_STATE_SUSPENDED:
2315			err = -ESTRPIPE;
2316			goto _end_unlock;
2317		default:
2318			break;
2319		}
2320		appl_ptr += frames;
2321		if (appl_ptr >= runtime->boundary)
2322			appl_ptr -= runtime->boundary;
2323		runtime->control->appl_ptr = appl_ptr;
2324		if (substream->ops->ack)
2325			substream->ops->ack(substream);
2326
2327		offset += frames;
2328		size -= frames;
2329		xfer += frames;
2330		avail -= frames;
2331	}
2332 _end_unlock:
2333	runtime->twake = 0;
2334	if (xfer > 0 && err >= 0)
2335		snd_pcm_update_state(substream, runtime);
2336	snd_pcm_stream_unlock_irq(substream);
2337	return xfer > 0 ? (snd_pcm_sframes_t)xfer : err;
2338}
2339
2340snd_pcm_sframes_t snd_pcm_lib_read(struct snd_pcm_substream *substream, void __user *buf, snd_pcm_uframes_t size)
2341{
2342	struct snd_pcm_runtime *runtime;
2343	int nonblock;
2344	int err;
2345
2346	err = pcm_sanity_check(substream);
2347	if (err < 0)
2348		return err;
2349	runtime = substream->runtime;
2350	nonblock = !!(substream->f_flags & O_NONBLOCK);
2351	if (runtime->access != SNDRV_PCM_ACCESS_RW_INTERLEAVED)
2352		return -EINVAL;
2353	return snd_pcm_lib_read1(substream, (unsigned long)buf, size, nonblock, snd_pcm_lib_read_transfer);
2354}
2355
2356EXPORT_SYMBOL(snd_pcm_lib_read);
2357
2358static int snd_pcm_lib_readv_transfer(struct snd_pcm_substream *substream,
2359				      unsigned int hwoff,
2360				      unsigned long data, unsigned int off,
2361				      snd_pcm_uframes_t frames)
2362{
2363	struct snd_pcm_runtime *runtime = substream->runtime;
2364	int err;
2365	void __user **bufs = (void __user **)data;
2366	int channels = runtime->channels;
2367	int c;
2368	if (substream->ops->copy) {
2369		for (c = 0; c < channels; ++c, ++bufs) {
2370			char __user *buf;
2371			if (*bufs == NULL)
2372				continue;
2373			buf = *bufs + samples_to_bytes(runtime, off);
2374			if ((err = substream->ops->copy(substream, c, hwoff, buf, frames)) < 0)
2375				return err;
2376		}
2377	} else {
2378		snd_pcm_uframes_t dma_csize = runtime->dma_bytes / channels;
2379		for (c = 0; c < channels; ++c, ++bufs) {
2380			char *hwbuf;
2381			char __user *buf;
2382			if (*bufs == NULL)
2383				continue;
2384
2385			hwbuf = runtime->dma_area + (c * dma_csize) + samples_to_bytes(runtime, hwoff);
2386			buf = *bufs + samples_to_bytes(runtime, off);
2387			if (copy_to_user(buf, hwbuf, samples_to_bytes(runtime, frames)))
2388				return -EFAULT;
2389		}
2390	}
2391	return 0;
2392}
2393
2394snd_pcm_sframes_t snd_pcm_lib_readv(struct snd_pcm_substream *substream,
2395				    void __user **bufs,
2396				    snd_pcm_uframes_t frames)
2397{
2398	struct snd_pcm_runtime *runtime;
2399	int nonblock;
2400	int err;
2401
2402	err = pcm_sanity_check(substream);
2403	if (err < 0)
2404		return err;
2405	runtime = substream->runtime;
2406	if (runtime->status->state == SNDRV_PCM_STATE_OPEN)
2407		return -EBADFD;
2408
2409	nonblock = !!(substream->f_flags & O_NONBLOCK);
2410	if (runtime->access != SNDRV_PCM_ACCESS_RW_NONINTERLEAVED)
2411		return -EINVAL;
2412	return snd_pcm_lib_read1(substream, (unsigned long)bufs, frames, nonblock, snd_pcm_lib_readv_transfer);
2413}
2414
2415EXPORT_SYMBOL(snd_pcm_lib_readv);
2416
2417/*
2418 * standard channel mapping helpers
2419 */
2420
2421/* default channel maps for multi-channel playbacks, up to 8 channels */
2422const struct snd_pcm_chmap_elem snd_pcm_std_chmaps[] = {
2423	{ .channels = 1,
2424	  .map = { SNDRV_CHMAP_MONO } },
2425	{ .channels = 2,
2426	  .map = { SNDRV_CHMAP_FL, SNDRV_CHMAP_FR } },
2427	{ .channels = 4,
2428	  .map = { SNDRV_CHMAP_FL, SNDRV_CHMAP_FR,
2429		   SNDRV_CHMAP_RL, SNDRV_CHMAP_RR } },
2430	{ .channels = 6,
2431	  .map = { SNDRV_CHMAP_FL, SNDRV_CHMAP_FR,
2432		   SNDRV_CHMAP_RL, SNDRV_CHMAP_RR,
2433		   SNDRV_CHMAP_FC, SNDRV_CHMAP_LFE } },
2434	{ .channels = 8,
2435	  .map = { SNDRV_CHMAP_FL, SNDRV_CHMAP_FR,
2436		   SNDRV_CHMAP_RL, SNDRV_CHMAP_RR,
2437		   SNDRV_CHMAP_FC, SNDRV_CHMAP_LFE,
2438		   SNDRV_CHMAP_SL, SNDRV_CHMAP_SR } },
2439	{ }
2440};
2441EXPORT_SYMBOL_GPL(snd_pcm_std_chmaps);
2442
2443/* alternative channel maps with CLFE <-> surround swapped for 6/8 channels */
2444const struct snd_pcm_chmap_elem snd_pcm_alt_chmaps[] = {
2445	{ .channels = 1,
2446	  .map = { SNDRV_CHMAP_MONO } },
2447	{ .channels = 2,
2448	  .map = { SNDRV_CHMAP_FL, SNDRV_CHMAP_FR } },
2449	{ .channels = 4,
2450	  .map = { SNDRV_CHMAP_FL, SNDRV_CHMAP_FR,
2451		   SNDRV_CHMAP_RL, SNDRV_CHMAP_RR } },
2452	{ .channels = 6,
2453	  .map = { SNDRV_CHMAP_FL, SNDRV_CHMAP_FR,
2454		   SNDRV_CHMAP_FC, SNDRV_CHMAP_LFE,
2455		   SNDRV_CHMAP_RL, SNDRV_CHMAP_RR } },
2456	{ .channels = 8,
2457	  .map = { SNDRV_CHMAP_FL, SNDRV_CHMAP_FR,
2458		   SNDRV_CHMAP_FC, SNDRV_CHMAP_LFE,
2459		   SNDRV_CHMAP_RL, SNDRV_CHMAP_RR,
2460		   SNDRV_CHMAP_SL, SNDRV_CHMAP_SR } },
2461	{ }
2462};
2463EXPORT_SYMBOL_GPL(snd_pcm_alt_chmaps);
2464
2465static bool valid_chmap_channels(const struct snd_pcm_chmap *info, int ch)
2466{
2467	if (ch > info->max_channels)
2468		return false;
2469	return !info->channel_mask || (info->channel_mask & (1U << ch));
2470}
2471
2472static int pcm_chmap_ctl_info(struct snd_kcontrol *kcontrol,
2473			      struct snd_ctl_elem_info *uinfo)
2474{
2475	struct snd_pcm_chmap *info = snd_kcontrol_chip(kcontrol);
2476
2477	uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
2478	uinfo->count = 0;
2479	uinfo->count = info->max_channels;
2480	uinfo->value.integer.min = 0;
2481	uinfo->value.integer.max = SNDRV_CHMAP_LAST;
2482	return 0;
2483}
2484
2485/* get callback for channel map ctl element
2486 * stores the channel position firstly matching with the current channels
2487 */
2488static int pcm_chmap_ctl_get(struct snd_kcontrol *kcontrol,
2489			     struct snd_ctl_elem_value *ucontrol)
2490{
2491	struct snd_pcm_chmap *info = snd_kcontrol_chip(kcontrol);
2492	unsigned int idx = snd_ctl_get_ioffidx(kcontrol, &ucontrol->id);
2493	struct snd_pcm_substream *substream;
2494	const struct snd_pcm_chmap_elem *map;
2495
2496	if (snd_BUG_ON(!info->chmap))
2497		return -EINVAL;
2498	substream = snd_pcm_chmap_substream(info, idx);
2499	if (!substream)
2500		return -ENODEV;
2501	memset(ucontrol->value.integer.value, 0,
2502	       sizeof(ucontrol->value.integer.value));
2503	if (!substream->runtime)
2504		return 0; /* no channels set */
2505	for (map = info->chmap; map->channels; map++) {
2506		int i;
2507		if (map->channels == substream->runtime->channels &&
2508		    valid_chmap_channels(info, map->channels)) {
2509			for (i = 0; i < map->channels; i++)
2510				ucontrol->value.integer.value[i] = map->map[i];
2511			return 0;
2512		}
2513	}
2514	return -EINVAL;
2515}
2516
2517/* tlv callback for channel map ctl element
2518 * expands the pre-defined channel maps in a form of TLV
2519 */
2520static int pcm_chmap_ctl_tlv(struct snd_kcontrol *kcontrol, int op_flag,
2521			     unsigned int size, unsigned int __user *tlv)
2522{
2523	struct snd_pcm_chmap *info = snd_kcontrol_chip(kcontrol);
2524	const struct snd_pcm_chmap_elem *map;
2525	unsigned int __user *dst;
2526	int c, count = 0;
2527
2528	if (snd_BUG_ON(!info->chmap))
2529		return -EINVAL;
2530	if (size < 8)
2531		return -ENOMEM;
2532	if (put_user(SNDRV_CTL_TLVT_CONTAINER, tlv))
2533		return -EFAULT;
2534	size -= 8;
2535	dst = tlv + 2;
2536	for (map = info->chmap; map->channels; map++) {
2537		int chs_bytes = map->channels * 4;
2538		if (!valid_chmap_channels(info, map->channels))
2539			continue;
2540		if (size < 8)
2541			return -ENOMEM;
2542		if (put_user(SNDRV_CTL_TLVT_CHMAP_FIXED, dst) ||
2543		    put_user(chs_bytes, dst + 1))
2544			return -EFAULT;
2545		dst += 2;
2546		size -= 8;
2547		count += 8;
2548		if (size < chs_bytes)
2549			return -ENOMEM;
2550		size -= chs_bytes;
2551		count += chs_bytes;
2552		for (c = 0; c < map->channels; c++) {
2553			if (put_user(map->map[c], dst))
2554				return -EFAULT;
2555			dst++;
2556		}
2557	}
2558	if (put_user(count, tlv + 1))
2559		return -EFAULT;
2560	return 0;
2561}
2562
2563static void pcm_chmap_ctl_private_free(struct snd_kcontrol *kcontrol)
2564{
2565	struct snd_pcm_chmap *info = snd_kcontrol_chip(kcontrol);
2566	info->pcm->streams[info->stream].chmap_kctl = NULL;
2567	kfree(info);
2568}
2569
2570/**
2571 * snd_pcm_add_chmap_ctls - create channel-mapping control elements
2572 * @pcm: the assigned PCM instance
2573 * @stream: stream direction
2574 * @chmap: channel map elements (for query)
2575 * @max_channels: the max number of channels for the stream
2576 * @private_value: the value passed to each kcontrol's private_value field
2577 * @info_ret: store struct snd_pcm_chmap instance if non-NULL
2578 *
2579 * Create channel-mapping control elements assigned to the given PCM stream(s).
2580 * Return: Zero if successful, or a negative error value.
2581 */
2582int snd_pcm_add_chmap_ctls(struct snd_pcm *pcm, int stream,
2583			   const struct snd_pcm_chmap_elem *chmap,
2584			   int max_channels,
2585			   unsigned long private_value,
2586			   struct snd_pcm_chmap **info_ret)
2587{
2588	struct snd_pcm_chmap *info;
2589	struct snd_kcontrol_new knew = {
2590		.iface = SNDRV_CTL_ELEM_IFACE_PCM,
2591		.access = SNDRV_CTL_ELEM_ACCESS_READ |
2592			SNDRV_CTL_ELEM_ACCESS_TLV_READ |
2593			SNDRV_CTL_ELEM_ACCESS_TLV_CALLBACK,
2594		.info = pcm_chmap_ctl_info,
2595		.get = pcm_chmap_ctl_get,
2596		.tlv.c = pcm_chmap_ctl_tlv,
2597	};
2598	int err;
2599
2600	info = kzalloc(sizeof(*info), GFP_KERNEL);
2601	if (!info)
2602		return -ENOMEM;
2603	info->pcm = pcm;
2604	info->stream = stream;
2605	info->chmap = chmap;
2606	info->max_channels = max_channels;
2607	if (stream == SNDRV_PCM_STREAM_PLAYBACK)
2608		knew.name = "Playback Channel Map";
2609	else
2610		knew.name = "Capture Channel Map";
2611	knew.device = pcm->device;
2612	knew.count = pcm->streams[stream].substream_count;
2613	knew.private_value = private_value;
2614	info->kctl = snd_ctl_new1(&knew, info);
2615	if (!info->kctl) {
2616		kfree(info);
2617		return -ENOMEM;
2618	}
2619	info->kctl->private_free = pcm_chmap_ctl_private_free;
2620	err = snd_ctl_add(pcm->card, info->kctl);
2621	if (err < 0)
2622		return err;
2623	pcm->streams[stream].chmap_kctl = info->kctl;
2624	if (info_ret)
2625		*info_ret = info;
2626	return 0;
2627}
2628EXPORT_SYMBOL_GPL(snd_pcm_add_chmap_ctls);
2629