2
* Purpose: Driver for Aureal Semiconductor Vortex 2 PCI audio controller.
6
* This file is part of Open Sound System.
8
* Copyright (C) 4Front Technologies 1996-2008.
10
* This this source file is released under GPL v2 license (no other versions).
11
* See the COPYING file included in the main directory of this source
12
* distribution for the license terms and conditions.
21
#define AUREAL_VENDOR_ID 0x12eb
22
#define AUREAL_VORTEX2 0x0002
24
# define ISR (devc->global_base+0x0)
25
# define CODIRQST 0x00008000
26
# define MODIRQST 0x00004000
27
# define MIDIRQST 0x00002000
28
# define TIMIRQST 0x00001000
29
# define COIRQLST 0x00000800
30
# define COIRQPST 0x00000400
31
# define FRCIRQST 0x00000200
32
# define SBIRQST 0x00000100
33
# define SBMIRQST 0x00000080
34
# define FMIRQST 0x00000040
35
# define DMAENDIRQST 0x00000020
36
# define DMABERRST 0x00000010
37
# define FIFOERRST 0x00000008
38
# define REGERRST 0x00000004
39
# define MPARERRST 0x00000002
40
# define MFATERRST 0x00000001
41
# define ICR devc->global_base+0x4
42
# define GSR devc->global_base+0x8
43
# define GCR devc->global_base+0xc
44
# define SFTRST 0x00800000
45
# define ARBRST 0x00400000
46
# define EXTRST 0x00200000
47
# define RBTOEN 0x00100000
48
# define AINCEN 0x00080000
49
# define TTXFLUSH 0x00040000
50
# define TRVFLUSH 0x00020000
51
# define MFIFOFLUSH 0x00010000
52
# define FRCIRQ 0x00008000
53
# define GIRQEN 0x00004000
54
# define MIDIDAT devc->midi_base+0x0
55
# define MIDICMD devc->midi_base+0x4
56
# define MIDISTAT MIDICMD
57
# define MIDIVAL 0x00000080
58
# define CMDOK 0x00000040
59
# define MPUMODE 0x00000001
60
# define GAMECTL devc->midi_base+0xc
61
# define JOYMODE 0x00000040
62
# define MIDITXFULL 0x00000008
63
# define MIDIRXINIT 0x00000004
64
# define MIDIRXOVFL 0x00000002
65
# define MIDIDATVAL 0x00000001
67
#define adb_destinations 173
68
# define CODSMPLTMR (devc->serial_block_base+0x19c)
69
#define adbarb_base devc->adbarb_block_base
70
#define adbarb_wtdram_base_addr (devc->adbarb_block_base + 0x000)
71
#define adbarb_wtdram_srhdr_base_addr (devc->adbarb_block_base + (adb_destinations * 4))
72
#define adbarb_sr_active_addr (devc->adbarb_block_base + 0x400)
74
#define codec_control_reg_addr (devc->serial_block_base + 0x184)
75
#define cmd_status_reg_addr (devc->serial_block_base + 0x188)
76
#define channel_enable_reg_addr (devc->serial_block_base + 0x190)
77
#define serial_ram_reg_addr (devc->serial_block_base + 0x00)
79
#define spdif_ctrl_reg (devc->serial_block_base + 0x0194) /* offset for spdif control register */
80
#define codec_sample_counter (devc->serial_block_base + 0x0198) /* offset for spdif control register */
81
#define spdif_cfg_dword 0x86 /* enable port, enable CRC, set clock toinput (48kHz) */
82
#define spdif_ch_status_reg0 0x0 /* Set to consumer, digital audio, */
83
#define spdif_ch_status_reg_base (devc->serial_block_base + 0x1D0) /* Set to the first address location */
85
#define fifo_chan0_src_addr 0x00
86
#define fifo_chan1_src_addr 0x01
87
#define fifo_chan6_src_addr 0x06
88
#define fifo_chan7_src_addr 0x07
89
#define fifo_chan8_src_addr 0x08
90
#define fifo_chan9_src_addr 0x09
91
#define fifo_chan2_dst_addr 0x02
92
#define fifo_chan2a_dst_addr 0x022
93
#define fifo_chan3_dst_addr 0x03
94
#define fifo_chan3a_dst_addr 0x023
95
#define fifo_chan4_dst_addr 0x04
96
#define fifo_chan5_dst_addr 0x05
97
#define fifo_chan6_dst_addr 0x06
98
#define fifo_chan7_dst_addr 0x07
99
#define fifo_chan8_dst_addr 0x08
100
#define fifo_chan9_dst_addr 0x09
101
#define fifo_chana_dst_addr 0x0a
102
#define fifo_chanb_dst_addr 0x0b
104
#define codec_chan0_src_addr 0x70
105
#define codec_chan1_src_addr 0x71
106
#define codec_chan0_dst_addr 0x88
107
#define codec_chan1_dst_addr 0x89
108
#define codec_chan4_dst_addr 0x8c
109
#define codec_chan5_dst_addr 0x8d
111
#define spdif_chan0_dst_addr 0x92
112
#define spdif_chan1_dst_addr 0x93
114
#define src_chan0_dst_addr 0x40
115
#define src_chan1_dst_addr 0x41
116
#define src_chan0_src_addr 0x20
117
#define src_chan1_src_addr 0x21
119
#define src_base_offset (devc->src_base)
120
#define src_input_fifo_base (devc->src_base + 0x000)
121
#define src_output_fifo_base (devc->src_base + 0x800)
122
#define src_next_ch_base (devc->src_base + 0xc00)
123
#define src_sr_header_base (devc->src_base + 0xc40)
124
#define src_active_sample_rate (devc->src_base + 0xcc0)
125
#define src_throttle_source (devc->src_base + 0xcc4)
126
#define src_throttle_count_size (devc->src_base + 0xcc8)
127
#define src_ch_params_base (devc->src_base + 0xe00)
128
#define src_ch_param0 (devc->src_base + 0xe00)
129
#define src_ch_param1 (devc->src_base + 0xe40)
130
#define src_ch_param2 (devc->src_base + 0xe80)
131
#define src_ch_param3 (devc->src_base + 0xec0)
132
#define src_ch_param4 (devc->src_base + 0xf00)
133
#define src_ch_param5 (devc->src_base + 0xf40)
134
#define src_ch_param6 (devc->src_base + 0xf80)
136
#define pif_gpio_control (devc->parallel_base + 0x05c)
138
/************************************************************
140
************************************************************/
144
V2ReadReg (vortex_devc * devc, oss_native_word addr)
150
V2WriteReg (vortex_devc * devc, oss_native_word addr, oss_native_word data)
156
V2ReadCodecRegister (vortex_devc * devc, int cIndex, int *pdwData)
162
dwCmdStRegAddr = cIndex << 16;
163
V2WriteReg (devc, cmd_status_reg_addr, dwCmdStRegAddr);
166
dwCmdStRegData = V2ReadReg (devc, cmd_status_reg_addr);
170
while ((dwCmdStRegData & 0x00FF0000) != ((1 << 23) | (dwCmdStRegAddr))
175
cmn_err (CE_WARN, "AC97 Timeout\n");
178
*pdwData = dwCmdStRegData & 0x0000ffff;
182
V2WriteCodecCommand (vortex_devc * devc, int cIndex, int wData)
190
dwData = V2ReadReg (devc, codec_control_reg_addr);
194
while (!(dwData & 0x0100) && (nCnt < 50));
196
cmn_err (CE_WARN, "AC97 write timeout.\n");
201
dwData = V2ReadReg (devc, codec_control_reg_addr);
205
while (!(dwData & 0x0100) && (nCnt < 100));
207
cmn_err (CE_WARN, "AC97 timeout(2)\n");
209
dwData = (cIndex << 16) | (1 << 23) | wData;
210
V2WriteReg (devc, cmd_status_reg_addr, dwData);
212
/* Read it back to make sure it got there */
215
dwData = V2ReadReg (devc, codec_control_reg_addr);
219
while (!(dwData & 0x0100) && (nCnt < 100));
221
cmn_err (CE_WARN, "AC97 timeout(3)\n");
222
V2ReadCodecRegister (devc, cIndex, &dwData);
223
if (dwData != (int) wData)
227
dwData = V2ReadReg (devc, codec_control_reg_addr);
231
while (!(dwData & 0x0100) && (nCnt < 10));
233
cmn_err (CE_WARN, "AC97 Timeout(4).\n");
234
dwData = (cIndex << 16) | (1 << 23) | wData;
235
V2WriteReg (devc, cmd_status_reg_addr, dwData);
238
dwData = V2ReadReg (devc, codec_control_reg_addr);
242
while (!(dwData & 0x0100) && (nCnt < 100));
244
cmn_err (CE_WARN, "AC97 timeout(5).\n");
246
V2ReadCodecRegister (devc, cIndex, &dwData);
247
if (dwData != (int) wData)
250
"Vortex ERROR: Write to index %x failed (exp %04x, got %04x)\n",
251
cIndex, wData, dwData);
258
ClearDataFifo (vortex_devc * devc, int nChannel)
262
/* Clear out FIFO data */
263
for (j = 0; j < 64; j++)
265
devc->fifo_base + 0x4000 + (0x100 * nChannel) + (0x4 * j),
270
cold_reset (vortex_devc * devc)
273
int bSigmatelCodec = 0;
275
V2ReadCodecRegister (devc, 0x7c, ®);
278
DDB (cmn_err (CE_WARN, "Sigmatel codec detected\n"));
282
for (i = 0; i < 32; i = i + 1)
284
V2WriteReg (devc, serial_ram_reg_addr + 0x80 + (i * 4), 0);
290
V2WriteReg (devc, codec_control_reg_addr, 0x00a8);
293
/* V2WriteReg(devc, codec_control_reg_addr, 0x40a8); */
295
/* Place CODEC into reset */
296
V2WriteReg (devc, codec_control_reg_addr, 0x80a8);
298
/* Give CODEC some Clocks with reset asserted */
299
V2WriteReg (devc, codec_control_reg_addr, 0x80e8);
301
/* Turn off clocks */
302
V2WriteReg (devc, codec_control_reg_addr, 0x80a8);
304
/* Take out of reset */
305
/* V2WriteReg(devc, codec_control_reg_addr, 0x40a8); */
306
/* oss_udelay(100); */
308
V2WriteReg (devc, codec_control_reg_addr, 0x00a8);
311
V2WriteReg (devc, codec_control_reg_addr, 0x00e8);
316
V2WriteReg (devc, codec_control_reg_addr, 0x8068);
318
V2WriteReg (devc, codec_control_reg_addr, 0x00e8);
324
V2InitCodec (vortex_devc * devc)
328
for (i = 0; i < 32; i = i + 1)
330
V2WriteReg (devc, serial_ram_reg_addr + 0x80 + (i * 4), 0);
334
/* Set up the codec in AC97 mode */
335
V2WriteReg (devc, codec_control_reg_addr, 0x00e8);
337
/* Clear the channel enable register */
338
V2WriteReg (devc, channel_enable_reg_addr, 0);
340
/* Set up Sigmatel STAC9708 Codec with initialization routine rev. 0.50 */
342
V2WriteCodecCommand (devc, 0x26, 0x800f); /* set EAPD to unmute */
345
V2WriteCodecCommand (devc, 0x76, 0xabba);
346
oss_udelay (10); /* Turn on secondary output DACs */
347
V2WriteCodecCommand (devc, 0x78, 0x1000);
350
V2WriteCodecCommand (devc, 0x70, 0xabba);
351
oss_udelay (10); /* Turn on extra current to reduce THD */
352
V2WriteCodecCommand (devc, 0x72, 0x07);
357
V2SetupCodec (vortex_devc * devc)
361
int dwBit28 = 1 << 28;
363
/* do the following only for ac97 codecs */
364
/* Wait for Codec Ready (bit 28) */
367
dwData = V2ReadReg (devc, codec_control_reg_addr);
371
while ((count < 100) && !(dwData & dwBit28));
375
cmn_err (CE_WARN, "Error: timeout waiting for Codec Ready bit.\n");
376
cmn_err (CE_WARN, "Codec Interface Control Register is %08x\n", dwData);
379
/* Write interesting data to the Codec 97 Mixer registers */
380
/* Master Volume 0dB Attunuation, Not muted. */
381
V2WriteCodecCommand (devc, 0x02, 0x0a0a);
383
/* Master Volume mono muted. */
384
V2WriteCodecCommand (devc, 0x06, 0x8000);
386
/* Mic Volume muted. */
387
V2WriteCodecCommand (devc, 0x0e, 0x8000);
389
/* Line In Volume muted. */
390
V2WriteCodecCommand (devc, 0x10, 0x8000);
392
/* CD Volume muted. */
393
V2WriteCodecCommand (devc, 0x12, 0x8000);
395
/* Aux Volume muted. */
396
V2WriteCodecCommand (devc, 0x16, 0x8000);
398
/* PCM out Volume 0 dB Gain, Not muted. */
399
V2WriteCodecCommand (devc, 0x18, 0x0f0f);
401
/* Record select, select Mic for recording */
402
V2WriteCodecCommand (devc, 0x1a, 0x0404);
404
/* Record Gain, 0dB */
405
V2WriteCodecCommand (devc, 0x1c, 0x8000);
408
/* Poll the Section Ready bits in the Status Register (index 0x26) */
412
V2ReadCodecRegister (devc, 0x26, &dwData);
416
while (!(dwData & 0x02) && (count < 10));
417
if (!(dwData & 0x02))
418
cmn_err (CE_WARN, "DAC section ready bit is not set.\n");
420
/* Read and confirm the data in the Codec 97 Mixer registers. */
421
/* just the PCM reg, as a sanity check */
422
V2ReadCodecRegister (devc, 0x18, &dwData);
423
if ((dwData & 0x0000ffff) != 0xf0f)
425
cmn_err (CE_WARN, "PCM volume reg is %x, sb 0xf0f.\n", dwData);
430
V2InitAdb (vortex_devc * devc)
432
/* parameter values for write_op */
433
#define none 0 /* dst_op = x */
434
#define tail 1 /* dst_op = x */
435
#define add 2 /* dst_op = dst_addr being added */
436
#define adds 3 /* dst_op = dst_addr being added */
437
#define del 4 /* dst_op = dst_addr being deleted */
438
#define dels 5 /* dst_op = dst_addr being deleted */
439
#define inval 6 /* dst_op = x */
444
unsigned char /*reg [3:0] */ write_op;
445
unsigned char /*reg [6:0] */ dst_op;
446
unsigned char /*reg [6:0] */ src_op;
447
unsigned char /*reg [SS:0] */ sr_op;
452
/* the initial tail for each list is the header location */
453
for (i = 0; i <= 31; i = i + 1)
454
devc->tail_index[i] = adb_destinations + i;
455
for (i = 0; i <= 127; i = i + 1)
456
devc->dst_index[i] = 0x7f; /*~('b0); */
457
for (i = 0; i <= 127; i = i + 1)
458
devc->sr_list[i] = 0x1f; /*~('b0); */
462
dst_op = 0x7f; /* ~('b0); */
463
src_op = 0x7f; /* ~('b0); */
464
sr_op = 0x1f; /* ~('b0); */
466
/* Disable any active sample rate */
467
V2WriteReg (devc, adbarb_base + 0x400, 0);
468
/* Null out all the linked lists */
469
for (i = 0; i < 0x1f0; i = i + 4)
471
V2WriteReg (devc, adbarb_base + i, 0xffffffff);
477
V2DisableSrc (vortex_devc * devc)
479
V2WriteReg (devc, (oss_native_word) (src_active_sample_rate), (oss_native_word) (0x0)); /* activate 0 and 1 */
485
V2EnableSrc (vortex_devc * devc)
489
for (i = 0; i < 16; i++)
491
V2WriteReg (devc, (unsigned long) (src_next_ch_base + (0x4 * i)), (unsigned long) (0x0)); /* clear next ch list */
494
for (i = 0; i < 22; i++)
496
V2WriteReg (devc, (unsigned long) (src_sr_header_base + (0x4 * i)), (unsigned long) (0x0)); /* Clear header list */
499
for (i = 0; i < 16; i++)
501
for (j = 0; j < 32; j++)
503
V2WriteReg (devc, (unsigned long) (src_input_fifo_base + (0x4 * ((0x20 * i) + j))), (unsigned long) (0xdeadbabe)); /* clear input fifo */
507
for (i = 0; i < 16; i++)
509
for (j = 0; j < 2; j++)
511
V2WriteReg (devc, (unsigned long) (src_output_fifo_base + (0x4 * ((0x2 * i) + j))), (unsigned long) (0x5555aaaa)); /* clear input fifo */
515
for (i = 0; i < 16; i++)
517
V2WriteReg (devc, (unsigned long) (src_ch_params_base + (0x04 * i)), (unsigned long) (0xc0)); /* samples per wing */
518
V2WriteReg (devc, (unsigned long) (src_ch_params_base + (0x04 * (0x10 + i))), (unsigned long) (0x45a9)); /* conversion ratio */
519
V2WriteReg (devc, (unsigned long) (src_ch_params_base + (0x04 * (0x20 + i))), (unsigned long) (0x0)); /* Drift error = 0 */
520
V2WriteReg (devc, (unsigned long) (src_ch_params_base + (0x04 * (0x30 + i))), (unsigned long) (0x0)); /* Drift error = 0 */
521
V2WriteReg (devc, (unsigned long) (src_ch_params_base + (0x04 * (0x40 + i))), (unsigned long) (0x0)); /* fraction = 0 */
522
V2WriteReg (devc, (unsigned long) (src_ch_params_base + (0x04 * (0x50 + i))), (unsigned long) (0x1)); /* drift out count = 1 */
523
V2WriteReg (devc, (unsigned long) (src_ch_params_base + (0x04 * (0x60 + i))), (unsigned long) (0x30f00)); /* conversion ratio */
527
V2WriteReg (devc, (unsigned long) (src_next_ch_base), (unsigned long) (0x1)); /* point to SRC1 as last in list */
528
V2WriteReg (devc, (unsigned long) (src_sr_header_base + (0x04 * 20)), (unsigned long) (0x10)); /* Using spdif sr (20) point to ch 0 */
529
V2WriteReg (devc, (unsigned long) (src_ch_params_base), (unsigned long) (0xc0)); /* samples per wing */
530
V2WriteReg (devc, (unsigned long) (src_ch_params_base + (0x04)), (unsigned long) (0xc1)); /* samples per wing */
531
V2WriteReg (devc, (unsigned long) (src_ch_params_base + (0x04 * 0x10)), (unsigned long) (0x45a9)); /* conversion ratio */
532
V2WriteReg (devc, (unsigned long) (src_ch_params_base + (0x04 * 0x11)), (unsigned long) (0x45a9)); /* conversion ratio */
533
V2WriteReg (devc, (unsigned long) (src_ch_params_base + (0x04 * 0x20)), (unsigned long) (0x0)); /* Drift error = 0 */
534
V2WriteReg (devc, (unsigned long) (src_ch_params_base + (0x04 * 0x21)), (unsigned long) (0x0)); /* Drift error = 0 */
535
V2WriteReg (devc, (unsigned long) (src_ch_params_base + (0x04 * 0x30)), (unsigned long) (0x0)); /* Drift error = 0 */
536
V2WriteReg (devc, (unsigned long) (src_ch_params_base + (0x04 * 0x31)), (unsigned long) (0x0)); /* Drift error = 0 */
538
V2WriteReg (devc, (unsigned long) (src_ch_params_base + (0x04 * 0x40)), (unsigned long) (0x0)); /* fraction = 0 */
539
V2WriteReg (devc, (unsigned long) (src_ch_params_base + (0x04 * 0x41)), (unsigned long) (0x0)); /* fraction = 0 */
540
V2WriteReg (devc, (unsigned long) (src_ch_params_base + (0x04 * 0x50)), (unsigned long) (0x1)); /* drift out count = 1 */
541
V2WriteReg (devc, (unsigned long) (src_ch_params_base + (0x04 * 0x51)), (unsigned long) (0x1)); /* drift out count = 1 */
542
V2WriteReg (devc, (unsigned long) (src_ch_params_base + (0x04 * 0x60)), (unsigned long) (0x30f00)); /* pointers, throttle in */
543
V2WriteReg (devc, (unsigned long) (src_ch_params_base + (0x04 * 0x61)), (unsigned long) (0x30f00)); /* pointers, throttle in */
544
V2WriteReg (devc, (unsigned long) (src_throttle_source), (unsigned long) (0x3)); /* choose counter for ch 0 & 1 */
545
V2WriteReg (devc, (unsigned long) (src_throttle_count_size), (unsigned long) (0x1ff)); /* counter size = 511 */
546
V2WriteReg (devc, (unsigned long) (src_active_sample_rate), (unsigned long) (0x100000)); /* activate sr 20 for codec */
552
SetBit (unsigned int owData[], int nBit, unsigned char cVal)
555
owData[nBit / 32] |= (1 << (nBit % 32));
557
owData[nBit / 32] &= ~(1 << (nBit % 32));
562
add_route (vortex_devc * devc, unsigned int sr,
563
unsigned int src_addr, unsigned int dst_addr, int verify)
566
unsigned int ram_hdr_addr;
567
unsigned int ram_dst_addr;
568
unsigned int ram_tail_addr;
569
unsigned int sr_ram_index;
571
sr_ram_index = adb_destinations + sr;
572
ram_hdr_addr = adbarb_wtdram_srhdr_base_addr + (sr * 4); /* VHRDxx[sr] */
573
ram_dst_addr = adbarb_wtdram_base_addr + (dst_addr * 4); /* VDSTxx[dst_addr] */
574
ram_tail_addr = adbarb_wtdram_base_addr + (devc->tail_index[sr] * 4);
576
/* since always add to end of list, ram[dst_addr] will be the new tail. */
577
/* and, since we could be adding to an active list, the tail needs */
578
/* to be NULLed before the new link is inserted */
579
/* (since we need to check the current tail next, devc->tail_index is */
580
/* updated a bit later below.) */
581
V2WriteReg (devc, ram_dst_addr, 0xffffffff);
583
/* check if this sr has a list started yet */
584
if (devc->tail_index[sr] == (adb_destinations + sr))
586
/* current tail for this sample rate indicates that list is empty, */
587
/* thus this route will be head of list */
588
V2WriteReg (devc, ram_hdr_addr, ((src_addr << 8) | dst_addr));
589
devc->dst_index[dst_addr] = sr_ram_index;
593
/* add to end of list */
594
V2WriteReg (devc, ram_tail_addr, ((src_addr << 8) | dst_addr));
595
devc->dst_index[dst_addr] = devc->tail_index[sr];
598
/* keep track of the new tail */
599
devc->tail_index[sr] = dst_addr;
601
/* keep track of which sample rate list this dst_addr now belongs to */
602
devc->sr_list[dst_addr] = sr;
604
/* mark dst_addr as routed */
605
/* devc->dst_routed[dst_addr] = 1; */
606
SetBit ((unsigned int *) &devc->dst_routed, dst_addr, 1);
613
del_route (vortex_devc * devc, unsigned char dst_addr, int verify)
616
unsigned int data, ram_dst_addr, ram_rtd_addr;
620
ram_dst_addr = adbarb_wtdram_base_addr + (dst_addr * 4);
621
ram_rtd_addr = adbarb_wtdram_base_addr + (devc->dst_index[dst_addr] * 4);
623
/* get the sr list that this dst_addr belongs to */
624
sr = devc->sr_list[dst_addr];
626
/* mark dst as no longer routed */
627
SetBit ((unsigned int *) &devc->dst_routed, dst_addr, 0);
629
/* remove the dst from the sr_list then check to see if this was the */
630
/* last route in the list. if so, disable wtd for this sample rate */
631
devc->sr_list[dst_addr] = 0x1f; /*~('b0); */
633
/* find out what's linked to us so we can reroute it. if we are the */
634
/* tail, this will be NULL and will get relinked as such */
635
data = V2ReadReg (devc, ram_dst_addr);
637
/* now update the list by writing what was linked to us to where we */
638
/* were once at in the list */
639
V2WriteReg (devc, ram_rtd_addr, data);
641
/* update the devc->dst_index for this reroute */
642
/* devc->dst_index[data[6:0]] = devc->dst_index[dst_addr]; */
643
devc->dst_index[data & 0x7f] = devc->dst_index[dst_addr];
645
/* Invalidate the now deleted route. Data for dst_addr = 7e; */
646
/* NOTE: the adbarb_monitor needs this write to track properly! */
647
V2WriteReg (devc, ram_dst_addr, 0xfffffffe);
649
/* if we are removing the tail, reset the tail pointer */
650
if (devc->tail_index[sr] == dst_addr)
652
devc->tail_index[sr] = devc->dst_index[dst_addr];
655
/* clean up all data elements used to track this dst_addr */
656
/* XXX check field size below */
657
devc->dst_index[dst_addr] = 0x7f; /* ~('b0); */
661
EnableCodecChannel (vortex_devc * devc, unsigned char channel)
665
data = V2ReadReg (devc, channel_enable_reg_addr);
666
data = data | (1 << (8 + channel)); /*(1'b1 << (8+channel)); */
667
V2WriteReg (devc, channel_enable_reg_addr, data);
671
DisableCodecChannel (vortex_devc * devc, unsigned char channel)
675
data = V2ReadReg (devc, channel_enable_reg_addr);
676
data = data & ~(1 << (8 + channel)); /*~(1'b1 << (8+channel)); */
677
V2WriteReg (devc, channel_enable_reg_addr, data);
681
EnableAdbWtd (vortex_devc * devc, int sr)
685
dwData = V2ReadReg (devc, adbarb_sr_active_addr);
687
V2WriteReg (devc, adbarb_sr_active_addr, dwData);
688
devc->sr_active |= (1 << sr);
692
DisableAdbWtd (vortex_devc * devc, int sr)
696
dwData = V2ReadReg (devc, adbarb_sr_active_addr);
697
dwData &= ~(1 << sr);
698
V2WriteReg (devc, adbarb_sr_active_addr, dwData);
699
devc->sr_active &= ~(1 << sr);
703
V2SetupRoutes (vortex_devc * devc)
706
/* Add the record routes */
707
add_route (devc, 17, codec_chan0_src_addr, fifo_chan2_dst_addr, 0);
708
add_route (devc, 17, codec_chan1_src_addr, fifo_chan3_dst_addr, 0);
709
add_route (devc, 17, codec_chan0_src_addr, fifo_chan2a_dst_addr, 0);
710
add_route (devc, 17, codec_chan1_src_addr, fifo_chan3a_dst_addr, 0);
712
/* Add the playback routes */
713
add_route (devc, 17, fifo_chan0_src_addr, codec_chan0_dst_addr, 0);
714
add_route (devc, 17, fifo_chan0_src_addr, codec_chan1_dst_addr, 0);
718
init_fifos (vortex_devc * devc)
720
/* Frequency to use. 1..256 which translates to nFreq/48000 */
721
/* if 0 then use 12 for left and 24 for right. */
724
/* nFreq -- frequency to use. */
730
/* Zero Out all the FIFO Pointers, WT(64) & VDB(32) */
731
for (i = 0; i < 96; i++)
733
V2WriteReg (devc, devc->fifo_base + 0x6000 + (4 * i), 0x00000020);
735
/* Program Channels 2,3,4,5 as record channels */
736
for (i = 2; i < 6; i++)
738
V2WriteReg (devc, devc->fifo_base + 0x6100 + (4 * i), 0x00000000);
740
/* Set Trigger Levels */
741
V2WriteReg (devc, devc->fifo_base + 0x7008, 0x00000843);
744
/* Clear out FIFO data for channels 0-9 */
745
for (i = 0; i < 10; i++)
746
ClearDataFifo (devc, i);
748
/* Set up the DMA engine to grab DMA memory */
749
V2WriteReg (devc, devc->dma_base + 0xa80, 0); /* Clear Dma Status0 */
750
V2WriteReg (devc, devc->dma_base + 0xa84, 0); /* Clear Dma Status1 */
751
V2WriteReg (devc, devc->dma_base + 0xa88, 0); /* Clear Dma Status2 */
752
V2WriteReg (devc, devc->dma_base + 0xa8c, 0); /* Clear Dma Status3 */
753
V2WriteReg (devc, devc->dma_base + 0xa90, 0); /* Clear Dma Status4 */
754
V2WriteReg (devc, devc->dma_base + 0xa94, 0); /* Clear Dma Status5 */
759
v2setup_src (int dev)
761
vortex_portc *portc = audio_engines[dev]->portc;
762
vortex_devc *devc = audio_engines[dev]->devc;
766
for (j = 0; j < 2; j++)
768
unsigned int tmp, ratio, link;
769
chn = portc->voice_chn + j;
771
for (i = 0; i < 128; i += 4)
772
V2WriteReg (devc, src_input_fifo_base + (128 * chn) + i, 0);
773
for (i = 0; i < 8; i += 4)
774
V2WriteReg (devc, src_output_fifo_base + (chn * 8) + i, 0);
776
ratio = 48000 / portc->speed;
778
tmp |= chn & 0xf; /* Correlated channel */
780
tmp |= ((17 - ratio - 1) << 4);
782
tmp |= (12 << 4); /* Zero crossing */
783
V2WriteReg (devc, src_ch_params_base + 0xe00 + 4 * chn, tmp); /* [0] */
785
ratio = (48000 << 14) / portc->speed;
786
V2WriteReg (devc, src_ch_params_base + 0xe40 * 4 * chn, ratio); /* [1] */
788
V2WriteReg (devc, src_ch_params_base + 0xe80 + 4 * chn, 0); /* [2] */
789
V2WriteReg (devc, src_ch_params_base + 0xec0 + 4 * chn, 0); /* [3] */
790
V2WriteReg (devc, src_ch_params_base + 0xf00 + 4 * chn, 0); /* [4] */
791
V2WriteReg (devc, src_ch_params_base + 0xf40 + 4 * chn, 1); /* [5] */
793
ratio = 48000 / portc->speed;
794
tmp = 0x3000f; /* Throttle in, FIFO depth=15 */
795
V2WriteReg (devc, src_ch_params_base + 0xf80 + 4 * chn, tmp); /* [6] */
797
link = V2ReadReg (devc, src_sr_header_base + 0);
798
V2WriteReg (devc, src_next_ch_base + chn * 4, link);
799
V2WriteReg (devc, src_sr_header_base + 0, 0x10 | chn);
801
link = V2ReadReg (devc, src_throttle_source);
803
V2WriteReg (devc, src_throttle_source, link);
805
link = V2ReadReg (devc, src_active_sample_rate);
807
V2WriteReg (devc, src_active_sample_rate, link);
813
v2cleanup_src (int dev)
815
vortex_portc *portc = audio_engines[dev]->portc;
816
vortex_devc *devc = audio_engines[dev]->devc;
820
for (j = 0; j < 2; j++)
824
chn = portc->voice_chn + j;
826
for (i = 0; i < 128; i += 4)
827
V2WriteReg (devc, src_input_fifo_base + (128 * chn) + i, 0);
828
for (i = 0; i < 8; i += 4)
829
V2WriteReg (devc, src_output_fifo_base + (chn * 8) + i, 0);
830
V2WriteReg (devc, src_next_ch_base + chn * 4, 0);
831
V2WriteReg (devc, src_sr_header_base + 0, 0);
833
link = V2ReadReg (devc, src_active_sample_rate);
835
V2WriteReg (devc, src_active_sample_rate, link);
841
/********************************************************
842
* Vortex2 MIDI Routines *
843
********************************************************/
846
vortex2_midi_open (int dev, int mode, oss_midi_inputbyte_t inputbyte,
847
oss_midi_inputbuf_t inputbuf,
848
oss_midi_outputintr_t outputintr)
850
vortex_devc *devc = (vortex_devc *) midi_devs[dev]->devc;
852
if (devc->midi_opened)
857
devc->midi_input_intr = inputbyte;
858
devc->midi_opened = mode;
860
if (mode & OPEN_READ)
862
int tmp = V2ReadReg (devc, ICR);
863
V2WriteReg (devc, ICR, tmp | MIDIRQST); /* Enable MIDI interrupts */
864
tmp = V2ReadReg (devc, ICR);
867
V2WriteReg (devc, MIDICMD, 0x000000ff); /* Reset MIDI */
868
V2WriteReg (devc, MIDICMD, 0x0000003f); /* Enter UART mode */
869
if ((V2ReadReg (devc, MIDIDAT) & 0xff) != 0xfe)
870
cmn_err (CE_NOTE, "MIDI init not acknowledged\n");
876
vortex2_midi_close (int dev, int mode)
878
vortex_devc *devc = (vortex_devc *) midi_devs[dev]->devc;
880
int tmp = V2ReadReg (devc, ICR);
881
V2WriteReg (devc, ICR, tmp & ~MIDIRQST); /* Disable MIDI interrupts */
882
V2WriteReg (devc, MIDICMD, 0x000000ff); /* Reset MIDI */
884
devc->midi_opened = 0;
888
vortex2_midi_out (int dev, unsigned char midi_byte)
891
vortex_devc *devc = (vortex_devc *) midi_devs[dev]->devc;
893
while ((V2ReadReg (devc, MIDISTAT) & CMDOK) && n--);
894
if (V2ReadReg (devc, MIDISTAT) & CMDOK)
896
V2WriteReg (devc, MIDIDAT, midi_byte);
902
vortex2_midi_ioctl (int dev, unsigned cmd, ioctl_arg arg)
907
static midi_driver_t vortex2_midi_driver = {
915
vortex2_midi_init (vortex_devc * devc)
917
/* Derive the MIDI baud rate from 49.152 MHz clock */
918
V2WriteReg (devc, GAMECTL, 0x00006100);
919
V2WriteReg (devc, MIDICMD, 0x000000ff); /* Reset MIDI */
920
V2WriteReg (devc, MIDICMD, 0x0000003f); /* Enter UART mode */
922
/* All commands should return 0xfe as an acknowledgement */
923
if ((V2ReadReg (devc, MIDIDAT) & 0xff) != 0xfe)
924
cmn_err (CE_NOTE, "MIDI init not acknowledged\n");
925
V2WriteReg (devc, MIDICMD, 0x000000ff); /* Reset MIDI */
928
/****************************************************
929
* OSS Audio routines *
930
****************************************************/
933
ac97_read (void *devc_, int addr)
935
vortex_devc *devc = devc_;
937
oss_native_word flags;
939
MUTEX_ENTER_IRQDISABLE (devc->low_mutex, flags);
940
V2ReadCodecRegister (devc, addr, &data);
941
MUTEX_EXIT_IRQRESTORE (devc->low_mutex, flags);
942
return data & 0xffff;
946
ac97_write (void *devc_, int addr, int data)
948
vortex_devc *devc = devc_;
949
oss_native_word flags;
951
MUTEX_ENTER_IRQDISABLE (devc->low_mutex, flags);
952
V2WriteCodecCommand (devc, addr, data);
953
MUTEX_EXIT_IRQRESTORE (devc->low_mutex, flags);
958
vortex2intr (oss_device_t * osdev)
960
vortex_devc *devc = (vortex_devc *) osdev->devc;
966
* TODO: Fix mutexes and move the inputintr/outputintr calls outside the
969
/* MUTEX_ENTER (devc->mutex, flags); */
970
status = V2ReadReg (devc, ISR);
972
if (status & MFATERRST)
973
cmn_err (CE_WARN, "Aureal Master fatal error interrupt\n");
975
if (status & MPARERRST)
976
cmn_err (CE_WARN, "Aureal Master parity error interrupt\n");
978
if (status & TIMIRQST) /* Timer interrupt */
980
V2ReadReg (devc, CODSMPLTMR); /* Clear the interrupt */
981
V2WriteReg (devc, CODSMPLTMR, 0x1000);
985
if (status & (DMAENDIRQST | DMABERRST)) /* DMA end interrupt */
987
for (i = 0; i < MAX_PORTC; i++)
989
vortex_portc *portc = &devc->portc[i];
991
if (portc->trigger_bits & PCM_ENABLE_OUTPUT)
993
dmap_t *dmap = audio_engines[portc->audiodev]->dmap_out;
996
unsigned int dmastat;
998
dmastat = V2ReadReg (devc, devc->dma_base + 0xd00 + (64 * 4));
999
pos = ((dmastat >> 12) & 0x03) * 4096 + (dmastat & 4095);
1000
pos /= dmap->fragment_size;
1001
if (pos < 0 || pos >= dmap->nfrags)
1005
while (dmap_get_qhead (dmap) != pos && n++ < dmap->nfrags)
1006
oss_audio_outputintr (portc->audiodev, 0);
1009
if (portc->trigger_bits & PCM_ENABLE_INPUT)
1011
dmap_t *dmap = audio_engines[portc->audiodev]->dmap_in;
1014
unsigned int dmastat;
1016
dmastat = V2ReadReg (devc, devc->dma_base + 0xd08 + (64 * 4));
1018
pos = ((dmastat >> 12) & 0x03) * 4096 + (dmastat & 4095);
1019
pos /= dmap->fragment_size;
1020
if (pos < 0 || pos >= dmap->nfrags)
1024
while (dmap_get_qtail (dmap) != pos && n++ < dmap->nfrags)
1025
oss_audio_inputintr (portc->audiodev, 0);
1027
V2ReadReg (devc, devc->dma_base + 0xa80); /* Read Dma Status0 */
1028
V2ReadReg (devc, devc->dma_base + 0xa84); /* Read Dma Status1 */
1029
V2ReadReg (devc, devc->dma_base + 0xa88); /* Read Dma Status2 */
1030
V2ReadReg (devc, devc->dma_base + 0xa8c); /* Read Dma Status3 */
1031
V2ReadReg (devc, devc->dma_base + 0xa90); /* Read Dma Status4 */
1032
V2ReadReg (devc, devc->dma_base + 0xa94); /* Read Dma Status5 */
1037
if (status & MIDIRQST) /* MIDI interrupt */
1039
int uart_stat = V2ReadReg (devc, MIDISTAT);
1042
while (!(uart_stat & MIDIVAL) && n--)
1045
d = V2ReadReg (devc, MIDIDAT) & 0xff;
1047
if (devc->midi_opened & OPEN_READ && devc->midi_input_intr)
1048
devc->midi_input_intr (devc->midi_dev, d);
1049
uart_stat = V2ReadReg (devc, MIDISTAT);
1056
V2WriteReg (devc, ISR, status & 0x7ff); /* Ack pulse interrupts */
1057
status = V2ReadReg (devc, ISR);
1060
/* MUTEX_EXIT (devc->mutex, flags); */
1066
vortex2_set_rate (int dev, int arg)
1068
vortex_portc *portc = audio_engines[dev]->portc;
1071
return portc->speed;
1073
if (audio_engines[dev]->flags & ADEV_FIXEDRATE)
1081
return portc->speed;
1085
vortex2_set_channels (int dev, short arg)
1087
vortex_portc *portc = audio_engines[dev]->portc;
1089
if (audio_engines[dev]->flags & ADEV_STEREOONLY)
1092
if ((arg != 1) && (arg != 2))
1093
return portc->channels;
1094
portc->channels = arg;
1096
return portc->channels;
1100
vortex2_set_format (int dev, unsigned int arg)
1102
vortex_portc *portc = audio_engines[dev]->portc;
1104
if (audio_engines[dev]->flags & ADEV_16BITONLY)
1107
if (!(arg & (AFMT_U8 | AFMT_S16_LE)))
1116
vortex2_ioctl (int dev, unsigned int cmd, ioctl_arg arg)
1121
static void vortex2_trigger (int dev, int state);
1124
vortex2_reset (int dev)
1126
vortex2_trigger (dev, 0);
1129
v2cleanup_src (dev);
1130
del_route (devc, src_chan0_src_addr, 0);
1131
del_route (devc, src_chan1_src_addr, 0);
1132
del_route (devc, src_chan0_dst_addr, 0);
1133
del_route (devc, src_chan1_dst_addr, 0);
1137
del_route (devc, spdif_chan0_dst_addr, 0);
1138
del_route (devc, spdif_chan1_dst_addr, 0);
1143
vortex2_reset_input (int dev)
1145
vortex_portc *portc = audio_engines[dev]->portc;
1146
vortex2_trigger (dev, portc->trigger_bits & ~PCM_ENABLE_INPUT);
1150
vortex2_reset_output (int dev)
1152
vortex_portc *portc = audio_engines[dev]->portc;
1153
vortex2_trigger (dev, portc->trigger_bits & ~PCM_ENABLE_OUTPUT);
1158
vortex2_open (int dev, int mode, int open_flags)
1160
oss_native_word flags;
1161
vortex_portc *portc = audio_engines[dev]->portc;
1162
vortex_devc *devc = audio_engines[dev]->devc;
1164
MUTEX_ENTER_IRQDISABLE (devc->mutex, flags);
1165
if (portc->open_mode)
1167
MUTEX_EXIT_IRQRESTORE (devc->mutex, flags);
1171
if (devc->open_mode & mode)
1173
MUTEX_EXIT_IRQRESTORE (devc->mutex, flags);
1177
devc->open_mode |= mode;
1179
portc->open_mode = mode;
1180
portc->audio_enabled &= ~mode;
1182
MUTEX_EXIT_IRQRESTORE (devc->mutex, flags);
1187
vortex2_close (int dev, int mode)
1189
vortex_portc *portc = audio_engines[dev]->portc;
1190
vortex_devc *devc = audio_engines[dev]->devc;
1192
vortex2_reset (dev);
1193
portc->open_mode = 0;
1194
devc->open_mode &= ~mode;
1195
portc->audio_enabled = ~mode;
1200
vortex2_output_block (int dev, oss_native_word buf, int count, int fragsize,
1203
vortex_portc *portc = audio_engines[dev]->portc;
1205
portc->audio_enabled |= PCM_ENABLE_OUTPUT;
1206
portc->trigger_bits &= ~PCM_ENABLE_OUTPUT;
1211
vortex2_start_input (int dev, oss_native_word buf, int count, int fragsize,
1214
vortex_portc *portc = audio_engines[dev]->portc;
1216
portc->audio_enabled |= PCM_ENABLE_INPUT;
1217
portc->trigger_bits &= ~PCM_ENABLE_INPUT;
1221
vortex2_trigger (int dev, int state)
1223
vortex_devc *devc = audio_engines[dev]->devc;
1224
vortex_portc *portc = audio_engines[dev]->portc;
1225
unsigned int fifo_mode;
1226
oss_native_word flags;
1228
MUTEX_ENTER_IRQDISABLE (devc->mutex, flags);
1230
if (portc->open_mode & OPEN_WRITE)
1232
if (state & PCM_ENABLE_OUTPUT)
1234
if ((portc->audio_enabled & PCM_ENABLE_OUTPUT) &&
1235
!(portc->trigger_bits & PCM_ENABLE_OUTPUT))
1237
/* Start the fifos */
1238
fifo_mode = 0xc0030;
1239
if (portc->channels == 2)
1242
V2WriteReg (devc, devc->fifo_base + 0x6100, fifo_mode);
1246
V2WriteReg (devc, devc->fifo_base + 0x6100, fifo_mode);
1247
V2WriteReg (devc, devc->fifo_base + 0x6104, fifo_mode);
1249
V2WriteReg (devc, CODSMPLTMR, 0x1000); /* start timer */
1250
portc->trigger_bits |= PCM_ENABLE_OUTPUT;
1255
if ((portc->audio_enabled & PCM_ENABLE_OUTPUT) &&
1256
(portc->trigger_bits & PCM_ENABLE_OUTPUT))
1258
portc->trigger_bits &= ~PCM_ENABLE_OUTPUT;
1259
portc->audio_enabled &= ~PCM_ENABLE_OUTPUT;
1261
V2WriteReg (devc, CODSMPLTMR, 0x0); /* stop timer */
1263
V2WriteReg (devc, devc->fifo_base + 0x6100, 0); /* Left Play */
1264
V2WriteReg (devc, devc->fifo_base + 0x6104, 0); /* Right Play */
1266
ClearDataFifo (devc, 0);
1267
ClearDataFifo (devc, 1);
1272
if (portc->open_mode & OPEN_READ)
1274
if (state & PCM_ENABLE_INPUT)
1276
if ((portc->audio_enabled & PCM_ENABLE_INPUT) &&
1277
!(portc->trigger_bits & PCM_ENABLE_INPUT))
1279
/* Start the fifos */
1280
fifo_mode = 0xc0010;
1281
if (portc->channels == 2)
1283
V2WriteReg (devc, devc->fifo_base + 0x6108, fifo_mode); /* LRecord */
1284
V2WriteReg (devc, devc->fifo_base + 0x610c, fifo_mode); /* RRecord */
1285
V2WriteReg (devc, CODSMPLTMR, 0x1000); /* start timer */
1286
portc->trigger_bits |= PCM_ENABLE_INPUT;
1291
if ((portc->audio_enabled & PCM_ENABLE_INPUT) &&
1292
(portc->trigger_bits & PCM_ENABLE_INPUT))
1294
portc->trigger_bits &= ~PCM_ENABLE_INPUT;
1295
portc->audio_enabled &= ~PCM_ENABLE_INPUT;
1297
V2WriteReg (devc, CODSMPLTMR, 0x0); /* stop timer */
1299
V2WriteReg (devc, devc->fifo_base + 0x6108, 0); /* LRecord */
1300
V2WriteReg (devc, devc->fifo_base + 0x610c, 0); /* RRecord */
1302
ClearDataFifo (devc, 2);
1303
ClearDataFifo (devc, 3);
1307
MUTEX_EXIT_IRQRESTORE (devc->mutex, flags);
1312
vortex2_prepare_for_input (int dev, int bsize, int bcount)
1314
unsigned int nBufSize, ChSizeGotoReg0, ChSizeGotoReg1;
1315
unsigned int ch_mode, dma_base, dma_base4, dma_base8;
1317
dmap_t *dmap = audio_engines[dev]->dmap_in;
1318
vortex_devc *devc = audio_engines[dev]->devc;
1319
vortex_portc *portc = audio_engines[dev]->portc;
1320
unsigned int SAMPLES = 1024;
1321
oss_native_word flags;
1323
MUTEX_ENTER_IRQDISABLE (devc->mutex, flags);
1329
/* Add the routes */
1330
add_route (devc, 17, codec_chan0_src_addr, src_chan0_dst_addr, 0);
1331
add_route (devc, 17, codec_chan1_src_addr, src_chan1_dst_addr, 0);
1332
add_route (devc, 1, src_chan0_src_addr, fifo_chan2_dst_addr, 0);
1333
add_route (devc, 1, src_chan1_src_addr, fifo_chan3_dst_addr, 0);
1336
nBufSize = (SAMPLES * 2 * 2) - 1;
1338
ch_mode = 0x00001000;
1339
switch (portc->bits)
1342
ch_mode |= 0x00004000;
1345
ch_mode |= 0x00020000;
1349
dma_base = devc->dma_base + 16 * portc->voice_chn;
1350
dma_base8 = devc->dma_base + 8 * portc->voice_chn;
1351
dma_base4 = devc->dma_base + 4 * portc->voice_chn;
1353
/* Left Record Channel VDB ch2 */
1354
V2WriteReg (devc, dma_base + 0x420, dmap->dmabuf_phys);
1355
V2WriteReg (devc, dma_base + 0x424, dmap->dmabuf_phys + 4096);
1356
V2WriteReg (devc, dma_base + 0x428, dmap->dmabuf_phys + 2 * 4096);
1357
V2WriteReg (devc, dma_base + 0x42c, dmap->dmabuf_phys + 3 * 4096);
1359
ChSizeGotoReg0 = (0xde000000) | (nBufSize << 12) | (nBufSize);
1360
ChSizeGotoReg1 = (0xfc000000) | (nBufSize << 12) | (nBufSize);
1362
V2WriteReg (devc, dma_base8 + 0x810, ChSizeGotoReg0);
1363
V2WriteReg (devc, dma_base8 + 0x814, ChSizeGotoReg1);
1364
V2WriteReg (devc, dma_base4 + 0xa08, ch_mode);
1366
/* Right Record Channel VDB ch3 */
1367
V2WriteReg (devc, dma_base + 0x430, dmap->dmabuf_phys);
1368
V2WriteReg (devc, dma_base + 0x434, dmap->dmabuf_phys + 4096);
1369
V2WriteReg (devc, dma_base + 0x438, dmap->dmabuf_phys + 2 * 4096);
1370
V2WriteReg (devc, dma_base + 0x43c, dmap->dmabuf_phys + 3 * 4096);
1372
ChSizeGotoReg0 = (0x56000000) | (nBufSize << 12) | (nBufSize);
1373
ChSizeGotoReg0 = (0x74000000) | (nBufSize << 12) | (nBufSize);
1374
V2WriteReg (devc, dma_base8 + 0x818, ChSizeGotoReg0);
1375
V2WriteReg (devc, dma_base8 + 0x81c, ChSizeGotoReg1);
1376
V2WriteReg (devc, dma_base4 + 0xa0c, ch_mode);
1378
portc->audio_enabled &= ~PCM_ENABLE_INPUT;
1379
portc->trigger_bits &= ~PCM_ENABLE_INPUT;
1381
MUTEX_EXIT_IRQRESTORE (devc->mutex, flags);
1387
vortex2_prepare_for_output (int dev, int bsize, int bcount)
1389
unsigned int nBufSize, ChSizeGotoReg0, ChSizeGotoReg1;
1390
unsigned int ch_mode, dma_base, dma_base4, dma_base8;
1392
dmap_t *dmap = audio_engines[dev]->dmap_out;
1393
vortex_devc *devc = audio_engines[dev]->devc;
1394
vortex_portc *portc = audio_engines[dev]->portc;
1395
unsigned int SAMPLES = 1024;
1396
oss_native_word flags;
1398
MUTEX_ENTER_IRQDISABLE (devc->mutex, flags);
1401
add_route (devc, 17, fifo_chan0_src_addr, src_chan0_dst_addr, 0);
1402
add_route (devc, 17, fifo_chan1_src_addr, src_chan1_dst_addr, 0);
1403
add_route (devc, 1, src_chan0_src_addr, codec_chan0_dst_addr, 0);
1404
add_route (devc, 1, src_chan1_src_addr, codec_chan1_dst_addr, 0);
1407
nBufSize = (SAMPLES * 2 * 2) - 1;
1409
ch_mode = 0x00003000;
1410
switch (portc->bits)
1413
ch_mode |= 0x00004000;
1417
ch_mode |= 0x00020000;
1421
dma_base = devc->dma_base + 16 * portc->voice_chn;
1422
dma_base8 = devc->dma_base + 8 * portc->voice_chn;
1423
dma_base4 = devc->dma_base + 4 * portc->voice_chn;
1425
/* Left Playback Channel #0 */
1426
V2WriteReg (devc, dma_base + 0x400, dmap->dmabuf_phys);
1427
V2WriteReg (devc, dma_base + 0x404, dmap->dmabuf_phys + 4096);
1428
V2WriteReg (devc, dma_base + 0x408, dmap->dmabuf_phys + 2 * 4096);
1429
V2WriteReg (devc, dma_base + 0x40c, dmap->dmabuf_phys + 3 * 4096);
1431
ChSizeGotoReg0 = (0xde000000) | (nBufSize << 12) | (nBufSize);
1432
ChSizeGotoReg1 = (0xfc000000) | (nBufSize << 12) | (nBufSize);
1433
V2WriteReg (devc, dma_base8 + 0x800, ChSizeGotoReg0);
1434
V2WriteReg (devc, dma_base8 + 0x804, ChSizeGotoReg1);
1435
V2WriteReg (devc, dma_base4 + 0xa00, ch_mode); /* Set Chan0 Mode */
1437
/* Right Playback Channel #1 */
1438
V2WriteReg (devc, dma_base + 0x410, dmap->dmabuf_phys);
1439
V2WriteReg (devc, dma_base + 0x414, dmap->dmabuf_phys + 4096);
1440
V2WriteReg (devc, dma_base + 0x418, dmap->dmabuf_phys + 2 * 4096);
1441
V2WriteReg (devc, dma_base + 0x41c, dmap->dmabuf_phys + 3 * 4096);
1442
ChSizeGotoReg0 = (0x56000000) | (nBufSize << 12) | (nBufSize);
1443
ChSizeGotoReg1 = (0x74000000) | (nBufSize << 12) | (nBufSize);
1444
V2WriteReg (devc, dma_base8 + 0x808, ChSizeGotoReg0);
1445
V2WriteReg (devc, dma_base8 + 0x80c, ChSizeGotoReg1);
1446
V2WriteReg (devc, dma_base4 + 0xa04, ch_mode); /* Set Chan1 Mode */
1448
portc->audio_enabled &= ~PCM_ENABLE_OUTPUT;
1449
portc->trigger_bits &= ~PCM_ENABLE_OUTPUT;
1451
MUTEX_EXIT_IRQRESTORE (devc->mutex, flags);
1457
vortex2_free_buffer (int dev, dmap_t * dmap, int direction)
1459
vortex_devc *devc = audio_engines[dev]->devc;
1461
if (dmap->dmabuf == NULL)
1464
CONTIG_FREE (devc->osdev, dmap->dmabuf, dmap->buffsize, TODO);
1466
oss_unreserve_pages ((oss_native_word) dmap->dmabuf,
1467
(oss_native_word) dmap->dmabuf + 4 * 4096 - 1);
1471
dmap->buffsize = devc->origbufsize;
1472
oss_free_dmabuf (dev, dmap);
1475
dmap->dmabuf = NULL;
1481
vortex2_alloc_buffer (int dev, dmap_t * dmap, int direction)
1483
vortex_devc *devc = audio_engines[dev]->devc;
1484
oss_native_word phaddr;
1487
if (dmap->dmabuf != NULL)
1490
dmap->buffsize = 4 * 4096; /* 4 subbuffers */
1492
CONTIG_MALLOC (devc->osdev, dmap->buffsize, MEMLIMIT_32BITS, &phaddr, TODO);
1493
dmap->dmabuf_phys = phaddr;
1495
oss_reserve_pages ((oss_native_word) dmap->dmabuf,
1496
(oss_native_word) dmap->dmabuf + 4 * 4096 - 1);
1499
if ((err = oss_alloc_dmabuf (dev, dmap, direction)) < 0)
1501
devc->origbufsize = dmap->buffsize;
1502
dmap->buffsize = 4 * 4096;
1510
vortex2_get_buffer_pointer (int dev, dmap_t * dmap, int direction)
1512
vortex_devc *devc = audio_engines[dev]->devc;
1513
oss_native_word flags, dmastat = 0;
1516
MUTEX_ENTER_IRQDISABLE (devc->low_mutex, flags);
1517
if (direction == PCM_ENABLE_OUTPUT)
1519
dmastat = V2ReadReg (devc, devc->dma_base + 0xd00 + (64 * 4));
1521
if (direction == PCM_ENABLE_INPUT)
1523
dmastat = V2ReadReg (devc, devc->dma_base + 0xd08 + (64 * 4));
1525
ptr = ((dmastat >> 12) & 0x03) * 4096 + (dmastat & 4095);
1526
MUTEX_EXIT_IRQRESTORE (devc->low_mutex, flags);
1530
static audiodrv_t vortex2_driver = {
1533
vortex2_output_block,
1534
vortex2_start_input,
1536
vortex2_prepare_for_input,
1537
vortex2_prepare_for_output,
1541
vortex2_reset_input,
1542
vortex2_reset_output,
1546
vortex2_set_channels,
1549
NULL, /* vortex2_check_input, */
1550
NULL, /* vortex2_check_output, */
1551
vortex2_alloc_buffer,
1552
vortex2_free_buffer,
1555
vortex2_get_buffer_pointer
1560
V2EnableSpdif (vortex_devc * devc)
1562
unsigned short data;
1565
for (n = 0; n <= 11; n++)
1567
V2WriteReg (devc, spdif_ch_status_reg_base + (0x0004 * n), 0x0);
1570
V2WriteReg (devc, spdif_ch_status_reg_base, spdif_ch_status_reg0); /* first 4 bytes of channel status word */
1572
V2WriteReg (devc, spdif_ctrl_reg, spdif_cfg_dword); /* set port to enable crc, input clock */
1574
data = V2ReadReg (devc, channel_enable_reg_addr);
1575
data = data | (1 << (18)); /* set bits 18 and 19 to enable S/PDIF; */
1576
data = data | (1 << (19)); /* set bits 18 and 19 to enable S/PDIF; */
1577
V2WriteReg (devc, channel_enable_reg_addr, data);
1582
attach_channel_vortex2 (vortex_devc * devc, int my_mixer)
1588
for (i = 0; i < MAX_PORTC; i++)
1591
vortex_portc *portc = &devc->portc[i];
1593
ADEV_FIXEDRATE | ADEV_AUTOMODE | ADEV_STEREOONLY | ADEV_16BITONLY;
1595
sprintf (tmp_name, "Aureal Vortex 2 (%s)", devc->name);
1598
strcpy (tmp_name, devc->name);
1599
caps |= ADEV_DUPLEX;
1603
sprintf (tmp_name, "%s (shadow)", devc->name);
1604
caps |= ADEV_DUPLEX | ADEV_SHADOW;
1607
if ((adev = oss_install_audiodev (OSS_AUDIO_DRIVER_VERSION,
1612
sizeof (audiodrv_t),
1614
AFMT_U8 | AFMT_S16_LE, devc, -1)) < 0)
1623
audio_engines[adev]->portc = portc;
1624
audio_engines[adev]->rate_source = first_dev;
1625
audio_engines[adev]->fixed_rate = 48000;
1626
audio_engines[adev]->min_rate = 48000;
1627
audio_engines[adev]->max_rate = 48000;
1628
audio_engines[adev]->vmix_flags = VMIX_MULTIFRAG;
1630
audio_engines[adev]->min_block = 4096;
1631
audio_engines[adev]->max_block = 4096;
1633
audio_engines[adev]->mixer_dev = my_mixer;
1634
portc->voice_chn = 0;
1635
portc->open_mode = 0;
1636
portc->audiodev = adev;
1637
portc->audio_enabled = 0;
1638
#ifdef CONFIG_OSS_VMIX
1640
vmix_attach_audiodev(devc->osdev, adev, -1, 0);
1648
init_vortex2 (vortex_devc * devc, int is_mx300)
1653
devc->global_base = (0x2a000);
1654
devc->dma_base = (0x27000);
1655
devc->midi_base = (0x28800);
1656
devc->fifo_base = (0x10000);
1657
devc->adbarb_block_base = (0x28000);
1658
devc->serial_block_base = (0x29000);
1659
devc->parallel_base = (0x22000);
1660
devc->src_base = (0x26000);
1665
V2WriteReg (devc, GCR, 0xffffffff);
1668
V2WriteReg (devc, GCR, V2ReadReg (devc, GCR) | GIRQEN); /* Enable IRQ */
1669
V2WriteReg (devc, CODSMPLTMR, 0x0);
1670
V2WriteReg (devc, ICR, DMAENDIRQST | DMABERRST | TIMIRQST);
1677
temp = V2ReadReg (devc, pif_gpio_control);
1678
temp = 0x0c0 | temp; /* set GPIO3 to stereo 2x mode */
1679
temp = 0x080 | temp; /* enable GPIO3 */
1680
temp = 0xffffffbf & temp; /* set GPIO3 to low quad mode */
1681
V2WriteReg (devc, pif_gpio_control, temp);
1685
V2SetupCodec (devc);
1687
EnableCodecChannel (devc, 0);
1688
EnableCodecChannel (devc, 1);
1690
EnableAdbWtd (devc, 17);
1691
V2SetupRoutes (devc);
1699
* DMA controller memory is supposed to contain 0xdeadbeef after
1702
if (V2ReadReg (devc, devc->dma_base + 0xcfc) != 0xdeadbeef)
1704
"DMA memory check returned unexpected result %08x\n",
1705
V2ReadReg (devc, devc->dma_base + 0xcfc));
1708
ac97_install (&devc->ac97devc, "Vortex2 AC97 Mixer", ac97_read,
1709
ac97_write, devc, devc->osdev);
1712
devc->mixer_dev = my_mixer;
1718
for (i = 0; i < 2; i++)
1719
devc->dst_routed[i] = 0;
1721
attach_channel_vortex2 (devc, my_mixer);
1724
oss_install_mididev (OSS_MIDI_DRIVER_VERSION, "VORTEX",
1725
"Aureal Vortex2 UART", &vortex2_midi_driver,
1726
sizeof (midi_driver_t),
1727
/*&std_midi_synth, */ NULL,
1728
0, devc, devc->osdev);
1729
vortex2_midi_init (devc);
1730
devc->midi_opened = 0;
1735
unload_vortex2 (oss_device_t * osdev)
1737
vortex_devc *devc = (vortex_devc *) osdev->devc;
1740
V2DisableSrc (devc);
1742
DisableCodecChannel (devc, 0);
1743
DisableCodecChannel (devc, 1);
1744
DisableAdbWtd (devc, 17);
1746
/* Disable routes */
1747
del_route (devc, codec_chan0_dst_addr, 0);
1748
del_route (devc, codec_chan1_dst_addr, 0);
1749
del_route (devc, fifo_chan2_dst_addr, 0);
1750
del_route (devc, fifo_chan3_dst_addr, 0);
1751
del_route (devc, fifo_chan2a_dst_addr, 0);
1752
del_route (devc, fifo_chan3a_dst_addr, 0);
1754
/* Disable all interrupts */
1755
V2WriteReg (devc, ICR, 0x00000000);