Commit f1bc07af authored by Clemens Ladisch's avatar Clemens Ladisch Committed by Takashi Iwai

sound: oxygen: work around MCE when changing volume

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: default avatarClemens Ladisch <clemens@ladisch.de>
Tested-by: Johann Messner <johann.messner at jku.at>
Cc: <stable@kernel.org>
Signed-off-by: default avatarTakashi Iwai <tiwai@suse.de>
parent 92653453
...@@ -215,17 +215,8 @@ EXPORT_SYMBOL(oxygen_write_spi); ...@@ -215,17 +215,8 @@ EXPORT_SYMBOL(oxygen_write_spi);
void oxygen_write_i2c(struct oxygen *chip, u8 device, u8 map, u8 data) void oxygen_write_i2c(struct oxygen *chip, u8 device, u8 map, u8 data)
{ {
unsigned long timeout;
/* should not need more than about 300 us */ /* should not need more than about 300 us */
timeout = jiffies + msecs_to_jiffies(1); msleep(1);
do {
if (!(oxygen_read16(chip, OXYGEN_2WIRE_BUS_STATUS)
& OXYGEN_2WIRE_BUSY))
break;
udelay(1);
cond_resched();
} while (time_after_eq(timeout, jiffies));
oxygen_write8(chip, OXYGEN_2WIRE_MAP, map); oxygen_write8(chip, OXYGEN_2WIRE_MAP, map);
oxygen_write8(chip, OXYGEN_2WIRE_DATA, data); oxygen_write8(chip, OXYGEN_2WIRE_DATA, data);
......
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