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 int snd_ctl_elem_read(struct snd_card *card, struct snd_ctl_elem_value *control) 688 { 689 struct snd_kcontrol *kctl; 690 struct snd_kcontrol_volatile *vd; 691 unsigned int index_offset; 692 int result; 693 694 down_read(&card->controls_rwsem); 695 kctl = snd_ctl_find_id(card, &control->id); 696 if (kctl == NULL) { 697 result = -ENOENT; 698 } else { 699 index_offset = snd_ctl_get_ioff(kctl, &control->id); 700 vd = &kctl->vd[index_offset]; 701 if ((vd->access & SNDRV_CTL_ELEM_ACCESS_READ) && 702 kctl->get != NULL) { 703 snd_ctl_build_ioff(&control->id, kctl, index_offset); 704 result = kctl->get(kctl, control); 705 } else 706 result = -EPERM; 707 } 708 up_read(&card->controls_rwsem); 709 return result; 710 } 711 712 static int snd_ctl_elem_read_user(struct snd_card *card, 713 struct snd_ctl_elem_value __user *_control) 714 { 715 struct snd_ctl_elem_value *control; 716 int result; 717 718 control = kmalloc(sizeof(*control), GFP_KERNEL); 719 if (control == NULL) 720 return -ENOMEM; 721 if (copy_from_user(control, _control, sizeof(*control))) { 722 kfree(control); 723 return -EFAULT; 724 } 725 snd_power_lock(card); 726 result = snd_power_wait(card, SNDRV_CTL_POWER_D0); 727 if (result >= 0) 728 result = snd_ctl_elem_read(card, control); 729 snd_power_unlock(card); 730 if (result >= 0) 731 if (copy_to_user(_control, control, sizeof(*control))) 732 result = -EFAULT; 733 kfree(control); 734 return result; 735 } 736 737 int snd_ctl_elem_write(struct snd_card *card, struct snd_ctl_file *file, 738 struct snd_ctl_elem_value *control) 739 { 740 struct snd_kcontrol *kctl; 741 struct snd_kcontrol_volatile *vd; 742 unsigned int index_offset; 743 int result; 744 745 down_read(&card->controls_rwsem); 746 kctl = snd_ctl_find_id(card, &control->id); 747 if (kctl == NULL) { 748 result = -ENOENT; 749 } else { 750 index_offset = snd_ctl_get_ioff(kctl, &control->id); 751 vd = &kctl->vd[index_offset]; 752 if (!(vd->access & SNDRV_CTL_ELEM_ACCESS_WRITE) || 753 kctl->put == NULL || 754 (file && vd->owner && vd->owner != file)) { 755 result = -EPERM; 756 } else { 757 snd_ctl_build_ioff(&control->id, kctl, index_offset); 758 result = kctl->put(kctl, control); 759 } 760 if (result > 0) { 761 up_read(&card->controls_rwsem); 762 snd_ctl_notify(card, SNDRV_CTL_EVENT_MASK_VALUE, 763 &control->id); 764 return 0; 765 } 766 } 767 up_read(&card->controls_rwsem); 768 return result; 769 } 770 771 static int snd_ctl_elem_write_user(struct snd_ctl_file *file, 772 struct snd_ctl_elem_value __user *_control) 773 { 774 struct snd_ctl_elem_value *control; 775 struct snd_card *card; 776 int result; 777 778 control = kmalloc(sizeof(*control), GFP_KERNEL); 779 if (control == NULL) 780 return -ENOMEM; 781 if (copy_from_user(control, _control, sizeof(*control))) { 782 kfree(control); 783 return -EFAULT; 784 } 785 card = file->card; 786 snd_power_lock(card); 787 result = snd_power_wait(card, SNDRV_CTL_POWER_D0); 788 if (result >= 0) 789 result = snd_ctl_elem_write(card, file, control); 790 snd_power_unlock(card); 791 if (result >= 0) 792 if (copy_to_user(_control, control, sizeof(*control))) 793 result = -EFAULT; 794 kfree(control); 795 return result; 796 } 797 798 static int snd_ctl_elem_lock(struct snd_ctl_file *file, 799 struct snd_ctl_elem_id __user *_id) 800 { 801 struct snd_card *card = file->card; 802 struct snd_ctl_elem_id id; 803 struct snd_kcontrol *kctl; 804 struct snd_kcontrol_volatile *vd; 805 int result; 806 807 if (copy_from_user(&id, _id, sizeof(id))) 808 return -EFAULT; 809 down_write(&card->controls_rwsem); 810 kctl = snd_ctl_find_id(card, &id); 811 if (kctl == NULL) { 812 result = -ENOENT; 813 } else { 814 vd = &kctl->vd[snd_ctl_get_ioff(kctl, &id)]; 815 if (vd->owner != NULL) 816 result = -EBUSY; 817 else { 818 vd->owner = file; 819 vd->owner_pid = current->pid; 820 result = 0; 821 } 822 } 823 up_write(&card->controls_rwsem); 824 return result; 825 } 826 827 static int snd_ctl_elem_unlock(struct snd_ctl_file *file, 828 struct snd_ctl_elem_id __user *_id) 829 { 830 struct snd_card *card = file->card; 831 struct snd_ctl_elem_id id; 832 struct snd_kcontrol *kctl; 833 struct snd_kcontrol_volatile *vd; 834 int result; 835 836 if (copy_from_user(&id, _id, sizeof(id))) 837 return -EFAULT; 838 down_write(&card->controls_rwsem); 839 kctl = snd_ctl_find_id(card, &id); 840 if (kctl == NULL) { 841 result = -ENOENT; 842 } else { 843 vd = &kctl->vd[snd_ctl_get_ioff(kctl, &id)]; 844 if (vd->owner == NULL) 845 result = -EINVAL; 846 else if (vd->owner != file) 847 result = -EPERM; 848 else { 849 vd->owner = NULL; 850 vd->owner_pid = 0; 851 result = 0; 852 } 853 } 854 up_write(&card->controls_rwsem); 855 return result; 856 } 857 858 struct user_element { 859 struct snd_ctl_elem_info info; 860 void *elem_data; /* element data */ 861 unsigned long elem_data_size; /* size of element data in bytes */ 862 void *tlv_data; /* TLV data */ 863 unsigned long tlv_data_size; /* TLV data size */ 864 void *priv_data; /* private data (like strings for enumerated type) */ 865 unsigned long priv_data_size; /* size of private data in bytes */ 866 }; 867 868 static int snd_ctl_elem_user_info(struct snd_kcontrol *kcontrol, 869 struct snd_ctl_elem_info *uinfo) 870 { 871 struct user_element *ue = kcontrol->private_data; 872 873 *uinfo = ue->info; 874 return 0; 875 } 876 877 static int snd_ctl_elem_user_get(struct snd_kcontrol *kcontrol, 878 struct snd_ctl_elem_value *ucontrol) 879 { 880 struct user_element *ue = kcontrol->private_data; 881 882 memcpy(&ucontrol->value, ue->elem_data, ue->elem_data_size); 883 return 0; 884 } 885 886 static int snd_ctl_elem_user_put(struct snd_kcontrol *kcontrol, 887 struct snd_ctl_elem_value *ucontrol) 888 { 889 int change; 890 struct user_element *ue = kcontrol->private_data; 891 892 change = memcmp(&ucontrol->value, ue->elem_data, ue->elem_data_size) != 0; 893 if (change) 894 memcpy(ue->elem_data, &ucontrol->value, ue->elem_data_size); 895 return change; 896 } 897 898 static int snd_ctl_elem_user_tlv(struct snd_kcontrol *kcontrol, 899 int op_flag, 900 unsigned int size, 901 unsigned int __user *tlv) 902 { 903 struct user_element *ue = kcontrol->private_data; 904 int change = 0; 905 void *new_data; 906 907 if (op_flag > 0) { 908 if (size > 1024 * 128) /* sane value */ 909 return -EINVAL; 910 new_data = kmalloc(size, GFP_KERNEL); 911 if (new_data == NULL) 912 return -ENOMEM; 913 if (copy_from_user(new_data, tlv, size)) { 914 kfree(new_data); 915 return -EFAULT; 916 } 917 change = ue->tlv_data_size != size; 918 if (!change) 919 change = memcmp(ue->tlv_data, new_data, size); 920 kfree(ue->tlv_data); 921 ue->tlv_data = new_data; 922 ue->tlv_data_size = size; 923 } else { 924 if (! ue->tlv_data_size || ! ue->tlv_data) 925 return -ENXIO; 926 if (size < ue->tlv_data_size) 927 return -ENOSPC; 928 if (copy_to_user(tlv, ue->tlv_data, ue->tlv_data_size)) 929 return -EFAULT; 930 } 931 return change; 932 } 933 934 static void snd_ctl_elem_user_free(struct snd_kcontrol *kcontrol) 935 { 936 struct user_element *ue = kcontrol->private_data; 937 if (ue->tlv_data) 938 kfree(ue->tlv_data); 939 kfree(ue); 940 } 941 942 static int snd_ctl_elem_add(struct snd_ctl_file *file, 943 struct snd_ctl_elem_info *info, int replace) 944 { 945 struct snd_card *card = file->card; 946 struct snd_kcontrol kctl, *_kctl; 947 unsigned int access; 948 long private_size; 949 struct user_element *ue; 950 int idx, err; 951 952 if (card->user_ctl_count >= MAX_USER_CONTROLS) 953 return -ENOMEM; 954 if (info->count > 1024) 955 return -EINVAL; 956 access = info->access == 0 ? SNDRV_CTL_ELEM_ACCESS_READWRITE : 957 (info->access & (SNDRV_CTL_ELEM_ACCESS_READWRITE| 958 SNDRV_CTL_ELEM_ACCESS_INACTIVE| 959 SNDRV_CTL_ELEM_ACCESS_TLV_READWRITE)); 960 info->id.numid = 0; 961 memset(&kctl, 0, sizeof(kctl)); 962 down_write(&card->controls_rwsem); 963 _kctl = snd_ctl_find_id(card, &info->id); 964 err = 0; 965 if (_kctl) { 966 if (replace) 967 err = snd_ctl_remove(card, _kctl); 968 else 969 err = -EBUSY; 970 } else { 971 if (replace) 972 err = -ENOENT; 973 } 974 up_write(&card->controls_rwsem); 975 if (err < 0) 976 return err; 977 memcpy(&kctl.id, &info->id, sizeof(info->id)); 978 kctl.count = info->owner ? info->owner : 1; 979 access |= SNDRV_CTL_ELEM_ACCESS_USER; 980 kctl.info = snd_ctl_elem_user_info; 981 if (access & SNDRV_CTL_ELEM_ACCESS_READ) 982 kctl.get = snd_ctl_elem_user_get; 983 if (access & SNDRV_CTL_ELEM_ACCESS_WRITE) 984 kctl.put = snd_ctl_elem_user_put; 985 if (access & SNDRV_CTL_ELEM_ACCESS_TLV_READWRITE) { 986 kctl.tlv.c = snd_ctl_elem_user_tlv; 987 access |= SNDRV_CTL_ELEM_ACCESS_TLV_CALLBACK; 988 } 989 switch (info->type) { 990 case SNDRV_CTL_ELEM_TYPE_BOOLEAN: 991 case SNDRV_CTL_ELEM_TYPE_INTEGER: 992 private_size = sizeof(long); 993 if (info->count > 128) 994 return -EINVAL; 995 break; 996 case SNDRV_CTL_ELEM_TYPE_INTEGER64: 997 private_size = sizeof(long long); 998 if (info->count > 64) 999 return -EINVAL; 1000 break; 1001 case SNDRV_CTL_ELEM_TYPE_BYTES: 1002 private_size = sizeof(unsigned char); 1003 if (info->count > 512) 1004 return -EINVAL; 1005 break; 1006 case SNDRV_CTL_ELEM_TYPE_IEC958: 1007 private_size = sizeof(struct snd_aes_iec958); 1008 if (info->count != 1) 1009 return -EINVAL; 1010 break; 1011 default: 1012 return -EINVAL; 1013 } 1014 private_size *= info->count; 1015 ue = kzalloc(sizeof(struct user_element) + private_size, GFP_KERNEL); 1016 if (ue == NULL) 1017 return -ENOMEM; 1018 ue->info = *info; 1019 ue->info.access = 0; 1020 ue->elem_data = (char *)ue + sizeof(*ue); 1021 ue->elem_data_size = private_size; 1022 kctl.private_free = snd_ctl_elem_user_free; 1023 _kctl = snd_ctl_new(&kctl, access); 1024 if (_kctl == NULL) { 1025 kfree(ue); 1026 return -ENOMEM; 1027 } 1028 _kctl->private_data = ue; 1029 for (idx = 0; idx < _kctl->count; idx++) 1030 _kctl->vd[idx].owner = file; 1031 err = snd_ctl_add(card, _kctl); 1032 if (err < 0) 1033 return err; 1034 1035 down_write(&card->controls_rwsem); 1036 card->user_ctl_count++; 1037 up_write(&card->controls_rwsem); 1038 1039 return 0; 1040 } 1041 1042 static int snd_ctl_elem_add_user(struct snd_ctl_file *file, 1043 struct snd_ctl_elem_info __user *_info, int replace) 1044 { 1045 struct snd_ctl_elem_info info; 1046 if (copy_from_user(&info, _info, sizeof(info))) 1047 return -EFAULT; 1048 return snd_ctl_elem_add(file, &info, replace); 1049 } 1050 1051 static int snd_ctl_elem_remove(struct snd_ctl_file *file, 1052 struct snd_ctl_elem_id __user *_id) 1053 { 1054 struct snd_ctl_elem_id id; 1055 int err; 1056 1057 if (copy_from_user(&id, _id, sizeof(id))) 1058 return -EFAULT; 1059 err = snd_ctl_remove_unlocked_id(file, &id); 1060 if (! err) { 1061 struct snd_card *card = file->card; 1062 down_write(&card->controls_rwsem); 1063 card->user_ctl_count--; 1064 up_write(&card->controls_rwsem); 1065 } 1066 return err; 1067 } 1068 1069 static int snd_ctl_subscribe_events(struct snd_ctl_file *file, int __user *ptr) 1070 { 1071 int subscribe; 1072 if (get_user(subscribe, ptr)) 1073 return -EFAULT; 1074 if (subscribe < 0) { 1075 subscribe = file->subscribed; 1076 if (put_user(subscribe, ptr)) 1077 return -EFAULT; 1078 return 0; 1079 } 1080 if (subscribe) { 1081 file->subscribed = 1; 1082 return 0; 1083 } else if (file->subscribed) { 1084 snd_ctl_empty_read_queue(file); 1085 file->subscribed = 0; 1086 } 1087 return 0; 1088 } 1089 1090 static int snd_ctl_tlv_ioctl(struct snd_ctl_file *file, 1091 struct snd_ctl_tlv __user *_tlv, 1092 int op_flag) 1093 { 1094 struct snd_card *card = file->card; 1095 struct snd_ctl_tlv tlv; 1096 struct snd_kcontrol *kctl; 1097 struct snd_kcontrol_volatile *vd; 1098 unsigned int len; 1099 int err = 0; 1100 1101 if (copy_from_user(&tlv, _tlv, sizeof(tlv))) 1102 return -EFAULT; 1103 if (tlv.length < sizeof(unsigned int) * 3) 1104 return -EINVAL; 1105 down_read(&card->controls_rwsem); 1106 kctl = snd_ctl_find_numid(card, tlv.numid); 1107 if (kctl == NULL) { 1108 err = -ENOENT; 1109 goto __kctl_end; 1110 } 1111 if (kctl->tlv.p == NULL) { 1112 err = -ENXIO; 1113 goto __kctl_end; 1114 } 1115 vd = &kctl->vd[tlv.numid - kctl->id.numid]; 1116 if ((op_flag == 0 && (vd->access & SNDRV_CTL_ELEM_ACCESS_TLV_READ) == 0) || 1117 (op_flag > 0 && (vd->access & SNDRV_CTL_ELEM_ACCESS_TLV_WRITE) == 0) || 1118 (op_flag < 0 && (vd->access & SNDRV_CTL_ELEM_ACCESS_TLV_COMMAND) == 0)) { 1119 err = -ENXIO; 1120 goto __kctl_end; 1121 } 1122 if (vd->access & SNDRV_CTL_ELEM_ACCESS_TLV_CALLBACK) { 1123 if (file && vd->owner != NULL && vd->owner != file) { 1124 err = -EPERM; 1125 goto __kctl_end; 1126 } 1127 err = kctl->tlv.c(kctl, op_flag, tlv.length, _tlv->tlv); 1128 if (err > 0) { 1129 up_read(&card->controls_rwsem); 1130 snd_ctl_notify(card, SNDRV_CTL_EVENT_MASK_TLV, &kctl->id); 1131 return 0; 1132 } 1133 } else { 1134 if (op_flag) { 1135 err = -ENXIO; 1136 goto __kctl_end; 1137 } 1138 len = kctl->tlv.p[1] + 2 * sizeof(unsigned int); 1139 if (tlv.length < len) { 1140 err = -ENOMEM; 1141 goto __kctl_end; 1142 } 1143 if (copy_to_user(_tlv->tlv, kctl->tlv.p, len)) 1144 err = -EFAULT; 1145 } 1146 __kctl_end: 1147 up_read(&card->controls_rwsem); 1148 return err; 1149 } 1150 1151 static long snd_ctl_ioctl(struct file *file, unsigned int cmd, unsigned long arg) 1152 { 1153 struct snd_ctl_file *ctl; 1154 struct snd_card *card; 1155 struct snd_kctl_ioctl *p; 1156 void __user *argp = (void __user *)arg; 1157 int __user *ip = argp; 1158 int err; 1159 1160 ctl = file->private_data; 1161 card = ctl->card; 1162 snd_assert(card != NULL, return -ENXIO); 1163 switch (cmd) { 1164 case SNDRV_CTL_IOCTL_PVERSION: 1165 return put_user(SNDRV_CTL_VERSION, ip) ? -EFAULT : 0; 1166 case SNDRV_CTL_IOCTL_CARD_INFO: 1167 return snd_ctl_card_info(card, ctl, cmd, argp); 1168 case SNDRV_CTL_IOCTL_ELEM_LIST: 1169 return snd_ctl_elem_list(card, argp); 1170 case SNDRV_CTL_IOCTL_ELEM_INFO: 1171 return snd_ctl_elem_info_user(ctl, argp); 1172 case SNDRV_CTL_IOCTL_ELEM_READ: 1173 return snd_ctl_elem_read_user(card, argp); 1174 case SNDRV_CTL_IOCTL_ELEM_WRITE: 1175 return snd_ctl_elem_write_user(ctl, argp); 1176 case SNDRV_CTL_IOCTL_ELEM_LOCK: 1177 return snd_ctl_elem_lock(ctl, argp); 1178 case SNDRV_CTL_IOCTL_ELEM_UNLOCK: 1179 return snd_ctl_elem_unlock(ctl, argp); 1180 case SNDRV_CTL_IOCTL_ELEM_ADD: 1181 return snd_ctl_elem_add_user(ctl, argp, 0); 1182 case SNDRV_CTL_IOCTL_ELEM_REPLACE: 1183 return snd_ctl_elem_add_user(ctl, argp, 1); 1184 case SNDRV_CTL_IOCTL_ELEM_REMOVE: 1185 return snd_ctl_elem_remove(ctl, argp); 1186 case SNDRV_CTL_IOCTL_SUBSCRIBE_EVENTS: 1187 return snd_ctl_subscribe_events(ctl, ip); 1188 case SNDRV_CTL_IOCTL_TLV_READ: 1189 return snd_ctl_tlv_ioctl(ctl, argp, 0); 1190 case SNDRV_CTL_IOCTL_TLV_WRITE: 1191 return snd_ctl_tlv_ioctl(ctl, argp, 1); 1192 case SNDRV_CTL_IOCTL_TLV_COMMAND: 1193 return snd_ctl_tlv_ioctl(ctl, argp, -1); 1194 case SNDRV_CTL_IOCTL_POWER: 1195 return -ENOPROTOOPT; 1196 case SNDRV_CTL_IOCTL_POWER_STATE: 1197 #ifdef CONFIG_PM 1198 return put_user(card->power_state, ip) ? -EFAULT : 0; 1199 #else 1200 return put_user(SNDRV_CTL_POWER_D0, ip) ? -EFAULT : 0; 1201 #endif 1202 } 1203 down_read(&snd_ioctl_rwsem); 1204 list_for_each_entry(p, &snd_control_ioctls, list) { 1205 err = p->fioctl(card, ctl, cmd, arg); 1206 if (err != -ENOIOCTLCMD) { 1207 up_read(&snd_ioctl_rwsem); 1208 return err; 1209 } 1210 } 1211 up_read(&snd_ioctl_rwsem); 1212 snd_printdd("unknown ioctl = 0x%x\n", cmd); 1213 return -ENOTTY; 1214 } 1215 1216 static ssize_t snd_ctl_read(struct file *file, char __user *buffer, 1217 size_t count, loff_t * offset) 1218 { 1219 struct snd_ctl_file *ctl; 1220 int err = 0; 1221 ssize_t result = 0; 1222 1223 ctl = file->private_data; 1224 snd_assert(ctl != NULL && ctl->card != NULL, return -ENXIO); 1225 if (!ctl->subscribed) 1226 return -EBADFD; 1227 if (count < sizeof(struct snd_ctl_event)) 1228 return -EINVAL; 1229 spin_lock_irq(&ctl->read_lock); 1230 while (count >= sizeof(struct snd_ctl_event)) { 1231 struct snd_ctl_event ev; 1232 struct snd_kctl_event *kev; 1233 while (list_empty(&ctl->events)) { 1234 wait_queue_t wait; 1235 if ((file->f_flags & O_NONBLOCK) != 0 || result > 0) { 1236 err = -EAGAIN; 1237 goto __end_lock; 1238 } 1239 init_waitqueue_entry(&wait, current); 1240 add_wait_queue(&ctl->change_sleep, &wait); 1241 set_current_state(TASK_INTERRUPTIBLE); 1242 spin_unlock_irq(&ctl->read_lock); 1243 schedule(); 1244 remove_wait_queue(&ctl->change_sleep, &wait); 1245 if (signal_pending(current)) 1246 return -ERESTARTSYS; 1247 spin_lock_irq(&ctl->read_lock); 1248 } 1249 kev = snd_kctl_event(ctl->events.next); 1250 ev.type = SNDRV_CTL_EVENT_ELEM; 1251 ev.data.elem.mask = kev->mask; 1252 ev.data.elem.id = kev->id; 1253 list_del(&kev->list); 1254 spin_unlock_irq(&ctl->read_lock); 1255 kfree(kev); 1256 if (copy_to_user(buffer, &ev, sizeof(struct snd_ctl_event))) { 1257 err = -EFAULT; 1258 goto __end; 1259 } 1260 spin_lock_irq(&ctl->read_lock); 1261 buffer += sizeof(struct snd_ctl_event); 1262 count -= sizeof(struct snd_ctl_event); 1263 result += sizeof(struct snd_ctl_event); 1264 } 1265 __end_lock: 1266 spin_unlock_irq(&ctl->read_lock); 1267 __end: 1268 return result > 0 ? result : err; 1269 } 1270 1271 static unsigned int snd_ctl_poll(struct file *file, poll_table * wait) 1272 { 1273 unsigned int mask; 1274 struct snd_ctl_file *ctl; 1275 1276 ctl = file->private_data; 1277 if (!ctl->subscribed) 1278 return 0; 1279 poll_wait(file, &ctl->change_sleep, wait); 1280 1281 mask = 0; 1282 if (!list_empty(&ctl->events)) 1283 mask |= POLLIN | POLLRDNORM; 1284 1285 return mask; 1286 } 1287 1288 /* 1289 * register the device-specific control-ioctls. 1290 * called from each device manager like pcm.c, hwdep.c, etc. 1291 */ 1292 static int _snd_ctl_register_ioctl(snd_kctl_ioctl_func_t fcn, struct list_head *lists) 1293 { 1294 struct snd_kctl_ioctl *pn; 1295 1296 pn = kzalloc(sizeof(struct snd_kctl_ioctl), GFP_KERNEL); 1297 if (pn == NULL) 1298 return -ENOMEM; 1299 pn->fioctl = fcn; 1300 down_write(&snd_ioctl_rwsem); 1301 list_add_tail(&pn->list, lists); 1302 up_write(&snd_ioctl_rwsem); 1303 return 0; 1304 } 1305 1306 int snd_ctl_register_ioctl(snd_kctl_ioctl_func_t fcn) 1307 { 1308 return _snd_ctl_register_ioctl(fcn, &snd_control_ioctls); 1309 } 1310 1311 EXPORT_SYMBOL(snd_ctl_register_ioctl); 1312 1313 #ifdef CONFIG_COMPAT 1314 int snd_ctl_register_ioctl_compat(snd_kctl_ioctl_func_t fcn) 1315 { 1316 return _snd_ctl_register_ioctl(fcn, &snd_control_compat_ioctls); 1317 } 1318 1319 EXPORT_SYMBOL(snd_ctl_register_ioctl_compat); 1320 #endif 1321 1322 /* 1323 * de-register the device-specific control-ioctls. 1324 */ 1325 static int _snd_ctl_unregister_ioctl(snd_kctl_ioctl_func_t fcn, 1326 struct list_head *lists) 1327 { 1328 struct snd_kctl_ioctl *p; 1329 1330 snd_assert(fcn != NULL, return -EINVAL); 1331 down_write(&snd_ioctl_rwsem); 1332 list_for_each_entry(p, lists, list) { 1333 if (p->fioctl == fcn) { 1334 list_del(&p->list); 1335 up_write(&snd_ioctl_rwsem); 1336 kfree(p); 1337 return 0; 1338 } 1339 } 1340 up_write(&snd_ioctl_rwsem); 1341 snd_BUG(); 1342 return -EINVAL; 1343 } 1344 1345 int snd_ctl_unregister_ioctl(snd_kctl_ioctl_func_t fcn) 1346 { 1347 return _snd_ctl_unregister_ioctl(fcn, &snd_control_ioctls); 1348 } 1349 1350 EXPORT_SYMBOL(snd_ctl_unregister_ioctl); 1351 1352 #ifdef CONFIG_COMPAT 1353 int snd_ctl_unregister_ioctl_compat(snd_kctl_ioctl_func_t fcn) 1354 { 1355 return _snd_ctl_unregister_ioctl(fcn, &snd_control_compat_ioctls); 1356 } 1357 1358 EXPORT_SYMBOL(snd_ctl_unregister_ioctl_compat); 1359 #endif 1360 1361 static int snd_ctl_fasync(int fd, struct file * file, int on) 1362 { 1363 struct snd_ctl_file *ctl; 1364 int err; 1365 ctl = file->private_data; 1366 err = fasync_helper(fd, file, on, &ctl->fasync); 1367 if (err < 0) 1368 return err; 1369 return 0; 1370 } 1371 1372 /* 1373 * ioctl32 compat 1374 */ 1375 #ifdef CONFIG_COMPAT 1376 #include "control_compat.c" 1377 #else 1378 #define snd_ctl_ioctl_compat NULL 1379 #endif 1380 1381 /* 1382 * INIT PART 1383 */ 1384 1385 static const struct file_operations snd_ctl_f_ops = 1386 { 1387 .owner = THIS_MODULE, 1388 .read = snd_ctl_read, 1389 .open = snd_ctl_open, 1390 .release = snd_ctl_release, 1391 .poll = snd_ctl_poll, 1392 .unlocked_ioctl = snd_ctl_ioctl, 1393 .compat_ioctl = snd_ctl_ioctl_compat, 1394 .fasync = snd_ctl_fasync, 1395 }; 1396 1397 /* 1398 * registration of the control device 1399 */ 1400 static int snd_ctl_dev_register(struct snd_device *device) 1401 { 1402 struct snd_card *card = device->device_data; 1403 int err, cardnum; 1404 char name[16]; 1405 1406 snd_assert(card != NULL, return -ENXIO); 1407 cardnum = card->number; 1408 snd_assert(cardnum >= 0 && cardnum < SNDRV_CARDS, return -ENXIO); 1409 sprintf(name, "controlC%i", cardnum); 1410 if ((err = snd_register_device(SNDRV_DEVICE_TYPE_CONTROL, card, -1, 1411 &snd_ctl_f_ops, card, name)) < 0) 1412 return err; 1413 return 0; 1414 } 1415 1416 /* 1417 * disconnection of the control device 1418 */ 1419 static int snd_ctl_dev_disconnect(struct snd_device *device) 1420 { 1421 struct snd_card *card = device->device_data; 1422 struct snd_ctl_file *ctl; 1423 int err, cardnum; 1424 1425 snd_assert(card != NULL, return -ENXIO); 1426 cardnum = card->number; 1427 snd_assert(cardnum >= 0 && cardnum < SNDRV_CARDS, return -ENXIO); 1428 1429 down_read(&card->controls_rwsem); 1430 list_for_each_entry(ctl, &card->ctl_files, list) { 1431 wake_up(&ctl->change_sleep); 1432 kill_fasync(&ctl->fasync, SIGIO, POLL_ERR); 1433 } 1434 up_read(&card->controls_rwsem); 1435 1436 if ((err = snd_unregister_device(SNDRV_DEVICE_TYPE_CONTROL, 1437 card, -1)) < 0) 1438 return err; 1439 return 0; 1440 } 1441 1442 /* 1443 * free all controls 1444 */ 1445 static int snd_ctl_dev_free(struct snd_device *device) 1446 { 1447 struct snd_card *card = device->device_data; 1448 struct snd_kcontrol *control; 1449 1450 down_write(&card->controls_rwsem); 1451 while (!list_empty(&card->controls)) { 1452 control = snd_kcontrol(card->controls.next); 1453 snd_ctl_remove(card, control); 1454 } 1455 up_write(&card->controls_rwsem); 1456 return 0; 1457 } 1458 1459 /* 1460 * create control core: 1461 * called from init.c 1462 */ 1463 int snd_ctl_create(struct snd_card *card) 1464 { 1465 static struct snd_device_ops ops = { 1466 .dev_free = snd_ctl_dev_free, 1467 .dev_register = snd_ctl_dev_register, 1468 .dev_disconnect = snd_ctl_dev_disconnect, 1469 }; 1470 1471 snd_assert(card != NULL, return -ENXIO); 1472 return snd_device_new(card, SNDRV_DEV_CONTROL, card, &ops); 1473 } 1474 1475 /* 1476 * Frequently used control callbacks 1477 */ 1478 int snd_ctl_boolean_mono_info(struct snd_kcontrol *kcontrol, 1479 struct snd_ctl_elem_info *uinfo) 1480 { 1481 uinfo->type = SNDRV_CTL_ELEM_TYPE_BOOLEAN; 1482 uinfo->count = 1; 1483 uinfo->value.integer.min = 0; 1484 uinfo->value.integer.max = 1; 1485 return 0; 1486 } 1487 1488 EXPORT_SYMBOL(snd_ctl_boolean_mono_info); 1489 1490 int snd_ctl_boolean_stereo_info(struct snd_kcontrol *kcontrol, 1491 struct snd_ctl_elem_info *uinfo) 1492 { 1493 uinfo->type = SNDRV_CTL_ELEM_TYPE_BOOLEAN; 1494 uinfo->count = 2; 1495 uinfo->value.integer.min = 0; 1496 uinfo->value.integer.max = 1; 1497 return 0; 1498 } 1499 1500 EXPORT_SYMBOL(snd_ctl_boolean_stereo_info); 1501