Lines Matching +full:entry +full:- +full:name

1 // SPDX-License-Identifier: GPL-2.0-or-later
54 struct snd_info_entry *entry; member
59 static void snd_info_clear_entries(struct snd_info_entry *entry);
73 static int alloc_info_private(struct snd_info_entry *entry, in alloc_info_private() argument
78 if (!entry || !entry->p) in alloc_info_private()
79 return -ENODEV; in alloc_info_private()
80 if (!try_module_get(entry->module)) in alloc_info_private()
81 return -EFAULT; in alloc_info_private()
84 module_put(entry->module); in alloc_info_private()
85 return -ENOMEM; in alloc_info_private()
87 data->entry = entry; in alloc_info_private()
107 struct snd_info_entry *entry; in snd_info_entry_llseek() local
110 data = file->private_data; in snd_info_entry_llseek()
111 entry = data->entry; in snd_info_entry_llseek()
112 guard(mutex)(&entry->access); in snd_info_entry_llseek()
113 if (entry->c.ops->llseek) in snd_info_entry_llseek()
114 return entry->c.ops->llseek(entry, in snd_info_entry_llseek()
115 data->file_private_data, in snd_info_entry_llseek()
118 size = entry->size; in snd_info_entry_llseek()
123 offset += file->f_pos; in snd_info_entry_llseek()
127 return -EINVAL; in snd_info_entry_llseek()
131 return -EINVAL; in snd_info_entry_llseek()
134 return -EINVAL; in snd_info_entry_llseek()
137 file->f_pos = offset; in snd_info_entry_llseek()
144 struct snd_info_private_data *data = file->private_data; in snd_info_entry_read()
145 struct snd_info_entry *entry = data->entry; in snd_info_entry_read() local
151 return -EIO; in snd_info_entry_read()
152 if (pos >= entry->size) in snd_info_entry_read()
154 size = entry->size - pos; in snd_info_entry_read()
156 size = entry->c.ops->read(entry, data->file_private_data, in snd_info_entry_read()
166 struct snd_info_private_data *data = file->private_data; in snd_info_entry_write()
167 struct snd_info_entry *entry = data->entry; in snd_info_entry_write() local
173 return -EIO; in snd_info_entry_write()
175 size_t maxsize = entry->size - pos; in snd_info_entry_write()
177 size = entry->c.ops->write(entry, data->file_private_data, in snd_info_entry_write()
187 struct snd_info_private_data *data = file->private_data; in snd_info_entry_poll()
188 struct snd_info_entry *entry = data->entry; in snd_info_entry_poll() local
191 if (entry->c.ops->poll) in snd_info_entry_poll()
192 return entry->c.ops->poll(entry, in snd_info_entry_poll()
193 data->file_private_data, in snd_info_entry_poll()
195 if (entry->c.ops->read) in snd_info_entry_poll()
197 if (entry->c.ops->write) in snd_info_entry_poll()
205 struct snd_info_private_data *data = file->private_data; in snd_info_entry_ioctl()
206 struct snd_info_entry *entry = data->entry; in snd_info_entry_ioctl() local
208 if (!entry->c.ops->ioctl) in snd_info_entry_ioctl()
209 return -ENOTTY; in snd_info_entry_ioctl()
210 return entry->c.ops->ioctl(entry, data->file_private_data, in snd_info_entry_ioctl()
218 struct snd_info_entry *entry; in snd_info_entry_mmap() local
220 data = file->private_data; in snd_info_entry_mmap()
223 entry = data->entry; in snd_info_entry_mmap()
224 if (!entry->c.ops->mmap) in snd_info_entry_mmap()
225 return -ENXIO; in snd_info_entry_mmap()
226 return entry->c.ops->mmap(entry, data->file_private_data, in snd_info_entry_mmap()
232 struct snd_info_entry *entry = pde_data(inode); in snd_info_entry_open() local
237 err = alloc_info_private(entry, &data); in snd_info_entry_open()
241 mode = file->f_flags & O_ACCMODE; in snd_info_entry_open()
242 if (((mode == O_RDONLY || mode == O_RDWR) && !entry->c.ops->read) || in snd_info_entry_open()
243 ((mode == O_WRONLY || mode == O_RDWR) && !entry->c.ops->write)) { in snd_info_entry_open()
244 err = -ENODEV; in snd_info_entry_open()
248 if (entry->c.ops->open) { in snd_info_entry_open()
249 err = entry->c.ops->open(entry, mode, &data->file_private_data); in snd_info_entry_open()
254 file->private_data = data; in snd_info_entry_open()
259 module_put(entry->module); in snd_info_entry_open()
265 struct snd_info_private_data *data = file->private_data; in snd_info_entry_release()
266 struct snd_info_entry *entry = data->entry; in snd_info_entry_release() local
268 if (entry->c.ops->release) in snd_info_entry_release()
269 entry->c.ops->release(entry, file->f_flags & O_ACCMODE, in snd_info_entry_release()
270 data->file_private_data); in snd_info_entry_release()
271 module_put(entry->module); in snd_info_entry_release()
295 struct seq_file *m = file->private_data; in snd_info_text_entry_write()
296 struct snd_info_private_data *data = m->private; in snd_info_text_entry_write()
297 struct snd_info_entry *entry = data->entry; in snd_info_text_entry_write() local
302 if (!entry->c.text.write) in snd_info_text_entry_write()
303 return -EIO; in snd_info_text_entry_write()
306 return -EIO; in snd_info_text_entry_write()
310 return -EIO; in snd_info_text_entry_write()
311 guard(mutex)(&entry->access); in snd_info_text_entry_write()
312 buf = data->wbuffer; in snd_info_text_entry_write()
314 data->wbuffer = buf = kzalloc(sizeof(*buf), GFP_KERNEL); in snd_info_text_entry_write()
316 return -ENOMEM; in snd_info_text_entry_write()
318 if (next > buf->len) { in snd_info_text_entry_write()
321 return -ENOMEM; in snd_info_text_entry_write()
322 kvfree(buf->buffer); in snd_info_text_entry_write()
323 buf->buffer = nbuf; in snd_info_text_entry_write()
324 buf->len = PAGE_ALIGN(next); in snd_info_text_entry_write()
326 if (copy_from_user(buf->buffer + pos, buffer, count)) in snd_info_text_entry_write()
327 return -EFAULT; in snd_info_text_entry_write()
328 buf->size = next; in snd_info_text_entry_write()
335 struct snd_info_private_data *data = seq->private; in snd_info_seq_show()
336 struct snd_info_entry *entry = data->entry; in snd_info_seq_show() local
338 if (!entry->c.text.read) { in snd_info_seq_show()
339 return -EIO; in snd_info_seq_show()
341 data->rbuffer->buffer = (char *)seq; /* XXX hack! */ in snd_info_seq_show()
342 entry->c.text.read(entry, data->rbuffer); in snd_info_seq_show()
349 struct snd_info_entry *entry = pde_data(inode); in snd_info_text_entry_open() local
354 err = alloc_info_private(entry, &data); in snd_info_text_entry_open()
358 data->rbuffer = kzalloc(sizeof(*data->rbuffer), GFP_KERNEL); in snd_info_text_entry_open()
359 if (!data->rbuffer) { in snd_info_text_entry_open()
360 err = -ENOMEM; in snd_info_text_entry_open()
363 if (entry->size) in snd_info_text_entry_open()
365 entry->size); in snd_info_text_entry_open()
373 kfree(data->rbuffer); in snd_info_text_entry_open()
375 module_put(entry->module); in snd_info_text_entry_open()
381 struct seq_file *m = file->private_data; in snd_info_text_entry_release()
382 struct snd_info_private_data *data = m->private; in snd_info_text_entry_release()
383 struct snd_info_entry *entry = data->entry; in snd_info_text_entry_release() local
385 if (data->wbuffer && entry->c.text.write) in snd_info_text_entry_release()
386 entry->c.text.write(entry, data->wbuffer); in snd_info_text_entry_release()
389 kfree(data->rbuffer); in snd_info_text_entry_release()
390 if (data->wbuffer) { in snd_info_text_entry_release()
391 kvfree(data->wbuffer->buffer); in snd_info_text_entry_release()
392 kfree(data->wbuffer); in snd_info_text_entry_release()
395 module_put(entry->module); in snd_info_text_entry_release()
410 const char *name) in create_subdir() argument
412 struct snd_info_entry *entry; in create_subdir() local
414 entry = snd_info_create_module_entry(mod, name, NULL); in create_subdir()
415 if (!entry) in create_subdir()
417 entry->mode = S_IFDIR | 0555; in create_subdir()
418 if (snd_info_register(entry) < 0) { in create_subdir()
419 snd_info_free_entry(entry); in create_subdir()
422 return entry; in create_subdir()
426 snd_info_create_entry(const char *name, struct snd_info_entry *parent,
433 return -ENOMEM; in snd_info_init()
434 snd_proc_root->mode = S_IFDIR | 0555; in snd_info_init()
435 snd_proc_root->p = proc_mkdir("asound", NULL); in snd_info_init()
436 if (!snd_proc_root->p) in snd_info_init()
458 return -ENOMEM; in snd_info_init()
467 static void snd_card_id_read(struct snd_info_entry *entry, in snd_card_id_read() argument
470 struct snd_card *card = entry->private_data; in snd_card_id_read()
472 snd_iprintf(buffer, "%s\n", card->id); in snd_card_id_read()
482 struct snd_info_entry *entry; in snd_info_card_create() local
485 return -ENXIO; in snd_info_card_create()
487 sprintf(str, "card%i", card->number); in snd_info_card_create()
488 entry = create_subdir(card->module, str); in snd_info_card_create()
489 if (!entry) in snd_info_card_create()
490 return -ENOMEM; in snd_info_card_create()
491 card->proc_root = entry; in snd_info_card_create()
507 return -ENXIO; in snd_info_card_register()
509 err = snd_info_register(card->proc_root); in snd_info_card_register()
513 if (!strcmp(card->id, card->proc_root->name)) in snd_info_card_register()
516 if (card->proc_root_link) in snd_info_card_register()
518 p = proc_symlink(card->id, snd_proc_root->p, card->proc_root->name); in snd_info_card_register()
520 return -ENOMEM; in snd_info_card_register()
521 card->proc_root_link = p; in snd_info_card_register()
526 * called on card->id change
531 if (card->proc_root_link) { in snd_info_card_id_change()
532 proc_remove(card->proc_root_link); in snd_info_card_id_change()
533 card->proc_root_link = NULL; in snd_info_card_id_change()
535 if (strcmp(card->id, card->proc_root->name)) in snd_info_card_id_change()
536 card->proc_root_link = proc_symlink(card->id, in snd_info_card_id_change()
537 snd_proc_root->p, in snd_info_card_id_change()
538 card->proc_root->name); in snd_info_card_id_change()
542 * de-register the card proc file
550 proc_remove(card->proc_root_link); in snd_info_card_disconnect()
551 if (card->proc_root) in snd_info_card_disconnect()
552 proc_remove(card->proc_root->p); in snd_info_card_disconnect()
555 if (card->proc_root) in snd_info_card_disconnect()
556 snd_info_clear_entries(card->proc_root); in snd_info_card_disconnect()
557 card->proc_root_link = NULL; in snd_info_card_disconnect()
558 card->proc_root = NULL; in snd_info_card_disconnect()
569 snd_info_free_entry(card->proc_root); in snd_info_card_free()
570 card->proc_root = NULL; in snd_info_card_free()
576 * snd_info_get_line - read one line from the procfs buffer
591 if (!buffer->buffer) in snd_info_get_line()
593 if (len <= 0 || buffer->stop || buffer->error) in snd_info_get_line()
595 while (!buffer->stop) { in snd_info_get_line()
596 c = buffer->buffer[buffer->curr++]; in snd_info_get_line()
597 if (buffer->curr >= buffer->size) in snd_info_get_line()
598 buffer->stop = 1; in snd_info_get_line()
602 len--; in snd_info_get_line()
612 * snd_info_get_str - parse a string token
615 * @len: the max. length of token - 1
631 while (--len > 0 && *src && *src != c) { in snd_info_get_str()
637 while (--len > 0 && *src && *src != ' ' && *src != '\t') { in snd_info_get_str()
649 * snd_info_create_entry - create an info entry
650 * @name: the proc file name
653 * Creates an info entry with the given file name and initializes as
662 snd_info_create_entry(const char *name, struct snd_info_entry *parent, in snd_info_create_entry() argument
665 struct snd_info_entry *entry; in snd_info_create_entry() local
666 entry = kzalloc(sizeof(*entry), GFP_KERNEL); in snd_info_create_entry()
667 if (entry == NULL) in snd_info_create_entry()
669 entry->name = kstrdup(name, GFP_KERNEL); in snd_info_create_entry()
670 if (entry->name == NULL) { in snd_info_create_entry()
671 kfree(entry); in snd_info_create_entry()
674 entry->mode = S_IFREG | 0444; in snd_info_create_entry()
675 entry->content = SNDRV_INFO_CONTENT_TEXT; in snd_info_create_entry()
676 mutex_init(&entry->access); in snd_info_create_entry()
677 INIT_LIST_HEAD(&entry->children); in snd_info_create_entry()
678 INIT_LIST_HEAD(&entry->list); in snd_info_create_entry()
679 entry->parent = parent; in snd_info_create_entry()
680 entry->module = module; in snd_info_create_entry()
682 guard(mutex)(&parent->access); in snd_info_create_entry()
683 list_add_tail(&entry->list, &parent->children); in snd_info_create_entry()
685 return entry; in snd_info_create_entry()
689 * snd_info_create_module_entry - create an info entry for the given module
691 * @name: the file name
694 * Creates a new info entry and assigns it to the given module.
699 const char *name, in snd_info_create_module_entry() argument
704 return snd_info_create_entry(name, parent, module); in snd_info_create_module_entry()
709 * snd_info_create_card_entry - create an info entry for the given card
711 * @name: the file name
714 * Creates a new info entry and assigns it to the given card.
719 const char *name, in snd_info_create_card_entry() argument
723 parent = card->proc_root; in snd_info_create_card_entry()
724 return snd_info_create_entry(name, parent, card->module); in snd_info_create_card_entry()
728 static void snd_info_clear_entries(struct snd_info_entry *entry) in snd_info_clear_entries() argument
732 if (!entry->p) in snd_info_clear_entries()
734 list_for_each_entry(p, &entry->children, list) in snd_info_clear_entries()
736 entry->p = NULL; in snd_info_clear_entries()
740 * snd_info_free_entry - release the info entry
741 * @entry: the info entry
743 * Releases the info entry.
745 void snd_info_free_entry(struct snd_info_entry * entry) in snd_info_free_entry() argument
749 if (!entry) in snd_info_free_entry()
751 if (entry->p) { in snd_info_free_entry()
752 proc_remove(entry->p); in snd_info_free_entry()
754 snd_info_clear_entries(entry); in snd_info_free_entry()
758 list_for_each_entry_safe(p, n, &entry->children, list) in snd_info_free_entry()
761 p = entry->parent; in snd_info_free_entry()
763 guard(mutex)(&p->access); in snd_info_free_entry()
764 list_del(&entry->list); in snd_info_free_entry()
766 kfree(entry->name); in snd_info_free_entry()
767 if (entry->private_free) in snd_info_free_entry()
768 entry->private_free(entry); in snd_info_free_entry()
769 kfree(entry); in snd_info_free_entry()
773 static int __snd_info_register(struct snd_info_entry *entry) in __snd_info_register() argument
777 if (snd_BUG_ON(!entry)) in __snd_info_register()
778 return -ENXIO; in __snd_info_register()
779 root = entry->parent == NULL ? snd_proc_root->p : entry->parent->p; in __snd_info_register()
781 if (entry->p || !root) in __snd_info_register()
783 if (S_ISDIR(entry->mode)) { in __snd_info_register()
784 p = proc_mkdir_mode(entry->name, entry->mode, root); in __snd_info_register()
786 return -ENOMEM; in __snd_info_register()
789 if (entry->content == SNDRV_INFO_CONTENT_DATA) in __snd_info_register()
793 p = proc_create_data(entry->name, entry->mode, root, in __snd_info_register()
794 ops, entry); in __snd_info_register()
796 return -ENOMEM; in __snd_info_register()
797 proc_set_size(p, entry->size); in __snd_info_register()
799 entry->p = p; in __snd_info_register()
804 * snd_info_register - register the info entry
805 * @entry: the info entry
807 * Registers the proc info entry.
812 int snd_info_register(struct snd_info_entry *entry) in snd_info_register() argument
817 if (!entry->p) { in snd_info_register()
818 err = __snd_info_register(entry); in snd_info_register()
823 list_for_each_entry(p, &entry->children, list) { in snd_info_register()
834 * snd_card_rw_proc_new - Create a read/write text proc file entry for the card
836 * @name: the file name
839 * @write: the write callback, NULL for read-only
841 * This proc file entry will be registered via snd_card_register() call, and
846 int snd_card_rw_proc_new(struct snd_card *card, const char *name, in snd_card_rw_proc_new() argument
850 void (*write)(struct snd_info_entry *entry, in snd_card_rw_proc_new() argument
853 struct snd_info_entry *entry; in snd_card_rw_proc_new() local
855 entry = snd_info_create_card_entry(card, name, card->proc_root); in snd_card_rw_proc_new()
856 if (!entry) in snd_card_rw_proc_new()
857 return -ENOMEM; in snd_card_rw_proc_new()
858 snd_info_set_text_ops(entry, private_data, read); in snd_card_rw_proc_new()
860 entry->mode |= 0200; in snd_card_rw_proc_new()
861 entry->c.text.write = write; in snd_card_rw_proc_new()
871 static void snd_info_version_read(struct snd_info_entry *entry, struct snd_info_buffer *buffer) in snd_info_version_read() argument
875 init_utsname()->release); in snd_info_version_read()
880 struct snd_info_entry *entry; in snd_info_version_init() local
882 entry = snd_info_create_module_entry(THIS_MODULE, "version", NULL); in snd_info_version_init()
883 if (entry == NULL) in snd_info_version_init()
884 return -ENOMEM; in snd_info_version_init()
885 entry->c.text.read = snd_info_version_read; in snd_info_version_init()
886 return snd_info_register(entry); /* freed in error path */ in snd_info_version_init()