added some more support for Audigy 2, untested
git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@23253 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
@@ -473,6 +473,11 @@ emuxki_channel_commit_fx(emuxki_channel *chan)
|
|||||||
uint8 chano = chan->num;
|
uint8 chano = chan->num;
|
||||||
|
|
||||||
if(IS_AUDIGY(&card->config)) {
|
if(IS_AUDIGY(&card->config)) {
|
||||||
|
emuxki_chan_write(&card->config, chano, 0x4c, 0);
|
||||||
|
emuxki_chan_write(&card->config, chano, 0x4d, 0);
|
||||||
|
emuxki_chan_write(&card->config, chano, 0x4e, 0);
|
||||||
|
emuxki_chan_write(&card->config, chano, 0x4f, 0);
|
||||||
|
|
||||||
emuxki_chan_write(&card->config, chano, EMU_A_CHAN_FXRT1,
|
emuxki_chan_write(&card->config, chano, EMU_A_CHAN_FXRT1,
|
||||||
(chan->fxsend.d.dest << 24) |
|
(chan->fxsend.d.dest << 24) |
|
||||||
(chan->fxsend.c.dest << 16) |
|
(chan->fxsend.c.dest << 16) |
|
||||||
@@ -1969,7 +1974,21 @@ emuxki_int(void *arg)
|
|||||||
|
|
||||||
emuxki_reg_write_32(&card->config, EMU_IPR, ipr);
|
emuxki_reg_write_32(&card->config, EMU_IPR, ipr);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(IS_AUDIGY2(&card->config)) {
|
||||||
|
while ((ipr = emuxki_reg_read_32(&card->config, EMU_A2_IPR2))) {
|
||||||
|
emuxki_reg_write_32(&card->config, EMU_A2_IPR2, ipr);
|
||||||
|
break; // avoid loop
|
||||||
|
}
|
||||||
|
|
||||||
|
if (card->info.revision == 4) {
|
||||||
|
while ((ipr = emuxki_reg_read_32(&card->config, EMU_A2_IPR3))) {
|
||||||
|
emuxki_reg_write_32(&card->config, EMU_A2_IPR3, ipr);
|
||||||
|
break; // avoid loop
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if(gotone)
|
if(gotone)
|
||||||
return B_INVOKE_SCHEDULER;
|
return B_INVOKE_SCHEDULER;
|
||||||
|
|
||||||
@@ -2155,6 +2174,12 @@ emuxki_setup(emuxki_dev * card)
|
|||||||
}
|
}
|
||||||
|
|
||||||
emuxki_reg_write_32(&card->config, EMU_INTE, EMU_INTE_SAMPLERATER | EMU_INTE_PCIERRENABLE);
|
emuxki_reg_write_32(&card->config, EMU_INTE, EMU_INTE_SAMPLERATER | EMU_INTE_PCIERRENABLE);
|
||||||
|
if(IS_AUDIGY2(&card->config)) {
|
||||||
|
emuxki_reg_write_32(&card->config, EMU_A2_INTE2, 0);
|
||||||
|
if (card->info.revision == 4) {
|
||||||
|
emuxki_reg_write_32(&card->config, EMU_A2_INTE3, 0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
PRINT(("installing interrupt : %lx\n", card->config.irq));
|
PRINT(("installing interrupt : %lx\n", card->config.irq));
|
||||||
install_io_interrupt_handler(card->config.irq, emuxki_int, card, 0);
|
install_io_interrupt_handler(card->config.irq, emuxki_int, card, 0);
|
||||||
@@ -2654,16 +2679,17 @@ emuxki_init(emuxki_dev * card)
|
|||||||
if(IS_AUDIGY2(&card->config)) {
|
if(IS_AUDIGY2(&card->config)) {
|
||||||
emuxki_chan_write(&card->config, 0, EMU_A2_SPDIF_SAMPLERATE, EMU_A2_SPDIF_UNKNOWN);
|
emuxki_chan_write(&card->config, 0, EMU_A2_SPDIF_SAMPLERATE, EMU_A2_SPDIF_UNKNOWN);
|
||||||
|
|
||||||
emuxki_reg_write_32(&card->config, EMU_A2_PTR, EMU_A2_SRCSEL);
|
emuxki_p16v_write(&card->config, 0, EMU_A2_SRCSEL,
|
||||||
emuxki_reg_write_32(&card->config, EMU_A2_DATA,
|
|
||||||
EMU_A2_SRCSEL_ENABLE_SPDIF | EMU_A2_SRCSEL_ENABLE_SRCMULTI);
|
EMU_A2_SRCSEL_ENABLE_SPDIF | EMU_A2_SRCSEL_ENABLE_SRCMULTI);
|
||||||
|
|
||||||
if (card->info.revision == 4) {
|
if (card->info.revision == 4) {
|
||||||
emuxki_reg_write_32(&card->config, EMU_A2_PTR, EMU_A2_SRCMULTI);
|
emuxki_p16v_write(&card->config, 0, EMU_A2_SRCMULTI, EMU_A2_SRCMULTI_ENABLE_INPUT);
|
||||||
emuxki_reg_write_32(&card->config, EMU_A2_DATA, EMU_A2_SRCMULTI_ENABLE_INPUT);
|
|
||||||
} else {
|
} else {
|
||||||
emuxki_reg_write_32(&card->config, EMU_A2_PTR, EMU_A2_SRCMULTI2);
|
emuxki_p16v_write(&card->config, 0, EMU_A2_P17V_I2S, EMU_A2_P17V_I2S_ENABLE);
|
||||||
emuxki_reg_write_32(&card->config, EMU_A2_DATA, EMU_A2_SRCMULTI2_ENABLE_INPUT);
|
emuxki_p16v_write(&card->config, 0, EMU_A2_P17V_SPDIF, EMU_A2_P17V_SPDIF_ENABLE);
|
||||||
|
|
||||||
|
emuxki_reg_write_32(&card->config, EMU_A_IOCFG,
|
||||||
|
emuxki_reg_read_32(&card->config, EMU_A_IOCFG) & ~0x8);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -189,14 +189,21 @@
|
|||||||
|
|
||||||
#define EMU_A2_PTR 0x20
|
#define EMU_A2_PTR 0x20
|
||||||
#define EMU_A2_DATA 0x24
|
#define EMU_A2_DATA 0x24
|
||||||
|
#define EMU_A2_IPR2 0x28
|
||||||
|
#define EMU_A2_INTE2 0x2c
|
||||||
|
#define EMU_A2_HCFG2 0x34
|
||||||
|
#define EMU_A2_IPR3 0x38
|
||||||
|
#define EMU_A2_INTE3 0x3c
|
||||||
|
|
||||||
#define EMU_A2_SRCSEL 0x600000
|
#define EMU_A2_SRCSEL 0x60
|
||||||
#define EMU_A2_SRCSEL_ENABLE_SPDIF 0x00000004
|
#define EMU_A2_SRCSEL_ENABLE_SPDIF 0x00000004
|
||||||
#define EMU_A2_SRCSEL_ENABLE_SRCMULTI 0x00000010
|
#define EMU_A2_SRCSEL_ENABLE_SRCMULTI 0x00000010
|
||||||
#define EMU_A2_SRCMULTI 0x6e0000
|
#define EMU_A2_SRCMULTI 0x6e
|
||||||
#define EMU_A2_SRCMULTI_ENABLE_INPUT 0xff00ff00
|
#define EMU_A2_SRCMULTI_ENABLE_INPUT 0xff00ff00
|
||||||
#define EMU_A2_SRCMULTI2 0x7b0000
|
#define EMU_A2_P17V_SPDIF 0x7a
|
||||||
#define EMU_A2_SRCMULTI2_ENABLE_INPUT 0xff000000
|
#define EMU_A2_P17V_SPDIF_ENABLE 0xff000000
|
||||||
|
#define EMU_A2_P17V_I2S 0x7b
|
||||||
|
#define EMU_A2_P17V_I2S_ENABLE 0xff000000
|
||||||
|
|
||||||
/* -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- */
|
/* -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- */
|
||||||
|
|
||||||
|
|||||||
@@ -226,3 +226,19 @@ emuxki_inte_disable(device_config *config, uint32 value)
|
|||||||
emuxki_reg_write_32(config, EMU_INTE,
|
emuxki_reg_write_32(config, EMU_INTE,
|
||||||
emuxki_reg_read_32(config, EMU_INTE) & ~value);
|
emuxki_reg_read_32(config, EMU_INTE) & ~value);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* p16v */
|
||||||
|
uint32
|
||||||
|
emuxki_p16v_read(device_config *config, uint16 chano, uint16 reg)
|
||||||
|
{
|
||||||
|
emuxki_reg_write_32(config, EMU_A2_PTR, reg << 16 | chano);
|
||||||
|
return emuxki_reg_read_32(config, EMU_A2_DATA);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
emuxki_p16v_write(device_config *config, uint16 chano, uint16 reg, uint32 data)
|
||||||
|
{
|
||||||
|
emuxki_reg_write_32(config, EMU_A2_PTR, reg << 16 | chano);
|
||||||
|
emuxki_reg_write_32(config, EMU_A2_DATA, data);
|
||||||
|
}
|
||||||
|
|||||||
@@ -57,5 +57,8 @@ void emuxki_codec_write(device_config *config, int regno, uint16 value);
|
|||||||
|
|
||||||
void emuxki_inte_enable(device_config *config, uint32 value);
|
void emuxki_inte_enable(device_config *config, uint32 value);
|
||||||
void emuxki_inte_disable(device_config *config, uint32 value);
|
void emuxki_inte_disable(device_config *config, uint32 value);
|
||||||
|
|
||||||
|
uint32 emuxki_p16v_read(device_config *config, uint16 chano, uint16 reg);
|
||||||
|
void emuxki_p16v_write(device_config *config, uint16 chano, uint16 reg, uint32 data);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
Reference in New Issue
Block a user