~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

TOMOYO Linux Cross Reference
Linux/sound/core/control.c

Version: ~ [ linux-5.2-rc1 ] ~ [ linux-5.1.2 ] ~ [ linux-5.0.16 ] ~ [ linux-4.20.17 ] ~ [ linux-4.19.43 ] ~ [ linux-4.18.20 ] ~ [ linux-4.17.19 ] ~ [ linux-4.16.18 ] ~ [ linux-4.15.18 ] ~ [ linux-4.14.119 ] ~ [ linux-4.13.16 ] ~ [ linux-4.12.14 ] ~ [ linux-4.11.12 ] ~ [ linux-4.10.17 ] ~ [ linux-4.9.176 ] ~ [ linux-4.8.17 ] ~ [ linux-4.7.10 ] ~ [ linux-4.6.7 ] ~ [ linux-4.5.7 ] ~ [ linux-4.4.179 ] ~ [ linux-4.3.6 ] ~ [ linux-4.2.8 ] ~ [ linux-4.1.52 ] ~ [ linux-4.0.9 ] ~ [ linux-3.19.8 ] ~ [ linux-3.18.139 ] ~ [ linux-3.17.8 ] ~ [ linux-3.16.67 ] ~ [ linux-3.15.10 ] ~ [ linux-3.14.79 ] ~ [ linux-3.13.11 ] ~ [ linux-3.12.74 ] ~ [ linux-3.11.10 ] ~ [ linux-3.10.108 ] ~ [ linux-3.9.11 ] ~ [ linux-3.8.13 ] ~ [ linux-3.7.10 ] ~ [ linux-3.6.11 ] ~ [ linux-3.5.7 ] ~ [ linux-3.4.113 ] ~ [ linux-3.3.8 ] ~ [ linux-3.2.102 ] ~ [ linux-3.1.10 ] ~ [ linux-3.0.101 ] ~ [ linux-2.6.39.4 ] ~ [ linux-2.6.38.8 ] ~ [ linux-2.6.37.6 ] ~ [ linux-2.6.36.4 ] ~ [ linux-2.6.35.14 ] ~ [ linux-2.6.34.15 ] ~ [ linux-2.6.33.20 ] ~ [ linux-2.6.32.71 ] ~ [ linux-2.6.0 ] ~ [ linux-2.4.37.11 ] ~ [ unix-v6-master ] ~ [ ccs-tools-1.8.5 ] ~ [ policy-sample ] ~
Architecture: ~ [ i386 ] ~ [ alpha ] ~ [ m68k ] ~ [ mips ] ~ [ ppc ] ~ [ sparc ] ~ [ sparc64 ] ~

  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 
 37 struct snd_kctl_ioctl {
 38         struct list_head list;          /* list of all ioctls */
 39         snd_kctl_ioctl_func_t fioctl;
 40 };
 41 
 42 static DECLARE_RWSEM(snd_ioctl_rwsem);
 43 static LIST_HEAD(snd_control_ioctls);
 44 #ifdef CONFIG_COMPAT
 45 static LIST_HEAD(snd_control_compat_ioctls);
 46 #endif
 47 
 48 static 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 
102 static 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 
116 static 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  */
154 void 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 }
194 EXPORT_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  */
209 static 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  */
245 struct 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 }
296 EXPORT_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  */
306 void 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 }
314 EXPORT_SYMBOL(snd_ctl_free_one);
315 
316 static 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 
335 static 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  */
363 int 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 }
410 EXPORT_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  */
426 int 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         }
456 add:
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 
473 error:
474         snd_ctl_free_one(kcontrol);
475         return ret;
476 }
477 EXPORT_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  */
490 int 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 }
505 EXPORT_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  */
517 int 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 }
532 EXPORT_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  */
544 static 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--;
570 error:
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  */
587 int 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 }
621 EXPORT_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  */
634 int 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 }
651 EXPORT_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  */
666 struct 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 }
678 EXPORT_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  */
693 struct 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 }
719 EXPORT_SYMBOL(snd_ctl_find_id);
720 
721 static 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 
746 static 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 
810 static 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 
848 static 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 
867 static 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 
893 static 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 
915 static 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 
949 static 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 
973 static 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 
1001 static 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 
1031 struct 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 
1041 static 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 
1054 static 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 
1079 static 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 
1093 static 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 
1110 static 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) != 0;
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;
1148 err_unlock:
1149                 mutex_unlock(&ue->card->user_ctl_lock);
1150                 if (ret)
1151                         return ret;
1152         }
1153         return change;
1154 }
1155 
1156 static 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 
1190 static 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 
1199 static 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 
1345 static 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 
1364 static 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 
1374 static 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 
1395 static 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 
1462 static 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 
1528 static 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 
1586 static 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  */
1607 static 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  */
1627 int snd_ctl_register_ioctl(snd_kctl_ioctl_func_t fcn)
1628 {
1629         return _snd_ctl_register_ioctl(fcn, &snd_control_ioctls);
1630 }
1631 EXPORT_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  */
1639 int snd_ctl_register_ioctl_compat(snd_kctl_ioctl_func_t fcn)
1640 {
1641         return _snd_ctl_register_ioctl(fcn, &snd_control_compat_ioctls);
1642 }
1643 EXPORT_SYMBOL(snd_ctl_register_ioctl_compat);
1644 #endif
1645 
1646 /*
1647  * de-register the device-specific control-ioctls.
1648  */
1649 static 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  */
1674 int snd_ctl_unregister_ioctl(snd_kctl_ioctl_func_t fcn)
1675 {
1676         return _snd_ctl_unregister_ioctl(fcn, &snd_control_ioctls);
1677 }
1678 EXPORT_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  */
1686 int snd_ctl_unregister_ioctl_compat(snd_kctl_ioctl_func_t fcn)
1687 {
1688         return _snd_ctl_unregister_ioctl(fcn, &snd_control_compat_ioctls);
1689 }
1690 EXPORT_SYMBOL(snd_ctl_unregister_ioctl_compat);
1691 #endif
1692 
1693 static 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  */
1704 int 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 }
1720 EXPORT_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 
1735 static 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  */
1751 static 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  */
1762 static 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  */
1780 static 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  */
1799 int 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  */
1835 int 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 }
1844 EXPORT_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  */
1855 int 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 }
1864 EXPORT_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  */
1879 int 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 }
1897 EXPORT_SYMBOL(snd_ctl_enum_info);
1898 

~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

kernel.org | git.kernel.org | LWN.net | Project Home | Wiki (Japanese) | Wiki (English) | SVN repository | Mail admin

Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.

osdn.jp