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