xref: /linux/sound/core/control.c (revision f3d9478b2ce468c3115b02ecae7e975990697f15)
1 /*
2  *  Routines for driver control interface
3  *  Copyright (c) by Jaroslav Kysela <perex@suse.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 <sound/driver.h>
23 #include <linux/threads.h>
24 #include <linux/interrupt.h>
25 #include <linux/smp_lock.h>
26 #include <linux/slab.h>
27 #include <linux/vmalloc.h>
28 #include <linux/time.h>
29 #include <sound/core.h>
30 #include <sound/minors.h>
31 #include <sound/info.h>
32 #include <sound/control.h>
33 
34 /* max number of user-defined controls */
35 #define MAX_USER_CONTROLS	32
36 
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 err;
54 
55 	card = snd_lookup_minor_data(iminor(inode), SNDRV_DEVICE_TYPE_CONTROL);
56 	if (!card) {
57 		err = -ENODEV;
58 		goto __error1;
59 	}
60 	err = snd_card_file_add(card, file);
61 	if (err < 0) {
62 		err = -ENODEV;
63 		goto __error1;
64 	}
65 	if (!try_module_get(card->module)) {
66 		err = -EFAULT;
67 		goto __error2;
68 	}
69 	ctl = kzalloc(sizeof(*ctl), GFP_KERNEL);
70 	if (ctl == NULL) {
71 		err = -ENOMEM;
72 		goto __error;
73 	}
74 	INIT_LIST_HEAD(&ctl->events);
75 	init_waitqueue_head(&ctl->change_sleep);
76 	spin_lock_init(&ctl->read_lock);
77 	ctl->card = card;
78 	ctl->pid = current->pid;
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 	return 0;
84 
85       __error:
86 	module_put(card->module);
87       __error2:
88 	snd_card_file_remove(card, file);
89       __error1:
90       	return err;
91 }
92 
93 static void snd_ctl_empty_read_queue(struct snd_ctl_file * ctl)
94 {
95 	struct snd_kctl_event *cread;
96 
97 	spin_lock(&ctl->read_lock);
98 	while (!list_empty(&ctl->events)) {
99 		cread = snd_kctl_event(ctl->events.next);
100 		list_del(&cread->list);
101 		kfree(cread);
102 	}
103 	spin_unlock(&ctl->read_lock);
104 }
105 
106 static int snd_ctl_release(struct inode *inode, struct file *file)
107 {
108 	unsigned long flags;
109 	struct list_head *list;
110 	struct snd_card *card;
111 	struct snd_ctl_file *ctl;
112 	struct snd_kcontrol *control;
113 	unsigned int idx;
114 
115 	ctl = file->private_data;
116 	fasync_helper(-1, file, 0, &ctl->fasync);
117 	file->private_data = NULL;
118 	card = ctl->card;
119 	write_lock_irqsave(&card->ctl_files_rwlock, flags);
120 	list_del(&ctl->list);
121 	write_unlock_irqrestore(&card->ctl_files_rwlock, flags);
122 	down_write(&card->controls_rwsem);
123 	list_for_each(list, &card->controls) {
124 		control = snd_kcontrol(list);
125 		for (idx = 0; idx < control->count; idx++)
126 			if (control->vd[idx].owner == ctl)
127 				control->vd[idx].owner = NULL;
128 	}
129 	up_write(&card->controls_rwsem);
130 	snd_ctl_empty_read_queue(ctl);
131 	kfree(ctl);
132 	module_put(card->module);
133 	snd_card_file_remove(card, file);
134 	return 0;
135 }
136 
137 void snd_ctl_notify(struct snd_card *card, unsigned int mask,
138 		    struct snd_ctl_elem_id *id)
139 {
140 	unsigned long flags;
141 	struct list_head *flist;
142 	struct snd_ctl_file *ctl;
143 	struct snd_kctl_event *ev;
144 
145 	snd_assert(card != NULL && id != NULL, return);
146 	read_lock(&card->ctl_files_rwlock);
147 #if defined(CONFIG_SND_MIXER_OSS) || defined(CONFIG_SND_MIXER_OSS_MODULE)
148 	card->mixer_oss_change_count++;
149 #endif
150 	list_for_each(flist, &card->ctl_files) {
151 		struct list_head *elist;
152 		ctl = snd_ctl_file(flist);
153 		if (!ctl->subscribed)
154 			continue;
155 		spin_lock_irqsave(&ctl->read_lock, flags);
156 		list_for_each(elist, &ctl->events) {
157 			ev = snd_kctl_event(elist);
158 			if (ev->id.numid == id->numid) {
159 				ev->mask |= mask;
160 				goto _found;
161 			}
162 		}
163 		ev = kzalloc(sizeof(*ev), GFP_ATOMIC);
164 		if (ev) {
165 			ev->id = *id;
166 			ev->mask = mask;
167 			list_add_tail(&ev->list, &ctl->events);
168 		} else {
169 			snd_printk(KERN_ERR "No memory available to allocate event\n");
170 		}
171 	_found:
172 		wake_up(&ctl->change_sleep);
173 		spin_unlock_irqrestore(&ctl->read_lock, flags);
174 		kill_fasync(&ctl->fasync, SIGIO, POLL_IN);
175 	}
176 	read_unlock(&card->ctl_files_rwlock);
177 }
178 
179 EXPORT_SYMBOL(snd_ctl_notify);
180 
181 /**
182  * snd_ctl_new - create a control instance from the template
183  * @control: the control template
184  * @access: the default control access
185  *
186  * Allocates a new struct snd_kcontrol instance and copies the given template
187  * to the new instance. It does not copy volatile data (access).
188  *
189  * Returns the pointer of the new instance, or NULL on failure.
190  */
191 struct snd_kcontrol *snd_ctl_new(struct snd_kcontrol *control, unsigned int access)
192 {
193 	struct snd_kcontrol *kctl;
194 	unsigned int idx;
195 
196 	snd_assert(control != NULL, return NULL);
197 	snd_assert(control->count > 0, return NULL);
198 	kctl = kzalloc(sizeof(*kctl) + sizeof(struct snd_kcontrol_volatile) * control->count, GFP_KERNEL);
199 	if (kctl == NULL) {
200 		snd_printk(KERN_ERR "Cannot allocate control instance\n");
201 		return NULL;
202 	}
203 	*kctl = *control;
204 	for (idx = 0; idx < kctl->count; idx++)
205 		kctl->vd[idx].access = access;
206 	return kctl;
207 }
208 
209 EXPORT_SYMBOL(snd_ctl_new);
210 
211 /**
212  * snd_ctl_new1 - create a control instance from the template
213  * @ncontrol: the initialization record
214  * @private_data: the private data to set
215  *
216  * Allocates a new struct snd_kcontrol instance and initialize from the given
217  * template.  When the access field of ncontrol is 0, it's assumed as
218  * READWRITE access. When the count field is 0, it's assumes as one.
219  *
220  * Returns the pointer of the newly generated instance, or NULL on failure.
221  */
222 struct snd_kcontrol *snd_ctl_new1(const struct snd_kcontrol_new *ncontrol,
223 				  void *private_data)
224 {
225 	struct snd_kcontrol kctl;
226 	unsigned int access;
227 
228 	snd_assert(ncontrol != NULL, return NULL);
229 	snd_assert(ncontrol->info != NULL, return NULL);
230 	memset(&kctl, 0, sizeof(kctl));
231 	kctl.id.iface = ncontrol->iface;
232 	kctl.id.device = ncontrol->device;
233 	kctl.id.subdevice = ncontrol->subdevice;
234 	if (ncontrol->name)
235 		strlcpy(kctl.id.name, ncontrol->name, sizeof(kctl.id.name));
236 	kctl.id.index = ncontrol->index;
237 	kctl.count = ncontrol->count ? ncontrol->count : 1;
238 	access = ncontrol->access == 0 ? SNDRV_CTL_ELEM_ACCESS_READWRITE :
239 		 (ncontrol->access & (SNDRV_CTL_ELEM_ACCESS_READWRITE|SNDRV_CTL_ELEM_ACCESS_INACTIVE|
240 		 		      SNDRV_CTL_ELEM_ACCESS_DINDIRECT|SNDRV_CTL_ELEM_ACCESS_INDIRECT));
241 	kctl.info = ncontrol->info;
242 	kctl.get = ncontrol->get;
243 	kctl.put = ncontrol->put;
244 	kctl.private_value = ncontrol->private_value;
245 	kctl.private_data = private_data;
246 	return snd_ctl_new(&kctl, access);
247 }
248 
249 EXPORT_SYMBOL(snd_ctl_new1);
250 
251 /**
252  * snd_ctl_free_one - release the control instance
253  * @kcontrol: the control instance
254  *
255  * Releases the control instance created via snd_ctl_new()
256  * or snd_ctl_new1().
257  * Don't call this after the control was added to the card.
258  */
259 void snd_ctl_free_one(struct snd_kcontrol *kcontrol)
260 {
261 	if (kcontrol) {
262 		if (kcontrol->private_free)
263 			kcontrol->private_free(kcontrol);
264 		kfree(kcontrol);
265 	}
266 }
267 
268 EXPORT_SYMBOL(snd_ctl_free_one);
269 
270 static unsigned int snd_ctl_hole_check(struct snd_card *card,
271 				       unsigned int count)
272 {
273 	struct list_head *list;
274 	struct snd_kcontrol *kctl;
275 
276 	list_for_each(list, &card->controls) {
277 		kctl = snd_kcontrol(list);
278 		if ((kctl->id.numid <= card->last_numid &&
279 		     kctl->id.numid + kctl->count > card->last_numid) ||
280 		    (kctl->id.numid <= card->last_numid + count - 1 &&
281 		     kctl->id.numid + kctl->count > card->last_numid + count - 1))
282 		    	return card->last_numid = kctl->id.numid + kctl->count - 1;
283 	}
284 	return card->last_numid;
285 }
286 
287 static int snd_ctl_find_hole(struct snd_card *card, unsigned int count)
288 {
289 	unsigned int last_numid, iter = 100000;
290 
291 	last_numid = card->last_numid;
292 	while (last_numid != snd_ctl_hole_check(card, count)) {
293 		if (--iter == 0) {
294 			/* this situation is very unlikely */
295 			snd_printk(KERN_ERR "unable to allocate new control numid\n");
296 			return -ENOMEM;
297 		}
298 		last_numid = card->last_numid;
299 	}
300 	return 0;
301 }
302 
303 /**
304  * snd_ctl_add - add the control instance to the card
305  * @card: the card instance
306  * @kcontrol: the control instance to add
307  *
308  * Adds the control instance created via snd_ctl_new() or
309  * snd_ctl_new1() to the given card. Assigns also an unique
310  * numid used for fast search.
311  *
312  * Returns zero if successful, or a negative error code on failure.
313  *
314  * It frees automatically the control which cannot be added.
315  */
316 int snd_ctl_add(struct snd_card *card, struct snd_kcontrol *kcontrol)
317 {
318 	struct snd_ctl_elem_id id;
319 	unsigned int idx;
320 	int err = -EINVAL;
321 
322 	if (! kcontrol)
323 		return err;
324 	snd_assert(card != NULL, goto error);
325 	snd_assert(kcontrol->info != NULL, goto error);
326 	id = kcontrol->id;
327 	down_write(&card->controls_rwsem);
328 	if (snd_ctl_find_id(card, &id)) {
329 		up_write(&card->controls_rwsem);
330 		snd_printd(KERN_ERR "control %i:%i:%i:%s:%i is already present\n",
331 					id.iface,
332 					id.device,
333 					id.subdevice,
334 					id.name,
335 					id.index);
336 		err = -EBUSY;
337 		goto error;
338 	}
339 	if (snd_ctl_find_hole(card, kcontrol->count) < 0) {
340 		up_write(&card->controls_rwsem);
341 		err = -ENOMEM;
342 		goto error;
343 	}
344 	list_add_tail(&kcontrol->list, &card->controls);
345 	card->controls_count += kcontrol->count;
346 	kcontrol->id.numid = card->last_numid + 1;
347 	card->last_numid += kcontrol->count;
348 	up_write(&card->controls_rwsem);
349 	for (idx = 0; idx < kcontrol->count; idx++, id.index++, id.numid++)
350 		snd_ctl_notify(card, SNDRV_CTL_EVENT_MASK_ADD, &id);
351 	return 0;
352 
353  error:
354 	snd_ctl_free_one(kcontrol);
355 	return err;
356 }
357 
358 EXPORT_SYMBOL(snd_ctl_add);
359 
360 /**
361  * snd_ctl_remove - remove the control from the card and release it
362  * @card: the card instance
363  * @kcontrol: the control instance to remove
364  *
365  * Removes the control from the card and then releases the instance.
366  * You don't need to call snd_ctl_free_one(). You must be in
367  * the write lock - down_write(&card->controls_rwsem).
368  *
369  * Returns 0 if successful, or a negative error code on failure.
370  */
371 int snd_ctl_remove(struct snd_card *card, struct snd_kcontrol *kcontrol)
372 {
373 	struct snd_ctl_elem_id id;
374 	unsigned int idx;
375 
376 	snd_assert(card != NULL && kcontrol != NULL, return -EINVAL);
377 	list_del(&kcontrol->list);
378 	card->controls_count -= kcontrol->count;
379 	id = kcontrol->id;
380 	for (idx = 0; idx < kcontrol->count; idx++, id.index++, id.numid++)
381 		snd_ctl_notify(card, SNDRV_CTL_EVENT_MASK_REMOVE, &id);
382 	snd_ctl_free_one(kcontrol);
383 	return 0;
384 }
385 
386 EXPORT_SYMBOL(snd_ctl_remove);
387 
388 /**
389  * snd_ctl_remove_id - remove the control of the given id and release it
390  * @card: the card instance
391  * @id: the control id to remove
392  *
393  * Finds the control instance with the given id, removes it from the
394  * card list and releases it.
395  *
396  * Returns 0 if successful, or a negative error code on failure.
397  */
398 int snd_ctl_remove_id(struct snd_card *card, struct snd_ctl_elem_id *id)
399 {
400 	struct snd_kcontrol *kctl;
401 	int ret;
402 
403 	down_write(&card->controls_rwsem);
404 	kctl = snd_ctl_find_id(card, id);
405 	if (kctl == NULL) {
406 		up_write(&card->controls_rwsem);
407 		return -ENOENT;
408 	}
409 	ret = snd_ctl_remove(card, kctl);
410 	up_write(&card->controls_rwsem);
411 	return ret;
412 }
413 
414 EXPORT_SYMBOL(snd_ctl_remove_id);
415 
416 /**
417  * snd_ctl_remove_unlocked_id - remove the unlocked control of the given id and release it
418  * @file: active control handle
419  * @id: the control id to remove
420  *
421  * Finds the control instance with the given id, removes it from the
422  * card list and releases it.
423  *
424  * Returns 0 if successful, or a negative error code on failure.
425  */
426 static int snd_ctl_remove_unlocked_id(struct snd_ctl_file * file,
427 				      struct snd_ctl_elem_id *id)
428 {
429 	struct snd_card *card = file->card;
430 	struct snd_kcontrol *kctl;
431 	int idx, ret;
432 
433 	down_write(&card->controls_rwsem);
434 	kctl = snd_ctl_find_id(card, id);
435 	if (kctl == NULL) {
436 		up_write(&card->controls_rwsem);
437 		return -ENOENT;
438 	}
439 	for (idx = 0; idx < kctl->count; idx++)
440 		if (kctl->vd[idx].owner != NULL && kctl->vd[idx].owner != file) {
441 			up_write(&card->controls_rwsem);
442 			return -EBUSY;
443 		}
444 	ret = snd_ctl_remove(card, kctl);
445 	up_write(&card->controls_rwsem);
446 	return ret;
447 }
448 
449 /**
450  * snd_ctl_rename_id - replace the id of a control on the card
451  * @card: the card instance
452  * @src_id: the old id
453  * @dst_id: the new id
454  *
455  * Finds the control with the old id from the card, and replaces the
456  * id with the new one.
457  *
458  * Returns zero if successful, or a negative error code on failure.
459  */
460 int snd_ctl_rename_id(struct snd_card *card, struct snd_ctl_elem_id *src_id,
461 		      struct snd_ctl_elem_id *dst_id)
462 {
463 	struct snd_kcontrol *kctl;
464 
465 	down_write(&card->controls_rwsem);
466 	kctl = snd_ctl_find_id(card, src_id);
467 	if (kctl == NULL) {
468 		up_write(&card->controls_rwsem);
469 		return -ENOENT;
470 	}
471 	kctl->id = *dst_id;
472 	kctl->id.numid = card->last_numid + 1;
473 	card->last_numid += kctl->count;
474 	up_write(&card->controls_rwsem);
475 	return 0;
476 }
477 
478 EXPORT_SYMBOL(snd_ctl_rename_id);
479 
480 /**
481  * snd_ctl_find_numid - find the control instance with the given number-id
482  * @card: the card instance
483  * @numid: the number-id to search
484  *
485  * Finds the control instance with the given number-id from the card.
486  *
487  * Returns the pointer of the instance if found, or NULL if not.
488  *
489  * The caller must down card->controls_rwsem before calling this function
490  * (if the race condition can happen).
491  */
492 struct snd_kcontrol *snd_ctl_find_numid(struct snd_card *card, unsigned int numid)
493 {
494 	struct list_head *list;
495 	struct snd_kcontrol *kctl;
496 
497 	snd_assert(card != NULL && numid != 0, return NULL);
498 	list_for_each(list, &card->controls) {
499 		kctl = snd_kcontrol(list);
500 		if (kctl->id.numid <= numid && kctl->id.numid + kctl->count > numid)
501 			return kctl;
502 	}
503 	return NULL;
504 }
505 
506 EXPORT_SYMBOL(snd_ctl_find_numid);
507 
508 /**
509  * snd_ctl_find_id - find the control instance with the given id
510  * @card: the card instance
511  * @id: the id to search
512  *
513  * Finds the control instance with the given id from the card.
514  *
515  * Returns the pointer of the instance if found, or NULL if not.
516  *
517  * The caller must down card->controls_rwsem before calling this function
518  * (if the race condition can happen).
519  */
520 struct snd_kcontrol *snd_ctl_find_id(struct snd_card *card,
521 				     struct snd_ctl_elem_id *id)
522 {
523 	struct list_head *list;
524 	struct snd_kcontrol *kctl;
525 
526 	snd_assert(card != NULL && id != NULL, return NULL);
527 	if (id->numid != 0)
528 		return snd_ctl_find_numid(card, id->numid);
529 	list_for_each(list, &card->controls) {
530 		kctl = snd_kcontrol(list);
531 		if (kctl->id.iface != id->iface)
532 			continue;
533 		if (kctl->id.device != id->device)
534 			continue;
535 		if (kctl->id.subdevice != id->subdevice)
536 			continue;
537 		if (strncmp(kctl->id.name, id->name, sizeof(kctl->id.name)))
538 			continue;
539 		if (kctl->id.index > id->index)
540 			continue;
541 		if (kctl->id.index + kctl->count <= id->index)
542 			continue;
543 		return kctl;
544 	}
545 	return NULL;
546 }
547 
548 EXPORT_SYMBOL(snd_ctl_find_id);
549 
550 static int snd_ctl_card_info(struct snd_card *card, struct snd_ctl_file * ctl,
551 			     unsigned int cmd, void __user *arg)
552 {
553 	struct snd_ctl_card_info *info;
554 
555 	info = kzalloc(sizeof(*info), GFP_KERNEL);
556 	if (! info)
557 		return -ENOMEM;
558 	down_read(&snd_ioctl_rwsem);
559 	info->card = card->number;
560 	strlcpy(info->id, card->id, sizeof(info->id));
561 	strlcpy(info->driver, card->driver, sizeof(info->driver));
562 	strlcpy(info->name, card->shortname, sizeof(info->name));
563 	strlcpy(info->longname, card->longname, sizeof(info->longname));
564 	strlcpy(info->mixername, card->mixername, sizeof(info->mixername));
565 	strlcpy(info->components, card->components, sizeof(info->components));
566 	up_read(&snd_ioctl_rwsem);
567 	if (copy_to_user(arg, info, sizeof(struct snd_ctl_card_info))) {
568 		kfree(info);
569 		return -EFAULT;
570 	}
571 	kfree(info);
572 	return 0;
573 }
574 
575 static int snd_ctl_elem_list(struct snd_card *card,
576 			     struct snd_ctl_elem_list __user *_list)
577 {
578 	struct list_head *plist;
579 	struct snd_ctl_elem_list list;
580 	struct snd_kcontrol *kctl;
581 	struct snd_ctl_elem_id *dst, *id;
582 	unsigned int offset, space, first, jidx;
583 
584 	if (copy_from_user(&list, _list, sizeof(list)))
585 		return -EFAULT;
586 	offset = list.offset;
587 	space = list.space;
588 	first = 0;
589 	/* try limit maximum space */
590 	if (space > 16384)
591 		return -ENOMEM;
592 	if (space > 0) {
593 		/* allocate temporary buffer for atomic operation */
594 		dst = vmalloc(space * sizeof(struct snd_ctl_elem_id));
595 		if (dst == NULL)
596 			return -ENOMEM;
597 		down_read(&card->controls_rwsem);
598 		list.count = card->controls_count;
599 		plist = card->controls.next;
600 		while (plist != &card->controls) {
601 			if (offset == 0)
602 				break;
603 			kctl = snd_kcontrol(plist);
604 			if (offset < kctl->count)
605 				break;
606 			offset -= kctl->count;
607 			plist = plist->next;
608 		}
609 		list.used = 0;
610 		id = dst;
611 		while (space > 0 && plist != &card->controls) {
612 			kctl = snd_kcontrol(plist);
613 			for (jidx = offset; space > 0 && jidx < kctl->count; jidx++) {
614 				snd_ctl_build_ioff(id, kctl, jidx);
615 				id++;
616 				space--;
617 				list.used++;
618 			}
619 			plist = plist->next;
620 			offset = 0;
621 		}
622 		up_read(&card->controls_rwsem);
623 		if (list.used > 0 &&
624 		    copy_to_user(list.pids, dst,
625 				 list.used * sizeof(struct snd_ctl_elem_id))) {
626 			vfree(dst);
627 			return -EFAULT;
628 		}
629 		vfree(dst);
630 	} else {
631 		down_read(&card->controls_rwsem);
632 		list.count = card->controls_count;
633 		up_read(&card->controls_rwsem);
634 	}
635 	if (copy_to_user(_list, &list, sizeof(list)))
636 		return -EFAULT;
637 	return 0;
638 }
639 
640 static int snd_ctl_elem_info(struct snd_ctl_file *ctl,
641 			     struct snd_ctl_elem_info *info)
642 {
643 	struct snd_card *card = ctl->card;
644 	struct snd_kcontrol *kctl;
645 	struct snd_kcontrol_volatile *vd;
646 	unsigned int index_offset;
647 	int result;
648 
649 	down_read(&card->controls_rwsem);
650 	kctl = snd_ctl_find_id(card, &info->id);
651 	if (kctl == NULL) {
652 		up_read(&card->controls_rwsem);
653 		return -ENOENT;
654 	}
655 #ifdef CONFIG_SND_DEBUG
656 	info->access = 0;
657 #endif
658 	result = kctl->info(kctl, info);
659 	if (result >= 0) {
660 		snd_assert(info->access == 0, );
661 		index_offset = snd_ctl_get_ioff(kctl, &info->id);
662 		vd = &kctl->vd[index_offset];
663 		snd_ctl_build_ioff(&info->id, kctl, index_offset);
664 		info->access = vd->access;
665 		if (vd->owner) {
666 			info->access |= SNDRV_CTL_ELEM_ACCESS_LOCK;
667 			if (vd->owner == ctl)
668 				info->access |= SNDRV_CTL_ELEM_ACCESS_OWNER;
669 			info->owner = vd->owner_pid;
670 		} else {
671 			info->owner = -1;
672 		}
673 	}
674 	up_read(&card->controls_rwsem);
675 	return result;
676 }
677 
678 static int snd_ctl_elem_info_user(struct snd_ctl_file *ctl,
679 				  struct snd_ctl_elem_info __user *_info)
680 {
681 	struct snd_ctl_elem_info info;
682 	int result;
683 
684 	if (copy_from_user(&info, _info, sizeof(info)))
685 		return -EFAULT;
686 	snd_power_lock(ctl->card);
687 	result = snd_power_wait(ctl->card, SNDRV_CTL_POWER_D0);
688 	if (result >= 0)
689 		result = snd_ctl_elem_info(ctl, &info);
690 	snd_power_unlock(ctl->card);
691 	if (result >= 0)
692 		if (copy_to_user(_info, &info, sizeof(info)))
693 			return -EFAULT;
694 	return result;
695 }
696 
697 int snd_ctl_elem_read(struct snd_card *card, struct snd_ctl_elem_value *control)
698 {
699 	struct snd_kcontrol *kctl;
700 	struct snd_kcontrol_volatile *vd;
701 	unsigned int index_offset;
702 	int result, indirect;
703 
704 	down_read(&card->controls_rwsem);
705 	kctl = snd_ctl_find_id(card, &control->id);
706 	if (kctl == NULL) {
707 		result = -ENOENT;
708 	} else {
709 		index_offset = snd_ctl_get_ioff(kctl, &control->id);
710 		vd = &kctl->vd[index_offset];
711 		indirect = vd->access & SNDRV_CTL_ELEM_ACCESS_INDIRECT ? 1 : 0;
712 		if (control->indirect != indirect) {
713 			result = -EACCES;
714 		} else {
715 			if ((vd->access & SNDRV_CTL_ELEM_ACCESS_READ) && kctl->get != NULL) {
716 				snd_ctl_build_ioff(&control->id, kctl, index_offset);
717 				result = kctl->get(kctl, control);
718 			} else {
719 				result = -EPERM;
720 			}
721 		}
722 	}
723 	up_read(&card->controls_rwsem);
724 	return result;
725 }
726 
727 EXPORT_SYMBOL(snd_ctl_elem_read);
728 
729 static int snd_ctl_elem_read_user(struct snd_card *card,
730 				  struct snd_ctl_elem_value __user *_control)
731 {
732 	struct snd_ctl_elem_value *control;
733 	int result;
734 
735 	control = kmalloc(sizeof(*control), GFP_KERNEL);
736 	if (control == NULL)
737 		return -ENOMEM;
738 	if (copy_from_user(control, _control, sizeof(*control))) {
739 		kfree(control);
740 		return -EFAULT;
741 	}
742 	snd_power_lock(card);
743 	result = snd_power_wait(card, SNDRV_CTL_POWER_D0);
744 	if (result >= 0)
745 		result = snd_ctl_elem_read(card, control);
746 	snd_power_unlock(card);
747 	if (result >= 0)
748 		if (copy_to_user(_control, control, sizeof(*control)))
749 			result = -EFAULT;
750 	kfree(control);
751 	return result;
752 }
753 
754 int snd_ctl_elem_write(struct snd_card *card, struct snd_ctl_file *file,
755 		       struct snd_ctl_elem_value *control)
756 {
757 	struct snd_kcontrol *kctl;
758 	struct snd_kcontrol_volatile *vd;
759 	unsigned int index_offset;
760 	int result, indirect;
761 
762 	down_read(&card->controls_rwsem);
763 	kctl = snd_ctl_find_id(card, &control->id);
764 	if (kctl == NULL) {
765 		result = -ENOENT;
766 	} else {
767 		index_offset = snd_ctl_get_ioff(kctl, &control->id);
768 		vd = &kctl->vd[index_offset];
769 		indirect = vd->access & SNDRV_CTL_ELEM_ACCESS_INDIRECT ? 1 : 0;
770 		if (control->indirect != indirect) {
771 			result = -EACCES;
772 		} else {
773 			if (!(vd->access & SNDRV_CTL_ELEM_ACCESS_WRITE) ||
774 			    kctl->put == NULL ||
775 			    (file && vd->owner != NULL && vd->owner != file)) {
776 				result = -EPERM;
777 			} else {
778 				snd_ctl_build_ioff(&control->id, kctl, index_offset);
779 				result = kctl->put(kctl, control);
780 			}
781 			if (result > 0) {
782 				up_read(&card->controls_rwsem);
783 				snd_ctl_notify(card, SNDRV_CTL_EVENT_MASK_VALUE, &control->id);
784 				return 0;
785 			}
786 		}
787 	}
788 	up_read(&card->controls_rwsem);
789 	return result;
790 }
791 
792 EXPORT_SYMBOL(snd_ctl_elem_write);
793 
794 static int snd_ctl_elem_write_user(struct snd_ctl_file *file,
795 				   struct snd_ctl_elem_value __user *_control)
796 {
797 	struct snd_ctl_elem_value *control;
798 	struct snd_card *card;
799 	int result;
800 
801 	control = kmalloc(sizeof(*control), GFP_KERNEL);
802 	if (control == NULL)
803 		return -ENOMEM;
804 	if (copy_from_user(control, _control, sizeof(*control))) {
805 		kfree(control);
806 		return -EFAULT;
807 	}
808 	card = file->card;
809 	snd_power_lock(card);
810 	result = snd_power_wait(card, SNDRV_CTL_POWER_D0);
811 	if (result >= 0)
812 		result = snd_ctl_elem_write(card, file, control);
813 	snd_power_unlock(card);
814 	if (result >= 0)
815 		if (copy_to_user(_control, control, sizeof(*control)))
816 			result = -EFAULT;
817 	kfree(control);
818 	return result;
819 }
820 
821 static int snd_ctl_elem_lock(struct snd_ctl_file *file,
822 			     struct snd_ctl_elem_id __user *_id)
823 {
824 	struct snd_card *card = file->card;
825 	struct snd_ctl_elem_id id;
826 	struct snd_kcontrol *kctl;
827 	struct snd_kcontrol_volatile *vd;
828 	int result;
829 
830 	if (copy_from_user(&id, _id, sizeof(id)))
831 		return -EFAULT;
832 	down_write(&card->controls_rwsem);
833 	kctl = snd_ctl_find_id(card, &id);
834 	if (kctl == NULL) {
835 		result = -ENOENT;
836 	} else {
837 		vd = &kctl->vd[snd_ctl_get_ioff(kctl, &id)];
838 		if (vd->owner != NULL)
839 			result = -EBUSY;
840 		else {
841 			vd->owner = file;
842 			vd->owner_pid = current->pid;
843 			result = 0;
844 		}
845 	}
846 	up_write(&card->controls_rwsem);
847 	return result;
848 }
849 
850 static int snd_ctl_elem_unlock(struct snd_ctl_file *file,
851 			       struct snd_ctl_elem_id __user *_id)
852 {
853 	struct snd_card *card = file->card;
854 	struct snd_ctl_elem_id id;
855 	struct snd_kcontrol *kctl;
856 	struct snd_kcontrol_volatile *vd;
857 	int result;
858 
859 	if (copy_from_user(&id, _id, sizeof(id)))
860 		return -EFAULT;
861 	down_write(&card->controls_rwsem);
862 	kctl = snd_ctl_find_id(card, &id);
863 	if (kctl == NULL) {
864 		result = -ENOENT;
865 	} else {
866 		vd = &kctl->vd[snd_ctl_get_ioff(kctl, &id)];
867 		if (vd->owner == NULL)
868 			result = -EINVAL;
869 		else if (vd->owner != file)
870 			result = -EPERM;
871 		else {
872 			vd->owner = NULL;
873 			vd->owner_pid = 0;
874 			result = 0;
875 		}
876 	}
877 	up_write(&card->controls_rwsem);
878 	return result;
879 }
880 
881 struct user_element {
882 	struct snd_ctl_elem_info info;
883 	void *elem_data;		/* element data */
884 	unsigned long elem_data_size;	/* size of element data in bytes */
885 	void *priv_data;		/* private data (like strings for enumerated type) */
886 	unsigned long priv_data_size;	/* size of private data in bytes */
887 };
888 
889 static int snd_ctl_elem_user_info(struct snd_kcontrol *kcontrol,
890 				  struct snd_ctl_elem_info *uinfo)
891 {
892 	struct user_element *ue = kcontrol->private_data;
893 
894 	*uinfo = ue->info;
895 	return 0;
896 }
897 
898 static int snd_ctl_elem_user_get(struct snd_kcontrol *kcontrol,
899 				 struct snd_ctl_elem_value *ucontrol)
900 {
901 	struct user_element *ue = kcontrol->private_data;
902 
903 	memcpy(&ucontrol->value, ue->elem_data, ue->elem_data_size);
904 	return 0;
905 }
906 
907 static int snd_ctl_elem_user_put(struct snd_kcontrol *kcontrol,
908 				 struct snd_ctl_elem_value *ucontrol)
909 {
910 	int change;
911 	struct user_element *ue = kcontrol->private_data;
912 
913 	change = memcmp(&ucontrol->value, ue->elem_data, ue->elem_data_size) != 0;
914 	if (change)
915 		memcpy(ue->elem_data, &ucontrol->value, ue->elem_data_size);
916 	return change;
917 }
918 
919 static void snd_ctl_elem_user_free(struct snd_kcontrol *kcontrol)
920 {
921 	kfree(kcontrol->private_data);
922 }
923 
924 static int snd_ctl_elem_add(struct snd_ctl_file *file,
925 			    struct snd_ctl_elem_info *info, int replace)
926 {
927 	struct snd_card *card = file->card;
928 	struct snd_kcontrol kctl, *_kctl;
929 	unsigned int access;
930 	long private_size;
931 	struct user_element *ue;
932 	int idx, err;
933 
934 	if (card->user_ctl_count >= MAX_USER_CONTROLS)
935 		return -ENOMEM;
936 	if (info->count > 1024)
937 		return -EINVAL;
938 	access = info->access == 0 ? SNDRV_CTL_ELEM_ACCESS_READWRITE :
939 		(info->access & (SNDRV_CTL_ELEM_ACCESS_READWRITE|
940 				 SNDRV_CTL_ELEM_ACCESS_INACTIVE));
941 	info->id.numid = 0;
942 	memset(&kctl, 0, sizeof(kctl));
943 	down_write(&card->controls_rwsem);
944 	_kctl = snd_ctl_find_id(card, &info->id);
945 	err = 0;
946 	if (_kctl) {
947 		if (replace)
948 			err = snd_ctl_remove(card, _kctl);
949 		else
950 			err = -EBUSY;
951 	} else {
952 		if (replace)
953 			err = -ENOENT;
954 	}
955 	up_write(&card->controls_rwsem);
956 	if (err < 0)
957 		return err;
958 	memcpy(&kctl.id, &info->id, sizeof(info->id));
959 	kctl.count = info->owner ? info->owner : 1;
960 	access |= SNDRV_CTL_ELEM_ACCESS_USER;
961 	kctl.info = snd_ctl_elem_user_info;
962 	if (access & SNDRV_CTL_ELEM_ACCESS_READ)
963 		kctl.get = snd_ctl_elem_user_get;
964 	if (access & SNDRV_CTL_ELEM_ACCESS_WRITE)
965 		kctl.put = snd_ctl_elem_user_put;
966 	switch (info->type) {
967 	case SNDRV_CTL_ELEM_TYPE_BOOLEAN:
968 		private_size = sizeof(char);
969 		if (info->count > 128)
970 			return -EINVAL;
971 		break;
972 	case SNDRV_CTL_ELEM_TYPE_INTEGER:
973 		private_size = sizeof(long);
974 		if (info->count > 128)
975 			return -EINVAL;
976 		break;
977 	case SNDRV_CTL_ELEM_TYPE_INTEGER64:
978 		private_size = sizeof(long long);
979 		if (info->count > 64)
980 			return -EINVAL;
981 		break;
982 	case SNDRV_CTL_ELEM_TYPE_BYTES:
983 		private_size = sizeof(unsigned char);
984 		if (info->count > 512)
985 			return -EINVAL;
986 		break;
987 	case SNDRV_CTL_ELEM_TYPE_IEC958:
988 		private_size = sizeof(struct snd_aes_iec958);
989 		if (info->count != 1)
990 			return -EINVAL;
991 		break;
992 	default:
993 		return -EINVAL;
994 	}
995 	private_size *= info->count;
996 	ue = kzalloc(sizeof(struct user_element) + private_size, GFP_KERNEL);
997 	if (ue == NULL)
998 		return -ENOMEM;
999 	ue->info = *info;
1000 	ue->elem_data = (char *)ue + sizeof(*ue);
1001 	ue->elem_data_size = private_size;
1002 	kctl.private_free = snd_ctl_elem_user_free;
1003 	_kctl = snd_ctl_new(&kctl, access);
1004 	if (_kctl == NULL) {
1005 		kfree(ue);
1006 		return -ENOMEM;
1007 	}
1008 	_kctl->private_data = ue;
1009 	for (idx = 0; idx < _kctl->count; idx++)
1010 		_kctl->vd[idx].owner = file;
1011 	err = snd_ctl_add(card, _kctl);
1012 	if (err < 0)
1013 		return err;
1014 
1015 	down_write(&card->controls_rwsem);
1016 	card->user_ctl_count++;
1017 	up_write(&card->controls_rwsem);
1018 
1019 	return 0;
1020 }
1021 
1022 static int snd_ctl_elem_add_user(struct snd_ctl_file *file,
1023 				 struct snd_ctl_elem_info __user *_info, int replace)
1024 {
1025 	struct snd_ctl_elem_info info;
1026 	if (copy_from_user(&info, _info, sizeof(info)))
1027 		return -EFAULT;
1028 	return snd_ctl_elem_add(file, &info, replace);
1029 }
1030 
1031 static int snd_ctl_elem_remove(struct snd_ctl_file *file,
1032 			       struct snd_ctl_elem_id __user *_id)
1033 {
1034 	struct snd_ctl_elem_id id;
1035 	int err;
1036 
1037 	if (copy_from_user(&id, _id, sizeof(id)))
1038 		return -EFAULT;
1039 	err = snd_ctl_remove_unlocked_id(file, &id);
1040 	if (! err) {
1041 		struct snd_card *card = file->card;
1042 		down_write(&card->controls_rwsem);
1043 		card->user_ctl_count--;
1044 		up_write(&card->controls_rwsem);
1045 	}
1046 	return err;
1047 }
1048 
1049 static int snd_ctl_subscribe_events(struct snd_ctl_file *file, int __user *ptr)
1050 {
1051 	int subscribe;
1052 	if (get_user(subscribe, ptr))
1053 		return -EFAULT;
1054 	if (subscribe < 0) {
1055 		subscribe = file->subscribed;
1056 		if (put_user(subscribe, ptr))
1057 			return -EFAULT;
1058 		return 0;
1059 	}
1060 	if (subscribe) {
1061 		file->subscribed = 1;
1062 		return 0;
1063 	} else if (file->subscribed) {
1064 		snd_ctl_empty_read_queue(file);
1065 		file->subscribed = 0;
1066 	}
1067 	return 0;
1068 }
1069 
1070 static long snd_ctl_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
1071 {
1072 	struct snd_ctl_file *ctl;
1073 	struct snd_card *card;
1074 	struct list_head *list;
1075 	struct snd_kctl_ioctl *p;
1076 	void __user *argp = (void __user *)arg;
1077 	int __user *ip = argp;
1078 	int err;
1079 
1080 	ctl = file->private_data;
1081 	card = ctl->card;
1082 	snd_assert(card != NULL, return -ENXIO);
1083 	switch (cmd) {
1084 	case SNDRV_CTL_IOCTL_PVERSION:
1085 		return put_user(SNDRV_CTL_VERSION, ip) ? -EFAULT : 0;
1086 	case SNDRV_CTL_IOCTL_CARD_INFO:
1087 		return snd_ctl_card_info(card, ctl, cmd, argp);
1088 	case SNDRV_CTL_IOCTL_ELEM_LIST:
1089 		return snd_ctl_elem_list(ctl->card, argp);
1090 	case SNDRV_CTL_IOCTL_ELEM_INFO:
1091 		return snd_ctl_elem_info_user(ctl, argp);
1092 	case SNDRV_CTL_IOCTL_ELEM_READ:
1093 		return snd_ctl_elem_read_user(ctl->card, argp);
1094 	case SNDRV_CTL_IOCTL_ELEM_WRITE:
1095 		return snd_ctl_elem_write_user(ctl, argp);
1096 	case SNDRV_CTL_IOCTL_ELEM_LOCK:
1097 		return snd_ctl_elem_lock(ctl, argp);
1098 	case SNDRV_CTL_IOCTL_ELEM_UNLOCK:
1099 		return snd_ctl_elem_unlock(ctl, argp);
1100 	case SNDRV_CTL_IOCTL_ELEM_ADD:
1101 		return snd_ctl_elem_add_user(ctl, argp, 0);
1102 	case SNDRV_CTL_IOCTL_ELEM_REPLACE:
1103 		return snd_ctl_elem_add_user(ctl, argp, 1);
1104 	case SNDRV_CTL_IOCTL_ELEM_REMOVE:
1105 		return snd_ctl_elem_remove(ctl, argp);
1106 	case SNDRV_CTL_IOCTL_SUBSCRIBE_EVENTS:
1107 		return snd_ctl_subscribe_events(ctl, ip);
1108 	case SNDRV_CTL_IOCTL_POWER:
1109 		return -ENOPROTOOPT;
1110 	case SNDRV_CTL_IOCTL_POWER_STATE:
1111 #ifdef CONFIG_PM
1112 		return put_user(card->power_state, ip) ? -EFAULT : 0;
1113 #else
1114 		return put_user(SNDRV_CTL_POWER_D0, ip) ? -EFAULT : 0;
1115 #endif
1116 	}
1117 	down_read(&snd_ioctl_rwsem);
1118 	list_for_each(list, &snd_control_ioctls) {
1119 		p = list_entry(list, struct snd_kctl_ioctl, list);
1120 		err = p->fioctl(card, ctl, cmd, arg);
1121 		if (err != -ENOIOCTLCMD) {
1122 			up_read(&snd_ioctl_rwsem);
1123 			return err;
1124 		}
1125 	}
1126 	up_read(&snd_ioctl_rwsem);
1127 	snd_printdd("unknown ioctl = 0x%x\n", cmd);
1128 	return -ENOTTY;
1129 }
1130 
1131 static ssize_t snd_ctl_read(struct file *file, char __user *buffer,
1132 			    size_t count, loff_t * offset)
1133 {
1134 	struct snd_ctl_file *ctl;
1135 	int err = 0;
1136 	ssize_t result = 0;
1137 
1138 	ctl = file->private_data;
1139 	snd_assert(ctl != NULL && ctl->card != NULL, return -ENXIO);
1140 	if (!ctl->subscribed)
1141 		return -EBADFD;
1142 	if (count < sizeof(struct snd_ctl_event))
1143 		return -EINVAL;
1144 	spin_lock_irq(&ctl->read_lock);
1145 	while (count >= sizeof(struct snd_ctl_event)) {
1146 		struct snd_ctl_event ev;
1147 		struct snd_kctl_event *kev;
1148 		while (list_empty(&ctl->events)) {
1149 			wait_queue_t wait;
1150 			if ((file->f_flags & O_NONBLOCK) != 0 || result > 0) {
1151 				err = -EAGAIN;
1152 				goto __end_lock;
1153 			}
1154 			init_waitqueue_entry(&wait, current);
1155 			add_wait_queue(&ctl->change_sleep, &wait);
1156 			set_current_state(TASK_INTERRUPTIBLE);
1157 			spin_unlock_irq(&ctl->read_lock);
1158 			schedule();
1159 			remove_wait_queue(&ctl->change_sleep, &wait);
1160 			if (signal_pending(current))
1161 				return result > 0 ? result : -ERESTARTSYS;
1162 			spin_lock_irq(&ctl->read_lock);
1163 		}
1164 		kev = snd_kctl_event(ctl->events.next);
1165 		ev.type = SNDRV_CTL_EVENT_ELEM;
1166 		ev.data.elem.mask = kev->mask;
1167 		ev.data.elem.id = kev->id;
1168 		list_del(&kev->list);
1169 		spin_unlock_irq(&ctl->read_lock);
1170 		kfree(kev);
1171 		if (copy_to_user(buffer, &ev, sizeof(struct snd_ctl_event))) {
1172 			err = -EFAULT;
1173 			goto __end;
1174 		}
1175 		spin_lock_irq(&ctl->read_lock);
1176 		buffer += sizeof(struct snd_ctl_event);
1177 		count -= sizeof(struct snd_ctl_event);
1178 		result += sizeof(struct snd_ctl_event);
1179 	}
1180       __end_lock:
1181 	spin_unlock_irq(&ctl->read_lock);
1182       __end:
1183       	return result > 0 ? result : err;
1184 }
1185 
1186 static unsigned int snd_ctl_poll(struct file *file, poll_table * wait)
1187 {
1188 	unsigned int mask;
1189 	struct snd_ctl_file *ctl;
1190 
1191 	ctl = file->private_data;
1192 	if (!ctl->subscribed)
1193 		return 0;
1194 	poll_wait(file, &ctl->change_sleep, wait);
1195 
1196 	mask = 0;
1197 	if (!list_empty(&ctl->events))
1198 		mask |= POLLIN | POLLRDNORM;
1199 
1200 	return mask;
1201 }
1202 
1203 /*
1204  * register the device-specific control-ioctls.
1205  * called from each device manager like pcm.c, hwdep.c, etc.
1206  */
1207 static int _snd_ctl_register_ioctl(snd_kctl_ioctl_func_t fcn, struct list_head *lists)
1208 {
1209 	struct snd_kctl_ioctl *pn;
1210 
1211 	pn = kzalloc(sizeof(struct snd_kctl_ioctl), GFP_KERNEL);
1212 	if (pn == NULL)
1213 		return -ENOMEM;
1214 	pn->fioctl = fcn;
1215 	down_write(&snd_ioctl_rwsem);
1216 	list_add_tail(&pn->list, lists);
1217 	up_write(&snd_ioctl_rwsem);
1218 	return 0;
1219 }
1220 
1221 int snd_ctl_register_ioctl(snd_kctl_ioctl_func_t fcn)
1222 {
1223 	return _snd_ctl_register_ioctl(fcn, &snd_control_ioctls);
1224 }
1225 
1226 EXPORT_SYMBOL(snd_ctl_register_ioctl);
1227 
1228 #ifdef CONFIG_COMPAT
1229 int snd_ctl_register_ioctl_compat(snd_kctl_ioctl_func_t fcn)
1230 {
1231 	return _snd_ctl_register_ioctl(fcn, &snd_control_compat_ioctls);
1232 }
1233 
1234 EXPORT_SYMBOL(snd_ctl_register_ioctl_compat);
1235 #endif
1236 
1237 /*
1238  * de-register the device-specific control-ioctls.
1239  */
1240 static int _snd_ctl_unregister_ioctl(snd_kctl_ioctl_func_t fcn,
1241 				     struct list_head *lists)
1242 {
1243 	struct list_head *list;
1244 	struct snd_kctl_ioctl *p;
1245 
1246 	snd_assert(fcn != NULL, return -EINVAL);
1247 	down_write(&snd_ioctl_rwsem);
1248 	list_for_each(list, lists) {
1249 		p = list_entry(list, struct snd_kctl_ioctl, list);
1250 		if (p->fioctl == fcn) {
1251 			list_del(&p->list);
1252 			up_write(&snd_ioctl_rwsem);
1253 			kfree(p);
1254 			return 0;
1255 		}
1256 	}
1257 	up_write(&snd_ioctl_rwsem);
1258 	snd_BUG();
1259 	return -EINVAL;
1260 }
1261 
1262 int snd_ctl_unregister_ioctl(snd_kctl_ioctl_func_t fcn)
1263 {
1264 	return _snd_ctl_unregister_ioctl(fcn, &snd_control_ioctls);
1265 }
1266 
1267 EXPORT_SYMBOL(snd_ctl_unregister_ioctl);
1268 
1269 #ifdef CONFIG_COMPAT
1270 int snd_ctl_unregister_ioctl_compat(snd_kctl_ioctl_func_t fcn)
1271 {
1272 	return _snd_ctl_unregister_ioctl(fcn, &snd_control_compat_ioctls);
1273 }
1274 
1275 EXPORT_SYMBOL(snd_ctl_unregister_ioctl_compat);
1276 #endif
1277 
1278 static int snd_ctl_fasync(int fd, struct file * file, int on)
1279 {
1280 	struct snd_ctl_file *ctl;
1281 	int err;
1282 	ctl = file->private_data;
1283 	err = fasync_helper(fd, file, on, &ctl->fasync);
1284 	if (err < 0)
1285 		return err;
1286 	return 0;
1287 }
1288 
1289 /*
1290  * ioctl32 compat
1291  */
1292 #ifdef CONFIG_COMPAT
1293 #include "control_compat.c"
1294 #else
1295 #define snd_ctl_ioctl_compat	NULL
1296 #endif
1297 
1298 /*
1299  *  INIT PART
1300  */
1301 
1302 static struct file_operations snd_ctl_f_ops =
1303 {
1304 	.owner =	THIS_MODULE,
1305 	.read =		snd_ctl_read,
1306 	.open =		snd_ctl_open,
1307 	.release =	snd_ctl_release,
1308 	.poll =		snd_ctl_poll,
1309 	.unlocked_ioctl =	snd_ctl_ioctl,
1310 	.compat_ioctl =	snd_ctl_ioctl_compat,
1311 	.fasync =	snd_ctl_fasync,
1312 };
1313 
1314 /*
1315  * registration of the control device
1316  */
1317 static int snd_ctl_dev_register(struct snd_device *device)
1318 {
1319 	struct snd_card *card = device->device_data;
1320 	int err, cardnum;
1321 	char name[16];
1322 
1323 	snd_assert(card != NULL, return -ENXIO);
1324 	cardnum = card->number;
1325 	snd_assert(cardnum >= 0 && cardnum < SNDRV_CARDS, return -ENXIO);
1326 	sprintf(name, "controlC%i", cardnum);
1327 	if ((err = snd_register_device(SNDRV_DEVICE_TYPE_CONTROL, card, -1,
1328 				       &snd_ctl_f_ops, card, name)) < 0)
1329 		return err;
1330 	return 0;
1331 }
1332 
1333 /*
1334  * disconnection of the control device
1335  */
1336 static int snd_ctl_dev_disconnect(struct snd_device *device)
1337 {
1338 	struct snd_card *card = device->device_data;
1339 	struct list_head *flist;
1340 	struct snd_ctl_file *ctl;
1341 
1342 	down_read(&card->controls_rwsem);
1343 	list_for_each(flist, &card->ctl_files) {
1344 		ctl = snd_ctl_file(flist);
1345 		wake_up(&ctl->change_sleep);
1346 		kill_fasync(&ctl->fasync, SIGIO, POLL_ERR);
1347 	}
1348 	up_read(&card->controls_rwsem);
1349 	return 0;
1350 }
1351 
1352 /*
1353  * free all controls
1354  */
1355 static int snd_ctl_dev_free(struct snd_device *device)
1356 {
1357 	struct snd_card *card = device->device_data;
1358 	struct snd_kcontrol *control;
1359 
1360 	down_write(&card->controls_rwsem);
1361 	while (!list_empty(&card->controls)) {
1362 		control = snd_kcontrol(card->controls.next);
1363 		snd_ctl_remove(card, control);
1364 	}
1365 	up_write(&card->controls_rwsem);
1366 	return 0;
1367 }
1368 
1369 /*
1370  * de-registration of the control device
1371  */
1372 static int snd_ctl_dev_unregister(struct snd_device *device)
1373 {
1374 	struct snd_card *card = device->device_data;
1375 	int err, cardnum;
1376 
1377 	snd_assert(card != NULL, return -ENXIO);
1378 	cardnum = card->number;
1379 	snd_assert(cardnum >= 0 && cardnum < SNDRV_CARDS, return -ENXIO);
1380 	if ((err = snd_unregister_device(SNDRV_DEVICE_TYPE_CONTROL,
1381 					 card, -1)) < 0)
1382 		return err;
1383 	return snd_ctl_dev_free(device);
1384 }
1385 
1386 /*
1387  * create control core:
1388  * called from init.c
1389  */
1390 int snd_ctl_create(struct snd_card *card)
1391 {
1392 	static struct snd_device_ops ops = {
1393 		.dev_free = snd_ctl_dev_free,
1394 		.dev_register =	snd_ctl_dev_register,
1395 		.dev_disconnect = snd_ctl_dev_disconnect,
1396 		.dev_unregister = snd_ctl_dev_unregister
1397 	};
1398 
1399 	snd_assert(card != NULL, return -ENXIO);
1400 	return snd_device_new(card, SNDRV_DEV_CONTROL, card, &ops);
1401 }
1402