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