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
- Lines: 310
- Date:
Mon Aug 14 08:32:48 2000
- Orig file:
v2.4.0-test6/linux/drivers/sound/emu10k1/hwaccess.c
- Orig date:
Wed Apr 26 16:34:08 2000
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)