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