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