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()
154 void snd_ctl_notify(struct snd_card *card, unsigned int mask, in snd_ctl_notify() argument
161 if (snd_BUG_ON(!card || !id)) in snd_ctl_notify()
163 read_lock(&card->ctl_files_rwlock); in snd_ctl_notify()
165 card->mixer_oss_change_count++; in snd_ctl_notify()
167 list_for_each_entry(ctl, &card->ctl_files, list) { in snd_ctl_notify()
183 dev_err(card->dev, "No memory available to allocate event\n"); in snd_ctl_notify()
190 read_unlock(&card->ctl_files_rwlock); in snd_ctl_notify()
314 static bool snd_ctl_remove_numid_conflict(struct snd_card *card, in snd_ctl_remove_numid_conflict() argument
320 if (card->last_numid >= UINT_MAX - count) in snd_ctl_remove_numid_conflict()
321 card->last_numid = 0; in snd_ctl_remove_numid_conflict()
323 list_for_each_entry(kctl, &card->controls, list) { in snd_ctl_remove_numid_conflict()
324 if (kctl->id.numid < card->last_numid + 1 + count && in snd_ctl_remove_numid_conflict()
325 kctl->id.numid + kctl->count > card->last_numid + 1) { in snd_ctl_remove_numid_conflict()
326 card->last_numid = kctl->id.numid + kctl->count - 1; in snd_ctl_remove_numid_conflict()
333 static int snd_ctl_find_hole(struct snd_card *card, unsigned int count) in snd_ctl_find_hole() argument
337 while (snd_ctl_remove_numid_conflict(card, count)) { in snd_ctl_find_hole()
340 dev_err(card->dev, "unable to allocate new control numid\n"); in snd_ctl_find_hole()
361 int snd_ctl_add(struct snd_card *card, struct snd_kcontrol *kcontrol) in snd_ctl_add() argument
370 if (snd_BUG_ON(!card || !kcontrol->info)) in snd_ctl_add()
376 down_write(&card->controls_rwsem); in snd_ctl_add()
377 if (snd_ctl_find_id(card, &id)) { in snd_ctl_add()
378 up_write(&card->controls_rwsem); in snd_ctl_add()
379 dev_err(card->dev, "control %i:%i:%i:%s:%i is already present\n", in snd_ctl_add()
388 if (snd_ctl_find_hole(card, kcontrol->count) < 0) { in snd_ctl_add()
389 up_write(&card->controls_rwsem); in snd_ctl_add()
393 list_add_tail(&kcontrol->list, &card->controls); in snd_ctl_add()
394 card->controls_count += kcontrol->count; in snd_ctl_add()
395 kcontrol->id.numid = card->last_numid + 1; in snd_ctl_add()
396 card->last_numid += kcontrol->count; in snd_ctl_add()
399 up_write(&card->controls_rwsem); in snd_ctl_add()
401 snd_ctl_notify(card, SNDRV_CTL_EVENT_MASK_ADD, &id); in snd_ctl_add()
424 int snd_ctl_replace(struct snd_card *card, struct snd_kcontrol *kcontrol, in snd_ctl_replace() argument
435 if (snd_BUG_ON(!card || !kcontrol->info)) { in snd_ctl_replace()
440 down_write(&card->controls_rwsem); in snd_ctl_replace()
441 old = snd_ctl_find_id(card, &id); in snd_ctl_replace()
445 up_write(&card->controls_rwsem); in snd_ctl_replace()
449 ret = snd_ctl_remove(card, old); in snd_ctl_replace()
451 up_write(&card->controls_rwsem); in snd_ctl_replace()
455 if (snd_ctl_find_hole(card, kcontrol->count) < 0) { in snd_ctl_replace()
456 up_write(&card->controls_rwsem); in snd_ctl_replace()
460 list_add_tail(&kcontrol->list, &card->controls); in snd_ctl_replace()
461 card->controls_count += kcontrol->count; in snd_ctl_replace()
462 kcontrol->id.numid = card->last_numid + 1; in snd_ctl_replace()
463 card->last_numid += kcontrol->count; in snd_ctl_replace()
466 up_write(&card->controls_rwsem); in snd_ctl_replace()
468 snd_ctl_notify(card, SNDRV_CTL_EVENT_MASK_ADD, &id); in snd_ctl_replace()
488 int snd_ctl_remove(struct snd_card *card, struct snd_kcontrol *kcontrol) in snd_ctl_remove() argument
493 if (snd_BUG_ON(!card || !kcontrol)) in snd_ctl_remove()
496 card->controls_count -= kcontrol->count; in snd_ctl_remove()
499 snd_ctl_notify(card, SNDRV_CTL_EVENT_MASK_REMOVE, &id); in snd_ctl_remove()
515 int snd_ctl_remove_id(struct snd_card *card, struct snd_ctl_elem_id *id) in snd_ctl_remove_id() argument
520 down_write(&card->controls_rwsem); in snd_ctl_remove_id()
521 kctl = snd_ctl_find_id(card, id); in snd_ctl_remove_id()
523 up_write(&card->controls_rwsem); in snd_ctl_remove_id()
526 ret = snd_ctl_remove(card, kctl); in snd_ctl_remove_id()
527 up_write(&card->controls_rwsem); in snd_ctl_remove_id()
545 struct snd_card *card = file->card; in snd_ctl_remove_user_ctl() local
549 down_write(&card->controls_rwsem); in snd_ctl_remove_user_ctl()
550 kctl = snd_ctl_find_id(card, id); in snd_ctl_remove_user_ctl()
564 ret = snd_ctl_remove(card, kctl); in snd_ctl_remove_user_ctl()
567 card->user_ctl_count--; in snd_ctl_remove_user_ctl()
569 up_write(&card->controls_rwsem); in snd_ctl_remove_user_ctl()
585 int snd_ctl_activate_id(struct snd_card *card, struct snd_ctl_elem_id *id, in snd_ctl_activate_id() argument
593 down_write(&card->controls_rwsem); in snd_ctl_activate_id()
594 kctl = snd_ctl_find_id(card, id); in snd_ctl_activate_id()
614 up_write(&card->controls_rwsem); in snd_ctl_activate_id()
616 snd_ctl_notify(card, SNDRV_CTL_EVENT_MASK_INFO, id); in snd_ctl_activate_id()
632 int snd_ctl_rename_id(struct snd_card *card, struct snd_ctl_elem_id *src_id, in snd_ctl_rename_id() argument
637 down_write(&card->controls_rwsem); in snd_ctl_rename_id()
638 kctl = snd_ctl_find_id(card, src_id); in snd_ctl_rename_id()
640 up_write(&card->controls_rwsem); in snd_ctl_rename_id()
644 kctl->id.numid = card->last_numid + 1; in snd_ctl_rename_id()
645 card->last_numid += kctl->count; in snd_ctl_rename_id()
646 up_write(&card->controls_rwsem); in snd_ctl_rename_id()
664 struct snd_kcontrol *snd_ctl_find_numid(struct snd_card *card, unsigned int numid) in snd_ctl_find_numid() argument
668 if (snd_BUG_ON(!card || !numid)) in snd_ctl_find_numid()
670 list_for_each_entry(kctl, &card->controls, list) { in snd_ctl_find_numid()
691 struct snd_kcontrol *snd_ctl_find_id(struct snd_card *card, in snd_ctl_find_id() argument
696 if (snd_BUG_ON(!card || !id)) in snd_ctl_find_id()
699 return snd_ctl_find_numid(card, id->numid); in snd_ctl_find_id()
700 list_for_each_entry(kctl, &card->controls, list) { in snd_ctl_find_id()
719 static int snd_ctl_card_info(struct snd_card *card, struct snd_ctl_file * ctl, in snd_ctl_card_info() argument
728 info->card = card->number; in snd_ctl_card_info()
729 strlcpy(info->id, card->id, sizeof(info->id)); in snd_ctl_card_info()
730 strlcpy(info->driver, card->driver, sizeof(info->driver)); in snd_ctl_card_info()
731 strlcpy(info->name, card->shortname, sizeof(info->name)); in snd_ctl_card_info()
732 strlcpy(info->longname, card->longname, sizeof(info->longname)); in snd_ctl_card_info()
733 strlcpy(info->mixername, card->mixername, sizeof(info->mixername)); in snd_ctl_card_info()
734 strlcpy(info->components, card->components, sizeof(info->components)); in snd_ctl_card_info()
744 static int snd_ctl_elem_list(struct snd_card *card, in snd_ctl_elem_list() argument
765 down_read(&card->controls_rwsem); in snd_ctl_elem_list()
766 list.count = card->controls_count; in snd_ctl_elem_list()
767 plist = card->controls.next; in snd_ctl_elem_list()
768 while (plist != &card->controls) { in snd_ctl_elem_list()
779 while (space > 0 && plist != &card->controls) { in snd_ctl_elem_list()
790 up_read(&card->controls_rwsem); in snd_ctl_elem_list()
799 down_read(&card->controls_rwsem); in snd_ctl_elem_list()
800 list.count = card->controls_count; in snd_ctl_elem_list()
801 up_read(&card->controls_rwsem); in snd_ctl_elem_list()
811 struct snd_card *card = ctl->card; in snd_ctl_elem_info() local
817 down_read(&card->controls_rwsem); in snd_ctl_elem_info()
818 kctl = snd_ctl_find_id(card, &info->id); in snd_ctl_elem_info()
820 up_read(&card->controls_rwsem); in snd_ctl_elem_info()
842 up_read(&card->controls_rwsem); in snd_ctl_elem_info()
854 snd_power_lock(ctl->card); in snd_ctl_elem_info_user()
855 result = snd_power_wait(ctl->card, SNDRV_CTL_POWER_D0); in snd_ctl_elem_info_user()
858 snd_power_unlock(ctl->card); in snd_ctl_elem_info_user()
865 static int snd_ctl_elem_read(struct snd_card *card, in snd_ctl_elem_read() argument
873 down_read(&card->controls_rwsem); in snd_ctl_elem_read()
874 kctl = snd_ctl_find_id(card, &control->id); in snd_ctl_elem_read()
887 up_read(&card->controls_rwsem); in snd_ctl_elem_read()
891 static int snd_ctl_elem_read_user(struct snd_card *card, in snd_ctl_elem_read_user() argument
901 snd_power_lock(card); in snd_ctl_elem_read_user()
902 result = snd_power_wait(card, SNDRV_CTL_POWER_D0); in snd_ctl_elem_read_user()
904 result = snd_ctl_elem_read(card, control); in snd_ctl_elem_read_user()
905 snd_power_unlock(card); in snd_ctl_elem_read_user()
913 static int snd_ctl_elem_write(struct snd_card *card, struct snd_ctl_file *file, in snd_ctl_elem_write() argument
921 down_read(&card->controls_rwsem); in snd_ctl_elem_write()
922 kctl = snd_ctl_find_id(card, &control->id); in snd_ctl_elem_write()
938 up_read(&card->controls_rwsem); in snd_ctl_elem_write()
939 snd_ctl_notify(card, SNDRV_CTL_EVENT_MASK_VALUE, &id); in snd_ctl_elem_write()
943 up_read(&card->controls_rwsem); in snd_ctl_elem_write()
951 struct snd_card *card; in snd_ctl_elem_write_user() local
958 card = file->card; in snd_ctl_elem_write_user()
959 snd_power_lock(card); in snd_ctl_elem_write_user()
960 result = snd_power_wait(card, SNDRV_CTL_POWER_D0); in snd_ctl_elem_write_user()
962 result = snd_ctl_elem_write(card, file, control); in snd_ctl_elem_write_user()
963 snd_power_unlock(card); in snd_ctl_elem_write_user()
974 struct snd_card *card = file->card; in snd_ctl_elem_lock() local
982 down_write(&card->controls_rwsem); in snd_ctl_elem_lock()
983 kctl = snd_ctl_find_id(card, &id); in snd_ctl_elem_lock()
995 up_write(&card->controls_rwsem); in snd_ctl_elem_lock()
1002 struct snd_card *card = file->card; in snd_ctl_elem_unlock() local
1010 down_write(&card->controls_rwsem); in snd_ctl_elem_unlock()
1011 kctl = snd_ctl_find_id(card, &id); in snd_ctl_elem_unlock()
1025 up_write(&card->controls_rwsem); in snd_ctl_elem_unlock()
1031 struct snd_card *card; member
1085 mutex_lock(&ue->card->user_ctl_lock); in snd_ctl_elem_user_get()
1087 mutex_unlock(&ue->card->user_ctl_lock); in snd_ctl_elem_user_get()
1100 mutex_lock(&ue->card->user_ctl_lock); in snd_ctl_elem_user_put()
1104 mutex_unlock(&ue->card->user_ctl_lock); in snd_ctl_elem_user_put()
1124 mutex_lock(&ue->card->user_ctl_lock); in snd_ctl_elem_user_tlv()
1131 mutex_unlock(&ue->card->user_ctl_lock); in snd_ctl_elem_user_tlv()
1135 mutex_lock(&ue->card->user_ctl_lock); in snd_ctl_elem_user_tlv()
1147 mutex_unlock(&ue->card->user_ctl_lock); in snd_ctl_elem_user_tlv()
1217 struct snd_card *card = file->card; in snd_ctl_elem_add() local
1243 if (card->user_ctl_count + 1 > MAX_USER_CONTROLS) in snd_ctl_elem_add()
1297 ue->card = card; in snd_ctl_elem_add()
1323 err = snd_ctl_add(card, kctl); in snd_ctl_elem_add()
1336 down_write(&card->controls_rwsem); in snd_ctl_elem_add()
1337 card->user_ctl_count++; in snd_ctl_elem_add()
1338 up_write(&card->controls_rwsem); in snd_ctl_elem_add()
1397 struct snd_card *card = file->card; in snd_ctl_tlv_ioctl() local
1410 down_read(&card->controls_rwsem); in snd_ctl_tlv_ioctl()
1411 kctl = snd_ctl_find_numid(card, tlv.numid); in snd_ctl_tlv_ioctl()
1438 up_read(&card->controls_rwsem); in snd_ctl_tlv_ioctl()
1439 snd_ctl_notify(card, SNDRV_CTL_EVENT_MASK_TLV, &id); in snd_ctl_tlv_ioctl()
1456 up_read(&card->controls_rwsem); in snd_ctl_tlv_ioctl()
1463 struct snd_card *card; in snd_ctl_ioctl() local
1470 card = ctl->card; in snd_ctl_ioctl()
1471 if (snd_BUG_ON(!card)) in snd_ctl_ioctl()
1477 return snd_ctl_card_info(card, ctl, cmd, argp); in snd_ctl_ioctl()
1479 return snd_ctl_elem_list(card, argp); in snd_ctl_ioctl()
1483 return snd_ctl_elem_read_user(card, argp); in snd_ctl_ioctl()
1508 return put_user(card->power_state, ip) ? -EFAULT : 0; in snd_ctl_ioctl()
1515 err = p->fioctl(card, ctl, cmd, arg); in snd_ctl_ioctl()
1522 dev_dbg(card->dev, "unknown ioctl = 0x%x\n", cmd); in snd_ctl_ioctl()
1534 if (snd_BUG_ON(!ctl || !ctl->card)) in snd_ctl_read()
1556 if (ctl->card->shutdown) in snd_ctl_read()
1702 int snd_ctl_get_preferred_subdevice(struct snd_card *card, int type) in snd_ctl_get_preferred_subdevice() argument
1707 read_lock(&card->ctl_files_rwlock); in snd_ctl_get_preferred_subdevice()
1708 list_for_each_entry(kctl, &card->ctl_files, list) { in snd_ctl_get_preferred_subdevice()
1715 read_unlock(&card->ctl_files_rwlock); in snd_ctl_get_preferred_subdevice()
1751 struct snd_card *card = device->device_data; in snd_ctl_dev_register() local
1753 return snd_register_device(SNDRV_DEVICE_TYPE_CONTROL, card, -1, in snd_ctl_dev_register()
1754 &snd_ctl_f_ops, card, &card->ctl_dev); in snd_ctl_dev_register()
1762 struct snd_card *card = device->device_data; in snd_ctl_dev_disconnect() local
1765 read_lock(&card->ctl_files_rwlock); in snd_ctl_dev_disconnect()
1766 list_for_each_entry(ctl, &card->ctl_files, list) { in snd_ctl_dev_disconnect()
1770 read_unlock(&card->ctl_files_rwlock); in snd_ctl_dev_disconnect()
1772 return snd_unregister_device(&card->ctl_dev); in snd_ctl_dev_disconnect()
1780 struct snd_card *card = device->device_data; in snd_ctl_dev_free() local
1783 down_write(&card->controls_rwsem); in snd_ctl_dev_free()
1784 while (!list_empty(&card->controls)) { in snd_ctl_dev_free()
1785 control = snd_kcontrol(card->controls.next); in snd_ctl_dev_free()
1786 snd_ctl_remove(card, control); in snd_ctl_dev_free()
1788 up_write(&card->controls_rwsem); in snd_ctl_dev_free()
1789 put_device(&card->ctl_dev); in snd_ctl_dev_free()
1797 int snd_ctl_create(struct snd_card *card) in snd_ctl_create() argument
1806 if (snd_BUG_ON(!card)) in snd_ctl_create()
1808 if (snd_BUG_ON(card->number < 0 || card->number >= SNDRV_CARDS)) in snd_ctl_create()
1811 snd_device_initialize(&card->ctl_dev, card); in snd_ctl_create()
1812 dev_set_name(&card->ctl_dev, "controlC%d", card->number); in snd_ctl_create()
1814 err = snd_device_new(card, SNDRV_DEV_CONTROL, card, &ops); in snd_ctl_create()
1816 put_device(&card->ctl_dev); in snd_ctl_create()