#define MIX_SB16_VOICE_R 0x33\r
#define MIX_SB16_IRQ_SEL 0x80\r
#define MIX_SB16_DMA_SEL 0x81\r
+#define MIX_SB16_INTSTAT 0x82\r
+\r
+#define INTSTAT_DMA8 0x01\r
+#define INTSTAT_DMA16 0x02\r
+#define INTSTAT_MPU401 0x04\r
\r
#define VER_MAJOR(x) ((x) >> 8)\r
#define VER_MINOR(x) ((x) & 0xff)\r
/* DSP 4.x - SB16 */\r
val = vol & 0xf8;\r
if(ctl == AUDIO_PCM) {\r
- write_mix(MIX_SB16_VOICE_L, vol);\r
- write_mix(MIX_SB16_VOICE_R, vol);\r
+ write_mix(MIX_SB16_VOICE_L, val);\r
+ write_mix(MIX_SB16_VOICE_R, val);\r
} else {\r
- write_mix(MIX_SB16_MASTER_L, vol);\r
- write_mix(MIX_SB16_MASTER_R, vol);\r
+ write_mix(MIX_SB16_MASTER_L, val);\r
+ write_mix(MIX_SB16_MASTER_R, val);\r
}\r
\r
} else if(VER_MAJOR(dsp_ver) >= 3) {\r
}\r
\r
val = read_mix(lreg);\r
- left = (val & 0xf8) | ((val >> 3) & 7); /* duplicate last 3 bits */\r
+ left = (val & 0xf8) | (val >> 5);\r
val = read_mix(rreg);\r
- right = (val & 0xf8) | ((val >> 3) & 7);\r
+ right = (val & 0xf8) | (val >> 5);\r
\r
} else if(VER_MAJOR(dsp_ver) >= 3) {\r
/* DSP 3.x - SBPro */\r
if(cur_bits == 8) {\r
inp(REG_INTACK);\r
} else {\r
- /*\r
- unsigned char istat;\r
- outp(REG_MIXPORT, 0x82);\r
- istat = inp(REG_MIXDATA);\r
- if(istat & 2) {\r
- */\r
+ unsigned char istat = read_mix(MIX_SB16_INTSTAT);\r
+ if(istat & INTSTAT_DMA16) {\r
inp(REG_INT16ACK);\r
- //}\r
+ }\r
}\r
\r
if(irq > 7) {\r
return inp(REG_RDATA);\r
}\r
\r
-static void write_mix(unsigned char val, int reg)\r
+static void write_mix(int reg, unsigned char val)\r
{\r
outp(REG_MIXPORT, reg);\r
outp(REG_MIXDATA, val);\r
}\r
if(!irq) {\r
/* try to force IRQ 5 */\r
- write_mix(2, MIX_SB16_IRQ_SEL); /* bit1 selects irq 5 */\r
+ write_mix(MIX_SB16_IRQ_SEL, 2); /* bit1 selects irq 5 */\r
\r
/* re-read to verify */\r
irqsel = read_mix(MIX_SB16_IRQ_SEL);\r
}\r
\r
if(dma_chan == -1 || dma16_chan == -1) {\r
- write_mix(dmasel, MIX_SB16_DMA_SEL);\r
+ write_mix(MIX_SB16_DMA_SEL, dmasel);\r
\r
/* re-read to verify */\r
tmp = read_mix(MIX_SB16_DMA_SEL);\r