18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-or-later */
28c2ecf20Sopenharmony_ci#ifndef __SOUND_INFO_H
38c2ecf20Sopenharmony_ci#define __SOUND_INFO_H
48c2ecf20Sopenharmony_ci
58c2ecf20Sopenharmony_ci/*
68c2ecf20Sopenharmony_ci *  Header file for info interface
78c2ecf20Sopenharmony_ci *  Copyright (c) by Jaroslav Kysela <perex@perex.cz>
88c2ecf20Sopenharmony_ci */
98c2ecf20Sopenharmony_ci
108c2ecf20Sopenharmony_ci#include <linux/poll.h>
118c2ecf20Sopenharmony_ci#include <linux/seq_file.h>
128c2ecf20Sopenharmony_ci#include <sound/core.h>
138c2ecf20Sopenharmony_ci
148c2ecf20Sopenharmony_ci/* buffer for information */
158c2ecf20Sopenharmony_cistruct snd_info_buffer {
168c2ecf20Sopenharmony_ci	char *buffer;		/* pointer to begin of buffer */
178c2ecf20Sopenharmony_ci	unsigned int curr;	/* current position in buffer */
188c2ecf20Sopenharmony_ci	unsigned int size;	/* current size */
198c2ecf20Sopenharmony_ci	unsigned int len;	/* total length of buffer */
208c2ecf20Sopenharmony_ci	int stop;		/* stop flag */
218c2ecf20Sopenharmony_ci	int error;		/* error code */
228c2ecf20Sopenharmony_ci};
238c2ecf20Sopenharmony_ci
248c2ecf20Sopenharmony_ci#define SNDRV_INFO_CONTENT_TEXT		0
258c2ecf20Sopenharmony_ci#define SNDRV_INFO_CONTENT_DATA		1
268c2ecf20Sopenharmony_ci
278c2ecf20Sopenharmony_cistruct snd_info_entry;
288c2ecf20Sopenharmony_ci
298c2ecf20Sopenharmony_cistruct snd_info_entry_text {
308c2ecf20Sopenharmony_ci	void (*read)(struct snd_info_entry *entry,
318c2ecf20Sopenharmony_ci		     struct snd_info_buffer *buffer);
328c2ecf20Sopenharmony_ci	void (*write)(struct snd_info_entry *entry,
338c2ecf20Sopenharmony_ci		      struct snd_info_buffer *buffer);
348c2ecf20Sopenharmony_ci};
358c2ecf20Sopenharmony_ci
368c2ecf20Sopenharmony_cistruct snd_info_entry_ops {
378c2ecf20Sopenharmony_ci	int (*open)(struct snd_info_entry *entry,
388c2ecf20Sopenharmony_ci		    unsigned short mode, void **file_private_data);
398c2ecf20Sopenharmony_ci	int (*release)(struct snd_info_entry *entry,
408c2ecf20Sopenharmony_ci		       unsigned short mode, void *file_private_data);
418c2ecf20Sopenharmony_ci	ssize_t (*read)(struct snd_info_entry *entry, void *file_private_data,
428c2ecf20Sopenharmony_ci			struct file *file, char __user *buf,
438c2ecf20Sopenharmony_ci			size_t count, loff_t pos);
448c2ecf20Sopenharmony_ci	ssize_t (*write)(struct snd_info_entry *entry, void *file_private_data,
458c2ecf20Sopenharmony_ci			 struct file *file, const char __user *buf,
468c2ecf20Sopenharmony_ci			 size_t count, loff_t pos);
478c2ecf20Sopenharmony_ci	loff_t (*llseek)(struct snd_info_entry *entry,
488c2ecf20Sopenharmony_ci			 void *file_private_data, struct file *file,
498c2ecf20Sopenharmony_ci			 loff_t offset, int orig);
508c2ecf20Sopenharmony_ci	__poll_t (*poll)(struct snd_info_entry *entry,
518c2ecf20Sopenharmony_ci			     void *file_private_data, struct file *file,
528c2ecf20Sopenharmony_ci			     poll_table *wait);
538c2ecf20Sopenharmony_ci	int (*ioctl)(struct snd_info_entry *entry, void *file_private_data,
548c2ecf20Sopenharmony_ci		     struct file *file, unsigned int cmd, unsigned long arg);
558c2ecf20Sopenharmony_ci	int (*mmap)(struct snd_info_entry *entry, void *file_private_data,
568c2ecf20Sopenharmony_ci		    struct inode *inode, struct file *file,
578c2ecf20Sopenharmony_ci		    struct vm_area_struct *vma);
588c2ecf20Sopenharmony_ci};
598c2ecf20Sopenharmony_ci
608c2ecf20Sopenharmony_cistruct snd_info_entry {
618c2ecf20Sopenharmony_ci	const char *name;
628c2ecf20Sopenharmony_ci	umode_t mode;
638c2ecf20Sopenharmony_ci	long size;
648c2ecf20Sopenharmony_ci	unsigned short content;
658c2ecf20Sopenharmony_ci	union {
668c2ecf20Sopenharmony_ci		struct snd_info_entry_text text;
678c2ecf20Sopenharmony_ci		const struct snd_info_entry_ops *ops;
688c2ecf20Sopenharmony_ci	} c;
698c2ecf20Sopenharmony_ci	struct snd_info_entry *parent;
708c2ecf20Sopenharmony_ci	struct module *module;
718c2ecf20Sopenharmony_ci	void *private_data;
728c2ecf20Sopenharmony_ci	void (*private_free)(struct snd_info_entry *entry);
738c2ecf20Sopenharmony_ci	struct proc_dir_entry *p;
748c2ecf20Sopenharmony_ci	struct mutex access;
758c2ecf20Sopenharmony_ci	struct list_head children;
768c2ecf20Sopenharmony_ci	struct list_head list;
778c2ecf20Sopenharmony_ci};
788c2ecf20Sopenharmony_ci
798c2ecf20Sopenharmony_ci#if defined(CONFIG_SND_OSSEMUL) && defined(CONFIG_SND_PROC_FS)
808c2ecf20Sopenharmony_ciint snd_info_minor_register(void);
818c2ecf20Sopenharmony_ci#else
828c2ecf20Sopenharmony_ci#define snd_info_minor_register()	0
838c2ecf20Sopenharmony_ci#endif
848c2ecf20Sopenharmony_ci
858c2ecf20Sopenharmony_ci
868c2ecf20Sopenharmony_ci#ifdef CONFIG_SND_PROC_FS
878c2ecf20Sopenharmony_ci
888c2ecf20Sopenharmony_ciextern struct snd_info_entry *snd_seq_root;
898c2ecf20Sopenharmony_ci#ifdef CONFIG_SND_OSSEMUL
908c2ecf20Sopenharmony_ciextern struct snd_info_entry *snd_oss_root;
918c2ecf20Sopenharmony_civoid snd_card_info_read_oss(struct snd_info_buffer *buffer);
928c2ecf20Sopenharmony_ci#else
938c2ecf20Sopenharmony_ci#define snd_oss_root NULL
948c2ecf20Sopenharmony_cistatic inline void snd_card_info_read_oss(struct snd_info_buffer *buffer) {}
958c2ecf20Sopenharmony_ci#endif
968c2ecf20Sopenharmony_ci
978c2ecf20Sopenharmony_ci/**
988c2ecf20Sopenharmony_ci * snd_iprintf - printf on the procfs buffer
998c2ecf20Sopenharmony_ci * @buf: the procfs buffer
1008c2ecf20Sopenharmony_ci * @fmt: the printf format
1018c2ecf20Sopenharmony_ci *
1028c2ecf20Sopenharmony_ci * Outputs the string on the procfs buffer just like printf().
1038c2ecf20Sopenharmony_ci *
1048c2ecf20Sopenharmony_ci * Return: zero for success, or a negative error code.
1058c2ecf20Sopenharmony_ci */
1068c2ecf20Sopenharmony_ci#define snd_iprintf(buf, fmt, args...) \
1078c2ecf20Sopenharmony_ci	seq_printf((struct seq_file *)(buf)->buffer, fmt, ##args)
1088c2ecf20Sopenharmony_ci
1098c2ecf20Sopenharmony_ciint snd_info_init(void);
1108c2ecf20Sopenharmony_ciint snd_info_done(void);
1118c2ecf20Sopenharmony_ci
1128c2ecf20Sopenharmony_ciint snd_info_get_line(struct snd_info_buffer *buffer, char *line, int len);
1138c2ecf20Sopenharmony_ciconst char *snd_info_get_str(char *dest, const char *src, int len);
1148c2ecf20Sopenharmony_cistruct snd_info_entry *snd_info_create_module_entry(struct module *module,
1158c2ecf20Sopenharmony_ci					       const char *name,
1168c2ecf20Sopenharmony_ci					       struct snd_info_entry *parent);
1178c2ecf20Sopenharmony_cistruct snd_info_entry *snd_info_create_card_entry(struct snd_card *card,
1188c2ecf20Sopenharmony_ci					     const char *name,
1198c2ecf20Sopenharmony_ci					     struct snd_info_entry *parent);
1208c2ecf20Sopenharmony_civoid snd_info_free_entry(struct snd_info_entry *entry);
1218c2ecf20Sopenharmony_ciint snd_info_store_text(struct snd_info_entry *entry);
1228c2ecf20Sopenharmony_ciint snd_info_restore_text(struct snd_info_entry *entry);
1238c2ecf20Sopenharmony_ci
1248c2ecf20Sopenharmony_ciint snd_info_card_create(struct snd_card *card);
1258c2ecf20Sopenharmony_ciint snd_info_card_register(struct snd_card *card);
1268c2ecf20Sopenharmony_ciint snd_info_card_free(struct snd_card *card);
1278c2ecf20Sopenharmony_civoid snd_info_card_disconnect(struct snd_card *card);
1288c2ecf20Sopenharmony_civoid snd_info_card_id_change(struct snd_card *card);
1298c2ecf20Sopenharmony_ciint snd_info_register(struct snd_info_entry *entry);
1308c2ecf20Sopenharmony_ci
1318c2ecf20Sopenharmony_ci/* for card drivers */
1328c2ecf20Sopenharmony_cistatic inline int snd_card_proc_new(struct snd_card *card, const char *name,
1338c2ecf20Sopenharmony_ci				    struct snd_info_entry **entryp)
1348c2ecf20Sopenharmony_ci{
1358c2ecf20Sopenharmony_ci	*entryp = snd_info_create_card_entry(card, name, card->proc_root);
1368c2ecf20Sopenharmony_ci	return *entryp ? 0 : -ENOMEM;
1378c2ecf20Sopenharmony_ci}
1388c2ecf20Sopenharmony_ci
1398c2ecf20Sopenharmony_cistatic inline void snd_info_set_text_ops(struct snd_info_entry *entry,
1408c2ecf20Sopenharmony_ci	void *private_data,
1418c2ecf20Sopenharmony_ci	void (*read)(struct snd_info_entry *, struct snd_info_buffer *))
1428c2ecf20Sopenharmony_ci{
1438c2ecf20Sopenharmony_ci	entry->private_data = private_data;
1448c2ecf20Sopenharmony_ci	entry->c.text.read = read;
1458c2ecf20Sopenharmony_ci}
1468c2ecf20Sopenharmony_ci
1478c2ecf20Sopenharmony_ciint snd_card_rw_proc_new(struct snd_card *card, const char *name,
1488c2ecf20Sopenharmony_ci			 void *private_data,
1498c2ecf20Sopenharmony_ci			 void (*read)(struct snd_info_entry *,
1508c2ecf20Sopenharmony_ci				      struct snd_info_buffer *),
1518c2ecf20Sopenharmony_ci			 void (*write)(struct snd_info_entry *entry,
1528c2ecf20Sopenharmony_ci				       struct snd_info_buffer *buffer));
1538c2ecf20Sopenharmony_ci
1548c2ecf20Sopenharmony_ciint snd_info_check_reserved_words(const char *str);
1558c2ecf20Sopenharmony_ci
1568c2ecf20Sopenharmony_ci#else
1578c2ecf20Sopenharmony_ci
1588c2ecf20Sopenharmony_ci#define snd_seq_root NULL
1598c2ecf20Sopenharmony_ci#define snd_oss_root NULL
1608c2ecf20Sopenharmony_ci
1618c2ecf20Sopenharmony_cistatic inline int snd_iprintf(struct snd_info_buffer *buffer, char *fmt, ...) { return 0; }
1628c2ecf20Sopenharmony_cistatic inline int snd_info_init(void) { return 0; }
1638c2ecf20Sopenharmony_cistatic inline int snd_info_done(void) { return 0; }
1648c2ecf20Sopenharmony_ci
1658c2ecf20Sopenharmony_cistatic inline int snd_info_get_line(struct snd_info_buffer *buffer, char *line, int len) { return 0; }
1668c2ecf20Sopenharmony_cistatic inline char *snd_info_get_str(char *dest, char *src, int len) { return NULL; }
1678c2ecf20Sopenharmony_cistatic inline struct snd_info_entry *snd_info_create_module_entry(struct module *module, const char *name, struct snd_info_entry *parent) { return NULL; }
1688c2ecf20Sopenharmony_cistatic inline struct snd_info_entry *snd_info_create_card_entry(struct snd_card *card, const char *name, struct snd_info_entry *parent) { return NULL; }
1698c2ecf20Sopenharmony_cistatic inline void snd_info_free_entry(struct snd_info_entry *entry) { ; }
1708c2ecf20Sopenharmony_ci
1718c2ecf20Sopenharmony_cistatic inline int snd_info_card_create(struct snd_card *card) { return 0; }
1728c2ecf20Sopenharmony_cistatic inline int snd_info_card_register(struct snd_card *card) { return 0; }
1738c2ecf20Sopenharmony_cistatic inline int snd_info_card_free(struct snd_card *card) { return 0; }
1748c2ecf20Sopenharmony_cistatic inline void snd_info_card_disconnect(struct snd_card *card) { }
1758c2ecf20Sopenharmony_cistatic inline void snd_info_card_id_change(struct snd_card *card) { }
1768c2ecf20Sopenharmony_cistatic inline int snd_info_register(struct snd_info_entry *entry) { return 0; }
1778c2ecf20Sopenharmony_ci
1788c2ecf20Sopenharmony_cistatic inline int snd_card_proc_new(struct snd_card *card, const char *name,
1798c2ecf20Sopenharmony_ci				    struct snd_info_entry **entryp) { return -EINVAL; }
1808c2ecf20Sopenharmony_cistatic inline void snd_info_set_text_ops(struct snd_info_entry *entry __attribute__((unused)),
1818c2ecf20Sopenharmony_ci					 void *private_data,
1828c2ecf20Sopenharmony_ci					 void (*read)(struct snd_info_entry *, struct snd_info_buffer *)) {}
1838c2ecf20Sopenharmony_cistatic inline int snd_card_rw_proc_new(struct snd_card *card, const char *name,
1848c2ecf20Sopenharmony_ci				       void *private_data,
1858c2ecf20Sopenharmony_ci				       void (*read)(struct snd_info_entry *,
1868c2ecf20Sopenharmony_ci						    struct snd_info_buffer *),
1878c2ecf20Sopenharmony_ci				       void (*write)(struct snd_info_entry *entry,
1888c2ecf20Sopenharmony_ci						     struct snd_info_buffer *buffer))
1898c2ecf20Sopenharmony_ci{
1908c2ecf20Sopenharmony_ci	return 0;
1918c2ecf20Sopenharmony_ci}
1928c2ecf20Sopenharmony_cistatic inline int snd_info_check_reserved_words(const char *str) { return 1; }
1938c2ecf20Sopenharmony_ci
1948c2ecf20Sopenharmony_ci#endif
1958c2ecf20Sopenharmony_ci
1968c2ecf20Sopenharmony_ci/**
1978c2ecf20Sopenharmony_ci * snd_card_ro_proc_new - Create a read-only text proc file entry for the card
1988c2ecf20Sopenharmony_ci * @card: the card instance
1998c2ecf20Sopenharmony_ci * @name: the file name
2008c2ecf20Sopenharmony_ci * @private_data: the arbitrary private data
2018c2ecf20Sopenharmony_ci * @read: the read callback
2028c2ecf20Sopenharmony_ci *
2038c2ecf20Sopenharmony_ci * This proc file entry will be registered via snd_card_register() call, and
2048c2ecf20Sopenharmony_ci * it will be removed automatically at the card removal, too.
2058c2ecf20Sopenharmony_ci */
2068c2ecf20Sopenharmony_cistatic inline int
2078c2ecf20Sopenharmony_cisnd_card_ro_proc_new(struct snd_card *card, const char *name,
2088c2ecf20Sopenharmony_ci		     void *private_data,
2098c2ecf20Sopenharmony_ci		     void (*read)(struct snd_info_entry *,
2108c2ecf20Sopenharmony_ci				  struct snd_info_buffer *))
2118c2ecf20Sopenharmony_ci{
2128c2ecf20Sopenharmony_ci	return snd_card_rw_proc_new(card, name, private_data, read, NULL);
2138c2ecf20Sopenharmony_ci}
2148c2ecf20Sopenharmony_ci
2158c2ecf20Sopenharmony_ci/*
2168c2ecf20Sopenharmony_ci * OSS info part
2178c2ecf20Sopenharmony_ci */
2188c2ecf20Sopenharmony_ci
2198c2ecf20Sopenharmony_ci#if defined(CONFIG_SND_OSSEMUL) && defined(CONFIG_SND_PROC_FS)
2208c2ecf20Sopenharmony_ci
2218c2ecf20Sopenharmony_ci#define SNDRV_OSS_INFO_DEV_AUDIO	0
2228c2ecf20Sopenharmony_ci#define SNDRV_OSS_INFO_DEV_SYNTH	1
2238c2ecf20Sopenharmony_ci#define SNDRV_OSS_INFO_DEV_MIDI		2
2248c2ecf20Sopenharmony_ci#define SNDRV_OSS_INFO_DEV_TIMERS	4
2258c2ecf20Sopenharmony_ci#define SNDRV_OSS_INFO_DEV_MIXERS	5
2268c2ecf20Sopenharmony_ci
2278c2ecf20Sopenharmony_ci#define SNDRV_OSS_INFO_DEV_COUNT	6
2288c2ecf20Sopenharmony_ci
2298c2ecf20Sopenharmony_ciint snd_oss_info_register(int dev, int num, char *string);
2308c2ecf20Sopenharmony_ci#define snd_oss_info_unregister(dev, num) snd_oss_info_register(dev, num, NULL)
2318c2ecf20Sopenharmony_ci
2328c2ecf20Sopenharmony_ci#endif /* CONFIG_SND_OSSEMUL && CONFIG_SND_PROC_FS */
2338c2ecf20Sopenharmony_ci
2348c2ecf20Sopenharmony_ci#endif /* __SOUND_INFO_H */
235