Skip to content

Commit

Permalink
sound: oxygen: work around MCE when changing volume
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Clemens Ladisch authored and Takashi Iwai committed Sep 7, 2009
1 parent 9265345 commit f1bc07a
Showing 1 changed file with 1 addition and 10 deletions.
11 changes: 1 addition & 10 deletions sound/pci/oxygen/oxygen_io.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down

0 comments on commit f1bc07a

Please sign in to comment.