28 #include <linux/time.h>
39 while (((status =
inl(emu->port +
IPR)) != 0) && (timeout < 1000)) {
43 if ((status & 0xffffffff) == 0xffffffff) {
47 if (status & IPR_PCIERROR) {
50 status &= ~IPR_PCIERROR;
52 if (status & (IPR_VOLINCR|IPR_VOLDECR|IPR_MUTE)) {
53 if (emu->hwvol_interrupt)
54 emu->hwvol_interrupt(emu, status);
57 status &= ~(IPR_VOLINCR|IPR_VOLDECR|IPR_MUTE);
59 if (status & IPR_CHANNELLOOP) {
61 int voice_max = status & IPR_CHANNELNUMBERMASK;
63 struct snd_emu10k1_voice *pvoice = emu->voices;
66 for (voice = 0; voice <= voice_max; voice++) {
70 if (pvoice->use && pvoice->interrupt !=
NULL) {
71 pvoice->interrupt(emu, pvoice);
81 for (voice = 0; voice <= voice_max; voice++) {
85 if (pvoice->use && pvoice->interrupt !=
NULL) {
86 pvoice->interrupt(emu, pvoice);
95 status &= ~IPR_CHANNELLOOP;
97 status &= ~IPR_CHANNELNUMBERMASK;
98 if (status & (IPR_ADCBUFFULL|IPR_ADCBUFHALFFULL)) {
99 if (emu->capture_interrupt)
100 emu->capture_interrupt(emu, status);
103 status &= ~(IPR_ADCBUFFULL|IPR_ADCBUFHALFFULL);
105 if (status & (IPR_MICBUFFULL|IPR_MICBUFHALFFULL)) {
106 if (emu->capture_mic_interrupt)
107 emu->capture_mic_interrupt(emu, status);
110 status &= ~(IPR_MICBUFFULL|IPR_MICBUFHALFFULL);
112 if (status & (IPR_EFXBUFFULL|IPR_EFXBUFHALFFULL)) {
113 if (emu->capture_efx_interrupt)
114 emu->capture_efx_interrupt(emu, status);
117 status &= ~(IPR_EFXBUFFULL|IPR_EFXBUFHALFFULL);
120 if (emu->midi.interrupt)
121 emu->midi.interrupt(emu, status);
126 if (status & (IPR_A_MIDITRANSBUFEMPTY2|IPR_A_MIDIRECVBUFEMPTY2)) {
127 if (emu->midi2.interrupt)
128 emu->midi2.interrupt(emu, status);
131 status &= ~(IPR_A_MIDITRANSBUFEMPTY2|IPR_A_MIDIRECVBUFEMPTY2);
133 if (status & IPR_INTERVALTIMER) {
138 status &= ~IPR_INTERVALTIMER;
140 if (status & (IPR_GPSPDIFSTATUSCHANGE|IPR_CDROMSTATUSCHANGE)) {
141 if (emu->spdif_interrupt)
142 emu->spdif_interrupt(emu, status);
145 status &= ~(IPR_GPSPDIFSTATUSCHANGE|IPR_CDROMSTATUSCHANGE);
147 if (status & IPR_FXDSP) {
148 if (emu->dsp_interrupt)
149 emu->dsp_interrupt(emu);
152 status &= ~IPR_FXDSP;
154 if (status & IPR_P16V) {
155 while ((status2 =
inl(emu->port + IPR2)) != 0) {
156 u32 mask = INTE2_PLAYBACK_CH_0_LOOP;
157 struct snd_emu10k1_voice *pvoice = &(emu->p16v_voices[0]);
158 struct snd_emu10k1_voice *cvoice = &(emu->p16v_capture_voice);
166 snd_printk(
KERN_ERR "p16v: status: 0x%08x, mask=0x%08x, pvoice=%p, use=%d\n", status2, mask, pvoice, pvoice->use);
169 if(status2 & 0x110000) {
176 outl(orig_status2, emu->port + IPR2);
185 bits = INTE_FXDSPENABLE |
186 INTE_PCIERRORENABLE |
195 INTE_INTERVALTIMERENB |
199 bits |= INTE_A_MIDITXENABLE2 | INTE_A_MIDIRXENABLE2;
202 outl(orig_status, emu->port +
IPR);