| From f1bc07af9a9edc5c1d4bdd971f7099316ed2e405 Mon Sep 17 00:00:00 2001 |
| From: Clemens Ladisch <clemens@ladisch.de> |
| Date: Mon, 7 Sep 2009 10:18:54 +0200 |
| Subject: sound: oxygen: work around MCE when changing volume |
| |
| From: Clemens Ladisch <clemens@ladisch.de> |
| |
| commit f1bc07af9a9edc5c1d4bdd971f7099316ed2e405 upstream. |
| |
| When the volume is changed continuously (e.g., when the user drags a |
| volume slider with the mouse), the driver does lots of I2C writes. |
| Apparently, the sound chip can get confused when we poll the I2C status |
| register too much, and fails to complete a read from it. On the PCI-E |
| models, the PCI-E/PCI bridge gets upset by this and generates a machine |
| check exception. |
| |
| To avoid this, this patch replaces the polling with an unconditional |
| wait that is guaranteed to be long enough. |
| |
| Signed-off-by: Clemens Ladisch <clemens@ladisch.de> |
| Tested-by: Johann Messner <johann.messner at jku.at> |
| Signed-off-by: Takashi Iwai <tiwai@suse.de> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> |
| |
| --- |
| sound/pci/oxygen/oxygen_io.c | 11 +---------- |
| 1 file changed, 1 insertion(+), 10 deletions(-) |
| |
| --- a/sound/pci/oxygen/oxygen_io.c |
| +++ b/sound/pci/oxygen/oxygen_io.c |
| @@ -215,17 +215,8 @@ EXPORT_SYMBOL(oxygen_write_spi); |
| |
| void oxygen_write_i2c(struct oxygen *chip, u8 device, u8 map, u8 data) |
| { |
| - unsigned long timeout; |
| - |
| /* should not need more than about 300 us */ |
| - timeout = jiffies + msecs_to_jiffies(1); |
| - do { |
| - if (!(oxygen_read16(chip, OXYGEN_2WIRE_BUS_STATUS) |
| - & OXYGEN_2WIRE_BUSY)) |
| - break; |
| - udelay(1); |
| - cond_resched(); |
| - } while (time_after_eq(timeout, jiffies)); |
| + msleep(1); |
| |
| oxygen_write8(chip, OXYGEN_2WIRE_MAP, map); |
| oxygen_write8(chip, OXYGEN_2WIRE_DATA, data); |