Lines Matching full:card

85 int (*snd_mixer_oss_notify_callback)(struct snd_card *card, int free_flag);
123 * @card: card to assign, optional
127 int snd_device_alloc(struct device **dev_p, struct snd_card *card) in snd_device_alloc() argument
136 if (card) in snd_device_alloc()
137 dev->parent = &card->card_dev; in snd_device_alloc()
145 static int snd_card_init(struct snd_card *card, struct device *parent,
148 static int snd_card_do_free(struct snd_card *card);
159 * @idx: card index (address) [0 ... (SNDRV_CARDS-1)]
160 * @xid: card identification (ASCII string)
163 * @card_ret: the pointer to store the created card instance
175 struct snd_card *card; in snd_card_new() local
184 card = kzalloc(sizeof(*card) + extra_size, GFP_KERNEL); in snd_card_new()
185 if (!card) in snd_card_new()
188 err = snd_card_init(card, parent, idx, xid, module, extra_size); in snd_card_new()
190 return err; /* card is freed by error handler */ in snd_card_new()
192 *card_ret = card; in snd_card_new()
205 * @idx: card index (address) [0 ... (SNDRV_CARDS-1)]
206 * @xid: card identification (ASCII string)
209 * @card_ret: the pointer to store the created card instance
220 * there have been other devres resources, you'd need to free the card manually
231 struct snd_card *card; in snd_devm_card_new() local
235 card = devres_alloc(__snd_card_release, sizeof(*card) + extra_size, in snd_devm_card_new()
237 if (!card) in snd_devm_card_new()
239 card->managed = true; in snd_devm_card_new()
240 err = snd_card_init(card, parent, idx, xid, module, extra_size); in snd_devm_card_new()
242 devres_free(card); /* in managed mode, we need to free manually */ in snd_devm_card_new()
246 devres_add(parent, card); in snd_devm_card_new()
247 *card_ret = card; in snd_devm_card_new()
265 struct snd_card *card; in snd_card_free_on_error() local
269 card = devres_find(dev, __snd_card_release, NULL, NULL); in snd_card_free_on_error()
270 if (card) in snd_card_free_on_error()
271 snd_card_free(card); in snd_card_free_on_error()
276 static int snd_card_init(struct snd_card *card, struct device *parent, in snd_card_init() argument
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()
303 if (!card->managed) in snd_card_init()
304 kfree(card); /* manually free here, as no destructor called */ in snd_card_init()
311 card->dev = parent; in snd_card_init()
312 card->number = idx; in snd_card_init()
316 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()
352 err = snd_ctl_create(card); in snd_card_init()
357 err = snd_info_card_create(card); in snd_card_init()
359 dev_err(parent, "unable to create card info\n"); in snd_card_init()
364 card->debugfs_root = debugfs_create_dir(dev_name(&card->card_dev), in snd_card_init()
370 snd_device_free_all(card); 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
378 * @idx: the card index
380 * Returns a card object corresponding to the given index or NULL if not found.
383 * Return: a card object or NULL
387 struct snd_card *card; in snd_card_ref() local
390 card = snd_cards[idx]; in snd_card_ref()
391 if (card) in snd_card_ref()
392 get_device(&card->card_dev); in snd_card_ref()
394 return card; in snd_card_ref()
398 /* return non-zero if a card is already locked */
399 int snd_card_locked(int card) in snd_card_locked() argument
404 locked = test_bit(card, snd_cards_lock); in snd_card_locked()
488 * @card: soundcard structure
497 void snd_card_disconnect(struct snd_card *card) in snd_card_disconnect() argument
501 if (!card) in snd_card_disconnect()
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()
512 list_for_each_entry(mfile, &card->files_list, list) { in snd_card_disconnect()
524 spin_unlock(&card->files_lock); in snd_card_disconnect()
531 wake_up_all(&card->power_sleep); in snd_card_disconnect()
539 snd_mixer_oss_notify_callback(card, SND_MIXER_OSS_NOTIFY_DISCONNECT); in snd_card_disconnect()
543 snd_device_disconnect_all(card); in snd_card_disconnect()
545 if (card->sync_irq > 0) in snd_card_disconnect()
546 synchronize_irq(card->sync_irq); in snd_card_disconnect()
548 snd_info_card_disconnect(card); in snd_card_disconnect()
550 debugfs_remove(card->debugfs_root); in snd_card_disconnect()
551 card->debugfs_root = NULL; in snd_card_disconnect()
554 if (card->registered) { in snd_card_disconnect()
555 device_del(&card->card_dev); in snd_card_disconnect()
556 card->registered = false; in snd_card_disconnect()
561 snd_cards[card->number] = NULL; in snd_card_disconnect()
562 clear_bit(card->number, snd_cards_lock); in snd_card_disconnect()
566 snd_power_sync_ref(card); in snd_card_disconnect()
572 * snd_card_disconnect_sync - disconnect card and wait until files get closed
573 * @card: card object to disconnect
580 void snd_card_disconnect_sync(struct snd_card *card) in snd_card_disconnect_sync() argument
582 snd_card_disconnect(card); in snd_card_disconnect_sync()
584 spin_lock_irq(&card->files_lock); in snd_card_disconnect_sync()
585 wait_event_lock_irq(card->remove_sleep, in snd_card_disconnect_sync()
586 list_empty(&card->files_list), in snd_card_disconnect_sync()
587 card->files_lock); in snd_card_disconnect_sync()
588 spin_unlock_irq(&card->files_lock); in snd_card_disconnect_sync()
592 static int snd_card_do_free(struct snd_card *card) in snd_card_do_free() argument
594 card->releasing = true; in snd_card_do_free()
597 snd_mixer_oss_notify_callback(card, SND_MIXER_OSS_NOTIFY_FREE); in snd_card_do_free()
599 snd_device_free_all(card); in snd_card_do_free()
600 if (card->private_free) in snd_card_do_free()
601 card->private_free(card); in snd_card_do_free()
602 if (snd_info_card_free(card) < 0) { in snd_card_do_free()
603 dev_warn(card->dev, "unable to free card info\n"); in snd_card_do_free()
606 if (card->release_completion) in snd_card_do_free()
607 complete(card->release_completion); in snd_card_do_free()
608 if (!card->managed) in snd_card_do_free()
609 kfree(card); in snd_card_do_free()
614 * snd_card_free_when_closed - Disconnect the card, free it later eventually
615 * @card: soundcard structure
617 * Unlike snd_card_free(), this function doesn't try to release the card
618 * resource immediately, but tries to disconnect at first. When the card
620 * The card resources will be freed when the refcount gets to zero.
624 void snd_card_free_when_closed(struct snd_card *card) in snd_card_free_when_closed() argument
626 if (!card) in snd_card_free_when_closed()
629 snd_card_disconnect(card); in snd_card_free_when_closed()
630 put_device(&card->card_dev); in snd_card_free_when_closed()
637 * @card: soundcard structure
648 void snd_card_free(struct snd_card *card) in snd_card_free() argument
658 if (card->releasing) in snd_card_free()
661 card->release_completion = &released; in snd_card_free()
662 snd_card_free_when_closed(card); in snd_card_free()
688 /* return true if the given id string doesn't conflict any other card ids */
689 static bool card_id_ok(struct snd_card *card, const char *id) in card_id_ok() argument
695 if (snd_cards[i] && snd_cards[i] != card && in card_id_ok()
702 /* copy to card->id only with valid letters from nid */
703 static void copy_valid_id_string(struct snd_card *card, const char *src, in copy_valid_id_string() argument
706 char *id = card->id; in copy_valid_id_string()
712 while (*nid && (size_t)(id - card->id) < sizeof(card->id) - 1) { in copy_valid_id_string()
720 /* Set card->id from the given string
723 static void snd_card_set_id_no_lock(struct snd_card *card, const char *src, in snd_card_set_id_no_lock() argument
730 copy_valid_id_string(card, src, nid); in snd_card_set_id_no_lock()
731 id = card->id; in snd_card_set_id_no_lock()
735 * ("card" conflicts with proc directories) in snd_card_set_id_no_lock()
737 if (!*id || !strncmp(id, "card", 4)) { in snd_card_set_id_no_lock()
748 if (card_id_ok(card, id)) in snd_card_set_id_no_lock()
754 if (len + sfxlen >= sizeof(card->id)) in snd_card_set_id_no_lock()
755 spos = id + sizeof(card->id) - sfxlen - 1; in snd_card_set_id_no_lock()
766 dev_err(card->dev, "unable to set card id (%s)\n", id); in snd_card_set_id_no_lock()
767 if (card->proc_root->name) in snd_card_set_id_no_lock()
768 strscpy(card->id, card->proc_root->name, sizeof(card->id)); in snd_card_set_id_no_lock()
772 * snd_card_set_id - set card identification name
773 * @card: soundcard structure
776 * This function sets the card identification and checks for name
779 void snd_card_set_id(struct snd_card *card, const char *nid) in snd_card_set_id() argument
781 /* check if user specified own card->id */ in snd_card_set_id()
782 if (card->id[0] != '\0') in snd_card_set_id()
785 snd_card_set_id_no_lock(card, nid, nid); in snd_card_set_id()
793 struct snd_card *card = container_of(dev, struct snd_card, card_dev); in id_show() local
794 return sysfs_emit(buf, "%s\n", card->id); in id_show()
800 struct snd_card *card = container_of(dev, struct snd_card, card_dev); in id_store() local
801 char buf1[sizeof(card->id)]; in id_store()
802 size_t copy = count > sizeof(card->id) - 1 ? in id_store()
803 sizeof(card->id) - 1 : count; in id_store()
819 strcpy(card->id, buf1); in id_store()
820 snd_info_card_id_change(card); in id_store()
831 struct snd_card *card = container_of(dev, struct snd_card, card_dev); in number_show() local
832 return sysfs_emit(buf, "%i\n", card->number); in number_show()
848 * snd_card_add_dev_attr - Append a new sysfs attribute group to card
849 * @card: card instance
854 int snd_card_add_dev_attr(struct snd_card *card, in snd_card_add_dev_attr() argument
860 for (i = 0; i < ARRAY_SIZE(card->dev_groups) - 1; i++) { in snd_card_add_dev_attr()
861 if (!card->dev_groups[i]) { in snd_card_add_dev_attr()
862 card->dev_groups[i] = group; in snd_card_add_dev_attr()
867 dev_err(card->dev, "Too many groups assigned\n"); in snd_card_add_dev_attr()
879 * @card: soundcard structure
884 * of the initialization of the card.
888 int snd_card_register(struct snd_card *card) in snd_card_register() argument
892 if (snd_BUG_ON(!card)) in snd_card_register()
895 if (!card->registered) { in snd_card_register()
896 err = device_add(&card->card_dev); in snd_card_register()
899 card->registered = true; in snd_card_register()
901 if (card->managed) in snd_card_register()
902 devm_remove_action(card->dev, trigger_card_free, card); in snd_card_register()
905 if (card->managed) { in snd_card_register()
906 err = devm_add_action(card->dev, trigger_card_free, card); in snd_card_register()
911 err = snd_device_register_all(card); in snd_card_register()
915 if (snd_cards[card->number]) { in snd_card_register()
918 return snd_info_card_register(card); /* register pending info */ in snd_card_register()
920 if (*card->id) { in snd_card_register()
922 char tmpid[sizeof(card->id)]; in snd_card_register()
923 memcpy(tmpid, card->id, sizeof(card->id)); in snd_card_register()
924 snd_card_set_id_no_lock(card, tmpid, tmpid); in snd_card_register()
928 src = *card->shortname ? card->shortname : card->longname; in snd_card_register()
929 snd_card_set_id_no_lock(card, src, in snd_card_register()
932 snd_cards[card->number] = card; in snd_card_register()
934 err = snd_info_card_register(card); in snd_card_register()
940 snd_mixer_oss_notify_callback(card, SND_MIXER_OSS_NOTIFY_REGISTER); in snd_card_register()
951 struct snd_card *card; in snd_card_info_read() local
955 card = snd_cards[idx]; in snd_card_info_read()
956 if (card) { in snd_card_info_read()
960 card->id, in snd_card_info_read()
961 card->driver, in snd_card_info_read()
962 card->shortname); in snd_card_info_read()
964 card->longname); in snd_card_info_read()
976 struct snd_card *card; in snd_card_info_read_oss() local
980 card = snd_cards[idx]; in snd_card_info_read_oss()
981 if (card) { in snd_card_info_read_oss()
983 snd_iprintf(buffer, "%s\n", card->longname); in snd_card_info_read_oss()
999 struct snd_card *card; in snd_card_module_info_read() local
1003 card = snd_cards[idx]; in snd_card_module_info_read()
1004 if (card) in snd_card_module_info_read()
1006 idx, card->module->name); in snd_card_module_info_read()
1038 * @card: soundcard structure
1047 int snd_component_add(struct snd_card *card, const char *component) in snd_component_add() argument
1052 ptr = strstr(card->components, component); in snd_component_add()
1057 if (strlen(card->components) + 1 + len + 1 > sizeof(card->components)) { in snd_component_add()
1061 if (card->components[0] != '\0') in snd_component_add()
1062 strcat(card->components, " "); in snd_component_add()
1063 strcat(card->components, component); in snd_component_add()
1069 * snd_card_file_add - add the file to the file list of the card
1070 * @card: soundcard structure
1073 * This function adds the file to the file linked-list of the card.
1079 int snd_card_file_add(struct snd_card *card, struct file *file) in snd_card_file_add() argument
1089 spin_lock(&card->files_lock); in snd_card_file_add()
1090 if (card->shutdown) { in snd_card_file_add()
1091 spin_unlock(&card->files_lock); in snd_card_file_add()
1095 list_add(&mfile->list, &card->files_list); in snd_card_file_add()
1096 get_device(&card->card_dev); in snd_card_file_add()
1097 spin_unlock(&card->files_lock); in snd_card_file_add()
1104 * @card: soundcard structure
1107 * This function removes the file formerly added to the card via
1115 int snd_card_file_remove(struct snd_card *card, struct file *file) in snd_card_file_remove() argument
1119 spin_lock(&card->files_lock); in snd_card_file_remove()
1120 list_for_each_entry(mfile, &card->files_list, list) { in snd_card_file_remove()
1132 if (list_empty(&card->files_list)) in snd_card_file_remove()
1133 wake_up_all(&card->remove_sleep); in snd_card_file_remove()
1134 spin_unlock(&card->files_lock); in snd_card_file_remove()
1136 dev_err(card->dev, "card file remove problem (%p)\n", file); in snd_card_file_remove()
1140 put_device(&card->card_dev); in snd_card_file_remove()
1147 * snd_power_ref_and_wait - wait until the card gets powered up
1148 * @card: soundcard structure
1150 * Take the power_ref reference count of the given card, and
1151 * wait until the card gets powered up to SNDRV_CTL_POWER_D0 state.
1161 int snd_power_ref_and_wait(struct snd_card *card) in snd_power_ref_and_wait() argument
1163 snd_power_ref(card); in snd_power_ref_and_wait()
1164 if (snd_power_get_state(card) == SNDRV_CTL_POWER_D0) in snd_power_ref_and_wait()
1166 wait_event_cmd(card->power_sleep, in snd_power_ref_and_wait()
1167 card->shutdown || in snd_power_ref_and_wait()
1168 snd_power_get_state(card) == SNDRV_CTL_POWER_D0, in snd_power_ref_and_wait()
1169 snd_power_unref(card), snd_power_ref(card)); in snd_power_ref_and_wait()
1170 return card->shutdown ? -ENODEV : 0; in snd_power_ref_and_wait()
1175 * snd_power_wait - wait until the card gets powered up (old form)
1176 * @card: soundcard structure
1178 * Wait until the card gets powered up to SNDRV_CTL_POWER_D0 state.
1182 int snd_power_wait(struct snd_card *card) in snd_power_wait() argument
1186 ret = snd_power_ref_and_wait(card); in snd_power_wait()
1187 snd_power_unref(card); in snd_power_wait()