Lines Matching full:card

83 int (*snd_mixer_oss_notify_callback)(struct snd_card *card, int free_flag);
123 * @card: card to assign, optional
125 void snd_device_initialize(struct device *dev, struct snd_card *card) in snd_device_initialize() argument
128 if (card) in snd_device_initialize()
129 dev->parent = &card->card_dev; in snd_device_initialize()
135 static int snd_card_do_free(struct snd_card *card);
146 * @idx: card index (address) [0 ... (SNDRV_CARDS-1)]
147 * @xid: card identification (ASCII string)
150 * @card_ret: the pointer to store the created card instance
164 struct snd_card *card; in snd_card_new() local
173 card = kzalloc(sizeof(*card) + extra_size, GFP_KERNEL); in snd_card_new()
174 if (!card) in snd_card_new()
177 card->private_data = (char *)card + sizeof(struct snd_card); in snd_card_new()
179 strlcpy(card->id, xid, sizeof(card->id)); in snd_card_new()
197 kfree(card); in snd_card_new()
204 card->dev = parent; in snd_card_new()
205 card->number = idx; in snd_card_new()
208 card->module = module; in snd_card_new()
210 INIT_LIST_HEAD(&card->devices); in snd_card_new()
211 init_rwsem(&card->controls_rwsem); in snd_card_new()
212 rwlock_init(&card->ctl_files_rwlock); in snd_card_new()
213 INIT_LIST_HEAD(&card->controls); in snd_card_new()
214 INIT_LIST_HEAD(&card->ctl_files); in snd_card_new()
215 spin_lock_init(&card->files_lock); in snd_card_new()
216 INIT_LIST_HEAD(&card->files_list); in snd_card_new()
217 mutex_init(&card->memory_mutex); in snd_card_new()
219 init_waitqueue_head(&card->power_sleep); in snd_card_new()
221 init_waitqueue_head(&card->remove_sleep); in snd_card_new()
222 card->sync_irq = -1; in snd_card_new()
224 device_initialize(&card->card_dev); in snd_card_new()
225 card->card_dev.parent = parent; in snd_card_new()
226 card->card_dev.class = sound_class; in snd_card_new()
227 card->card_dev.release = release_card_device; in snd_card_new()
228 card->card_dev.groups = card->dev_groups; in snd_card_new()
229 card->dev_groups[0] = &card_dev_attr_group; in snd_card_new()
230 err = kobject_set_name(&card->card_dev.kobj, "card%d", idx); in snd_card_new()
234 snprintf(card->irq_descr, sizeof(card->irq_descr), "%s:%s", in snd_card_new()
235 dev_driver_string(card->dev), dev_name(&card->card_dev)); in snd_card_new()
239 err = snd_ctl_create(card); in snd_card_new()
244 err = snd_info_card_create(card); in snd_card_new()
246 dev_err(parent, "unable to create card info\n"); in snd_card_new()
249 *card_ret = card; in snd_card_new()
253 snd_device_free_all(card); in snd_card_new()
255 put_device(&card->card_dev); in snd_card_new()
261 * snd_card_ref - Get the card object from the index
262 * @idx: the card index
264 * Returns a card object corresponding to the given index or NULL if not found.
269 struct snd_card *card; in snd_card_ref() local
272 card = snd_cards[idx]; in snd_card_ref()
273 if (card) in snd_card_ref()
274 get_device(&card->card_dev); in snd_card_ref()
276 return card; in snd_card_ref()
280 /* return non-zero if a card is already locked */
281 int snd_card_locked(int card) in snd_card_locked() argument
286 locked = test_bit(card, snd_cards_lock); in snd_card_locked()
370 * @card: soundcard structure
379 int snd_card_disconnect(struct snd_card *card) in snd_card_disconnect() argument
383 if (!card) in snd_card_disconnect()
386 spin_lock(&card->files_lock); in snd_card_disconnect()
387 if (card->shutdown) { in snd_card_disconnect()
388 spin_unlock(&card->files_lock); in snd_card_disconnect()
391 card->shutdown = 1; in snd_card_disconnect()
392 spin_unlock(&card->files_lock); in snd_card_disconnect()
395 spin_lock(&card->files_lock); in snd_card_disconnect()
396 list_for_each_entry(mfile, &card->files_list, list) { in snd_card_disconnect()
408 spin_unlock(&card->files_lock); in snd_card_disconnect()
415 snd_mixer_oss_notify_callback(card, SND_MIXER_OSS_NOTIFY_DISCONNECT); in snd_card_disconnect()
419 snd_device_disconnect_all(card); in snd_card_disconnect()
421 snd_info_card_disconnect(card); in snd_card_disconnect()
422 if (card->registered) { in snd_card_disconnect()
423 device_del(&card->card_dev); in snd_card_disconnect()
424 card->registered = false; in snd_card_disconnect()
429 snd_cards[card->number] = NULL; in snd_card_disconnect()
430 clear_bit(card->number, snd_cards_lock); in snd_card_disconnect()
434 wake_up(&card->power_sleep); in snd_card_disconnect()
441 * snd_card_disconnect_sync - disconnect card and wait until files get closed
442 * @card: card object to disconnect
449 void snd_card_disconnect_sync(struct snd_card *card) in snd_card_disconnect_sync() argument
453 err = snd_card_disconnect(card); in snd_card_disconnect_sync()
455 dev_err(card->dev, in snd_card_disconnect_sync()
461 spin_lock_irq(&card->files_lock); in snd_card_disconnect_sync()
462 wait_event_lock_irq(card->remove_sleep, in snd_card_disconnect_sync()
463 list_empty(&card->files_list), in snd_card_disconnect_sync()
464 card->files_lock); in snd_card_disconnect_sync()
465 spin_unlock_irq(&card->files_lock); in snd_card_disconnect_sync()
469 static int snd_card_do_free(struct snd_card *card) in snd_card_do_free() argument
473 snd_mixer_oss_notify_callback(card, SND_MIXER_OSS_NOTIFY_FREE); in snd_card_do_free()
475 snd_device_free_all(card); in snd_card_do_free()
476 if (card->private_free) in snd_card_do_free()
477 card->private_free(card); in snd_card_do_free()
478 if (snd_info_card_free(card) < 0) { in snd_card_do_free()
479 dev_warn(card->dev, "unable to free card info\n"); in snd_card_do_free()
482 if (card->release_completion) in snd_card_do_free()
483 complete(card->release_completion); in snd_card_do_free()
484 kfree(card); in snd_card_do_free()
489 * snd_card_free_when_closed - Disconnect the card, free it later eventually
490 * @card: soundcard structure
492 * Unlike snd_card_free(), this function doesn't try to release the card
493 * resource immediately, but tries to disconnect at first. When the card
495 * The card resources will be freed when the refcount gets to zero.
497 int snd_card_free_when_closed(struct snd_card *card) in snd_card_free_when_closed() argument
499 int ret = snd_card_disconnect(card); in snd_card_free_when_closed()
502 put_device(&card->card_dev); in snd_card_free_when_closed()
509 * @card: soundcard structure
520 int snd_card_free(struct snd_card *card) in snd_card_free() argument
525 card->release_completion = &released; in snd_card_free()
526 ret = snd_card_free_when_closed(card); in snd_card_free()
548 /* return true if the given id string doesn't conflict any other card ids */
549 static bool card_id_ok(struct snd_card *card, const char *id) in card_id_ok() argument
555 if (snd_cards[i] && snd_cards[i] != card && in card_id_ok()
562 /* copy to card->id only with valid letters from nid */
563 static void copy_valid_id_string(struct snd_card *card, const char *src, in copy_valid_id_string() argument
566 char *id = card->id; in copy_valid_id_string()
572 while (*nid && (size_t)(id - card->id) < sizeof(card->id) - 1) { in copy_valid_id_string()
580 /* Set card->id from the given string
583 static void snd_card_set_id_no_lock(struct snd_card *card, const char *src, in snd_card_set_id_no_lock() argument
590 copy_valid_id_string(card, src, nid); in snd_card_set_id_no_lock()
591 id = card->id; in snd_card_set_id_no_lock()
595 * ("card" conflicts with proc directories) in snd_card_set_id_no_lock()
597 if (!*id || !strncmp(id, "card", 4)) { in snd_card_set_id_no_lock()
608 if (card_id_ok(card, id)) in snd_card_set_id_no_lock()
614 if (len + sfxlen >= sizeof(card->id)) in snd_card_set_id_no_lock()
615 spos = id + sizeof(card->id) - sfxlen - 1; in snd_card_set_id_no_lock()
626 dev_err(card->dev, "unable to set card id (%s)\n", id); in snd_card_set_id_no_lock()
627 if (card->proc_root->name) in snd_card_set_id_no_lock()
628 strlcpy(card->id, card->proc_root->name, sizeof(card->id)); in snd_card_set_id_no_lock()
632 * snd_card_set_id - set card identification name
633 * @card: soundcard structure
636 * This function sets the card identification and checks for name
639 void snd_card_set_id(struct snd_card *card, const char *nid) in snd_card_set_id() argument
641 /* check if user specified own card->id */ in snd_card_set_id()
642 if (card->id[0] != '\0') in snd_card_set_id()
645 snd_card_set_id_no_lock(card, nid, nid); in snd_card_set_id()
654 struct snd_card *card = container_of(dev, struct snd_card, card_dev); in card_id_show_attr() local
655 return scnprintf(buf, PAGE_SIZE, "%s\n", card->id); in card_id_show_attr()
662 struct snd_card *card = container_of(dev, struct snd_card, card_dev); in card_id_store_attr() local
663 char buf1[sizeof(card->id)]; in card_id_store_attr()
664 size_t copy = count > sizeof(card->id) - 1 ? in card_id_store_attr()
665 sizeof(card->id) - 1 : count; in card_id_store_attr()
681 strcpy(card->id, buf1); in card_id_store_attr()
682 snd_info_card_id_change(card); in card_id_store_attr()
694 struct snd_card *card = container_of(dev, struct snd_card, card_dev); in card_number_show_attr() local
695 return scnprintf(buf, PAGE_SIZE, "%i\n", card->number); in card_number_show_attr()
711 * snd_card_add_dev_attr - Append a new sysfs attribute group to card
712 * @card: card instance
715 int snd_card_add_dev_attr(struct snd_card *card, in snd_card_add_dev_attr() argument
721 for (i = 0; i < ARRAY_SIZE(card->dev_groups) - 1; i++) { in snd_card_add_dev_attr()
722 if (!card->dev_groups[i]) { in snd_card_add_dev_attr()
723 card->dev_groups[i] = group; in snd_card_add_dev_attr()
728 dev_err(card->dev, "Too many groups assigned\n"); in snd_card_add_dev_attr()
735 * @card: soundcard structure
740 * of the initialization of the card.
744 int snd_card_register(struct snd_card *card) in snd_card_register() argument
748 if (snd_BUG_ON(!card)) in snd_card_register()
751 if (!card->registered) { in snd_card_register()
752 err = device_add(&card->card_dev); in snd_card_register()
755 card->registered = true; in snd_card_register()
758 if ((err = snd_device_register_all(card)) < 0) in snd_card_register()
761 if (snd_cards[card->number]) { in snd_card_register()
764 return snd_info_card_register(card); /* register pending info */ in snd_card_register()
766 if (*card->id) { in snd_card_register()
768 char tmpid[sizeof(card->id)]; in snd_card_register()
769 memcpy(tmpid, card->id, sizeof(card->id)); in snd_card_register()
770 snd_card_set_id_no_lock(card, tmpid, tmpid); in snd_card_register()
774 src = *card->shortname ? card->shortname : card->longname; in snd_card_register()
775 snd_card_set_id_no_lock(card, src, in snd_card_register()
778 snd_cards[card->number] = card; in snd_card_register()
780 err = snd_info_card_register(card); in snd_card_register()
786 snd_mixer_oss_notify_callback(card, SND_MIXER_OSS_NOTIFY_REGISTER); in snd_card_register()
797 struct snd_card *card; in snd_card_info_read() local
801 if ((card = snd_cards[idx]) != NULL) { in snd_card_info_read()
805 card->id, in snd_card_info_read()
806 card->driver, in snd_card_info_read()
807 card->shortname); in snd_card_info_read()
809 card->longname); in snd_card_info_read()
821 struct snd_card *card; in snd_card_info_read_oss() local
825 if ((card = snd_cards[idx]) != NULL) { in snd_card_info_read_oss()
827 snd_iprintf(buffer, "%s\n", card->longname); in snd_card_info_read_oss()
843 struct snd_card *card; in snd_card_module_info_read() local
847 if ((card = snd_cards[idx]) != NULL) in snd_card_module_info_read()
849 idx, card->module->name); in snd_card_module_info_read()
881 * @card: soundcard structure
890 int snd_component_add(struct snd_card *card, const char *component) in snd_component_add() argument
895 ptr = strstr(card->components, component); in snd_component_add()
900 if (strlen(card->components) + 1 + len + 1 > sizeof(card->components)) { in snd_component_add()
904 if (card->components[0] != '\0') in snd_component_add()
905 strcat(card->components, " "); in snd_component_add()
906 strcat(card->components, component); in snd_component_add()
912 * snd_card_file_add - add the file to the file list of the card
913 * @card: soundcard structure
916 * This function adds the file to the file linked-list of the card.
922 int snd_card_file_add(struct snd_card *card, struct file *file) in snd_card_file_add() argument
932 spin_lock(&card->files_lock); in snd_card_file_add()
933 if (card->shutdown) { in snd_card_file_add()
934 spin_unlock(&card->files_lock); in snd_card_file_add()
938 list_add(&mfile->list, &card->files_list); in snd_card_file_add()
939 get_device(&card->card_dev); in snd_card_file_add()
940 spin_unlock(&card->files_lock); in snd_card_file_add()
947 * @card: soundcard structure
950 * This function removes the file formerly added to the card via
958 int snd_card_file_remove(struct snd_card *card, struct file *file) in snd_card_file_remove() argument
962 spin_lock(&card->files_lock); in snd_card_file_remove()
963 list_for_each_entry(mfile, &card->files_list, list) { in snd_card_file_remove()
975 if (list_empty(&card->files_list)) in snd_card_file_remove()
976 wake_up_all(&card->remove_sleep); in snd_card_file_remove()
977 spin_unlock(&card->files_lock); in snd_card_file_remove()
979 dev_err(card->dev, "card file remove problem (%p)\n", file); in snd_card_file_remove()
983 put_device(&card->card_dev); in snd_card_file_remove()
991 * @card: soundcard structure
998 int snd_power_wait(struct snd_card *card, unsigned int power_state) in snd_power_wait() argument
1004 if (snd_power_get_state(card) == power_state) in snd_power_wait()
1007 add_wait_queue(&card->power_sleep, &wait); in snd_power_wait()
1009 if (card->shutdown) { in snd_power_wait()
1013 if (snd_power_get_state(card) == power_state) in snd_power_wait()
1018 remove_wait_queue(&card->power_sleep, &wait); in snd_power_wait()