]> asedeno.scripts.mit.edu Git - linux.git/blobdiff - sound/pci/oxygen/oxygen_io.c
Merge tag 'sound-fix-3.14-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai...
[linux.git] / sound / pci / oxygen / oxygen_io.c
index 521eae458348c723bd87519cd4fcdbd0530c2f00..3274907189febb4b6e3939274417abb58c21ca18 100644 (file)
@@ -194,23 +194,36 @@ void oxygen_write_ac97_masked(struct oxygen *chip, unsigned int codec,
 }
 EXPORT_SYMBOL(oxygen_write_ac97_masked);
 
-void oxygen_write_spi(struct oxygen *chip, u8 control, unsigned int data)
+static int oxygen_wait_spi(struct oxygen *chip)
 {
        unsigned int count;
 
-       /* should not need more than 30.72 us (24 * 1.28 us) */
-       count = 10;
-       while ((oxygen_read8(chip, OXYGEN_SPI_CONTROL) & OXYGEN_SPI_BUSY)
-              && count > 0) {
+       /*
+        * Higher timeout to be sure: 200 us;
+        * actual transaction should not need more than 40 us.
+        */
+       for (count = 50; count > 0; count--) {
                udelay(4);
-               --count;
+               if ((oxygen_read8(chip, OXYGEN_SPI_CONTROL) &
+                                               OXYGEN_SPI_BUSY) == 0)
+                       return 0;
        }
+       snd_printk(KERN_ERR "oxygen: SPI wait timeout\n");
+       return -EIO;
+}
 
+int oxygen_write_spi(struct oxygen *chip, u8 control, unsigned int data)
+{
+       /*
+        * We need to wait AFTER initiating the SPI transaction,
+        * otherwise read operations will not work.
+        */
        oxygen_write8(chip, OXYGEN_SPI_DATA1, data);
        oxygen_write8(chip, OXYGEN_SPI_DATA2, data >> 8);
        if (control & OXYGEN_SPI_DATA_LENGTH_3)
                oxygen_write8(chip, OXYGEN_SPI_DATA3, data >> 16);
        oxygen_write8(chip, OXYGEN_SPI_CONTROL, control);
+       return oxygen_wait_spi(chip);
 }
 EXPORT_SYMBOL(oxygen_write_spi);