| /* | |
| * dev_table.h | |
| * | |
| * Global definitions for device call tables | |
| * | |
| * | |
| * Copyright (C) by Hannu Savolainen 1993-1997 | |
| * | |
| * OSS/Free for Linux is distributed under the GNU GENERAL PUBLIC LICENSE (GPL) | |
| * Version 2 (June 1991). See the "COPYING" file distributed with this software | |
| * for more info. | |
| */ | |
| #ifndef _DEV_TABLE_H_ | |
| #define _DEV_TABLE_H_ | |
| #include <linux/spinlock.h> | |
| /* | |
| * Sound card numbers 27 to 999. (1 to 26 are defined in soundcard.h) | |
| * Numbers 1000 to N are reserved for driver's internal use. | |
| */ | |
| #define SNDCARD_DESKPROXL 27 /* Compaq Deskpro XL */ | |
| #define SNDCARD_VIDC 28 /* ARMs VIDC */ | |
| #define SNDCARD_SBPNP 29 | |
| #define SNDCARD_SOFTOSS 36 | |
| #define SNDCARD_VMIDI 37 | |
| #define SNDCARD_OPL3SA1 38 /* Note: clash in msnd.h */ | |
| #define SNDCARD_OPL3SA1_SB 39 | |
| #define SNDCARD_OPL3SA1_MPU 40 | |
| #define SNDCARD_WAVEFRONT 41 | |
| #define SNDCARD_OPL3SA2 42 | |
| #define SNDCARD_OPL3SA2_MPU 43 | |
| #define SNDCARD_WAVEARTIST 44 /* Waveartist */ | |
| #define SNDCARD_OPL3SA2_MSS 45 /* Originally missed */ | |
| #define SNDCARD_AD1816 88 | |
| /* | |
| * NOTE! NOTE! NOTE! NOTE! | |
| * | |
| * If you modify this file, please check the dev_table.c also. | |
| * | |
| * NOTE! NOTE! NOTE! NOTE! | |
| */ | |
| struct driver_info | |
| { | |
| char *driver_id; | |
| int card_subtype; /* Driver specific. Usually 0 */ | |
| int card_type; /* From soundcard.h */ | |
| char *name; | |
| void (*attach) (struct address_info *hw_config); | |
| int (*probe) (struct address_info *hw_config); | |
| void (*unload) (struct address_info *hw_config); | |
| }; | |
| struct card_info | |
| { | |
| int card_type; /* Link (search key) to the driver list */ | |
| struct address_info config; | |
| int enabled; | |
| void *for_driver_use; | |
| }; | |
| /* | |
| * Device specific parameters (used only by dmabuf.c) | |
| */ | |
| #define MAX_SUB_BUFFERS (32*MAX_REALTIME_FACTOR) | |
| #define DMODE_NONE 0 | |
| #define DMODE_OUTPUT PCM_ENABLE_OUTPUT | |
| #define DMODE_INPUT PCM_ENABLE_INPUT | |
| struct dma_buffparms | |
| { | |
| int dma_mode; /* DMODE_INPUT, DMODE_OUTPUT or DMODE_NONE */ | |
| int closing; | |
| /* | |
| * Pointers to raw buffers | |
| */ | |
| char *raw_buf; | |
| unsigned long raw_buf_phys; | |
| int buffsize; | |
| /* | |
| * Device state tables | |
| */ | |
| unsigned long flags; | |
| #define DMA_BUSY 0x00000001 | |
| #define DMA_RESTART 0x00000002 | |
| #define DMA_ACTIVE 0x00000004 | |
| #define DMA_STARTED 0x00000008 | |
| #define DMA_EMPTY 0x00000010 | |
| #define DMA_ALLOC_DONE 0x00000020 | |
| #define DMA_SYNCING 0x00000040 | |
| #define DMA_DIRTY 0x00000080 | |
| #define DMA_POST 0x00000100 | |
| #define DMA_NODMA 0x00000200 | |
| #define DMA_NOTIMEOUT 0x00000400 | |
| int open_mode; | |
| /* | |
| * Queue parameters. | |
| */ | |
| int qlen; | |
| int qhead; | |
| int qtail; | |
| spinlock_t lock; | |
| int cfrag; /* Current incomplete fragment (write) */ | |
| int nbufs; | |
| int counts[MAX_SUB_BUFFERS]; | |
| int subdivision; | |
| int fragment_size; | |
| int needs_reorg; | |
| int max_fragments; | |
| int bytes_in_use; | |
| int underrun_count; | |
| unsigned long byte_counter; | |
| unsigned long user_counter; | |
| unsigned long max_byte_counter; | |
| int data_rate; /* Bytes/second */ | |
| int mapping_flags; | |
| #define DMA_MAP_MAPPED 0x00000001 | |
| char neutral_byte; | |
| int dma; /* DMA channel */ | |
| int applic_profile; /* Application profile (APF_*) */ | |
| /* Interrupt callback stuff */ | |
| void (*audio_callback) (int dev, int parm); | |
| int callback_parm; | |
| int buf_flags[MAX_SUB_BUFFERS]; | |
| #define BUFF_EOF 0x00000001 /* Increment eof count */ | |
| #define BUFF_DIRTY 0x00000002 /* Buffer written */ | |
| }; | |
| /* | |
| * Structure for use with various microcontrollers and DSP processors | |
| * in the recent sound cards. | |
| */ | |
| typedef struct coproc_operations | |
| { | |
| char name[64]; | |
| struct module *owner; | |
| int (*open) (void *devc, int sub_device); | |
| void (*close) (void *devc, int sub_device); | |
| int (*ioctl) (void *devc, unsigned int cmd, void __user * arg, int local); | |
| void (*reset) (void *devc); | |
| void *devc; /* Driver specific info */ | |
| } coproc_operations; | |
| struct audio_driver | |
| { | |
| struct module *owner; | |
| int (*open) (int dev, int mode); | |
| void (*close) (int dev); | |
| void (*output_block) (int dev, unsigned long buf, | |
| int count, int intrflag); | |
| void (*start_input) (int dev, unsigned long buf, | |
| int count, int intrflag); | |
| int (*ioctl) (int dev, unsigned int cmd, void __user * arg); | |
| int (*prepare_for_input) (int dev, int bufsize, int nbufs); | |
| int (*prepare_for_output) (int dev, int bufsize, int nbufs); | |
| void (*halt_io) (int dev); | |
| int (*local_qlen)(int dev); | |
| void (*copy_user) (int dev, | |
| char *localbuf, int localoffs, | |
| const char __user *userbuf, int useroffs, | |
| int max_in, int max_out, | |
| int *used, int *returned, | |
| int len); | |
| void (*halt_input) (int dev); | |
| void (*halt_output) (int dev); | |
| void (*trigger) (int dev, int bits); | |
| int (*set_speed)(int dev, int speed); | |
| unsigned int (*set_bits)(int dev, unsigned int bits); | |
| short (*set_channels)(int dev, short channels); | |
| void (*postprocess_write)(int dev); /* Device spesific postprocessing for written data */ | |
| void (*preprocess_read)(int dev); /* Device spesific preprocessing for read data */ | |
| void (*mmap)(int dev); | |
| }; | |
| struct audio_operations | |
| { | |
| char name[128]; | |
| int flags; | |
| #define NOTHING_SPECIAL 0x00 | |
| #define NEEDS_RESTART 0x01 | |
| #define DMA_AUTOMODE 0x02 | |
| #define DMA_DUPLEX 0x04 | |
| #define DMA_PSEUDO_AUTOMODE 0x08 | |
| #define DMA_HARDSTOP 0x10 | |
| #define DMA_EXACT 0x40 | |
| #define DMA_NORESET 0x80 | |
| int format_mask; /* Bitmask for supported audio formats */ | |
| void *devc; /* Driver specific info */ | |
| struct audio_driver *d; | |
| void *portc; /* Driver specific info */ | |
| struct dma_buffparms *dmap_in, *dmap_out; | |
| struct coproc_operations *coproc; | |
| int mixer_dev; | |
| int enable_bits; | |
| int open_mode; | |
| int go; | |
| int min_fragment; /* 0 == unlimited */ | |
| int max_fragment; /* 0 == unlimited */ | |
| int parent_dev; /* 0 -> no parent, 1 to n -> parent=parent_dev+1 */ | |
| /* fields formerly in dmabuf.c */ | |
| wait_queue_head_t in_sleeper; | |
| wait_queue_head_t out_sleeper; | |
| wait_queue_head_t poll_sleeper; | |
| /* fields formerly in audio.c */ | |
| int audio_mode; | |
| #define AM_NONE 0 | |
| #define AM_WRITE OPEN_WRITE | |
| #define AM_READ OPEN_READ | |
| int local_format; | |
| int audio_format; | |
| int local_conversion; | |
| #define CNV_MU_LAW 0x00000001 | |
| /* large structures at the end to keep offsets small */ | |
| struct dma_buffparms dmaps[2]; | |
| }; | |
| int *load_mixer_volumes(char *name, int *levels, int present); | |
| struct mixer_operations | |
| { | |
| struct module *owner; | |
| char id[16]; | |
| char name[64]; | |
| int (*ioctl) (int dev, unsigned int cmd, void __user * arg); | |
| void *devc; | |
| int modify_counter; | |
| }; | |
| struct synth_operations | |
| { | |
| struct module *owner; | |
| char *id; /* Unique identifier (ASCII) max 29 char */ | |
| struct synth_info *info; | |
| int midi_dev; | |
| int synth_type; | |
| int synth_subtype; | |
| int (*open) (int dev, int mode); | |
| void (*close) (int dev); | |
| int (*ioctl) (int dev, unsigned int cmd, void __user * arg); | |
| int (*kill_note) (int dev, int voice, int note, int velocity); | |
| int (*start_note) (int dev, int voice, int note, int velocity); | |
| int (*set_instr) (int dev, int voice, int instr); | |
| void (*reset) (int dev); | |
| void (*hw_control) (int dev, unsigned char *event); | |
| int (*load_patch) (int dev, int format, const char __user *addr, | |
| int count, int pmgr_flag); | |
| void (*aftertouch) (int dev, int voice, int pressure); | |
| void (*controller) (int dev, int voice, int ctrl_num, int value); | |
| void (*panning) (int dev, int voice, int value); | |
| void (*volume_method) (int dev, int mode); | |
| void (*bender) (int dev, int chn, int value); | |
| int (*alloc_voice) (int dev, int chn, int note, struct voice_alloc_info *alloc); | |
| void (*setup_voice) (int dev, int voice, int chn); | |
| int (*send_sysex)(int dev, unsigned char *bytes, int len); | |
| struct voice_alloc_info alloc; | |
| struct channel_info chn_info[16]; | |
| int emulation; | |
| #define EMU_GM 1 /* General MIDI */ | |
| #define EMU_XG 2 /* Yamaha XG */ | |
| #define MAX_SYSEX_BUF 64 | |
| unsigned char sysex_buf[MAX_SYSEX_BUF]; | |
| int sysex_ptr; | |
| }; | |
| struct midi_input_info | |
| { | |
| /* MIDI input scanner variables */ | |
| #define MI_MAX 10 | |
| volatile int m_busy; | |
| unsigned char m_buf[MI_MAX]; | |
| unsigned char m_prev_status; /* For running status */ | |
| int m_ptr; | |
| #define MST_INIT 0 | |
| #define MST_DATA 1 | |
| #define MST_SYSEX 2 | |
| int m_state; | |
| int m_left; | |
| }; | |
| struct midi_operations | |
| { | |
| struct module *owner; | |
| struct midi_info info; | |
| struct synth_operations *converter; | |
| struct midi_input_info in_info; | |
| int (*open) (int dev, int mode, | |
| void (*inputintr)(int dev, unsigned char data), | |
| void (*outputintr)(int dev) | |
| ); | |
| void (*close) (int dev); | |
| int (*ioctl) (int dev, unsigned int cmd, void __user * arg); | |
| int (*outputc) (int dev, unsigned char data); | |
| int (*start_read) (int dev); | |
| int (*end_read) (int dev); | |
| void (*kick)(int dev); | |
| int (*command) (int dev, unsigned char *data); | |
| int (*buffer_status) (int dev); | |
| int (*prefix_cmd) (int dev, unsigned char status); | |
| struct coproc_operations *coproc; | |
| void *devc; | |
| }; | |
| struct sound_lowlev_timer | |
| { | |
| int dev; | |
| int priority; | |
| unsigned int (*tmr_start)(int dev, unsigned int usecs); | |
| void (*tmr_disable)(int dev); | |
| void (*tmr_restart)(int dev); | |
| }; | |
| struct sound_timer_operations | |
| { | |
| struct module *owner; | |
| struct sound_timer_info info; | |
| int priority; | |
| int devlink; | |
| int (*open)(int dev, int mode); | |
| void (*close)(int dev); | |
| int (*event)(int dev, unsigned char *ev); | |
| unsigned long (*get_time)(int dev); | |
| int (*ioctl) (int dev, unsigned int cmd, void __user * arg); | |
| void (*arm_timer)(int dev, long time); | |
| }; | |
| extern struct sound_timer_operations default_sound_timer; | |
| extern struct audio_operations *audio_devs[MAX_AUDIO_DEV]; | |
| extern int num_audiodevs; | |
| extern struct mixer_operations *mixer_devs[MAX_MIXER_DEV]; | |
| extern int num_mixers; | |
| extern struct synth_operations *synth_devs[MAX_SYNTH_DEV+MAX_MIDI_DEV]; | |
| extern int num_synths; | |
| extern struct midi_operations *midi_devs[MAX_MIDI_DEV]; | |
| extern int num_midis; | |
| extern struct sound_timer_operations * sound_timer_devs[MAX_TIMER_DEV]; | |
| extern int num_sound_timers; | |
| extern int sound_map_buffer (int dev, struct dma_buffparms *dmap, buffmem_desc *info); | |
| void sound_timer_init (struct sound_lowlev_timer *t, char *name); | |
| void sound_dma_intr (int dev, struct dma_buffparms *dmap, int chan); | |
| #define AUDIO_DRIVER_VERSION 2 | |
| #define MIXER_DRIVER_VERSION 2 | |
| int sound_install_audiodrv(int vers, char *name, struct audio_driver *driver, | |
| int driver_size, int flags, unsigned int format_mask, | |
| void *devc, int dma1, int dma2); | |
| int sound_install_mixer(int vers, char *name, struct mixer_operations *driver, | |
| int driver_size, void *devc); | |
| void sound_unload_audiodev(int dev); | |
| void sound_unload_mixerdev(int dev); | |
| void sound_unload_mididev(int dev); | |
| void sound_unload_synthdev(int dev); | |
| void sound_unload_timerdev(int dev); | |
| int sound_alloc_mixerdev(void); | |
| int sound_alloc_timerdev(void); | |
| int sound_alloc_synthdev(void); | |
| int sound_alloc_mididev(void); | |
| #endif /* _DEV_TABLE_H_ */ | |