diff options
author | Clemens Ladisch <clemens@ladisch.de> | 2008-01-28 02:34:21 -0500 |
---|---|---|
committer | Jaroslav Kysela <perex@perex.cz> | 2008-01-31 11:30:17 -0500 |
commit | 1e821dd2763c97df1a0a451e553d218cb8886cd7 (patch) | |
tree | c09376cd0e36251f1c83ec6bf4e52a7226db7811 /sound/pci/oxygen/oxygen_io.c | |
parent | 911b499af45e879ccf4b8db234278a7136d056c9 (diff) |
[ALSA] oxygen: use AC97 interrupt
After an AC97 register read or write, use the AC97 interrupt instead of
polling to wait for the access to be completed.
Signed-off-by: Clemens Ladisch <clemens@ladisch.de>
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
Diffstat (limited to 'sound/pci/oxygen/oxygen_io.c')
-rw-r--r-- | sound/pci/oxygen/oxygen_io.c | 24 |
1 files changed, 16 insertions, 8 deletions
diff --git a/sound/pci/oxygen/oxygen_io.c b/sound/pci/oxygen/oxygen_io.c index d0cdce041dd8..74e23ef9c946 100644 --- a/sound/pci/oxygen/oxygen_io.c +++ b/sound/pci/oxygen/oxygen_io.c | |||
@@ -85,14 +85,22 @@ EXPORT_SYMBOL(oxygen_write32_masked); | |||
85 | 85 | ||
86 | static int oxygen_ac97_wait(struct oxygen *chip, unsigned int mask) | 86 | static int oxygen_ac97_wait(struct oxygen *chip, unsigned int mask) |
87 | { | 87 | { |
88 | unsigned long timeout = jiffies + msecs_to_jiffies(1); | 88 | u8 status = 0; |
89 | do { | 89 | |
90 | udelay(5); | 90 | /* |
91 | cond_resched(); | 91 | * Reading the status register also clears the bits, so we have to save |
92 | if (oxygen_read8(chip, OXYGEN_AC97_INTERRUPT_STATUS) & mask) | 92 | * the read bits in status. |
93 | return 0; | 93 | */ |
94 | } while (time_after_eq(timeout, jiffies)); | 94 | wait_event_timeout(chip->ac97_waitqueue, |
95 | return -EIO; | 95 | ({ status |= oxygen_read8(chip, OXYGEN_AC97_INTERRUPT_STATUS); |
96 | status & mask; }), | ||
97 | msecs_to_jiffies(1) + 1); | ||
98 | /* | ||
99 | * Check even after a timeout because this function should not require | ||
100 | * the AC'97 interrupt to be enabled. | ||
101 | */ | ||
102 | status |= oxygen_read8(chip, OXYGEN_AC97_INTERRUPT_STATUS); | ||
103 | return status & mask ? 0 : -EIO; | ||
96 | } | 104 | } |
97 | 105 | ||
98 | /* | 106 | /* |