linux/include/sound/info.h
<<
>>
Prefs
   1#ifndef __SOUND_INFO_H
   2#define __SOUND_INFO_H
   3
   4/*
   5 *  Header file for info interface
   6 *  Copyright (c) by Jaroslav Kysela <perex@perex.cz>
   7 *
   8 *
   9 *   This program is free software; you can redistribute it and/or modify
  10 *   it under the terms of the GNU General Public License as published by
  11 *   the Free Software Foundation; either version 2 of the License, or
  12 *   (at your option) any later version.
  13 *
  14 *   This program is distributed in the hope that it will be useful,
  15 *   but WITHOUT ANY WARRANTY; without even the implied warranty of
  16 *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  17 *   GNU General Public License for more details.
  18 *
  19 *   You should have received a copy of the GNU General Public License
  20 *   along with this program; if not, write to the Free Software
  21 *   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
  22 *
  23 */
  24
  25#include <linux/poll.h>
  26#include <linux/seq_file.h>
  27#include <sound/core.h>
  28
  29/* buffer for information */
  30struct snd_info_buffer {
  31        char *buffer;           /* pointer to begin of buffer */
  32        unsigned int curr;      /* current position in buffer */
  33        unsigned int size;      /* current size */
  34        unsigned int len;       /* total length of buffer */
  35        int stop;               /* stop flag */
  36        int error;              /* error code */
  37};
  38
  39#define SNDRV_INFO_CONTENT_TEXT         0
  40#define SNDRV_INFO_CONTENT_DATA         1
  41
  42struct snd_info_entry;
  43
  44struct snd_info_entry_text {
  45        void (*read)(struct snd_info_entry *entry,
  46                     struct snd_info_buffer *buffer);
  47        void (*write)(struct snd_info_entry *entry,
  48                      struct snd_info_buffer *buffer);
  49};
  50
  51struct snd_info_entry_ops {
  52        int (*open)(struct snd_info_entry *entry,
  53                    unsigned short mode, void **file_private_data);
  54        int (*release)(struct snd_info_entry *entry,
  55                       unsigned short mode, void *file_private_data);
  56        ssize_t (*read)(struct snd_info_entry *entry, void *file_private_data,
  57                        struct file *file, char __user *buf,
  58                        size_t count, loff_t pos);
  59        ssize_t (*write)(struct snd_info_entry *entry, void *file_private_data,
  60                         struct file *file, const char __user *buf,
  61                         size_t count, loff_t pos);
  62        loff_t (*llseek)(struct snd_info_entry *entry,
  63                         void *file_private_data, struct file *file,
  64                         loff_t offset, int orig);
  65        __poll_t (*poll)(struct snd_info_entry *entry,
  66                             void *file_private_data, struct file *file,
  67                             poll_table *wait);
  68        int (*ioctl)(struct snd_info_entry *entry, void *file_private_data,
  69                     struct file *file, unsigned int cmd, unsigned long arg);
  70        int (*mmap)(struct snd_info_entry *entry, void *file_private_data,
  71                    struct inode *inode, struct file *file,
  72                    struct vm_area_struct *vma);
  73};
  74
  75struct snd_info_entry {
  76        const char *name;
  77        umode_t mode;
  78        long size;
  79        unsigned short content;
  80        union {
  81                struct snd_info_entry_text text;
  82                struct snd_info_entry_ops *ops;
  83        } c;
  84        struct snd_info_entry *parent;
  85        struct snd_card *card;
  86        struct module *module;
  87        void *private_data;
  88        void (*private_free)(struct snd_info_entry *entry);
  89        struct proc_dir_entry *p;
  90        struct mutex access;
  91        struct list_head children;
  92        struct list_head list;
  93};
  94
  95#if defined(CONFIG_SND_OSSEMUL) && defined(CONFIG_SND_PROC_FS)
  96int snd_info_minor_register(void);
  97#else
  98#define snd_info_minor_register()       0
  99#endif
 100
 101
 102#ifdef CONFIG_SND_PROC_FS
 103
 104extern struct snd_info_entry *snd_seq_root;
 105#ifdef CONFIG_SND_OSSEMUL
 106extern struct snd_info_entry *snd_oss_root;
 107void snd_card_info_read_oss(struct snd_info_buffer *buffer);
 108#else
 109#define snd_oss_root NULL
 110static inline void snd_card_info_read_oss(struct snd_info_buffer *buffer) {}
 111#endif
 112
 113/**
 114 * snd_iprintf - printf on the procfs buffer
 115 * @buf: the procfs buffer
 116 * @fmt: the printf format
 117 *
 118 * Outputs the string on the procfs buffer just like printf().
 119 *
 120 * Return: zero for success, or a negative error code.
 121 */
 122#define snd_iprintf(buf, fmt, args...) \
 123        seq_printf((struct seq_file *)(buf)->buffer, fmt, ##args)
 124
 125int snd_info_init(void);
 126int snd_info_done(void);
 127
 128int snd_info_get_line(struct snd_info_buffer *buffer, char *line, int len);
 129const char *snd_info_get_str(char *dest, const char *src, int len);
 130struct snd_info_entry *snd_info_create_module_entry(struct module *module,
 131                                               const char *name,
 132                                               struct snd_info_entry *parent);
 133struct snd_info_entry *snd_info_create_card_entry(struct snd_card *card,
 134                                             const char *name,
 135                                             struct snd_info_entry *parent);
 136void snd_info_free_entry(struct snd_info_entry *entry);
 137int snd_info_store_text(struct snd_info_entry *entry);
 138int snd_info_restore_text(struct snd_info_entry *entry);
 139
 140int snd_info_card_create(struct snd_card *card);
 141int snd_info_card_register(struct snd_card *card);
 142int snd_info_card_free(struct snd_card *card);
 143void snd_info_card_disconnect(struct snd_card *card);
 144void snd_info_card_id_change(struct snd_card *card);
 145int snd_info_register(struct snd_info_entry *entry);
 146
 147/* for card drivers */
 148static inline int snd_card_proc_new(struct snd_card *card, const char *name,
 149                                    struct snd_info_entry **entryp)
 150{
 151        *entryp = snd_info_create_card_entry(card, name, card->proc_root);
 152        return *entryp ? 0 : -ENOMEM;
 153}
 154
 155static inline void snd_info_set_text_ops(struct snd_info_entry *entry, 
 156        void *private_data,
 157        void (*read)(struct snd_info_entry *, struct snd_info_buffer *))
 158{
 159        entry->private_data = private_data;
 160        entry->c.text.read = read;
 161}
 162
 163int snd_info_check_reserved_words(const char *str);
 164
 165#else
 166
 167#define snd_seq_root NULL
 168#define snd_oss_root NULL
 169
 170static inline int snd_iprintf(struct snd_info_buffer *buffer, char *fmt, ...) { return 0; }
 171static inline int snd_info_init(void) { return 0; }
 172static inline int snd_info_done(void) { return 0; }
 173
 174static inline int snd_info_get_line(struct snd_info_buffer *buffer, char *line, int len) { return 0; }
 175static inline char *snd_info_get_str(char *dest, char *src, int len) { return NULL; }
 176static inline struct snd_info_entry *snd_info_create_module_entry(struct module *module, const char *name, struct snd_info_entry *parent) { return NULL; }
 177static inline struct snd_info_entry *snd_info_create_card_entry(struct snd_card *card, const char *name, struct snd_info_entry *parent) { return NULL; }
 178static inline void snd_info_free_entry(struct snd_info_entry *entry) { ; }
 179
 180static inline int snd_info_card_create(struct snd_card *card) { return 0; }
 181static inline int snd_info_card_register(struct snd_card *card) { return 0; }
 182static inline int snd_info_card_free(struct snd_card *card) { return 0; }
 183static inline void snd_info_card_disconnect(struct snd_card *card) { }
 184static inline void snd_info_card_id_change(struct snd_card *card) { }
 185static inline int snd_info_register(struct snd_info_entry *entry) { return 0; }
 186
 187static inline int snd_card_proc_new(struct snd_card *card, const char *name,
 188                                    struct snd_info_entry **entryp) { return -EINVAL; }
 189static inline void snd_info_set_text_ops(struct snd_info_entry *entry __attribute__((unused)),
 190                                         void *private_data,
 191                                         void (*read)(struct snd_info_entry *, struct snd_info_buffer *)) {}
 192static inline int snd_info_check_reserved_words(const char *str) { return 1; }
 193
 194#endif
 195
 196/*
 197 * OSS info part
 198 */
 199
 200#if defined(CONFIG_SND_OSSEMUL) && defined(CONFIG_SND_PROC_FS)
 201
 202#define SNDRV_OSS_INFO_DEV_AUDIO        0
 203#define SNDRV_OSS_INFO_DEV_SYNTH        1
 204#define SNDRV_OSS_INFO_DEV_MIDI         2
 205#define SNDRV_OSS_INFO_DEV_TIMERS       4
 206#define SNDRV_OSS_INFO_DEV_MIXERS       5
 207
 208#define SNDRV_OSS_INFO_DEV_COUNT        6
 209
 210int snd_oss_info_register(int dev, int num, char *string);
 211#define snd_oss_info_unregister(dev, num) snd_oss_info_register(dev, num, NULL)
 212
 213#endif /* CONFIG_SND_OSSEMUL && CONFIG_SND_PROC_FS */
 214
 215#endif /* __SOUND_INFO_H */
 216