diff options
author | Jaroslav Kysela <perex@suse.cz> | 2004-05-17 19:19:51 +0200 |
---|---|---|
committer | Jaroslav Kysela <perex@suse.cz> | 2004-05-17 19:19:51 +0200 |
commit | 9b465a1ffaf8b4ea9061f95e261a3de33e27cd19 (patch) | |
tree | 23d38e8234f49abfbf11696742624ee1b1640033 /sound | |
parent | 95388082cef7da0f95a1075ee5a94973231a1ea1 (diff) | |
download | history-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.c | 10 |
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) |