1 /* 2 * Initialization routines 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/init.h> 23 #include <linux/sched.h> 24 #include <linux/module.h> 25 #include <linux/device.h> 26 #include <linux/file.h> 27 #include <linux/slab.h> 28 #include <linux/time.h> 29 #include <linux/ctype.h> 30 #include <linux/pm.h> 31 32 #include <sound/core.h> 33 #include <sound/control.h> 34 #include <sound/info.h> 35 36 /* monitor files for graceful shutdown (hotplug) */ 37 struct snd_monitor_file { 38 struct file *file; 39 const struct file_operations *disconnected_f_op; 40 struct list_head shutdown_list; /* still need to shutdown */ 41 struct list_head list; /* link of monitor files */ 42 }; 43 44 static DEFINE_SPINLOCK(shutdown_lock); 45 static LIST_HEAD(shutdown_files); 46 47 static const struct file_operations snd_shutdown_f_ops; 48 49 /* locked for registering/using */ 50 static DECLARE_BITMAP(snd_cards_lock, SNDRV_CARDS); 51 struct snd_card *snd_cards[SNDRV_CARDS]; 52 EXPORT_SYMBOL(snd_cards); 53 54 static DEFINE_MUTEX(snd_card_mutex); 55 56 static char *slots[SNDRV_CARDS]; 57 module_param_array(slots, charp, NULL, 0444); 58 MODULE_PARM_DESC(slots, "Module names assigned to the slots."); 59 60 /* return non-zero if the given index is reserved for the given 61 * module via slots option 62 */ 63 static int module_slot_match(struct module *module, int idx) 64 { 65 int match = 1; 66 #ifdef MODULE 67 const char *s1, *s2; 68 69 if (!module || !*module->name || !slots[idx]) 70 return 0; 71 72 s1 = module->name; 73 s2 = slots[idx]; 74 if (*s2 == '!') { 75 match = 0; /* negative match */ 76 s2++; 77 } 78 /* compare module name strings 79 * hyphens are handled as equivalent with underscore 80 */ 81 for (;;) { 82 char c1 = *s1++; 83 char c2 = *s2++; 84 if (c1 == '-') 85 c1 = '_'; 86 if (c2 == '-') 87 c2 = '_'; 88 if (c1 != c2) 89 return !match; 90 if (!c1) 91 break; 92 } 93 #endif /* MODULE */ 94 return match; 95 } 96 97 #if IS_ENABLED(CONFIG_SND_MIXER_OSS) 98 int (*snd_mixer_oss_notify_callback)(struct snd_card *card, int free_flag); 99 EXPORT_SYMBOL(snd_mixer_oss_notify_callback); 100 #endif 101 102 #ifdef CONFIG_PROC_FS 103 static void snd_card_id_read(struct snd_info_entry *entry, 104 struct snd_info_buffer *buffer) 105 { 106 snd_iprintf(buffer, "%s\n", entry->card->id); 107 } 108 109 static inline int init_info_for_card(struct snd_card *card) 110 { 111 int err; 112 struct snd_info_entry *entry; 113 114 if ((err = snd_info_card_register(card)) < 0) { 115 snd_printd("unable to create card info\n"); 116 return err; 117 } 118 if ((entry = snd_info_create_card_entry(card, "id", card->proc_root)) == NULL) { 119 snd_printd("unable to create card entry\n"); 120 return err; 121 } 122 entry->c.text.read = snd_card_id_read; 123 if (snd_info_register(entry) < 0) { 124 snd_info_free_entry(entry); 125 entry = NULL; 126 } 127 card->proc_id = entry; 128 return 0; 129 } 130 #else /* !CONFIG_PROC_FS */ 131 #define init_info_for_card(card) 132 #endif 133 134 static int check_empty_slot(struct module *module, int slot) 135 { 136 return !slots[slot] || !*slots[slot]; 137 } 138 139 /* return an empty slot number (>= 0) found in the given bitmask @mask. 140 * @mask == -1 == 0xffffffff means: take any free slot up to 32 141 * when no slot is available, return the original @mask as is. 142 */ 143 static int get_slot_from_bitmask(int mask, int (*check)(struct module *, int), 144 struct module *module) 145 { 146 int slot; 147 148 for (slot = 0; slot < SNDRV_CARDS; slot++) { 149 if (slot < 32 && !(mask & (1U << slot))) 150 continue; 151 if (!test_bit(slot, snd_cards_lock)) { 152 if (check(module, slot)) 153 return slot; /* found */ 154 } 155 } 156 return mask; /* unchanged */ 157 } 158 159 /** 160 * snd_card_new - create and initialize a soundcard structure 161 * @parent: the parent device object 162 * @idx: card index (address) [0 ... (SNDRV_CARDS-1)] 163 * @xid: card identification (ASCII string) 164 * @module: top level module for locking 165 * @extra_size: allocate this extra size after the main soundcard structure 166 * @card_ret: the pointer to store the created card instance 167 * 168 * Creates and initializes a soundcard structure. 169 * 170 * The function allocates snd_card instance via kzalloc with the given 171 * space for the driver to use freely. The allocated struct is stored 172 * in the given card_ret pointer. 173 * 174 * Return: Zero if successful or a negative error code. 175 */ 176 int snd_card_new(struct device *parent, int idx, const char *xid, 177 struct module *module, int extra_size, 178 struct snd_card **card_ret) 179 { 180 struct snd_card *card; 181 int err; 182 183 if (snd_BUG_ON(!card_ret)) 184 return -EINVAL; 185 *card_ret = NULL; 186 187 if (extra_size < 0) 188 extra_size = 0; 189 card = kzalloc(sizeof(*card) + extra_size, GFP_KERNEL); 190 if (!card) 191 return -ENOMEM; 192 if (xid) 193 strlcpy(card->id, xid, sizeof(card->id)); 194 err = 0; 195 mutex_lock(&snd_card_mutex); 196 if (idx < 0) /* first check the matching module-name slot */ 197 idx = get_slot_from_bitmask(idx, module_slot_match, module); 198 if (idx < 0) /* if not matched, assign an empty slot */ 199 idx = get_slot_from_bitmask(idx, check_empty_slot, module); 200 if (idx < 0) 201 err = -ENODEV; 202 else if (idx < snd_ecards_limit) { 203 if (test_bit(idx, snd_cards_lock)) 204 err = -EBUSY; /* invalid */ 205 } else if (idx >= SNDRV_CARDS) 206 err = -ENODEV; 207 if (err < 0) { 208 mutex_unlock(&snd_card_mutex); 209 snd_printk(KERN_ERR "cannot find the slot for index %d (range 0-%i), error: %d\n", 210 idx, snd_ecards_limit - 1, err); 211 goto __error; 212 } 213 set_bit(idx, snd_cards_lock); /* lock it */ 214 if (idx >= snd_ecards_limit) 215 snd_ecards_limit = idx + 1; /* increase the limit */ 216 mutex_unlock(&snd_card_mutex); 217 card->dev = parent; 218 card->number = idx; 219 card->module = module; 220 INIT_LIST_HEAD(&card->devices); 221 init_rwsem(&card->controls_rwsem); 222 rwlock_init(&card->ctl_files_rwlock); 223 INIT_LIST_HEAD(&card->controls); 224 INIT_LIST_HEAD(&card->ctl_files); 225 spin_lock_init(&card->files_lock); 226 INIT_LIST_HEAD(&card->files_list); 227 init_waitqueue_head(&card->shutdown_sleep); 228 atomic_set(&card->refcount, 0); 229 #ifdef CONFIG_PM 230 mutex_init(&card->power_lock); 231 init_waitqueue_head(&card->power_sleep); 232 #endif 233 /* the control interface cannot be accessed from the user space until */ 234 /* snd_cards_bitmask and snd_cards are set with snd_card_register */ 235 err = snd_ctl_create(card); 236 if (err < 0) { 237 snd_printk(KERN_ERR "unable to register control minors\n"); 238 goto __error; 239 } 240 err = snd_info_card_create(card); 241 if (err < 0) { 242 snd_printk(KERN_ERR "unable to create card info\n"); 243 goto __error_ctl; 244 } 245 if (extra_size > 0) 246 card->private_data = (char *)card + sizeof(struct snd_card); 247 *card_ret = card; 248 return 0; 249 250 __error_ctl: 251 snd_device_free_all(card, SNDRV_DEV_CMD_PRE); 252 __error: 253 kfree(card); 254 return err; 255 } 256 EXPORT_SYMBOL(snd_card_new); 257 258 /* return non-zero if a card is already locked */ 259 int snd_card_locked(int card) 260 { 261 int locked; 262 263 mutex_lock(&snd_card_mutex); 264 locked = test_bit(card, snd_cards_lock); 265 mutex_unlock(&snd_card_mutex); 266 return locked; 267 } 268 269 static loff_t snd_disconnect_llseek(struct file *file, loff_t offset, int orig) 270 { 271 return -ENODEV; 272 } 273 274 static ssize_t snd_disconnect_read(struct file *file, char __user *buf, 275 size_t count, loff_t *offset) 276 { 277 return -ENODEV; 278 } 279 280 static ssize_t snd_disconnect_write(struct file *file, const char __user *buf, 281 size_t count, loff_t *offset) 282 { 283 return -ENODEV; 284 } 285 286 static int snd_disconnect_release(struct inode *inode, struct file *file) 287 { 288 struct snd_monitor_file *df = NULL, *_df; 289 290 spin_lock(&shutdown_lock); 291 list_for_each_entry(_df, &shutdown_files, shutdown_list) { 292 if (_df->file == file) { 293 df = _df; 294 list_del_init(&df->shutdown_list); 295 break; 296 } 297 } 298 spin_unlock(&shutdown_lock); 299 300 if (likely(df)) { 301 if ((file->f_flags & FASYNC) && df->disconnected_f_op->fasync) 302 df->disconnected_f_op->fasync(-1, file, 0); 303 return df->disconnected_f_op->release(inode, file); 304 } 305 306 panic("%s(%p, %p) failed!", __func__, inode, file); 307 } 308 309 static unsigned int snd_disconnect_poll(struct file * file, poll_table * wait) 310 { 311 return POLLERR | POLLNVAL; 312 } 313 314 static long snd_disconnect_ioctl(struct file *file, 315 unsigned int cmd, unsigned long arg) 316 { 317 return -ENODEV; 318 } 319 320 static int snd_disconnect_mmap(struct file *file, struct vm_area_struct *vma) 321 { 322 return -ENODEV; 323 } 324 325 static int snd_disconnect_fasync(int fd, struct file *file, int on) 326 { 327 return -ENODEV; 328 } 329 330 static const struct file_operations snd_shutdown_f_ops = 331 { 332 .owner = THIS_MODULE, 333 .llseek = snd_disconnect_llseek, 334 .read = snd_disconnect_read, 335 .write = snd_disconnect_write, 336 .release = snd_disconnect_release, 337 .poll = snd_disconnect_poll, 338 .unlocked_ioctl = snd_disconnect_ioctl, 339 #ifdef CONFIG_COMPAT 340 .compat_ioctl = snd_disconnect_ioctl, 341 #endif 342 .mmap = snd_disconnect_mmap, 343 .fasync = snd_disconnect_fasync 344 }; 345 346 /** 347 * snd_card_disconnect - disconnect all APIs from the file-operations (user space) 348 * @card: soundcard structure 349 * 350 * Disconnects all APIs from the file-operations (user space). 351 * 352 * Return: Zero, otherwise a negative error code. 353 * 354 * Note: The current implementation replaces all active file->f_op with special 355 * dummy file operations (they do nothing except release). 356 */ 357 int snd_card_disconnect(struct snd_card *card) 358 { 359 struct snd_monitor_file *mfile; 360 int err; 361 362 if (!card) 363 return -EINVAL; 364 365 spin_lock(&card->files_lock); 366 if (card->shutdown) { 367 spin_unlock(&card->files_lock); 368 return 0; 369 } 370 card->shutdown = 1; 371 spin_unlock(&card->files_lock); 372 373 /* phase 1: disable fops (user space) operations for ALSA API */ 374 mutex_lock(&snd_card_mutex); 375 snd_cards[card->number] = NULL; 376 clear_bit(card->number, snd_cards_lock); 377 mutex_unlock(&snd_card_mutex); 378 379 /* phase 2: replace file->f_op with special dummy operations */ 380 381 spin_lock(&card->files_lock); 382 list_for_each_entry(mfile, &card->files_list, list) { 383 /* it's critical part, use endless loop */ 384 /* we have no room to fail */ 385 mfile->disconnected_f_op = mfile->file->f_op; 386 387 spin_lock(&shutdown_lock); 388 list_add(&mfile->shutdown_list, &shutdown_files); 389 spin_unlock(&shutdown_lock); 390 391 mfile->file->f_op = &snd_shutdown_f_ops; 392 fops_get(mfile->file->f_op); 393 } 394 spin_unlock(&card->files_lock); 395 396 /* phase 3: notify all connected devices about disconnection */ 397 /* at this point, they cannot respond to any calls except release() */ 398 399 #if IS_ENABLED(CONFIG_SND_MIXER_OSS) 400 if (snd_mixer_oss_notify_callback) 401 snd_mixer_oss_notify_callback(card, SND_MIXER_OSS_NOTIFY_DISCONNECT); 402 #endif 403 404 /* notify all devices that we are disconnected */ 405 err = snd_device_disconnect_all(card); 406 if (err < 0) 407 snd_printk(KERN_ERR "not all devices for card %i can be disconnected\n", card->number); 408 409 snd_info_card_disconnect(card); 410 if (card->card_dev) { 411 device_unregister(card->card_dev); 412 card->card_dev = NULL; 413 } 414 #ifdef CONFIG_PM 415 wake_up(&card->power_sleep); 416 #endif 417 return 0; 418 } 419 420 EXPORT_SYMBOL(snd_card_disconnect); 421 422 /** 423 * snd_card_free - frees given soundcard structure 424 * @card: soundcard structure 425 * 426 * This function releases the soundcard structure and the all assigned 427 * devices automatically. That is, you don't have to release the devices 428 * by yourself. 429 * 430 * Return: Zero. Frees all associated devices and frees the control 431 * interface associated to given soundcard. 432 */ 433 static int snd_card_do_free(struct snd_card *card) 434 { 435 #if IS_ENABLED(CONFIG_SND_MIXER_OSS) 436 if (snd_mixer_oss_notify_callback) 437 snd_mixer_oss_notify_callback(card, SND_MIXER_OSS_NOTIFY_FREE); 438 #endif 439 if (snd_device_free_all(card, SNDRV_DEV_CMD_PRE) < 0) { 440 snd_printk(KERN_ERR "unable to free all devices (pre)\n"); 441 /* Fatal, but this situation should never occur */ 442 } 443 if (snd_device_free_all(card, SNDRV_DEV_CMD_NORMAL) < 0) { 444 snd_printk(KERN_ERR "unable to free all devices (normal)\n"); 445 /* Fatal, but this situation should never occur */ 446 } 447 if (snd_device_free_all(card, SNDRV_DEV_CMD_POST) < 0) { 448 snd_printk(KERN_ERR "unable to free all devices (post)\n"); 449 /* Fatal, but this situation should never occur */ 450 } 451 if (card->private_free) 452 card->private_free(card); 453 snd_info_free_entry(card->proc_id); 454 if (snd_info_card_free(card) < 0) { 455 snd_printk(KERN_WARNING "unable to free card info\n"); 456 /* Not fatal error */ 457 } 458 kfree(card); 459 return 0; 460 } 461 462 /** 463 * snd_card_unref - release the reference counter 464 * @card: the card instance 465 * 466 * Decrements the reference counter. When it reaches to zero, wake up 467 * the sleeper and call the destructor if needed. 468 */ 469 void snd_card_unref(struct snd_card *card) 470 { 471 if (atomic_dec_and_test(&card->refcount)) { 472 wake_up(&card->shutdown_sleep); 473 if (card->free_on_last_close) 474 snd_card_do_free(card); 475 } 476 } 477 EXPORT_SYMBOL(snd_card_unref); 478 479 int snd_card_free_when_closed(struct snd_card *card) 480 { 481 int ret; 482 483 atomic_inc(&card->refcount); 484 ret = snd_card_disconnect(card); 485 if (ret) { 486 atomic_dec(&card->refcount); 487 return ret; 488 } 489 490 card->free_on_last_close = 1; 491 if (atomic_dec_and_test(&card->refcount)) 492 snd_card_do_free(card); 493 return 0; 494 } 495 496 EXPORT_SYMBOL(snd_card_free_when_closed); 497 498 int snd_card_free(struct snd_card *card) 499 { 500 int ret = snd_card_disconnect(card); 501 if (ret) 502 return ret; 503 504 /* wait, until all devices are ready for the free operation */ 505 wait_event(card->shutdown_sleep, !atomic_read(&card->refcount)); 506 snd_card_do_free(card); 507 return 0; 508 } 509 510 EXPORT_SYMBOL(snd_card_free); 511 512 /* retrieve the last word of shortname or longname */ 513 static const char *retrieve_id_from_card_name(const char *name) 514 { 515 const char *spos = name; 516 517 while (*name) { 518 if (isspace(*name) && isalnum(name[1])) 519 spos = name + 1; 520 name++; 521 } 522 return spos; 523 } 524 525 /* return true if the given id string doesn't conflict any other card ids */ 526 static bool card_id_ok(struct snd_card *card, const char *id) 527 { 528 int i; 529 if (!snd_info_check_reserved_words(id)) 530 return false; 531 for (i = 0; i < snd_ecards_limit; i++) { 532 if (snd_cards[i] && snd_cards[i] != card && 533 !strcmp(snd_cards[i]->id, id)) 534 return false; 535 } 536 return true; 537 } 538 539 /* copy to card->id only with valid letters from nid */ 540 static void copy_valid_id_string(struct snd_card *card, const char *src, 541 const char *nid) 542 { 543 char *id = card->id; 544 545 while (*nid && !isalnum(*nid)) 546 nid++; 547 if (isdigit(*nid)) 548 *id++ = isalpha(*src) ? *src : 'D'; 549 while (*nid && (size_t)(id - card->id) < sizeof(card->id) - 1) { 550 if (isalnum(*nid)) 551 *id++ = *nid; 552 nid++; 553 } 554 *id = 0; 555 } 556 557 /* Set card->id from the given string 558 * If the string conflicts with other ids, add a suffix to make it unique. 559 */ 560 static void snd_card_set_id_no_lock(struct snd_card *card, const char *src, 561 const char *nid) 562 { 563 int len, loops; 564 bool is_default = false; 565 char *id; 566 567 copy_valid_id_string(card, src, nid); 568 id = card->id; 569 570 again: 571 /* use "Default" for obviously invalid strings 572 * ("card" conflicts with proc directories) 573 */ 574 if (!*id || !strncmp(id, "card", 4)) { 575 strcpy(id, "Default"); 576 is_default = true; 577 } 578 579 len = strlen(id); 580 for (loops = 0; loops < SNDRV_CARDS; loops++) { 581 char *spos; 582 char sfxstr[5]; /* "_012" */ 583 int sfxlen; 584 585 if (card_id_ok(card, id)) 586 return; /* OK */ 587 588 /* Add _XYZ suffix */ 589 sprintf(sfxstr, "_%X", loops + 1); 590 sfxlen = strlen(sfxstr); 591 if (len + sfxlen >= sizeof(card->id)) 592 spos = id + sizeof(card->id) - sfxlen - 1; 593 else 594 spos = id + len; 595 strcpy(spos, sfxstr); 596 } 597 /* fallback to the default id */ 598 if (!is_default) { 599 *id = 0; 600 goto again; 601 } 602 /* last resort... */ 603 snd_printk(KERN_ERR "unable to set card id (%s)\n", id); 604 if (card->proc_root->name) 605 strlcpy(card->id, card->proc_root->name, sizeof(card->id)); 606 } 607 608 /** 609 * snd_card_set_id - set card identification name 610 * @card: soundcard structure 611 * @nid: new identification string 612 * 613 * This function sets the card identification and checks for name 614 * collisions. 615 */ 616 void snd_card_set_id(struct snd_card *card, const char *nid) 617 { 618 /* check if user specified own card->id */ 619 if (card->id[0] != '\0') 620 return; 621 mutex_lock(&snd_card_mutex); 622 snd_card_set_id_no_lock(card, nid, nid); 623 mutex_unlock(&snd_card_mutex); 624 } 625 EXPORT_SYMBOL(snd_card_set_id); 626 627 static ssize_t 628 card_id_show_attr(struct device *dev, 629 struct device_attribute *attr, char *buf) 630 { 631 struct snd_card *card = dev_get_drvdata(dev); 632 return snprintf(buf, PAGE_SIZE, "%s\n", card ? card->id : "(null)"); 633 } 634 635 static ssize_t 636 card_id_store_attr(struct device *dev, struct device_attribute *attr, 637 const char *buf, size_t count) 638 { 639 struct snd_card *card = dev_get_drvdata(dev); 640 char buf1[sizeof(card->id)]; 641 size_t copy = count > sizeof(card->id) - 1 ? 642 sizeof(card->id) - 1 : count; 643 size_t idx; 644 int c; 645 646 for (idx = 0; idx < copy; idx++) { 647 c = buf[idx]; 648 if (!isalnum(c) && c != '_' && c != '-') 649 return -EINVAL; 650 } 651 memcpy(buf1, buf, copy); 652 buf1[copy] = '\0'; 653 mutex_lock(&snd_card_mutex); 654 if (!card_id_ok(NULL, buf1)) { 655 mutex_unlock(&snd_card_mutex); 656 return -EEXIST; 657 } 658 strcpy(card->id, buf1); 659 snd_info_card_id_change(card); 660 mutex_unlock(&snd_card_mutex); 661 662 return count; 663 } 664 665 static struct device_attribute card_id_attrs = 666 __ATTR(id, S_IRUGO | S_IWUSR, card_id_show_attr, card_id_store_attr); 667 668 static ssize_t 669 card_number_show_attr(struct device *dev, 670 struct device_attribute *attr, char *buf) 671 { 672 struct snd_card *card = dev_get_drvdata(dev); 673 return snprintf(buf, PAGE_SIZE, "%i\n", card ? card->number : -1); 674 } 675 676 static struct device_attribute card_number_attrs = 677 __ATTR(number, S_IRUGO, card_number_show_attr, NULL); 678 679 /** 680 * snd_card_register - register the soundcard 681 * @card: soundcard structure 682 * 683 * This function registers all the devices assigned to the soundcard. 684 * Until calling this, the ALSA control interface is blocked from the 685 * external accesses. Thus, you should call this function at the end 686 * of the initialization of the card. 687 * 688 * Return: Zero otherwise a negative error code if the registration failed. 689 */ 690 int snd_card_register(struct snd_card *card) 691 { 692 int err; 693 694 if (snd_BUG_ON(!card)) 695 return -EINVAL; 696 697 if (!card->card_dev) { 698 card->card_dev = device_create(sound_class, card->dev, 699 MKDEV(0, 0), card, 700 "card%i", card->number); 701 if (IS_ERR(card->card_dev)) 702 card->card_dev = NULL; 703 } 704 705 if ((err = snd_device_register_all(card)) < 0) 706 return err; 707 mutex_lock(&snd_card_mutex); 708 if (snd_cards[card->number]) { 709 /* already registered */ 710 mutex_unlock(&snd_card_mutex); 711 return 0; 712 } 713 if (*card->id) { 714 /* make a unique id name from the given string */ 715 char tmpid[sizeof(card->id)]; 716 memcpy(tmpid, card->id, sizeof(card->id)); 717 snd_card_set_id_no_lock(card, tmpid, tmpid); 718 } else { 719 /* create an id from either shortname or longname */ 720 const char *src; 721 src = *card->shortname ? card->shortname : card->longname; 722 snd_card_set_id_no_lock(card, src, 723 retrieve_id_from_card_name(src)); 724 } 725 snd_cards[card->number] = card; 726 mutex_unlock(&snd_card_mutex); 727 init_info_for_card(card); 728 #if IS_ENABLED(CONFIG_SND_MIXER_OSS) 729 if (snd_mixer_oss_notify_callback) 730 snd_mixer_oss_notify_callback(card, SND_MIXER_OSS_NOTIFY_REGISTER); 731 #endif 732 if (card->card_dev) { 733 err = device_create_file(card->card_dev, &card_id_attrs); 734 if (err < 0) 735 return err; 736 err = device_create_file(card->card_dev, &card_number_attrs); 737 if (err < 0) 738 return err; 739 } 740 741 return 0; 742 } 743 744 EXPORT_SYMBOL(snd_card_register); 745 746 #ifdef CONFIG_PROC_FS 747 static struct snd_info_entry *snd_card_info_entry; 748 749 static void snd_card_info_read(struct snd_info_entry *entry, 750 struct snd_info_buffer *buffer) 751 { 752 int idx, count; 753 struct snd_card *card; 754 755 for (idx = count = 0; idx < SNDRV_CARDS; idx++) { 756 mutex_lock(&snd_card_mutex); 757 if ((card = snd_cards[idx]) != NULL) { 758 count++; 759 snd_iprintf(buffer, "%2i [%-15s]: %s - %s\n", 760 idx, 761 card->id, 762 card->driver, 763 card->shortname); 764 snd_iprintf(buffer, " %s\n", 765 card->longname); 766 } 767 mutex_unlock(&snd_card_mutex); 768 } 769 if (!count) 770 snd_iprintf(buffer, "--- no soundcards ---\n"); 771 } 772 773 #ifdef CONFIG_SND_OSSEMUL 774 775 void snd_card_info_read_oss(struct snd_info_buffer *buffer) 776 { 777 int idx, count; 778 struct snd_card *card; 779 780 for (idx = count = 0; idx < SNDRV_CARDS; idx++) { 781 mutex_lock(&snd_card_mutex); 782 if ((card = snd_cards[idx]) != NULL) { 783 count++; 784 snd_iprintf(buffer, "%s\n", card->longname); 785 } 786 mutex_unlock(&snd_card_mutex); 787 } 788 if (!count) { 789 snd_iprintf(buffer, "--- no soundcards ---\n"); 790 } 791 } 792 793 #endif 794 795 #ifdef MODULE 796 static struct snd_info_entry *snd_card_module_info_entry; 797 static void snd_card_module_info_read(struct snd_info_entry *entry, 798 struct snd_info_buffer *buffer) 799 { 800 int idx; 801 struct snd_card *card; 802 803 for (idx = 0; idx < SNDRV_CARDS; idx++) { 804 mutex_lock(&snd_card_mutex); 805 if ((card = snd_cards[idx]) != NULL) 806 snd_iprintf(buffer, "%2i %s\n", 807 idx, card->module->name); 808 mutex_unlock(&snd_card_mutex); 809 } 810 } 811 #endif 812 813 int __init snd_card_info_init(void) 814 { 815 struct snd_info_entry *entry; 816 817 entry = snd_info_create_module_entry(THIS_MODULE, "cards", NULL); 818 if (! entry) 819 return -ENOMEM; 820 entry->c.text.read = snd_card_info_read; 821 if (snd_info_register(entry) < 0) { 822 snd_info_free_entry(entry); 823 return -ENOMEM; 824 } 825 snd_card_info_entry = entry; 826 827 #ifdef MODULE 828 entry = snd_info_create_module_entry(THIS_MODULE, "modules", NULL); 829 if (entry) { 830 entry->c.text.read = snd_card_module_info_read; 831 if (snd_info_register(entry) < 0) 832 snd_info_free_entry(entry); 833 else 834 snd_card_module_info_entry = entry; 835 } 836 #endif 837 838 return 0; 839 } 840 841 int __exit snd_card_info_done(void) 842 { 843 snd_info_free_entry(snd_card_info_entry); 844 #ifdef MODULE 845 snd_info_free_entry(snd_card_module_info_entry); 846 #endif 847 return 0; 848 } 849 850 #endif /* CONFIG_PROC_FS */ 851 852 /** 853 * snd_component_add - add a component string 854 * @card: soundcard structure 855 * @component: the component id string 856 * 857 * This function adds the component id string to the supported list. 858 * The component can be referred from the alsa-lib. 859 * 860 * Return: Zero otherwise a negative error code. 861 */ 862 863 int snd_component_add(struct snd_card *card, const char *component) 864 { 865 char *ptr; 866 int len = strlen(component); 867 868 ptr = strstr(card->components, component); 869 if (ptr != NULL) { 870 if (ptr[len] == '\0' || ptr[len] == ' ') /* already there */ 871 return 1; 872 } 873 if (strlen(card->components) + 1 + len + 1 > sizeof(card->components)) { 874 snd_BUG(); 875 return -ENOMEM; 876 } 877 if (card->components[0] != '\0') 878 strcat(card->components, " "); 879 strcat(card->components, component); 880 return 0; 881 } 882 883 EXPORT_SYMBOL(snd_component_add); 884 885 /** 886 * snd_card_file_add - add the file to the file list of the card 887 * @card: soundcard structure 888 * @file: file pointer 889 * 890 * This function adds the file to the file linked-list of the card. 891 * This linked-list is used to keep tracking the connection state, 892 * and to avoid the release of busy resources by hotplug. 893 * 894 * Return: zero or a negative error code. 895 */ 896 int snd_card_file_add(struct snd_card *card, struct file *file) 897 { 898 struct snd_monitor_file *mfile; 899 900 mfile = kmalloc(sizeof(*mfile), GFP_KERNEL); 901 if (mfile == NULL) 902 return -ENOMEM; 903 mfile->file = file; 904 mfile->disconnected_f_op = NULL; 905 INIT_LIST_HEAD(&mfile->shutdown_list); 906 spin_lock(&card->files_lock); 907 if (card->shutdown) { 908 spin_unlock(&card->files_lock); 909 kfree(mfile); 910 return -ENODEV; 911 } 912 list_add(&mfile->list, &card->files_list); 913 atomic_inc(&card->refcount); 914 spin_unlock(&card->files_lock); 915 return 0; 916 } 917 918 EXPORT_SYMBOL(snd_card_file_add); 919 920 /** 921 * snd_card_file_remove - remove the file from the file list 922 * @card: soundcard structure 923 * @file: file pointer 924 * 925 * This function removes the file formerly added to the card via 926 * snd_card_file_add() function. 927 * If all files are removed and snd_card_free_when_closed() was 928 * called beforehand, it processes the pending release of 929 * resources. 930 * 931 * Return: Zero or a negative error code. 932 */ 933 int snd_card_file_remove(struct snd_card *card, struct file *file) 934 { 935 struct snd_monitor_file *mfile, *found = NULL; 936 937 spin_lock(&card->files_lock); 938 list_for_each_entry(mfile, &card->files_list, list) { 939 if (mfile->file == file) { 940 list_del(&mfile->list); 941 spin_lock(&shutdown_lock); 942 list_del(&mfile->shutdown_list); 943 spin_unlock(&shutdown_lock); 944 if (mfile->disconnected_f_op) 945 fops_put(mfile->disconnected_f_op); 946 found = mfile; 947 break; 948 } 949 } 950 spin_unlock(&card->files_lock); 951 if (!found) { 952 snd_printk(KERN_ERR "ALSA card file remove problem (%p)\n", file); 953 return -ENOENT; 954 } 955 kfree(found); 956 snd_card_unref(card); 957 return 0; 958 } 959 960 EXPORT_SYMBOL(snd_card_file_remove); 961 962 #ifdef CONFIG_PM 963 /** 964 * snd_power_wait - wait until the power-state is changed. 965 * @card: soundcard structure 966 * @power_state: expected power state 967 * 968 * Waits until the power-state is changed. 969 * 970 * Return: Zero if successful, or a negative error code. 971 * 972 * Note: the power lock must be active before call. 973 */ 974 int snd_power_wait(struct snd_card *card, unsigned int power_state) 975 { 976 wait_queue_t wait; 977 int result = 0; 978 979 /* fastpath */ 980 if (snd_power_get_state(card) == power_state) 981 return 0; 982 init_waitqueue_entry(&wait, current); 983 add_wait_queue(&card->power_sleep, &wait); 984 while (1) { 985 if (card->shutdown) { 986 result = -ENODEV; 987 break; 988 } 989 if (snd_power_get_state(card) == power_state) 990 break; 991 set_current_state(TASK_UNINTERRUPTIBLE); 992 snd_power_unlock(card); 993 schedule_timeout(30 * HZ); 994 snd_power_lock(card); 995 } 996 remove_wait_queue(&card->power_sleep, &wait); 997 return result; 998 } 999 1000 EXPORT_SYMBOL(snd_power_wait); 1001 #endif /* CONFIG_PM */ 1002