sound: oxygen: work around MCE when changing volume
authorClemens Ladisch <[email protected]>
Mon, 7 Sep 2009 08:18:54 +0000 (10:18 +0200)
committerTakashi Iwai <[email protected]>
Mon, 7 Sep 2009 10:15:43 +0000 (12:15 +0200)
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 <[email protected]>
Tested-by: Johann Messner <johann.messner at jku.at>
Cc: <[email protected]>
Signed-off-by: Takashi Iwai <[email protected]>
sound/pci/oxygen/oxygen_io.c

index c1eb923f2ac94b63b83318e688d98fdcd0dff931..09b2b2a36df5200f35e75af487673a6ea9e215ce 100644 (file)
@@ -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);