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