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 / sb.h < prev    next >
Encoding:
C/C++ Source or Header  |  2006-08-11  |  10.7 KB  |  367 lines

  1. #ifndef __SOUND_SB_H
  2. #define __SOUND_SB_H
  3.  
  4. /*
  5.  *  Header file for SoundBlaster cards
  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 <linux/interrupt.h>
  28. #include <asm/io.h>
  29.  
  30. enum sb_hw_type {
  31.     SB_HW_AUTO,
  32.     SB_HW_10,
  33.     SB_HW_20,
  34.     SB_HW_201,
  35.     SB_HW_PRO,
  36.     SB_HW_16,
  37.     SB_HW_16CSP,        /* SB16 with CSP chip */
  38.     SB_HW_ALS100,        /* Avance Logic ALS100 chip */
  39.     SB_HW_ALS4000,        /* Avance Logic ALS4000 chip */
  40.     SB_HW_DT019X,        /* Diamond Tech. DT-019X / Avance Logic ALS-007 */
  41. };
  42.  
  43. #define SB_OPEN_PCM            0x01
  44. #define SB_OPEN_MIDI_INPUT        0x02
  45. #define SB_OPEN_MIDI_OUTPUT        0x04
  46. #define SB_OPEN_MIDI_INPUT_TRIGGER    0x08
  47. #define SB_OPEN_MIDI_OUTPUT_TRIGGER    0x10
  48.  
  49. #define SB_MODE_HALT        0x00
  50. #define SB_MODE_PLAYBACK_8    0x01
  51. #define SB_MODE_PLAYBACK_16    0x02
  52. #define SB_MODE_PLAYBACK    (SB_MODE_PLAYBACK_8 | SB_MODE_PLAYBACK_16)
  53. #define SB_MODE_CAPTURE_8    0x04
  54. #define SB_MODE_CAPTURE_16    0x08
  55. #define SB_MODE_CAPTURE        (SB_MODE_CAPTURE_8 | SB_MODE_CAPTURE_16)
  56.  
  57. #define SB_RATE_LOCK_PLAYBACK    0x10
  58. #define SB_RATE_LOCK_CAPTURE    0x20
  59. #define SB_RATE_LOCK        (SB_RATE_LOCK_PLAYBACK | SB_RATE_LOCK_CAPTURE)
  60.  
  61. #define SB_MPU_INPUT        1
  62.  
  63. struct snd_sb {
  64.     unsigned long port;        /* base port of DSP chip */
  65.     struct resource *res_port;
  66.     unsigned long mpu_port;        /* MPU port for SB DSP 4.0+ */
  67.     int irq;            /* IRQ number of DSP chip */
  68.     int dma8;            /* 8-bit DMA */
  69.     int dma16;            /* 16-bit DMA */
  70.     unsigned short version;        /* version of DSP chip */
  71.     enum sb_hw_type hardware;    /* see to SB_HW_XXXX */
  72.  
  73.     unsigned long alt_port;        /* alternate port (ALS4000) */
  74.     struct pci_dev *pci;        /* ALS4000 */
  75.  
  76.     unsigned int open;        /* see to SB_OPEN_XXXX for sb8 */
  77.                     /* also SNDRV_SB_CSP_MODE_XXX for sb16_csp */
  78.     unsigned int mode;        /* current mode of stream */
  79.     unsigned int force_mode16;    /* force 16-bit mode of streams */
  80.     unsigned int locked_rate;    /* sb16 duplex */
  81.     unsigned int playback_format;
  82.     unsigned int capture_format;
  83.     struct timer_list midi_timer;
  84.     unsigned int p_dma_size;
  85.     unsigned int p_period_size;
  86.     unsigned int c_dma_size;
  87.     unsigned int c_period_size;
  88.  
  89.     spinlock_t mixer_lock;
  90.  
  91.     char name[32];
  92.  
  93.     void *csp; /* used only when CONFIG_SND_SB16_CSP is set */
  94.  
  95.     struct snd_card *card;
  96.     struct snd_pcm *pcm;
  97.     struct snd_pcm_substream *playback_substream;
  98.     struct snd_pcm_substream *capture_substream;
  99.  
  100.     struct snd_rawmidi *rmidi;
  101.     struct snd_rawmidi_substream *midi_substream_input;
  102.     struct snd_rawmidi_substream *midi_substream_output;
  103.     irqreturn_t (*rmidi_callback)(int irq, void *dev_id, struct pt_regs *regs);
  104.  
  105.     spinlock_t reg_lock;
  106.     spinlock_t open_lock;
  107.     spinlock_t midi_input_lock;
  108.  
  109.     struct snd_info_entry *proc_entry;
  110.  
  111. #ifdef CONFIG_PM
  112.     unsigned char saved_regs[0x20];
  113. #endif
  114. };
  115.  
  116. /* I/O ports */
  117.  
  118. #define SBP(chip, x)        ((chip)->port + s_b_SB_##x)
  119. #define SBP1(port, x)        ((port) + s_b_SB_##x)
  120.  
  121. #define s_b_SB_RESET        0x6
  122. #define s_b_SB_READ        0xa
  123. #define s_b_SB_WRITE        0xc
  124. #define s_b_SB_COMMAND        0xc
  125. #define s_b_SB_STATUS        0xc
  126. #define s_b_SB_DATA_AVAIL    0xe
  127. #define s_b_SB_DATA_AVAIL_16     0xf
  128. #define s_b_SB_MIXER_ADDR    0x4
  129. #define s_b_SB_MIXER_DATA    0x5
  130. #define s_b_SB_OPL3_LEFT    0x0
  131. #define s_b_SB_OPL3_RIGHT    0x2
  132. #define s_b_SB_OPL3_BOTH    0x8
  133.  
  134. #define SB_DSP_OUTPUT        0x14
  135. #define SB_DSP_INPUT        0x24
  136. #define SB_DSP_BLOCK_SIZE    0x48
  137. #define SB_DSP_HI_OUTPUT    0x91
  138. #define SB_DSP_HI_INPUT        0x99
  139. #define SB_DSP_LO_OUTPUT_AUTO    0x1c
  140. #define SB_DSP_LO_INPUT_AUTO    0x2c
  141. #define SB_DSP_HI_OUTPUT_AUTO    0x90
  142. #define SB_DSP_HI_INPUT_AUTO    0x98
  143. #define SB_DSP_IMMED_INT    0xf2
  144. #define SB_DSP_GET_VERSION    0xe1
  145. #define SB_DSP_SPEAKER_ON    0xd1
  146. #define SB_DSP_SPEAKER_OFF    0xd3
  147. #define SB_DSP_DMA8_OFF        0xd0
  148. #define SB_DSP_DMA8_ON        0xd4
  149. #define SB_DSP_DMA8_EXIT    0xda
  150. #define SB_DSP_DMA16_OFF    0xd5
  151. #define SB_DSP_DMA16_ON        0xd6
  152. #define SB_DSP_DMA16_EXIT    0xd9
  153. #define SB_DSP_SAMPLE_RATE    0x40
  154. #define SB_DSP_SAMPLE_RATE_OUT    0x41
  155. #define SB_DSP_SAMPLE_RATE_IN    0x42
  156. #define SB_DSP_MONO_8BIT    0xa0
  157. #define SB_DSP_MONO_16BIT    0xa4
  158. #define SB_DSP_STEREO_8BIT    0xa8
  159. #define SB_DSP_STEREO_16BIT    0xac
  160.  
  161. #define SB_DSP_MIDI_INPUT_IRQ    0x31
  162. #define SB_DSP_MIDI_UART_IRQ    0x35
  163. #define SB_DSP_MIDI_OUTPUT    0x38
  164.  
  165. #define SB_DSP4_OUT8_AI        0xc6
  166. #define SB_DSP4_IN8_AI        0xce
  167. #define SB_DSP4_OUT16_AI    0xb6
  168. #define SB_DSP4_IN16_AI        0xbe
  169. #define SB_DSP4_MODE_UNS_MONO    0x00
  170. #define SB_DSP4_MODE_SIGN_MONO    0x10
  171. #define SB_DSP4_MODE_UNS_STEREO    0x20
  172. #define SB_DSP4_MODE_SIGN_STEREO 0x30
  173.  
  174. #define SB_DSP4_OUTPUT        0x3c
  175. #define SB_DSP4_INPUT_LEFT    0x3d
  176. #define SB_DSP4_INPUT_RIGHT    0x3e
  177.  
  178. /* registers for SB 2.0 mixer */
  179. #define SB_DSP20_MASTER_DEV    0x02
  180. #define SB_DSP20_PCM_DEV    0x0A
  181. #define SB_DSP20_CD_DEV        0x08
  182. #define SB_DSP20_FM_DEV        0x06
  183.  
  184. /* registers for SB PRO mixer */
  185. #define SB_DSP_MASTER_DEV    0x22
  186. #define SB_DSP_PCM_DEV        0x04
  187. #define SB_DSP_LINE_DEV        0x2e
  188. #define SB_DSP_CD_DEV        0x28
  189. #define SB_DSP_FM_DEV        0x26
  190. #define SB_DSP_MIC_DEV        0x0a
  191. #define SB_DSP_CAPTURE_SOURCE    0x0c
  192. #define SB_DSP_CAPTURE_FILT    0x0c
  193. #define SB_DSP_PLAYBACK_FILT    0x0e
  194. #define SB_DSP_STEREO_SW    0x0e
  195.  
  196. #define SB_DSP_MIXS_MIC0    0x00    /* same as MIC */
  197. #define SB_DSP_MIXS_CD        0x01
  198. #define SB_DSP_MIXS_MIC        0x02
  199. #define SB_DSP_MIXS_LINE    0x03
  200.  
  201. /* registers (only for left channel) for SB 16 mixer */
  202. #define SB_DSP4_MASTER_DEV    0x30
  203. #define SB_DSP4_BASS_DEV    0x46
  204. #define SB_DSP4_TREBLE_DEV    0x44
  205. #define SB_DSP4_SYNTH_DEV    0x34
  206. #define SB_DSP4_PCM_DEV        0x32
  207. #define SB_DSP4_SPEAKER_DEV    0x3b
  208. #define SB_DSP4_LINE_DEV    0x38
  209. #define SB_DSP4_MIC_DEV        0x3a
  210. #define SB_DSP4_OUTPUT_SW    0x3c
  211. #define SB_DSP4_CD_DEV        0x36
  212. #define SB_DSP4_IGAIN_DEV    0x3f
  213. #define SB_DSP4_OGAIN_DEV    0x41
  214. #define SB_DSP4_MIC_AGC        0x43
  215.  
  216. /* additional registers for SB 16 mixer */
  217. #define SB_DSP4_IRQSETUP    0x80
  218. #define SB_DSP4_DMASETUP    0x81
  219. #define SB_DSP4_IRQSTATUS    0x82
  220. #define SB_DSP4_MPUSETUP    0x84
  221.  
  222. #define SB_DSP4_3DSE        0x90
  223.  
  224. /* Registers for DT-019x / ALS-007 mixer */
  225. #define SB_DT019X_MASTER_DEV    0x62
  226. #define SB_DT019X_PCM_DEV    0x64
  227. #define SB_DT019X_SYNTH_DEV    0x66
  228. #define SB_DT019X_CD_DEV    0x68
  229. #define SB_DT019X_MIC_DEV    0x6a
  230. #define SB_DT019X_SPKR_DEV    0x6a
  231. #define SB_DT019X_LINE_DEV    0x6e
  232. #define SB_DT019X_OUTPUT_SW2    0x4c
  233. #define SB_DT019X_CAPTURE_SW    0x6c
  234.  
  235. #define SB_DT019X_CAP_CD    0x02
  236. #define SB_DT019X_CAP_MIC    0x04
  237. #define SB_DT019X_CAP_LINE    0x06
  238. #define SB_DT019X_CAP_SYNTH    0x07
  239. #define SB_DT019X_CAP_MAIN    0x07
  240.  
  241. #define SB_ALS4000_MONO_IO_CTRL    0x4b
  242. #define SB_ALS4000_MIC_IN_GAIN    0x4d
  243. #define SB_ALS4000_FMDAC    0x4f
  244. #define SB_ALS4000_3D_SND_FX    0x50
  245. #define SB_ALS4000_3D_TIME_DELAY    0x51
  246. #define SB_ALS4000_3D_AUTO_MUTE    0x52
  247. #define SB_ALS4000_QSOUND    0xdb
  248.  
  249. /* IRQ setting bitmap */
  250. #define SB_IRQSETUP_IRQ9    0x01
  251. #define SB_IRQSETUP_IRQ5    0x02
  252. #define SB_IRQSETUP_IRQ7    0x04
  253. #define SB_IRQSETUP_IRQ10    0x08
  254.  
  255. /* IRQ types */
  256. #define SB_IRQTYPE_8BIT        0x01
  257. #define SB_IRQTYPE_16BIT    0x02
  258. #define SB_IRQTYPE_MPUIN    0x04
  259.  
  260. /* DMA setting bitmap */
  261. #define SB_DMASETUP_DMA0    0x01
  262. #define SB_DMASETUP_DMA1    0x02
  263. #define SB_DMASETUP_DMA3    0x08
  264. #define SB_DMASETUP_DMA5    0x20
  265. #define SB_DMASETUP_DMA6    0x40
  266. #define SB_DMASETUP_DMA7    0x80
  267.  
  268. /*
  269.  *
  270.  */
  271.  
  272. static inline void snd_sb_ack_8bit(struct snd_sb *chip)
  273. {
  274.     inb(SBP(chip, DATA_AVAIL));
  275. }
  276.  
  277. static inline void snd_sb_ack_16bit(struct snd_sb *chip)
  278. {
  279.     inb(SBP(chip, DATA_AVAIL_16));
  280. }
  281.  
  282. /* sb_common.c */
  283. int snd_sbdsp_command(struct snd_sb *chip, unsigned char val);
  284. int snd_sbdsp_get_byte(struct snd_sb *chip);
  285. int snd_sbdsp_reset(struct snd_sb *chip);
  286. int snd_sbdsp_create(struct snd_card *card,
  287.              unsigned long port,
  288.              int irq,
  289.              irqreturn_t (*irq_handler)(int, void *, struct pt_regs *),
  290.              int dma8, int dma16,
  291.              unsigned short hardware,
  292.              struct snd_sb **r_chip);
  293. /* sb_mixer.c */
  294. void snd_sbmixer_write(struct snd_sb *chip, unsigned char reg, unsigned char data);
  295. unsigned char snd_sbmixer_read(struct snd_sb *chip, unsigned char reg);
  296. int snd_sbmixer_new(struct snd_sb *chip);
  297. #ifdef CONFIG_PM
  298. void snd_sbmixer_suspend(struct snd_sb *chip);
  299. void snd_sbmixer_resume(struct snd_sb *chip);
  300. #endif
  301.  
  302. /* sb8_init.c */
  303. int snd_sb8dsp_pcm(struct snd_sb *chip, int device, struct snd_pcm ** rpcm);
  304. /* sb8.c */
  305. irqreturn_t snd_sb8dsp_interrupt(struct snd_sb *chip);
  306. int snd_sb8_playback_open(struct snd_pcm_substream *substream);
  307. int snd_sb8_capture_open(struct snd_pcm_substream *substream);
  308. int snd_sb8_playback_close(struct snd_pcm_substream *substream);
  309. int snd_sb8_capture_close(struct snd_pcm_substream *substream);
  310. /* midi8.c */
  311. irqreturn_t snd_sb8dsp_midi_interrupt(struct snd_sb *chip);
  312. int snd_sb8dsp_midi(struct snd_sb *chip, int device, struct snd_rawmidi ** rrawmidi);
  313.  
  314. /* sb16_init.c */
  315. int snd_sb16dsp_pcm(struct snd_sb *chip, int device, struct snd_pcm ** rpcm);
  316. const struct snd_pcm_ops *snd_sb16dsp_get_pcm_ops(int direction);
  317. int snd_sb16dsp_configure(struct snd_sb *chip);
  318. /* sb16.c */
  319. irqreturn_t snd_sb16dsp_interrupt(int irq, void *dev_id, struct pt_regs *regs);
  320.  
  321. /* exported mixer stuffs */
  322. enum {
  323.     SB_MIX_SINGLE,
  324.     SB_MIX_DOUBLE,
  325.     SB_MIX_INPUT_SW,
  326.     SB_MIX_CAPTURE_PRO,
  327.     SB_MIX_CAPTURE_DT019X
  328. };
  329.  
  330. #define SB_MIXVAL_DOUBLE(left_reg, right_reg, left_shift, right_shift, mask) \
  331.   ((left_reg) | ((right_reg) << 8) | ((left_shift) << 16) | ((right_shift) << 19) | ((mask) << 24))
  332. #define SB_MIXVAL_SINGLE(reg, shift, mask) \
  333.   ((reg) | ((shift) << 16) | ((mask) << 24))
  334. #define SB_MIXVAL_INPUT_SW(reg1, reg2, left_shift, right_shift) \
  335.   ((reg1) | ((reg2) << 8) | ((left_shift) << 16) | ((right_shift) << 24))
  336.  
  337. int snd_sbmixer_add_ctl(struct snd_sb *chip, const char *name, int index, int type, unsigned long value);
  338.  
  339. /* for ease of use */
  340. struct sbmix_elem {
  341.     const char *name;
  342.     int type;
  343.     unsigned long private_value;
  344. };
  345.  
  346. #define SB_SINGLE(xname, reg, shift, mask) \
  347. { .name = xname, \
  348.   .type = SB_MIX_SINGLE, \
  349.   .private_value = SB_MIXVAL_SINGLE(reg, shift, mask) }
  350.  
  351. #define SB_DOUBLE(xname, left_reg, right_reg, left_shift, right_shift, mask) \
  352. { .name = xname, \
  353.   .type = SB_MIX_DOUBLE, \
  354.   .private_value = SB_MIXVAL_DOUBLE(left_reg, right_reg, left_shift, right_shift, mask) }
  355.  
  356. #define SB16_INPUT_SW(xname, reg1, reg2, left_shift, right_shift) \
  357. { .name = xname, \
  358.   .type = SB_MIX_INPUT_SW, \
  359.   .private_value = SB_MIXVAL_INPUT_SW(reg1, reg2, left_shift, right_shift) }
  360.  
  361. static inline int snd_sbmixer_add_ctl_elem(struct snd_sb *chip, const struct sbmix_elem *c)
  362. {
  363.     return snd_sbmixer_add_ctl(chip, c->name, 0, c->type, c->private_value);
  364. }
  365.  
  366. #endif /* __SOUND_SB_H */
  367.