Lines Matching refs:card

85 int (*snd_mixer_oss_notify_callback)(struct snd_card *card, int free_flag);
127 void snd_device_initialize(struct device *dev, struct snd_card *card) in snd_device_initialize() argument
130 if (card) in snd_device_initialize()
131 dev->parent = &card->card_dev; in snd_device_initialize()
137 static int snd_card_init(struct snd_card *card, struct device *parent,
140 static int snd_card_do_free(struct snd_card *card);
167 struct snd_card *card; in snd_card_new() local
176 card = kzalloc(sizeof(*card) + extra_size, GFP_KERNEL); in snd_card_new()
177 if (!card) in snd_card_new()
180 err = snd_card_init(card, parent, idx, xid, module, extra_size); in snd_card_new()
182 kfree(card); in snd_card_new()
186 *card_ret = card; in snd_card_new()
217 struct snd_card *card; in snd_devm_card_new() local
221 card = devres_alloc(__snd_card_release, sizeof(*card) + extra_size, in snd_devm_card_new()
223 if (!card) in snd_devm_card_new()
225 card->managed = true; in snd_devm_card_new()
226 err = snd_card_init(card, parent, idx, xid, module, extra_size); in snd_devm_card_new()
228 devres_free(card); in snd_devm_card_new()
232 devres_add(parent, card); in snd_devm_card_new()
233 *card_ret = card; in snd_devm_card_new()
238 static int snd_card_init(struct snd_card *card, struct device *parent, in snd_card_init() argument
248 card->private_data = (char *)card + sizeof(struct snd_card); in snd_card_init()
250 strscpy(card->id, xid, sizeof(card->id)); in snd_card_init()
274 card->dev = parent; in snd_card_init()
275 card->number = idx; in snd_card_init()
278 card->module = module; in snd_card_init()
280 INIT_LIST_HEAD(&card->devices); in snd_card_init()
281 init_rwsem(&card->controls_rwsem); in snd_card_init()
282 rwlock_init(&card->ctl_files_rwlock); in snd_card_init()
283 INIT_LIST_HEAD(&card->controls); in snd_card_init()
284 INIT_LIST_HEAD(&card->ctl_files); in snd_card_init()
285 spin_lock_init(&card->files_lock); in snd_card_init()
286 INIT_LIST_HEAD(&card->files_list); in snd_card_init()
287 mutex_init(&card->memory_mutex); in snd_card_init()
289 init_waitqueue_head(&card->power_sleep); in snd_card_init()
290 init_waitqueue_head(&card->power_ref_sleep); in snd_card_init()
291 atomic_set(&card->power_ref, 0); in snd_card_init()
293 init_waitqueue_head(&card->remove_sleep); in snd_card_init()
294 card->sync_irq = -1; in snd_card_init()
296 device_initialize(&card->card_dev); in snd_card_init()
297 card->card_dev.parent = parent; in snd_card_init()
298 card->card_dev.class = sound_class; in snd_card_init()
299 card->card_dev.release = release_card_device; in snd_card_init()
300 card->card_dev.groups = card->dev_groups; in snd_card_init()
301 card->dev_groups[0] = &card_dev_attr_group; in snd_card_init()
302 err = kobject_set_name(&card->card_dev.kobj, "card%d", idx); in snd_card_init()
306 snprintf(card->irq_descr, sizeof(card->irq_descr), "%s:%s", in snd_card_init()
307 dev_driver_string(card->dev), dev_name(&card->card_dev)); in snd_card_init()
311 err = snd_ctl_create(card); in snd_card_init()
316 err = snd_info_card_create(card); in snd_card_init()
324 card->debugfs_root = debugfs_create_dir(name, sound_debugfs_root); in snd_card_init()
329 snd_device_free_all(card); in snd_card_init()
331 put_device(&card->card_dev); in snd_card_init()
344 struct snd_card *card; in snd_card_ref() local
347 card = snd_cards[idx]; in snd_card_ref()
348 if (card) in snd_card_ref()
349 get_device(&card->card_dev); in snd_card_ref()
351 return card; in snd_card_ref()
356 int snd_card_locked(int card) in snd_card_locked() argument
361 locked = test_bit(card, snd_cards_lock); in snd_card_locked()
454 int snd_card_disconnect(struct snd_card *card) in snd_card_disconnect() argument
458 if (!card) in snd_card_disconnect()
461 spin_lock(&card->files_lock); in snd_card_disconnect()
462 if (card->shutdown) { in snd_card_disconnect()
463 spin_unlock(&card->files_lock); in snd_card_disconnect()
466 card->shutdown = 1; in snd_card_disconnect()
469 list_for_each_entry(mfile, &card->files_list, list) { in snd_card_disconnect()
481 spin_unlock(&card->files_lock); in snd_card_disconnect()
488 snd_mixer_oss_notify_callback(card, SND_MIXER_OSS_NOTIFY_DISCONNECT); in snd_card_disconnect()
492 snd_device_disconnect_all(card); in snd_card_disconnect()
494 if (card->sync_irq > 0) in snd_card_disconnect()
495 synchronize_irq(card->sync_irq); in snd_card_disconnect()
497 snd_info_card_disconnect(card); in snd_card_disconnect()
498 if (card->registered) { in snd_card_disconnect()
499 device_del(&card->card_dev); in snd_card_disconnect()
500 card->registered = false; in snd_card_disconnect()
505 snd_cards[card->number] = NULL; in snd_card_disconnect()
506 clear_bit(card->number, snd_cards_lock); in snd_card_disconnect()
510 wake_up(&card->power_sleep); in snd_card_disconnect()
511 snd_power_sync_ref(card); in snd_card_disconnect()
526 void snd_card_disconnect_sync(struct snd_card *card) in snd_card_disconnect_sync() argument
530 err = snd_card_disconnect(card); in snd_card_disconnect_sync()
532 dev_err(card->dev, in snd_card_disconnect_sync()
538 spin_lock_irq(&card->files_lock); in snd_card_disconnect_sync()
539 wait_event_lock_irq(card->remove_sleep, in snd_card_disconnect_sync()
540 list_empty(&card->files_list), in snd_card_disconnect_sync()
541 card->files_lock); in snd_card_disconnect_sync()
542 spin_unlock_irq(&card->files_lock); in snd_card_disconnect_sync()
546 static int snd_card_do_free(struct snd_card *card) in snd_card_do_free() argument
548 card->releasing = true; in snd_card_do_free()
551 snd_mixer_oss_notify_callback(card, SND_MIXER_OSS_NOTIFY_FREE); in snd_card_do_free()
553 snd_device_free_all(card); in snd_card_do_free()
554 if (card->private_free) in snd_card_do_free()
555 card->private_free(card); in snd_card_do_free()
556 if (snd_info_card_free(card) < 0) { in snd_card_do_free()
557 dev_warn(card->dev, "unable to free card info\n"); in snd_card_do_free()
561 debugfs_remove(card->debugfs_root); in snd_card_do_free()
562 card->debugfs_root = NULL; in snd_card_do_free()
564 if (card->release_completion) in snd_card_do_free()
565 complete(card->release_completion); in snd_card_do_free()
566 if (!card->managed) in snd_card_do_free()
567 kfree(card); in snd_card_do_free()
580 int snd_card_free_when_closed(struct snd_card *card) in snd_card_free_when_closed() argument
582 int ret = snd_card_disconnect(card); in snd_card_free_when_closed()
585 put_device(&card->card_dev); in snd_card_free_when_closed()
603 int snd_card_free(struct snd_card *card) in snd_card_free() argument
614 if (card->releasing) in snd_card_free()
617 card->release_completion = &released; in snd_card_free()
618 ret = snd_card_free_when_closed(card); in snd_card_free()
642 static bool card_id_ok(struct snd_card *card, const char *id) in card_id_ok() argument
648 if (snd_cards[i] && snd_cards[i] != card && in card_id_ok()
656 static void copy_valid_id_string(struct snd_card *card, const char *src, in copy_valid_id_string() argument
659 char *id = card->id; in copy_valid_id_string()
665 while (*nid && (size_t)(id - card->id) < sizeof(card->id) - 1) { in copy_valid_id_string()
676 static void snd_card_set_id_no_lock(struct snd_card *card, const char *src, in snd_card_set_id_no_lock() argument
683 copy_valid_id_string(card, src, nid); in snd_card_set_id_no_lock()
684 id = card->id; in snd_card_set_id_no_lock()
701 if (card_id_ok(card, id)) in snd_card_set_id_no_lock()
707 if (len + sfxlen >= sizeof(card->id)) in snd_card_set_id_no_lock()
708 spos = id + sizeof(card->id) - sfxlen - 1; in snd_card_set_id_no_lock()
719 dev_err(card->dev, "unable to set card id (%s)\n", id); in snd_card_set_id_no_lock()
720 if (card->proc_root->name) in snd_card_set_id_no_lock()
721 strscpy(card->id, card->proc_root->name, sizeof(card->id)); in snd_card_set_id_no_lock()
732 void snd_card_set_id(struct snd_card *card, const char *nid) in snd_card_set_id() argument
735 if (card->id[0] != '\0') in snd_card_set_id()
738 snd_card_set_id_no_lock(card, nid, nid); in snd_card_set_id()
746 struct snd_card *card = container_of(dev, struct snd_card, card_dev); in id_show() local
747 return scnprintf(buf, PAGE_SIZE, "%s\n", card->id); in id_show()
753 struct snd_card *card = container_of(dev, struct snd_card, card_dev); in id_store() local
754 char buf1[sizeof(card->id)]; in id_store()
755 size_t copy = count > sizeof(card->id) - 1 ? in id_store()
756 sizeof(card->id) - 1 : count; in id_store()
772 strcpy(card->id, buf1); in id_store()
773 snd_info_card_id_change(card); in id_store()
784 struct snd_card *card = container_of(dev, struct snd_card, card_dev); in number_show() local
785 return scnprintf(buf, PAGE_SIZE, "%i\n", card->number); in number_show()
805 int snd_card_add_dev_attr(struct snd_card *card, in snd_card_add_dev_attr() argument
811 for (i = 0; i < ARRAY_SIZE(card->dev_groups) - 1; i++) { in snd_card_add_dev_attr()
812 if (!card->dev_groups[i]) { in snd_card_add_dev_attr()
813 card->dev_groups[i] = group; in snd_card_add_dev_attr()
818 dev_err(card->dev, "Too many groups assigned\n"); in snd_card_add_dev_attr()
839 int snd_card_register(struct snd_card *card) in snd_card_register() argument
843 if (snd_BUG_ON(!card)) in snd_card_register()
846 if (!card->registered) { in snd_card_register()
847 err = device_add(&card->card_dev); in snd_card_register()
850 card->registered = true; in snd_card_register()
852 if (card->managed) in snd_card_register()
853 devm_remove_action(card->dev, trigger_card_free, card); in snd_card_register()
856 if (card->managed) { in snd_card_register()
857 err = devm_add_action(card->dev, trigger_card_free, card); in snd_card_register()
862 err = snd_device_register_all(card); in snd_card_register()
866 if (snd_cards[card->number]) { in snd_card_register()
869 return snd_info_card_register(card); /* register pending info */ in snd_card_register()
871 if (*card->id) { in snd_card_register()
873 char tmpid[sizeof(card->id)]; in snd_card_register()
874 memcpy(tmpid, card->id, sizeof(card->id)); in snd_card_register()
875 snd_card_set_id_no_lock(card, tmpid, tmpid); in snd_card_register()
879 src = *card->shortname ? card->shortname : card->longname; in snd_card_register()
880 snd_card_set_id_no_lock(card, src, in snd_card_register()
883 snd_cards[card->number] = card; in snd_card_register()
885 err = snd_info_card_register(card); in snd_card_register()
891 snd_mixer_oss_notify_callback(card, SND_MIXER_OSS_NOTIFY_REGISTER); in snd_card_register()
902 struct snd_card *card; in snd_card_info_read() local
906 card = snd_cards[idx]; in snd_card_info_read()
907 if (card) { in snd_card_info_read()
911 card->id, in snd_card_info_read()
912 card->driver, in snd_card_info_read()
913 card->shortname); in snd_card_info_read()
915 card->longname); in snd_card_info_read()
927 struct snd_card *card; in snd_card_info_read_oss() local
931 card = snd_cards[idx]; in snd_card_info_read_oss()
932 if (card) { in snd_card_info_read_oss()
934 snd_iprintf(buffer, "%s\n", card->longname); in snd_card_info_read_oss()
950 struct snd_card *card; in snd_card_module_info_read() local
954 card = snd_cards[idx]; in snd_card_module_info_read()
955 if (card) in snd_card_module_info_read()
957 idx, card->module->name); in snd_card_module_info_read()
998 int snd_component_add(struct snd_card *card, const char *component) in snd_component_add() argument
1003 ptr = strstr(card->components, component); in snd_component_add()
1008 if (strlen(card->components) + 1 + len + 1 > sizeof(card->components)) { in snd_component_add()
1012 if (card->components[0] != '\0') in snd_component_add()
1013 strcat(card->components, " "); in snd_component_add()
1014 strcat(card->components, component); in snd_component_add()
1030 int snd_card_file_add(struct snd_card *card, struct file *file) in snd_card_file_add() argument
1040 spin_lock(&card->files_lock); in snd_card_file_add()
1041 if (card->shutdown) { in snd_card_file_add()
1042 spin_unlock(&card->files_lock); in snd_card_file_add()
1046 list_add(&mfile->list, &card->files_list); in snd_card_file_add()
1047 get_device(&card->card_dev); in snd_card_file_add()
1048 spin_unlock(&card->files_lock); in snd_card_file_add()
1066 int snd_card_file_remove(struct snd_card *card, struct file *file) in snd_card_file_remove() argument
1070 spin_lock(&card->files_lock); in snd_card_file_remove()
1071 list_for_each_entry(mfile, &card->files_list, list) { in snd_card_file_remove()
1083 if (list_empty(&card->files_list)) in snd_card_file_remove()
1084 wake_up_all(&card->remove_sleep); in snd_card_file_remove()
1085 spin_unlock(&card->files_lock); in snd_card_file_remove()
1087 dev_err(card->dev, "card file remove problem (%p)\n", file); in snd_card_file_remove()
1091 put_device(&card->card_dev); in snd_card_file_remove()
1112 int snd_power_ref_and_wait(struct snd_card *card) in snd_power_ref_and_wait() argument
1117 snd_power_ref(card); in snd_power_ref_and_wait()
1119 if (snd_power_get_state(card) == SNDRV_CTL_POWER_D0) in snd_power_ref_and_wait()
1122 add_wait_queue(&card->power_sleep, &wait); in snd_power_ref_and_wait()
1124 if (card->shutdown) { in snd_power_ref_and_wait()
1128 if (snd_power_get_state(card) == SNDRV_CTL_POWER_D0) in snd_power_ref_and_wait()
1130 snd_power_unref(card); in snd_power_ref_and_wait()
1133 snd_power_ref(card); in snd_power_ref_and_wait()
1135 remove_wait_queue(&card->power_sleep, &wait); in snd_power_ref_and_wait()
1148 int snd_power_wait(struct snd_card *card) in snd_power_wait() argument
1152 ret = snd_power_ref_and_wait(card); in snd_power_wait()
1153 snd_power_unref(card); in snd_power_wait()