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