vserver 2.0 rc7
[linux-2.6.git] / sound / pci / emu10k1 / io.c
index dfe327a..b9d3ae0 100644 (file)
@@ -91,6 +91,38 @@ void snd_emu10k1_ptr_write(emu10k1_t *emu, unsigned int reg, unsigned int chn, u
        }
 }
 
+unsigned int snd_emu10k1_ptr20_read(emu10k1_t * emu, 
+                                         unsigned int reg, 
+                                         unsigned int chn)
+{
+       unsigned long flags;
+       unsigned int regptr, val;
+  
+       regptr = (reg << 16) | chn;
+
+       spin_lock_irqsave(&emu->emu_lock, flags);
+       outl(regptr, emu->port + 0x20 + PTR);
+       val = inl(emu->port + 0x20 + DATA);
+       spin_unlock_irqrestore(&emu->emu_lock, flags);
+       return val;
+}
+
+void snd_emu10k1_ptr20_write(emu10k1_t *emu, 
+                                  unsigned int reg, 
+                                  unsigned int chn, 
+                                  unsigned int data)
+{
+       unsigned int regptr;
+       unsigned long flags;
+
+       regptr = (reg << 16) | chn;
+
+       spin_lock_irqsave(&emu->emu_lock, flags);
+       outl(regptr, emu->port + 0x20 + PTR);
+       outl(data, emu->port + 0x20 + DATA);
+       spin_unlock_irqrestore(&emu->emu_lock, flags);
+}
+
 void snd_emu10k1_intr_enable(emu10k1_t *emu, unsigned int intrenb)
 {
        unsigned long flags;
@@ -170,6 +202,63 @@ void snd_emu10k1_voice_intr_ack(emu10k1_t *emu, unsigned int voicenum)
        spin_unlock_irqrestore(&emu->emu_lock, flags);
 }
 
+void snd_emu10k1_voice_half_loop_intr_enable(emu10k1_t *emu, unsigned int voicenum)
+{
+       unsigned long flags;
+       unsigned int val;
+
+       spin_lock_irqsave(&emu->emu_lock, flags);
+       /* voice interrupt */
+       if (voicenum >= 32) {
+               outl(HLIEH << 16, emu->port + PTR);
+               val = inl(emu->port + DATA);
+               val |= 1 << (voicenum - 32);
+       } else {
+               outl(HLIEL << 16, emu->port + PTR);
+               val = inl(emu->port + DATA);
+               val |= 1 << voicenum;
+       }
+       outl(val, emu->port + DATA);
+       spin_unlock_irqrestore(&emu->emu_lock, flags);
+}
+
+void snd_emu10k1_voice_half_loop_intr_disable(emu10k1_t *emu, unsigned int voicenum)
+{
+       unsigned long flags;
+       unsigned int val;
+
+       spin_lock_irqsave(&emu->emu_lock, flags);
+       /* voice interrupt */
+       if (voicenum >= 32) {
+               outl(HLIEH << 16, emu->port + PTR);
+               val = inl(emu->port + DATA);
+               val &= ~(1 << (voicenum - 32));
+       } else {
+               outl(HLIEL << 16, emu->port + PTR);
+               val = inl(emu->port + DATA);
+               val &= ~(1 << voicenum);
+       }
+       outl(val, emu->port + DATA);
+       spin_unlock_irqrestore(&emu->emu_lock, flags);
+}
+
+void snd_emu10k1_voice_half_loop_intr_ack(emu10k1_t *emu, unsigned int voicenum)
+{
+       unsigned long flags;
+
+       spin_lock_irqsave(&emu->emu_lock, flags);
+       /* voice interrupt */
+       if (voicenum >= 32) {
+               outl(HLIPH << 16, emu->port + PTR);
+               voicenum = 1 << (voicenum - 32);
+       } else {
+               outl(HLIPL << 16, emu->port + PTR);
+               voicenum = 1 << voicenum;
+       }
+       outl(voicenum, emu->port + DATA);
+       spin_unlock_irqrestore(&emu->emu_lock, flags);
+}
+
 void snd_emu10k1_voice_set_loop_stop(emu10k1_t *emu, unsigned int voicenum)
 {
        unsigned long flags;