diff --git a/src/add-ons/kernel/drivers/audio/emuxki/emuxki.c b/src/add-ons/kernel/drivers/audio/emuxki/emuxki.c index 8bb38525b4..db64289be5 100644 --- a/src/add-ons/kernel/drivers/audio/emuxki/emuxki.c +++ b/src/add-ons/kernel/drivers/audio/emuxki/emuxki.c @@ -473,6 +473,11 @@ emuxki_channel_commit_fx(emuxki_channel *chan) uint8 chano = chan->num; 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, (chan->fxsend.d.dest << 24) | (chan->fxsend.c.dest << 16) | @@ -1969,7 +1974,21 @@ emuxki_int(void *arg) 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) 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); + 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)); 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)) { 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_reg_write_32(&card->config, EMU_A2_DATA, + emuxki_p16v_write(&card->config, 0, EMU_A2_SRCSEL, EMU_A2_SRCSEL_ENABLE_SPDIF | EMU_A2_SRCSEL_ENABLE_SRCMULTI); - + if (card->info.revision == 4) { - emuxki_reg_write_32(&card->config, EMU_A2_PTR, EMU_A2_SRCMULTI); - emuxki_reg_write_32(&card->config, EMU_A2_DATA, EMU_A2_SRCMULTI_ENABLE_INPUT); + emuxki_p16v_write(&card->config, 0, EMU_A2_SRCMULTI, EMU_A2_SRCMULTI_ENABLE_INPUT); } else { - emuxki_reg_write_32(&card->config, EMU_A2_PTR, EMU_A2_SRCMULTI2); - emuxki_reg_write_32(&card->config, EMU_A2_DATA, EMU_A2_SRCMULTI2_ENABLE_INPUT); + emuxki_p16v_write(&card->config, 0, EMU_A2_P17V_I2S, EMU_A2_P17V_I2S_ENABLE); + 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); } } diff --git a/src/add-ons/kernel/drivers/audio/emuxki/emuxkireg.h b/src/add-ons/kernel/drivers/audio/emuxki/emuxkireg.h index 60c8bcd91b..904738f64a 100644 --- a/src/add-ons/kernel/drivers/audio/emuxki/emuxkireg.h +++ b/src/add-ons/kernel/drivers/audio/emuxki/emuxkireg.h @@ -189,14 +189,21 @@ #define EMU_A2_PTR 0x20 #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_SRCMULTI 0x00000010 -#define EMU_A2_SRCMULTI 0x6e0000 +#define EMU_A2_SRCMULTI 0x6e #define EMU_A2_SRCMULTI_ENABLE_INPUT 0xff00ff00 -#define EMU_A2_SRCMULTI2 0x7b0000 -#define EMU_A2_SRCMULTI2_ENABLE_INPUT 0xff000000 +#define EMU_A2_P17V_SPDIF 0x7a +#define EMU_A2_P17V_SPDIF_ENABLE 0xff000000 +#define EMU_A2_P17V_I2S 0x7b +#define EMU_A2_P17V_I2S_ENABLE 0xff000000 /* -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- */ diff --git a/src/add-ons/kernel/drivers/audio/emuxki/io.c b/src/add-ons/kernel/drivers/audio/emuxki/io.c index 8fcd37468c..ce492453d4 100644 --- a/src/add-ons/kernel/drivers/audio/emuxki/io.c +++ b/src/add-ons/kernel/drivers/audio/emuxki/io.c @@ -226,3 +226,19 @@ emuxki_inte_disable(device_config *config, uint32 value) emuxki_reg_write_32(config, EMU_INTE, 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); +} diff --git a/src/add-ons/kernel/drivers/audio/emuxki/io.h b/src/add-ons/kernel/drivers/audio/emuxki/io.h index 679c1b1e55..9042d8bbf6 100644 --- a/src/add-ons/kernel/drivers/audio/emuxki/io.h +++ b/src/add-ons/kernel/drivers/audio/emuxki/io.h @@ -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_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