Lines Matching refs:card

99 int (*snd_mixer_oss_notify_callback)(struct snd_card *card, int free_flag);
107 snd_iprintf(buffer, "%s\n", entry->card->id); in snd_card_id_read()
110 static int init_info_for_card(struct snd_card *card) in init_info_for_card() argument
114 entry = snd_info_create_card_entry(card, "id", card->proc_root); in init_info_for_card()
116 dev_dbg(card->dev, "unable to create card entry\n"); in init_info_for_card()
120 card->proc_id = entry; in init_info_for_card()
122 return snd_info_card_register(card); in init_info_for_card()
125 #define init_info_for_card(card) argument
166 void snd_device_initialize(struct device *dev, struct snd_card *card) in snd_device_initialize() argument
169 if (card) in snd_device_initialize()
170 dev->parent = &card->card_dev; in snd_device_initialize()
176 static int snd_card_do_free(struct snd_card *card);
205 struct snd_card *card; in snd_card_new() local
214 card = kzalloc(sizeof(*card) + extra_size, GFP_KERNEL); in snd_card_new()
215 if (!card) in snd_card_new()
218 card->private_data = (char *)card + sizeof(struct snd_card); in snd_card_new()
220 strlcpy(card->id, xid, sizeof(card->id)); in snd_card_new()
238 kfree(card); in snd_card_new()
245 card->dev = parent; in snd_card_new()
246 card->number = idx; in snd_card_new()
247 card->module = module; in snd_card_new()
248 INIT_LIST_HEAD(&card->devices); in snd_card_new()
249 init_rwsem(&card->controls_rwsem); in snd_card_new()
250 rwlock_init(&card->ctl_files_rwlock); in snd_card_new()
251 INIT_LIST_HEAD(&card->controls); in snd_card_new()
252 INIT_LIST_HEAD(&card->ctl_files); in snd_card_new()
253 spin_lock_init(&card->files_lock); in snd_card_new()
254 INIT_LIST_HEAD(&card->files_list); in snd_card_new()
256 init_waitqueue_head(&card->power_sleep); in snd_card_new()
258 init_waitqueue_head(&card->remove_sleep); in snd_card_new()
260 device_initialize(&card->card_dev); in snd_card_new()
261 card->card_dev.parent = parent; in snd_card_new()
262 card->card_dev.class = sound_class; in snd_card_new()
263 card->card_dev.release = release_card_device; in snd_card_new()
264 card->card_dev.groups = card->dev_groups; in snd_card_new()
265 card->dev_groups[0] = &card_dev_attr_group; in snd_card_new()
266 err = kobject_set_name(&card->card_dev.kobj, "card%d", idx); in snd_card_new()
270 snprintf(card->irq_descr, sizeof(card->irq_descr), "%s:%s", in snd_card_new()
271 dev_driver_string(card->dev), dev_name(&card->card_dev)); in snd_card_new()
275 err = snd_ctl_create(card); in snd_card_new()
280 err = snd_info_card_create(card); in snd_card_new()
285 *card_ret = card; in snd_card_new()
289 snd_device_free_all(card); in snd_card_new()
291 put_device(&card->card_dev); in snd_card_new()
297 int snd_card_locked(int card) in snd_card_locked() argument
302 locked = test_bit(card, snd_cards_lock); in snd_card_locked()
395 int snd_card_disconnect(struct snd_card *card) in snd_card_disconnect() argument
399 if (!card) in snd_card_disconnect()
402 spin_lock(&card->files_lock); in snd_card_disconnect()
403 if (card->shutdown) { in snd_card_disconnect()
404 spin_unlock(&card->files_lock); in snd_card_disconnect()
407 card->shutdown = 1; in snd_card_disconnect()
408 spin_unlock(&card->files_lock); in snd_card_disconnect()
412 snd_cards[card->number] = NULL; in snd_card_disconnect()
413 clear_bit(card->number, snd_cards_lock); in snd_card_disconnect()
418 spin_lock(&card->files_lock); in snd_card_disconnect()
419 list_for_each_entry(mfile, &card->files_list, list) { in snd_card_disconnect()
431 spin_unlock(&card->files_lock); in snd_card_disconnect()
438 snd_mixer_oss_notify_callback(card, SND_MIXER_OSS_NOTIFY_DISCONNECT); in snd_card_disconnect()
442 snd_device_disconnect_all(card); in snd_card_disconnect()
444 snd_info_card_disconnect(card); in snd_card_disconnect()
445 if (card->registered) { in snd_card_disconnect()
446 device_del(&card->card_dev); in snd_card_disconnect()
447 card->registered = false; in snd_card_disconnect()
450 wake_up(&card->power_sleep); in snd_card_disconnect()
465 void snd_card_disconnect_sync(struct snd_card *card) in snd_card_disconnect_sync() argument
469 err = snd_card_disconnect(card); in snd_card_disconnect_sync()
471 dev_err(card->dev, in snd_card_disconnect_sync()
477 spin_lock_irq(&card->files_lock); in snd_card_disconnect_sync()
478 wait_event_lock_irq(card->remove_sleep, in snd_card_disconnect_sync()
479 list_empty(&card->files_list), in snd_card_disconnect_sync()
480 card->files_lock); in snd_card_disconnect_sync()
481 spin_unlock_irq(&card->files_lock); in snd_card_disconnect_sync()
485 static int snd_card_do_free(struct snd_card *card) in snd_card_do_free() argument
489 snd_mixer_oss_notify_callback(card, SND_MIXER_OSS_NOTIFY_FREE); in snd_card_do_free()
491 snd_device_free_all(card); in snd_card_do_free()
492 if (card->private_free) in snd_card_do_free()
493 card->private_free(card); in snd_card_do_free()
494 snd_info_free_entry(card->proc_id); in snd_card_do_free()
495 if (snd_info_card_free(card) < 0) { in snd_card_do_free()
496 dev_warn(card->dev, "unable to free card info\n"); in snd_card_do_free()
499 if (card->release_completion) in snd_card_do_free()
500 complete(card->release_completion); in snd_card_do_free()
501 kfree(card); in snd_card_do_free()
514 int snd_card_free_when_closed(struct snd_card *card) in snd_card_free_when_closed() argument
516 int ret = snd_card_disconnect(card); in snd_card_free_when_closed()
519 put_device(&card->card_dev); in snd_card_free_when_closed()
537 int snd_card_free(struct snd_card *card) in snd_card_free() argument
543 card->release_completion = &released; in snd_card_free()
544 ret = snd_card_free_when_closed(card); in snd_card_free()
567 static bool card_id_ok(struct snd_card *card, const char *id) in card_id_ok() argument
573 if (snd_cards[i] && snd_cards[i] != card && in card_id_ok()
581 static void copy_valid_id_string(struct snd_card *card, const char *src, in copy_valid_id_string() argument
584 char *id = card->id; in copy_valid_id_string()
590 while (*nid && (size_t)(id - card->id) < sizeof(card->id) - 1) { in copy_valid_id_string()
601 static void snd_card_set_id_no_lock(struct snd_card *card, const char *src, in snd_card_set_id_no_lock() argument
608 copy_valid_id_string(card, src, nid); in snd_card_set_id_no_lock()
609 id = card->id; in snd_card_set_id_no_lock()
626 if (card_id_ok(card, id)) in snd_card_set_id_no_lock()
632 if (len + sfxlen >= sizeof(card->id)) in snd_card_set_id_no_lock()
633 spos = id + sizeof(card->id) - sfxlen - 1; in snd_card_set_id_no_lock()
644 dev_err(card->dev, "unable to set card id (%s)\n", id); in snd_card_set_id_no_lock()
645 if (card->proc_root->name) in snd_card_set_id_no_lock()
646 strlcpy(card->id, card->proc_root->name, sizeof(card->id)); in snd_card_set_id_no_lock()
657 void snd_card_set_id(struct snd_card *card, const char *nid) in snd_card_set_id() argument
660 if (card->id[0] != '\0') in snd_card_set_id()
663 snd_card_set_id_no_lock(card, nid, nid); in snd_card_set_id()
672 struct snd_card *card = container_of(dev, struct snd_card, card_dev); in card_id_show_attr() local
673 return scnprintf(buf, PAGE_SIZE, "%s\n", card->id); in card_id_show_attr()
680 struct snd_card *card = container_of(dev, struct snd_card, card_dev); in card_id_store_attr() local
681 char buf1[sizeof(card->id)]; in card_id_store_attr()
682 size_t copy = count > sizeof(card->id) - 1 ? in card_id_store_attr()
683 sizeof(card->id) - 1 : count; in card_id_store_attr()
699 strcpy(card->id, buf1); in card_id_store_attr()
700 snd_info_card_id_change(card); in card_id_store_attr()
712 struct snd_card *card = container_of(dev, struct snd_card, card_dev); in card_number_show_attr() local
713 return scnprintf(buf, PAGE_SIZE, "%i\n", card->number); in card_number_show_attr()
733 int snd_card_add_dev_attr(struct snd_card *card, in snd_card_add_dev_attr() argument
739 for (i = 0; i < ARRAY_SIZE(card->dev_groups) - 1; i++) { in snd_card_add_dev_attr()
740 if (!card->dev_groups[i]) { in snd_card_add_dev_attr()
741 card->dev_groups[i] = group; in snd_card_add_dev_attr()
746 dev_err(card->dev, "Too many groups assigned\n"); in snd_card_add_dev_attr()
762 int snd_card_register(struct snd_card *card) in snd_card_register() argument
766 if (snd_BUG_ON(!card)) in snd_card_register()
769 if (!card->registered) { in snd_card_register()
770 err = device_add(&card->card_dev); in snd_card_register()
773 card->registered = true; in snd_card_register()
776 if ((err = snd_device_register_all(card)) < 0) in snd_card_register()
779 if (snd_cards[card->number]) { in snd_card_register()
782 return snd_info_card_register(card); /* register pending info */ in snd_card_register()
784 if (*card->id) { in snd_card_register()
786 char tmpid[sizeof(card->id)]; in snd_card_register()
787 memcpy(tmpid, card->id, sizeof(card->id)); in snd_card_register()
788 snd_card_set_id_no_lock(card, tmpid, tmpid); in snd_card_register()
792 src = *card->shortname ? card->shortname : card->longname; in snd_card_register()
793 snd_card_set_id_no_lock(card, src, in snd_card_register()
796 snd_cards[card->number] = card; in snd_card_register()
798 init_info_for_card(card); in snd_card_register()
801 snd_mixer_oss_notify_callback(card, SND_MIXER_OSS_NOTIFY_REGISTER); in snd_card_register()
812 struct snd_card *card; in snd_card_info_read() local
816 if ((card = snd_cards[idx]) != NULL) { in snd_card_info_read()
820 card->id, in snd_card_info_read()
821 card->driver, in snd_card_info_read()
822 card->shortname); in snd_card_info_read()
824 card->longname); in snd_card_info_read()
836 struct snd_card *card; in snd_card_info_read_oss() local
840 if ((card = snd_cards[idx]) != NULL) { in snd_card_info_read_oss()
842 snd_iprintf(buffer, "%s\n", card->longname); in snd_card_info_read_oss()
858 struct snd_card *card; in snd_card_module_info_read() local
862 if ((card = snd_cards[idx]) != NULL) in snd_card_module_info_read()
864 idx, card->module->name); in snd_card_module_info_read()
905 int snd_component_add(struct snd_card *card, const char *component) in snd_component_add() argument
910 ptr = strstr(card->components, component); in snd_component_add()
915 if (strlen(card->components) + 1 + len + 1 > sizeof(card->components)) { in snd_component_add()
919 if (card->components[0] != '\0') in snd_component_add()
920 strcat(card->components, " "); in snd_component_add()
921 strcat(card->components, component); in snd_component_add()
937 int snd_card_file_add(struct snd_card *card, struct file *file) in snd_card_file_add() argument
947 spin_lock(&card->files_lock); in snd_card_file_add()
948 if (card->shutdown) { in snd_card_file_add()
949 spin_unlock(&card->files_lock); in snd_card_file_add()
953 list_add(&mfile->list, &card->files_list); in snd_card_file_add()
954 get_device(&card->card_dev); in snd_card_file_add()
955 spin_unlock(&card->files_lock); in snd_card_file_add()
973 int snd_card_file_remove(struct snd_card *card, struct file *file) in snd_card_file_remove() argument
977 spin_lock(&card->files_lock); in snd_card_file_remove()
978 list_for_each_entry(mfile, &card->files_list, list) { in snd_card_file_remove()
990 if (list_empty(&card->files_list)) in snd_card_file_remove()
991 wake_up_all(&card->remove_sleep); in snd_card_file_remove()
992 spin_unlock(&card->files_lock); in snd_card_file_remove()
994 dev_err(card->dev, "card file remove problem (%p)\n", file); in snd_card_file_remove()
998 put_device(&card->card_dev); in snd_card_file_remove()
1013 int snd_power_wait(struct snd_card *card, unsigned int power_state) in snd_power_wait() argument
1019 if (snd_power_get_state(card) == power_state) in snd_power_wait()
1022 add_wait_queue(&card->power_sleep, &wait); in snd_power_wait()
1024 if (card->shutdown) { in snd_power_wait()
1028 if (snd_power_get_state(card) == power_state) in snd_power_wait()
1033 remove_wait_queue(&card->power_sleep, &wait); in snd_power_wait()