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: Clemens Ladisch <clemens@ladisch.de> Tested-by: Johann Messner <johann.messner at jku.at> Cc: <stable@kernel.org> Signed-off-by: Takashi Iwai <tiwai@suse.de>
This commit is contained in:
parent
92653453c3
commit
f1bc07af9a
|
@ -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);
|
||||
|
|
Loading…
Reference in a new issue