2 Copyright © 2005-2013, Davy Wentzler. All rights reserved.
6 #include <exec/memory.h>
7 #include <proto/expansion.h>
10 #include "pci_wrapper.h"
13 #include "library_card.h"
15 #include "library_mos.h"
20 #include "interrupt.h"
23 #include "DriverData.h"
27 /* Global in Card.c */
28 extern const UWORD InputBits
[];
29 extern struct DOSIFace
*IDOS
;
30 extern struct MMUIFace
* IMMU
;
32 struct Device
*TimerBase
= NULL
;
33 struct timerequest
*TimerIO
= NULL
;
34 struct MsgPort
*replymp
= NULL
;
35 unsigned long Dirs
[7] = {0x005FFFFF, 0x005FFFFF, 0x001EFFF7, 0x004000FA, 0x004000FA, 0x007FFF9F, 0x00FFFFFF};
37 /* Public functions in main.c */
38 int card_init(struct CardData
*card
);
39 void card_cleanup(struct CardData
*card
);
40 int aureon_ac97_init(struct CardData
*card
, unsigned long base
);
41 void AddResetHandler(struct CardData
*card
);
44 extern struct DriverBase
* AHIsubBase
;
47 static unsigned char inits_ak4358
[] = {
48 0x01, 0x02, /* 1: reset + soft mute */
50 0x00, 0x87, // I2S + unreset (used to be 0F)
52 0x01, 0x01, // unreset + soft mute off
53 0x02, 0x4F, /* 2: DA's power up, normal speed, RSTN#=0 */
54 0x03, 0x01, /* 3: de-emphasis 44.1 */
56 0x04, 0xFF, /* 4: LOUT1 volume (PCM) */
57 0x05, 0xFF, /* 5: ROUT1 volume */
59 0x06, 0x00, /* 6: LOUT2 volume (analogue in monitor, doesn't work) */
60 0x07, 0x00, /* 7: ROUT2 volume */
62 0x08, 0xFF, /* 8: LOUT3 volume (dig out monitor, use it as analogue out) */
63 0x09, 0xFF, /* 9: ROUT3 volume */
65 0x0a, 0x00, /* a: DATT speed=0, ignore DZF */
67 0x0b, 0xFF, /* b: LOUT4 volume */
68 0x0c, 0xFF, /* c: ROUT4 volume */
76 void revo_i2s_mclk_changed(struct CardData
*card
)
78 struct PCIDevice
*dev
= card
->pci_dev
;
80 /* assert PRST# to converters; MT05 bit 7 */
81 OUTBYTE(card
->mtbase
+ MT_AC97_CMD_STATUS
, INBYTE(card
->mtbase
+ MT_AC97_CMD_STATUS
) | 0x80);
84 OUTBYTE(card
->mtbase
+ MT_AC97_CMD_STATUS
, INBYTE(card
->mtbase
+ MT_AC97_CMD_STATUS
) & ~0x80);
88 void ClearMask8(struct CardData
*card
, unsigned long base
, unsigned char reg
, unsigned char mask
)
92 tmp
= INBYTE(base
+ reg
);
94 OUTBYTE(base
+ reg
, tmp
);
98 void WriteMask8(struct CardData
*card
, unsigned long base
, unsigned char reg
, unsigned char mask
)
102 tmp
= INBYTE(base
+ reg
);
104 OUTBYTE(base
+ reg
, tmp
);
108 void WritePartialMask(struct CardData
*card
, unsigned long base
, unsigned char reg
, unsigned long shift
, unsigned long mask
, unsigned long val
)
112 tmp
= INLONG(base
+ reg
);
113 tmp
&= ~(mask
<< shift
);
115 OUTLONG(base
+ reg
, tmp
);
119 void SetGPIOData(struct CardData
*card
, unsigned long base
, unsigned long data
)
121 OUTWORD(base
+ CCS_GPIO_DATA
, data
& 0xFFFF);
122 OUTBYTE(base
+ CCS_GPIO_DATA2
, (data
& (0xFF0000)) >> 16);
123 INWORD(base
+ CCS_GPIO_DATA
); /* dummy read for pci-posting */
126 void SetGPIOMask(struct CardData
*card
, unsigned long base
, unsigned long data
)
128 OUTWORD(base
+ CCS_GPIO_MASK
, data
& 0xFFFF);
129 OUTBYTE(base
+ CCS_GPIO_MASK2
, (data
& (0xFF0000)) >> 16);
130 INWORD(base
+ CCS_GPIO_MASK
); /* dummy read for pci-posting */
134 void SaveGPIO(struct PCIDevice
*dev
, struct CardData
* card
)
136 card
->SavedDir
= INLONG(card
->iobase
+ CCS_GPIO_DIR
) & 0x7FFFFF;
137 card
->SavedMask
= INWORD(card
->iobase
+ CCS_GPIO_MASK
);
141 void RestoreGPIO(struct PCIDevice
*dev
, struct CardData
* card
)
143 OUTLONG(card
->iobase
+ CCS_GPIO_DIR
, card
->SavedDir
);
144 OUTWORD(card
->iobase
+ CCS_GPIO_MASK
, card
->SavedMask
);
148 unsigned long GetGPIOData(struct CardData
*card
, unsigned long base
)
152 data
= (unsigned long) INBYTE(base
+ CCS_GPIO_DATA2
);
153 data
= (data
<< 16) | INWORD(base
+ CCS_GPIO_DATA
);
158 void SetGPIODir(struct PCIDevice
*dev
, struct CardData
* card
, unsigned long data
)
160 OUTLONG(card
->iobase
+ CCS_GPIO_DIR
, data
);
161 INWORD(card
->iobase
+ CCS_GPIO_DIR
);
165 unsigned char ReadI2C(struct PCIDevice
*dev
, struct CardData
*card
, unsigned char addr
)
171 OUTBYTE(card
->iobase
+ CCS_I2C_ADDR
, addr
);
172 OUTBYTE(card
->iobase
+ CCS_I2C_DEV_ADDRESS
, 0xA0);
174 while ((INBYTE(card
->iobase
+ CCS_I2C_STATUS
) & CCS_I2C_BUSY
) && counter
< 10000)
180 if (counter
== 10000)
182 bug("Error reading from I2C\n");
185 val
= INBYTE(card
->iobase
+ CCS_I2C_DATA
);
191 void WriteI2C(struct PCIDevice
*dev
, struct CardData
*card
, unsigned chip_address
, unsigned char reg
, unsigned char data
)
195 while ((INBYTE(card
->iobase
+ CCS_I2C_STATUS
) & CCS_I2C_BUSY
) && counter
< 10000)
201 if (counter
== 10000)
203 bug("Error reading from I2C (for write)\n");
207 OUTBYTE(card
->iobase
+ CCS_I2C_ADDR
, reg
);
208 OUTBYTE(card
->iobase
+ CCS_I2C_DATA
, data
);
210 while ((INBYTE(card
->iobase
+ CCS_I2C_STATUS
) & CCS_I2C_BUSY
) && counter
< 10000)
215 if (counter
== 10000)
217 bug("Error reading from I2C (for write 2)\n");
220 OUTBYTE(card
->iobase
+ CCS_I2C_DEV_ADDRESS
, chip_address
| CCS_ADDRESS_WRITE
);
224 void update_spdif_bits(struct CardData
*card
, unsigned short val
)
226 unsigned char cbit
, disabled
;
227 struct PCIDevice
*dev
= card
->pci_dev
;
229 cbit
= INBYTE(card
->iobase
+ CCS_SPDIF_CONFIG
); // get S/PDIF status
230 disabled
= cbit
& ~CCS_SPDIF_INTEGRATED
; // status without enabled bit set
232 if (cbit
!= disabled
) // it was enabled
233 OUTBYTE(card
->iobase
+ CCS_SPDIF_CONFIG
, disabled
); // so, disable it
235 OUTWORD(card
->mtbase
+ MT_SPDIF_TRANSMIT
, val
); // now we can safely write to the SPDIF control reg
237 if (cbit
!= disabled
)
238 OUTBYTE(card
->iobase
+ CCS_SPDIF_CONFIG
, cbit
); // restore
240 OUTWORD(card
->mtbase
+ MT_SPDIF_TRANSMIT
, val
); // twice???
244 void update_spdif_rate(struct CardData
*card
, unsigned short rate
)
246 unsigned short val
, nval
;
248 struct PCIDevice
*dev
= card
->pci_dev
;
250 nval
= val
= INWORD(card
->mtbase
+ MT_SPDIF_TRANSMIT
);
254 case 48000: nval
|= 2 << 12; break;
255 case 32000: nval
|= 3 << 12; break;
258 update_spdif_bits(card
, nval
);
262 static void aureon_spi_write(struct CardData
*card
, unsigned long base
, unsigned int cs
, unsigned int data
, int bits
)
264 struct PCIDevice
*dev
= card
->pci_dev
;
268 tmp
= GetGPIOData(card
, base
);
270 if (card
->SubType
== PHASE28
)
271 SetGPIOMask(card
, base
, ~(AUREON_WM_RW
|AUREON_WM_DATA
|AUREON_WM_CLK
|AUREON_WM_CS
));
273 SetGPIOMask(card
, base
, ~(AUREON_WM_RW
|AUREON_WM_DATA
|AUREON_WM_CLK
|AUREON_WM_CS
| AUREON_CS8415_CS
));
275 SetGPIOMask(card
, base
, 0);
279 SetGPIOData(card
, base
, tmp
); // set CS low
283 for (i
= bits
- 1; i
>= 0; i
--) {
284 tmp
&= ~AUREON_WM_CLK
;
285 SetGPIOData(card
, base
, tmp
);
288 tmp
|= AUREON_WM_DATA
;
290 tmp
&= ~AUREON_WM_DATA
;
291 SetGPIOData(card
, base
, tmp
);
293 tmp
|= AUREON_WM_CLK
;
294 SetGPIOData(card
, base
, tmp
);
298 tmp
&= ~AUREON_WM_CLK
;
300 SetGPIOData(card
, base
, tmp
);
302 tmp
|= AUREON_WM_CLK
;
303 SetGPIOData(card
, base
, tmp
);
308 static void aureon_ac97_write(struct CardData
*card
, unsigned long base
, unsigned short reg
, unsigned short val
)
312 /* Send address to XILINX chip */
313 tmp
= (GetGPIOData(card
, base
) & ~0xFF) | (reg
& 0x7F);
314 SetGPIOData(card
, base
, tmp
);
316 tmp
|= AUREON_AC97_ADDR
;
317 SetGPIOData(card
, base
, tmp
);
319 tmp
&= ~AUREON_AC97_ADDR
;
320 SetGPIOData(card
, base
, tmp
);
323 /* Send low-order byte to XILINX chip */
324 tmp
&= ~AUREON_AC97_DATA_MASK
;
325 tmp
|= val
& AUREON_AC97_DATA_MASK
;
326 SetGPIOData(card
, base
, tmp
);
328 tmp
|= AUREON_AC97_DATA_LOW
;
329 SetGPIOData(card
, base
, tmp
);
331 tmp
&= ~AUREON_AC97_DATA_LOW
;
332 SetGPIOData(card
, base
, tmp
);
335 /* Send high-order byte to XILINX chip */
336 tmp
&= ~AUREON_AC97_DATA_MASK
;
337 tmp
|= (val
>> 8) & AUREON_AC97_DATA_MASK
;
339 SetGPIOData(card
, base
, tmp
);
341 tmp
|= AUREON_AC97_DATA_HIGH
;
342 SetGPIOData(card
, base
, tmp
);
344 tmp
&= ~AUREON_AC97_DATA_HIGH
;
345 SetGPIOData(card
, base
, tmp
);
348 /* Instruct XILINX chip to parse the data to the STAC9744 chip */
349 tmp
|= AUREON_AC97_COMMIT
;
350 SetGPIOData(card
, base
, tmp
);
352 tmp
&= ~AUREON_AC97_COMMIT
;
353 SetGPIOData(card
, base
, tmp
);
358 int aureon_ac97_init(struct CardData
*card
, unsigned long base
)
361 static unsigned short ac97_defaults
[] = {
363 AC97_MASTER_VOL_STEREO
, 0x0101, // 0dB atten., no mute, may not exceed 0101!!!
364 AC97_AUXOUT_VOL
, 0x8808,
365 AC97_MASTER_VOL_MONO
, 0x8000,
366 AC97_PHONE_VOL
, 0x8008, // mute
367 AC97_MIC_VOL
, 0x8008,
368 AC97_LINEIN_VOL
, 0x8808,
370 AC97_VIDEO_VOL
, 0x8808,
371 AC97_AUX_VOL
, 0x8808,
372 AC97_PCMOUT_VOL
, 0x8808,
385 tmp
= (GetGPIOData(card
, base
) | AUREON_AC97_RESET
) & ~AUREON_AC97_DATA_MASK
;
387 SetGPIOData(card
, base
, tmp
);
390 tmp
&= ~AUREON_AC97_RESET
;
391 SetGPIOData(card
, base
, tmp
);
394 tmp
|= AUREON_AC97_RESET
;
395 SetGPIOData(card
, base
, tmp
);
398 for (i
=0; ac97_defaults
[i
] != (unsigned short)-1; i
+=2)
399 aureon_ac97_write(card
, base
, ac97_defaults
[i
], ac97_defaults
[i
+1]);
408 * get the current register value of WM codec
410 static unsigned short wm_get(struct PCIDevice
*dev
, unsigned long base
, int reg
)
413 // return ((unsigned short)ice->akm[0].images[reg] << 8) | ice->akm[0].images[reg + 1];
417 void wm_put(struct CardData
*card
, unsigned long base
, unsigned short reg
, unsigned short val
)
419 aureon_spi_write(card
, base
, AUREON_WM_CS
, (reg
<< 9) | (val
& 0x1ff), 16);
424 BOOL
SetupTimerDevice()
431 void MicroDelay(unsigned int val
)
433 replymp
= (struct MsgPort
*) CREATEPORT( NULL
, 0 );
436 DEBUGPRINTF("Could not create the reply port!\n" );
440 TimerIO
= (struct timerequest
*) CREATEIOREQUEST( replymp
, sizeof( struct timerequest
) );
444 DEBUGPRINTF( "Out of memory.\n" );
448 if( OPENDEVICE( "timer.device", UNIT_MICROHZ
, (struct IORequest
*) TimerIO
, 0) != 0 )
450 DEBUGPRINTF( "Unable to open 'timer.device'.\n" );
456 TimerBase
= (struct Device
*) TimerIO
->tr_node
.io_Device
;
462 TimerIO
->tr_node
.io_Command
= TR_ADDREQUEST
; /* Add a request. */
463 TimerIO
->tr_time
.tv_secs
= 0; /* 0 seconds. */
464 TimerIO
->tr_time
.tv_micro
= val
; /* 'val' micro seconds. */
465 DOIO( (struct IORequest
*) TimerIO
);
466 CLOSEDEVICE( (struct IORequest
*) TimerIO
);
467 DELETEIOREQUEST( (struct IORequest
*) TimerIO
);
478 void CleanUpTimerDevice()
484 INTGW( static, void, playbackinterrupt
, PlaybackInterrupt
);
485 INTGW( static, void, recordinterrupt
, RecordInterrupt
);
486 INTGW( static, ULONG
, cardinterrupt
, CardInterrupt
);
489 /******************************************************************************
490 ** DriverData allocation ******************************************************
491 ******************************************************************************/
493 // This code used to be in _AHIsub_AllocAudio(), but since we're now
494 // handling CAMD support too, it needs to be done at driver loading
497 struct CardData
* AllocDriverData(struct PCIDevice
*dev
, struct DriverBase
* AHIsubBase
)
499 struct CardBase
* CardBase
= (struct CardBase
*) AHIsubBase
;
500 struct CardData
* card
;
504 card
= ALLOCVEC( sizeof( *card
), MEMF_PUBLIC
| MEMF_CLEAR
);
508 Req( "Unable to allocate driver structure." );
512 card
->ahisubbase
= AHIsubBase
;
514 card
->interrupt
.is_Node
.ln_Type
= IRQTYPE
;
515 card
->interrupt
.is_Node
.ln_Pri
= 0;
516 card
->interrupt
.is_Node
.ln_Name
= (STRPTR
) LibName
;
518 card
->interrupt
.is_Code
= (void(*)(void)) CardInterrupt
;
520 card
->interrupt
.is_Code
= (void(*)(void)) &cardinterrupt
;
522 card
->interrupt
.is_Data
= (APTR
) card
;
524 card
->playback_interrupt
.is_Node
.ln_Type
= IRQTYPE
;
525 card
->playback_interrupt
.is_Node
.ln_Pri
= 0;
526 card
->playback_interrupt
.is_Node
.ln_Name
= (STRPTR
) LibName
;
528 card
->playback_interrupt
.is_Code
= PlaybackInterrupt
;
530 card
->playback_interrupt
.is_Code
= (void(*)(void)) &playbackinterrupt
;
532 card
->playback_interrupt
.is_Data
= (APTR
) card
;
534 card
->record_interrupt
.is_Node
.ln_Type
= IRQTYPE
;
535 card
->record_interrupt
.is_Node
.ln_Pri
= 0;
536 card
->record_interrupt
.is_Node
.ln_Name
= (STRPTR
) LibName
;
538 card
->record_interrupt
.is_Code
= RecordInterrupt
;
540 card
->record_interrupt
.is_Code
= (void(*)(void)) &recordinterrupt
;
542 card
->record_interrupt
.is_Data
= (APTR
) card
;
546 command_word
= READCONFIGWORD( PCI_COMMAND
);
547 command_word
|= PCI_COMMAND_IO
| PCI_COMMAND_MEMORY
; // | PCI_COMMAND_MASTER;
548 WRITECONFIGWORD( PCI_COMMAND
, command_word
);
551 card
->pci_master_enabled
= TRUE
;
554 card
->iobase
= ahi_pci_get_base_address(0, dev
);
555 card
->mtbase
= ahi_pci_get_base_address(1, dev
);
556 card
->irq
= ahi_pci_get_irq(dev
);
557 card
->chiprev
= READCONFIGBYTE( PCI_REVISION_ID
);
558 card
->model
= READCONFIGWORD( PCI_SUBSYSTEM_ID
);
561 /*DEBUGPRINTF("---> chiprev = %u, model = %x, Vendor = %x\n", READCONFIGBYTE( PCI_REVISION_ID), READCONFIGWORD( PCI_SUBSYSTEM_ID),
562 READCONFIGWORD( PCI_SUBSYSTEM_VENDOR_ID));*/
566 if (SetupTimerDevice() == FALSE
)
571 /* Initialize chip */
572 if( card_init( card
) < 0 )
574 DEBUGPRINTF("Unable to initialize Card subsystem.");
579 //DEBUGPRINTF("INTERRUPT %lu\n", dev->MapInterrupt());
580 ahi_pci_add_intserver(&card
->interrupt
, dev
);
581 card
->interrupt_added
= TRUE
;
583 card
->card_initialized
= TRUE
;
585 if (card
->SubType
== REVO51
)
587 card
->input
= 1; // line in
594 card
->monitor_volume
= 0;
595 card
->input_gain
= 0x10000;
596 card
->output_volume
= 0x10000;
597 card
->input_is_24bits
= FALSE
;
598 card
->playback_buffer
= NULL
;
599 card
->current_bytesize
= 0;
601 //SaveMixerState(card);
604 AddResetHandler(card
);
611 /******************************************************************************
612 ** DriverData deallocation ****************************************************
613 ******************************************************************************/
615 // And this code used to be in _AHIsub_FreeAudio().
618 FreeDriverData( struct CardData
* card
,
619 struct DriverBase
* AHIsubBase
)
623 if( card
->pci_dev
!= NULL
)
625 if( card
->card_initialized
)
627 card_cleanup( card
);
630 if( card
->pci_master_enabled
)
633 struct PCIDevice
* dev
= card
->pci_dev
;
634 cmd
= READCONFIGWORD( PCI_COMMAND
);
635 cmd
&= ~( PCI_COMMAND_IO
| PCI_COMMAND_MEMORY
| PCI_COMMAND_MASTER
);
636 WRITECONFIGWORD( PCI_COMMAND
, cmd
);
640 if( card
->interrupt_added
)
642 ahi_pci_rem_intserver(&card
->interrupt
, card
->pci_dev
);
648 CleanUpTimerDevice();
652 static unsigned short wm_inits
[] = {
654 0x18, 0x000, /* All power-up */
656 0x1b, 0x022, /* ADC Mux (AIN1 = CD-in) */
657 0x1c, 0x00B, /* Output1 = DAC + Aux (= ac'97 mix), output2 = DAC */
658 0x1d, 0x009, /* Output3+4 = DAC */
660 0x16, 0x122, /* I2S, normal polarity, 24bit */
661 0x17, 0x022, /* 256fs, slave mode */
663 0x00, 0x17F, /* DAC1 analog mute */
664 0x01, 0x17F, /* DAC2 analog mute */
665 0x02, 0x17F, /* DAC3 analog mute */
666 0x03, 0x17F, /* DAC4 analog mute */
667 0x04, 0x7F, /* DAC5 analog mute */
668 0x05, 0x7F, /* DAC6 analog mute */
669 0x06, 0x7F, /* DAC7 analog mute */
670 0x07, 0x7F, /* DAC8 analog mute */
671 0x08, 0x17F, /* master analog mute */
672 0x09, 0x1ff, /* DAC1 digital full */
673 0x0a, 0x1ff, /* DAC2 digital full */
674 0x0b, 0xff, /* DAC3 digital full */
675 0x0c, 0xff, /* DAC4 digital full */
676 0x0d, 0xff, /* DAC5 digital full */
677 0x0e, 0xff, /* DAC6 digital full */
678 0x0f, 0xff, /* DAC7 digital full */
679 0x10, 0xff, /* DAC8 digital full */
680 0x11, 0x1ff, /* master digital full */
681 0x12, 0x000, /* phase normal */
682 0x13, 0x090, /* unmute DAC L/R */
683 0x14, 0x000, /* all unmute (bit 5 is rec enable) */
684 0x15, 0x000, /* no deemphasis, no ZFLG */
685 0x19, 0x0C, /* 0dB gain ADC/L */
686 0x1a, 0x0C /* 0dB gain ADC/R */
689 static unsigned short wm_inits_Phase28
[] = {
691 0x18, 0x000, /* All power-up */
693 0x1b, 0x000, /* ADC Mux (AIN1 = Line-in, no other inputs are present) */
694 0x1c, 0x009, /* Output1 = DAC , Output2 = DAC */
695 0x1d, 0x009, /* Output3+4 = DAC */
697 0x16, 0x122, /* I2S, normal polarity, 24bit */
698 0x17, 0x022, /* 256fs, slave mode */
700 0x00, 0x000, /* DAC1 analog mute */
701 0x01, 0x000, /* DAC2 analog mute */
702 0x02, 0x7F, /* DAC3 analog mute */
703 0x03, 0x7F, /* DAC4 analog mute */
704 0x04, 0x7F, /* DAC5 analog mute */
705 0x05, 0x7F, /* DAC6 analog mute */
706 0x06, 0x7F, /* DAC7 analog mute */
707 0x07, 0x7F, /* DAC8 analog mute */
708 0x08, 0x17F, /* master analog mute */
709 0x09, 0xff, /* DAC1 digital full */
710 0x0a, 0xff, /* DAC2 digital full */
711 0x0b, 0xff, /* DAC3 digital full */
712 0x0c, 0xff, /* DAC4 digital full */
713 0x0d, 0xff, /* DAC5 digital full */
714 0x0e, 0xff, /* DAC6 digital full */
715 0x0f, 0xff, /* DAC7 digital full */
716 0x10, 0xff, /* DAC8 digital full */
717 0x11, 0x1ff, /* master digital full */
718 0x12, 0x000, /* phase normal */
719 0x13, 0x090, /* unmute DAC L/R */
720 0x14, 0x000, /* all unmute (bit 5 is rec enable) */
721 0x15, 0x000, /* no deemphasis, no ZFLG */
722 0x19, 0x0C, /* 0dB gain ADC/L */
723 0x1a, 0x0C /* 0dB gain ADC/R */
726 static unsigned short cs_inits
[] = {
728 0x0180, /* no mute */
730 0x0605, /* master, 16-bit slave, 24bit */
734 int card_init(struct CardData
*card
)
736 struct PCIDevice
*dev
= (struct PCIDevice
*) card
->pci_dev
;
739 unsigned int tmp
, eepromsize
;
740 unsigned char eeprom
[128];
742 OUTBYTE(card
->mtbase
+ MT_AC97_CMD_STATUS
, MT_AC97_RESET
); // tbd
744 OUTBYTE(card
->mtbase
+ MT_AC97_CMD_STATUS
, 0x00); // tbd
746 //DEBUGPRINTF("Envy24HT: card_init %lx\n", card);
748 OUTBYTE(card
->iobase
+ CCS_POWER_DOWN
, 0); // power up the whole thing
751 OUTBYTE(card
->mtbase
+ CCS_CTRL
, CCS_RESET_ALL
);
753 ClearMask8(card
, card
->mtbase
, CCS_CTRL
, CCS_RESET_ALL
);
756 //DEBUGPRINTF("Envy24HT: reading eeprom\n");
757 if ((INBYTE(card
->iobase
+ CCS_I2C_STATUS
) & CCS_I2C_EPROM
) != 0)
759 unsigned long subvendor
= 0;
762 (ReadI2C(dev
, card
, 0x00) << 0) |
763 (ReadI2C(dev
, card
, 0x01) << 8) |
764 (ReadI2C(dev
, card
, 0x02) << 16) |
765 (ReadI2C(dev
, card
, 0x03) << 24);
769 case SUBVENDOR_AUREON_SKY
: card
->SubType
= AUREON_SKY
;
772 case SUBVENDOR_AUREON_SPACE
: card
->SubType
= AUREON_SPACE
;
775 case SUBVENDOR_PHASE28
: card
->SubType
= PHASE28
;
778 case SUBVENDOR_MAUDIO_REVOLUTION51
: card
->SubType
= REVO51
;
781 case SUBVENDOR_MAUDIO_REVOLUTION71
: card
->SubType
= REVO71
;
784 case SUBVENDOR_JULIA
: card
->SubType
= JULIA
;
787 case SUBVENDOR_PHASE22
: card
->SubType
= PHASE22
;
791 card
->SubType
= AUREON_SKY
;
794 DEBUGPRINTF("subvendor = %lx, Type = %d\n", subvendor
, card
->SubType
);
798 if (card
->SubType
== PHASE22
)
800 OUTBYTE(card
->iobase
+ CCS_SYSTEM_CONFIG
, 0x28);
801 OUTBYTE(card
->iobase
+ CCS_ACLINK_CONFIG
, 0x80); // AC-link
802 OUTBYTE(card
->iobase
+ CCS_I2S_FEATURES
, 0x70); // I2S
803 OUTBYTE(card
->iobase
+ CCS_SPDIF_CONFIG
, 0xC3); // S/PDIF
807 if (card
->SubType
== PHASE28
)
808 OUTBYTE(card
->iobase
+ CCS_SYSTEM_CONFIG
, 0x2B); // MIDI, ADC+SPDIF IN, 4 DACS
809 else if (card
->SubType
== AUREON_SPACE
)
810 OUTBYTE(card
->iobase
+ CCS_SYSTEM_CONFIG
, 0x0B); // ADC+SPDIF IN, 4 DACS
811 else if (card
->SubType
== REVO71
)
812 OUTBYTE(card
->iobase
+ CCS_SYSTEM_CONFIG
, 0x43); // XIN1 + ADC + 4 DACS
813 else if (card
->SubType
== REVO51
)
814 OUTBYTE(card
->iobase
+ CCS_SYSTEM_CONFIG
, 0x42);
815 else if (card
->SubType
== JULIA
)
816 OUTBYTE(card
->iobase
+ CCS_SYSTEM_CONFIG
, 0x20); // MIDI + ADC + DAC
817 else if (card
->SubType
== AUREON_SKY
)
818 OUTBYTE(card
->iobase
+ CCS_SYSTEM_CONFIG
, 0x0A); // ADC+SPDIF IN, 3 DACS
820 OUTBYTE(card
->iobase
+ CCS_ACLINK_CONFIG
, CCS_ACLINK_I2S
); // I2S in split mode
822 if (card
->SubType
== JULIA
)
823 OUTBYTE(card
->iobase
+ CCS_I2S_FEATURES
, CCS_I2S_96KHZ
| CCS_I2S_24BIT
| CCS_I2S_192KHZ
);
825 OUTBYTE(card
->iobase
+ CCS_I2S_FEATURES
, CCS_I2S_VOLMUTE
| CCS_I2S_96KHZ
| CCS_I2S_24BIT
| CCS_I2S_192KHZ
);
827 if (card
->SubType
== REVO71
|| card
->SubType
== REVO51
)
828 OUTBYTE(card
->iobase
+ CCS_SPDIF_CONFIG
, CCS_SPDIF_INTEGRATED
| CCS_SPDIF_INTERNAL_OUT
| CCS_SPDIF_EXTERNAL_OUT
);
830 OUTBYTE(card
->iobase
+ CCS_SPDIF_CONFIG
, CCS_SPDIF_INTEGRATED
| CCS_SPDIF_INTERNAL_OUT
| CCS_SPDIF_IN_PRESENT
| CCS_SPDIF_EXTERNAL_OUT
);
834 card
->SavedDir
= Dirs
[card
->SubType
];
835 OUTBYTE(card
->mtbase
+ MT_INTR_MASK
, MT_DMA_FIFO_MASK
);
837 if (card
->SubType
== REVO71
)
838 SetGPIOMask(card
, card
->iobase
, 0x00BFFF85);
839 else if (card
->SubType
== REVO51
)
840 SetGPIOMask(card
, card
->iobase
, 0x00BFFF05);
842 SetGPIOMask(card
, card
->iobase
, 0x00000000);
844 OUTLONG(card
->iobase
+ CCS_GPIO_DIR
, Dirs
[card
->SubType
]); // input/output
845 INWORD(card
->iobase
+ CCS_GPIO_DIR
);
847 if (card
->SubType
== REVO71
|| card
->SubType
== REVO51
) {
848 OUTWORD(card
->iobase
+ CCS_GPIO_DATA
, 0x0072);
849 OUTBYTE(card
->iobase
+ CCS_GPIO_DATA2
, 0x00);
851 else if (card
->SubType
== JULIA
) {
852 OUTWORD(card
->iobase
+ CCS_GPIO_DATA
, 0x3819);
855 OUTWORD(card
->iobase
+ CCS_GPIO_DATA
, 0x0000);
856 if (card
->SubType
!= PHASE22
)
857 OUTBYTE(card
->iobase
+ CCS_GPIO_DATA2
, 0x00);
859 INWORD(card
->iobase
+ CCS_GPIO_DATA
);
861 //SaveGPIO(dev, card);
863 if (card
->SubType
== REVO71
|| card
->SubType
== REVO51
)
864 OUTBYTE(card
->mtbase
+ MT_I2S_FORMAT
, 0x08);
866 OUTBYTE(card
->mtbase
+ MT_I2S_FORMAT
, 0);
868 if (card
->SubType
== AUREON_SKY
|| card
->SubType
== AUREON_SPACE
|| card
->SubType
== PHASE28
)
870 if (card
->SubType
== AUREON_SKY
|| card
->SubType
== AUREON_SPACE
)
872 aureon_ac97_init(card
, card
->iobase
);
873 SetGPIOMask(card
, card
->iobase
, ~(AUREON_WM_RESET
| AUREON_WM_CS
| AUREON_CS8415_CS
));
875 else if (card
->SubType
== PHASE28
)
876 SetGPIOMask(card
, card
->iobase
, ~(AUREON_WM_RESET
| AUREON_WM_CS
));
879 tmp
= GetGPIOData(card
, card
->iobase
);
880 tmp
&= ~AUREON_WM_RESET
;
881 SetGPIOData(card
, card
->iobase
, tmp
);
884 if (card
->SubType
!= PHASE28
)
885 tmp
|= AUREON_WM_CS
| AUREON_CS8415_CS
;
889 SetGPIOData(card
, card
->iobase
, tmp
);
891 tmp
|= AUREON_WM_RESET
;
892 SetGPIOData(card
, card
->iobase
, tmp
);
895 if (card
->SubType
!= PHASE28
)
897 /* initialize WM8770 codec */
898 for (i
= 0; i
< 60; i
+= 2)
900 wm_put(card
, card
->iobase
, wm_inits
[i
], wm_inits
[i
+1]);
903 /* initialize CS8415A codec */
904 for (i
= 0; i
< 4; i
++)
905 aureon_spi_write(card
, card
->iobase
, AUREON_CS8415_CS
, cs_inits
[i
] | 0x200000, 24);
909 /* initialize WM8770 codec */
910 for (i
= 0; i
< 60; i
+= 2)
912 wm_put(card
, card
->iobase
, wm_inits_Phase28
[i
], wm_inits_Phase28
[i
+1]);
916 else if (card
->SubType
== REVO51
)
918 card
->RevoFrontCodec
= ALLOCVEC(sizeof(struct akm_codec
), MEMF_ANY
);
919 card
->RevoFrontCodec
->caddr
= 2;
920 card
->RevoFrontCodec
->cif
= 0;
921 card
->RevoFrontCodec
->datamask
= REVO_CDOUT
;
922 card
->RevoFrontCodec
->clockmask
= REVO_CCLK
;
923 card
->RevoFrontCodec
->csmask
= REVO_CS0
| REVO_CS1
;
924 card
->RevoFrontCodec
->csaddr
= REVO_CS1
;
925 card
->RevoFrontCodec
->csnone
= REVO_CS0
| REVO_CS1
;
926 card
->RevoFrontCodec
->addflags
= REVO_CCLK
;
927 card
->RevoFrontCodec
->type
= AKM4358
;
928 card
->RevoFrontCodec
->totalmask
= 0;
929 card
->RevoFrontCodec
->newflag
= 1;
932 card
->RevoSurroundCodec
= NULL
;
934 card
->RevoRecCodec
= ALLOCVEC(sizeof(struct akm_codec
), MEMF_ANY
);
935 card
->RevoRecCodec
->caddr
= 2;
936 card
->RevoRecCodec
->csmask
= REVO_CS0
| REVO_CS1
;
937 card
->RevoRecCodec
->clockmask
= REVO_CCLK
;
938 card
->RevoRecCodec
->datamask
= REVO_CDOUT
;
939 card
->RevoRecCodec
->type
= AKM5365
;
940 card
->RevoRecCodec
->cif
= 0;
941 card
->RevoRecCodec
->addflags
= REVO_CCLK
;
942 card
->RevoRecCodec
->csaddr
= REVO_CS0
;
943 card
->RevoRecCodec
->csnone
= REVO_CS0
| REVO_CS1
;
944 card
->RevoRecCodec
->totalmask
= 0;
945 card
->RevoRecCodec
->newflag
= 1;
947 OUTBYTE(card
->mtbase
+ MT_SAMPLERATE
, 8);
950 unsigned int tmp
= GetGPIOData(card
, card
->iobase
);
951 tmp
&= ~REVO_MUTE
; // mute
952 SetGPIOData(card
, card
->iobase
, tmp
);
955 Init_akm4xxx(card
, card
->RevoFrontCodec
);
958 unsigned int tmp
= GetGPIOData(card
, card
->iobase
);
959 tmp
|= REVO_MUTE
; // unmute
960 SetGPIOData(card
, card
->iobase
, tmp
);
963 // Has to be after mute, otherwise the mask is changed in Revo51_Init() which enables the mute mask bit...
964 Revo51_Init(card
); // I2C
966 else if (card
->SubType
== REVO71
)
968 card
->RevoFrontCodec
= ALLOCVEC(sizeof(struct akm_codec
), MEMF_ANY
);
969 card
->RevoFrontCodec
->caddr
= 1;
970 card
->RevoFrontCodec
->csmask
= REVO_CS1
;
971 card
->RevoFrontCodec
->clockmask
= REVO_CCLK
;
972 card
->RevoFrontCodec
->datamask
= REVO_CDOUT
;
973 card
->RevoFrontCodec
->type
= AKM4381
;
974 card
->RevoFrontCodec
->cif
= 0;
975 card
->RevoFrontCodec
->addflags
= 0; //REVO_CCLK;?
977 card
->RevoSurroundCodec
= ALLOCVEC(sizeof(struct akm_codec
), MEMF_ANY
);
978 card
->RevoSurroundCodec
->caddr
= 3;
979 card
->RevoSurroundCodec
->csmask
= REVO_CS2
;
980 card
->RevoSurroundCodec
->clockmask
= REVO_CCLK
;
981 card
->RevoSurroundCodec
->datamask
= REVO_CDOUT
;
982 card
->RevoSurroundCodec
->type
= AKM4355
;
983 card
->RevoSurroundCodec
->cif
= 0;
984 card
->RevoSurroundCodec
->addflags
= 0; //REVO_CCLK;?
986 OUTBYTE(card
->mtbase
+ MT_SAMPLERATE
, 8);
989 unsigned int tmp
= GetGPIOData(card
, card
->iobase
);
990 tmp
&= ~REVO_MUTE
; // mute
991 SetGPIOData(card
, card
->iobase
, tmp
);
994 Init_akm4xxx(card
, card
->RevoFrontCodec
);
995 Init_akm4xxx(card
, card
->RevoSurroundCodec
);
996 //revo_i2s_mclk_changed(card);
999 unsigned int tmp
= GetGPIOData(card
, card
->iobase
);
1000 tmp
|= REVO_MUTE
; // unmute
1001 SetGPIOData(card
, card
->iobase
, tmp
);
1005 else if (card
->SubType
== JULIA
)
1007 unsigned char *ptr
, reg
, data
;
1011 static unsigned char inits_ak4114
[] = {
1012 0x00, 0x00, // power down & reset
1013 0x00, 0x0F, // power on
1015 0x02, 0x80, // TX1 output enable
1016 0x03, 0x49, // 1024 LRCK + transmit data
1017 0x04, 0x00, // no mask
1018 0x05, 0x00, // no mask
1028 while (*ptr
!= 0xff) {
1031 WriteI2C(dev
, card
, AK4358_ADDR
, reg
, data
);
1036 while (*ptr
!= 0xff) {
1039 WriteI2C(dev
, card
, AK4114_ADDR
, reg
, data
);
1043 OUTBYTE(card
->mtbase
+ MT_SAMPLERATE
, MT_SPDIF_MASTER
);
1044 OUTLONG(card
->mtbase
+ 0x2C, 0x300200); // route
1046 else if (card
->SubType
== PHASE22
)
1050 card
->RevoFrontCodec
= ALLOCVEC(sizeof(struct akm_codec
), MEMF_ANY
);
1051 card
->RevoFrontCodec
->caddr
= 2;
1052 card
->RevoFrontCodec
->csmask
= 1 << 10;
1053 card
->RevoFrontCodec
->clockmask
= 1 << 5;
1054 card
->RevoFrontCodec
->datamask
= 1 << 4;
1055 card
->RevoFrontCodec
->type
= AKM4524
;
1056 card
->RevoFrontCodec
->cif
= 1;
1057 card
->RevoFrontCodec
->addflags
= 1 << 3;
1059 Init_akm4xxx(card
, card
->RevoFrontCodec
);
1062 //RestoreGPIO(dev, card);
1064 ClearMask8(card
, card
->iobase
, CCS_INTR_MASK
, CCS_INTR_PLAYREC
); // enable
1066 // Enter SPI mode for CS8415A digital receiver
1067 /*SetGPIOMask(card, card->iobase, ~(AUREON_CS8415_CS));
1068 tmp |= AUREON_CS8415_CS;
1069 SetGPIOData(card, card->iobase, tmp); // set CS high
1072 tmp &= ~AUREON_CS8415_CS;
1073 SetGPIOData(card, card->iobase, tmp); // set CS low
1076 // WritePartialMask(card, card->mtbase, 0x2C, 8, 7, 6); // this line is to route the s/pdif input to the left
1077 // analogue output for testing purposes
1083 void card_cleanup(struct CardData
*card
)
1089 /******************************************************************************
1090 ** Misc. **********************************************************************
1091 ******************************************************************************/
1094 SaveMixerState( struct CardData
* card
)
1100 RestoreMixerState( struct CardData
* card
)
1105 UpdateMonitorMixer( struct CardData
* card
)
1111 Linear2MixerGain( Fixed linear
,
1114 static const Fixed gain
[ 256 ] =
1376 while( linear
> gain
[ v
] && v
< 255)
1388 Linear2AKMGain( Fixed linear
,
1391 static const Fixed gain
[ 101 ] =
1499 while( linear
> gain
[ v
] && v
< 100)
1512 Linear2RecordGain( Fixed linear
,
1515 static const Fixed gain
[ 32 ] =
1553 while( linear
> gain
[ v
] && v
< 32)
1565 SamplerateToLinearPitch( ULONG samplingrate
)
1567 samplingrate
= (samplingrate
<< 8) / 375;
1568 return (samplingrate
>> 1) + (samplingrate
& 1);
1572 #define CACHELINE_SIZE 4096
1574 void *pci_alloc_consistent(size_t size
, APTR
*NonAlignedAddress
, unsigned int boundary
)
1580 if (IExec
->OpenResource("newmemory.resource"))
1582 address
= ALLOCVECTags(size
, AVT_Type
, MEMF_SHARED
, AVT_Contiguous
, TRUE
, AVT_Lock
, TRUE
,
1583 AVT_PhysicalAlignment
, 32, AVT_Clear
, 0, TAG_DONE
);
1587 address
= ALLOCVEC( size
+ CACHELINE_SIZE
, MEMF_PUBLIC
| MEMF_CLEAR
);
1589 if( address
!= NULL
)
1591 a
= (unsigned long) address
;
1592 a
= (a
+ CACHELINE_SIZE
- 1) & ~(CACHELINE_SIZE
- 1);
1593 address
= (void *) a
;
1597 *NonAlignedAddress
= address
;
1605 //address = AllocVecDMA(size + boundary, MEMF_PUBLIC | MEMF_CLEAR);
1607 address
= AllocVec(size
+ CACHELINE_SIZE
- 1, MEMF_PUBLIC
& ~MEMF_CLEAR
);
1609 FreeMem(address
, size
+ CACHELINE_SIZE
- 1);
1610 address
= AllocAbs(size
, (void*) ((ULONG
) (address
+ CACHELINE_SIZE
- 1) & ~(CACHELINE_SIZE
-1) ) );
1613 address
= AllocVecDMA(size
, MEMF_PUBLIC
| MEMF_CLEAR
);
1614 *NonAlignedAddress
= address
;
1616 memset(address
, 0, size
);
1621 address
= AllocVec(size
+ boundary
, MEMF_PUBLIC
| MEMF_CLEAR
);
1623 if (address
!= NULL
)
1625 a
= (unsigned long) address
;
1626 a
= (a
+ boundary
- 1) & ~(boundary
- 1);
1627 address
= (void *) a
;
1630 if (NonAlignedAddress
)
1632 *NonAlignedAddress
= address
;
1641 void pci_free_consistent(void* addr
)
1651 static ULONG
ResetHandler(struct ExceptionContext
*ctx
, struct ExecBase
*pExecBase
, struct CardData
*card
)
1653 struct PCIDevice
*dev
= card
->pci_dev
;
1655 ClearMask8(card
, card
->mtbase
, MT_DMA_CONTROL
, MT_PDMA0_START
| MT_PDMA4_START
| MT_RDMA0_MASK
| MT_RDMA1_MASK
);
1656 WriteMask8(card
, card
->mtbase
, MT_INTR_MASK
, MT_DMA_FIFO_MASK
| MT_PDMA0_MASK
| MT_RDMA0_MASK
| MT_RDMA1_MASK
);
1661 void AddResetHandler(struct CardData
*card
)
1663 static struct Interrupt interrupt
;
1665 interrupt
.is_Code
= (void (*)())ResetHandler
;
1666 interrupt
.is_Data
= (APTR
) card
;
1667 interrupt
.is_Node
.ln_Pri
= 0;
1668 interrupt
.is_Node
.ln_Type
= NT_EXTINTERRUPT
;
1669 interrupt
.is_Node
.ln_Name
= "reset handler";
1671 IExec
->AddResetCallback( &interrupt
);
1678 if ((INBYTE(card
->iobase
+ CCS_I2C_STATUS
) & CCS_I2C_EPROM
) == 0)
1680 DEBUGPRINTF("No EEPROM found!\n");
1684 DEBUGPRINTF("EEPROM found!\n");
1688 /*OUTBYTE(card->iobase + CCS_I2C_DATA, 0x11);
1689 OUTBYTE(card->iobase + CCS_I2C_ADDR, 0);
1691 while (INBYTE(card->iobase + CCS_I2C_STATUS) & CCS_I2C_BUSY)
1694 OUTBYTE(card->iobase + CCS_I2C_DEV_ADDRESS, 0xA0);
1697 for (i
= 0; i
< 6; i
++)
1699 OUTBYTE(card
->iobase
+ CCS_I2C_ADDR
, i
);
1701 while (INBYTE(card
->iobase
+ CCS_I2C_STATUS
) & CCS_I2C_BUSY
)
1705 OUTBYTE(card
->iobase
+ CCS_I2C_DEV_ADDRESS
, 0xA0);
1707 while (INBYTE(card
->iobase
+ CCS_I2C_STATUS
) & CCS_I2C_BUSY
)
1712 DEBUGPRINTF("%d = %x\n",i
, INBYTE(card
->iobase
+ CCS_I2C_DATA
));