linux/sound/core/control.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0-or-later
   2/*
   3 *  Routines for driver control interface
   4 *  Copyright (c) by Jaroslav Kysela <perex@perex.cz>
   5 */
   6
   7#include <linux/threads.h>
   8#include <linux/interrupt.h>
   9#include <linux/module.h>
  10#include <linux/slab.h>
  11#include <linux/vmalloc.h>
  12#include <linux/time.h>
  13#include <linux/mm.h>
  14#include <linux/math64.h>
  15#include <linux/sched/signal.h>
  16#include <sound/core.h>
  17#include <sound/minors.h>
  18#include <sound/info.h>
  19#include <sound/control.h>
  20
  21/* max number of user-defined controls */
  22#define MAX_USER_CONTROLS       32
  23#define MAX_CONTROL_COUNT       1028
  24
  25struct snd_kctl_ioctl {
  26        struct list_head list;          /* list of all ioctls */
  27        snd_kctl_ioctl_func_t fioctl;
  28};
  29
  30static DECLARE_RWSEM(snd_ioctl_rwsem);
  31static LIST_HEAD(snd_control_ioctls);
  32#ifdef CONFIG_COMPAT
  33static LIST_HEAD(snd_control_compat_ioctls);
  34#endif
  35
  36static int snd_ctl_open(struct inode *inode, struct file *file)
  37{
  38        unsigned long flags;
  39        struct snd_card *card;
  40        struct snd_ctl_file *ctl;
  41        int i, err;
  42
  43        err = stream_open(inode, file);
  44        if (err < 0)
  45                return err;
  46
  47        card = snd_lookup_minor_data(iminor(inode), SNDRV_DEVICE_TYPE_CONTROL);
  48        if (!card) {
  49                err = -ENODEV;
  50                goto __error1;
  51        }
  52        err = snd_card_file_add(card, file);
  53        if (err < 0) {
  54                err = -ENODEV;
  55                goto __error1;
  56        }
  57        if (!try_module_get(card->module)) {
  58                err = -EFAULT;
  59                goto __error2;
  60        }
  61        ctl = kzalloc(sizeof(*ctl), GFP_KERNEL);
  62        if (ctl == NULL) {
  63                err = -ENOMEM;
  64                goto __error;
  65        }
  66        INIT_LIST_HEAD(&ctl->events);
  67        init_waitqueue_head(&ctl->change_sleep);
  68        spin_lock_init(&ctl->read_lock);
  69        ctl->card = card;
  70        for (i = 0; i < SND_CTL_SUBDEV_ITEMS; i++)
  71                ctl->preferred_subdevice[i] = -1;
  72        ctl->pid = get_pid(task_pid(current));
  73        file->private_data = ctl;
  74        write_lock_irqsave(&card->ctl_files_rwlock, flags);
  75        list_add_tail(&ctl->list, &card->ctl_files);
  76        write_unlock_irqrestore(&card->ctl_files_rwlock, flags);
  77        snd_card_unref(card);
  78        return 0;
  79
  80      __error:
  81        module_put(card->module);
  82      __error2:
  83        snd_card_file_remove(card, file);
  84      __error1:
  85        if (card)
  86                snd_card_unref(card);
  87        return err;
  88}
  89
  90static void snd_ctl_empty_read_queue(struct snd_ctl_file * ctl)
  91{
  92        unsigned long flags;
  93        struct snd_kctl_event *cread;
  94
  95        spin_lock_irqsave(&ctl->read_lock, flags);
  96        while (!list_empty(&ctl->events)) {
  97                cread = snd_kctl_event(ctl->events.next);
  98                list_del(&cread->list);
  99                kfree(cread);
 100        }
 101        spin_unlock_irqrestore(&ctl->read_lock, flags);
 102}
 103
 104static int snd_ctl_release(struct inode *inode, struct file *file)
 105{
 106        unsigned long flags;
 107        struct snd_card *card;
 108        struct snd_ctl_file *ctl;
 109        struct snd_kcontrol *control;
 110        unsigned int idx;
 111
 112        ctl = file->private_data;
 113        file->private_data = NULL;
 114        card = ctl->card;
 115        write_lock_irqsave(&card->ctl_files_rwlock, flags);
 116        list_del(&ctl->list);
 117        write_unlock_irqrestore(&card->ctl_files_rwlock, flags);
 118        down_write(&card->controls_rwsem);
 119        list_for_each_entry(control, &card->controls, list)
 120                for (idx = 0; idx < control->count; idx++)
 121                        if (control->vd[idx].owner == ctl)
 122                                control->vd[idx].owner = NULL;
 123        up_write(&card->controls_rwsem);
 124        snd_ctl_empty_read_queue(ctl);
 125        put_pid(ctl->pid);
 126        kfree(ctl);
 127        module_put(card->module);
 128        snd_card_file_remove(card, file);
 129        return 0;
 130}
 131
 132/**
 133 * snd_ctl_notify - Send notification to user-space for a control change
 134 * @card: the card to send notification
 135 * @mask: the event mask, SNDRV_CTL_EVENT_*
 136 * @id: the ctl element id to send notification
 137 *
 138 * This function adds an event record with the given id and mask, appends
 139 * to the list and wakes up the user-space for notification.  This can be
 140 * called in the atomic context.
 141 */
 142void snd_ctl_notify(struct snd_card *card, unsigned int mask,
 143                    struct snd_ctl_elem_id *id)
 144{
 145        unsigned long flags;
 146        struct snd_ctl_file *ctl;
 147        struct snd_kctl_event *ev;
 148
 149        if (snd_BUG_ON(!card || !id))
 150                return;
 151        if (card->shutdown)
 152                return;
 153        read_lock(&card->ctl_files_rwlock);
 154#if IS_ENABLED(CONFIG_SND_MIXER_OSS)
 155        card->mixer_oss_change_count++;
 156#endif
 157        list_for_each_entry(ctl, &card->ctl_files, list) {
 158                if (!ctl->subscribed)
 159                        continue;
 160                spin_lock_irqsave(&ctl->read_lock, flags);
 161                list_for_each_entry(ev, &ctl->events, list) {
 162                        if (ev->id.numid == id->numid) {
 163                                ev->mask |= mask;
 164                                goto _found;
 165                        }
 166                }
 167                ev = kzalloc(sizeof(*ev), GFP_ATOMIC);
 168                if (ev) {
 169                        ev->id = *id;
 170                        ev->mask = mask;
 171                        list_add_tail(&ev->list, &ctl->events);
 172                } else {
 173                        dev_err(card->dev, "No memory available to allocate event\n");
 174                }
 175        _found:
 176                wake_up(&ctl->change_sleep);
 177                spin_unlock_irqrestore(&ctl->read_lock, flags);
 178                kill_fasync(&ctl->fasync, SIGIO, POLL_IN);
 179        }
 180        read_unlock(&card->ctl_files_rwlock);
 181}
 182EXPORT_SYMBOL(snd_ctl_notify);
 183
 184/**
 185 * snd_ctl_new - create a new control instance with some elements
 186 * @kctl: the pointer to store new control instance
 187 * @count: the number of elements in this control
 188 * @access: the default access flags for elements in this control
 189 * @file: given when locking these elements
 190 *
 191 * Allocates a memory object for a new control instance. The instance has
 192 * elements as many as the given number (@count). Each element has given
 193 * access permissions (@access). Each element is locked when @file is given.
 194 *
 195 * Return: 0 on success, error code on failure
 196 */
 197static int snd_ctl_new(struct snd_kcontrol **kctl, unsigned int count,
 198                       unsigned int access, struct snd_ctl_file *file)
 199{
 200        unsigned int idx;
 201
 202        if (count == 0 || count > MAX_CONTROL_COUNT)
 203                return -EINVAL;
 204
 205        *kctl = kzalloc(struct_size(*kctl, vd, count), GFP_KERNEL);
 206        if (!*kctl)
 207                return -ENOMEM;
 208
 209        for (idx = 0; idx < count; idx++) {
 210                (*kctl)->vd[idx].access = access;
 211                (*kctl)->vd[idx].owner = file;
 212        }
 213        (*kctl)->count = count;
 214
 215        return 0;
 216}
 217
 218/**
 219 * snd_ctl_new1 - create a control instance from the template
 220 * @ncontrol: the initialization record
 221 * @private_data: the private data to set
 222 *
 223 * Allocates a new struct snd_kcontrol instance and initialize from the given
 224 * template.  When the access field of ncontrol is 0, it's assumed as
 225 * READWRITE access. When the count field is 0, it's assumes as one.
 226 *
 227 * Return: The pointer of the newly generated instance, or %NULL on failure.
 228 */
 229struct snd_kcontrol *snd_ctl_new1(const struct snd_kcontrol_new *ncontrol,
 230                                  void *private_data)
 231{
 232        struct snd_kcontrol *kctl;
 233        unsigned int count;
 234        unsigned int access;
 235        int err;
 236
 237        if (snd_BUG_ON(!ncontrol || !ncontrol->info))
 238                return NULL;
 239
 240        count = ncontrol->count;
 241        if (count == 0)
 242                count = 1;
 243
 244        access = ncontrol->access;
 245        if (access == 0)
 246                access = SNDRV_CTL_ELEM_ACCESS_READWRITE;
 247        access &= (SNDRV_CTL_ELEM_ACCESS_READWRITE |
 248                   SNDRV_CTL_ELEM_ACCESS_VOLATILE |
 249                   SNDRV_CTL_ELEM_ACCESS_INACTIVE |
 250                   SNDRV_CTL_ELEM_ACCESS_TLV_READWRITE |
 251                   SNDRV_CTL_ELEM_ACCESS_TLV_COMMAND |
 252                   SNDRV_CTL_ELEM_ACCESS_TLV_CALLBACK |
 253                   SNDRV_CTL_ELEM_ACCESS_SKIP_CHECK);
 254
 255        err = snd_ctl_new(&kctl, count, access, NULL);
 256        if (err < 0)
 257                return NULL;
 258
 259        /* The 'numid' member is decided when calling snd_ctl_add(). */
 260        kctl->id.iface = ncontrol->iface;
 261        kctl->id.device = ncontrol->device;
 262        kctl->id.subdevice = ncontrol->subdevice;
 263        if (ncontrol->name) {
 264                strlcpy(kctl->id.name, ncontrol->name, sizeof(kctl->id.name));
 265                if (strcmp(ncontrol->name, kctl->id.name) != 0)
 266                        pr_warn("ALSA: Control name '%s' truncated to '%s'\n",
 267                                ncontrol->name, kctl->id.name);
 268        }
 269        kctl->id.index = ncontrol->index;
 270
 271        kctl->info = ncontrol->info;
 272        kctl->get = ncontrol->get;
 273        kctl->put = ncontrol->put;
 274        kctl->tlv.p = ncontrol->tlv.p;
 275
 276        kctl->private_value = ncontrol->private_value;
 277        kctl->private_data = private_data;
 278
 279        return kctl;
 280}
 281EXPORT_SYMBOL(snd_ctl_new1);
 282
 283/**
 284 * snd_ctl_free_one - release the control instance
 285 * @kcontrol: the control instance
 286 *
 287 * Releases the control instance created via snd_ctl_new()
 288 * or snd_ctl_new1().
 289 * Don't call this after the control was added to the card.
 290 */
 291void snd_ctl_free_one(struct snd_kcontrol *kcontrol)
 292{
 293        if (kcontrol) {
 294                if (kcontrol->private_free)
 295                        kcontrol->private_free(kcontrol);
 296                kfree(kcontrol);
 297        }
 298}
 299EXPORT_SYMBOL(snd_ctl_free_one);
 300
 301static bool snd_ctl_remove_numid_conflict(struct snd_card *card,
 302                                          unsigned int count)
 303{
 304        struct snd_kcontrol *kctl;
 305
 306        /* Make sure that the ids assigned to the control do not wrap around */
 307        if (card->last_numid >= UINT_MAX - count)
 308                card->last_numid = 0;
 309
 310        list_for_each_entry(kctl, &card->controls, list) {
 311                if (kctl->id.numid < card->last_numid + 1 + count &&
 312                    kctl->id.numid + kctl->count > card->last_numid + 1) {
 313                        card->last_numid = kctl->id.numid + kctl->count - 1;
 314                        return true;
 315                }
 316        }
 317        return false;
 318}
 319
 320static int snd_ctl_find_hole(struct snd_card *card, unsigned int count)
 321{
 322        unsigned int iter = 100000;
 323
 324        while (snd_ctl_remove_numid_conflict(card, count)) {
 325                if (--iter == 0) {
 326                        /* this situation is very unlikely */
 327                        dev_err(card->dev, "unable to allocate new control numid\n");
 328                        return -ENOMEM;
 329                }
 330        }
 331        return 0;
 332}
 333
 334enum snd_ctl_add_mode {
 335        CTL_ADD_EXCLUSIVE, CTL_REPLACE, CTL_ADD_ON_REPLACE,
 336};
 337
 338/* add/replace a new kcontrol object; call with card->controls_rwsem locked */
 339static int __snd_ctl_add_replace(struct snd_card *card,
 340                                 struct snd_kcontrol *kcontrol,
 341                                 enum snd_ctl_add_mode mode)
 342{
 343        struct snd_ctl_elem_id id;
 344        unsigned int idx;
 345        unsigned int count;
 346        struct snd_kcontrol *old;
 347        int err;
 348
 349        id = kcontrol->id;
 350        if (id.index > UINT_MAX - kcontrol->count)
 351                return -EINVAL;
 352
 353        old = snd_ctl_find_id(card, &id);
 354        if (!old) {
 355                if (mode == CTL_REPLACE)
 356                        return -EINVAL;
 357        } else {
 358                if (mode == CTL_ADD_EXCLUSIVE) {
 359                        dev_err(card->dev,
 360                                "control %i:%i:%i:%s:%i is already present\n",
 361                                id.iface, id.device, id.subdevice, id.name,
 362                                id.index);
 363                        return -EBUSY;
 364                }
 365
 366                err = snd_ctl_remove(card, old);
 367                if (err < 0)
 368                        return err;
 369        }
 370
 371        if (snd_ctl_find_hole(card, kcontrol->count) < 0)
 372                return -ENOMEM;
 373
 374        list_add_tail(&kcontrol->list, &card->controls);
 375        card->controls_count += kcontrol->count;
 376        kcontrol->id.numid = card->last_numid + 1;
 377        card->last_numid += kcontrol->count;
 378
 379        id = kcontrol->id;
 380        count = kcontrol->count;
 381        for (idx = 0; idx < count; idx++, id.index++, id.numid++)
 382                snd_ctl_notify(card, SNDRV_CTL_EVENT_MASK_ADD, &id);
 383
 384        return 0;
 385}
 386
 387static int snd_ctl_add_replace(struct snd_card *card,
 388                               struct snd_kcontrol *kcontrol,
 389                               enum snd_ctl_add_mode mode)
 390{
 391        int err = -EINVAL;
 392
 393        if (! kcontrol)
 394                return err;
 395        if (snd_BUG_ON(!card || !kcontrol->info))
 396                goto error;
 397
 398        down_write(&card->controls_rwsem);
 399        err = __snd_ctl_add_replace(card, kcontrol, mode);
 400        up_write(&card->controls_rwsem);
 401        if (err < 0)
 402                goto error;
 403        return 0;
 404
 405 error:
 406        snd_ctl_free_one(kcontrol);
 407        return err;
 408}
 409
 410/**
 411 * snd_ctl_add - add the control instance to the card
 412 * @card: the card instance
 413 * @kcontrol: the control instance to add
 414 *
 415 * Adds the control instance created via snd_ctl_new() or
 416 * snd_ctl_new1() to the given card. Assigns also an unique
 417 * numid used for fast search.
 418 *
 419 * It frees automatically the control which cannot be added.
 420 *
 421 * Return: Zero if successful, or a negative error code on failure.
 422 *
 423 */
 424int snd_ctl_add(struct snd_card *card, struct snd_kcontrol *kcontrol)
 425{
 426        return snd_ctl_add_replace(card, kcontrol, CTL_ADD_EXCLUSIVE);
 427}
 428EXPORT_SYMBOL(snd_ctl_add);
 429
 430/**
 431 * snd_ctl_replace - replace the control instance of the card
 432 * @card: the card instance
 433 * @kcontrol: the control instance to replace
 434 * @add_on_replace: add the control if not already added
 435 *
 436 * Replaces the given control.  If the given control does not exist
 437 * and the add_on_replace flag is set, the control is added.  If the
 438 * control exists, it is destroyed first.
 439 *
 440 * It frees automatically the control which cannot be added or replaced.
 441 *
 442 * Return: Zero if successful, or a negative error code on failure.
 443 */
 444int snd_ctl_replace(struct snd_card *card, struct snd_kcontrol *kcontrol,
 445                    bool add_on_replace)
 446{
 447        return snd_ctl_add_replace(card, kcontrol,
 448                                   add_on_replace ? CTL_ADD_ON_REPLACE : CTL_REPLACE);
 449}
 450EXPORT_SYMBOL(snd_ctl_replace);
 451
 452/**
 453 * snd_ctl_remove - remove the control from the card and release it
 454 * @card: the card instance
 455 * @kcontrol: the control instance to remove
 456 *
 457 * Removes the control from the card and then releases the instance.
 458 * You don't need to call snd_ctl_free_one(). You must be in
 459 * the write lock - down_write(&card->controls_rwsem).
 460 *
 461 * Return: 0 if successful, or a negative error code on failure.
 462 */
 463int snd_ctl_remove(struct snd_card *card, struct snd_kcontrol *kcontrol)
 464{
 465        struct snd_ctl_elem_id id;
 466        unsigned int idx;
 467
 468        if (snd_BUG_ON(!card || !kcontrol))
 469                return -EINVAL;
 470        list_del(&kcontrol->list);
 471        card->controls_count -= kcontrol->count;
 472        id = kcontrol->id;
 473        for (idx = 0; idx < kcontrol->count; idx++, id.index++, id.numid++)
 474                snd_ctl_notify(card, SNDRV_CTL_EVENT_MASK_REMOVE, &id);
 475        snd_ctl_free_one(kcontrol);
 476        return 0;
 477}
 478EXPORT_SYMBOL(snd_ctl_remove);
 479
 480/**
 481 * snd_ctl_remove_id - remove the control of the given id and release it
 482 * @card: the card instance
 483 * @id: the control id to remove
 484 *
 485 * Finds the control instance with the given id, removes it from the
 486 * card list and releases it.
 487 *
 488 * Return: 0 if successful, or a negative error code on failure.
 489 */
 490int snd_ctl_remove_id(struct snd_card *card, struct snd_ctl_elem_id *id)
 491{
 492        struct snd_kcontrol *kctl;
 493        int ret;
 494
 495        down_write(&card->controls_rwsem);
 496        kctl = snd_ctl_find_id(card, id);
 497        if (kctl == NULL) {
 498                up_write(&card->controls_rwsem);
 499                return -ENOENT;
 500        }
 501        ret = snd_ctl_remove(card, kctl);
 502        up_write(&card->controls_rwsem);
 503        return ret;
 504}
 505EXPORT_SYMBOL(snd_ctl_remove_id);
 506
 507/**
 508 * snd_ctl_remove_user_ctl - remove and release the unlocked user control
 509 * @file: active control handle
 510 * @id: the control id to remove
 511 *
 512 * Finds the control instance with the given id, removes it from the
 513 * card list and releases it.
 514 *
 515 * Return: 0 if successful, or a negative error code on failure.
 516 */
 517static int snd_ctl_remove_user_ctl(struct snd_ctl_file * file,
 518                                   struct snd_ctl_elem_id *id)
 519{
 520        struct snd_card *card = file->card;
 521        struct snd_kcontrol *kctl;
 522        int idx, ret;
 523
 524        down_write(&card->controls_rwsem);
 525        kctl = snd_ctl_find_id(card, id);
 526        if (kctl == NULL) {
 527                ret = -ENOENT;
 528                goto error;
 529        }
 530        if (!(kctl->vd[0].access & SNDRV_CTL_ELEM_ACCESS_USER)) {
 531                ret = -EINVAL;
 532                goto error;
 533        }
 534        for (idx = 0; idx < kctl->count; idx++)
 535                if (kctl->vd[idx].owner != NULL && kctl->vd[idx].owner != file) {
 536                        ret = -EBUSY;
 537                        goto error;
 538                }
 539        ret = snd_ctl_remove(card, kctl);
 540        if (ret < 0)
 541                goto error;
 542        card->user_ctl_count--;
 543error:
 544        up_write(&card->controls_rwsem);
 545        return ret;
 546}
 547
 548/**
 549 * snd_ctl_activate_id - activate/inactivate the control of the given id
 550 * @card: the card instance
 551 * @id: the control id to activate/inactivate
 552 * @active: non-zero to activate
 553 *
 554 * Finds the control instance with the given id, and activate or
 555 * inactivate the control together with notification, if changed.
 556 * The given ID data is filled with full information.
 557 *
 558 * Return: 0 if unchanged, 1 if changed, or a negative error code on failure.
 559 */
 560int snd_ctl_activate_id(struct snd_card *card, struct snd_ctl_elem_id *id,
 561                        int active)
 562{
 563        struct snd_kcontrol *kctl;
 564        struct snd_kcontrol_volatile *vd;
 565        unsigned int index_offset;
 566        int ret;
 567
 568        down_write(&card->controls_rwsem);
 569        kctl = snd_ctl_find_id(card, id);
 570        if (kctl == NULL) {
 571                ret = -ENOENT;
 572                goto unlock;
 573        }
 574        index_offset = snd_ctl_get_ioff(kctl, id);
 575        vd = &kctl->vd[index_offset];
 576        ret = 0;
 577        if (active) {
 578                if (!(vd->access & SNDRV_CTL_ELEM_ACCESS_INACTIVE))
 579                        goto unlock;
 580                vd->access &= ~SNDRV_CTL_ELEM_ACCESS_INACTIVE;
 581        } else {
 582                if (vd->access & SNDRV_CTL_ELEM_ACCESS_INACTIVE)
 583                        goto unlock;
 584                vd->access |= SNDRV_CTL_ELEM_ACCESS_INACTIVE;
 585        }
 586        snd_ctl_build_ioff(id, kctl, index_offset);
 587        ret = 1;
 588 unlock:
 589        up_write(&card->controls_rwsem);
 590        if (ret > 0)
 591                snd_ctl_notify(card, SNDRV_CTL_EVENT_MASK_INFO, id);
 592        return ret;
 593}
 594EXPORT_SYMBOL_GPL(snd_ctl_activate_id);
 595
 596/**
 597 * snd_ctl_rename_id - replace the id of a control on the card
 598 * @card: the card instance
 599 * @src_id: the old id
 600 * @dst_id: the new id
 601 *
 602 * Finds the control with the old id from the card, and replaces the
 603 * id with the new one.
 604 *
 605 * Return: Zero if successful, or a negative error code on failure.
 606 */
 607int snd_ctl_rename_id(struct snd_card *card, struct snd_ctl_elem_id *src_id,
 608                      struct snd_ctl_elem_id *dst_id)
 609{
 610        struct snd_kcontrol *kctl;
 611
 612        down_write(&card->controls_rwsem);
 613        kctl = snd_ctl_find_id(card, src_id);
 614        if (kctl == NULL) {
 615                up_write(&card->controls_rwsem);
 616                return -ENOENT;
 617        }
 618        kctl->id = *dst_id;
 619        kctl->id.numid = card->last_numid + 1;
 620        card->last_numid += kctl->count;
 621        up_write(&card->controls_rwsem);
 622        return 0;
 623}
 624EXPORT_SYMBOL(snd_ctl_rename_id);
 625
 626/**
 627 * snd_ctl_find_numid - find the control instance with the given number-id
 628 * @card: the card instance
 629 * @numid: the number-id to search
 630 *
 631 * Finds the control instance with the given number-id from the card.
 632 *
 633 * The caller must down card->controls_rwsem before calling this function
 634 * (if the race condition can happen).
 635 *
 636 * Return: The pointer of the instance if found, or %NULL if not.
 637 *
 638 */
 639struct snd_kcontrol *snd_ctl_find_numid(struct snd_card *card, unsigned int numid)
 640{
 641        struct snd_kcontrol *kctl;
 642
 643        if (snd_BUG_ON(!card || !numid))
 644                return NULL;
 645        list_for_each_entry(kctl, &card->controls, list) {
 646                if (kctl->id.numid <= numid && kctl->id.numid + kctl->count > numid)
 647                        return kctl;
 648        }
 649        return NULL;
 650}
 651EXPORT_SYMBOL(snd_ctl_find_numid);
 652
 653/**
 654 * snd_ctl_find_id - find the control instance with the given id
 655 * @card: the card instance
 656 * @id: the id to search
 657 *
 658 * Finds the control instance with the given id from the card.
 659 *
 660 * The caller must down card->controls_rwsem before calling this function
 661 * (if the race condition can happen).
 662 *
 663 * Return: The pointer of the instance if found, or %NULL if not.
 664 *
 665 */
 666struct snd_kcontrol *snd_ctl_find_id(struct snd_card *card,
 667                                     struct snd_ctl_elem_id *id)
 668{
 669        struct snd_kcontrol *kctl;
 670
 671        if (snd_BUG_ON(!card || !id))
 672                return NULL;
 673        if (id->numid != 0)
 674                return snd_ctl_find_numid(card, id->numid);
 675        list_for_each_entry(kctl, &card->controls, list) {
 676                if (kctl->id.iface != id->iface)
 677                        continue;
 678                if (kctl->id.device != id->device)
 679                        continue;
 680                if (kctl->id.subdevice != id->subdevice)
 681                        continue;
 682                if (strncmp(kctl->id.name, id->name, sizeof(kctl->id.name)))
 683                        continue;
 684                if (kctl->id.index > id->index)
 685                        continue;
 686                if (kctl->id.index + kctl->count <= id->index)
 687                        continue;
 688                return kctl;
 689        }
 690        return NULL;
 691}
 692EXPORT_SYMBOL(snd_ctl_find_id);
 693
 694static int snd_ctl_card_info(struct snd_card *card, struct snd_ctl_file * ctl,
 695                             unsigned int cmd, void __user *arg)
 696{
 697        struct snd_ctl_card_info *info;
 698
 699        info = kzalloc(sizeof(*info), GFP_KERNEL);
 700        if (! info)
 701                return -ENOMEM;
 702        down_read(&snd_ioctl_rwsem);
 703        info->card = card->number;
 704        strlcpy(info->id, card->id, sizeof(info->id));
 705        strlcpy(info->driver, card->driver, sizeof(info->driver));
 706        strlcpy(info->name, card->shortname, sizeof(info->name));
 707        strlcpy(info->longname, card->longname, sizeof(info->longname));
 708        strlcpy(info->mixername, card->mixername, sizeof(info->mixername));
 709        strlcpy(info->components, card->components, sizeof(info->components));
 710        up_read(&snd_ioctl_rwsem);
 711        if (copy_to_user(arg, info, sizeof(struct snd_ctl_card_info))) {
 712                kfree(info);
 713                return -EFAULT;
 714        }
 715        kfree(info);
 716        return 0;
 717}
 718
 719static int snd_ctl_elem_list(struct snd_card *card,
 720                             struct snd_ctl_elem_list __user *_list)
 721{
 722        struct snd_ctl_elem_list list;
 723        struct snd_kcontrol *kctl;
 724        struct snd_ctl_elem_id id;
 725        unsigned int offset, space, jidx;
 726        int err = 0;
 727
 728        if (copy_from_user(&list, _list, sizeof(list)))
 729                return -EFAULT;
 730        offset = list.offset;
 731        space = list.space;
 732
 733        down_read(&card->controls_rwsem);
 734        list.count = card->controls_count;
 735        list.used = 0;
 736        if (space > 0) {
 737                list_for_each_entry(kctl, &card->controls, list) {
 738                        if (offset >= kctl->count) {
 739                                offset -= kctl->count;
 740                                continue;
 741                        }
 742                        for (jidx = offset; jidx < kctl->count; jidx++) {
 743                                snd_ctl_build_ioff(&id, kctl, jidx);
 744                                if (copy_to_user(list.pids + list.used, &id,
 745                                                 sizeof(id))) {
 746                                        err = -EFAULT;
 747                                        goto out;
 748                                }
 749                                list.used++;
 750                                if (!--space)
 751                                        goto out;
 752                        }
 753                        offset = 0;
 754                }
 755        }
 756 out:
 757        up_read(&card->controls_rwsem);
 758        if (!err && copy_to_user(_list, &list, sizeof(list)))
 759                err = -EFAULT;
 760        return err;
 761}
 762
 763/* Check whether the given kctl info is valid */
 764static int snd_ctl_check_elem_info(struct snd_card *card,
 765                                   const struct snd_ctl_elem_info *info)
 766{
 767        static const unsigned int max_value_counts[] = {
 768                [SNDRV_CTL_ELEM_TYPE_BOOLEAN]   = 128,
 769                [SNDRV_CTL_ELEM_TYPE_INTEGER]   = 128,
 770                [SNDRV_CTL_ELEM_TYPE_ENUMERATED] = 128,
 771                [SNDRV_CTL_ELEM_TYPE_BYTES]     = 512,
 772                [SNDRV_CTL_ELEM_TYPE_IEC958]    = 1,
 773                [SNDRV_CTL_ELEM_TYPE_INTEGER64] = 64,
 774        };
 775
 776        if (info->type < SNDRV_CTL_ELEM_TYPE_BOOLEAN ||
 777            info->type > SNDRV_CTL_ELEM_TYPE_INTEGER64) {
 778                if (card)
 779                        dev_err(card->dev,
 780                                "control %i:%i:%i:%s:%i: invalid type %d\n",
 781                                info->id.iface, info->id.device,
 782                                info->id.subdevice, info->id.name,
 783                                info->id.index, info->type);
 784                return -EINVAL;
 785        }
 786        if (info->type == SNDRV_CTL_ELEM_TYPE_ENUMERATED &&
 787            info->value.enumerated.items == 0) {
 788                if (card)
 789                        dev_err(card->dev,
 790                                "control %i:%i:%i:%s:%i: zero enum items\n",
 791                                info->id.iface, info->id.device,
 792                                info->id.subdevice, info->id.name,
 793                                info->id.index);
 794                return -EINVAL;
 795        }
 796        if (info->count > max_value_counts[info->type]) {
 797                if (card)
 798                        dev_err(card->dev,
 799                                "control %i:%i:%i:%s:%i: invalid count %d\n",
 800                                info->id.iface, info->id.device,
 801                                info->id.subdevice, info->id.name,
 802                                info->id.index, info->count);
 803                return -EINVAL;
 804        }
 805
 806        return 0;
 807}
 808
 809/* The capacity of struct snd_ctl_elem_value.value.*/
 810static const unsigned int value_sizes[] = {
 811        [SNDRV_CTL_ELEM_TYPE_BOOLEAN]   = sizeof(long),
 812        [SNDRV_CTL_ELEM_TYPE_INTEGER]   = sizeof(long),
 813        [SNDRV_CTL_ELEM_TYPE_ENUMERATED] = sizeof(unsigned int),
 814        [SNDRV_CTL_ELEM_TYPE_BYTES]     = sizeof(unsigned char),
 815        [SNDRV_CTL_ELEM_TYPE_IEC958]    = sizeof(struct snd_aes_iec958),
 816        [SNDRV_CTL_ELEM_TYPE_INTEGER64] = sizeof(long long),
 817};
 818
 819#ifdef CONFIG_SND_CTL_VALIDATION
 820/* fill the remaining snd_ctl_elem_value data with the given pattern */
 821static void fill_remaining_elem_value(struct snd_ctl_elem_value *control,
 822                                      struct snd_ctl_elem_info *info,
 823                                      u32 pattern)
 824{
 825        size_t offset = value_sizes[info->type] * info->count;
 826
 827        offset = (offset + sizeof(u32) - 1) / sizeof(u32);
 828        memset32((u32 *)control->value.bytes.data + offset, pattern,
 829                 sizeof(control->value) / sizeof(u32) - offset);
 830}
 831
 832/* check whether the given integer ctl value is valid */
 833static int sanity_check_int_value(struct snd_card *card,
 834                                  const struct snd_ctl_elem_value *control,
 835                                  const struct snd_ctl_elem_info *info,
 836                                  int i)
 837{
 838        long long lval, lmin, lmax, lstep;
 839        u64 rem;
 840
 841        switch (info->type) {
 842        default:
 843        case SNDRV_CTL_ELEM_TYPE_BOOLEAN:
 844                lval = control->value.integer.value[i];
 845                lmin = 0;
 846                lmax = 1;
 847                lstep = 0;
 848                break;
 849        case SNDRV_CTL_ELEM_TYPE_INTEGER:
 850                lval = control->value.integer.value[i];
 851                lmin = info->value.integer.min;
 852                lmax = info->value.integer.max;
 853                lstep = info->value.integer.step;
 854                break;
 855        case SNDRV_CTL_ELEM_TYPE_INTEGER64:
 856                lval = control->value.integer64.value[i];
 857                lmin = info->value.integer64.min;
 858                lmax = info->value.integer64.max;
 859                lstep = info->value.integer64.step;
 860                break;
 861        case SNDRV_CTL_ELEM_TYPE_ENUMERATED:
 862                lval = control->value.enumerated.item[i];
 863                lmin = 0;
 864                lmax = info->value.enumerated.items - 1;
 865                lstep = 0;
 866                break;
 867        }
 868
 869        if (lval < lmin || lval > lmax) {
 870                dev_err(card->dev,
 871                        "control %i:%i:%i:%s:%i: value out of range %lld (%lld/%lld) at count %i\n",
 872                        control->id.iface, control->id.device,
 873                        control->id.subdevice, control->id.name,
 874                        control->id.index, lval, lmin, lmax, i);
 875                return -EINVAL;
 876        }
 877        if (lstep) {
 878                div64_u64_rem(lval, lstep, &rem);
 879                if (rem) {
 880                        dev_err(card->dev,
 881                                "control %i:%i:%i:%s:%i: unaligned value %lld (step %lld) at count %i\n",
 882                                control->id.iface, control->id.device,
 883                                control->id.subdevice, control->id.name,
 884                                control->id.index, lval, lstep, i);
 885                        return -EINVAL;
 886                }
 887        }
 888
 889        return 0;
 890}
 891
 892/* perform sanity checks to the given snd_ctl_elem_value object */
 893static int sanity_check_elem_value(struct snd_card *card,
 894                                   const struct snd_ctl_elem_value *control,
 895                                   const struct snd_ctl_elem_info *info,
 896                                   u32 pattern)
 897{
 898        size_t offset;
 899        int i, ret = 0;
 900        u32 *p;
 901
 902        switch (info->type) {
 903        case SNDRV_CTL_ELEM_TYPE_BOOLEAN:
 904        case SNDRV_CTL_ELEM_TYPE_INTEGER:
 905        case SNDRV_CTL_ELEM_TYPE_INTEGER64:
 906        case SNDRV_CTL_ELEM_TYPE_ENUMERATED:
 907                for (i = 0; i < info->count; i++) {
 908                        ret = sanity_check_int_value(card, control, info, i);
 909                        if (ret < 0)
 910                                return ret;
 911                }
 912                break;
 913        default:
 914                break;
 915        }
 916
 917        /* check whether the remaining area kept untouched */
 918        offset = value_sizes[info->type] * info->count;
 919        offset = (offset + sizeof(u32) - 1) / sizeof(u32);
 920        p = (u32 *)control->value.bytes.data + offset;
 921        for (; offset < sizeof(control->value) / sizeof(u32); offset++, p++) {
 922                if (*p != pattern) {
 923                        ret = -EINVAL;
 924                        break;
 925                }
 926                *p = 0; /* clear the checked area */
 927        }
 928
 929        return ret;
 930}
 931#else
 932static inline void fill_remaining_elem_value(struct snd_ctl_elem_value *control,
 933                                             struct snd_ctl_elem_info *info,
 934                                             u32 pattern)
 935{
 936}
 937
 938static inline int sanity_check_elem_value(struct snd_card *card,
 939                                          struct snd_ctl_elem_value *control,
 940                                          struct snd_ctl_elem_info *info,
 941                                          u32 pattern)
 942{
 943        return 0;
 944}
 945#endif
 946
 947static int __snd_ctl_elem_info(struct snd_card *card,
 948                               struct snd_kcontrol *kctl,
 949                               struct snd_ctl_elem_info *info,
 950                               struct snd_ctl_file *ctl)
 951{
 952        struct snd_kcontrol_volatile *vd;
 953        unsigned int index_offset;
 954        int result;
 955
 956#ifdef CONFIG_SND_DEBUG
 957        info->access = 0;
 958#endif
 959        result = kctl->info(kctl, info);
 960        if (result >= 0) {
 961                snd_BUG_ON(info->access);
 962                index_offset = snd_ctl_get_ioff(kctl, &info->id);
 963                vd = &kctl->vd[index_offset];
 964                snd_ctl_build_ioff(&info->id, kctl, index_offset);
 965                info->access = vd->access;
 966                if (vd->owner) {
 967                        info->access |= SNDRV_CTL_ELEM_ACCESS_LOCK;
 968                        if (vd->owner == ctl)
 969                                info->access |= SNDRV_CTL_ELEM_ACCESS_OWNER;
 970                        info->owner = pid_vnr(vd->owner->pid);
 971                } else {
 972                        info->owner = -1;
 973                }
 974                if (!snd_ctl_skip_validation(info) &&
 975                    snd_ctl_check_elem_info(card, info) < 0)
 976                        result = -EINVAL;
 977        }
 978        return result;
 979}
 980
 981static int snd_ctl_elem_info(struct snd_ctl_file *ctl,
 982                             struct snd_ctl_elem_info *info)
 983{
 984        struct snd_card *card = ctl->card;
 985        struct snd_kcontrol *kctl;
 986        int result;
 987
 988        down_read(&card->controls_rwsem);
 989        kctl = snd_ctl_find_id(card, &info->id);
 990        if (kctl == NULL)
 991                result = -ENOENT;
 992        else
 993                result = __snd_ctl_elem_info(card, kctl, info, ctl);
 994        up_read(&card->controls_rwsem);
 995        return result;
 996}
 997
 998static int snd_ctl_elem_info_user(struct snd_ctl_file *ctl,
 999                                  struct snd_ctl_elem_info __user *_info)
1000{
1001        struct snd_ctl_elem_info info;
1002        int result;
1003
1004        if (copy_from_user(&info, _info, sizeof(info)))
1005                return -EFAULT;
1006        result = snd_power_wait(ctl->card, SNDRV_CTL_POWER_D0);
1007        if (result < 0)
1008                return result;
1009        result = snd_ctl_elem_info(ctl, &info);
1010        if (result < 0)
1011                return result;
1012        /* drop internal access flags */
1013        info.access &= ~SNDRV_CTL_ELEM_ACCESS_SKIP_CHECK;
1014        if (copy_to_user(_info, &info, sizeof(info)))
1015                return -EFAULT;
1016        return result;
1017}
1018
1019static int snd_ctl_elem_read(struct snd_card *card,
1020                             struct snd_ctl_elem_value *control)
1021{
1022        struct snd_kcontrol *kctl;
1023        struct snd_kcontrol_volatile *vd;
1024        unsigned int index_offset;
1025        struct snd_ctl_elem_info info;
1026        const u32 pattern = 0xdeadbeef;
1027        int ret;
1028
1029        kctl = snd_ctl_find_id(card, &control->id);
1030        if (kctl == NULL)
1031                return -ENOENT;
1032
1033        index_offset = snd_ctl_get_ioff(kctl, &control->id);
1034        vd = &kctl->vd[index_offset];
1035        if (!(vd->access & SNDRV_CTL_ELEM_ACCESS_READ) || kctl->get == NULL)
1036                return -EPERM;
1037
1038        snd_ctl_build_ioff(&control->id, kctl, index_offset);
1039
1040#ifdef CONFIG_SND_CTL_VALIDATION
1041        /* info is needed only for validation */
1042        memset(&info, 0, sizeof(info));
1043        info.id = control->id;
1044        ret = __snd_ctl_elem_info(card, kctl, &info, NULL);
1045        if (ret < 0)
1046                return ret;
1047#endif
1048
1049        if (!snd_ctl_skip_validation(&info))
1050                fill_remaining_elem_value(control, &info, pattern);
1051        ret = kctl->get(kctl, control);
1052        if (ret < 0)
1053                return ret;
1054        if (!snd_ctl_skip_validation(&info) &&
1055            sanity_check_elem_value(card, control, &info, pattern) < 0) {
1056                dev_err(card->dev,
1057                        "control %i:%i:%i:%s:%i: access overflow\n",
1058                        control->id.iface, control->id.device,
1059                        control->id.subdevice, control->id.name,
1060                        control->id.index);
1061                return -EINVAL;
1062        }
1063        return ret;
1064}
1065
1066static int snd_ctl_elem_read_user(struct snd_card *card,
1067                                  struct snd_ctl_elem_value __user *_control)
1068{
1069        struct snd_ctl_elem_value *control;
1070        int result;
1071
1072        control = memdup_user(_control, sizeof(*control));
1073        if (IS_ERR(control))
1074                return PTR_ERR(control);
1075
1076        result = snd_power_wait(card, SNDRV_CTL_POWER_D0);
1077        if (result < 0)
1078                goto error;
1079
1080        down_read(&card->controls_rwsem);
1081        result = snd_ctl_elem_read(card, control);
1082        up_read(&card->controls_rwsem);
1083        if (result < 0)
1084                goto error;
1085
1086        if (copy_to_user(_control, control, sizeof(*control)))
1087                result = -EFAULT;
1088 error:
1089        kfree(control);
1090        return result;
1091}
1092
1093static int snd_ctl_elem_write(struct snd_card *card, struct snd_ctl_file *file,
1094                              struct snd_ctl_elem_value *control)
1095{
1096        struct snd_kcontrol *kctl;
1097        struct snd_kcontrol_volatile *vd;
1098        unsigned int index_offset;
1099        int result;
1100
1101        kctl = snd_ctl_find_id(card, &control->id);
1102        if (kctl == NULL)
1103                return -ENOENT;
1104
1105        index_offset = snd_ctl_get_ioff(kctl, &control->id);
1106        vd = &kctl->vd[index_offset];
1107        if (!(vd->access & SNDRV_CTL_ELEM_ACCESS_WRITE) || kctl->put == NULL ||
1108            (file && vd->owner && vd->owner != file)) {
1109                return -EPERM;
1110        }
1111
1112        snd_ctl_build_ioff(&control->id, kctl, index_offset);
1113        result = kctl->put(kctl, control);
1114        if (result < 0)
1115                return result;
1116
1117        if (result > 0) {
1118                struct snd_ctl_elem_id id = control->id;
1119                snd_ctl_notify(card, SNDRV_CTL_EVENT_MASK_VALUE, &id);
1120        }
1121
1122        return 0;
1123}
1124
1125static int snd_ctl_elem_write_user(struct snd_ctl_file *file,
1126                                   struct snd_ctl_elem_value __user *_control)
1127{
1128        struct snd_ctl_elem_value *control;
1129        struct snd_card *card;
1130        int result;
1131
1132        control = memdup_user(_control, sizeof(*control));
1133        if (IS_ERR(control))
1134                return PTR_ERR(control);
1135
1136        card = file->card;
1137        result = snd_power_wait(card, SNDRV_CTL_POWER_D0);
1138        if (result < 0)
1139                goto error;
1140
1141        down_write(&card->controls_rwsem);
1142        result = snd_ctl_elem_write(card, file, control);
1143        up_write(&card->controls_rwsem);
1144        if (result < 0)
1145                goto error;
1146
1147        if (copy_to_user(_control, control, sizeof(*control)))
1148                result = -EFAULT;
1149 error:
1150        kfree(control);
1151        return result;
1152}
1153
1154static int snd_ctl_elem_lock(struct snd_ctl_file *file,
1155                             struct snd_ctl_elem_id __user *_id)
1156{
1157        struct snd_card *card = file->card;
1158        struct snd_ctl_elem_id id;
1159        struct snd_kcontrol *kctl;
1160        struct snd_kcontrol_volatile *vd;
1161        int result;
1162
1163        if (copy_from_user(&id, _id, sizeof(id)))
1164                return -EFAULT;
1165        down_write(&card->controls_rwsem);
1166        kctl = snd_ctl_find_id(card, &id);
1167        if (kctl == NULL) {
1168                result = -ENOENT;
1169        } else {
1170                vd = &kctl->vd[snd_ctl_get_ioff(kctl, &id)];
1171                if (vd->owner != NULL)
1172                        result = -EBUSY;
1173                else {
1174                        vd->owner = file;
1175                        result = 0;
1176                }
1177        }
1178        up_write(&card->controls_rwsem);
1179        return result;
1180}
1181
1182static int snd_ctl_elem_unlock(struct snd_ctl_file *file,
1183                               struct snd_ctl_elem_id __user *_id)
1184{
1185        struct snd_card *card = file->card;
1186        struct snd_ctl_elem_id id;
1187        struct snd_kcontrol *kctl;
1188        struct snd_kcontrol_volatile *vd;
1189        int result;
1190
1191        if (copy_from_user(&id, _id, sizeof(id)))
1192                return -EFAULT;
1193        down_write(&card->controls_rwsem);
1194        kctl = snd_ctl_find_id(card, &id);
1195        if (kctl == NULL) {
1196                result = -ENOENT;
1197        } else {
1198                vd = &kctl->vd[snd_ctl_get_ioff(kctl, &id)];
1199                if (vd->owner == NULL)
1200                        result = -EINVAL;
1201                else if (vd->owner != file)
1202                        result = -EPERM;
1203                else {
1204                        vd->owner = NULL;
1205                        result = 0;
1206                }
1207        }
1208        up_write(&card->controls_rwsem);
1209        return result;
1210}
1211
1212struct user_element {
1213        struct snd_ctl_elem_info info;
1214        struct snd_card *card;
1215        char *elem_data;                /* element data */
1216        unsigned long elem_data_size;   /* size of element data in bytes */
1217        void *tlv_data;                 /* TLV data */
1218        unsigned long tlv_data_size;    /* TLV data size */
1219        void *priv_data;                /* private data (like strings for enumerated type) */
1220};
1221
1222static int snd_ctl_elem_user_info(struct snd_kcontrol *kcontrol,
1223                                  struct snd_ctl_elem_info *uinfo)
1224{
1225        struct user_element *ue = kcontrol->private_data;
1226        unsigned int offset;
1227
1228        offset = snd_ctl_get_ioff(kcontrol, &uinfo->id);
1229        *uinfo = ue->info;
1230        snd_ctl_build_ioff(&uinfo->id, kcontrol, offset);
1231
1232        return 0;
1233}
1234
1235static int snd_ctl_elem_user_enum_info(struct snd_kcontrol *kcontrol,
1236                                       struct snd_ctl_elem_info *uinfo)
1237{
1238        struct user_element *ue = kcontrol->private_data;
1239        const char *names;
1240        unsigned int item;
1241        unsigned int offset;
1242
1243        item = uinfo->value.enumerated.item;
1244
1245        offset = snd_ctl_get_ioff(kcontrol, &uinfo->id);
1246        *uinfo = ue->info;
1247        snd_ctl_build_ioff(&uinfo->id, kcontrol, offset);
1248
1249        item = min(item, uinfo->value.enumerated.items - 1);
1250        uinfo->value.enumerated.item = item;
1251
1252        names = ue->priv_data;
1253        for (; item > 0; --item)
1254                names += strlen(names) + 1;
1255        strcpy(uinfo->value.enumerated.name, names);
1256
1257        return 0;
1258}
1259
1260static int snd_ctl_elem_user_get(struct snd_kcontrol *kcontrol,
1261                                 struct snd_ctl_elem_value *ucontrol)
1262{
1263        struct user_element *ue = kcontrol->private_data;
1264        unsigned int size = ue->elem_data_size;
1265        char *src = ue->elem_data +
1266                        snd_ctl_get_ioff(kcontrol, &ucontrol->id) * size;
1267
1268        memcpy(&ucontrol->value, src, size);
1269        return 0;
1270}
1271
1272static int snd_ctl_elem_user_put(struct snd_kcontrol *kcontrol,
1273                                 struct snd_ctl_elem_value *ucontrol)
1274{
1275        int change;
1276        struct user_element *ue = kcontrol->private_data;
1277        unsigned int size = ue->elem_data_size;
1278        char *dst = ue->elem_data +
1279                        snd_ctl_get_ioff(kcontrol, &ucontrol->id) * size;
1280
1281        change = memcmp(&ucontrol->value, dst, size) != 0;
1282        if (change)
1283                memcpy(dst, &ucontrol->value, size);
1284        return change;
1285}
1286
1287static int replace_user_tlv(struct snd_kcontrol *kctl, unsigned int __user *buf,
1288                            unsigned int size)
1289{
1290        struct user_element *ue = kctl->private_data;
1291        unsigned int *container;
1292        struct snd_ctl_elem_id id;
1293        unsigned int mask = 0;
1294        int i;
1295        int change;
1296
1297        if (size > 1024 * 128)  /* sane value */
1298                return -EINVAL;
1299
1300        container = vmemdup_user(buf, size);
1301        if (IS_ERR(container))
1302                return PTR_ERR(container);
1303
1304        change = ue->tlv_data_size != size;
1305        if (!change)
1306                change = memcmp(ue->tlv_data, container, size) != 0;
1307        if (!change) {
1308                kvfree(container);
1309                return 0;
1310        }
1311
1312        if (ue->tlv_data == NULL) {
1313                /* Now TLV data is available. */
1314                for (i = 0; i < kctl->count; ++i)
1315                        kctl->vd[i].access |= SNDRV_CTL_ELEM_ACCESS_TLV_READ;
1316                mask = SNDRV_CTL_EVENT_MASK_INFO;
1317        }
1318
1319        kvfree(ue->tlv_data);
1320        ue->tlv_data = container;
1321        ue->tlv_data_size = size;
1322
1323        mask |= SNDRV_CTL_EVENT_MASK_TLV;
1324        for (i = 0; i < kctl->count; ++i) {
1325                snd_ctl_build_ioff(&id, kctl, i);
1326                snd_ctl_notify(ue->card, mask, &id);
1327        }
1328
1329        return change;
1330}
1331
1332static int read_user_tlv(struct snd_kcontrol *kctl, unsigned int __user *buf,
1333                         unsigned int size)
1334{
1335        struct user_element *ue = kctl->private_data;
1336
1337        if (ue->tlv_data_size == 0 || ue->tlv_data == NULL)
1338                return -ENXIO;
1339
1340        if (size < ue->tlv_data_size)
1341                return -ENOSPC;
1342
1343        if (copy_to_user(buf, ue->tlv_data, ue->tlv_data_size))
1344                return -EFAULT;
1345
1346        return 0;
1347}
1348
1349static int snd_ctl_elem_user_tlv(struct snd_kcontrol *kctl, int op_flag,
1350                                 unsigned int size, unsigned int __user *buf)
1351{
1352        if (op_flag == SNDRV_CTL_TLV_OP_WRITE)
1353                return replace_user_tlv(kctl, buf, size);
1354        else
1355                return read_user_tlv(kctl, buf, size);
1356}
1357
1358static int snd_ctl_elem_init_enum_names(struct user_element *ue)
1359{
1360        char *names, *p;
1361        size_t buf_len, name_len;
1362        unsigned int i;
1363        const uintptr_t user_ptrval = ue->info.value.enumerated.names_ptr;
1364
1365        if (ue->info.value.enumerated.names_length > 64 * 1024)
1366                return -EINVAL;
1367
1368        names = vmemdup_user((const void __user *)user_ptrval,
1369                ue->info.value.enumerated.names_length);
1370        if (IS_ERR(names))
1371                return PTR_ERR(names);
1372
1373        /* check that there are enough valid names */
1374        buf_len = ue->info.value.enumerated.names_length;
1375        p = names;
1376        for (i = 0; i < ue->info.value.enumerated.items; ++i) {
1377                name_len = strnlen(p, buf_len);
1378                if (name_len == 0 || name_len >= 64 || name_len == buf_len) {
1379                        kvfree(names);
1380                        return -EINVAL;
1381                }
1382                p += name_len + 1;
1383                buf_len -= name_len + 1;
1384        }
1385
1386        ue->priv_data = names;
1387        ue->info.value.enumerated.names_ptr = 0;
1388
1389        return 0;
1390}
1391
1392static void snd_ctl_elem_user_free(struct snd_kcontrol *kcontrol)
1393{
1394        struct user_element *ue = kcontrol->private_data;
1395
1396        kvfree(ue->tlv_data);
1397        kvfree(ue->priv_data);
1398        kfree(ue);
1399}
1400
1401static int snd_ctl_elem_add(struct snd_ctl_file *file,
1402                            struct snd_ctl_elem_info *info, int replace)
1403{
1404        struct snd_card *card = file->card;
1405        struct snd_kcontrol *kctl;
1406        unsigned int count;
1407        unsigned int access;
1408        long private_size;
1409        struct user_element *ue;
1410        unsigned int offset;
1411        int err;
1412
1413        if (!*info->id.name)
1414                return -EINVAL;
1415        if (strnlen(info->id.name, sizeof(info->id.name)) >= sizeof(info->id.name))
1416                return -EINVAL;
1417
1418        /* Delete a control to replace them if needed. */
1419        if (replace) {
1420                info->id.numid = 0;
1421                err = snd_ctl_remove_user_ctl(file, &info->id);
1422                if (err)
1423                        return err;
1424        }
1425
1426        /*
1427         * The number of userspace controls are counted control by control,
1428         * not element by element.
1429         */
1430        if (card->user_ctl_count + 1 > MAX_USER_CONTROLS)
1431                return -ENOMEM;
1432
1433        /* Check the number of elements for this userspace control. */
1434        count = info->owner;
1435        if (count == 0)
1436                count = 1;
1437
1438        /* Arrange access permissions if needed. */
1439        access = info->access;
1440        if (access == 0)
1441                access = SNDRV_CTL_ELEM_ACCESS_READWRITE;
1442        access &= (SNDRV_CTL_ELEM_ACCESS_READWRITE |
1443                   SNDRV_CTL_ELEM_ACCESS_INACTIVE |
1444                   SNDRV_CTL_ELEM_ACCESS_TLV_WRITE);
1445
1446        /* In initial state, nothing is available as TLV container. */
1447        if (access & SNDRV_CTL_ELEM_ACCESS_TLV_WRITE)
1448                access |= SNDRV_CTL_ELEM_ACCESS_TLV_CALLBACK;
1449        access |= SNDRV_CTL_ELEM_ACCESS_USER;
1450
1451        /*
1452         * Check information and calculate the size of data specific to
1453         * this userspace control.
1454         */
1455        /* pass NULL to card for suppressing error messages */
1456        err = snd_ctl_check_elem_info(NULL, info);
1457        if (err < 0)
1458                return err;
1459        /* user-space control doesn't allow zero-size data */
1460        if (info->count < 1)
1461                return -EINVAL;
1462        private_size = value_sizes[info->type] * info->count;
1463
1464        /*
1465         * Keep memory object for this userspace control. After passing this
1466         * code block, the instance should be freed by snd_ctl_free_one().
1467         *
1468         * Note that these elements in this control are locked.
1469         */
1470        err = snd_ctl_new(&kctl, count, access, file);
1471        if (err < 0)
1472                return err;
1473        memcpy(&kctl->id, &info->id, sizeof(kctl->id));
1474        kctl->private_data = kzalloc(sizeof(struct user_element) + private_size * count,
1475                                     GFP_KERNEL);
1476        if (kctl->private_data == NULL) {
1477                kfree(kctl);
1478                return -ENOMEM;
1479        }
1480        kctl->private_free = snd_ctl_elem_user_free;
1481
1482        /* Set private data for this userspace control. */
1483        ue = (struct user_element *)kctl->private_data;
1484        ue->card = card;
1485        ue->info = *info;
1486        ue->info.access = 0;
1487        ue->elem_data = (char *)ue + sizeof(*ue);
1488        ue->elem_data_size = private_size;
1489        if (ue->info.type == SNDRV_CTL_ELEM_TYPE_ENUMERATED) {
1490                err = snd_ctl_elem_init_enum_names(ue);
1491                if (err < 0) {
1492                        snd_ctl_free_one(kctl);
1493                        return err;
1494                }
1495        }
1496
1497        /* Set callback functions. */
1498        if (info->type == SNDRV_CTL_ELEM_TYPE_ENUMERATED)
1499                kctl->info = snd_ctl_elem_user_enum_info;
1500        else
1501                kctl->info = snd_ctl_elem_user_info;
1502        if (access & SNDRV_CTL_ELEM_ACCESS_READ)
1503                kctl->get = snd_ctl_elem_user_get;
1504        if (access & SNDRV_CTL_ELEM_ACCESS_WRITE)
1505                kctl->put = snd_ctl_elem_user_put;
1506        if (access & SNDRV_CTL_ELEM_ACCESS_TLV_WRITE)
1507                kctl->tlv.c = snd_ctl_elem_user_tlv;
1508
1509        /* This function manage to free the instance on failure. */
1510        down_write(&card->controls_rwsem);
1511        err = __snd_ctl_add_replace(card, kctl, CTL_ADD_EXCLUSIVE);
1512        if (err < 0) {
1513                snd_ctl_free_one(kctl);
1514                goto unlock;
1515        }
1516        offset = snd_ctl_get_ioff(kctl, &info->id);
1517        snd_ctl_build_ioff(&info->id, kctl, offset);
1518        /*
1519         * Here we cannot fill any field for the number of elements added by
1520         * this operation because there're no specific fields. The usage of
1521         * 'owner' field for this purpose may cause any bugs to userspace
1522         * applications because the field originally means PID of a process
1523         * which locks the element.
1524         */
1525
1526        card->user_ctl_count++;
1527
1528 unlock:
1529        up_write(&card->controls_rwsem);
1530        return 0;
1531}
1532
1533static int snd_ctl_elem_add_user(struct snd_ctl_file *file,
1534                                 struct snd_ctl_elem_info __user *_info, int replace)
1535{
1536        struct snd_ctl_elem_info info;
1537        int err;
1538
1539        if (copy_from_user(&info, _info, sizeof(info)))
1540                return -EFAULT;
1541        err = snd_ctl_elem_add(file, &info, replace);
1542        if (err < 0)
1543                return err;
1544        if (copy_to_user(_info, &info, sizeof(info))) {
1545                snd_ctl_remove_user_ctl(file, &info.id);
1546                return -EFAULT;
1547        }
1548
1549        return 0;
1550}
1551
1552static int snd_ctl_elem_remove(struct snd_ctl_file *file,
1553                               struct snd_ctl_elem_id __user *_id)
1554{
1555        struct snd_ctl_elem_id id;
1556
1557        if (copy_from_user(&id, _id, sizeof(id)))
1558                return -EFAULT;
1559        return snd_ctl_remove_user_ctl(file, &id);
1560}
1561
1562static int snd_ctl_subscribe_events(struct snd_ctl_file *file, int __user *ptr)
1563{
1564        int subscribe;
1565        if (get_user(subscribe, ptr))
1566                return -EFAULT;
1567        if (subscribe < 0) {
1568                subscribe = file->subscribed;
1569                if (put_user(subscribe, ptr))
1570                        return -EFAULT;
1571                return 0;
1572        }
1573        if (subscribe) {
1574                file->subscribed = 1;
1575                return 0;
1576        } else if (file->subscribed) {
1577                snd_ctl_empty_read_queue(file);
1578                file->subscribed = 0;
1579        }
1580        return 0;
1581}
1582
1583static int call_tlv_handler(struct snd_ctl_file *file, int op_flag,
1584                            struct snd_kcontrol *kctl,
1585                            struct snd_ctl_elem_id *id,
1586                            unsigned int __user *buf, unsigned int size)
1587{
1588        static const struct {
1589                int op;
1590                int perm;
1591        } pairs[] = {
1592                {SNDRV_CTL_TLV_OP_READ,  SNDRV_CTL_ELEM_ACCESS_TLV_READ},
1593                {SNDRV_CTL_TLV_OP_WRITE, SNDRV_CTL_ELEM_ACCESS_TLV_WRITE},
1594                {SNDRV_CTL_TLV_OP_CMD,   SNDRV_CTL_ELEM_ACCESS_TLV_COMMAND},
1595        };
1596        struct snd_kcontrol_volatile *vd = &kctl->vd[snd_ctl_get_ioff(kctl, id)];
1597        int i;
1598
1599        /* Check support of the request for this element. */
1600        for (i = 0; i < ARRAY_SIZE(pairs); ++i) {
1601                if (op_flag == pairs[i].op && (vd->access & pairs[i].perm))
1602                        break;
1603        }
1604        if (i == ARRAY_SIZE(pairs))
1605                return -ENXIO;
1606
1607        if (kctl->tlv.c == NULL)
1608                return -ENXIO;
1609
1610        /* Write and command operations are not allowed for locked element. */
1611        if (op_flag != SNDRV_CTL_TLV_OP_READ &&
1612            vd->owner != NULL && vd->owner != file)
1613                return -EPERM;
1614
1615        return kctl->tlv.c(kctl, op_flag, size, buf);
1616}
1617
1618static int read_tlv_buf(struct snd_kcontrol *kctl, struct snd_ctl_elem_id *id,
1619                        unsigned int __user *buf, unsigned int size)
1620{
1621        struct snd_kcontrol_volatile *vd = &kctl->vd[snd_ctl_get_ioff(kctl, id)];
1622        unsigned int len;
1623
1624        if (!(vd->access & SNDRV_CTL_ELEM_ACCESS_TLV_READ))
1625                return -ENXIO;
1626
1627        if (kctl->tlv.p == NULL)
1628                return -ENXIO;
1629
1630        len = sizeof(unsigned int) * 2 + kctl->tlv.p[1];
1631        if (size < len)
1632                return -ENOMEM;
1633
1634        if (copy_to_user(buf, kctl->tlv.p, len))
1635                return -EFAULT;
1636
1637        return 0;
1638}
1639
1640static int snd_ctl_tlv_ioctl(struct snd_ctl_file *file,
1641                             struct snd_ctl_tlv __user *buf,
1642                             int op_flag)
1643{
1644        struct snd_ctl_tlv header;
1645        unsigned int __user *container;
1646        unsigned int container_size;
1647        struct snd_kcontrol *kctl;
1648        struct snd_ctl_elem_id id;
1649        struct snd_kcontrol_volatile *vd;
1650
1651        if (copy_from_user(&header, buf, sizeof(header)))
1652                return -EFAULT;
1653
1654        /* In design of control core, numerical ID starts at 1. */
1655        if (header.numid == 0)
1656                return -EINVAL;
1657
1658        /* At least, container should include type and length fields.  */
1659        if (header.length < sizeof(unsigned int) * 2)
1660                return -EINVAL;
1661        container_size = header.length;
1662        container = buf->tlv;
1663
1664        kctl = snd_ctl_find_numid(file->card, header.numid);
1665        if (kctl == NULL)
1666                return -ENOENT;
1667
1668        /* Calculate index of the element in this set. */
1669        id = kctl->id;
1670        snd_ctl_build_ioff(&id, kctl, header.numid - id.numid);
1671        vd = &kctl->vd[snd_ctl_get_ioff(kctl, &id)];
1672
1673        if (vd->access & SNDRV_CTL_ELEM_ACCESS_TLV_CALLBACK) {
1674                return call_tlv_handler(file, op_flag, kctl, &id, container,
1675                                        container_size);
1676        } else {
1677                if (op_flag == SNDRV_CTL_TLV_OP_READ) {
1678                        return read_tlv_buf(kctl, &id, container,
1679                                            container_size);
1680                }
1681        }
1682
1683        /* Not supported. */
1684        return -ENXIO;
1685}
1686
1687static long snd_ctl_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
1688{
1689        struct snd_ctl_file *ctl;
1690        struct snd_card *card;
1691        struct snd_kctl_ioctl *p;
1692        void __user *argp = (void __user *)arg;
1693        int __user *ip = argp;
1694        int err;
1695
1696        ctl = file->private_data;
1697        card = ctl->card;
1698        if (snd_BUG_ON(!card))
1699                return -ENXIO;
1700        switch (cmd) {
1701        case SNDRV_CTL_IOCTL_PVERSION:
1702                return put_user(SNDRV_CTL_VERSION, ip) ? -EFAULT : 0;
1703        case SNDRV_CTL_IOCTL_CARD_INFO:
1704                return snd_ctl_card_info(card, ctl, cmd, argp);
1705        case SNDRV_CTL_IOCTL_ELEM_LIST:
1706                return snd_ctl_elem_list(card, argp);
1707        case SNDRV_CTL_IOCTL_ELEM_INFO:
1708                return snd_ctl_elem_info_user(ctl, argp);
1709        case SNDRV_CTL_IOCTL_ELEM_READ:
1710                return snd_ctl_elem_read_user(card, argp);
1711        case SNDRV_CTL_IOCTL_ELEM_WRITE:
1712                return snd_ctl_elem_write_user(ctl, argp);
1713        case SNDRV_CTL_IOCTL_ELEM_LOCK:
1714                return snd_ctl_elem_lock(ctl, argp);
1715        case SNDRV_CTL_IOCTL_ELEM_UNLOCK:
1716                return snd_ctl_elem_unlock(ctl, argp);
1717        case SNDRV_CTL_IOCTL_ELEM_ADD:
1718                return snd_ctl_elem_add_user(ctl, argp, 0);
1719        case SNDRV_CTL_IOCTL_ELEM_REPLACE:
1720                return snd_ctl_elem_add_user(ctl, argp, 1);
1721        case SNDRV_CTL_IOCTL_ELEM_REMOVE:
1722                return snd_ctl_elem_remove(ctl, argp);
1723        case SNDRV_CTL_IOCTL_SUBSCRIBE_EVENTS:
1724                return snd_ctl_subscribe_events(ctl, ip);
1725        case SNDRV_CTL_IOCTL_TLV_READ:
1726                down_read(&ctl->card->controls_rwsem);
1727                err = snd_ctl_tlv_ioctl(ctl, argp, SNDRV_CTL_TLV_OP_READ);
1728                up_read(&ctl->card->controls_rwsem);
1729                return err;
1730        case SNDRV_CTL_IOCTL_TLV_WRITE:
1731                down_write(&ctl->card->controls_rwsem);
1732                err = snd_ctl_tlv_ioctl(ctl, argp, SNDRV_CTL_TLV_OP_WRITE);
1733                up_write(&ctl->card->controls_rwsem);
1734                return err;
1735        case SNDRV_CTL_IOCTL_TLV_COMMAND:
1736                down_write(&ctl->card->controls_rwsem);
1737                err = snd_ctl_tlv_ioctl(ctl, argp, SNDRV_CTL_TLV_OP_CMD);
1738                up_write(&ctl->card->controls_rwsem);
1739                return err;
1740        case SNDRV_CTL_IOCTL_POWER:
1741                return -ENOPROTOOPT;
1742        case SNDRV_CTL_IOCTL_POWER_STATE:
1743#ifdef CONFIG_PM
1744                return put_user(card->power_state, ip) ? -EFAULT : 0;
1745#else
1746                return put_user(SNDRV_CTL_POWER_D0, ip) ? -EFAULT : 0;
1747#endif
1748        }
1749        down_read(&snd_ioctl_rwsem);
1750        list_for_each_entry(p, &snd_control_ioctls, list) {
1751                err = p->fioctl(card, ctl, cmd, arg);
1752                if (err != -ENOIOCTLCMD) {
1753                        up_read(&snd_ioctl_rwsem);
1754                        return err;
1755                }
1756        }
1757        up_read(&snd_ioctl_rwsem);
1758        dev_dbg(card->dev, "unknown ioctl = 0x%x\n", cmd);
1759        return -ENOTTY;
1760}
1761
1762static ssize_t snd_ctl_read(struct file *file, char __user *buffer,
1763                            size_t count, loff_t * offset)
1764{
1765        struct snd_ctl_file *ctl;
1766        int err = 0;
1767        ssize_t result = 0;
1768
1769        ctl = file->private_data;
1770        if (snd_BUG_ON(!ctl || !ctl->card))
1771                return -ENXIO;
1772        if (!ctl->subscribed)
1773                return -EBADFD;
1774        if (count < sizeof(struct snd_ctl_event))
1775                return -EINVAL;
1776        spin_lock_irq(&ctl->read_lock);
1777        while (count >= sizeof(struct snd_ctl_event)) {
1778                struct snd_ctl_event ev;
1779                struct snd_kctl_event *kev;
1780                while (list_empty(&ctl->events)) {
1781                        wait_queue_entry_t wait;
1782                        if ((file->f_flags & O_NONBLOCK) != 0 || result > 0) {
1783                                err = -EAGAIN;
1784                                goto __end_lock;
1785                        }
1786                        init_waitqueue_entry(&wait, current);
1787                        add_wait_queue(&ctl->change_sleep, &wait);
1788                        set_current_state(TASK_INTERRUPTIBLE);
1789                        spin_unlock_irq(&ctl->read_lock);
1790                        schedule();
1791                        remove_wait_queue(&ctl->change_sleep, &wait);
1792                        if (ctl->card->shutdown)
1793                                return -ENODEV;
1794                        if (signal_pending(current))
1795                                return -ERESTARTSYS;
1796                        spin_lock_irq(&ctl->read_lock);
1797                }
1798                kev = snd_kctl_event(ctl->events.next);
1799                ev.type = SNDRV_CTL_EVENT_ELEM;
1800                ev.data.elem.mask = kev->mask;
1801                ev.data.elem.id = kev->id;
1802                list_del(&kev->list);
1803                spin_unlock_irq(&ctl->read_lock);
1804                kfree(kev);
1805                if (copy_to_user(buffer, &ev, sizeof(struct snd_ctl_event))) {
1806                        err = -EFAULT;
1807                        goto __end;
1808                }
1809                spin_lock_irq(&ctl->read_lock);
1810                buffer += sizeof(struct snd_ctl_event);
1811                count -= sizeof(struct snd_ctl_event);
1812                result += sizeof(struct snd_ctl_event);
1813        }
1814      __end_lock:
1815        spin_unlock_irq(&ctl->read_lock);
1816      __end:
1817        return result > 0 ? result : err;
1818}
1819
1820static __poll_t snd_ctl_poll(struct file *file, poll_table * wait)
1821{
1822        __poll_t mask;
1823        struct snd_ctl_file *ctl;
1824
1825        ctl = file->private_data;
1826        if (!ctl->subscribed)
1827                return 0;
1828        poll_wait(file, &ctl->change_sleep, wait);
1829
1830        mask = 0;
1831        if (!list_empty(&ctl->events))
1832                mask |= EPOLLIN | EPOLLRDNORM;
1833
1834        return mask;
1835}
1836
1837/*
1838 * register the device-specific control-ioctls.
1839 * called from each device manager like pcm.c, hwdep.c, etc.
1840 */
1841static int _snd_ctl_register_ioctl(snd_kctl_ioctl_func_t fcn, struct list_head *lists)
1842{
1843        struct snd_kctl_ioctl *pn;
1844
1845        pn = kzalloc(sizeof(struct snd_kctl_ioctl), GFP_KERNEL);
1846        if (pn == NULL)
1847                return -ENOMEM;
1848        pn->fioctl = fcn;
1849        down_write(&snd_ioctl_rwsem);
1850        list_add_tail(&pn->list, lists);
1851        up_write(&snd_ioctl_rwsem);
1852        return 0;
1853}
1854
1855/**
1856 * snd_ctl_register_ioctl - register the device-specific control-ioctls
1857 * @fcn: ioctl callback function
1858 *
1859 * called from each device manager like pcm.c, hwdep.c, etc.
1860 */
1861int snd_ctl_register_ioctl(snd_kctl_ioctl_func_t fcn)
1862{
1863        return _snd_ctl_register_ioctl(fcn, &snd_control_ioctls);
1864}
1865EXPORT_SYMBOL(snd_ctl_register_ioctl);
1866
1867#ifdef CONFIG_COMPAT
1868/**
1869 * snd_ctl_register_ioctl_compat - register the device-specific 32bit compat
1870 * control-ioctls
1871 * @fcn: ioctl callback function
1872 */
1873int snd_ctl_register_ioctl_compat(snd_kctl_ioctl_func_t fcn)
1874{
1875        return _snd_ctl_register_ioctl(fcn, &snd_control_compat_ioctls);
1876}
1877EXPORT_SYMBOL(snd_ctl_register_ioctl_compat);
1878#endif
1879
1880/*
1881 * de-register the device-specific control-ioctls.
1882 */
1883static int _snd_ctl_unregister_ioctl(snd_kctl_ioctl_func_t fcn,
1884                                     struct list_head *lists)
1885{
1886        struct snd_kctl_ioctl *p;
1887
1888        if (snd_BUG_ON(!fcn))
1889                return -EINVAL;
1890        down_write(&snd_ioctl_rwsem);
1891        list_for_each_entry(p, lists, list) {
1892                if (p->fioctl == fcn) {
1893                        list_del(&p->list);
1894                        up_write(&snd_ioctl_rwsem);
1895                        kfree(p);
1896                        return 0;
1897                }
1898        }
1899        up_write(&snd_ioctl_rwsem);
1900        snd_BUG();
1901        return -EINVAL;
1902}
1903
1904/**
1905 * snd_ctl_unregister_ioctl - de-register the device-specific control-ioctls
1906 * @fcn: ioctl callback function to unregister
1907 */
1908int snd_ctl_unregister_ioctl(snd_kctl_ioctl_func_t fcn)
1909{
1910        return _snd_ctl_unregister_ioctl(fcn, &snd_control_ioctls);
1911}
1912EXPORT_SYMBOL(snd_ctl_unregister_ioctl);
1913
1914#ifdef CONFIG_COMPAT
1915/**
1916 * snd_ctl_unregister_ioctl - de-register the device-specific compat 32bit
1917 * control-ioctls
1918 * @fcn: ioctl callback function to unregister
1919 */
1920int snd_ctl_unregister_ioctl_compat(snd_kctl_ioctl_func_t fcn)
1921{
1922        return _snd_ctl_unregister_ioctl(fcn, &snd_control_compat_ioctls);
1923}
1924EXPORT_SYMBOL(snd_ctl_unregister_ioctl_compat);
1925#endif
1926
1927static int snd_ctl_fasync(int fd, struct file * file, int on)
1928{
1929        struct snd_ctl_file *ctl;
1930
1931        ctl = file->private_data;
1932        return fasync_helper(fd, file, on, &ctl->fasync);
1933}
1934
1935/* return the preferred subdevice number if already assigned;
1936 * otherwise return -1
1937 */
1938int snd_ctl_get_preferred_subdevice(struct snd_card *card, int type)
1939{
1940        struct snd_ctl_file *kctl;
1941        int subdevice = -1;
1942
1943        read_lock(&card->ctl_files_rwlock);
1944        list_for_each_entry(kctl, &card->ctl_files, list) {
1945                if (kctl->pid == task_pid(current)) {
1946                        subdevice = kctl->preferred_subdevice[type];
1947                        if (subdevice != -1)
1948                                break;
1949                }
1950        }
1951        read_unlock(&card->ctl_files_rwlock);
1952        return subdevice;
1953}
1954EXPORT_SYMBOL_GPL(snd_ctl_get_preferred_subdevice);
1955
1956/*
1957 * ioctl32 compat
1958 */
1959#ifdef CONFIG_COMPAT
1960#include "control_compat.c"
1961#else
1962#define snd_ctl_ioctl_compat    NULL
1963#endif
1964
1965/*
1966 *  INIT PART
1967 */
1968
1969static const struct file_operations snd_ctl_f_ops =
1970{
1971        .owner =        THIS_MODULE,
1972        .read =         snd_ctl_read,
1973        .open =         snd_ctl_open,
1974        .release =      snd_ctl_release,
1975        .llseek =       no_llseek,
1976        .poll =         snd_ctl_poll,
1977        .unlocked_ioctl =       snd_ctl_ioctl,
1978        .compat_ioctl = snd_ctl_ioctl_compat,
1979        .fasync =       snd_ctl_fasync,
1980};
1981
1982/*
1983 * registration of the control device
1984 */
1985static int snd_ctl_dev_register(struct snd_device *device)
1986{
1987        struct snd_card *card = device->device_data;
1988
1989        return snd_register_device(SNDRV_DEVICE_TYPE_CONTROL, card, -1,
1990                                   &snd_ctl_f_ops, card, &card->ctl_dev);
1991}
1992
1993/*
1994 * disconnection of the control device
1995 */
1996static int snd_ctl_dev_disconnect(struct snd_device *device)
1997{
1998        struct snd_card *card = device->device_data;
1999        struct snd_ctl_file *ctl;
2000
2001        read_lock(&card->ctl_files_rwlock);
2002        list_for_each_entry(ctl, &card->ctl_files, list) {
2003                wake_up(&ctl->change_sleep);
2004                kill_fasync(&ctl->fasync, SIGIO, POLL_ERR);
2005        }
2006        read_unlock(&card->ctl_files_rwlock);
2007
2008        return snd_unregister_device(&card->ctl_dev);
2009}
2010
2011/*
2012 * free all controls
2013 */
2014static int snd_ctl_dev_free(struct snd_device *device)
2015{
2016        struct snd_card *card = device->device_data;
2017        struct snd_kcontrol *control;
2018
2019        down_write(&card->controls_rwsem);
2020        while (!list_empty(&card->controls)) {
2021                control = snd_kcontrol(card->controls.next);
2022                snd_ctl_remove(card, control);
2023        }
2024        up_write(&card->controls_rwsem);
2025        put_device(&card->ctl_dev);
2026        return 0;
2027}
2028
2029/*
2030 * create control core:
2031 * called from init.c
2032 */
2033int snd_ctl_create(struct snd_card *card)
2034{
2035        static const struct snd_device_ops ops = {
2036                .dev_free = snd_ctl_dev_free,
2037                .dev_register = snd_ctl_dev_register,
2038                .dev_disconnect = snd_ctl_dev_disconnect,
2039        };
2040        int err;
2041
2042        if (snd_BUG_ON(!card))
2043                return -ENXIO;
2044        if (snd_BUG_ON(card->number < 0 || card->number >= SNDRV_CARDS))
2045                return -ENXIO;
2046
2047        snd_device_initialize(&card->ctl_dev, card);
2048        dev_set_name(&card->ctl_dev, "controlC%d", card->number);
2049
2050        err = snd_device_new(card, SNDRV_DEV_CONTROL, card, &ops);
2051        if (err < 0)
2052                put_device(&card->ctl_dev);
2053        return err;
2054}
2055
2056/*
2057 * Frequently used control callbacks/helpers
2058 */
2059
2060/**
2061 * snd_ctl_boolean_mono_info - Helper function for a standard boolean info
2062 * callback with a mono channel
2063 * @kcontrol: the kcontrol instance
2064 * @uinfo: info to store
2065 *
2066 * This is a function that can be used as info callback for a standard
2067 * boolean control with a single mono channel.
2068 */
2069int snd_ctl_boolean_mono_info(struct snd_kcontrol *kcontrol,
2070                              struct snd_ctl_elem_info *uinfo)
2071{
2072        uinfo->type = SNDRV_CTL_ELEM_TYPE_BOOLEAN;
2073        uinfo->count = 1;
2074        uinfo->value.integer.min = 0;
2075        uinfo->value.integer.max = 1;
2076        return 0;
2077}
2078EXPORT_SYMBOL(snd_ctl_boolean_mono_info);
2079
2080/**
2081 * snd_ctl_boolean_stereo_info - Helper function for a standard boolean info
2082 * callback with stereo two channels
2083 * @kcontrol: the kcontrol instance
2084 * @uinfo: info to store
2085 *
2086 * This is a function that can be used as info callback for a standard
2087 * boolean control with stereo two channels.
2088 */
2089int snd_ctl_boolean_stereo_info(struct snd_kcontrol *kcontrol,
2090                                struct snd_ctl_elem_info *uinfo)
2091{
2092        uinfo->type = SNDRV_CTL_ELEM_TYPE_BOOLEAN;
2093        uinfo->count = 2;
2094        uinfo->value.integer.min = 0;
2095        uinfo->value.integer.max = 1;
2096        return 0;
2097}
2098EXPORT_SYMBOL(snd_ctl_boolean_stereo_info);
2099
2100/**
2101 * snd_ctl_enum_info - fills the info structure for an enumerated control
2102 * @info: the structure to be filled
2103 * @channels: the number of the control's channels; often one
2104 * @items: the number of control values; also the size of @names
2105 * @names: an array containing the names of all control values
2106 *
2107 * Sets all required fields in @info to their appropriate values.
2108 * If the control's accessibility is not the default (readable and writable),
2109 * the caller has to fill @info->access.
2110 *
2111 * Return: Zero.
2112 */
2113int snd_ctl_enum_info(struct snd_ctl_elem_info *info, unsigned int channels,
2114                      unsigned int items, const char *const names[])
2115{
2116        info->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED;
2117        info->count = channels;
2118        info->value.enumerated.items = items;
2119        if (!items)
2120                return 0;
2121        if (info->value.enumerated.item >= items)
2122                info->value.enumerated.item = items - 1;
2123        WARN(strlen(names[info->value.enumerated.item]) >= sizeof(info->value.enumerated.name),
2124             "ALSA: too long item name '%s'\n",
2125             names[info->value.enumerated.item]);
2126        strlcpy(info->value.enumerated.name,
2127                names[info->value.enumerated.item],
2128                sizeof(info->value.enumerated.name));
2129        return 0;
2130}
2131EXPORT_SYMBOL(snd_ctl_enum_info);
2132