Lines Matching +full:proc +full:- +full:id

1 // SPDX-License-Identifier: GPL-2.0-or-later
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()
102 * file ops for binary proc files
108 loff_t ret = -EINVAL, size; in snd_info_entry_llseek()
110 data = file->private_data; in snd_info_entry_llseek()
111 entry = data->entry; in snd_info_entry_llseek()
112 mutex_lock(&entry->access); in snd_info_entry_llseek()
113 if (entry->c.ops->llseek) { in snd_info_entry_llseek()
114 offset = entry->c.ops->llseek(entry, in snd_info_entry_llseek()
115 data->file_private_data, in snd_info_entry_llseek()
120 size = entry->size; in snd_info_entry_llseek()
125 offset += file->f_pos; in snd_info_entry_llseek()
139 file->f_pos = offset; in snd_info_entry_llseek()
142 mutex_unlock(&entry->access); in snd_info_entry_llseek()
149 struct snd_info_private_data *data = file->private_data; in snd_info_entry_read()
150 struct snd_info_entry *entry = data->entry; in snd_info_entry_read()
156 return -EIO; in snd_info_entry_read()
157 if (pos >= entry->size) in snd_info_entry_read()
159 size = entry->size - pos; in snd_info_entry_read()
161 size = entry->c.ops->read(entry, data->file_private_data, in snd_info_entry_read()
171 struct snd_info_private_data *data = file->private_data; in snd_info_entry_write()
172 struct snd_info_entry *entry = data->entry; in snd_info_entry_write()
178 return -EIO; in snd_info_entry_write()
180 size_t maxsize = entry->size - pos; in snd_info_entry_write()
182 size = entry->c.ops->write(entry, data->file_private_data, in snd_info_entry_write()
192 struct snd_info_private_data *data = file->private_data; in snd_info_entry_poll()
193 struct snd_info_entry *entry = data->entry; in snd_info_entry_poll()
196 if (entry->c.ops->poll) in snd_info_entry_poll()
197 return entry->c.ops->poll(entry, in snd_info_entry_poll()
198 data->file_private_data, in snd_info_entry_poll()
200 if (entry->c.ops->read) in snd_info_entry_poll()
202 if (entry->c.ops->write) in snd_info_entry_poll()
210 struct snd_info_private_data *data = file->private_data; in snd_info_entry_ioctl()
211 struct snd_info_entry *entry = data->entry; in snd_info_entry_ioctl()
213 if (!entry->c.ops->ioctl) in snd_info_entry_ioctl()
214 return -ENOTTY; in snd_info_entry_ioctl()
215 return entry->c.ops->ioctl(entry, data->file_private_data, in snd_info_entry_ioctl()
225 data = file->private_data; in snd_info_entry_mmap()
228 entry = data->entry; in snd_info_entry_mmap()
229 if (!entry->c.ops->mmap) in snd_info_entry_mmap()
230 return -ENXIO; in snd_info_entry_mmap()
231 return entry->c.ops->mmap(entry, data->file_private_data, in snd_info_entry_mmap()
246 mode = file->f_flags & O_ACCMODE; in snd_info_entry_open()
247 if (((mode == O_RDONLY || mode == O_RDWR) && !entry->c.ops->read) || in snd_info_entry_open()
248 ((mode == O_WRONLY || mode == O_RDWR) && !entry->c.ops->write)) { in snd_info_entry_open()
249 err = -ENODEV; in snd_info_entry_open()
253 if (entry->c.ops->open) { in snd_info_entry_open()
254 err = entry->c.ops->open(entry, mode, &data->file_private_data); in snd_info_entry_open()
259 file->private_data = data; in snd_info_entry_open()
265 module_put(entry->module); in snd_info_entry_open()
273 struct snd_info_private_data *data = file->private_data; in snd_info_entry_release()
274 struct snd_info_entry *entry = data->entry; in snd_info_entry_release()
276 if (entry->c.ops->release) in snd_info_entry_release()
277 entry->c.ops->release(entry, file->f_flags & O_ACCMODE, in snd_info_entry_release()
278 data->file_private_data); in snd_info_entry_release()
279 module_put(entry->module); in snd_info_entry_release()
297 * file ops for text proc files
303 struct seq_file *m = file->private_data; in snd_info_text_entry_write()
304 struct snd_info_private_data *data = m->private; in snd_info_text_entry_write()
305 struct snd_info_entry *entry = data->entry; in snd_info_text_entry_write()
311 if (!entry->c.text.write) in snd_info_text_entry_write()
312 return -EIO; in snd_info_text_entry_write()
315 return -EIO; in snd_info_text_entry_write()
319 return -EIO; in snd_info_text_entry_write()
320 mutex_lock(&entry->access); in snd_info_text_entry_write()
321 buf = data->wbuffer; in snd_info_text_entry_write()
323 data->wbuffer = buf = kzalloc(sizeof(*buf), GFP_KERNEL); in snd_info_text_entry_write()
325 err = -ENOMEM; in snd_info_text_entry_write()
329 if (next > buf->len) { in snd_info_text_entry_write()
332 err = -ENOMEM; in snd_info_text_entry_write()
335 kvfree(buf->buffer); in snd_info_text_entry_write()
336 buf->buffer = nbuf; in snd_info_text_entry_write()
337 buf->len = PAGE_ALIGN(next); in snd_info_text_entry_write()
339 if (copy_from_user(buf->buffer + pos, buffer, count)) { in snd_info_text_entry_write()
340 err = -EFAULT; in snd_info_text_entry_write()
343 buf->size = next; in snd_info_text_entry_write()
345 mutex_unlock(&entry->access); in snd_info_text_entry_write()
354 struct snd_info_private_data *data = seq->private; in snd_info_seq_show()
355 struct snd_info_entry *entry = data->entry; in snd_info_seq_show()
357 if (!entry->c.text.read) { in snd_info_seq_show()
358 return -EIO; in snd_info_seq_show()
360 data->rbuffer->buffer = (char *)seq; /* XXX hack! */ in snd_info_seq_show()
361 entry->c.text.read(entry, data->rbuffer); in snd_info_seq_show()
377 data->rbuffer = kzalloc(sizeof(*data->rbuffer), GFP_KERNEL); in snd_info_text_entry_open()
378 if (!data->rbuffer) { in snd_info_text_entry_open()
379 err = -ENOMEM; in snd_info_text_entry_open()
382 if (entry->size) in snd_info_text_entry_open()
384 entry->size); in snd_info_text_entry_open()
393 kfree(data->rbuffer); in snd_info_text_entry_open()
395 module_put(entry->module); in snd_info_text_entry_open()
403 struct seq_file *m = file->private_data; in snd_info_text_entry_release()
404 struct snd_info_private_data *data = m->private; in snd_info_text_entry_release()
405 struct snd_info_entry *entry = data->entry; in snd_info_text_entry_release()
407 if (data->wbuffer && entry->c.text.write) in snd_info_text_entry_release()
408 entry->c.text.write(entry, data->wbuffer); in snd_info_text_entry_release()
411 kfree(data->rbuffer); in snd_info_text_entry_release()
412 if (data->wbuffer) { in snd_info_text_entry_release()
413 kvfree(data->wbuffer->buffer); in snd_info_text_entry_release()
414 kfree(data->wbuffer); in snd_info_text_entry_release()
417 module_put(entry->module); in snd_info_text_entry_release()
439 entry->mode = S_IFDIR | 0555; in create_subdir()
455 return -ENOMEM; in snd_info_init()
456 snd_proc_root->mode = S_IFDIR | 0555; in snd_info_init()
457 snd_proc_root->p = proc_mkdir("asound", NULL); in snd_info_init()
458 if (!snd_proc_root->p) in snd_info_init()
480 return -ENOMEM; in snd_info_init()
492 struct snd_card *card = entry->private_data; in snd_card_id_read()
494 snd_iprintf(buffer, "%s\n", card->id); in snd_card_id_read()
498 * create a card proc file
507 return -ENXIO; in snd_info_card_create()
509 sprintf(str, "card%i", card->number); in snd_info_card_create()
510 entry = create_subdir(card->module, str); in snd_info_card_create()
512 return -ENOMEM; in snd_info_card_create()
513 card->proc_root = entry; in snd_info_card_create()
515 return snd_card_ro_proc_new(card, "id", card, snd_card_id_read); in snd_info_card_create()
519 * register the card proc file
529 return -ENXIO; in snd_info_card_register()
531 err = snd_info_register(card->proc_root); in snd_info_card_register()
535 if (!strcmp(card->id, card->proc_root->name)) in snd_info_card_register()
538 if (card->proc_root_link) in snd_info_card_register()
540 p = proc_symlink(card->id, snd_proc_root->p, card->proc_root->name); in snd_info_card_register()
542 return -ENOMEM; in snd_info_card_register()
543 card->proc_root_link = p; in snd_info_card_register()
548 * called on card->id change
553 if (card->proc_root_link) { in snd_info_card_id_change()
554 proc_remove(card->proc_root_link); in snd_info_card_id_change()
555 card->proc_root_link = NULL; in snd_info_card_id_change()
557 if (strcmp(card->id, card->proc_root->name)) in snd_info_card_id_change()
558 card->proc_root_link = proc_symlink(card->id, in snd_info_card_id_change()
559 snd_proc_root->p, in snd_info_card_id_change()
560 card->proc_root->name); in snd_info_card_id_change()
565 * de-register the card proc file
573 proc_remove(card->proc_root_link); in snd_info_card_disconnect()
574 card->proc_root_link = NULL; in snd_info_card_disconnect()
575 if (card->proc_root) in snd_info_card_disconnect()
576 snd_info_disconnect(card->proc_root); in snd_info_card_disconnect()
581 * release the card proc file resources
588 snd_info_free_entry(card->proc_root); in snd_info_card_free()
589 card->proc_root = NULL; in snd_info_card_free()
595 * snd_info_get_line - read one line from the procfs buffer
610 if (!buffer->buffer) in snd_info_get_line()
612 if (len <= 0 || buffer->stop || buffer->error) in snd_info_get_line()
614 while (!buffer->stop) { in snd_info_get_line()
615 c = buffer->buffer[buffer->curr++]; in snd_info_get_line()
616 if (buffer->curr >= buffer->size) in snd_info_get_line()
617 buffer->stop = 1; in snd_info_get_line()
621 len--; in snd_info_get_line()
631 * snd_info_get_str - parse a string token
634 * @len: the max. length of token - 1
650 while (--len > 0 && *src && *src != c) { in snd_info_get_str()
656 while (--len > 0 && *src && *src != ' ' && *src != '\t') { in snd_info_get_str()
668 * snd_info_create_entry - create an info entry
669 * @name: the proc file name
688 entry->name = kstrdup(name, GFP_KERNEL); in snd_info_create_entry()
689 if (entry->name == NULL) { in snd_info_create_entry()
693 entry->mode = S_IFREG | 0444; in snd_info_create_entry()
694 entry->content = SNDRV_INFO_CONTENT_TEXT; in snd_info_create_entry()
695 mutex_init(&entry->access); in snd_info_create_entry()
696 INIT_LIST_HEAD(&entry->children); in snd_info_create_entry()
697 INIT_LIST_HEAD(&entry->list); in snd_info_create_entry()
698 entry->parent = parent; in snd_info_create_entry()
699 entry->module = module; in snd_info_create_entry()
701 mutex_lock(&parent->access); in snd_info_create_entry()
702 list_add_tail(&entry->list, &parent->children); in snd_info_create_entry()
703 mutex_unlock(&parent->access); in snd_info_create_entry()
709 * snd_info_create_module_entry - create an info entry for the given module
729 * snd_info_create_card_entry - create an info entry for the given card
743 parent = card->proc_root; in snd_info_create_card_entry()
744 return snd_info_create_entry(name, parent, card->module); in snd_info_create_card_entry()
752 if (!entry->p) in snd_info_disconnect()
754 list_for_each_entry(p, &entry->children, list) in snd_info_disconnect()
756 proc_remove(entry->p); in snd_info_disconnect()
757 entry->p = NULL; in snd_info_disconnect()
761 * snd_info_free_entry - release the info entry
772 if (entry->p) { in snd_info_free_entry()
779 list_for_each_entry_safe(p, n, &entry->children, list) in snd_info_free_entry()
782 p = entry->parent; in snd_info_free_entry()
784 mutex_lock(&p->access); in snd_info_free_entry()
785 list_del(&entry->list); in snd_info_free_entry()
786 mutex_unlock(&p->access); in snd_info_free_entry()
788 kfree(entry->name); in snd_info_free_entry()
789 if (entry->private_free) in snd_info_free_entry()
790 entry->private_free(entry); in snd_info_free_entry()
800 return -ENXIO; in __snd_info_register()
801 root = entry->parent == NULL ? snd_proc_root->p : entry->parent->p; in __snd_info_register()
803 if (entry->p || !root) in __snd_info_register()
805 if (S_ISDIR(entry->mode)) { in __snd_info_register()
806 p = proc_mkdir_mode(entry->name, entry->mode, root); in __snd_info_register()
809 return -ENOMEM; in __snd_info_register()
813 if (entry->content == SNDRV_INFO_CONTENT_DATA) in __snd_info_register()
817 p = proc_create_data(entry->name, entry->mode, root, in __snd_info_register()
821 return -ENOMEM; in __snd_info_register()
823 proc_set_size(p, entry->size); in __snd_info_register()
825 entry->p = p; in __snd_info_register()
832 * snd_info_register - register the info entry
835 * Registers the proc info entry.
845 if (!entry->p) { in snd_info_register()
851 list_for_each_entry(p, &entry->children, list) { in snd_info_register()
862 * snd_card_rw_proc_new - Create a read/write text proc file entry for the card
867 * @write: the write callback, NULL for read-only
869 * This proc file entry will be registered via snd_card_register() call, and
881 entry = snd_info_create_card_entry(card, name, card->proc_root); in snd_card_rw_proc_new()
883 return -ENOMEM; in snd_card_rw_proc_new()
886 entry->mode |= 0200; in snd_card_rw_proc_new()
887 entry->c.text.write = write; in snd_card_rw_proc_new()
901 init_utsname()->release); in snd_info_version_read()
910 return -ENOMEM; in snd_info_version_init()
911 entry->c.text.read = snd_info_version_read; in snd_info_version_init()