xref: /openbmc/linux/include/sound/info.h (revision c900529f3d9161bfde5cca0754f83b4d3c3e0220)
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