Lines Matching +full:loop +full:- +full:powered
1 // SPDX-License-Identifier: GPL-2.0-or-later
47 /* return non-zero if the given index is reserved for the given
56 if (!module || !*module->name || !slots[idx]) in module_slot_match()
59 s1 = module->name; in module_slot_match()
71 if (c1 == '-') in module_slot_match()
73 if (c2 == '-') in module_slot_match()
95 * @mask == -1 == 0xffffffff means: take any free slot up to 32
121 * snd_device_alloc - Allocate and initialize struct device for sound devices
134 return -ENOMEM; in snd_device_alloc()
137 dev->parent = &card->card_dev; in snd_device_alloc()
138 dev->class = &sound_class; in snd_device_alloc()
139 dev->release = default_release_alloc; in snd_device_alloc()
157 * snd_card_new - create and initialize a soundcard structure
159 * @idx: card index (address) [0 ... (SNDRV_CARDS-1)]
179 return -EINVAL; in snd_card_new()
186 return -ENOMEM; in snd_card_new()
203 * snd_devm_card_new - managed snd_card object creation
205 * @idx: card index (address) [0 ... (SNDRV_CARDS-1)]
238 return -ENOMEM; in snd_devm_card_new()
239 card->managed = true; in snd_devm_card_new()
253 * snd_card_free_on_error - a small helper for handling devm probe errors
283 card->private_data = (char *)card + sizeof(struct snd_card); in snd_card_init()
285 strscpy(card->id, xid, sizeof(card->id)); in snd_card_init()
288 if (idx < 0) /* first check the matching module-name slot */ in snd_card_init()
293 err = -ENODEV; in snd_card_init()
296 err = -EBUSY; /* invalid */ in snd_card_init()
298 err = -ENODEV; in snd_card_init()
301 dev_err(parent, "cannot find the slot for index %d (range 0-%i), error: %d\n", in snd_card_init()
302 idx, snd_ecards_limit - 1, err); in snd_card_init()
303 if (!card->managed) in snd_card_init()
311 card->dev = parent; in snd_card_init()
312 card->number = idx; in snd_card_init()
315 card->module = module; in snd_card_init()
317 INIT_LIST_HEAD(&card->devices); in snd_card_init()
318 init_rwsem(&card->controls_rwsem); in snd_card_init()
319 rwlock_init(&card->ctl_files_rwlock); in snd_card_init()
320 INIT_LIST_HEAD(&card->controls); in snd_card_init()
321 INIT_LIST_HEAD(&card->ctl_files); in snd_card_init()
323 xa_init(&card->ctl_numids); in snd_card_init()
324 xa_init(&card->ctl_hash); in snd_card_init()
326 spin_lock_init(&card->files_lock); in snd_card_init()
327 INIT_LIST_HEAD(&card->files_list); in snd_card_init()
328 mutex_init(&card->memory_mutex); in snd_card_init()
330 init_waitqueue_head(&card->power_sleep); in snd_card_init()
331 init_waitqueue_head(&card->power_ref_sleep); in snd_card_init()
332 atomic_set(&card->power_ref, 0); in snd_card_init()
334 init_waitqueue_head(&card->remove_sleep); in snd_card_init()
335 card->sync_irq = -1; in snd_card_init()
337 device_initialize(&card->card_dev); in snd_card_init()
338 card->card_dev.parent = parent; in snd_card_init()
339 card->card_dev.class = &sound_class; in snd_card_init()
340 card->card_dev.release = release_card_device; in snd_card_init()
341 card->card_dev.groups = card->dev_groups; in snd_card_init()
342 card->dev_groups[0] = &card_dev_attr_group; in snd_card_init()
343 err = kobject_set_name(&card->card_dev.kobj, "card%d", idx); in snd_card_init()
347 snprintf(card->irq_descr, sizeof(card->irq_descr), "%s:%s", in snd_card_init()
348 dev_driver_string(card->dev), dev_name(&card->card_dev)); in snd_card_init()
364 card->debugfs_root = debugfs_create_dir(dev_name(&card->card_dev), in snd_card_init()
372 put_device(&card->card_dev); in snd_card_init()
377 * snd_card_ref - Get the card object from the index
392 get_device(&card->card_dev); in snd_card_ref()
398 /* return non-zero if a card is already locked */
411 return -ENODEV; in snd_disconnect_llseek()
417 return -ENODEV; in snd_disconnect_read()
423 return -ENODEV; in snd_disconnect_write()
432 if (_df->file == file) { in snd_disconnect_release()
434 list_del_init(&df->shutdown_list); in snd_disconnect_release()
441 if ((file->f_flags & FASYNC) && df->disconnected_f_op->fasync) in snd_disconnect_release()
442 df->disconnected_f_op->fasync(-1, file, 0); in snd_disconnect_release()
443 return df->disconnected_f_op->release(inode, file); in snd_disconnect_release()
457 return -ENODEV; in snd_disconnect_ioctl()
462 return -ENODEV; in snd_disconnect_mmap()
467 return -ENODEV; in snd_disconnect_fasync()
487 * snd_card_disconnect - disconnect all APIs from the file-operations (user space)
490 * Disconnects all APIs from the file-operations (user space).
494 * Note: The current implementation replaces all active file->f_op with special
504 spin_lock(&card->files_lock); in snd_card_disconnect()
505 if (card->shutdown) { in snd_card_disconnect()
506 spin_unlock(&card->files_lock); in snd_card_disconnect()
509 card->shutdown = 1; in snd_card_disconnect()
511 /* replace file->f_op with special dummy operations */ in snd_card_disconnect()
512 list_for_each_entry(mfile, &card->files_list, list) { in snd_card_disconnect()
513 /* it's critical part, use endless loop */ in snd_card_disconnect()
515 mfile->disconnected_f_op = mfile->file->f_op; in snd_card_disconnect()
518 list_add(&mfile->shutdown_list, &shutdown_files); in snd_card_disconnect()
521 mfile->file->f_op = &snd_shutdown_f_ops; in snd_card_disconnect()
522 fops_get(mfile->file->f_op); in snd_card_disconnect()
524 spin_unlock(&card->files_lock); in snd_card_disconnect()
537 if (card->sync_irq > 0) in snd_card_disconnect()
538 synchronize_irq(card->sync_irq); in snd_card_disconnect()
541 if (card->registered) { in snd_card_disconnect()
542 device_del(&card->card_dev); in snd_card_disconnect()
543 card->registered = false; in snd_card_disconnect()
548 snd_cards[card->number] = NULL; in snd_card_disconnect()
549 clear_bit(card->number, snd_cards_lock); in snd_card_disconnect()
553 wake_up(&card->power_sleep); in snd_card_disconnect()
560 * snd_card_disconnect_sync - disconnect card and wait until files get closed
565 * It assures that all accesses from user-space finished so that the driver
572 spin_lock_irq(&card->files_lock); in snd_card_disconnect_sync()
573 wait_event_lock_irq(card->remove_sleep, in snd_card_disconnect_sync()
574 list_empty(&card->files_list), in snd_card_disconnect_sync()
575 card->files_lock); in snd_card_disconnect_sync()
576 spin_unlock_irq(&card->files_lock); in snd_card_disconnect_sync()
582 card->releasing = true; in snd_card_do_free()
588 if (card->private_free) in snd_card_do_free()
589 card->private_free(card); in snd_card_do_free()
591 dev_warn(card->dev, "unable to free card info\n"); in snd_card_do_free()
595 debugfs_remove(card->debugfs_root); in snd_card_do_free()
596 card->debugfs_root = NULL; in snd_card_do_free()
598 if (card->release_completion) in snd_card_do_free()
599 complete(card->release_completion); in snd_card_do_free()
600 if (!card->managed) in snd_card_do_free()
606 * snd_card_free_when_closed - Disconnect the card, free it later eventually
622 put_device(&card->card_dev); in snd_card_free_when_closed()
628 * snd_card_free - frees given soundcard structure
646 * we need to avoid double-free. Moreover, the release via devres in snd_card_free()
650 if (card->releasing) in snd_card_free()
653 card->release_completion = &released; in snd_card_free()
682 !strcmp(snd_cards[i]->id, id)) in card_id_ok()
688 /* copy to card->id only with valid letters from nid */
692 char *id = card->id; in copy_valid_id_string()
698 while (*nid && (size_t)(id - card->id) < sizeof(card->id) - 1) { in copy_valid_id_string()
706 /* Set card->id from the given string
717 id = card->id; in snd_card_set_id_no_lock()
740 if (len + sfxlen >= sizeof(card->id)) in snd_card_set_id_no_lock()
741 spos = id + sizeof(card->id) - sfxlen - 1; in snd_card_set_id_no_lock()
752 dev_err(card->dev, "unable to set card id (%s)\n", id); in snd_card_set_id_no_lock()
753 if (card->proc_root->name) in snd_card_set_id_no_lock()
754 strscpy(card->id, card->proc_root->name, sizeof(card->id)); in snd_card_set_id_no_lock()
758 * snd_card_set_id - set card identification name
767 /* check if user specified own card->id */ in snd_card_set_id()
768 if (card->id[0] != '\0') in snd_card_set_id()
780 return sysfs_emit(buf, "%s\n", card->id); in id_show()
787 char buf1[sizeof(card->id)]; in id_store()
788 size_t copy = count > sizeof(card->id) - 1 ? in id_store()
789 sizeof(card->id) - 1 : count; in id_store()
795 if (!isalnum(c) && c != '_' && c != '-') in id_store()
796 return -EINVAL; in id_store()
803 return -EEXIST; in id_store()
805 strcpy(card->id, buf1); in id_store()
818 return sysfs_emit(buf, "%i\n", card->number); in number_show()
834 * snd_card_add_dev_attr - Append a new sysfs attribute group to card
845 /* loop for (arraysize-1) here to keep NULL at the last entry */ in snd_card_add_dev_attr()
846 for (i = 0; i < ARRAY_SIZE(card->dev_groups) - 1; i++) { in snd_card_add_dev_attr()
847 if (!card->dev_groups[i]) { in snd_card_add_dev_attr()
848 card->dev_groups[i] = group; in snd_card_add_dev_attr()
853 dev_err(card->dev, "Too many groups assigned\n"); in snd_card_add_dev_attr()
854 return -ENOSPC; in snd_card_add_dev_attr()
864 * snd_card_register - register the soundcard
879 return -EINVAL; in snd_card_register()
881 if (!card->registered) { in snd_card_register()
882 err = device_add(&card->card_dev); in snd_card_register()
885 card->registered = true; in snd_card_register()
887 if (card->managed) in snd_card_register()
888 devm_remove_action(card->dev, trigger_card_free, card); in snd_card_register()
891 if (card->managed) { in snd_card_register()
892 err = devm_add_action(card->dev, trigger_card_free, card); in snd_card_register()
901 if (snd_cards[card->number]) { in snd_card_register()
906 if (*card->id) { in snd_card_register()
908 char tmpid[sizeof(card->id)]; in snd_card_register()
909 memcpy(tmpid, card->id, sizeof(card->id)); in snd_card_register()
914 src = *card->shortname ? card->shortname : card->longname; in snd_card_register()
918 snd_cards[card->number] = card; in snd_card_register()
944 snd_iprintf(buffer, "%2i [%-15s]: %s - %s\n", in snd_card_info_read()
946 card->id, in snd_card_info_read()
947 card->driver, in snd_card_info_read()
948 card->shortname); in snd_card_info_read()
950 card->longname); in snd_card_info_read()
955 snd_iprintf(buffer, "--- no soundcards ---\n"); in snd_card_info_read()
969 snd_iprintf(buffer, "%s\n", card->longname); in snd_card_info_read_oss()
974 snd_iprintf(buffer, "--- no soundcards ---\n"); in snd_card_info_read_oss()
992 idx, card->module->name); in snd_card_module_info_read()
1004 return -ENOMEM; in snd_card_info_init()
1005 entry->c.text.read = snd_card_info_read; in snd_card_info_init()
1007 return -ENOMEM; /* freed in error path */ in snd_card_info_init()
1012 return -ENOMEM; in snd_card_info_init()
1013 entry->c.text.read = snd_card_module_info_read; in snd_card_info_init()
1015 return -ENOMEM; /* freed in error path */ in snd_card_info_init()
1023 * snd_component_add - add a component string
1028 * The component can be referred from the alsa-lib.
1038 ptr = strstr(card->components, component); in snd_component_add()
1043 if (strlen(card->components) + 1 + len + 1 > sizeof(card->components)) { in snd_component_add()
1045 return -ENOMEM; in snd_component_add()
1047 if (card->components[0] != '\0') in snd_component_add()
1048 strcat(card->components, " "); in snd_component_add()
1049 strcat(card->components, component); in snd_component_add()
1055 * snd_card_file_add - add the file to the file list of the card
1059 * This function adds the file to the file linked-list of the card.
1060 * This linked-list is used to keep tracking the connection state,
1071 return -ENOMEM; in snd_card_file_add()
1072 mfile->file = file; in snd_card_file_add()
1073 mfile->disconnected_f_op = NULL; in snd_card_file_add()
1074 INIT_LIST_HEAD(&mfile->shutdown_list); in snd_card_file_add()
1075 spin_lock(&card->files_lock); in snd_card_file_add()
1076 if (card->shutdown) { in snd_card_file_add()
1077 spin_unlock(&card->files_lock); in snd_card_file_add()
1079 return -ENODEV; in snd_card_file_add()
1081 list_add(&mfile->list, &card->files_list); in snd_card_file_add()
1082 get_device(&card->card_dev); in snd_card_file_add()
1083 spin_unlock(&card->files_lock); in snd_card_file_add()
1089 * snd_card_file_remove - remove the file from the file list
1105 spin_lock(&card->files_lock); in snd_card_file_remove()
1106 list_for_each_entry(mfile, &card->files_list, list) { in snd_card_file_remove()
1107 if (mfile->file == file) { in snd_card_file_remove()
1108 list_del(&mfile->list); in snd_card_file_remove()
1110 list_del(&mfile->shutdown_list); in snd_card_file_remove()
1112 if (mfile->disconnected_f_op) in snd_card_file_remove()
1113 fops_put(mfile->disconnected_f_op); in snd_card_file_remove()
1118 if (list_empty(&card->files_list)) in snd_card_file_remove()
1119 wake_up_all(&card->remove_sleep); in snd_card_file_remove()
1120 spin_unlock(&card->files_lock); in snd_card_file_remove()
1122 dev_err(card->dev, "card file remove problem (%p)\n", file); in snd_card_file_remove()
1123 return -ENOENT; in snd_card_file_remove()
1126 put_device(&card->card_dev); in snd_card_file_remove()
1133 * snd_power_ref_and_wait - wait until the card gets powered up
1137 * wait until the card gets powered up to SNDRV_CTL_POWER_D0 state.
1138 * The refcount is down again while sleeping until power-up, hence this
1152 wait_event_cmd(card->power_sleep, in snd_power_ref_and_wait()
1153 card->shutdown || in snd_power_ref_and_wait()
1156 return card->shutdown ? -ENODEV : 0; in snd_power_ref_and_wait()
1161 * snd_power_wait - wait until the card gets powered up (old form)
1164 * Wait until the card gets powered up to SNDRV_CTL_POWER_D0 state.