Lines Matching refs:card
51 struct snd_card *card; in snd_ctl_open() local
59 card = snd_lookup_minor_data(iminor(inode), SNDRV_DEVICE_TYPE_CONTROL); in snd_ctl_open()
60 if (!card) { in snd_ctl_open()
64 err = snd_card_file_add(card, file); in snd_ctl_open()
69 if (!try_module_get(card->module)) { in snd_ctl_open()
81 ctl->card = card; in snd_ctl_open()
86 write_lock_irqsave(&card->ctl_files_rwlock, flags); in snd_ctl_open()
87 list_add_tail(&ctl->list, &card->ctl_files); in snd_ctl_open()
88 write_unlock_irqrestore(&card->ctl_files_rwlock, flags); in snd_ctl_open()
89 snd_card_unref(card); in snd_ctl_open()
93 module_put(card->module); in snd_ctl_open()
95 snd_card_file_remove(card, file); in snd_ctl_open()
97 if (card) in snd_ctl_open()
98 snd_card_unref(card); in snd_ctl_open()
119 struct snd_card *card; in snd_ctl_release() local
126 card = ctl->card; in snd_ctl_release()
127 write_lock_irqsave(&card->ctl_files_rwlock, flags); in snd_ctl_release()
129 write_unlock_irqrestore(&card->ctl_files_rwlock, flags); in snd_ctl_release()
130 down_write(&card->controls_rwsem); in snd_ctl_release()
131 list_for_each_entry(control, &card->controls, list) in snd_ctl_release()
135 up_write(&card->controls_rwsem); in snd_ctl_release()
139 module_put(card->module); in snd_ctl_release()
140 snd_card_file_remove(card, file); in snd_ctl_release()
144 void snd_ctl_notify(struct snd_card *card, unsigned int mask, in snd_ctl_notify() argument
151 if (snd_BUG_ON(!card || !id)) in snd_ctl_notify()
153 read_lock(&card->ctl_files_rwlock); in snd_ctl_notify()
155 card->mixer_oss_change_count++; in snd_ctl_notify()
157 list_for_each_entry(ctl, &card->ctl_files, list) { in snd_ctl_notify()
180 read_unlock(&card->ctl_files_rwlock); in snd_ctl_notify()
287 static bool snd_ctl_remove_numid_conflict(struct snd_card *card, in snd_ctl_remove_numid_conflict() argument
292 list_for_each_entry(kctl, &card->controls, list) { in snd_ctl_remove_numid_conflict()
293 if (kctl->id.numid < card->last_numid + 1 + count && in snd_ctl_remove_numid_conflict()
294 kctl->id.numid + kctl->count > card->last_numid + 1) { in snd_ctl_remove_numid_conflict()
295 card->last_numid = kctl->id.numid + kctl->count - 1; in snd_ctl_remove_numid_conflict()
302 static int snd_ctl_find_hole(struct snd_card *card, unsigned int count) in snd_ctl_find_hole() argument
306 while (snd_ctl_remove_numid_conflict(card, count)) { in snd_ctl_find_hole()
330 int snd_ctl_add(struct snd_card *card, struct snd_kcontrol *kcontrol) in snd_ctl_add() argument
338 if (snd_BUG_ON(!card || !kcontrol->info)) in snd_ctl_add()
341 down_write(&card->controls_rwsem); in snd_ctl_add()
342 if (snd_ctl_find_id(card, &id)) { in snd_ctl_add()
343 up_write(&card->controls_rwsem); in snd_ctl_add()
353 if (snd_ctl_find_hole(card, kcontrol->count) < 0) { in snd_ctl_add()
354 up_write(&card->controls_rwsem); in snd_ctl_add()
358 list_add_tail(&kcontrol->list, &card->controls); in snd_ctl_add()
359 card->controls_count += kcontrol->count; in snd_ctl_add()
360 kcontrol->id.numid = card->last_numid + 1; in snd_ctl_add()
361 card->last_numid += kcontrol->count; in snd_ctl_add()
362 up_write(&card->controls_rwsem); in snd_ctl_add()
364 snd_ctl_notify(card, SNDRV_CTL_EVENT_MASK_ADD, &id); in snd_ctl_add()
388 int snd_ctl_replace(struct snd_card *card, struct snd_kcontrol *kcontrol, in snd_ctl_replace() argument
398 if (snd_BUG_ON(!card || !kcontrol->info)) { in snd_ctl_replace()
403 down_write(&card->controls_rwsem); in snd_ctl_replace()
404 old = snd_ctl_find_id(card, &id); in snd_ctl_replace()
408 up_write(&card->controls_rwsem); in snd_ctl_replace()
412 ret = snd_ctl_remove(card, old); in snd_ctl_replace()
414 up_write(&card->controls_rwsem); in snd_ctl_replace()
418 if (snd_ctl_find_hole(card, kcontrol->count) < 0) { in snd_ctl_replace()
419 up_write(&card->controls_rwsem); in snd_ctl_replace()
423 list_add_tail(&kcontrol->list, &card->controls); in snd_ctl_replace()
424 card->controls_count += kcontrol->count; in snd_ctl_replace()
425 kcontrol->id.numid = card->last_numid + 1; in snd_ctl_replace()
426 card->last_numid += kcontrol->count; in snd_ctl_replace()
427 up_write(&card->controls_rwsem); in snd_ctl_replace()
429 snd_ctl_notify(card, SNDRV_CTL_EVENT_MASK_ADD, &id); in snd_ctl_replace()
449 int snd_ctl_remove(struct snd_card *card, struct snd_kcontrol *kcontrol) in snd_ctl_remove() argument
454 if (snd_BUG_ON(!card || !kcontrol)) in snd_ctl_remove()
457 card->controls_count -= kcontrol->count; in snd_ctl_remove()
460 snd_ctl_notify(card, SNDRV_CTL_EVENT_MASK_REMOVE, &id); in snd_ctl_remove()
477 int snd_ctl_remove_id(struct snd_card *card, struct snd_ctl_elem_id *id) in snd_ctl_remove_id() argument
482 down_write(&card->controls_rwsem); in snd_ctl_remove_id()
483 kctl = snd_ctl_find_id(card, id); in snd_ctl_remove_id()
485 up_write(&card->controls_rwsem); in snd_ctl_remove_id()
488 ret = snd_ctl_remove(card, kctl); in snd_ctl_remove_id()
489 up_write(&card->controls_rwsem); in snd_ctl_remove_id()
508 struct snd_card *card = file->card; in snd_ctl_remove_user_ctl() local
512 down_write(&card->controls_rwsem); in snd_ctl_remove_user_ctl()
513 kctl = snd_ctl_find_id(card, id); in snd_ctl_remove_user_ctl()
527 ret = snd_ctl_remove(card, kctl); in snd_ctl_remove_user_ctl()
530 card->user_ctl_count--; in snd_ctl_remove_user_ctl()
532 up_write(&card->controls_rwsem); in snd_ctl_remove_user_ctl()
547 int snd_ctl_activate_id(struct snd_card *card, struct snd_ctl_elem_id *id, in snd_ctl_activate_id() argument
555 down_write(&card->controls_rwsem); in snd_ctl_activate_id()
556 kctl = snd_ctl_find_id(card, id); in snd_ctl_activate_id()
575 up_write(&card->controls_rwsem); in snd_ctl_activate_id()
577 snd_ctl_notify(card, SNDRV_CTL_EVENT_MASK_INFO, id); in snd_ctl_activate_id()
593 int snd_ctl_rename_id(struct snd_card *card, struct snd_ctl_elem_id *src_id, in snd_ctl_rename_id() argument
598 down_write(&card->controls_rwsem); in snd_ctl_rename_id()
599 kctl = snd_ctl_find_id(card, src_id); in snd_ctl_rename_id()
601 up_write(&card->controls_rwsem); in snd_ctl_rename_id()
605 kctl->id.numid = card->last_numid + 1; in snd_ctl_rename_id()
606 card->last_numid += kctl->count; in snd_ctl_rename_id()
607 up_write(&card->controls_rwsem); in snd_ctl_rename_id()
626 struct snd_kcontrol *snd_ctl_find_numid(struct snd_card *card, unsigned int numid) in snd_ctl_find_numid() argument
630 if (snd_BUG_ON(!card || !numid)) in snd_ctl_find_numid()
632 list_for_each_entry(kctl, &card->controls, list) { in snd_ctl_find_numid()
654 struct snd_kcontrol *snd_ctl_find_id(struct snd_card *card, in snd_ctl_find_id() argument
659 if (snd_BUG_ON(!card || !id)) in snd_ctl_find_id()
662 return snd_ctl_find_numid(card, id->numid); in snd_ctl_find_id()
663 list_for_each_entry(kctl, &card->controls, list) { in snd_ctl_find_id()
683 static int snd_ctl_card_info(struct snd_card *card, struct snd_ctl_file * ctl, in snd_ctl_card_info() argument
692 info->card = card->number; in snd_ctl_card_info()
693 strlcpy(info->id, card->id, sizeof(info->id)); in snd_ctl_card_info()
694 strlcpy(info->driver, card->driver, sizeof(info->driver)); in snd_ctl_card_info()
695 strlcpy(info->name, card->shortname, sizeof(info->name)); in snd_ctl_card_info()
696 strlcpy(info->longname, card->longname, sizeof(info->longname)); in snd_ctl_card_info()
697 strlcpy(info->mixername, card->mixername, sizeof(info->mixername)); in snd_ctl_card_info()
698 strlcpy(info->components, card->components, sizeof(info->components)); in snd_ctl_card_info()
708 static int snd_ctl_elem_list(struct snd_card *card, in snd_ctl_elem_list() argument
729 down_read(&card->controls_rwsem); in snd_ctl_elem_list()
730 list.count = card->controls_count; in snd_ctl_elem_list()
731 plist = card->controls.next; in snd_ctl_elem_list()
732 while (plist != &card->controls) { in snd_ctl_elem_list()
743 while (space > 0 && plist != &card->controls) { in snd_ctl_elem_list()
754 up_read(&card->controls_rwsem); in snd_ctl_elem_list()
763 down_read(&card->controls_rwsem); in snd_ctl_elem_list()
764 list.count = card->controls_count; in snd_ctl_elem_list()
765 up_read(&card->controls_rwsem); in snd_ctl_elem_list()
775 struct snd_card *card = ctl->card; in snd_ctl_elem_info() local
781 down_read(&card->controls_rwsem); in snd_ctl_elem_info()
782 kctl = snd_ctl_find_id(card, &info->id); in snd_ctl_elem_info()
784 up_read(&card->controls_rwsem); in snd_ctl_elem_info()
806 up_read(&card->controls_rwsem); in snd_ctl_elem_info()
818 snd_power_lock(ctl->card); in snd_ctl_elem_info_user()
819 result = snd_power_wait(ctl->card, SNDRV_CTL_POWER_D0); in snd_ctl_elem_info_user()
822 snd_power_unlock(ctl->card); in snd_ctl_elem_info_user()
829 static int snd_ctl_elem_read(struct snd_card *card, in snd_ctl_elem_read() argument
837 down_read(&card->controls_rwsem); in snd_ctl_elem_read()
838 kctl = snd_ctl_find_id(card, &control->id); in snd_ctl_elem_read()
851 up_read(&card->controls_rwsem); in snd_ctl_elem_read()
855 static int snd_ctl_elem_read_user(struct snd_card *card, in snd_ctl_elem_read_user() argument
865 snd_power_lock(card); in snd_ctl_elem_read_user()
866 result = snd_power_wait(card, SNDRV_CTL_POWER_D0); in snd_ctl_elem_read_user()
868 result = snd_ctl_elem_read(card, control); in snd_ctl_elem_read_user()
869 snd_power_unlock(card); in snd_ctl_elem_read_user()
877 static int snd_ctl_elem_write(struct snd_card *card, struct snd_ctl_file *file, in snd_ctl_elem_write() argument
885 down_read(&card->controls_rwsem); in snd_ctl_elem_write()
886 kctl = snd_ctl_find_id(card, &control->id); in snd_ctl_elem_write()
901 up_read(&card->controls_rwsem); in snd_ctl_elem_write()
902 snd_ctl_notify(card, SNDRV_CTL_EVENT_MASK_VALUE, in snd_ctl_elem_write()
907 up_read(&card->controls_rwsem); in snd_ctl_elem_write()
915 struct snd_card *card; in snd_ctl_elem_write_user() local
922 card = file->card; in snd_ctl_elem_write_user()
923 snd_power_lock(card); in snd_ctl_elem_write_user()
924 result = snd_power_wait(card, SNDRV_CTL_POWER_D0); in snd_ctl_elem_write_user()
926 result = snd_ctl_elem_write(card, file, control); in snd_ctl_elem_write_user()
927 snd_power_unlock(card); in snd_ctl_elem_write_user()
938 struct snd_card *card = file->card; in snd_ctl_elem_lock() local
946 down_write(&card->controls_rwsem); in snd_ctl_elem_lock()
947 kctl = snd_ctl_find_id(card, &id); in snd_ctl_elem_lock()
959 up_write(&card->controls_rwsem); in snd_ctl_elem_lock()
966 struct snd_card *card = file->card; in snd_ctl_elem_unlock() local
974 down_write(&card->controls_rwsem); in snd_ctl_elem_unlock()
975 kctl = snd_ctl_find_id(card, &id); in snd_ctl_elem_unlock()
989 up_write(&card->controls_rwsem); in snd_ctl_elem_unlock()
1133 struct snd_card *card = file->card; in snd_ctl_elem_add() local
1155 if (card->user_ctl_count >= MAX_USER_CONTROLS) in snd_ctl_elem_add()
1228 err = snd_ctl_add(card, _kctl); in snd_ctl_elem_add()
1232 down_write(&card->controls_rwsem); in snd_ctl_elem_add()
1233 card->user_ctl_count++; in snd_ctl_elem_add()
1234 up_write(&card->controls_rwsem); in snd_ctl_elem_add()
1283 struct snd_card *card = file->card; in snd_ctl_tlv_ioctl() local
1294 down_read(&card->controls_rwsem); in snd_ctl_tlv_ioctl()
1295 kctl = snd_ctl_find_numid(card, tlv.numid); in snd_ctl_tlv_ioctl()
1318 up_read(&card->controls_rwsem); in snd_ctl_tlv_ioctl()
1319 snd_ctl_notify(card, SNDRV_CTL_EVENT_MASK_TLV, &kctl->id); in snd_ctl_tlv_ioctl()
1336 up_read(&card->controls_rwsem); in snd_ctl_tlv_ioctl()
1343 struct snd_card *card; in snd_ctl_ioctl() local
1350 card = ctl->card; in snd_ctl_ioctl()
1351 if (snd_BUG_ON(!card)) in snd_ctl_ioctl()
1357 return snd_ctl_card_info(card, ctl, cmd, argp); in snd_ctl_ioctl()
1359 return snd_ctl_elem_list(card, argp); in snd_ctl_ioctl()
1363 return snd_ctl_elem_read_user(card, argp); in snd_ctl_ioctl()
1388 return put_user(card->power_state, ip) ? -EFAULT : 0; in snd_ctl_ioctl()
1395 err = p->fioctl(card, ctl, cmd, arg); in snd_ctl_ioctl()
1414 if (snd_BUG_ON(!ctl || !ctl->card)) in snd_ctl_read()
1436 if (ctl->card->shutdown) in snd_ctl_read()
1594 struct snd_card *card = device->device_data; in snd_ctl_dev_register() local
1598 if (snd_BUG_ON(!card)) in snd_ctl_dev_register()
1600 cardnum = card->number; in snd_ctl_dev_register()
1604 if ((err = snd_register_device(SNDRV_DEVICE_TYPE_CONTROL, card, -1, in snd_ctl_dev_register()
1605 &snd_ctl_f_ops, card, name)) < 0) in snd_ctl_dev_register()
1615 struct snd_card *card = device->device_data; in snd_ctl_dev_disconnect() local
1619 if (snd_BUG_ON(!card)) in snd_ctl_dev_disconnect()
1621 cardnum = card->number; in snd_ctl_dev_disconnect()
1625 read_lock(&card->ctl_files_rwlock); in snd_ctl_dev_disconnect()
1626 list_for_each_entry(ctl, &card->ctl_files, list) { in snd_ctl_dev_disconnect()
1630 read_unlock(&card->ctl_files_rwlock); in snd_ctl_dev_disconnect()
1633 card, -1)) < 0) in snd_ctl_dev_disconnect()
1643 struct snd_card *card = device->device_data; in snd_ctl_dev_free() local
1646 down_write(&card->controls_rwsem); in snd_ctl_dev_free()
1647 while (!list_empty(&card->controls)) { in snd_ctl_dev_free()
1648 control = snd_kcontrol(card->controls.next); in snd_ctl_dev_free()
1649 snd_ctl_remove(card, control); in snd_ctl_dev_free()
1651 up_write(&card->controls_rwsem); in snd_ctl_dev_free()
1659 int snd_ctl_create(struct snd_card *card) in snd_ctl_create() argument
1667 if (snd_BUG_ON(!card)) in snd_ctl_create()
1669 return snd_device_new(card, SNDRV_DEV_CONTROL, card, &ops); in snd_ctl_create()