2
* allegro_util.inc -- ESS Technology allegro audio driver.
4
* Copyright (C) 1992-2000 Don Kim (don.kim@esstech.com)
8
#define DOCKF_DOCKED 0x00000001 /* Default Un-Docked */
9
#define DOCKF_DEST_CODEC2 0x00000008 /* Tells VxD CODEC2 active */
10
#define HW_INIT_SET_ACTIVE_ACRW 0x00000003 /* Sets the active AC Read/Write */
11
#define HW_INIT_SET_ACTIVE_ACINTF 0x00000004 /* ... AC Intf (Local or Remote) */
13
VOID CodecReset (void);
14
void Set2Use36Mhz (void);
15
void HWMGR_EnableRemoteCodec (allegro_devc * devc, BOOLEAN enable);
21
extern oss_device_t *allegro_osdev;
23
#define CODEC_TYPE_AC97 1
24
#define CODEC_TYPE_ESS 2
30
static unsigned char bChipType;
31
static unsigned char fRemoteCodec;
32
static unsigned char bCodec;
33
static unsigned char gbHwVolEnabled = TRUE;
34
static unsigned char bEapdSupportMode;
35
static unsigned int wEapdGPOPolarity_Port;
36
static unsigned char bEnable4Speaker;
37
BOOL IsAC3Format = FALSE;
38
BOOL g4Speaker = FALSE;
43
static WORD gwDockVal;
44
UCHAR bEnableDockDetect = TRUE;
45
UCHAR bDockingDetectGPIPort = 0; /* TODO: What is the right value */
46
static WORD wDockedMask;
47
static WORD wDockedValue;
48
UCHAR bMonoOutputSelect = 0;
49
static WORD gwDefaultMonoOutVol;
50
int bHwVolCtrlMode = -1;
52
#define NEC_VENDOR_ID3 0x80F11033
53
void HwRelease (allegro_devc * devc);
54
#define WriteLego HWMGR_WriteCodecData
55
PCLIENT_INST pClient_SPDIFIN = NULL;
56
BOOL fSPDIFOUT = FALSE;
61
dDbgOut (char *sz, ...)
66
vsprintf (buf, sz, va);
74
HwSetSystemParameter (allegro_devc * devc, DWORD dwValue)
76
switch (dwValue >> 16)
78
case HW_INIT_SET_ACTIVE_ACRW: /*3 */
80
dprintf1 (("ACRW %x", dwValue & DOCKF_DEST_CODEC2));
83
* Set the active AC out direction
85
if ((WORD) dwValue & DOCKF_DEST_CODEC2) /* In/Out AC2 */
86
HWMGR_EnableRemoteCodec (devc, TRUE);
88
HWMGR_EnableRemoteCodec (devc, FALSE);
92
case HW_INIT_SET_ACTIVE_ACINTF: /*4 */
96
dprintf1 (("ACINTF %x", dwValue));
97
if (!(dwValue & DOCKF_DOCKED)) /* Nothing there */
99
/* CODEC DAC I/F set to local only */
100
wTmp = inpw (devc->osdev, devc->base + 0x3a);
101
wTmp &= 0xFFF3; /* [3:2] = "00" */
102
outpw (devc->osdev, devc->base + 0x3a, wTmp);
104
/* CODEC ADC I/F set to local only */
105
wTmp = inpw (devc->osdev, devc->base + 0x3c);
106
wTmp &= 0xFFF3; /* [3:2] = "00" */
107
outpw (devc->osdev, devc->base + 0x3c, wTmp);
111
/* CODEC DAC I/F set to local + remote */
112
wTmp = inpw (devc->osdev, devc->base + 0x3a);
114
wTmp |= 0x000C; /* [3:2] = "11" */
115
outpw (devc->osdev, devc->base + 0x3a, wTmp);
117
/* CODEC ADC I/F set to remote AC2 (or both??) */
118
wTmp = inpw (devc->osdev, devc->base + 0x3c);
120
wTmp |= 0x000C; /* [3:2] = "11" */
121
outpw (devc->osdev, devc->base + 0x3c, wTmp);
129
PCIWrite (allegro_devc * devc, WORD address, ULONG value)
132
pci_write_config_dword (devc->osdev, address, value);
137
PCIRead (allegro_devc * devc, WORD address)
140
pci_read_config_dword (devc->osdev, address, &dw);
144
#ifdef DEBUGINTERFACE
146
dumpreg (WORD programid, WORD index, WORD value, WORD * out)
153
*out = inpw (devc->osdev, devc->base + index);
157
outpw (devc->osdev, devc->base + index, value);
161
HWMGR_ReadCodecData (devc, devc->osdev, index, out);
165
HWMGR_WriteCodecData (devc, (UCHAR) index, value);
169
index &= ~0x1; /* make sure it's even address */
170
dwData = PCIRead (devcv, index & ~0x3);
171
if ((index % 4) == 0)
172
*out = (WORD) dwData;
174
*out = (WORD) (dwData >> 16);
178
index &= ~0x1; /* make sure it's even address */
179
dwData = PCIRead (devc, index & ~0x3);
180
if ((index % 4) == 0)
188
dwData |= (value << 16);
190
PCIWrite (devc, (index & ~0x3), dwData);
194
#endif /* DEBUGINTERFACE */
197
DelayMillisec (int millisec)
201
millisec = millisec * 1000 / 50;
202
for (count = 0; count < millisec; count++)
203
KeStallExecutionProcessor (50);
204
} /* DelayMillisec */
206
/* -------------------------------------------------------------------------- */
209
HWMGR_ReadDataByte (allegro_devc * devc, UCHAR Index)
211
return READ_PORT_UCHAR (devc->osdev, devc->base + Index);
212
} /* HWMGR_ReadDataByte */
216
HWMGR_ReadDataWord (allegro_devc * devc, UCHAR Index)
218
return READ_PORT_USHORT (devc->osdev, devc->base + Index);
219
} /* HWMGR_ReadDataWord */
223
HWMGR_WriteDataByte (allegro_devc * devc, UCHAR Index, UCHAR Value)
225
WRITE_PORT_UCHAR (devc->osdev, devc->base + Index, Value);
226
} /* HWMGR_WriteDataByte */
230
HWMGR_WriteDataWord (allegro_devc * devc, UCHAR Index, USHORT Value)
232
WRITE_PORT_USHORT (devc->osdev, devc->base + Index, Value);
233
} /* HWMGR_WriteDataWord */
237
HWMGR_RestoreACLink (allegro_devc * devc)
243
USHORT wControl = HWMGR_ReadDataWord (devc, RING_BUS_CTRL_A);
245
HWMGR_WriteDataWord (devc, RING_BUS_CTRL_A, (USHORT) (wControl &
246
~SERIAL_AC_LINK_ENABLE));
247
KeStallExecutionProcessor (50);
248
HWMGR_WriteDataWord (devc, RING_BUS_CTRL_A, wControl);
250
wDataCodec = HWMGR_ReadDataWord (devc, RING_BUS_CTRL_B);
251
wDataIn = HWMGR_ReadDataWord (devc, SDO_IN_DEST_CTRL);
252
wDataOut = HWMGR_ReadDataWord (devc, SDO_OUT_DEST_CTRL);
254
HWMGR_WriteDataWord (devc, SDO_OUT_DEST_CTRL, (USHORT) (wDataOut &
256
HWMGR_WriteDataWord (devc, SDO_IN_DEST_CTRL, (USHORT) (wDataIn &
258
HWMGR_WriteDataWord (devc, RING_BUS_CTRL_B, (USHORT) (wDataCodec &
259
~SECOND_CODEC_ID_MASK));
261
/* power down DAC to resynchronize after AC-link change */
262
HWMGR_WriteDataWord (devc, CODEC_DATA, AC97_PR1);
263
HWMGR_WriteDataByte (devc, CODEC_COMMAND, AC97_POWER_DOWN_CTRL);
264
for (i = 0; i < 1000; i++)
265
if (!(HWMGR_ReadDataByte (devc, CODEC_STATUS) & CODEC_BUSY_B))
267
KeStallExecutionProcessor (1);
268
HWMGR_WriteDataWord (devc, CODEC_DATA, 0);
269
HWMGR_WriteDataByte (devc, CODEC_COMMAND, AC97_POWER_DOWN_CTRL);
270
for (i = 0; i < 1000; i++)
271
if (!(HWMGR_ReadDataByte (devc, CODEC_STATUS) & CODEC_BUSY_B))
273
HWMGR_WriteDataWord (devc, RING_BUS_CTRL_B, wDataCodec);
274
HWMGR_WriteDataWord (devc, SDO_IN_DEST_CTRL, wDataIn);
275
HWMGR_WriteDataWord (devc, SDO_OUT_DEST_CTRL, wDataOut);
276
} /* HWMGR_RestoreACLink */
279
HWMGR_ReadCodecData (allegro_devc * devc, UCHAR Index, PUSHORT Value)
284
HWMGR_WriteDataByte (devc, CODEC_COMMAND, (UCHAR) (CODEC_READ_B | Index));
285
for (i = 0; i < 1000; i++)
287
if (!(HWMGR_ReadDataByte (devc, CODEC_STATUS) & CODEC_BUSY_B))
289
*Value = HWMGR_ReadDataWord (devc, CODEC_DATA);
293
if (CODEC_TYPE_ESS == bCodec)
294
HWMGR_RestoreACLink (devc);
297
} /* HWMGR_ReadCodecData */
301
HWMGR_WriteCodecData (allegro_devc * devc, UCHAR Index, USHORT Value)
305
HWMGR_WriteDataWord (devc, CODEC_DATA, Value);
306
HWMGR_WriteDataByte (devc, CODEC_COMMAND, Index);
307
for (i = 0; i < 1000; i++)
309
if (!(HWMGR_ReadDataByte (devc, CODEC_STATUS) & CODEC_BUSY_B))
314
if (CODEC_TYPE_ESS == bCodec)
315
HWMGR_RestoreACLink (devc);
317
} /* HWMGR_WriteCodecData */
320
HWMGR_EnableExternalAmp (allegro_devc * devc, BOOLEAN enable)
329
* by default, setup for reference board
331
if (bEapdSupportMode == 0)
333
bEapdSupportMode = 1;
334
if (bChipType >= M3_1998)
335
wEapdGPOPolarity_Port = 0x1100;
338
wEapdGPOPolarity_Port = 0x1800;
340
wEapdGPOPolarity_Port = 0x1c00;
342
wEapdGPOPolarity_Port = 0x1600;
346
dprintf3 (("Mode=%x PPort=%x", bEapdSupportMode, wEapdGPOPolarity_Port));
347
wGPO2 = wPolarity2 = 0;
348
switch (bEapdSupportMode)
353
wGPO2 = wEapdGPOPolarity_Port & 0x0F;
354
wPolarity2 = wEapdGPOPolarity_Port >> 4 & 0x0F;
356
wPolarity2 = !wPolarity2;
357
wPolarity2 = wPolarity2 << wGPO2;
359
wGPO = wEapdGPOPolarity_Port >> 8 & 0x0F;
360
wPolarity = wEapdGPOPolarity_Port >> 12;
362
wPolarity = !wPolarity;
363
wPolarity = wPolarity << wGPO;
366
wPolarity |= wPolarity2;
367
HWMGR_WriteDataWord (devc, GPIO_MASK, (USHORT) ~ wGPO);
368
wDirection = HWMGR_ReadDataWord (devc, GPIO_DIRECTION) | wGPO;
369
HWMGR_WriteDataWord (devc, GPIO_DIRECTION, wDirection);
370
HWMGR_WriteDataWord (devc, GPIO_DATA, (USHORT) (GPO_SECONDARY_AC97 |
373
HWMGR_WriteDataWord (devc, GPIO_MASK, 0xFFFF);
377
wGPO = wEapdGPOPolarity_Port >> 8 & 0x0F;
378
wPolarity = wEapdGPOPolarity_Port >> 12;
380
wPolarity = !wPolarity;
381
wPolarity = wPolarity << wGPO;
384
wPolarity |= wPolarity2;
385
HWMGR_WriteDataWord (devc, GPIO_MASK, (USHORT) ~ wGPO);
386
wDirection = HWMGR_ReadDataWord (devc, GPIO_DIRECTION) | wGPO;
387
HWMGR_WriteDataWord (devc, GPIO_DIRECTION, wDirection);
388
HWMGR_WriteDataWord (devc, GPIO_DATA, (USHORT) (GPO_SECONDARY_AC97 |
391
HWMGR_WriteDataWord (devc, GPIO_MASK, 0xFFFF);
394
} /* HWMGR_EnableExternalAmp */
398
HWMGR_EnableRemoteCodec (allegro_devc * devc, BOOLEAN enable)
402
/* This function MUST be in a non-paged segment */
404
if (enable == fRemoteCodec)
406
fRemoteCodec = enable;
410
/* enable remote codec */
411
wData = HWMGR_ReadDataWord (devc, RING_BUS_CTRL_B);
412
wData = (wData & ~SECOND_CODEC_ID_MASK) | 1;
413
HWMGR_WriteDataWord (devc, RING_BUS_CTRL_B, wData);
414
wData = HWMGR_ReadDataWord (devc, SDO_OUT_DEST_CTRL);
415
wData = (wData & ~COMMAND_ADDR_OUT) | 1;
416
HWMGR_WriteDataWord (devc, SDO_OUT_DEST_CTRL, wData);
417
wData = HWMGR_ReadDataWord (devc, SDO_IN_DEST_CTRL);
418
wData = (wData & ~STATUS_ADDR_IN) | 1;
419
HWMGR_WriteDataWord (devc, SDO_IN_DEST_CTRL, wData);
424
/* disable remote codec */
425
wData = HWMGR_ReadDataWord (devc, RING_BUS_CTRL_B);
426
wData = wData & ~SECOND_CODEC_ID_MASK;
427
HWMGR_WriteDataWord (devc, RING_BUS_CTRL_B, wData);
428
wData = HWMGR_ReadDataWord (devc, SDO_OUT_DEST_CTRL);
429
wData = wData & ~COMMAND_ADDR_OUT;
430
HWMGR_WriteDataWord (devc, SDO_OUT_DEST_CTRL, wData);
431
wData = HWMGR_ReadDataWord (devc, SDO_IN_DEST_CTRL);
432
wData = wData & ~STATUS_ADDR_IN;
433
HWMGR_WriteDataWord (devc, SDO_IN_DEST_CTRL, wData);
435
} /* HWMGR_EnableRemoteCodec */
437
#define AKM_CODEC 0x414B4D
438
#define TRA_CODEC 0x545241
439
#define ESS_CODEC 0x458383
440
#define STAC9721_CODEC 0x838476
441
#define STAC9721_REV_C 0x09
442
#define STAC9721_REV_D 0x44
445
HWMGR_ReadVendorId (allegro_devc * devc, OUT PULONG pulData, OUT PBYTE pbRev)
450
if (HWMGR_ReadCodecData (devc, AC97_VENDOR_ID1, &wData))
452
*pulData = (ULONG) wData << 16;
453
if (HWMGR_ReadCodecData (devc, AC97_VENDOR_ID2, &wData))
456
*pbRev = (UCHAR) * pulData;
463
} /* HWMGR_ReadVendorId */
466
HWMGR_ResetCodec (allegro_devc * devc)
478
delay_count = reset_count = wait_count = 0;
479
wDirection = HWMGR_ReadDataWord (devc, GPIO_DIRECTION);
481
/* not sure if this applies for Allegro-1/Maestro-3 */
482
if (PCIRead (devc, PCI_USER_CONFIG) & EXT_PCI_MASTER_ENABLE)
489
HWMGR_EnableRemoteCodec (devc, FALSE);
491
/* set bCodec to undefined so that ReadCodecData will not try to restore */
496
/* If we can read codec, skip codec reset to avoid pop sound. */
497
/* HP Omnibook M3 does not setup AC-link correctly */
498
HWMGR_WriteDataWord (devc, RING_BUS_CTRL_A, IO_SRAM_ENABLE);
500
/* delay at least 20 us if disabling AC-link */
501
KeStallExecutionProcessor (20);
502
HWMGR_WriteDataWord (devc, RING_BUS_CTRL_A,
503
IO_SRAM_ENABLE | SERIAL_AC_LINK_ENABLE);
504
KeStallExecutionProcessor (1);
505
if (HWMGR_ReadVendorId (devc, &ulData, &bRev))
508
dprintf1 (("codec1 id = %x", ulData));
509
/* do not need to reset */
512
if (ulData != 0 && ulData != 0xFFFFFF)
515
bCodec = CODEC_TYPE_AC97;
516
if (TRA_CODEC == ulCodec)
519
/* fix for tritech 2.0a codec */
520
HWMGR_WriteCodecData (devc, 0x2A, 0x0001);
521
HWMGR_WriteCodecData (devc, 0x2C, 0x0000);
522
HWMGR_WriteCodecData (devc, 0x2C, 0xFFFF);
524
else if (ESS_CODEC == ulCodec)
526
bCodec = CODEC_TYPE_ESS;
531
if (bChipType >= M3_1998)
532
bCodec = CODEC_TYPE_AC97;
534
bCodec = CODEC_TYPE_ESS;
541
dprintf1 (("reset codec1 bCodec=%d DoReset=%d", bCodec, DoReset));
542
/* reset primary codec */
546
/* regular AC97 codec */
547
if (bChipType >= M3_1998)
550
#if CRYSTAL_CODEC_FIX
551
if (!ulCodec || CRY_CODEC == ulCodec)
574
HWMGR_WriteDataWord (devc, RING_BUS_CTRL_A, IO_SRAM_ENABLE);
576
/* delay at least 20 us if disabling AC-link */
577
KeStallExecutionProcessor (20);
580
HWMGR_WriteDataWord (devc, GPIO_DIRECTION,
581
wDirection & ~GPO_PRIMARY_AC97);
582
HWMGR_WriteDataWord (devc, GPIO_MASK, (USHORT) ~ GPO_PRIMARY_AC97);
583
HWMGR_WriteDataWord (devc, GPIO_DATA, 0x000);
584
wDirection |= GPO_PRIMARY_AC97;
585
HWMGR_WriteDataWord (devc, GPIO_DIRECTION, wDirection);
588
DelayMillisec (delay_count);
589
HWMGR_WriteDataWord (devc, GPIO_DATA, GPO_PRIMARY_AC97);
590
KeStallExecutionProcessor (5);
591
HWMGR_WriteDataWord (devc, RING_BUS_CTRL_A,
592
IO_SRAM_ENABLE | SERIAL_AC_LINK_ENABLE);
593
HWMGR_WriteDataWord (devc, GPIO_MASK, 0xFFFF);
595
/* wait for codec to be ready */
596
DelayMillisec (wait_count);
598
#if defined( AC97_RESETFIX )
599
/* If unable to read from Codec, perform special reset */
600
if (!HWMGR_ReadCodecData (devc, AC97_VENDOR_ID1, &wData))
602
/* Save Serial Link Configuration */
603
HWMGR_ReadDataWord (devc, RING_BUS_CTRL_A, &wRingBusReg);
605
/* Disable Serial AC Link and Cold Reset Codec */
606
HWMGR_WriteDataWord (devc, RING_BUS_CTRL_A, _AC_SDFS_ENABLE);
609
for (count = 0; count < 400; count++)
610
KeStallExecutionProcessor (50);
612
/* Enable AC Serial Link */
613
HWMGR_WriteDataWord (devc, RING_BUG_CTRL_A, wRingBusReg);
615
if (!HWMGR_ReadCodecData (devc, AC97_VENDOR_ID1, &wData))
617
/* Disable Serial AC Link and Cold Reset Codec */
618
HWMGR_WriteDataWord (devc, RING_BUS_CTRL_A, _AC_SDFS_ENABLE);
620
/* Warm Reset Codec */
621
HWMGR_WriteDataByte (devc, CODEC_COMMAND, 0x00);
623
for (count = 0; count < 400; count++)
624
KeStallExecutionProcessor (50);
626
/* Enable AC Serial Link */
627
HWMGR_WriteDataWord (devc, RING_BUG_CTRL_A, wRingBusReg);
629
/* Set AC97 PR4 26h[12] */
630
HWMGR_ReadCodecData (devc, AC97_POWER_DOWN_CTRL, &wData);
631
HWMGR_WriteCodecData (devc, AC97_POWER_DOWN_CTRL,
634
/* Warm Reset Codec */
635
HWMGR_WriteDataByte (devc, CODEC_COMMAND, 0x00);
637
for (count = 0; count < 400; count++)
638
KeStallExecutionProcessor (50);
645
if (HWMGR_ReadVendorId (devc, &ulData, &bRev))
647
if (ulData != 0 && ulData != 0xFFFFFF)
650
bCodec = CODEC_TYPE_AC97;
651
if (TRA_CODEC == ulCodec)
654
/* fix for tritech 2.0a codec */
655
HWMGR_WriteCodecData (devc, 0x2A, 0x0001);
656
HWMGR_WriteCodecData (devc, 0x2C, 0x0000);
657
HWMGR_WriteCodecData (devc, 0x2C, 0xFFFF);
659
else if (ESS_CODEC == ulCodec)
661
bCodec = CODEC_TYPE_ESS;
667
if (++reset_count < 20)
676
if (bChipType >= M3_1998)
677
bCodec = CODEC_TYPE_AC97;
679
bCodec = CODEC_TYPE_ESS;
683
else if ((wDirection & GPO_PRIMARY_AC97) == 0)
685
HWMGR_WriteDataWord (devc, GPIO_MASK, (USHORT) ~ GPO_PRIMARY_AC97);
686
HWMGR_WriteDataWord (devc, GPIO_DATA, GPO_PRIMARY_AC97);
687
wDirection |= GPO_PRIMARY_AC97;
688
HWMGR_WriteDataWord (devc, GPIO_DIRECTION, wDirection);
689
HWMGR_WriteDataWord (devc, GPIO_MASK, 0xFFFF);
692
dprintf1 (("Codec:%d\n", bCodec));
694
if (CODEC_TYPE_ESS == bCodec)
696
if (HWMGR_ReadCodecData (devc, AC97_CLOCK_DELAY, &wData))
698
wData &= ~(AC97_CLOCK_DELAY_SEL << AC97_ADC_CDS_SHIFT);
699
wData |= 18 << AC97_ADC_CDS_SHIFT;
700
HWMGR_WriteCodecData (devc, AC97_CLOCK_DELAY, wData);
704
if (++reset_count < 20)
715
HWMGR_EnableRemoteCodec (devc, TRUE);
717
wData = HWMGR_ReadDataWord (devc, RING_BUS_CTRL_B);
718
wData &= ~(SECOND_AC_ENABLE | SECOND_CODEC_ID_MASK);
719
HWMGR_WriteDataWord (devc, RING_BUS_CTRL_B,
720
(USHORT) (wData | SECOND_AC_ENABLE | 1));
722
/* If we can read codec, skip codec reset to avoid pop sound. */
724
if (HWMGR_ReadVendorId (devc, &ulData, &bRev))
727
dprintf1 (("Read:%x,%x\n", ulData, bRev));
729
/* do not need to reset */
733
/* reset secondary codec */
736
HWMGR_WriteDataWord (devc, RING_BUS_CTRL_A, IO_SRAM_ENABLE);
738
/* delay at least 20 us if disabling AC-link */
739
KeStallExecutionProcessor (20);
742
HWMGR_WriteDataWord (devc, GPIO_DIRECTION,
743
wDirection & ~GPO_SECONDARY_AC97);
744
HWMGR_WriteDataWord (devc, GPIO_MASK,
745
(USHORT) ~ GPO_SECONDARY_AC97);
746
HWMGR_WriteDataWord (devc, GPIO_DATA, 0x000);
747
wDirection |= GPO_SECONDARY_AC97;
748
HWMGR_WriteDataWord (devc, GPIO_DIRECTION, wDirection);
752
HWMGR_WriteDataWord (devc, GPIO_DATA, GPO_SECONDARY_AC97);
756
HWMGR_WriteDataWord (devc, GPIO_MASK, 0xFFFF);
758
HWMGR_WriteDataWord (devc, RING_BUS_CTRL_A,
759
IO_SRAM_ENABLE | SERIAL_AC_LINK_ENABLE);
760
KeStallExecutionProcessor (1);
763
(void) HWMGR_ReadVendorId (devc, &ulData, &bRev);
765
dprintf1 (("Reset:%x,%x\n", ulData, bRev));
767
else if ((wDirection & GPO_SECONDARY_AC97) == 0)
769
HWMGR_WriteDataWord (devc, GPIO_MASK,
770
(USHORT) ~ GPO_SECONDARY_AC97);
771
HWMGR_WriteDataWord (devc, GPIO_DATA, GPO_SECONDARY_AC97);
772
wDirection |= GPO_SECONDARY_AC97;
773
HWMGR_WriteDataWord (devc, GPIO_DIRECTION, wDirection);
774
HWMGR_WriteDataWord (devc, GPIO_MASK, 0xFFFF);
776
if (ulData != 0 && ulData != 0xFFFFFF)
778
if (TRA_CODEC == ulData)
781
/* fix for tritech 2.0a codec */
782
HWMGR_WriteCodecData (devc, 0x2A, 0x0001);
783
HWMGR_WriteCodecData (devc, 0x2C, 0x0000);
784
HWMGR_WriteCodecData (devc, 0x2C, 0xFFFF);
786
else if (STAC9721_CODEC == ulData)
790
if (!HWMGR_ReadCodecData
791
(devc, AC97_POWER_DOWN_CTRL, &wStatus) || 0 == wStatus)
793
HWMGR_WriteCodecData (devc, 0x76, 0xABBA);
794
if (STAC9721_REV_D == bRev)
796
HWMGR_WriteCodecData (devc, 0x78, 0x2002);
797
KeStallExecutionProcessor (20);
798
HWMGR_WriteCodecData (devc, 0x78, 0x2802);
802
HWMGR_WriteCodecData (devc, 0x78, 0x3002);
803
KeStallExecutionProcessor (20);
804
HWMGR_WriteCodecData (devc, 0x78, 0x3802);
809
HWMGR_EnableRemoteCodec (devc, FALSE);
811
HWMGR_WriteDataWord (devc, RING_BUS_CTRL_B, wData);
813
} /* HWMGR_ResetCodec */
822
UCHAR bGray_Code[32] = {
823
0x00, 0x01, 0x03, 0x02, 0x07, 0x06, 0x04, 0x05,
824
0x0F, 0x0E, 0x0C, 0x0D, 0x08, 0x09, 0x0B, 0x0A,
825
0x1F, 0x1E, 0x1C, 0x1D, 0x18, 0x19, 0x1B, 0x1A,
826
0x10, 0x11, 0x13, 0x12, 0x17, 0x16, 0x14, 0x15
830
HWMGR_SetClockSpeed (allegro_devc * devc, UCHAR speed)
839
HWMGR_WriteDataByte (devc, ASSP_CONTROL_B, RESET_ASSP);
841
ulData = PCIRead (devc, PCI_ALLEGRO_CONFIG);
842
ulData &= ~INT_CLK_SELECT;
843
ulData &= ~(CLK_MULT_MODE_SELECT | CLK_MULT_MODE_SELECT_2);
844
PCIWrite (devc, PCI_ALLEGRO_CONFIG, ulData);
846
if (DSP36MHZ == speed)
848
ulData = PCIRead (devc, PCI_USER_CONFIG);
849
ulData &= ~IN_CLK_12MHZ_SELECT;
850
PCIWrite (devc, PCI_USER_CONFIG, ulData);
852
for (mode = 0; mode < 4; mode++)
854
ulData |= INT_CLK_MULT_RESET;
855
PCIWrite (devc, PCI_ALLEGRO_CONFIG, ulData);
856
ulData &= ~CLK_MULT_MODE_SELECT;
857
ulData |= mode << CLK_MULT_MODE_SHIFT;
858
PCIWrite (devc, PCI_ALLEGRO_CONFIG, ulData);
859
ulData &= ~INT_CLK_MULT_RESET;
860
PCIWrite (devc, PCI_ALLEGRO_CONFIG, ulData);
862
READ_PORT_UCHAR (devc->osdev, 0x80);
863
READ_PORT_UCHAR (devc->osdev, 0x80);
864
READ_PORT_UCHAR (devc->osdev, 0x80);
865
READ_PORT_UCHAR (devc->osdev, 0x80);
866
READ_PORT_UCHAR (devc->osdev, 0x80);
867
READ_PORT_UCHAR (devc->osdev, 0x80);
868
READ_PORT_UCHAR (devc->osdev, 0x80);
869
READ_PORT_UCHAR (devc->osdev, 0x80);
871
bGray_Code[HWMGR_ReadDataWord (devc, CLK_MULT_DATA_PORT) >> 5
874
ulData |= CLK_MULT_MODE_SELECT_2;
875
for (mode = 0; mode < 4; mode++)
877
ulData |= INT_CLK_MULT_RESET;
878
PCIWrite (devc, PCI_ALLEGRO_CONFIG, ulData);
879
ulData &= ~CLK_MULT_MODE_SELECT;
880
ulData |= mode << CLK_MULT_MODE_SHIFT;
881
PCIWrite (devc, PCI_ALLEGRO_CONFIG, ulData);
882
ulData &= ~INT_CLK_MULT_RESET;
883
PCIWrite (devc, PCI_ALLEGRO_CONFIG, ulData);
885
READ_PORT_UCHAR (devc->osdev, 0x80);
886
READ_PORT_UCHAR (devc->osdev, 0x80);
887
READ_PORT_UCHAR (devc->osdev, 0x80);
888
READ_PORT_UCHAR (devc->osdev, 0x80);
889
READ_PORT_UCHAR (devc->osdev, 0x80);
890
READ_PORT_UCHAR (devc->osdev, 0x80);
891
READ_PORT_UCHAR (devc->osdev, 0x80);
892
READ_PORT_UCHAR (devc->osdev, 0x80);
893
bModeValue[mode + 4] =
894
bGray_Code[HWMGR_ReadDataWord (devc, CLK_MULT_DATA_PORT) >> 5
897
#define Abs(x) ((x)<0) ? -(x) : (x)
898
bDelta = Abs (bModeValue[0] - 0x10);
900
for (mode = 1; mode < 8; mode++)
902
if (bDelta > Abs (bModeValue[mode] - 0x10))
904
bDelta = Abs (bModeValue[mode] - 0x10);
910
_Debug_Printf_Service ("mode:%d\n", choice);
912
ulData &= ~(CLK_MULT_MODE_SELECT | CLK_MULT_MODE_SELECT_2);
915
ulData |= CLK_MULT_MODE_SELECT_2;
918
ulData |= INT_CLK_MULT_RESET;
919
PCIWrite (devc, PCI_ALLEGRO_CONFIG, ulData);
920
ulData |= choice << CLK_MULT_MODE_SHIFT;
921
PCIWrite (devc, PCI_ALLEGRO_CONFIG, ulData);
922
ulData &= ~INT_CLK_MULT_RESET;
923
PCIWrite (devc, PCI_ALLEGRO_CONFIG, ulData);
925
ulData |= INT_CLK_SELECT;
926
PCIWrite (devc, PCI_ALLEGRO_CONFIG, ulData);
927
READ_PORT_UCHAR (devc->osdev, 0x80);
928
READ_PORT_UCHAR (devc->osdev, 0x80);
932
ulData = PCIRead (devc, PCI_USER_CONFIG);
933
ulData |= IN_CLK_12MHZ_SELECT;
934
PCIWrite (devc, PCI_USER_CONFIG, ulData);
937
bData = HWMGR_ReadDataByte (devc, ASSP_CONTROL_A);
938
bData &= ~(DSP_CLK_36MHZ_SELECT | ASSP_CLK_49MHZ_SELECT);
939
bData |= ASSP_0_WS_ENABLE;
943
bData |= DSP_CLK_36MHZ_SELECT;
946
bData |= ASSP_CLK_49MHZ_SELECT;
949
HWMGR_WriteDataByte (devc, ASSP_CONTROL_A, bData);
951
HWMGR_WriteDataByte (devc, ASSP_CONTROL_B, RUN_ASSP);
952
} /* HWMGR_SetClockSpeed */
955
HWMGR_SetM3ClockSpeed (allegro_devc * devc, UCHAR speed)
964
HWMGR_WriteDataByte (devc, ASSP_CONTROL_B, RESET_ASSP);
966
ulData = PCIRead (devc, PCI_ALLEGRO_CONFIG);
967
if (DSP33MHZ == speed)
968
ulData &= ~INT_CLK_SRC_NOT_PCI;
970
ulData |= INT_CLK_SRC_NOT_PCI;
971
ulData &= ~(INT_CLK_MULT_ENABLE | INT_CLK_SELECT);
972
ulData &= ~(CLK_MULT_MODE_SELECT | CLK_MULT_MODE_SELECT_2);
973
PCIWrite (devc, PCI_ALLEGRO_CONFIG, ulData);
975
if (DSP36MHZ == speed)
977
ulData = PCIRead (devc, PCI_USER_CONFIG);
978
ulData |= IN_CLK_12MHZ_SELECT;
979
PCIWrite (devc, PCI_USER_CONFIG, ulData);
981
for (mode = 0; mode < 4; mode++)
983
ulData &= ~INT_CLK_MULT_ENABLE;
984
PCIWrite (devc, PCI_ALLEGRO_CONFIG, ulData);
985
ulData &= ~CLK_MULT_MODE_SELECT;
986
ulData |= mode << CLK_MULT_MODE_SHIFT;
987
PCIWrite (devc, PCI_ALLEGRO_CONFIG, ulData);
988
ulData |= INT_CLK_MULT_ENABLE;
989
PCIWrite (devc, PCI_ALLEGRO_CONFIG, ulData);
991
READ_PORT_UCHAR (devc->osdev, 0x80);
992
READ_PORT_UCHAR (devc->osdev, 0x80);
993
READ_PORT_UCHAR (devc->osdev, 0x80);
994
READ_PORT_UCHAR (devc->osdev, 0x80);
995
READ_PORT_UCHAR (devc->osdev, 0x80);
996
READ_PORT_UCHAR (devc->osdev, 0x80);
997
READ_PORT_UCHAR (devc->osdev, 0x80);
998
READ_PORT_UCHAR (devc->osdev, 0x80);
1000
bGray_Code[HWMGR_ReadDataWord (devc, CLK_MULT_DATA_PORT) >> 5
1003
ulData |= CLK_MULT_MODE_SELECT_2;
1004
for (mode = 0; mode < 4; mode++)
1006
ulData &= ~INT_CLK_MULT_ENABLE;
1007
PCIWrite (devc, PCI_ALLEGRO_CONFIG, ulData);
1008
ulData &= ~CLK_MULT_MODE_SELECT;
1009
ulData |= mode << CLK_MULT_MODE_SHIFT;
1010
PCIWrite (devc, PCI_ALLEGRO_CONFIG, ulData);
1011
ulData |= INT_CLK_MULT_ENABLE;
1012
PCIWrite (devc, PCI_ALLEGRO_CONFIG, ulData);
1014
READ_PORT_UCHAR (devc->osdev, 0x80);
1015
READ_PORT_UCHAR (devc->osdev, 0x80);
1016
READ_PORT_UCHAR (devc->osdev, 0x80);
1017
READ_PORT_UCHAR (devc->osdev, 0x80);
1018
READ_PORT_UCHAR (devc->osdev, 0x80);
1019
READ_PORT_UCHAR (devc->osdev, 0x80);
1020
READ_PORT_UCHAR (devc->osdev, 0x80);
1021
READ_PORT_UCHAR (devc->osdev, 0x80);
1022
bModeValue[mode + 4] =
1023
bGray_Code[HWMGR_ReadDataWord (devc, CLK_MULT_DATA_PORT) >> 5
1026
bDelta = Abs (bModeValue[0] - 0x10);
1028
for (mode = 1; mode < 8; mode++)
1030
if (bDelta > Abs (bModeValue[mode] - 0x10))
1032
bDelta = Abs (bModeValue[mode] - 0x10);
1038
_Debug_Printf_Service ("mode:%d\n", choice);
1040
ulData &= ~(INT_CLK_MULT_ENABLE | CLK_MULT_MODE_SELECT |
1041
CLK_MULT_MODE_SELECT_2);
1044
ulData |= CLK_MULT_MODE_SELECT_2;
1047
PCIWrite (devc, PCI_ALLEGRO_CONFIG, ulData);
1048
ulData |= choice << CLK_MULT_MODE_SHIFT;
1049
PCIWrite (devc, PCI_ALLEGRO_CONFIG, ulData);
1050
ulData |= INT_CLK_MULT_ENABLE;
1051
PCIWrite (devc, PCI_ALLEGRO_CONFIG, ulData);
1054
bData = HWMGR_ReadDataByte (devc, ASSP_CONTROL_A);
1055
bData &= ~(DSP_CLK_36MHZ_SELECT | ASSP_CLK_49MHZ_SELECT);
1056
bData |= ASSP_0_WS_ENABLE;
1060
bData |= DSP_CLK_36MHZ_SELECT;
1063
bData |= ASSP_CLK_49MHZ_SELECT;
1066
HWMGR_WriteDataByte (devc, ASSP_CONTROL_A, bData);
1068
HWMGR_WriteDataByte (devc, ASSP_CONTROL_B, RUN_ASSP);
1069
} /* HWMGR_SetM3ClockSpeed */
1073
HWMGR_InitKernel (allegro_devc * devc)
1077
ulData = PCIRead (devc, PCI_ALLEGRO_CONFIG);
1078
ulData &= REDUCED_DEBOUNCE;
1082
ulData |= HV_CTRL_ENABLE;
1084
if (bHwVolCtrlMode == -1)
1087
if (bChipType < M3_1998)
1091
if (PCIRead (devc, 0x2c) == NEC_VENDOR_ID3)
1093
bHwVolCtrlMode |= (0x80 | 0x40);
1096
if (bHwVolCtrlMode & 0x80)
1098
bHwVolCtrlMode &= ~0x80;
1099
ulData |= REDUCED_DEBOUNCE;
1102
if (bHwVolCtrlMode & 0x40)
1104
bHwVolCtrlMode &= ~0x40;
1105
PCIWrite (devc, PCI_USER_CONFIG,
1106
PCIRead (devc, PCI_USER_CONFIG) | HV_CTRL_TEST);
1109
dprintf1 (("bHwVolCtrlMode=%x", bHwVolCtrlMode));
1111
/* default 53/54 pin */
1112
switch (bHwVolCtrlMode)
1117
ulData |= HV_BUTTON_FROM_GD;
1134
ulData |= PM_CTRL_ENABLE | CLK_DIV_BY_49 | USE_PCI_TIMING;
1135
PCIWrite (devc, PCI_ALLEGRO_CONFIG, ulData);
1137
ulData = PCIRead (devc, PCI_USER_CONFIG);
1138
ulData |= MIDI_1_ENABLE;
1139
PCIWrite (devc, PCI_USER_CONFIG, ulData);
1141
if (bChipType >= M3_1998)
1142
HWMGR_SetM3ClockSpeed (devc, DSP49MHZ);
1144
/* new Allegro board only works with external 49 Mhz clock */
1145
HWMGR_SetClockSpeed (devc, DSP49MHZ);
1146
/*ulDSPConnectIn = KCONNECT_ADC1; */
1148
/* initialize the DSP kernel */
1149
if (kInitKernel (devc, &gphwi, 0x1978, 0x10, devc->base, 0) !=
1159
extern DWORD gdwESModem;
1160
extern DWORD DisableModemClient (VOID);
1164
(gphwi, CLIENT_MODEM, 0, 0x180 * 2,
1165
&pClient_Modem) != KRETURN_SUCCESS)
1167
DisableModemClient ();
1173
} /* HWMGR_InitKernel */
1175
/* -------------------------------------------------------------------------- */
1178
HWMGR_InitSystem (allegro_devc * devc)
1183
#if 0 /* this cause zip sound for Compaq. Code here is for problems for older */
1184
/* allegro chip, new one does not need this any more. */
1185
/* prevent AC-link deadlocking */
1186
HWMGR_WriteDataWord (devc, HOST_INT_CTRL, SOFTWARE_RESET_ENABLE);
1187
KeStallExecutionProcessor (5);
1188
HWMGR_WriteDataWord (devc, HOST_INT_CTRL, 0x0);
1191
HWMGR_InitKernel (devc);
1193
if (bEnableDockDetect)
1195
wDockedMask = bDockingDetectGPIPort & 0x0F;
1196
wDockedValue = (bDockingDetectGPIPort >> 4 & 0x0F) << wDockedMask;
1197
wDockedMask = 1 << wDockedMask;
1199
(HWMGR_ReadDataWord (devc, GPIO_DATA) & wDockedMask) == wDockedValue;
1203
wDockedMask = wDockedValue = 0;
1206
/* force to set correct codec */
1207
fRemoteCodec = 0xFF;
1209
HWMGR_ResetCodec (devc);
1211
/* allegro codec proble from cold boot so one more resetcodec */
1212
HWMGR_ResetCodec (devc);
1214
if (CODEC_TYPE_ESS == bCodec)
1217
/* power down DAC to resynchronize after AC-link change */
1218
HWMGR_WriteCodecData (devc, AC97_POWER_DOWN_CTRL, AC97_PR1);
1219
KeStallExecutionProcessor (1);
1222
/* codec not reset every time */
1223
HWMGR_WriteCodecData (devc, AC97_POWER_DOWN_CTRL, 0);
1224
HWMGR_EnableExternalAmp (devc, TRUE);
1227
wData = HWMGR_ReadDataWord (devc, RING_BUS_CTRL_B);
1228
wData |= SECOND_AC_ENABLE;
1229
HWMGR_WriteDataWord (devc, RING_BUS_CTRL_B, wData);
1232
HWMGR_ReadCodecData (devc, AC97_GENERAL_PURPOSE, &wData);
1233
if (bMonoOutputSelect)
1237
HWMGR_WriteCodecData (devc, AC97_MASTER_MONO_VOL, gwDefaultMonoOutVol);
1238
KeStallExecutionProcessor (100);
1239
HWMGR_WriteCodecData (devc, AC97_MASTER_MONO_VOL, gwDefaultMonoOutVol);
1243
HWMGR_WriteCodecData (devc, AC97_GENERAL_PURPOSE, wData);
1245
/* fix DAC volume at 0x0808 */
1246
HWMGR_WriteCodecData (devc, AC97_MASTER_VOL, 0x0404);
1247
HWMGR_WriteCodecData (devc, AC97_PCM_OUT_VOL, 0x0404);
1251
HWMGR_WriteCodecData (devc, AC97_RECORD_GAIN, 0x8000);
1253
gwDSPConnectIn = KCONNECT_ADC1;
1258
dwVal = HW_INIT_SET_ACTIVE_ACINTF;
1260
HwSetSystemParameter (devc, dwVal);
1265
dwVal = HW_INIT_SET_ACTIVE_ACINTF;
1268
HwSetSystemParameter (devc, dwVal);
1269
} /* HWMGR_InitSystem */
1273
HwRelease (allegro_devc * devc)
1279
kTermKernel (devc, gphwi, devc->base);
1281
HWMGR_EnableExternalAmp (devc, FALSE);
1283
/* MUTE THE DAMN THING FIRST */
1284
WriteLego (devc, 0x02, 0x3F3F); /* LOUT1 Master Attenuation (-1.5dB steps: 0000 = 0dB, 3F3F = -94dB, ) */
1286
WriteLego (devc, 0x04, 0x9F1F); /* Headphone */
1287
WriteLego (devc, 0x06, 0x9F1F); /* MonoOut */
1288
WriteLego (devc, 0x12, 0x9F1F); /* CD to Mixer Level (80=mute; 00=+12.0dB, 08=0.0dB, 0F = -33dB) */
1289
WriteLego (devc, 0x16, 0x9F1F); /* AUX to Mixer Level (80=mute; 00=+12.0dB, 08=0.0dB, 0F = -33dB) */
1290
WriteLego (devc, 0x0E, 0x9F1F); /* Mic to Mixer Level (80=mute; 00=+12.0dB, 08=0.0dB, 0F = -33dB) */
1291
WriteLego (devc, 0x18, 0x9F1F); /* DAC to Mixer Level (80=mute; 00=+12.0dB, 08=0.0dB, 0F = -33dB) */
1292
WriteLego (devc, 0x10, 0x9F1F); /* Line in to Mixer Level (80=mute; 00=+12.0dB, 08=0.0dB, 0F = -33dB) */
1293
WriteLego (devc, 0x1A, 0); /* Rec Gain */
1294
WriteLego (devc, 0x1C, 0x8F0F); /* Rec Gain */