patch-2.4.0-test7 linux/drivers/sound/emu10k1/hwaccess.c

Next file: linux/drivers/sound/emu10k1/hwaccess.h
Previous file: linux/drivers/sound/emu10k1/emuadxmg.c
Back to the patch index
Back to the overall index

diff -u --recursive --new-file v2.4.0-test6/linux/drivers/sound/emu10k1/hwaccess.c linux/drivers/sound/emu10k1/hwaccess.c
@@ -1,4 +1,3 @@
-
 /*
  **********************************************************************
  *     hwaccess.c -- Hardware access layer
@@ -31,7 +30,10 @@
  **********************************************************************
  */
 
+#include <asm/io.h>
+
 #include "hwaccess.h"
+#include "8010.h"
 #include "icardmid.h"
 
 /*************************************************************************
@@ -86,7 +88,7 @@
 	};
 
 	if (sampleRate == 0)
-		return (0);	/* Bail out if no leading "1" */
+		return 0;	/* Bail out if no leading "1" */
 
 	sampleRate *= 11185;	/* Scale 48000 to 0x20002380 */
 
@@ -131,51 +133,58 @@
 /*******************************************
 * write/read PCI function 0 registers      *
 ********************************************/
-void sblive_writefn0(struct emu10k1_card *card, u8 reg, u32 data)
+void emu10k1_writefn0(struct emu10k1_card *card, u32 reg, u32 data)
 {
 	unsigned long flags;
 
-	spin_lock_irqsave(&card->lock, flags);
-	outl(data, card->iobase + reg);
-	spin_unlock_irqrestore(&card->lock, flags);
-
-	return;
-}
-
-void sblive_wrtmskfn0(struct emu10k1_card *card, u8 reg, u32 mask, u32 data)
-{
-	unsigned long flags;
+	if (reg & 0xff000000) {
+		u32 mask;
+		u8 size, offset;
 
-	data &= mask;
+		size = (reg >> 24) & 0x3f;
+		offset = (reg >> 16) & 0x1f;
+		mask = ((1 << size) - 1) << offset;
+		data = (data << offset) & mask;
+		reg &= 0x7f;
 
-	spin_lock_irqsave(&card->lock, flags);
-	data |= inl(card->iobase + reg) & ~mask;
-	outl(data, card->iobase + reg);
-	spin_unlock_irqrestore(&card->lock, flags);
+		spin_lock_irqsave(&card->lock, flags);
+		data |= inl(card->iobase + reg) & ~mask;
+		outl(data, card->iobase + reg);
+		spin_unlock_irqrestore(&card->lock, flags);
+	} else {
+		spin_lock_irqsave(&card->lock, flags);
+		outl(data, card->iobase + reg);
+		spin_unlock_irqrestore(&card->lock, flags);
+	}
 
 	return;
 }
 
-u32 sblive_readfn0(struct emu10k1_card * card, u8 reg)
+u32 emu10k1_readfn0(struct emu10k1_card * card, u32 reg)
 {
 	u32 val;
 	unsigned long flags;
 
-	spin_lock_irqsave(&card->lock, flags);
-	val = inl(card->iobase + reg);
-	spin_unlock_irqrestore(&card->lock, flags);
-	return val;
-}
+	if (reg & 0xff000000) {
+		u32 mask;
+		u8 size, offset;
 
-u32 sblive_rdmskfn0(struct emu10k1_card * card, u8 reg, u32 mask)
-{
-	u32 val;
-	unsigned long flags;
+		size = (reg >> 24) & 0x3f;
+		offset = (reg >> 16) & 0x1f;
+		mask = ((1 << size) - 1) << offset;
+		reg &= 0x7f;
 
-	spin_lock_irqsave(&card->lock, flags);
-	val = inl(card->iobase + reg);
-	spin_unlock_irqrestore(&card->lock, flags);
-	return val & mask;
+		spin_lock_irqsave(&card->lock, flags);
+		val = inl(card->iobase + reg);
+		spin_unlock_irqrestore(&card->lock, flags);
+
+		return (val & mask) >> offset;
+        } else {
+		spin_lock_irqsave(&card->lock, flags);
+		val = inl(card->iobase + reg);
+		spin_unlock_irqrestore(&card->lock, flags);
+		return val;
+	}
 }
 
 /************************************************************************
@@ -209,6 +218,37 @@
 		outl(data, card->iobase + DATA);
 		spin_unlock_irqrestore(&card->lock, flags);
 	}
+}
+
+/* ... :  data, reg, ... , TAGLIST_END */
+void sblive_writeptr_tag(struct emu10k1_card *card, u32 channel, ...)
+{
+	va_list args;
+
+	unsigned long flags;
+        u32 reg;
+
+	va_start(args, channel);
+
+	spin_lock_irqsave(&card->lock, flags);
+	while ((reg = va_arg(args, u32)) != TAGLIST_END) {
+		u32 data = va_arg(args, u32);
+		u32 regptr = (((reg << 16) & PTR_ADDRESS_MASK)
+			      | (channel & PTR_CHANNELNUM_MASK));
+		outl(regptr, card->iobase + PTR);
+		if (reg & 0xff000000) {
+			int size = (reg >> 24) & 0x3f;
+                        int offset = (reg >> 16) & 0x1f;
+			u32 mask = ((1 << size) - 1) << offset;
+			data = (data << offset) & mask;
+
+			data |= inl(card->iobase + DATA) & ~mask;
+		}
+		outl(data, card->iobase + DATA);
+	}
+	spin_unlock_irqrestore(&card->lock, flags);
+
+	va_end(args);
 
 	return;
 }
@@ -244,6 +284,34 @@
 	}
 }
 
+void emu10k1_irq_enable(struct emu10k1_card *card, u32 irq_mask)
+{
+	u32 val;
+	unsigned long flags;
+
+	DPF(2,"emu10k1_irq_enable()\n");
+
+	spin_lock_irqsave(&card->lock, flags);
+        val = inl(card->iobase + INTE) | irq_mask;
+        outl(val, card->iobase + INTE);
+	spin_unlock_irqrestore(&card->lock, flags);
+	return;
+}
+
+void emu10k1_irq_disable(struct emu10k1_card *card, u32 irq_mask)
+{
+        u32 val;
+        unsigned long flags;
+
+        DPF(2,"emu10k1_irq_disable()\n");
+
+        spin_lock_irqsave(&card->lock, flags);
+        val = inl(card->iobase + INTE) & ~irq_mask;
+        outl(val, card->iobase + INTE);
+        spin_unlock_irqrestore(&card->lock, flags);
+        return;
+}
+
 void emu10k1_set_stop_on_loop(struct emu10k1_card *card, u32 voicenum)
 {
 	/* Voice interrupt */
@@ -271,11 +339,11 @@
 	volatile unsigned uCount;
 	u32 newtime = 0, curtime;
 
-	curtime = READ_FN0(card, WC_SAMPLECOUNTER);
+	curtime = emu10k1_readfn0(card, WC_SAMPLECOUNTER);
 	while (wait--) {
 		uCount = 0;
 		while (uCount++ < TIMEOUT) {
-			newtime = READ_FN0(card, WC_SAMPLECOUNTER);
+			newtime = emu10k1_readfn0(card, WC_SAMPLECOUNTER);
 			if (newtime != curtime)
 				break;
 		}
@@ -293,12 +361,12 @@
 
 	spin_lock_irqsave(&card->lock, flags);
 
-	outb(index, card->mixeraddx + 2);
-	*data = inw(card->mixeraddx);
+	outb(index, card->iobase + AC97ADDRESS);
+	*data = inw(card->iobase + AC97DATA);
 
 	spin_unlock_irqrestore(&card->lock, flags);
 
-	return CTSTATUS_SUCCESS;
+	return 0;
 }
 
 int sblive_writeac97(struct emu10k1_card *card, u8 index, u16 data)
@@ -307,12 +375,12 @@
 
 	spin_lock_irqsave(&card->lock, flags);
 
-	outb(index, card->mixeraddx + 2);
-	outw(data, card->mixeraddx);
+	outb(index, card->iobase + AC97ADDRESS);
+	outw(data, card->iobase + AC97DATA);
 
 	spin_unlock_irqrestore(&card->lock, flags);
 
-	return CTSTATUS_SUCCESS;
+	return 0;
 }
 
 int sblive_rmwac97(struct emu10k1_card *card, u8 index, u16 data, u16 mask)
@@ -322,16 +390,16 @@
 
 	spin_lock_irqsave(&card->lock, flags);
 
-	outb(index, card->mixeraddx + 2);
-	temp = inw(card->mixeraddx);
+	outb(index, card->iobase + AC97ADDRESS);
+	temp = inw(card->iobase + AC97DATA);
 	temp &= ~mask;
 	data &= mask;
 	temp |= data;
-	outw(temp, card->mixeraddx);
+	outw(temp, card->iobase + AC97DATA);
 
 	spin_unlock_irqrestore(&card->lock, flags);
 
-	return CTSTATUS_SUCCESS;
+	return 0;
 }
 
 /*********************************************************
@@ -347,9 +415,9 @@
 
 	if ((inb(card->iobase + MUSTAT) & MUSTAT_ORDYN) == 0) {
 		outb(data, card->iobase + MUDATA);
-		ret = CTSTATUS_SUCCESS;
+		ret = 0;
 	} else
-		ret = CTSTATUS_BUSY;
+		ret = -1;
 
 	spin_unlock_irqrestore(&card->lock, flags);
 
@@ -365,9 +433,9 @@
 
 	if ((inb(card->iobase + MUSTAT) & MUSTAT_IRDYN) == 0) {
 		*data = inb(card->iobase + MUDATA);
-		ret = CTSTATUS_SUCCESS;
+		ret = 0;
 	} else
-		ret = CTSTATUS_NODATA;
+		ret = -1;
 
 	spin_unlock_irqrestore(&card->lock, flags);
 
@@ -405,12 +473,12 @@
 		spin_unlock_irqrestore(&card->lock, flags);
 
 		if (status == 0xfe)
-			return CTSTATUS_SUCCESS;
+			return 0;
 		else
-			return CTSTATUS_ERROR;
+			return -1;
 	}
 
-	return CTSTATUS_SUCCESS;
+	return 0;
 }
 
 int emu10k1_mpu_acquire(struct emu10k1_card *card)
@@ -418,7 +486,7 @@
 	/* FIXME: This should be a macro */
 	++card->mpuacqcount;
 
-	return CTSTATUS_SUCCESS;
+	return 0;
 }
 
 int emu10k1_mpu_release(struct emu10k1_card *card)
@@ -426,5 +494,5 @@
 	/* FIXME: this should be a macro */
 	--card->mpuacqcount;
 
-	return CTSTATUS_SUCCESS;
+	return 0;
 }

FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen (who was at: slshen@lbl.gov)