home *** CD-ROM | disk | FTP | other *** search
/ PC Welt 2006 November (DVD) / PCWELT_11_2006.ISO / casper / filesystem.squashfs / usr / src / linux-headers-2.6.17-6 / include / sound / gus.h < prev    next >
Encoding:
C/C++ Source or Header  |  2006-08-11  |  23.0 KB  |  695 lines

  1. #ifndef __SOUND_GUS_H
  2. #define __SOUND_GUS_H
  3.  
  4. /*
  5.  *  Global structures used for GUS part of ALSA driver
  6.  *  Copyright (c) by Jaroslav Kysela <perex@suse.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 "pcm.h"
  26. #include "rawmidi.h"
  27. #include "timer.h"
  28. #include "seq_midi_emul.h"
  29. #include "seq_device.h"
  30. #include "ainstr_iw.h"
  31. #include "ainstr_gf1.h"
  32. #include "ainstr_simple.h"
  33. #include <asm/io.h>
  34.  
  35. #define SNDRV_SEQ_DEV_ID_GUS            "gus-synth"
  36.  
  37. /* IO ports */
  38.  
  39. #define GUSP(gus, x)            ((gus)->gf1.port + SNDRV_g_u_s_##x)
  40.  
  41. #define SNDRV_g_u_s_MIDICTRL        (0x320-0x220)
  42. #define SNDRV_g_u_s_MIDISTAT        (0x320-0x220)
  43. #define SNDRV_g_u_s_MIDIDATA        (0x321-0x220)
  44.  
  45. #define SNDRV_g_u_s_GF1PAGE        (0x322-0x220)
  46. #define SNDRV_g_u_s_GF1REGSEL        (0x323-0x220)
  47. #define SNDRV_g_u_s_GF1DATALOW        (0x324-0x220)
  48. #define SNDRV_g_u_s_GF1DATAHIGH        (0x325-0x220)
  49. #define SNDRV_g_u_s_IRQSTAT        (0x226-0x220)
  50. #define SNDRV_g_u_s_TIMERCNTRL        (0x228-0x220)
  51. #define SNDRV_g_u_s_TIMERDATA        (0x229-0x220)
  52. #define SNDRV_g_u_s_DRAM        (0x327-0x220)
  53. #define SNDRV_g_u_s_MIXCNTRLREG        (0x220-0x220)
  54. #define SNDRV_g_u_s_IRQDMACNTRLREG    (0x22b-0x220)
  55. #define SNDRV_g_u_s_REGCNTRLS        (0x22f-0x220)
  56. #define SNDRV_g_u_s_BOARDVERSION    (0x726-0x220)
  57. #define SNDRV_g_u_s_MIXCNTRLPORT    (0x726-0x220)
  58. #define SNDRV_g_u_s_IVER        (0x325-0x220)
  59. #define SNDRV_g_u_s_MIXDATAPORT        (0x326-0x220)
  60. #define SNDRV_g_u_s_MAXCNTRLPORT    (0x326-0x220)
  61.  
  62. /* GF1 registers */
  63.  
  64. /* global registers */
  65. #define SNDRV_GF1_GB_ACTIVE_VOICES        0x0e
  66. #define SNDRV_GF1_GB_VOICES_IRQ            0x0f
  67. #define SNDRV_GF1_GB_GLOBAL_MODE        0x19
  68. #define SNDRV_GF1_GW_LFO_BASE            0x1a
  69. #define SNDRV_GF1_GB_VOICES_IRQ_READ        0x1f
  70. #define SNDRV_GF1_GB_DRAM_DMA_CONTROL        0x41
  71. #define SNDRV_GF1_GW_DRAM_DMA_LOW        0x42
  72. #define SNDRV_GF1_GW_DRAM_IO_LOW        0x43
  73. #define SNDRV_GF1_GB_DRAM_IO_HIGH        0x44
  74. #define SNDRV_GF1_GB_SOUND_BLASTER_CONTROL    0x45
  75. #define SNDRV_GF1_GB_ADLIB_TIMER_1        0x46
  76. #define SNDRV_GF1_GB_ADLIB_TIMER_2        0x47
  77. #define SNDRV_GF1_GB_RECORD_RATE        0x48
  78. #define SNDRV_GF1_GB_REC_DMA_CONTROL        0x49
  79. #define SNDRV_GF1_GB_JOYSTICK_DAC_LEVEL        0x4b
  80. #define SNDRV_GF1_GB_RESET            0x4c
  81. #define SNDRV_GF1_GB_DRAM_DMA_HIGH        0x50
  82. #define SNDRV_GF1_GW_DRAM_IO16            0x51
  83. #define SNDRV_GF1_GW_MEMORY_CONFIG        0x52
  84. #define SNDRV_GF1_GB_MEMORY_CONTROL        0x53
  85. #define SNDRV_GF1_GW_FIFO_RECORD_BASE_ADDR    0x54
  86. #define SNDRV_GF1_GW_FIFO_PLAY_BASE_ADDR    0x55
  87. #define SNDRV_GF1_GW_FIFO_SIZE            0x56
  88. #define SNDRV_GF1_GW_INTERLEAVE            0x57
  89. #define SNDRV_GF1_GB_COMPATIBILITY        0x59
  90. #define SNDRV_GF1_GB_DECODE_CONTROL        0x5a
  91. #define SNDRV_GF1_GB_VERSION_NUMBER        0x5b
  92. #define SNDRV_GF1_GB_MPU401_CONTROL_A        0x5c
  93. #define SNDRV_GF1_GB_MPU401_CONTROL_B        0x5d
  94. #define SNDRV_GF1_GB_EMULATION_IRQ        0x60
  95. /* voice specific registers */
  96. #define SNDRV_GF1_VB_ADDRESS_CONTROL        0x00
  97. #define SNDRV_GF1_VW_FREQUENCY            0x01
  98. #define SNDRV_GF1_VW_START_HIGH            0x02
  99. #define SNDRV_GF1_VW_START_LOW            0x03
  100. #define SNDRV_GF1_VA_START            SNDRV_GF1_VW_START_HIGH
  101. #define SNDRV_GF1_VW_END_HIGH            0x04
  102. #define SNDRV_GF1_VW_END_LOW            0x05
  103. #define SNDRV_GF1_VA_END            SNDRV_GF1_VW_END_HIGH
  104. #define SNDRV_GF1_VB_VOLUME_RATE        0x06
  105. #define SNDRV_GF1_VB_VOLUME_START        0x07
  106. #define SNDRV_GF1_VB_VOLUME_END            0x08
  107. #define SNDRV_GF1_VW_VOLUME            0x09
  108. #define SNDRV_GF1_VW_CURRENT_HIGH        0x0a
  109. #define SNDRV_GF1_VW_CURRENT_LOW        0x0b
  110. #define SNDRV_GF1_VA_CURRENT            SNDRV_GF1_VW_CURRENT_HIGH
  111. #define SNDRV_GF1_VB_PAN            0x0c
  112. #define SNDRV_GF1_VW_OFFSET_RIGHT        0x0c
  113. #define SNDRV_GF1_VB_VOLUME_CONTROL        0x0d
  114. #define SNDRV_GF1_VB_UPPER_ADDRESS        0x10
  115. #define SNDRV_GF1_VW_EFFECT_HIGH        0x11
  116. #define SNDRV_GF1_VW_EFFECT_LOW            0x12
  117. #define SNDRV_GF1_VA_EFFECT            SNDRV_GF1_VW_EFFECT_HIGH
  118. #define SNDRV_GF1_VW_OFFSET_LEFT        0x13
  119. #define SNDRV_GF1_VB_ACCUMULATOR        0x14
  120. #define SNDRV_GF1_VB_MODE            0x15
  121. #define SNDRV_GF1_VW_EFFECT_VOLUME        0x16
  122. #define SNDRV_GF1_VB_FREQUENCY_LFO        0x17
  123. #define SNDRV_GF1_VB_VOLUME_LFO            0x18
  124. #define SNDRV_GF1_VW_OFFSET_RIGHT_FINAL        0x1b
  125. #define SNDRV_GF1_VW_OFFSET_LEFT_FINAL        0x1c
  126. #define SNDRV_GF1_VW_EFFECT_VOLUME_FINAL    0x1d
  127.  
  128. /* ICS registers */
  129.  
  130. #define SNDRV_ICS_MIC_DEV        0
  131. #define SNDRV_ICS_LINE_DEV        1
  132. #define SNDRV_ICS_CD_DEV        2
  133. #define SNDRV_ICS_GF1_DEV        3
  134. #define SNDRV_ICS_NONE_DEV        4
  135. #define SNDRV_ICS_MASTER_DEV        5
  136.  
  137. /* LFO */
  138.  
  139. #define SNDRV_LFO_TREMOLO        0
  140. #define SNDRV_LFO_VIBRATO        1
  141.  
  142. /* misc */
  143.  
  144. #define SNDRV_GF1_DMA_UNSIGNED    0x80
  145. #define SNDRV_GF1_DMA_16BIT    0x40
  146. #define SNDRV_GF1_DMA_IRQ    0x20
  147. #define SNDRV_GF1_DMA_WIDTH16    0x04
  148. #define SNDRV_GF1_DMA_READ    0x02    /* read from GUS's DRAM */
  149. #define SNDRV_GF1_DMA_ENABLE    0x01
  150.  
  151. /* ramp ranges */
  152.  
  153. #define SNDRV_GF1_ATTEN(x)    (snd_gf1_atten_table[x])
  154. #define SNDRV_GF1_MIN_VOLUME    1800
  155. #define SNDRV_GF1_MAX_VOLUME    4095
  156. #define SNDRV_GF1_MIN_OFFSET    (SNDRV_GF1_MIN_VOLUME>>4)
  157. #define SNDRV_GF1_MAX_OFFSET    255
  158. #define SNDRV_GF1_MAX_TDEPTH    90
  159.  
  160. /* defines for memory manager */
  161.  
  162. #define SNDRV_GF1_MEM_BLOCK_16BIT    0x0001
  163.  
  164. #define SNDRV_GF1_MEM_OWNER_DRIVER    0x0001
  165. #define SNDRV_GF1_MEM_OWNER_WAVE_SIMPLE    0x0002
  166. #define SNDRV_GF1_MEM_OWNER_WAVE_GF1    0x0003
  167. #define SNDRV_GF1_MEM_OWNER_WAVE_IWFFFF    0x0004
  168.  
  169. /* constants for interrupt handlers */
  170.  
  171. #define SNDRV_GF1_HANDLER_MIDI_OUT    0x00010000
  172. #define SNDRV_GF1_HANDLER_MIDI_IN    0x00020000
  173. #define SNDRV_GF1_HANDLER_TIMER1    0x00040000
  174. #define SNDRV_GF1_HANDLER_TIMER2    0x00080000
  175. #define SNDRV_GF1_HANDLER_VOICE        0x00100000
  176. #define SNDRV_GF1_HANDLER_DMA_WRITE    0x00200000
  177. #define SNDRV_GF1_HANDLER_DMA_READ    0x00400000
  178. #define SNDRV_GF1_HANDLER_ALL        (0xffff0000&~SNDRV_GF1_HANDLER_VOICE)
  179.  
  180. /* constants for DMA flags */
  181.  
  182. #define SNDRV_GF1_DMA_TRIGGER        1
  183.  
  184. /* --- */
  185.  
  186. struct snd_gus_card;
  187.  
  188. /* GF1 specific structure */
  189.  
  190. struct snd_gf1_bank_info {
  191.     unsigned int address;
  192.     unsigned int size;
  193. };
  194.  
  195. struct snd_gf1_mem_block {
  196.     unsigned short flags;    /* flags - SNDRV_GF1_MEM_BLOCK_XXXX */
  197.     unsigned short owner;    /* owner - SNDRV_GF1_MEM_OWNER_XXXX */
  198.     unsigned int share;    /* share count */
  199.     unsigned int share_id[4]; /* share ID */
  200.     unsigned int ptr;
  201.     unsigned int size;
  202.     char *name;
  203.     struct snd_gf1_mem_block *next;
  204.     struct snd_gf1_mem_block *prev;
  205. };
  206.  
  207. struct snd_gf1_mem {
  208.     struct snd_gf1_bank_info banks_8[4];
  209.     struct snd_gf1_bank_info banks_16[4];
  210.     struct snd_gf1_mem_block *first;
  211.     struct snd_gf1_mem_block *last;
  212.     struct mutex memory_mutex;
  213. };
  214.  
  215. struct snd_gf1_dma_block {
  216.     void *buffer;        /* buffer in computer's RAM */
  217.     unsigned long buf_addr;    /* buffer address */
  218.     unsigned int addr;    /* address in onboard memory */
  219.     unsigned int count;    /* count in bytes */
  220.     unsigned int cmd;    /* DMA command (format) */
  221.     void (*ack)(struct snd_gus_card * gus, void *private_data);
  222.     void *private_data;
  223.     struct snd_gf1_dma_block *next;
  224. };
  225.  
  226. struct snd_gus_port {
  227.     struct snd_midi_channel_set * chset;
  228.     struct snd_gus_card * gus;
  229.     int mode;        /* operation mode */
  230.     int client;        /* sequencer client number */
  231.     int port;        /* sequencer port number */
  232.     unsigned int midi_has_voices: 1;
  233. };
  234.  
  235. struct snd_gus_voice;
  236.  
  237. struct snd_gus_sample_ops {
  238.     void (*sample_start)(struct snd_gus_card *gus, struct snd_gus_voice *voice, snd_seq_position_t position);
  239.     void (*sample_stop)(struct snd_gus_card *gus, struct snd_gus_voice *voice, int mode);
  240.     void (*sample_freq)(struct snd_gus_card *gus, struct snd_gus_voice *voice, snd_seq_frequency_t freq);
  241.     void (*sample_volume)(struct snd_gus_card *gus, struct snd_gus_voice *voice, struct snd_seq_ev_volume *volume);
  242.     void (*sample_loop)(struct snd_gus_card *card, struct snd_gus_voice *voice, struct snd_seq_ev_loop *loop);
  243.     void (*sample_pos)(struct snd_gus_card *card, struct snd_gus_voice *voice, snd_seq_position_t position);
  244.     void (*sample_private1)(struct snd_gus_card *card, struct snd_gus_voice *voice, unsigned char *data);
  245. };
  246.  
  247. #define SNDRV_GF1_VOICE_TYPE_PCM    0
  248. #define SNDRV_GF1_VOICE_TYPE_SYNTH     1
  249. #define SNDRV_GF1_VOICE_TYPE_MIDI    2
  250.  
  251. #define SNDRV_GF1_VFLG_RUNNING        (1<<0)
  252. #define SNDRV_GF1_VFLG_EFFECT_TIMER1    (1<<1)
  253. #define SNDRV_GF1_VFLG_PAN        (1<<2)
  254.  
  255. enum snd_gus_volume_state {
  256.     VENV_BEFORE,
  257.     VENV_ATTACK,
  258.     VENV_SUSTAIN,
  259.     VENV_RELEASE,
  260.     VENV_DONE,
  261.     VENV_VOLUME
  262. };
  263.  
  264. struct snd_gus_voice {
  265.     int number;
  266.     unsigned int use: 1,
  267.         pcm: 1,
  268.         synth:1,
  269.         midi: 1;
  270.     unsigned int flags;
  271.     unsigned char client;
  272.     unsigned char port;
  273.     unsigned char index;
  274.     unsigned char pad;
  275.     
  276. #ifdef CONFIG_SND_DEBUG
  277.     unsigned int interrupt_stat_wave;
  278.     unsigned int interrupt_stat_volume;
  279. #endif
  280.     void (*handler_wave) (struct snd_gus_card * gus, struct snd_gus_voice * voice);
  281.     void (*handler_volume) (struct snd_gus_card * gus, struct snd_gus_voice * voice);
  282.     void (*handler_effect) (struct snd_gus_card * gus, struct snd_gus_voice * voice);
  283.     void (*volume_change) (struct snd_gus_card * gus);
  284.  
  285.     struct snd_gus_sample_ops *sample_ops;
  286.  
  287.     struct snd_seq_instr instr;
  288.  
  289.     /* running status / registers */
  290.  
  291.     struct snd_seq_ev_volume sample_volume;
  292.  
  293.     unsigned short fc_register;
  294.     unsigned short fc_lfo;
  295.     unsigned short gf1_volume;
  296.     unsigned char control;
  297.     unsigned char mode;
  298.     unsigned char gf1_pan;
  299.     unsigned char effect_accumulator;
  300.     unsigned char volume_control;
  301.     unsigned char venv_value_next;
  302.     enum snd_gus_volume_state venv_state;
  303.     enum snd_gus_volume_state venv_state_prev;
  304.     unsigned short vlo;
  305.     unsigned short vro;
  306.     unsigned short gf1_effect_volume;
  307.     
  308.     /* --- */
  309.  
  310.     void *private_data;
  311.     void (*private_free)(struct snd_gus_voice *voice);
  312. };
  313.  
  314. struct snd_gf1 {
  315.  
  316.     unsigned int enh_mode:1,    /* enhanced mode (GFA1) */
  317.              hw_lfo:1,        /* use hardware LFO */
  318.              sw_lfo:1,        /* use software LFO */
  319.              effect:1;        /* use effect voices */
  320.  
  321.     unsigned long port;        /* port of GF1 chip */
  322.     struct resource *res_port1;
  323.     struct resource *res_port2;
  324.     int irq;            /* IRQ number */
  325.     int dma1;            /* DMA1 number */
  326.     int dma2;            /* DMA2 number */
  327.     unsigned int memory;        /* GUS's DRAM size in bytes */
  328.     unsigned int rom_memory;    /* GUS's ROM size in bytes */
  329.     unsigned int rom_present;    /* bitmask */
  330.     unsigned int rom_banks;        /* GUS's ROM banks */
  331.  
  332.     struct snd_gf1_mem mem_alloc;
  333.  
  334.     /* registers */
  335.     unsigned short reg_page;
  336.     unsigned short reg_regsel;
  337.     unsigned short reg_data8;
  338.     unsigned short reg_data16;
  339.     unsigned short reg_irqstat;
  340.     unsigned short reg_dram;
  341.     unsigned short reg_timerctrl;
  342.     unsigned short reg_timerdata;
  343.     unsigned char ics_regs[6][2];
  344.     /* --------- */
  345.  
  346.     unsigned char active_voices;    /* active voices */
  347.     unsigned char active_voice;    /* selected voice (GF1PAGE register) */
  348.  
  349.     struct snd_gus_voice voices[32];    /* GF1 voices */
  350.  
  351.     unsigned int default_voice_address;
  352.  
  353.     unsigned short playback_freq;    /* GF1 playback (mixing) frequency */
  354.     unsigned short mode;        /* see to SNDRV_GF1_MODE_XXXX */
  355.     unsigned char volume_ramp;
  356.     unsigned char smooth_pan;
  357.     unsigned char full_range_pan;
  358.     unsigned char pad0;
  359.  
  360.     unsigned char *lfos;
  361.  
  362.     /* interrupt handlers */
  363.  
  364.     void (*interrupt_handler_midi_out) (struct snd_gus_card * gus);
  365.     void (*interrupt_handler_midi_in) (struct snd_gus_card * gus);
  366.     void (*interrupt_handler_timer1) (struct snd_gus_card * gus);
  367.     void (*interrupt_handler_timer2) (struct snd_gus_card * gus);
  368.     void (*interrupt_handler_dma_write) (struct snd_gus_card * gus);
  369.     void (*interrupt_handler_dma_read) (struct snd_gus_card * gus);
  370.  
  371. #ifdef CONFIG_SND_DEBUG
  372.     unsigned int interrupt_stat_midi_out;
  373.     unsigned int interrupt_stat_midi_in;
  374.     unsigned int interrupt_stat_timer1;
  375.     unsigned int interrupt_stat_timer2;
  376.     unsigned int interrupt_stat_dma_write;
  377.     unsigned int interrupt_stat_dma_read;
  378.     unsigned int interrupt_stat_voice_lost;
  379. #endif
  380.  
  381.     /* synthesizer */
  382.  
  383.     int seq_client;
  384.     struct snd_gus_port seq_ports[4];
  385.     struct snd_seq_kinstr_list *ilist;
  386.     struct snd_iwffff_ops iwffff_ops;
  387.     struct snd_gf1_ops gf1_ops;
  388.     struct snd_simple_ops simple_ops;
  389.  
  390.     /* timer */
  391.  
  392.     unsigned short timer_enabled;
  393.     struct snd_timer *timer1;
  394.     struct snd_timer *timer2;
  395.  
  396.     /* midi */
  397.  
  398.     unsigned short uart_cmd;
  399.     unsigned int uart_framing;
  400.     unsigned int uart_overrun;
  401.  
  402.     /* dma operations */
  403.  
  404.     unsigned int dma_flags;
  405.     unsigned int dma_shared;
  406.     struct snd_gf1_dma_block *dma_data_pcm;
  407.     struct snd_gf1_dma_block *dma_data_pcm_last;
  408.     struct snd_gf1_dma_block *dma_data_synth;
  409.     struct snd_gf1_dma_block *dma_data_synth_last;
  410.     void (*dma_ack)(struct snd_gus_card * gus, void *private_data);
  411.     void *dma_private_data;
  412.  
  413.     /* pcm */
  414.     int pcm_channels;
  415.     int pcm_alloc_voices;
  416.         unsigned short pcm_volume_level_left;
  417.     unsigned short pcm_volume_level_right;
  418.     unsigned short pcm_volume_level_left1;
  419.     unsigned short pcm_volume_level_right1;
  420.                                 
  421.     unsigned char pcm_rcntrl_reg;
  422.     unsigned char pad_end;
  423. };
  424.  
  425. /* main structure for GUS card */
  426.  
  427. struct snd_gus_card {
  428.     struct snd_card *card;
  429.  
  430.     unsigned int
  431.      initialized: 1,        /* resources were initialized */
  432.      equal_irq:1,            /* GF1 and CODEC shares IRQ (GUS MAX only) */
  433.      equal_dma:1,            /* if dma channels are equal (not valid for daughter board) */
  434.      ics_flag:1,            /* have we ICS mixer chip */
  435.      ics_flipped:1,            /* ICS mixer have flipped some channels? */
  436.      codec_flag:1,            /* have we CODEC chip? */
  437.      max_flag:1,            /* have we GUS MAX card? */
  438.      max_ctrl_flag:1,        /* have we original GUS MAX card? */
  439.      daughter_flag:1,        /* have we daughter board? */
  440.      interwave:1,            /* hey - we have InterWave card */
  441.      ess_flag:1,            /* ESS chip found... GUS Extreme */
  442.      ace_flag:1,            /* GUS ACE detected */
  443.      uart_enable:1;            /* enable MIDI UART */
  444.     unsigned short revision;    /* revision of chip */
  445.     unsigned short max_cntrl_val;    /* GUS MAX control value */
  446.     unsigned short mix_cntrl_reg;    /* mixer control register */
  447.     unsigned short joystick_dac;    /* joystick DAC level */
  448.     int timer_dev;            /* timer device */
  449.  
  450.     struct snd_gf1 gf1;    /* gf1 specific variables */
  451.     struct snd_pcm *pcm;
  452.     struct snd_pcm_substream *pcm_cap_substream;
  453.     unsigned int c_dma_size;
  454.     unsigned int c_period_size;
  455.     unsigned int c_pos;
  456.  
  457.     struct snd_rawmidi *midi_uart;
  458.     struct snd_rawmidi_substream *midi_substream_output;
  459.     struct snd_rawmidi_substream *midi_substream_input;
  460.  
  461.     struct snd_seq_device *seq_dev;
  462.  
  463.     spinlock_t reg_lock;
  464.     spinlock_t voice_alloc;
  465.     spinlock_t active_voice_lock;
  466.     spinlock_t event_lock;
  467.     spinlock_t dma_lock;
  468.     spinlock_t pcm_volume_level_lock;
  469.     spinlock_t uart_cmd_lock;
  470.     struct mutex dma_mutex;
  471.     struct mutex register_mutex;
  472. };
  473.  
  474. /* I/O functions for GF1/InterWave chip - gus_io.c */
  475.  
  476. static inline void snd_gf1_select_voice(struct snd_gus_card * gus, int voice)
  477. {
  478.     unsigned long flags;
  479.  
  480.     spin_lock_irqsave(&gus->active_voice_lock, flags);
  481.     if (voice != gus->gf1.active_voice) {
  482.         gus->gf1.active_voice = voice;
  483.         outb(voice, GUSP(gus, GF1PAGE));
  484.     }
  485.     spin_unlock_irqrestore(&gus->active_voice_lock, flags);
  486. }
  487.  
  488. static inline void snd_gf1_uart_cmd(struct snd_gus_card * gus, unsigned char b)
  489. {
  490.     outb(gus->gf1.uart_cmd = b, GUSP(gus, MIDICTRL));
  491. }
  492.  
  493. static inline unsigned char snd_gf1_uart_stat(struct snd_gus_card * gus)
  494. {
  495.     return inb(GUSP(gus, MIDISTAT));
  496. }
  497.  
  498. static inline void snd_gf1_uart_put(struct snd_gus_card * gus, unsigned char b)
  499. {
  500.     outb(b, GUSP(gus, MIDIDATA));
  501. }
  502.  
  503. static inline unsigned char snd_gf1_uart_get(struct snd_gus_card * gus)
  504. {
  505.     return inb(GUSP(gus, MIDIDATA));
  506. }
  507.  
  508. extern void snd_gf1_delay(struct snd_gus_card * gus);
  509.  
  510. extern void snd_gf1_ctrl_stop(struct snd_gus_card * gus, unsigned char reg);
  511.  
  512. extern void snd_gf1_write8(struct snd_gus_card * gus, unsigned char reg, unsigned char data);
  513. extern unsigned char snd_gf1_look8(struct snd_gus_card * gus, unsigned char reg);
  514. static inline unsigned char snd_gf1_read8(struct snd_gus_card * gus, unsigned char reg)
  515. {
  516.     return snd_gf1_look8(gus, reg | 0x80);
  517. }
  518. extern void snd_gf1_write16(struct snd_gus_card * gus, unsigned char reg, unsigned int data);
  519. extern unsigned short snd_gf1_look16(struct snd_gus_card * gus, unsigned char reg);
  520. static inline unsigned short snd_gf1_read16(struct snd_gus_card * gus, unsigned char reg)
  521. {
  522.     return snd_gf1_look16(gus, reg | 0x80);
  523. }
  524. extern void snd_gf1_adlib_write(struct snd_gus_card * gus, unsigned char reg, unsigned char data);
  525. extern void snd_gf1_dram_addr(struct snd_gus_card * gus, unsigned int addr);
  526. extern void snd_gf1_poke(struct snd_gus_card * gus, unsigned int addr, unsigned char data);
  527. extern unsigned char snd_gf1_peek(struct snd_gus_card * gus, unsigned int addr);
  528. extern void snd_gf1_write_addr(struct snd_gus_card * gus, unsigned char reg, unsigned int addr, short w_16bit);
  529. extern unsigned int snd_gf1_read_addr(struct snd_gus_card * gus, unsigned char reg, short w_16bit);
  530. extern void snd_gf1_i_ctrl_stop(struct snd_gus_card * gus, unsigned char reg);
  531. extern void snd_gf1_i_write8(struct snd_gus_card * gus, unsigned char reg, unsigned char data);
  532. extern unsigned char snd_gf1_i_look8(struct snd_gus_card * gus, unsigned char reg);
  533. extern void snd_gf1_i_write16(struct snd_gus_card * gus, unsigned char reg, unsigned int data);
  534. static inline unsigned char snd_gf1_i_read8(struct snd_gus_card * gus, unsigned char reg)
  535. {
  536.     return snd_gf1_i_look8(gus, reg | 0x80);
  537. }
  538. extern unsigned short snd_gf1_i_look16(struct snd_gus_card * gus, unsigned char reg);
  539. static inline unsigned short snd_gf1_i_read16(struct snd_gus_card * gus, unsigned char reg)
  540. {
  541.     return snd_gf1_i_look16(gus, reg | 0x80);
  542. }
  543.  
  544. extern void snd_gf1_select_active_voices(struct snd_gus_card * gus);
  545.  
  546. /* gus_lfo.c */
  547.  
  548. struct _SND_IW_LFO_PROGRAM {
  549.     unsigned short freq_and_control;
  550.     unsigned char depth_final;
  551.     unsigned char depth_inc;
  552.     unsigned short twave;
  553.     unsigned short depth;
  554. };
  555.  
  556. #if 0
  557. extern irqreturn_t snd_gf1_lfo_effect_interrupt(struct snd_gus_card * gus, snd_gf1_voice_t * voice);
  558. #endif
  559. extern void snd_gf1_lfo_init(struct snd_gus_card * gus);
  560. extern void snd_gf1_lfo_done(struct snd_gus_card * gus);
  561. extern void snd_gf1_lfo_program(struct snd_gus_card * gus, int voice, int lfo_type, struct _SND_IW_LFO_PROGRAM *program);
  562. extern void snd_gf1_lfo_enable(struct snd_gus_card * gus, int voice, int lfo_type);
  563. extern void snd_gf1_lfo_disable(struct snd_gus_card * gus, int voice, int lfo_type);
  564. extern void snd_gf1_lfo_change_freq(struct snd_gus_card * gus, int voice, int lfo_type, int freq);
  565. extern void snd_gf1_lfo_change_depth(struct snd_gus_card * gus, int voice, int lfo_type, int depth);
  566. 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);
  567. extern void snd_gf1_lfo_shutdown(struct snd_gus_card * gus, int voice, int lfo_type);
  568. #if 0
  569. extern void snd_gf1_lfo_command(struct snd_gus_card * gus, int voice, unsigned char *command);
  570. #endif
  571.  
  572. /* gus_mem.c */
  573.  
  574. void snd_gf1_mem_lock(struct snd_gf1_mem * alloc, int xup);
  575. int snd_gf1_mem_xfree(struct snd_gf1_mem * alloc, struct snd_gf1_mem_block * block);
  576. struct snd_gf1_mem_block *snd_gf1_mem_alloc(struct snd_gf1_mem * alloc, int owner,
  577.                        char *name, int size, int w_16,
  578.                        int align, unsigned int *share_id);
  579. int snd_gf1_mem_free(struct snd_gf1_mem * alloc, unsigned int address);
  580. int snd_gf1_mem_free_owner(struct snd_gf1_mem * alloc, int owner);
  581. int snd_gf1_mem_init(struct snd_gus_card * gus);
  582. int snd_gf1_mem_done(struct snd_gus_card * gus);
  583.  
  584. /* gus_mem_proc.c */
  585.  
  586. int snd_gf1_mem_proc_init(struct snd_gus_card * gus);
  587.  
  588. /* gus_dma.c */
  589.  
  590. int snd_gf1_dma_init(struct snd_gus_card * gus);
  591. int snd_gf1_dma_done(struct snd_gus_card * gus);
  592. int snd_gf1_dma_transfer_block(struct snd_gus_card * gus,
  593.                    struct snd_gf1_dma_block * block,
  594.                    int atomic,
  595.                    int synth);
  596.  
  597. /* gus_volume.c */
  598.  
  599. unsigned short snd_gf1_lvol_to_gvol_raw(unsigned int vol);
  600. unsigned short snd_gf1_translate_freq(struct snd_gus_card * gus, unsigned int freq2);
  601.  
  602. /* gus_reset.c */
  603.  
  604. void snd_gf1_set_default_handlers(struct snd_gus_card * gus, unsigned int what);
  605. void snd_gf1_smart_stop_voice(struct snd_gus_card * gus, unsigned short voice);
  606. void snd_gf1_stop_voice(struct snd_gus_card * gus, unsigned short voice);
  607. void snd_gf1_stop_voices(struct snd_gus_card * gus, unsigned short v_min, unsigned short v_max);
  608. struct snd_gus_voice *snd_gf1_alloc_voice(struct snd_gus_card * gus, int type, int client, int port);
  609. void snd_gf1_free_voice(struct snd_gus_card * gus, struct snd_gus_voice *voice);
  610. int snd_gf1_start(struct snd_gus_card * gus);
  611. int snd_gf1_stop(struct snd_gus_card * gus);
  612.  
  613. /* gus_mixer.c */
  614.  
  615. int snd_gf1_new_mixer(struct snd_gus_card * gus);
  616.  
  617. /* gus_pcm.c */
  618.  
  619. int snd_gf1_pcm_new(struct snd_gus_card * gus, int pcm_dev, int control_index, struct snd_pcm ** rpcm);
  620.  
  621. #ifdef CONFIG_SND_DEBUG
  622. extern void snd_gf1_print_voice_registers(struct snd_gus_card * gus);
  623. #endif
  624.  
  625. /* gus.c */
  626.  
  627. int snd_gus_use_inc(struct snd_gus_card * gus);
  628. void snd_gus_use_dec(struct snd_gus_card * gus);
  629. int snd_gus_create(struct snd_card *card,
  630.            unsigned long port,
  631.            int irq, int dma1, int dma2,
  632.            int timer_dev,
  633.            int voices,
  634.            int pcm_channels,
  635.            int effect,
  636.            struct snd_gus_card ** rgus);
  637. int snd_gus_initialize(struct snd_gus_card * gus);
  638.  
  639. /* gus_irq.c */
  640.  
  641. irqreturn_t snd_gus_interrupt(int irq, void *dev_id, struct pt_regs *regs);
  642. #ifdef CONFIG_SND_DEBUG
  643. void snd_gus_irq_profile_init(struct snd_gus_card *gus);
  644. #endif
  645.  
  646. /* gus_uart.c */
  647.  
  648. int snd_gf1_rawmidi_new(struct snd_gus_card * gus, int device, struct snd_rawmidi **rrawmidi);
  649.  
  650. #if 0
  651. extern void snd_engine_instrument_register(unsigned short mode,
  652.         struct _SND_INSTRUMENT_VOICE_COMMANDS *voice_cmds,
  653.         struct _SND_INSTRUMENT_NOTE_COMMANDS *note_cmds,
  654.               struct _SND_INSTRUMENT_CHANNEL_COMMANDS *channel_cmds);
  655. extern int snd_engine_instrument_register_ask(unsigned short mode);
  656. #endif
  657.  
  658. /* gus_dram.c */
  659. int snd_gus_dram_write(struct snd_gus_card *gus, char __user *ptr,
  660.                unsigned int addr, unsigned int size);
  661. int snd_gus_dram_read(struct snd_gus_card *gus, char __user *ptr,
  662.               unsigned int addr, unsigned int size, int rom);
  663.  
  664. #if defined(CONFIG_SND_SEQUENCER) || defined(CONFIG_SND_SEQUENCER_MODULE)
  665.  
  666. /* gus_sample.c */
  667. void snd_gus_sample_event(struct snd_seq_event *ev, struct snd_gus_port *p);
  668.  
  669. /* gus_simple.c */
  670. void snd_gf1_simple_init(struct snd_gus_voice *voice);
  671.  
  672. /* gus_instr.c */
  673. int snd_gus_iwffff_put_sample(void *private_data, struct iwffff_wave *wave,
  674.                   char __user *data, long len, int atomic);
  675. int snd_gus_iwffff_get_sample(void *private_data, struct iwffff_wave *wave,
  676.                   char __user *data, long len, int atomic);
  677. int snd_gus_iwffff_remove_sample(void *private_data, struct iwffff_wave *wave,
  678.                  int atomic);
  679. int snd_gus_gf1_put_sample(void *private_data, struct gf1_wave *wave,
  680.                char __user *data, long len, int atomic);
  681. int snd_gus_gf1_get_sample(void *private_data, struct gf1_wave *wave,
  682.                char __user *data, long len, int atomic);
  683. int snd_gus_gf1_remove_sample(void *private_data, struct gf1_wave *wave,
  684.                   int atomic);
  685. int snd_gus_simple_put_sample(void *private_data, struct simple_instrument *instr,
  686.                   char __user *data, long len, int atomic);
  687. int snd_gus_simple_get_sample(void *private_data, struct simple_instrument *instr,
  688.                   char __user *data, long len, int atomic);
  689. int snd_gus_simple_remove_sample(void *private_data, struct simple_instrument *instr,
  690.                  int atomic);
  691.  
  692. #endif /* CONFIG_SND_SEQUENCER */
  693.  
  694. #endif /* __SOUND_GUS_H */
  695.