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