Commit 9b465a1f authored by Jaroslav Kysela's avatar Jaroslav Kysela

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
parent 95388082
...@@ -775,11 +775,14 @@ static void fill_nocache(void *buf, int size, int nocache) ...@@ -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) static inline void snd_intel8x0_update(intel8x0_t *chip, ichdev_t *ichdev)
{ {
unsigned long port = ichdev->reg_offset; unsigned long port = ichdev->reg_offset;
int civ, i, step; int status, civ, i, step;
int ack = 0; int ack = 0;
status = igetbyte(chip, port + ichdev->roff_sr);
civ = igetbyte(chip, port + ICH_REG_OFF_CIV); 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); // snd_printd("civ same %d\n", civ);
step = 1; step = 1;
ichdev->civ++; ichdev->civ++;
...@@ -813,7 +816,8 @@ static inline void snd_intel8x0_update(intel8x0_t *chip, ichdev_t *ichdev) ...@@ -813,7 +816,8 @@ static inline void snd_intel8x0_update(intel8x0_t *chip, ichdev_t *ichdev)
snd_pcm_period_elapsed(ichdev->substream); snd_pcm_period_elapsed(ichdev->substream);
spin_lock(&chip->reg_lock); 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) static irqreturn_t snd_intel8x0_interrupt(int irq, void *dev_id, struct pt_regs *regs)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment