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