aboutsummaryrefslogtreecommitdiffstats
path: root/sound
diff options
context:
space:
mode:
authorJaroslav Kysela <perex@suse.cz>2004-05-17 19:19:51 +0200
committerJaroslav Kysela <perex@suse.cz>2004-05-17 19:19:51 +0200
commit9b465a1ffaf8b4ea9061f95e261a3de33e27cd19 (patch)
tree23d38e8234f49abfbf11696742624ee1b1640033 /sound
parent95388082cef7da0f95a1075ee5a94973231a1ea1 (diff)
downloadhistory-9b465a1ffaf8b4ea9061f95e261a3de33e27cd19.tar.gz
ALSA CVS update - Clemens Ladisch <clemens@ladisch.de>
Intel8x0 driver check that period interrupt really has occured; clear only those interrupts that have been handled
Diffstat (limited to 'sound')
-rw-r--r--sound/pci/intel8x0.c10
1 files changed, 7 insertions, 3 deletions
diff --git a/sound/pci/intel8x0.c b/sound/pci/intel8x0.c
index c2db99ef0c63fc..e6b14ad77ab5b9 100644
--- a/sound/pci/intel8x0.c
+++ b/sound/pci/intel8x0.c
@@ -775,11 +775,14 @@ static void fill_nocache(void *buf, int size, int nocache)
static inline void snd_intel8x0_update(intel8x0_t *chip, ichdev_t *ichdev)
{
unsigned long port = ichdev->reg_offset;
- int civ, i, step;
+ int status, civ, i, step;
int ack = 0;
+ status = igetbyte(chip, port + ichdev->roff_sr);
civ = igetbyte(chip, port + ICH_REG_OFF_CIV);
- if (civ == ichdev->civ) {
+ if (!(status & ICH_BCIS)) {
+ step = 0;
+ } else if (civ == ichdev->civ) {
// snd_printd("civ same %d\n", civ);
step = 1;
ichdev->civ++;
@@ -813,7 +816,8 @@ static inline void snd_intel8x0_update(intel8x0_t *chip, ichdev_t *ichdev)
snd_pcm_period_elapsed(ichdev->substream);
spin_lock(&chip->reg_lock);
}
- iputbyte(chip, port + ichdev->roff_sr, ICH_FIFOE | ICH_BCIS | ICH_LVBCI);
+ iputbyte(chip, port + ichdev->roff_sr,
+ status & (ICH_FIFOE | ICH_BCIS | ICH_LVBCI));
}
static irqreturn_t snd_intel8x0_interrupt(int irq, void *dev_id, struct pt_regs *regs)