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