11da177e4SLinus Torvalds #ifndef __SOUND_GUS_H 21da177e4SLinus Torvalds #define __SOUND_GUS_H 31da177e4SLinus Torvalds 41da177e4SLinus Torvalds /* 51da177e4SLinus Torvalds * Global structures used for GUS part of ALSA driver 6c1017a4cSJaroslav Kysela * Copyright (c) by Jaroslav Kysela <perex@perex.cz> 71da177e4SLinus Torvalds * 81da177e4SLinus Torvalds * 91da177e4SLinus Torvalds * This program is free software; you can redistribute it and/or modify 101da177e4SLinus Torvalds * it under the terms of the GNU General Public License as published by 111da177e4SLinus Torvalds * the Free Software Foundation; either version 2 of the License, or 121da177e4SLinus Torvalds * (at your option) any later version. 131da177e4SLinus Torvalds * 141da177e4SLinus Torvalds * This program is distributed in the hope that it will be useful, 151da177e4SLinus Torvalds * but WITHOUT ANY WARRANTY; without even the implied warranty of 161da177e4SLinus Torvalds * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 171da177e4SLinus Torvalds * GNU General Public License for more details. 181da177e4SLinus Torvalds * 191da177e4SLinus Torvalds * You should have received a copy of the GNU General Public License 201da177e4SLinus Torvalds * along with this program; if not, write to the Free Software 211da177e4SLinus Torvalds * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 221da177e4SLinus Torvalds * 231da177e4SLinus Torvalds */ 241da177e4SLinus Torvalds 25a1ce3928SDavid Howells #include <sound/pcm.h> 26a1ce3928SDavid Howells #include <sound/rawmidi.h> 27a1ce3928SDavid Howells #include <sound/timer.h> 28a1ce3928SDavid Howells #include <sound/seq_midi_emul.h> 29a1ce3928SDavid Howells #include <sound/seq_device.h> 30*6cbbfe1cSTakashi Iwai #include <linux/io.h> 311da177e4SLinus Torvalds 321da177e4SLinus Torvalds /* IO ports */ 331da177e4SLinus Torvalds 341da177e4SLinus Torvalds #define GUSP(gus, x) ((gus)->gf1.port + SNDRV_g_u_s_##x) 351da177e4SLinus Torvalds 361da177e4SLinus Torvalds #define SNDRV_g_u_s_MIDICTRL (0x320-0x220) 371da177e4SLinus Torvalds #define SNDRV_g_u_s_MIDISTAT (0x320-0x220) 381da177e4SLinus Torvalds #define SNDRV_g_u_s_MIDIDATA (0x321-0x220) 391da177e4SLinus Torvalds 401da177e4SLinus Torvalds #define SNDRV_g_u_s_GF1PAGE (0x322-0x220) 411da177e4SLinus Torvalds #define SNDRV_g_u_s_GF1REGSEL (0x323-0x220) 421da177e4SLinus Torvalds #define SNDRV_g_u_s_GF1DATALOW (0x324-0x220) 431da177e4SLinus Torvalds #define SNDRV_g_u_s_GF1DATAHIGH (0x325-0x220) 441da177e4SLinus Torvalds #define SNDRV_g_u_s_IRQSTAT (0x226-0x220) 451da177e4SLinus Torvalds #define SNDRV_g_u_s_TIMERCNTRL (0x228-0x220) 461da177e4SLinus Torvalds #define SNDRV_g_u_s_TIMERDATA (0x229-0x220) 471da177e4SLinus Torvalds #define SNDRV_g_u_s_DRAM (0x327-0x220) 481da177e4SLinus Torvalds #define SNDRV_g_u_s_MIXCNTRLREG (0x220-0x220) 491da177e4SLinus Torvalds #define SNDRV_g_u_s_IRQDMACNTRLREG (0x22b-0x220) 501da177e4SLinus Torvalds #define SNDRV_g_u_s_REGCNTRLS (0x22f-0x220) 511da177e4SLinus Torvalds #define SNDRV_g_u_s_BOARDVERSION (0x726-0x220) 521da177e4SLinus Torvalds #define SNDRV_g_u_s_MIXCNTRLPORT (0x726-0x220) 531da177e4SLinus Torvalds #define SNDRV_g_u_s_IVER (0x325-0x220) 541da177e4SLinus Torvalds #define SNDRV_g_u_s_MIXDATAPORT (0x326-0x220) 551da177e4SLinus Torvalds #define SNDRV_g_u_s_MAXCNTRLPORT (0x326-0x220) 561da177e4SLinus Torvalds 571da177e4SLinus Torvalds /* GF1 registers */ 581da177e4SLinus Torvalds 591da177e4SLinus Torvalds /* global registers */ 601da177e4SLinus Torvalds #define SNDRV_GF1_GB_ACTIVE_VOICES 0x0e 611da177e4SLinus Torvalds #define SNDRV_GF1_GB_VOICES_IRQ 0x0f 621da177e4SLinus Torvalds #define SNDRV_GF1_GB_GLOBAL_MODE 0x19 631da177e4SLinus Torvalds #define SNDRV_GF1_GW_LFO_BASE 0x1a 641da177e4SLinus Torvalds #define SNDRV_GF1_GB_VOICES_IRQ_READ 0x1f 651da177e4SLinus Torvalds #define SNDRV_GF1_GB_DRAM_DMA_CONTROL 0x41 661da177e4SLinus Torvalds #define SNDRV_GF1_GW_DRAM_DMA_LOW 0x42 671da177e4SLinus Torvalds #define SNDRV_GF1_GW_DRAM_IO_LOW 0x43 681da177e4SLinus Torvalds #define SNDRV_GF1_GB_DRAM_IO_HIGH 0x44 691da177e4SLinus Torvalds #define SNDRV_GF1_GB_SOUND_BLASTER_CONTROL 0x45 701da177e4SLinus Torvalds #define SNDRV_GF1_GB_ADLIB_TIMER_1 0x46 711da177e4SLinus Torvalds #define SNDRV_GF1_GB_ADLIB_TIMER_2 0x47 721da177e4SLinus Torvalds #define SNDRV_GF1_GB_RECORD_RATE 0x48 731da177e4SLinus Torvalds #define SNDRV_GF1_GB_REC_DMA_CONTROL 0x49 741da177e4SLinus Torvalds #define SNDRV_GF1_GB_JOYSTICK_DAC_LEVEL 0x4b 751da177e4SLinus Torvalds #define SNDRV_GF1_GB_RESET 0x4c 761da177e4SLinus Torvalds #define SNDRV_GF1_GB_DRAM_DMA_HIGH 0x50 771da177e4SLinus Torvalds #define SNDRV_GF1_GW_DRAM_IO16 0x51 781da177e4SLinus Torvalds #define SNDRV_GF1_GW_MEMORY_CONFIG 0x52 791da177e4SLinus Torvalds #define SNDRV_GF1_GB_MEMORY_CONTROL 0x53 801da177e4SLinus Torvalds #define SNDRV_GF1_GW_FIFO_RECORD_BASE_ADDR 0x54 811da177e4SLinus Torvalds #define SNDRV_GF1_GW_FIFO_PLAY_BASE_ADDR 0x55 821da177e4SLinus Torvalds #define SNDRV_GF1_GW_FIFO_SIZE 0x56 831da177e4SLinus Torvalds #define SNDRV_GF1_GW_INTERLEAVE 0x57 841da177e4SLinus Torvalds #define SNDRV_GF1_GB_COMPATIBILITY 0x59 851da177e4SLinus Torvalds #define SNDRV_GF1_GB_DECODE_CONTROL 0x5a 861da177e4SLinus Torvalds #define SNDRV_GF1_GB_VERSION_NUMBER 0x5b 871da177e4SLinus Torvalds #define SNDRV_GF1_GB_MPU401_CONTROL_A 0x5c 881da177e4SLinus Torvalds #define SNDRV_GF1_GB_MPU401_CONTROL_B 0x5d 891da177e4SLinus Torvalds #define SNDRV_GF1_GB_EMULATION_IRQ 0x60 901da177e4SLinus Torvalds /* voice specific registers */ 911da177e4SLinus Torvalds #define SNDRV_GF1_VB_ADDRESS_CONTROL 0x00 921da177e4SLinus Torvalds #define SNDRV_GF1_VW_FREQUENCY 0x01 931da177e4SLinus Torvalds #define SNDRV_GF1_VW_START_HIGH 0x02 941da177e4SLinus Torvalds #define SNDRV_GF1_VW_START_LOW 0x03 951da177e4SLinus Torvalds #define SNDRV_GF1_VA_START SNDRV_GF1_VW_START_HIGH 961da177e4SLinus Torvalds #define SNDRV_GF1_VW_END_HIGH 0x04 971da177e4SLinus Torvalds #define SNDRV_GF1_VW_END_LOW 0x05 981da177e4SLinus Torvalds #define SNDRV_GF1_VA_END SNDRV_GF1_VW_END_HIGH 991da177e4SLinus Torvalds #define SNDRV_GF1_VB_VOLUME_RATE 0x06 1001da177e4SLinus Torvalds #define SNDRV_GF1_VB_VOLUME_START 0x07 1011da177e4SLinus Torvalds #define SNDRV_GF1_VB_VOLUME_END 0x08 1021da177e4SLinus Torvalds #define SNDRV_GF1_VW_VOLUME 0x09 1031da177e4SLinus Torvalds #define SNDRV_GF1_VW_CURRENT_HIGH 0x0a 1041da177e4SLinus Torvalds #define SNDRV_GF1_VW_CURRENT_LOW 0x0b 1051da177e4SLinus Torvalds #define SNDRV_GF1_VA_CURRENT SNDRV_GF1_VW_CURRENT_HIGH 1061da177e4SLinus Torvalds #define SNDRV_GF1_VB_PAN 0x0c 1071da177e4SLinus Torvalds #define SNDRV_GF1_VW_OFFSET_RIGHT 0x0c 1081da177e4SLinus Torvalds #define SNDRV_GF1_VB_VOLUME_CONTROL 0x0d 1091da177e4SLinus Torvalds #define SNDRV_GF1_VB_UPPER_ADDRESS 0x10 1101da177e4SLinus Torvalds #define SNDRV_GF1_VW_EFFECT_HIGH 0x11 1111da177e4SLinus Torvalds #define SNDRV_GF1_VW_EFFECT_LOW 0x12 1121da177e4SLinus Torvalds #define SNDRV_GF1_VA_EFFECT SNDRV_GF1_VW_EFFECT_HIGH 1131da177e4SLinus Torvalds #define SNDRV_GF1_VW_OFFSET_LEFT 0x13 1141da177e4SLinus Torvalds #define SNDRV_GF1_VB_ACCUMULATOR 0x14 1151da177e4SLinus Torvalds #define SNDRV_GF1_VB_MODE 0x15 1161da177e4SLinus Torvalds #define SNDRV_GF1_VW_EFFECT_VOLUME 0x16 1171da177e4SLinus Torvalds #define SNDRV_GF1_VB_FREQUENCY_LFO 0x17 1181da177e4SLinus Torvalds #define SNDRV_GF1_VB_VOLUME_LFO 0x18 1191da177e4SLinus Torvalds #define SNDRV_GF1_VW_OFFSET_RIGHT_FINAL 0x1b 1201da177e4SLinus Torvalds #define SNDRV_GF1_VW_OFFSET_LEFT_FINAL 0x1c 1211da177e4SLinus Torvalds #define SNDRV_GF1_VW_EFFECT_VOLUME_FINAL 0x1d 1221da177e4SLinus Torvalds 1231da177e4SLinus Torvalds /* ICS registers */ 1241da177e4SLinus Torvalds 1251da177e4SLinus Torvalds #define SNDRV_ICS_MIC_DEV 0 1261da177e4SLinus Torvalds #define SNDRV_ICS_LINE_DEV 1 1271da177e4SLinus Torvalds #define SNDRV_ICS_CD_DEV 2 1281da177e4SLinus Torvalds #define SNDRV_ICS_GF1_DEV 3 1291da177e4SLinus Torvalds #define SNDRV_ICS_NONE_DEV 4 1301da177e4SLinus Torvalds #define SNDRV_ICS_MASTER_DEV 5 1311da177e4SLinus Torvalds 1321da177e4SLinus Torvalds /* LFO */ 1331da177e4SLinus Torvalds 1341da177e4SLinus Torvalds #define SNDRV_LFO_TREMOLO 0 1351da177e4SLinus Torvalds #define SNDRV_LFO_VIBRATO 1 1361da177e4SLinus Torvalds 1371da177e4SLinus Torvalds /* misc */ 1381da177e4SLinus Torvalds 1391da177e4SLinus Torvalds #define SNDRV_GF1_DMA_UNSIGNED 0x80 1401da177e4SLinus Torvalds #define SNDRV_GF1_DMA_16BIT 0x40 1411da177e4SLinus Torvalds #define SNDRV_GF1_DMA_IRQ 0x20 1421da177e4SLinus Torvalds #define SNDRV_GF1_DMA_WIDTH16 0x04 1431da177e4SLinus Torvalds #define SNDRV_GF1_DMA_READ 0x02 /* read from GUS's DRAM */ 1441da177e4SLinus Torvalds #define SNDRV_GF1_DMA_ENABLE 0x01 1451da177e4SLinus Torvalds 1461da177e4SLinus Torvalds /* ramp ranges */ 1471da177e4SLinus Torvalds 1481da177e4SLinus Torvalds #define SNDRV_GF1_ATTEN(x) (snd_gf1_atten_table[x]) 1491da177e4SLinus Torvalds #define SNDRV_GF1_MIN_VOLUME 1800 1501da177e4SLinus Torvalds #define SNDRV_GF1_MAX_VOLUME 4095 1511da177e4SLinus Torvalds #define SNDRV_GF1_MIN_OFFSET (SNDRV_GF1_MIN_VOLUME>>4) 1521da177e4SLinus Torvalds #define SNDRV_GF1_MAX_OFFSET 255 1531da177e4SLinus Torvalds #define SNDRV_GF1_MAX_TDEPTH 90 1541da177e4SLinus Torvalds 1551da177e4SLinus Torvalds /* defines for memory manager */ 1561da177e4SLinus Torvalds 1571da177e4SLinus Torvalds #define SNDRV_GF1_MEM_BLOCK_16BIT 0x0001 1581da177e4SLinus Torvalds 1591da177e4SLinus Torvalds #define SNDRV_GF1_MEM_OWNER_DRIVER 0x0001 1601da177e4SLinus Torvalds #define SNDRV_GF1_MEM_OWNER_WAVE_SIMPLE 0x0002 1611da177e4SLinus Torvalds #define SNDRV_GF1_MEM_OWNER_WAVE_GF1 0x0003 1621da177e4SLinus Torvalds #define SNDRV_GF1_MEM_OWNER_WAVE_IWFFFF 0x0004 1631da177e4SLinus Torvalds 1641da177e4SLinus Torvalds /* constants for interrupt handlers */ 1651da177e4SLinus Torvalds 1661da177e4SLinus Torvalds #define SNDRV_GF1_HANDLER_MIDI_OUT 0x00010000 1671da177e4SLinus Torvalds #define SNDRV_GF1_HANDLER_MIDI_IN 0x00020000 1681da177e4SLinus Torvalds #define SNDRV_GF1_HANDLER_TIMER1 0x00040000 1691da177e4SLinus Torvalds #define SNDRV_GF1_HANDLER_TIMER2 0x00080000 1701da177e4SLinus Torvalds #define SNDRV_GF1_HANDLER_VOICE 0x00100000 1711da177e4SLinus Torvalds #define SNDRV_GF1_HANDLER_DMA_WRITE 0x00200000 1721da177e4SLinus Torvalds #define SNDRV_GF1_HANDLER_DMA_READ 0x00400000 1731da177e4SLinus Torvalds #define SNDRV_GF1_HANDLER_ALL (0xffff0000&~SNDRV_GF1_HANDLER_VOICE) 1741da177e4SLinus Torvalds 1751da177e4SLinus Torvalds /* constants for DMA flags */ 1761da177e4SLinus Torvalds 1771da177e4SLinus Torvalds #define SNDRV_GF1_DMA_TRIGGER 1 1781da177e4SLinus Torvalds 1791da177e4SLinus Torvalds /* --- */ 1801da177e4SLinus Torvalds 1815e2da206STakashi Iwai struct snd_gus_card; 1821da177e4SLinus Torvalds 1831da177e4SLinus Torvalds /* GF1 specific structure */ 1841da177e4SLinus Torvalds 1855e2da206STakashi Iwai struct snd_gf1_bank_info { 1861da177e4SLinus Torvalds unsigned int address; 1871da177e4SLinus Torvalds unsigned int size; 1885e2da206STakashi Iwai }; 1891da177e4SLinus Torvalds 1905e2da206STakashi Iwai struct snd_gf1_mem_block { 1911da177e4SLinus Torvalds unsigned short flags; /* flags - SNDRV_GF1_MEM_BLOCK_XXXX */ 1921da177e4SLinus Torvalds unsigned short owner; /* owner - SNDRV_GF1_MEM_OWNER_XXXX */ 1931da177e4SLinus Torvalds unsigned int share; /* share count */ 1941da177e4SLinus Torvalds unsigned int share_id[4]; /* share ID */ 1951da177e4SLinus Torvalds unsigned int ptr; 1961da177e4SLinus Torvalds unsigned int size; 1971da177e4SLinus Torvalds char *name; 1985e2da206STakashi Iwai struct snd_gf1_mem_block *next; 1995e2da206STakashi Iwai struct snd_gf1_mem_block *prev; 2005e2da206STakashi Iwai }; 2011da177e4SLinus Torvalds 2025e2da206STakashi Iwai struct snd_gf1_mem { 2035e2da206STakashi Iwai struct snd_gf1_bank_info banks_8[4]; 2045e2da206STakashi Iwai struct snd_gf1_bank_info banks_16[4]; 2055e2da206STakashi Iwai struct snd_gf1_mem_block *first; 2065e2da206STakashi Iwai struct snd_gf1_mem_block *last; 2078b7547f9SIngo Molnar struct mutex memory_mutex; 2085e2da206STakashi Iwai }; 2091da177e4SLinus Torvalds 2105e2da206STakashi Iwai struct snd_gf1_dma_block { 2111da177e4SLinus Torvalds void *buffer; /* buffer in computer's RAM */ 2121da177e4SLinus Torvalds unsigned long buf_addr; /* buffer address */ 2131da177e4SLinus Torvalds unsigned int addr; /* address in onboard memory */ 2141da177e4SLinus Torvalds unsigned int count; /* count in bytes */ 2151da177e4SLinus Torvalds unsigned int cmd; /* DMA command (format) */ 2165e2da206STakashi Iwai void (*ack)(struct snd_gus_card * gus, void *private_data); 2171da177e4SLinus Torvalds void *private_data; 2181da177e4SLinus Torvalds struct snd_gf1_dma_block *next; 2195e2da206STakashi Iwai }; 2201da177e4SLinus Torvalds 2215e2da206STakashi Iwai struct snd_gus_port { 2225e2da206STakashi Iwai struct snd_midi_channel_set * chset; 2235e2da206STakashi Iwai struct snd_gus_card * gus; 2241da177e4SLinus Torvalds int mode; /* operation mode */ 2251da177e4SLinus Torvalds int client; /* sequencer client number */ 2261da177e4SLinus Torvalds int port; /* sequencer port number */ 2271da177e4SLinus Torvalds unsigned int midi_has_voices: 1; 2285e2da206STakashi Iwai }; 2291da177e4SLinus Torvalds 2305e2da206STakashi Iwai struct snd_gus_voice; 2311da177e4SLinus Torvalds 2321da177e4SLinus Torvalds #define SNDRV_GF1_VOICE_TYPE_PCM 0 2331da177e4SLinus Torvalds #define SNDRV_GF1_VOICE_TYPE_SYNTH 1 2341da177e4SLinus Torvalds #define SNDRV_GF1_VOICE_TYPE_MIDI 2 2351da177e4SLinus Torvalds 2361da177e4SLinus Torvalds #define SNDRV_GF1_VFLG_RUNNING (1<<0) 2371da177e4SLinus Torvalds #define SNDRV_GF1_VFLG_EFFECT_TIMER1 (1<<1) 2381da177e4SLinus Torvalds #define SNDRV_GF1_VFLG_PAN (1<<2) 2391da177e4SLinus Torvalds 2405e2da206STakashi Iwai enum snd_gus_volume_state { 2411da177e4SLinus Torvalds VENV_BEFORE, 2421da177e4SLinus Torvalds VENV_ATTACK, 2431da177e4SLinus Torvalds VENV_SUSTAIN, 2441da177e4SLinus Torvalds VENV_RELEASE, 2451da177e4SLinus Torvalds VENV_DONE, 2461da177e4SLinus Torvalds VENV_VOLUME 2475e2da206STakashi Iwai }; 2481da177e4SLinus Torvalds 2495e2da206STakashi Iwai struct snd_gus_voice { 2501da177e4SLinus Torvalds int number; 2511da177e4SLinus Torvalds unsigned int use: 1, 2521da177e4SLinus Torvalds pcm: 1, 2531da177e4SLinus Torvalds synth:1, 2541da177e4SLinus Torvalds midi: 1; 2551da177e4SLinus Torvalds unsigned int flags; 2561da177e4SLinus Torvalds unsigned char client; 2571da177e4SLinus Torvalds unsigned char port; 2581da177e4SLinus Torvalds unsigned char index; 2591da177e4SLinus Torvalds unsigned char pad; 2601da177e4SLinus Torvalds 2611da177e4SLinus Torvalds #ifdef CONFIG_SND_DEBUG 2621da177e4SLinus Torvalds unsigned int interrupt_stat_wave; 2631da177e4SLinus Torvalds unsigned int interrupt_stat_volume; 2641da177e4SLinus Torvalds #endif 2655e2da206STakashi Iwai void (*handler_wave) (struct snd_gus_card * gus, struct snd_gus_voice * voice); 2665e2da206STakashi Iwai void (*handler_volume) (struct snd_gus_card * gus, struct snd_gus_voice * voice); 2675e2da206STakashi Iwai void (*handler_effect) (struct snd_gus_card * gus, struct snd_gus_voice * voice); 2685e2da206STakashi Iwai void (*volume_change) (struct snd_gus_card * gus); 2691da177e4SLinus Torvalds 2705e2da206STakashi Iwai struct snd_gus_sample_ops *sample_ops; 2711da177e4SLinus Torvalds 2721da177e4SLinus Torvalds /* running status / registers */ 2731da177e4SLinus Torvalds 2741da177e4SLinus Torvalds unsigned short fc_register; 2751da177e4SLinus Torvalds unsigned short fc_lfo; 2761da177e4SLinus Torvalds unsigned short gf1_volume; 2771da177e4SLinus Torvalds unsigned char control; 2781da177e4SLinus Torvalds unsigned char mode; 2791da177e4SLinus Torvalds unsigned char gf1_pan; 2801da177e4SLinus Torvalds unsigned char effect_accumulator; 2811da177e4SLinus Torvalds unsigned char volume_control; 2821da177e4SLinus Torvalds unsigned char venv_value_next; 2835e2da206STakashi Iwai enum snd_gus_volume_state venv_state; 2845e2da206STakashi Iwai enum snd_gus_volume_state venv_state_prev; 2851da177e4SLinus Torvalds unsigned short vlo; 2861da177e4SLinus Torvalds unsigned short vro; 2871da177e4SLinus Torvalds unsigned short gf1_effect_volume; 2881da177e4SLinus Torvalds 2891da177e4SLinus Torvalds /* --- */ 2901da177e4SLinus Torvalds 2911da177e4SLinus Torvalds void *private_data; 2925e2da206STakashi Iwai void (*private_free)(struct snd_gus_voice *voice); 2931da177e4SLinus Torvalds }; 2941da177e4SLinus Torvalds 2955e2da206STakashi Iwai struct snd_gf1 { 2961da177e4SLinus Torvalds 2971da177e4SLinus Torvalds unsigned int enh_mode:1, /* enhanced mode (GFA1) */ 2981da177e4SLinus Torvalds hw_lfo:1, /* use hardware LFO */ 2991da177e4SLinus Torvalds sw_lfo:1, /* use software LFO */ 3001da177e4SLinus Torvalds effect:1; /* use effect voices */ 3011da177e4SLinus Torvalds 3021da177e4SLinus Torvalds unsigned long port; /* port of GF1 chip */ 3031da177e4SLinus Torvalds struct resource *res_port1; 3041da177e4SLinus Torvalds struct resource *res_port2; 3051da177e4SLinus Torvalds int irq; /* IRQ number */ 3061da177e4SLinus Torvalds int dma1; /* DMA1 number */ 3071da177e4SLinus Torvalds int dma2; /* DMA2 number */ 3081da177e4SLinus Torvalds unsigned int memory; /* GUS's DRAM size in bytes */ 3091da177e4SLinus Torvalds unsigned int rom_memory; /* GUS's ROM size in bytes */ 3101da177e4SLinus Torvalds unsigned int rom_present; /* bitmask */ 3111da177e4SLinus Torvalds unsigned int rom_banks; /* GUS's ROM banks */ 3121da177e4SLinus Torvalds 3135e2da206STakashi Iwai struct snd_gf1_mem mem_alloc; 3141da177e4SLinus Torvalds 3151da177e4SLinus Torvalds /* registers */ 3161da177e4SLinus Torvalds unsigned short reg_page; 3171da177e4SLinus Torvalds unsigned short reg_regsel; 3181da177e4SLinus Torvalds unsigned short reg_data8; 3191da177e4SLinus Torvalds unsigned short reg_data16; 3201da177e4SLinus Torvalds unsigned short reg_irqstat; 3211da177e4SLinus Torvalds unsigned short reg_dram; 3221da177e4SLinus Torvalds unsigned short reg_timerctrl; 3231da177e4SLinus Torvalds unsigned short reg_timerdata; 3241da177e4SLinus Torvalds unsigned char ics_regs[6][2]; 3251da177e4SLinus Torvalds /* --------- */ 3261da177e4SLinus Torvalds 3271da177e4SLinus Torvalds unsigned char active_voices; /* active voices */ 3281da177e4SLinus Torvalds unsigned char active_voice; /* selected voice (GF1PAGE register) */ 3291da177e4SLinus Torvalds 3305e2da206STakashi Iwai struct snd_gus_voice voices[32]; /* GF1 voices */ 3311da177e4SLinus Torvalds 3321da177e4SLinus Torvalds unsigned int default_voice_address; 3331da177e4SLinus Torvalds 3341da177e4SLinus Torvalds unsigned short playback_freq; /* GF1 playback (mixing) frequency */ 3351da177e4SLinus Torvalds unsigned short mode; /* see to SNDRV_GF1_MODE_XXXX */ 3361da177e4SLinus Torvalds unsigned char volume_ramp; 3371da177e4SLinus Torvalds unsigned char smooth_pan; 3381da177e4SLinus Torvalds unsigned char full_range_pan; 3391da177e4SLinus Torvalds unsigned char pad0; 3401da177e4SLinus Torvalds 3411da177e4SLinus Torvalds unsigned char *lfos; 3421da177e4SLinus Torvalds 3431da177e4SLinus Torvalds /* interrupt handlers */ 3441da177e4SLinus Torvalds 3455e2da206STakashi Iwai void (*interrupt_handler_midi_out) (struct snd_gus_card * gus); 3465e2da206STakashi Iwai void (*interrupt_handler_midi_in) (struct snd_gus_card * gus); 3475e2da206STakashi Iwai void (*interrupt_handler_timer1) (struct snd_gus_card * gus); 3485e2da206STakashi Iwai void (*interrupt_handler_timer2) (struct snd_gus_card * gus); 3495e2da206STakashi Iwai void (*interrupt_handler_dma_write) (struct snd_gus_card * gus); 3505e2da206STakashi Iwai void (*interrupt_handler_dma_read) (struct snd_gus_card * gus); 3511da177e4SLinus Torvalds 3521da177e4SLinus Torvalds #ifdef CONFIG_SND_DEBUG 3531da177e4SLinus Torvalds unsigned int interrupt_stat_midi_out; 3541da177e4SLinus Torvalds unsigned int interrupt_stat_midi_in; 3551da177e4SLinus Torvalds unsigned int interrupt_stat_timer1; 3561da177e4SLinus Torvalds unsigned int interrupt_stat_timer2; 3571da177e4SLinus Torvalds unsigned int interrupt_stat_dma_write; 3581da177e4SLinus Torvalds unsigned int interrupt_stat_dma_read; 3591da177e4SLinus Torvalds unsigned int interrupt_stat_voice_lost; 3601da177e4SLinus Torvalds #endif 3611da177e4SLinus Torvalds 3621da177e4SLinus Torvalds /* synthesizer */ 3631da177e4SLinus Torvalds 3641da177e4SLinus Torvalds int seq_client; 3655e2da206STakashi Iwai struct snd_gus_port seq_ports[4]; 3661da177e4SLinus Torvalds 3671da177e4SLinus Torvalds /* timer */ 3681da177e4SLinus Torvalds 3691da177e4SLinus Torvalds unsigned short timer_enabled; 3705e2da206STakashi Iwai struct snd_timer *timer1; 3715e2da206STakashi Iwai struct snd_timer *timer2; 3721da177e4SLinus Torvalds 3731da177e4SLinus Torvalds /* midi */ 3741da177e4SLinus Torvalds 3751da177e4SLinus Torvalds unsigned short uart_cmd; 3761da177e4SLinus Torvalds unsigned int uart_framing; 3771da177e4SLinus Torvalds unsigned int uart_overrun; 3781da177e4SLinus Torvalds 3791da177e4SLinus Torvalds /* dma operations */ 3801da177e4SLinus Torvalds 3811da177e4SLinus Torvalds unsigned int dma_flags; 3821da177e4SLinus Torvalds unsigned int dma_shared; 3835e2da206STakashi Iwai struct snd_gf1_dma_block *dma_data_pcm; 3845e2da206STakashi Iwai struct snd_gf1_dma_block *dma_data_pcm_last; 3855e2da206STakashi Iwai struct snd_gf1_dma_block *dma_data_synth; 3865e2da206STakashi Iwai struct snd_gf1_dma_block *dma_data_synth_last; 3875e2da206STakashi Iwai void (*dma_ack)(struct snd_gus_card * gus, void *private_data); 3881da177e4SLinus Torvalds void *dma_private_data; 3891da177e4SLinus Torvalds 3901da177e4SLinus Torvalds /* pcm */ 3911da177e4SLinus Torvalds int pcm_channels; 3921da177e4SLinus Torvalds int pcm_alloc_voices; 3931da177e4SLinus Torvalds unsigned short pcm_volume_level_left; 3941da177e4SLinus Torvalds unsigned short pcm_volume_level_right; 3951da177e4SLinus Torvalds unsigned short pcm_volume_level_left1; 3961da177e4SLinus Torvalds unsigned short pcm_volume_level_right1; 3971da177e4SLinus Torvalds 3981da177e4SLinus Torvalds unsigned char pcm_rcntrl_reg; 3991da177e4SLinus Torvalds unsigned char pad_end; 4001da177e4SLinus Torvalds }; 4011da177e4SLinus Torvalds 4021da177e4SLinus Torvalds /* main structure for GUS card */ 4031da177e4SLinus Torvalds 4045e2da206STakashi Iwai struct snd_gus_card { 4055e2da206STakashi Iwai struct snd_card *card; 4061da177e4SLinus Torvalds 4071da177e4SLinus Torvalds unsigned int 4081da177e4SLinus Torvalds initialized: 1, /* resources were initialized */ 4091da177e4SLinus Torvalds equal_irq:1, /* GF1 and CODEC shares IRQ (GUS MAX only) */ 4101da177e4SLinus Torvalds equal_dma:1, /* if dma channels are equal (not valid for daughter board) */ 4111da177e4SLinus Torvalds ics_flag:1, /* have we ICS mixer chip */ 4121da177e4SLinus Torvalds ics_flipped:1, /* ICS mixer have flipped some channels? */ 4131da177e4SLinus Torvalds codec_flag:1, /* have we CODEC chip? */ 4141da177e4SLinus Torvalds max_flag:1, /* have we GUS MAX card? */ 4151da177e4SLinus Torvalds max_ctrl_flag:1, /* have we original GUS MAX card? */ 4161da177e4SLinus Torvalds daughter_flag:1, /* have we daughter board? */ 4171da177e4SLinus Torvalds interwave:1, /* hey - we have InterWave card */ 4181da177e4SLinus Torvalds ess_flag:1, /* ESS chip found... GUS Extreme */ 4191da177e4SLinus Torvalds ace_flag:1, /* GUS ACE detected */ 4201da177e4SLinus Torvalds uart_enable:1; /* enable MIDI UART */ 4211da177e4SLinus Torvalds unsigned short revision; /* revision of chip */ 4221da177e4SLinus Torvalds unsigned short max_cntrl_val; /* GUS MAX control value */ 4231da177e4SLinus Torvalds unsigned short mix_cntrl_reg; /* mixer control register */ 4241da177e4SLinus Torvalds unsigned short joystick_dac; /* joystick DAC level */ 4251da177e4SLinus Torvalds int timer_dev; /* timer device */ 4261da177e4SLinus Torvalds 4275e2da206STakashi Iwai struct snd_gf1 gf1; /* gf1 specific variables */ 4285e2da206STakashi Iwai struct snd_pcm *pcm; 4295e2da206STakashi Iwai struct snd_pcm_substream *pcm_cap_substream; 4301da177e4SLinus Torvalds unsigned int c_dma_size; 4311da177e4SLinus Torvalds unsigned int c_period_size; 4321da177e4SLinus Torvalds unsigned int c_pos; 4331da177e4SLinus Torvalds 4345e2da206STakashi Iwai struct snd_rawmidi *midi_uart; 4355e2da206STakashi Iwai struct snd_rawmidi_substream *midi_substream_output; 4365e2da206STakashi Iwai struct snd_rawmidi_substream *midi_substream_input; 4371da177e4SLinus Torvalds 4381da177e4SLinus Torvalds spinlock_t reg_lock; 4391da177e4SLinus Torvalds spinlock_t voice_alloc; 4401da177e4SLinus Torvalds spinlock_t active_voice_lock; 4411da177e4SLinus Torvalds spinlock_t event_lock; 4421da177e4SLinus Torvalds spinlock_t dma_lock; 4431da177e4SLinus Torvalds spinlock_t pcm_volume_level_lock; 4441da177e4SLinus Torvalds spinlock_t uart_cmd_lock; 4458b7547f9SIngo Molnar struct mutex dma_mutex; 4468b7547f9SIngo Molnar struct mutex register_mutex; 4471da177e4SLinus Torvalds }; 4481da177e4SLinus Torvalds 4491da177e4SLinus Torvalds /* I/O functions for GF1/InterWave chip - gus_io.c */ 4501da177e4SLinus Torvalds 4515e2da206STakashi Iwai static inline void snd_gf1_select_voice(struct snd_gus_card * gus, int voice) 4521da177e4SLinus Torvalds { 4531da177e4SLinus Torvalds unsigned long flags; 4541da177e4SLinus Torvalds 4551da177e4SLinus Torvalds spin_lock_irqsave(&gus->active_voice_lock, flags); 4561da177e4SLinus Torvalds if (voice != gus->gf1.active_voice) { 4571da177e4SLinus Torvalds gus->gf1.active_voice = voice; 4581da177e4SLinus Torvalds outb(voice, GUSP(gus, GF1PAGE)); 4591da177e4SLinus Torvalds } 4601da177e4SLinus Torvalds spin_unlock_irqrestore(&gus->active_voice_lock, flags); 4611da177e4SLinus Torvalds } 4621da177e4SLinus Torvalds 4635e2da206STakashi Iwai static inline void snd_gf1_uart_cmd(struct snd_gus_card * gus, unsigned char b) 4641da177e4SLinus Torvalds { 4651da177e4SLinus Torvalds outb(gus->gf1.uart_cmd = b, GUSP(gus, MIDICTRL)); 4661da177e4SLinus Torvalds } 4671da177e4SLinus Torvalds 4685e2da206STakashi Iwai static inline unsigned char snd_gf1_uart_stat(struct snd_gus_card * gus) 4691da177e4SLinus Torvalds { 4701da177e4SLinus Torvalds return inb(GUSP(gus, MIDISTAT)); 4711da177e4SLinus Torvalds } 4721da177e4SLinus Torvalds 4735e2da206STakashi Iwai static inline void snd_gf1_uart_put(struct snd_gus_card * gus, unsigned char b) 4741da177e4SLinus Torvalds { 4751da177e4SLinus Torvalds outb(b, GUSP(gus, MIDIDATA)); 4761da177e4SLinus Torvalds } 4771da177e4SLinus Torvalds 4785e2da206STakashi Iwai static inline unsigned char snd_gf1_uart_get(struct snd_gus_card * gus) 4791da177e4SLinus Torvalds { 4801da177e4SLinus Torvalds return inb(GUSP(gus, MIDIDATA)); 4811da177e4SLinus Torvalds } 4821da177e4SLinus Torvalds 4835e2da206STakashi Iwai extern void snd_gf1_delay(struct snd_gus_card * gus); 4841da177e4SLinus Torvalds 4855e2da206STakashi Iwai extern void snd_gf1_ctrl_stop(struct snd_gus_card * gus, unsigned char reg); 4861da177e4SLinus Torvalds 4875e2da206STakashi Iwai extern void snd_gf1_write8(struct snd_gus_card * gus, unsigned char reg, unsigned char data); 4885e2da206STakashi Iwai extern unsigned char snd_gf1_look8(struct snd_gus_card * gus, unsigned char reg); 4895e2da206STakashi Iwai static inline unsigned char snd_gf1_read8(struct snd_gus_card * gus, unsigned char reg) 4901da177e4SLinus Torvalds { 4911da177e4SLinus Torvalds return snd_gf1_look8(gus, reg | 0x80); 4921da177e4SLinus Torvalds } 4935e2da206STakashi Iwai extern void snd_gf1_write16(struct snd_gus_card * gus, unsigned char reg, unsigned int data); 4945e2da206STakashi Iwai extern unsigned short snd_gf1_look16(struct snd_gus_card * gus, unsigned char reg); 4955e2da206STakashi Iwai static inline unsigned short snd_gf1_read16(struct snd_gus_card * gus, unsigned char reg) 4961da177e4SLinus Torvalds { 4971da177e4SLinus Torvalds return snd_gf1_look16(gus, reg | 0x80); 4981da177e4SLinus Torvalds } 4995e2da206STakashi Iwai extern void snd_gf1_adlib_write(struct snd_gus_card * gus, unsigned char reg, unsigned char data); 5005e2da206STakashi Iwai extern void snd_gf1_dram_addr(struct snd_gus_card * gus, unsigned int addr); 5015e2da206STakashi Iwai extern void snd_gf1_poke(struct snd_gus_card * gus, unsigned int addr, unsigned char data); 5025e2da206STakashi Iwai extern unsigned char snd_gf1_peek(struct snd_gus_card * gus, unsigned int addr); 5035e2da206STakashi Iwai extern void snd_gf1_write_addr(struct snd_gus_card * gus, unsigned char reg, unsigned int addr, short w_16bit); 5045e2da206STakashi Iwai extern unsigned int snd_gf1_read_addr(struct snd_gus_card * gus, unsigned char reg, short w_16bit); 5055e2da206STakashi Iwai extern void snd_gf1_i_ctrl_stop(struct snd_gus_card * gus, unsigned char reg); 5065e2da206STakashi Iwai extern void snd_gf1_i_write8(struct snd_gus_card * gus, unsigned char reg, unsigned char data); 5075e2da206STakashi Iwai extern unsigned char snd_gf1_i_look8(struct snd_gus_card * gus, unsigned char reg); 5085e2da206STakashi Iwai extern void snd_gf1_i_write16(struct snd_gus_card * gus, unsigned char reg, unsigned int data); 5095e2da206STakashi Iwai static inline unsigned char snd_gf1_i_read8(struct snd_gus_card * gus, unsigned char reg) 5101da177e4SLinus Torvalds { 5111da177e4SLinus Torvalds return snd_gf1_i_look8(gus, reg | 0x80); 5121da177e4SLinus Torvalds } 5135e2da206STakashi Iwai extern unsigned short snd_gf1_i_look16(struct snd_gus_card * gus, unsigned char reg); 5145e2da206STakashi Iwai static inline unsigned short snd_gf1_i_read16(struct snd_gus_card * gus, unsigned char reg) 5151da177e4SLinus Torvalds { 5161da177e4SLinus Torvalds return snd_gf1_i_look16(gus, reg | 0x80); 5171da177e4SLinus Torvalds } 5181da177e4SLinus Torvalds 5195e2da206STakashi Iwai extern void snd_gf1_select_active_voices(struct snd_gus_card * gus); 5201da177e4SLinus Torvalds 5211da177e4SLinus Torvalds /* gus_lfo.c */ 5221da177e4SLinus Torvalds 5231da177e4SLinus Torvalds struct _SND_IW_LFO_PROGRAM { 5241da177e4SLinus Torvalds unsigned short freq_and_control; 5251da177e4SLinus Torvalds unsigned char depth_final; 5261da177e4SLinus Torvalds unsigned char depth_inc; 5271da177e4SLinus Torvalds unsigned short twave; 5281da177e4SLinus Torvalds unsigned short depth; 5291da177e4SLinus Torvalds }; 5301da177e4SLinus Torvalds 5311da177e4SLinus Torvalds #if 0 5325e2da206STakashi Iwai extern irqreturn_t snd_gf1_lfo_effect_interrupt(struct snd_gus_card * gus, snd_gf1_voice_t * voice); 5331da177e4SLinus Torvalds #endif 5345e2da206STakashi Iwai extern void snd_gf1_lfo_init(struct snd_gus_card * gus); 5355e2da206STakashi Iwai extern void snd_gf1_lfo_done(struct snd_gus_card * gus); 5365e2da206STakashi Iwai extern void snd_gf1_lfo_program(struct snd_gus_card * gus, int voice, int lfo_type, struct _SND_IW_LFO_PROGRAM *program); 5375e2da206STakashi Iwai extern void snd_gf1_lfo_enable(struct snd_gus_card * gus, int voice, int lfo_type); 5385e2da206STakashi Iwai extern void snd_gf1_lfo_disable(struct snd_gus_card * gus, int voice, int lfo_type); 5395e2da206STakashi Iwai extern void snd_gf1_lfo_change_freq(struct snd_gus_card * gus, int voice, int lfo_type, int freq); 5405e2da206STakashi Iwai extern void snd_gf1_lfo_change_depth(struct snd_gus_card * gus, int voice, int lfo_type, int depth); 5415e2da206STakashi Iwai extern void snd_gf1_lfo_setup(struct snd_gus_card * gus, int voice, int lfo_type, int freq, int current_depth, int depth, int sweep, int shape); 5425e2da206STakashi Iwai extern void snd_gf1_lfo_shutdown(struct snd_gus_card * gus, int voice, int lfo_type); 5431da177e4SLinus Torvalds #if 0 5445e2da206STakashi Iwai extern void snd_gf1_lfo_command(struct snd_gus_card * gus, int voice, unsigned char *command); 5451da177e4SLinus Torvalds #endif 5461da177e4SLinus Torvalds 5471da177e4SLinus Torvalds /* gus_mem.c */ 5481da177e4SLinus Torvalds 5495e2da206STakashi Iwai void snd_gf1_mem_lock(struct snd_gf1_mem * alloc, int xup); 5505e2da206STakashi Iwai int snd_gf1_mem_xfree(struct snd_gf1_mem * alloc, struct snd_gf1_mem_block * block); 5515e2da206STakashi Iwai struct snd_gf1_mem_block *snd_gf1_mem_alloc(struct snd_gf1_mem * alloc, int owner, 5521da177e4SLinus Torvalds char *name, int size, int w_16, 5531da177e4SLinus Torvalds int align, unsigned int *share_id); 5545e2da206STakashi Iwai int snd_gf1_mem_free(struct snd_gf1_mem * alloc, unsigned int address); 5555e2da206STakashi Iwai int snd_gf1_mem_free_owner(struct snd_gf1_mem * alloc, int owner); 5565e2da206STakashi Iwai int snd_gf1_mem_init(struct snd_gus_card * gus); 5575e2da206STakashi Iwai int snd_gf1_mem_done(struct snd_gus_card * gus); 5581da177e4SLinus Torvalds 5591da177e4SLinus Torvalds /* gus_mem_proc.c */ 5601da177e4SLinus Torvalds 5615e2da206STakashi Iwai int snd_gf1_mem_proc_init(struct snd_gus_card * gus); 5621da177e4SLinus Torvalds 5631da177e4SLinus Torvalds /* gus_dma.c */ 5641da177e4SLinus Torvalds 5655e2da206STakashi Iwai int snd_gf1_dma_init(struct snd_gus_card * gus); 5665e2da206STakashi Iwai int snd_gf1_dma_done(struct snd_gus_card * gus); 5675e2da206STakashi Iwai int snd_gf1_dma_transfer_block(struct snd_gus_card * gus, 5685e2da206STakashi Iwai struct snd_gf1_dma_block * block, 5691da177e4SLinus Torvalds int atomic, 5701da177e4SLinus Torvalds int synth); 5711da177e4SLinus Torvalds 5721da177e4SLinus Torvalds /* gus_volume.c */ 5731da177e4SLinus Torvalds 5741da177e4SLinus Torvalds unsigned short snd_gf1_lvol_to_gvol_raw(unsigned int vol); 5755e2da206STakashi Iwai unsigned short snd_gf1_translate_freq(struct snd_gus_card * gus, unsigned int freq2); 5761da177e4SLinus Torvalds 5771da177e4SLinus Torvalds /* gus_reset.c */ 5781da177e4SLinus Torvalds 5795e2da206STakashi Iwai void snd_gf1_set_default_handlers(struct snd_gus_card * gus, unsigned int what); 5805e2da206STakashi Iwai void snd_gf1_smart_stop_voice(struct snd_gus_card * gus, unsigned short voice); 5815e2da206STakashi Iwai void snd_gf1_stop_voice(struct snd_gus_card * gus, unsigned short voice); 5825e2da206STakashi Iwai void snd_gf1_stop_voices(struct snd_gus_card * gus, unsigned short v_min, unsigned short v_max); 5835e2da206STakashi Iwai struct snd_gus_voice *snd_gf1_alloc_voice(struct snd_gus_card * gus, int type, int client, int port); 5845e2da206STakashi Iwai void snd_gf1_free_voice(struct snd_gus_card * gus, struct snd_gus_voice *voice); 5855e2da206STakashi Iwai int snd_gf1_start(struct snd_gus_card * gus); 5865e2da206STakashi Iwai int snd_gf1_stop(struct snd_gus_card * gus); 5871da177e4SLinus Torvalds 5881da177e4SLinus Torvalds /* gus_mixer.c */ 5891da177e4SLinus Torvalds 5905e2da206STakashi Iwai int snd_gf1_new_mixer(struct snd_gus_card * gus); 5911da177e4SLinus Torvalds 5921da177e4SLinus Torvalds /* gus_pcm.c */ 5931da177e4SLinus Torvalds 594db5abb3cSLars-Peter Clausen int snd_gf1_pcm_new(struct snd_gus_card *gus, int pcm_dev, int control_index); 5951da177e4SLinus Torvalds 5961da177e4SLinus Torvalds #ifdef CONFIG_SND_DEBUG 5975e2da206STakashi Iwai extern void snd_gf1_print_voice_registers(struct snd_gus_card * gus); 5981da177e4SLinus Torvalds #endif 5991da177e4SLinus Torvalds 6001da177e4SLinus Torvalds /* gus.c */ 6011da177e4SLinus Torvalds 6025e2da206STakashi Iwai int snd_gus_use_inc(struct snd_gus_card * gus); 6035e2da206STakashi Iwai void snd_gus_use_dec(struct snd_gus_card * gus); 6045e2da206STakashi Iwai int snd_gus_create(struct snd_card *card, 6051da177e4SLinus Torvalds unsigned long port, 6061da177e4SLinus Torvalds int irq, int dma1, int dma2, 6071da177e4SLinus Torvalds int timer_dev, 6081da177e4SLinus Torvalds int voices, 6091da177e4SLinus Torvalds int pcm_channels, 6101da177e4SLinus Torvalds int effect, 6115e2da206STakashi Iwai struct snd_gus_card ** rgus); 6125e2da206STakashi Iwai int snd_gus_initialize(struct snd_gus_card * gus); 6131da177e4SLinus Torvalds 6141da177e4SLinus Torvalds /* gus_irq.c */ 6151da177e4SLinus Torvalds 6167d12e780SDavid Howells irqreturn_t snd_gus_interrupt(int irq, void *dev_id); 6171da177e4SLinus Torvalds #ifdef CONFIG_SND_DEBUG 6185e2da206STakashi Iwai void snd_gus_irq_profile_init(struct snd_gus_card *gus); 6191da177e4SLinus Torvalds #endif 6201da177e4SLinus Torvalds 6211da177e4SLinus Torvalds /* gus_uart.c */ 6221da177e4SLinus Torvalds 623db5abb3cSLars-Peter Clausen int snd_gf1_rawmidi_new(struct snd_gus_card *gus, int device); 6241da177e4SLinus Torvalds 6251da177e4SLinus Torvalds /* gus_dram.c */ 6265e2da206STakashi Iwai int snd_gus_dram_write(struct snd_gus_card *gus, char __user *ptr, 6271da177e4SLinus Torvalds unsigned int addr, unsigned int size); 6285e2da206STakashi Iwai int snd_gus_dram_read(struct snd_gus_card *gus, char __user *ptr, 6291da177e4SLinus Torvalds unsigned int addr, unsigned int size, int rom); 6301da177e4SLinus Torvalds 6311da177e4SLinus Torvalds #endif /* __SOUND_GUS_H */ 632