• Home
  • Raw
  • Download

Lines Matching refs:card

45 	struct snd_card *card;  in snd_ctl_open()  local
53 card = snd_lookup_minor_data(iminor(inode), SNDRV_DEVICE_TYPE_CONTROL); in snd_ctl_open()
54 if (!card) { in snd_ctl_open()
58 err = snd_card_file_add(card, file); in snd_ctl_open()
63 if (!try_module_get(card->module)) { in snd_ctl_open()
75 ctl->card = card; in snd_ctl_open()
80 write_lock_irqsave(&card->ctl_files_rwlock, flags); in snd_ctl_open()
81 list_add_tail(&ctl->list, &card->ctl_files); in snd_ctl_open()
82 write_unlock_irqrestore(&card->ctl_files_rwlock, flags); in snd_ctl_open()
83 snd_card_unref(card); in snd_ctl_open()
87 module_put(card->module); in snd_ctl_open()
89 snd_card_file_remove(card, file); in snd_ctl_open()
91 if (card) in snd_ctl_open()
92 snd_card_unref(card); in snd_ctl_open()
113 struct snd_card *card; in snd_ctl_release() local
120 card = ctl->card; in snd_ctl_release()
121 write_lock_irqsave(&card->ctl_files_rwlock, flags); in snd_ctl_release()
123 write_unlock_irqrestore(&card->ctl_files_rwlock, flags); in snd_ctl_release()
124 down_write(&card->controls_rwsem); in snd_ctl_release()
125 list_for_each_entry(control, &card->controls, list) in snd_ctl_release()
129 up_write(&card->controls_rwsem); in snd_ctl_release()
134 module_put(card->module); in snd_ctl_release()
135 snd_card_file_remove(card, file); in snd_ctl_release()
149 void snd_ctl_notify(struct snd_card *card, unsigned int mask, in snd_ctl_notify() argument
156 if (snd_BUG_ON(!card || !id)) in snd_ctl_notify()
158 if (card->shutdown) in snd_ctl_notify()
160 read_lock_irqsave(&card->ctl_files_rwlock, flags); in snd_ctl_notify()
162 card->mixer_oss_change_count++; in snd_ctl_notify()
164 list_for_each_entry(ctl, &card->ctl_files, list) { in snd_ctl_notify()
180 dev_err(card->dev, "No memory available to allocate event\n"); in snd_ctl_notify()
187 read_unlock_irqrestore(&card->ctl_files_rwlock, flags); in snd_ctl_notify()
201 void snd_ctl_notify_one(struct snd_card *card, unsigned int mask, in snd_ctl_notify_one() argument
209 snd_ctl_notify(card, mask, &id); in snd_ctl_notify_one()
212 lops->lnotify(card, mask, kctl, ioff); in snd_ctl_notify_one()
335 static bool snd_ctl_remove_numid_conflict(struct snd_card *card, in snd_ctl_remove_numid_conflict() argument
341 if (card->last_numid >= UINT_MAX - count) in snd_ctl_remove_numid_conflict()
342 card->last_numid = 0; in snd_ctl_remove_numid_conflict()
344 list_for_each_entry(kctl, &card->controls, list) { in snd_ctl_remove_numid_conflict()
345 if (kctl->id.numid < card->last_numid + 1 + count && in snd_ctl_remove_numid_conflict()
346 kctl->id.numid + kctl->count > card->last_numid + 1) { in snd_ctl_remove_numid_conflict()
347 card->last_numid = kctl->id.numid + kctl->count - 1; in snd_ctl_remove_numid_conflict()
354 static int snd_ctl_find_hole(struct snd_card *card, unsigned int count) in snd_ctl_find_hole() argument
358 while (snd_ctl_remove_numid_conflict(card, count)) { in snd_ctl_find_hole()
361 dev_err(card->dev, "unable to allocate new control numid\n"); in snd_ctl_find_hole()
402 static void add_hash_entries(struct snd_card *card, in add_hash_entries() argument
408 xa_store_range(&card->ctl_numids, kcontrol->id.numid, in add_hash_entries()
414 if (xa_insert(&card->ctl_hash, get_ctl_id_hash(&id), in add_hash_entries()
417 card->ctl_hash_collision = true; in add_hash_entries()
418 dev_dbg(card->dev, "ctl_hash collision %d:%s:%d\n", in add_hash_entries()
425 static void remove_hash_entries(struct snd_card *card, in remove_hash_entries() argument
434 xa_erase(&card->ctl_numids, id.numid); in remove_hash_entries()
436 matched = xa_load(&card->ctl_hash, h); in remove_hash_entries()
439 xa_erase(&card->ctl_hash, h); in remove_hash_entries()
445 static inline void add_hash_entries(struct snd_card *card, in add_hash_entries() argument
449 static inline void remove_hash_entries(struct snd_card *card, in remove_hash_entries() argument
460 static int __snd_ctl_add_replace(struct snd_card *card, in __snd_ctl_add_replace() argument
473 old = snd_ctl_find_id(card, &id); in __snd_ctl_add_replace()
479 dev_err(card->dev, in __snd_ctl_add_replace()
486 err = snd_ctl_remove(card, old); in __snd_ctl_add_replace()
491 if (snd_ctl_find_hole(card, kcontrol->count) < 0) in __snd_ctl_add_replace()
494 list_add_tail(&kcontrol->list, &card->controls); in __snd_ctl_add_replace()
495 card->controls_count += kcontrol->count; in __snd_ctl_add_replace()
496 kcontrol->id.numid = card->last_numid + 1; in __snd_ctl_add_replace()
497 card->last_numid += kcontrol->count; in __snd_ctl_add_replace()
499 add_hash_entries(card, kcontrol); in __snd_ctl_add_replace()
502 snd_ctl_notify_one(card, SNDRV_CTL_EVENT_MASK_ADD, kcontrol, idx); in __snd_ctl_add_replace()
507 static int snd_ctl_add_replace(struct snd_card *card, in snd_ctl_add_replace() argument
515 if (snd_BUG_ON(!card || !kcontrol->info)) in snd_ctl_add_replace()
518 down_write(&card->controls_rwsem); in snd_ctl_add_replace()
519 err = __snd_ctl_add_replace(card, kcontrol, mode); in snd_ctl_add_replace()
520 up_write(&card->controls_rwsem); in snd_ctl_add_replace()
544 int snd_ctl_add(struct snd_card *card, struct snd_kcontrol *kcontrol) in snd_ctl_add() argument
546 return snd_ctl_add_replace(card, kcontrol, CTL_ADD_EXCLUSIVE); in snd_ctl_add()
564 int snd_ctl_replace(struct snd_card *card, struct snd_kcontrol *kcontrol, in snd_ctl_replace() argument
567 return snd_ctl_add_replace(card, kcontrol, in snd_ctl_replace()
572 static int __snd_ctl_remove(struct snd_card *card, in __snd_ctl_remove() argument
578 if (snd_BUG_ON(!card || !kcontrol)) in __snd_ctl_remove()
583 remove_hash_entries(card, kcontrol); in __snd_ctl_remove()
585 card->controls_count -= kcontrol->count; in __snd_ctl_remove()
587 snd_ctl_notify_one(card, SNDRV_CTL_EVENT_MASK_REMOVE, kcontrol, idx); in __snd_ctl_remove()
603 int snd_ctl_remove(struct snd_card *card, struct snd_kcontrol *kcontrol) in snd_ctl_remove() argument
605 return __snd_ctl_remove(card, kcontrol, true); in snd_ctl_remove()
619 int snd_ctl_remove_id(struct snd_card *card, struct snd_ctl_elem_id *id) in snd_ctl_remove_id() argument
624 down_write(&card->controls_rwsem); in snd_ctl_remove_id()
625 kctl = snd_ctl_find_id(card, id); in snd_ctl_remove_id()
627 up_write(&card->controls_rwsem); in snd_ctl_remove_id()
630 ret = snd_ctl_remove(card, kctl); in snd_ctl_remove_id()
631 up_write(&card->controls_rwsem); in snd_ctl_remove_id()
649 struct snd_card *card = file->card; in snd_ctl_remove_user_ctl() local
653 down_write(&card->controls_rwsem); in snd_ctl_remove_user_ctl()
654 kctl = snd_ctl_find_id(card, id); in snd_ctl_remove_user_ctl()
668 ret = snd_ctl_remove(card, kctl); in snd_ctl_remove_user_ctl()
670 up_write(&card->controls_rwsem); in snd_ctl_remove_user_ctl()
686 int snd_ctl_activate_id(struct snd_card *card, struct snd_ctl_elem_id *id, in snd_ctl_activate_id() argument
694 down_write(&card->controls_rwsem); in snd_ctl_activate_id()
695 kctl = snd_ctl_find_id(card, id); in snd_ctl_activate_id()
713 downgrade_write(&card->controls_rwsem); in snd_ctl_activate_id()
714 snd_ctl_notify_one(card, SNDRV_CTL_EVENT_MASK_INFO, kctl, index_offset); in snd_ctl_activate_id()
715 up_read(&card->controls_rwsem); in snd_ctl_activate_id()
719 up_write(&card->controls_rwsem); in snd_ctl_activate_id()
735 int snd_ctl_rename_id(struct snd_card *card, struct snd_ctl_elem_id *src_id, in snd_ctl_rename_id() argument
740 down_write(&card->controls_rwsem); in snd_ctl_rename_id()
741 kctl = snd_ctl_find_id(card, src_id); in snd_ctl_rename_id()
743 up_write(&card->controls_rwsem); in snd_ctl_rename_id()
746 remove_hash_entries(card, kctl); in snd_ctl_rename_id()
748 kctl->id.numid = card->last_numid + 1; in snd_ctl_rename_id()
749 card->last_numid += kctl->count; in snd_ctl_rename_id()
750 add_hash_entries(card, kctl); in snd_ctl_rename_id()
751 up_write(&card->controls_rwsem); in snd_ctl_rename_id()
766 void snd_ctl_rename(struct snd_card *card, struct snd_kcontrol *kctl, in snd_ctl_rename() argument
769 remove_hash_entries(card, kctl); in snd_ctl_rename()
775 add_hash_entries(card, kctl); in snd_ctl_rename()
781 snd_ctl_find_numid_slow(struct snd_card *card, unsigned int numid) in snd_ctl_find_numid_slow() argument
785 list_for_each_entry(kctl, &card->controls, list) { in snd_ctl_find_numid_slow()
806 struct snd_kcontrol *snd_ctl_find_numid(struct snd_card *card, unsigned int numid) in snd_ctl_find_numid() argument
808 if (snd_BUG_ON(!card || !numid)) in snd_ctl_find_numid()
811 return xa_load(&card->ctl_numids, numid); in snd_ctl_find_numid()
813 return snd_ctl_find_numid_slow(card, numid); in snd_ctl_find_numid()
831 struct snd_kcontrol *snd_ctl_find_id(struct snd_card *card, in snd_ctl_find_id() argument
836 if (snd_BUG_ON(!card || !id)) in snd_ctl_find_id()
839 return snd_ctl_find_numid(card, id->numid); in snd_ctl_find_id()
841 kctl = xa_load(&card->ctl_hash, get_ctl_id_hash(id)); in snd_ctl_find_id()
844 if (!card->ctl_hash_collision) in snd_ctl_find_id()
848 list_for_each_entry(kctl, &card->controls, list) in snd_ctl_find_id()
856 static int snd_ctl_card_info(struct snd_card *card, struct snd_ctl_file * ctl, in snd_ctl_card_info() argument
865 info->card = card->number; in snd_ctl_card_info()
866 strscpy(info->id, card->id, sizeof(info->id)); in snd_ctl_card_info()
867 strscpy(info->driver, card->driver, sizeof(info->driver)); in snd_ctl_card_info()
868 strscpy(info->name, card->shortname, sizeof(info->name)); in snd_ctl_card_info()
869 strscpy(info->longname, card->longname, sizeof(info->longname)); in snd_ctl_card_info()
870 strscpy(info->mixername, card->mixername, sizeof(info->mixername)); in snd_ctl_card_info()
871 strscpy(info->components, card->components, sizeof(info->components)); in snd_ctl_card_info()
881 static int snd_ctl_elem_list(struct snd_card *card, in snd_ctl_elem_list() argument
892 down_read(&card->controls_rwsem); in snd_ctl_elem_list()
893 list->count = card->controls_count; in snd_ctl_elem_list()
896 list_for_each_entry(kctl, &card->controls, list) { in snd_ctl_elem_list()
916 up_read(&card->controls_rwsem); in snd_ctl_elem_list()
920 static int snd_ctl_elem_list_user(struct snd_card *card, in snd_ctl_elem_list_user() argument
928 err = snd_ctl_elem_list(card, &list); in snd_ctl_elem_list_user()
938 static int snd_ctl_check_elem_info(struct snd_card *card, in snd_ctl_check_elem_info() argument
952 if (card) in snd_ctl_check_elem_info()
953 dev_err(card->dev, in snd_ctl_check_elem_info()
962 if (card) in snd_ctl_check_elem_info()
963 dev_err(card->dev, in snd_ctl_check_elem_info()
971 if (card) in snd_ctl_check_elem_info()
972 dev_err(card->dev, in snd_ctl_check_elem_info()
1006 static int sanity_check_int_value(struct snd_card *card, in sanity_check_int_value() argument
1044 dev_err(card->dev, in sanity_check_int_value()
1055 dev_err(card->dev, in sanity_check_int_value()
1068 static int sanity_check_input_values(struct snd_card *card, in sanity_check_input_values() argument
1081 ret = sanity_check_int_value(card, control, info, i, in sanity_check_input_values()
1095 static int sanity_check_elem_value(struct snd_card *card, in sanity_check_elem_value() argument
1104 ret = sanity_check_input_values(card, control, info, true); in sanity_check_elem_value()
1123 static int __snd_ctl_elem_info(struct snd_card *card, in __snd_ctl_elem_info() argument
1135 result = snd_power_ref_and_wait(card); in __snd_ctl_elem_info()
1138 snd_power_unref(card); in __snd_ctl_elem_info()
1154 snd_ctl_check_elem_info(card, info) < 0) in __snd_ctl_elem_info()
1163 struct snd_card *card = ctl->card; in snd_ctl_elem_info() local
1167 down_read(&card->controls_rwsem); in snd_ctl_elem_info()
1168 kctl = snd_ctl_find_id(card, &info->id); in snd_ctl_elem_info()
1172 result = __snd_ctl_elem_info(card, kctl, info, ctl); in snd_ctl_elem_info()
1173 up_read(&card->controls_rwsem); in snd_ctl_elem_info()
1196 static int snd_ctl_elem_read(struct snd_card *card, in snd_ctl_elem_read() argument
1206 down_read(&card->controls_rwsem); in snd_ctl_elem_read()
1207 kctl = snd_ctl_find_id(card, &control->id); in snd_ctl_elem_read()
1226 ret = __snd_ctl_elem_info(card, kctl, &info, NULL); in snd_ctl_elem_read()
1233 ret = snd_power_ref_and_wait(card); in snd_ctl_elem_read()
1236 snd_power_unref(card); in snd_ctl_elem_read()
1240 sanity_check_elem_value(card, control, &info, pattern) < 0) { in snd_ctl_elem_read()
1241 dev_err(card->dev, in snd_ctl_elem_read()
1250 up_read(&card->controls_rwsem); in snd_ctl_elem_read()
1254 static int snd_ctl_elem_read_user(struct snd_card *card, in snd_ctl_elem_read_user() argument
1264 result = snd_ctl_elem_read(card, control); in snd_ctl_elem_read_user()
1275 static int snd_ctl_elem_write(struct snd_card *card, struct snd_ctl_file *file, in snd_ctl_elem_write() argument
1283 down_write(&card->controls_rwsem); in snd_ctl_elem_write()
1284 kctl = snd_ctl_find_id(card, &control->id); in snd_ctl_elem_write()
1286 up_write(&card->controls_rwsem); in snd_ctl_elem_write()
1294 up_write(&card->controls_rwsem); in snd_ctl_elem_write()
1299 result = snd_power_ref_and_wait(card); in snd_ctl_elem_write()
1306 result = __snd_ctl_elem_info(card, kctl, &info, NULL); in snd_ctl_elem_write()
1308 result = sanity_check_input_values(card, control, &info, in snd_ctl_elem_write()
1313 snd_power_unref(card); in snd_ctl_elem_write()
1315 up_write(&card->controls_rwsem); in snd_ctl_elem_write()
1320 downgrade_write(&card->controls_rwsem); in snd_ctl_elem_write()
1321 snd_ctl_notify_one(card, SNDRV_CTL_EVENT_MASK_VALUE, kctl, index_offset); in snd_ctl_elem_write()
1322 up_read(&card->controls_rwsem); in snd_ctl_elem_write()
1324 up_write(&card->controls_rwsem); in snd_ctl_elem_write()
1334 struct snd_card *card; in snd_ctl_elem_write_user() local
1341 card = file->card; in snd_ctl_elem_write_user()
1342 result = snd_ctl_elem_write(card, file, control); in snd_ctl_elem_write_user()
1356 struct snd_card *card = file->card; in snd_ctl_elem_lock() local
1364 down_write(&card->controls_rwsem); in snd_ctl_elem_lock()
1365 kctl = snd_ctl_find_id(card, &id); in snd_ctl_elem_lock()
1377 up_write(&card->controls_rwsem); in snd_ctl_elem_lock()
1384 struct snd_card *card = file->card; in snd_ctl_elem_unlock() local
1392 down_write(&card->controls_rwsem); in snd_ctl_elem_unlock()
1393 kctl = snd_ctl_find_id(card, &id); in snd_ctl_elem_unlock()
1407 up_write(&card->controls_rwsem); in snd_ctl_elem_unlock()
1413 struct snd_card *card; member
1422 static bool check_user_elem_overflow(struct snd_card *card, ssize_t add) in check_user_elem_overflow() argument
1424 return (ssize_t)card->user_ctl_alloc_size + add > max_user_ctl_alloc_size; in check_user_elem_overflow()
1506 if (check_user_elem_overflow(ue->card, (ssize_t)(size - ue->tlv_data_size))) in replace_user_tlv()
1527 ue->card->user_ctl_alloc_size -= ue->tlv_data_size; in replace_user_tlv()
1535 ue->card->user_ctl_alloc_size += size; in replace_user_tlv()
1539 snd_ctl_notify_one(ue->card, mask, kctl, i); in replace_user_tlv()
1582 if (check_user_elem_overflow(ue->card, buf_len)) in snd_ctl_elem_init_enum_names()
1603 ue->card->user_ctl_alloc_size += ue->info.value.enumerated.names_length; in snd_ctl_elem_init_enum_names()
1618 ue->card->user_ctl_alloc_size -= compute_user_elem_size(ue->elem_data_size, kcontrol->count); in snd_ctl_elem_user_free()
1619 ue->card->user_ctl_alloc_size -= ue->tlv_data_size; in snd_ctl_elem_user_free()
1621 ue->card->user_ctl_alloc_size -= ue->info.value.enumerated.names_length; in snd_ctl_elem_user_free()
1631 struct snd_card *card = file->card; in snd_ctl_elem_add() local
1686 down_write(&card->controls_rwsem); in snd_ctl_elem_add()
1687 if (check_user_elem_overflow(card, alloc_size)) { in snd_ctl_elem_add()
1712 card->user_ctl_alloc_size += alloc_size; in snd_ctl_elem_add()
1715 ue->card = card; in snd_ctl_elem_add()
1741 err = __snd_ctl_add_replace(card, kctl, CTL_ADD_EXCLUSIVE); in snd_ctl_elem_add()
1756 up_write(&card->controls_rwsem); in snd_ctl_elem_add()
1842 ret = snd_power_ref_and_wait(file->card); in call_tlv_handler()
1845 snd_power_unref(file->card); in call_tlv_handler()
1895 kctl = snd_ctl_find_numid(file->card, header.numid); in snd_ctl_tlv_ioctl()
1921 struct snd_card *card; in snd_ctl_ioctl() local
1928 card = ctl->card; in snd_ctl_ioctl()
1929 if (snd_BUG_ON(!card)) in snd_ctl_ioctl()
1935 return snd_ctl_card_info(card, ctl, cmd, argp); in snd_ctl_ioctl()
1937 return snd_ctl_elem_list_user(card, argp); in snd_ctl_ioctl()
1941 return snd_ctl_elem_read_user(card, argp); in snd_ctl_ioctl()
1957 down_read(&ctl->card->controls_rwsem); in snd_ctl_ioctl()
1959 up_read(&ctl->card->controls_rwsem); in snd_ctl_ioctl()
1962 down_write(&ctl->card->controls_rwsem); in snd_ctl_ioctl()
1964 up_write(&ctl->card->controls_rwsem); in snd_ctl_ioctl()
1967 down_write(&ctl->card->controls_rwsem); in snd_ctl_ioctl()
1969 up_write(&ctl->card->controls_rwsem); in snd_ctl_ioctl()
1978 err = p->fioctl(card, ctl, cmd, arg); in snd_ctl_ioctl()
1985 dev_dbg(card->dev, "unknown ioctl = 0x%x\n", cmd); in snd_ctl_ioctl()
1997 if (snd_BUG_ON(!ctl || !ctl->card)) in snd_ctl_read()
2019 if (ctl->card->shutdown) in snd_ctl_read()
2173 int snd_ctl_get_preferred_subdevice(struct snd_card *card, int type) in snd_ctl_get_preferred_subdevice() argument
2179 read_lock_irqsave(&card->ctl_files_rwlock, flags); in snd_ctl_get_preferred_subdevice()
2180 list_for_each_entry(kctl, &card->ctl_files, list) { in snd_ctl_get_preferred_subdevice()
2187 read_unlock_irqrestore(&card->ctl_files_rwlock, flags); in snd_ctl_get_preferred_subdevice()
2237 struct snd_card *card; in snd_ctl_register_layer() local
2245 card = snd_card_ref(card_number); in snd_ctl_register_layer()
2246 if (card) { in snd_ctl_register_layer()
2247 down_read(&card->controls_rwsem); in snd_ctl_register_layer()
2248 lops->lregister(card); in snd_ctl_register_layer()
2249 up_read(&card->controls_rwsem); in snd_ctl_register_layer()
2250 snd_card_unref(card); in snd_ctl_register_layer()
2305 struct snd_card *card = device->device_data; in snd_ctl_dev_register() local
2309 err = snd_register_device(SNDRV_DEVICE_TYPE_CONTROL, card, -1, in snd_ctl_dev_register()
2310 &snd_ctl_f_ops, card, &card->ctl_dev); in snd_ctl_dev_register()
2313 down_read(&card->controls_rwsem); in snd_ctl_dev_register()
2316 lops->lregister(card); in snd_ctl_dev_register()
2318 up_read(&card->controls_rwsem); in snd_ctl_dev_register()
2327 struct snd_card *card = device->device_data; in snd_ctl_dev_disconnect() local
2332 read_lock_irqsave(&card->ctl_files_rwlock, flags); in snd_ctl_dev_disconnect()
2333 list_for_each_entry(ctl, &card->ctl_files, list) { in snd_ctl_dev_disconnect()
2337 read_unlock_irqrestore(&card->ctl_files_rwlock, flags); in snd_ctl_dev_disconnect()
2339 down_read(&card->controls_rwsem); in snd_ctl_dev_disconnect()
2342 lops->ldisconnect(card); in snd_ctl_dev_disconnect()
2344 up_read(&card->controls_rwsem); in snd_ctl_dev_disconnect()
2346 return snd_unregister_device(&card->ctl_dev); in snd_ctl_dev_disconnect()
2354 struct snd_card *card = device->device_data; in snd_ctl_dev_free() local
2357 down_write(&card->controls_rwsem); in snd_ctl_dev_free()
2358 while (!list_empty(&card->controls)) { in snd_ctl_dev_free()
2359 control = snd_kcontrol(card->controls.next); in snd_ctl_dev_free()
2360 __snd_ctl_remove(card, control, false); in snd_ctl_dev_free()
2364 xa_destroy(&card->ctl_numids); in snd_ctl_dev_free()
2365 xa_destroy(&card->ctl_hash); in snd_ctl_dev_free()
2367 up_write(&card->controls_rwsem); in snd_ctl_dev_free()
2368 put_device(&card->ctl_dev); in snd_ctl_dev_free()
2376 int snd_ctl_create(struct snd_card *card) in snd_ctl_create() argument
2385 if (snd_BUG_ON(!card)) in snd_ctl_create()
2387 if (snd_BUG_ON(card->number < 0 || card->number >= SNDRV_CARDS)) in snd_ctl_create()
2390 snd_device_initialize(&card->ctl_dev, card); in snd_ctl_create()
2391 dev_set_name(&card->ctl_dev, "controlC%d", card->number); in snd_ctl_create()
2393 err = snd_device_new(card, SNDRV_DEV_CONTROL, card, &ops); in snd_ctl_create()
2395 put_device(&card->ctl_dev); in snd_ctl_create()