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