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