11a59d1b8SThomas Gleixner /* SPDX-License-Identifier: GPL-2.0-or-later */
21da177e4SLinus Torvalds #ifndef __SOUND_INFO_H
31da177e4SLinus Torvalds #define __SOUND_INFO_H
41da177e4SLinus Torvalds
51da177e4SLinus Torvalds /*
61da177e4SLinus Torvalds * Header file for info interface
7c1017a4cSJaroslav Kysela * Copyright (c) by Jaroslav Kysela <perex@perex.cz>
81da177e4SLinus Torvalds */
91da177e4SLinus Torvalds
101da177e4SLinus Torvalds #include <linux/poll.h>
114adb7bcbSTakashi Iwai #include <linux/seq_file.h>
12c560a679STakashi Iwai #include <sound/core.h>
131da177e4SLinus Torvalds
141da177e4SLinus Torvalds /* buffer for information */
151da177e4SLinus Torvalds struct snd_info_buffer {
161da177e4SLinus Torvalds char *buffer; /* pointer to begin of buffer */
177e4eeec8STakashi Iwai unsigned int curr; /* current position in buffer */
187e4eeec8STakashi Iwai unsigned int size; /* current size */
197e4eeec8STakashi Iwai unsigned int len; /* total length of buffer */
201da177e4SLinus Torvalds int stop; /* stop flag */
211da177e4SLinus Torvalds int error; /* error code */
221da177e4SLinus Torvalds };
231da177e4SLinus Torvalds
241da177e4SLinus Torvalds #define SNDRV_INFO_CONTENT_TEXT 0
251da177e4SLinus Torvalds #define SNDRV_INFO_CONTENT_DATA 1
261da177e4SLinus Torvalds
271da177e4SLinus Torvalds struct snd_info_entry;
281da177e4SLinus Torvalds
291da177e4SLinus Torvalds struct snd_info_entry_text {
30fd64138cSJaroslav Kysela void (*read)(struct snd_info_entry *entry,
31fd64138cSJaroslav Kysela struct snd_info_buffer *buffer);
32fd64138cSJaroslav Kysela void (*write)(struct snd_info_entry *entry,
33fd64138cSJaroslav Kysela struct snd_info_buffer *buffer);
341da177e4SLinus Torvalds };
351da177e4SLinus Torvalds
361da177e4SLinus Torvalds struct snd_info_entry_ops {
3724c1f931STakashi Iwai int (*open)(struct snd_info_entry *entry,
381da177e4SLinus Torvalds unsigned short mode, void **file_private_data);
3924c1f931STakashi Iwai int (*release)(struct snd_info_entry *entry,
401da177e4SLinus Torvalds unsigned short mode, void *file_private_data);
4124e4a121STakashi Iwai ssize_t (*read)(struct snd_info_entry *entry, void *file_private_data,
421da177e4SLinus Torvalds struct file *file, char __user *buf,
4324e4a121STakashi Iwai size_t count, loff_t pos);
4424e4a121STakashi Iwai ssize_t (*write)(struct snd_info_entry *entry, void *file_private_data,
451da177e4SLinus Torvalds struct file *file, const char __user *buf,
4624e4a121STakashi Iwai size_t count, loff_t pos);
4724e4a121STakashi Iwai loff_t (*llseek)(struct snd_info_entry *entry,
48fd64138cSJaroslav Kysela void *file_private_data, struct file *file,
4924e4a121STakashi Iwai loff_t offset, int orig);
50a3f8683bSAl Viro __poll_t (*poll)(struct snd_info_entry *entry,
51fd64138cSJaroslav Kysela void *file_private_data, struct file *file,
52fd64138cSJaroslav Kysela poll_table *wait);
5324c1f931STakashi Iwai int (*ioctl)(struct snd_info_entry *entry, void *file_private_data,
541da177e4SLinus Torvalds struct file *file, unsigned int cmd, unsigned long arg);
5524c1f931STakashi Iwai int (*mmap)(struct snd_info_entry *entry, void *file_private_data,
561da177e4SLinus Torvalds struct inode *inode, struct file *file,
571da177e4SLinus Torvalds struct vm_area_struct *vma);
581da177e4SLinus Torvalds };
591da177e4SLinus Torvalds
601da177e4SLinus Torvalds struct snd_info_entry {
611da177e4SLinus Torvalds const char *name;
62d161a13fSAl Viro umode_t mode;
631da177e4SLinus Torvalds long size;
641da177e4SLinus Torvalds unsigned short content;
651da177e4SLinus Torvalds union {
661da177e4SLinus Torvalds struct snd_info_entry_text text;
67*d25ff268STakashi Iwai const struct snd_info_entry_ops *ops;
681da177e4SLinus Torvalds } c;
6924c1f931STakashi Iwai struct snd_info_entry *parent;
701da177e4SLinus Torvalds struct module *module;
711da177e4SLinus Torvalds void *private_data;
7224c1f931STakashi Iwai void (*private_free)(struct snd_info_entry *entry);
731da177e4SLinus Torvalds struct proc_dir_entry *p;
741a60d4c5SIngo Molnar struct mutex access;
75746d4a02STakashi Iwai struct list_head children;
76746d4a02STakashi Iwai struct list_head list;
771da177e4SLinus Torvalds };
781da177e4SLinus Torvalds
79cd6a6503SJie Yang #if defined(CONFIG_SND_OSSEMUL) && defined(CONFIG_SND_PROC_FS)
8024c1f931STakashi Iwai int snd_info_minor_register(void);
811da177e4SLinus Torvalds #else
82a0dca822STakashi Iwai #define snd_info_minor_register() 0
831da177e4SLinus Torvalds #endif
841da177e4SLinus Torvalds
851da177e4SLinus Torvalds
86cd6a6503SJie Yang #ifdef CONFIG_SND_PROC_FS
871da177e4SLinus Torvalds
8824c1f931STakashi Iwai extern struct snd_info_entry *snd_seq_root;
891da177e4SLinus Torvalds #ifdef CONFIG_SND_OSSEMUL
9024c1f931STakashi Iwai extern struct snd_info_entry *snd_oss_root;
9136b9cdfeSMarcin Ślusarz void snd_card_info_read_oss(struct snd_info_buffer *buffer);
921da177e4SLinus Torvalds #else
931da177e4SLinus Torvalds #define snd_oss_root NULL
snd_card_info_read_oss(struct snd_info_buffer * buffer)9436b9cdfeSMarcin Ślusarz static inline void snd_card_info_read_oss(struct snd_info_buffer *buffer) {}
951da177e4SLinus Torvalds #endif
961da177e4SLinus Torvalds
974adb7bcbSTakashi Iwai /**
984adb7bcbSTakashi Iwai * snd_iprintf - printf on the procfs buffer
994adb7bcbSTakashi Iwai * @buf: the procfs buffer
1004adb7bcbSTakashi Iwai * @fmt: the printf format
1014adb7bcbSTakashi Iwai *
1024adb7bcbSTakashi Iwai * Outputs the string on the procfs buffer just like printf().
1034adb7bcbSTakashi Iwai *
1044adb7bcbSTakashi Iwai * Return: zero for success, or a negative error code.
1054adb7bcbSTakashi Iwai */
1064adb7bcbSTakashi Iwai #define snd_iprintf(buf, fmt, args...) \
1074adb7bcbSTakashi Iwai seq_printf((struct seq_file *)(buf)->buffer, fmt, ##args)
1084adb7bcbSTakashi Iwai
1091da177e4SLinus Torvalds int snd_info_init(void);
1101da177e4SLinus Torvalds int snd_info_done(void);
1111da177e4SLinus Torvalds
11224c1f931STakashi Iwai int snd_info_get_line(struct snd_info_buffer *buffer, char *line, int len);
1134f7454a9STakashi Iwai const char *snd_info_get_str(char *dest, const char *src, int len);
11424c1f931STakashi Iwai struct snd_info_entry *snd_info_create_module_entry(struct module *module,
1151da177e4SLinus Torvalds const char *name,
11624c1f931STakashi Iwai struct snd_info_entry *parent);
11724c1f931STakashi Iwai struct snd_info_entry *snd_info_create_card_entry(struct snd_card *card,
1181da177e4SLinus Torvalds const char *name,
11924c1f931STakashi Iwai struct snd_info_entry *parent);
12024c1f931STakashi Iwai void snd_info_free_entry(struct snd_info_entry *entry);
1211da177e4SLinus Torvalds
12224c1f931STakashi Iwai int snd_info_card_create(struct snd_card *card);
12324c1f931STakashi Iwai int snd_info_card_register(struct snd_card *card);
12424c1f931STakashi Iwai int snd_info_card_free(struct snd_card *card);
125746d4a02STakashi Iwai void snd_info_card_disconnect(struct snd_card *card);
126c2eb9c4eSJaroslav Kysela void snd_info_card_id_change(struct snd_card *card);
12724c1f931STakashi Iwai int snd_info_register(struct snd_info_entry *entry);
1281da177e4SLinus Torvalds
1291da177e4SLinus Torvalds /* for card drivers */
snd_card_proc_new(struct snd_card * card,const char * name,struct snd_info_entry ** entryp)130c560a679STakashi Iwai static inline int snd_card_proc_new(struct snd_card *card, const char *name,
131c560a679STakashi Iwai struct snd_info_entry **entryp)
132c560a679STakashi Iwai {
133c560a679STakashi Iwai *entryp = snd_info_create_card_entry(card, name, card->proc_root);
134c560a679STakashi Iwai return *entryp ? 0 : -ENOMEM;
135c560a679STakashi Iwai }
1361da177e4SLinus Torvalds
snd_info_set_text_ops(struct snd_info_entry * entry,void * private_data,void (* read)(struct snd_info_entry *,struct snd_info_buffer *))13724c1f931STakashi Iwai static inline void snd_info_set_text_ops(struct snd_info_entry *entry,
1381da177e4SLinus Torvalds void *private_data,
13924c1f931STakashi Iwai void (*read)(struct snd_info_entry *, struct snd_info_buffer *))
1401da177e4SLinus Torvalds {
1411da177e4SLinus Torvalds entry->private_data = private_data;
1421da177e4SLinus Torvalds entry->c.text.read = read;
1431da177e4SLinus Torvalds }
1441da177e4SLinus Torvalds
1457453e1daSTakashi Iwai int snd_card_rw_proc_new(struct snd_card *card, const char *name,
1467453e1daSTakashi Iwai void *private_data,
1477453e1daSTakashi Iwai void (*read)(struct snd_info_entry *,
1487453e1daSTakashi Iwai struct snd_info_buffer *),
1497453e1daSTakashi Iwai void (*write)(struct snd_info_entry *entry,
1507453e1daSTakashi Iwai struct snd_info_buffer *buffer));
1517453e1daSTakashi Iwai
152e28563ccSTakashi Iwai int snd_info_check_reserved_words(const char *str);
1531da177e4SLinus Torvalds
1541da177e4SLinus Torvalds #else
1551da177e4SLinus Torvalds
1561da177e4SLinus Torvalds #define snd_seq_root NULL
1571da177e4SLinus Torvalds #define snd_oss_root NULL
1581da177e4SLinus Torvalds
snd_iprintf(struct snd_info_buffer * buffer,char * fmt,...)15924c1f931STakashi Iwai static inline int snd_iprintf(struct snd_info_buffer *buffer, char *fmt, ...) { return 0; }
snd_info_init(void)1601da177e4SLinus Torvalds static inline int snd_info_init(void) { return 0; }
snd_info_done(void)1611da177e4SLinus Torvalds static inline int snd_info_done(void) { return 0; }
1621da177e4SLinus Torvalds
snd_info_get_line(struct snd_info_buffer * buffer,char * line,int len)16324c1f931STakashi Iwai static inline int snd_info_get_line(struct snd_info_buffer *buffer, char *line, int len) { return 0; }
snd_info_get_str(char * dest,char * src,int len)1641da177e4SLinus Torvalds static inline char *snd_info_get_str(char *dest, char *src, int len) { return NULL; }
snd_info_create_module_entry(struct module * module,const char * name,struct snd_info_entry * parent)16524c1f931STakashi Iwai static inline struct snd_info_entry *snd_info_create_module_entry(struct module *module, const char *name, struct snd_info_entry *parent) { return NULL; }
snd_info_create_card_entry(struct snd_card * card,const char * name,struct snd_info_entry * parent)16624c1f931STakashi Iwai static inline struct snd_info_entry *snd_info_create_card_entry(struct snd_card *card, const char *name, struct snd_info_entry *parent) { return NULL; }
snd_info_free_entry(struct snd_info_entry * entry)16724c1f931STakashi Iwai static inline void snd_info_free_entry(struct snd_info_entry *entry) { ; }
1681da177e4SLinus Torvalds
snd_info_card_create(struct snd_card * card)16924c1f931STakashi Iwai static inline int snd_info_card_create(struct snd_card *card) { return 0; }
snd_info_card_register(struct snd_card * card)17024c1f931STakashi Iwai static inline int snd_info_card_register(struct snd_card *card) { return 0; }
snd_info_card_free(struct snd_card * card)17124c1f931STakashi Iwai static inline int snd_info_card_free(struct snd_card *card) { return 0; }
snd_info_card_disconnect(struct snd_card * card)172746d4a02STakashi Iwai static inline void snd_info_card_disconnect(struct snd_card *card) { }
snd_info_card_id_change(struct snd_card * card)173c2eb9c4eSJaroslav Kysela static inline void snd_info_card_id_change(struct snd_card *card) { }
snd_info_register(struct snd_info_entry * entry)17424c1f931STakashi Iwai static inline int snd_info_register(struct snd_info_entry *entry) { return 0; }
1751da177e4SLinus Torvalds
snd_card_proc_new(struct snd_card * card,const char * name,struct snd_info_entry ** entryp)176e28563ccSTakashi Iwai static inline int snd_card_proc_new(struct snd_card *card, const char *name,
177e28563ccSTakashi Iwai struct snd_info_entry **entryp) { return -EINVAL; }
snd_info_set_text_ops(struct snd_info_entry * entry,void * private_data,void (* read)(struct snd_info_entry *,struct snd_info_buffer *))178e28563ccSTakashi Iwai static inline void snd_info_set_text_ops(struct snd_info_entry *entry __attribute__((unused)),
179e28563ccSTakashi Iwai void *private_data,
180e28563ccSTakashi Iwai void (*read)(struct snd_info_entry *, struct snd_info_buffer *)) {}
snd_card_rw_proc_new(struct snd_card * card,const char * name,void * private_data,void (* read)(struct snd_info_entry *,struct snd_info_buffer *),void (* write)(struct snd_info_entry * entry,struct snd_info_buffer * buffer))1817453e1daSTakashi Iwai static inline int snd_card_rw_proc_new(struct snd_card *card, const char *name,
1827453e1daSTakashi Iwai void *private_data,
1837453e1daSTakashi Iwai void (*read)(struct snd_info_entry *,
1847453e1daSTakashi Iwai struct snd_info_buffer *),
1857453e1daSTakashi Iwai void (*write)(struct snd_info_entry *entry,
1867453e1daSTakashi Iwai struct snd_info_buffer *buffer))
1877453e1daSTakashi Iwai {
1887453e1daSTakashi Iwai return 0;
1897453e1daSTakashi Iwai }
snd_info_check_reserved_words(const char * str)190e28563ccSTakashi Iwai static inline int snd_info_check_reserved_words(const char *str) { return 1; }
1911da177e4SLinus Torvalds
1921da177e4SLinus Torvalds #endif
1931da177e4SLinus Torvalds
1947453e1daSTakashi Iwai /**
1957453e1daSTakashi Iwai * snd_card_ro_proc_new - Create a read-only text proc file entry for the card
1967453e1daSTakashi Iwai * @card: the card instance
1977453e1daSTakashi Iwai * @name: the file name
1987453e1daSTakashi Iwai * @private_data: the arbitrary private data
1997453e1daSTakashi Iwai * @read: the read callback
2007453e1daSTakashi Iwai *
2017453e1daSTakashi Iwai * This proc file entry will be registered via snd_card_register() call, and
2027453e1daSTakashi Iwai * it will be removed automatically at the card removal, too.
2037453e1daSTakashi Iwai */
2047453e1daSTakashi Iwai static inline int
snd_card_ro_proc_new(struct snd_card * card,const char * name,void * private_data,void (* read)(struct snd_info_entry *,struct snd_info_buffer *))2057453e1daSTakashi Iwai snd_card_ro_proc_new(struct snd_card *card, const char *name,
2067453e1daSTakashi Iwai void *private_data,
2077453e1daSTakashi Iwai void (*read)(struct snd_info_entry *,
2087453e1daSTakashi Iwai struct snd_info_buffer *))
2097453e1daSTakashi Iwai {
2107453e1daSTakashi Iwai return snd_card_rw_proc_new(card, name, private_data, read, NULL);
2117453e1daSTakashi Iwai }
2127453e1daSTakashi Iwai
2131da177e4SLinus Torvalds /*
2141da177e4SLinus Torvalds * OSS info part
2151da177e4SLinus Torvalds */
2161da177e4SLinus Torvalds
217cd6a6503SJie Yang #if defined(CONFIG_SND_OSSEMUL) && defined(CONFIG_SND_PROC_FS)
2181da177e4SLinus Torvalds
2191da177e4SLinus Torvalds #define SNDRV_OSS_INFO_DEV_AUDIO 0
2201da177e4SLinus Torvalds #define SNDRV_OSS_INFO_DEV_SYNTH 1
2211da177e4SLinus Torvalds #define SNDRV_OSS_INFO_DEV_MIDI 2
2221da177e4SLinus Torvalds #define SNDRV_OSS_INFO_DEV_TIMERS 4
2231da177e4SLinus Torvalds #define SNDRV_OSS_INFO_DEV_MIXERS 5
2241da177e4SLinus Torvalds
2251da177e4SLinus Torvalds #define SNDRV_OSS_INFO_DEV_COUNT 6
2261da177e4SLinus Torvalds
22724c1f931STakashi Iwai int snd_oss_info_register(int dev, int num, char *string);
2281da177e4SLinus Torvalds #define snd_oss_info_unregister(dev, num) snd_oss_info_register(dev, num, NULL)
2291da177e4SLinus Torvalds
230cd6a6503SJie Yang #endif /* CONFIG_SND_OSSEMUL && CONFIG_SND_PROC_FS */
2311da177e4SLinus Torvalds
2321da177e4SLinus Torvalds #endif /* __SOUND_INFO_H */
233