This source file includes following definitions.
- pas_read
- pas_write
- pas2_msg
- pasintr
- pas_set_intr
- pas_remove_intr
- config_pas_hw
- detect_pas_hw
- attach_pas_card
- probe_pas
1 #define _PAS2_CARD_C_
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31 #include "sound_config.h"
32
33 #if defined(CONFIGURE_SOUNDCARD) && !defined(EXCLUDE_PAS)
34
35 #define DEFINE_TRANSLATIONS
36 #include "pas.h"
37
38
39
40
41
42
43 int translat_code;
44 static int pas_intr_mask = 0;
45 static int pas_irq = 0;
46
47 char pas_model;
48 static char *pas_model_names[] =
49 {"", "Pro AudioSpectrum+", "CDPC", "Pro AudioSpectrum 16", "Pro AudioSpectrum 16D"};
50
51
52
53
54
55
56
57
58
59
60 extern void mix_write (unsigned char data, int ioaddr);
61
62 unsigned char
63 pas_read (int ioaddr)
64 {
65 return INB (ioaddr ^ translat_code);
66 }
67
68 void
69 pas_write (unsigned char data, int ioaddr)
70 {
71 OUTB (data, ioaddr ^ translat_code);
72 }
73
74 void
75 pas2_msg (char *foo)
76 {
77 printk (" PAS2: %s.\n", foo);
78 }
79
80
81
82 void
83 pasintr (INT_HANDLER_PARMS (irq, dummy))
84 {
85 int status;
86
87 status = pas_read (INTERRUPT_STATUS);
88 pas_write (status, INTERRUPT_STATUS);
89
90
91
92 if (status & I_S_PCM_SAMPLE_BUFFER_IRQ)
93 {
94 #ifndef EXCLUDE_AUDIO
95 pas_pcm_interrupt (status, 1);
96 #endif
97 status &= ~I_S_PCM_SAMPLE_BUFFER_IRQ;
98 }
99 if (status & I_S_MIDI_IRQ)
100 {
101 #ifndef EXCLUDE_MIDI
102 #ifdef EXCLUDE_PRO_MIDI
103 pas_midi_interrupt ();
104 #endif
105 #endif
106 status &= ~I_S_MIDI_IRQ;
107 }
108
109 }
110
111 int
112 pas_set_intr (int mask)
113 {
114 int err;
115
116 if (!mask)
117 return 0;
118
119 if (!pas_intr_mask)
120 {
121 if ((err = snd_set_irq_handler (pas_irq, pasintr, "PAS16")) < 0)
122 return err;
123 }
124 pas_intr_mask |= mask;
125
126 pas_write (pas_intr_mask, INTERRUPT_MASK);
127 return 0;
128 }
129
130 int
131 pas_remove_intr (int mask)
132 {
133 if (!mask)
134 return 0;
135
136 pas_intr_mask &= ~mask;
137 pas_write (pas_intr_mask, INTERRUPT_MASK);
138
139 if (!pas_intr_mask)
140 {
141 snd_release_irq (pas_irq);
142 }
143 return 0;
144 }
145
146
147
148
149
150 int
151 config_pas_hw (struct address_info *hw_config)
152 {
153 char ok = 1;
154 unsigned int_ptrs;
155
156 pas_irq = hw_config->irq;
157
158 pas_write (0x00, INTERRUPT_MASK);
159
160 pas_write (0x36, SAMPLE_COUNTER_CONTROL);
161
162
163
164
165 pas_write (0x36, SAMPLE_RATE_TIMER);
166
167
168 pas_write (0, SAMPLE_RATE_TIMER);
169
170 pas_write (0x74, SAMPLE_COUNTER_CONTROL);
171
172
173
174
175 pas_write (0x74, SAMPLE_BUFFER_COUNTER);
176
177
178
179 pas_write (0, SAMPLE_BUFFER_COUNTER);
180
181 pas_write (F_F_PCM_BUFFER_COUNTER | F_F_PCM_RATE_COUNTER | F_F_MIXER_UNMUTE | 1, FILTER_FREQUENCY);
182 pas_write (P_C_PCM_DMA_ENABLE | P_C_PCM_MONO | P_C_PCM_DAC_MODE | P_C_MIXER_CROSS_L_TO_L | P_C_MIXER_CROSS_R_TO_R, PCM_CONTROL);
183 pas_write (S_M_PCM_RESET | S_M_FM_RESET | S_M_SB_RESET | S_M_MIXER_RESET
184
185
186 , SERIAL_MIXER);
187
188 pas_write (I_C_1_BOOT_RESET_ENABLE
189 #ifdef PAS_JOYSTICK_ENABLE
190 | I_C_1_JOYSTICK_ENABLE
191 #endif
192 ,IO_CONFIGURATION_1);
193
194 if (pas_irq < 0 || pas_irq > 15)
195 {
196 printk ("PAS2: Invalid IRQ %d", pas_irq);
197 ok = 0;
198 }
199 else
200 {
201 int_ptrs = pas_read (IO_CONFIGURATION_3);
202 int_ptrs |= I_C_3_PCM_IRQ_translate[pas_irq] & 0xf;
203 pas_write (int_ptrs, IO_CONFIGURATION_3);
204 if (!I_C_3_PCM_IRQ_translate[pas_irq])
205 {
206 printk ("PAS2: Invalid IRQ %d", pas_irq);
207 ok = 0;
208 }
209 }
210
211 if (hw_config->dma < 0 || hw_config->dma > 7)
212 {
213 printk ("PAS2: Invalid DMA selection %d", hw_config->dma);
214 ok = 0;
215 }
216 else
217 {
218 pas_write (I_C_2_PCM_DMA_translate[hw_config->dma], IO_CONFIGURATION_2);
219 if (!I_C_2_PCM_DMA_translate[hw_config->dma])
220 {
221 printk ("PAS2: Invalid DMA selection %d", hw_config->dma);
222 ok = 0;
223 }
224 }
225
226
227
228
229
230 #ifdef SYMPHONY_PAS
231 OUTB (0x05, 0xa8);
232 OUTB (0x60, 0xa9);
233 #endif
234
235 #ifdef BROKEN_BUS_CLOCK
236 pas_write (S_C_1_PCS_ENABLE | S_C_1_PCS_STEREO | S_C_1_PCS_REALSOUND | S_C_1_FM_EMULATE_CLOCK, SYSTEM_CONFIGURATION_1);
237 #else
238
239
240
241 pas_write (S_C_1_PCS_ENABLE | S_C_1_PCS_STEREO | S_C_1_PCS_REALSOUND, SYSTEM_CONFIGURATION_1);
242 #endif
243 pas_write (0x18, SYSTEM_CONFIGURATION_3);
244
245
246
247 pas_write (F_F_MIXER_UNMUTE | 0x01, FILTER_FREQUENCY);
248
249
250
251
252
253
254
255
256 if (pas_model == PAS_16 || pas_model == PAS_16D)
257 pas_write (8, PRESCALE_DIVIDER);
258 else
259 pas_write (0, PRESCALE_DIVIDER);
260
261 mix_write (P_M_MV508_ADDRESS | 5, PARALLEL_MIXER);
262 mix_write (5, PARALLEL_MIXER);
263
264 #if !defined(EXCLUDE_SB_EMULATION) || !defined(EXCLUDE_SB)
265
266 {
267 struct address_info *sb_config;
268
269 if ((sb_config = sound_getconf (SNDCARD_SB)))
270 {
271 unsigned char irq_dma;
272
273
274
275
276
277
278
279
280
281
282 pas_write (0x02, COMPATIBILITY_ENABLE);
283
284
285
286
287 pas_write ((sb_config->io_base >> 4) & 0x0f, EMULATION_ADDRESS);
288
289 if (!E_C_SB_DMA_translate[sb_config->dma])
290 printk ("\n\nPAS16 Warning: Invalid SB DMA %d\n\n",
291 sb_config->dma);
292
293 if (!E_C_SB_IRQ_translate[sb_config->irq])
294 printk ("\n\nPAS16 Warning: Invalid SB IRQ %d\n\n",
295 sb_config->irq);
296
297 irq_dma = E_C_SB_DMA_translate[sb_config->dma] |
298 E_C_SB_IRQ_translate[sb_config->irq];
299
300 pas_write (irq_dma, EMULATION_CONFIGURATION);
301 }
302 }
303 #else
304 pas_write (0x00, COMPATIBILITY_ENABLE);
305 #endif
306
307 if (!ok)
308 pas2_msg ("Driver not enabled");
309
310 return ok;
311 }
312
313 int
314 detect_pas_hw (struct address_info *hw_config)
315 {
316 unsigned char board_id, foo;
317
318
319
320
321
322
323
324
325 OUTB (0xBC, MASTER_DECODE);
326
327
328 OUTB (hw_config->io_base >> 2, MASTER_DECODE);
329
330
331 translat_code = PAS_DEFAULT_BASE ^ hw_config->io_base;
332 pas_write (1, WAIT_STATE);
333
334
335
336 board_id = pas_read (INTERRUPT_MASK);
337
338 if (board_id == 0xff)
339 return 0;
340
341
342
343
344
345
346
347 foo = board_id ^ 0xe0;
348
349 pas_write (foo, INTERRUPT_MASK);
350 foo = INB (INTERRUPT_MASK);
351 pas_write (board_id, INTERRUPT_MASK);
352
353 if (board_id != foo)
354
355
356 return 0;
357
358 pas_model = pas_read (CHIP_REV);
359
360 return pas_model;
361 }
362
363 long
364 attach_pas_card (long mem_start, struct address_info *hw_config)
365 {
366 pas_irq = hw_config->irq;
367
368 if (detect_pas_hw (hw_config))
369 {
370
371 if ((pas_model = pas_read (CHIP_REV)))
372 {
373 printk (" <%s rev %d>", pas_model_names[(int) pas_model], pas_read (BOARD_REV_ID));
374 }
375
376 if (config_pas_hw (hw_config))
377 {
378
379 #ifndef EXCLUDE_AUDIO
380 mem_start = pas_pcm_init (mem_start, hw_config);
381 #endif
382
383 #if !defined(EXCLUDE_SB_EMULATION) && !defined(EXCLUDE_SB)
384
385 sb_dsp_disable_midi ();
386
387
388
389 #endif
390
391 #ifndef EXCLUDE_YM3812
392 enable_opl3_mode (0x388, 0x38a, 0);
393 #endif
394
395 #ifndef EXCLUDE_MIDI
396 #ifdef EXCLUDE_PRO_MIDI
397 mem_start = pas_midi_init (mem_start);
398 #endif
399 #endif
400
401 pas_init_mixer ();
402 }
403 }
404
405 return mem_start;
406 }
407
408 int
409 probe_pas (struct address_info *hw_config)
410 {
411 return detect_pas_hw (hw_config);
412 }
413
414 #endif