diff options
| author | Takashi Iwai <tiwai@suse.de> | 2007-03-13 16:52:36 -0400 |
|---|---|---|
| committer | Jaroslav Kysela <perex@suse.cz> | 2007-03-14 03:24:18 -0400 |
| commit | 883be7936747f35479ecf94aebf3daf418b7f449 (patch) | |
| tree | e3788bf3e132cea96ed541cdc80f50436b272252 | |
| parent | 0a07acafd6127117db0c20e04302dd8ac9402bc0 (diff) | |
[ALSA] intel8x0 - Fix Oops at kdump crash kernel
Fixed Oops at crash kernel from intel8x0 driver that is triggered
from interrupt handler. Proper irqsave version seems needed for
kexec/kdump.
Signed-off-by: Takashi Iwai <tiwai@suse.de>
Signed-off-by: Jaroslav Kysela <perex@suse.cz>
| -rw-r--r-- | sound/pci/intel8x0.c | 5 |
1 files changed, 3 insertions, 2 deletions
diff --git a/sound/pci/intel8x0.c b/sound/pci/intel8x0.c index ff65e049114b..7cf2dcb9d8d4 100644 --- a/sound/pci/intel8x0.c +++ b/sound/pci/intel8x0.c | |||
| @@ -725,10 +725,11 @@ static void fill_nocache(void *buf, int size, int nocache) | |||
| 725 | static inline void snd_intel8x0_update(struct intel8x0 *chip, struct ichdev *ichdev) | 725 | static inline void snd_intel8x0_update(struct intel8x0 *chip, struct ichdev *ichdev) |
| 726 | { | 726 | { |
| 727 | unsigned long port = ichdev->reg_offset; | 727 | unsigned long port = ichdev->reg_offset; |
| 728 | unsigned long flags; | ||
| 728 | int status, civ, i, step; | 729 | int status, civ, i, step; |
| 729 | int ack = 0; | 730 | int ack = 0; |
| 730 | 731 | ||
| 731 | spin_lock(&chip->reg_lock); | 732 | spin_lock_irqsave(&chip->reg_lock, flags); |
| 732 | status = igetbyte(chip, port + ichdev->roff_sr); | 733 | status = igetbyte(chip, port + ichdev->roff_sr); |
| 733 | civ = igetbyte(chip, port + ICH_REG_OFF_CIV); | 734 | civ = igetbyte(chip, port + ICH_REG_OFF_CIV); |
| 734 | if (!(status & ICH_BCIS)) { | 735 | if (!(status & ICH_BCIS)) { |
| @@ -768,7 +769,7 @@ static inline void snd_intel8x0_update(struct intel8x0 *chip, struct ichdev *ich | |||
| 768 | ack = 1; | 769 | ack = 1; |
| 769 | } | 770 | } |
| 770 | } | 771 | } |
| 771 | spin_unlock(&chip->reg_lock); | 772 | spin_unlock_irqrestore(&chip->reg_lock, flags); |
| 772 | if (ack && ichdev->substream) { | 773 | if (ack && ichdev->substream) { |
| 773 | snd_pcm_period_elapsed(ichdev->substream); | 774 | snd_pcm_period_elapsed(ichdev->substream); |
| 774 | } | 775 | } |
