ASoC: Factor out I2C 8 bit address 8 bit data I/O
authorJoonyoung Shim <jy0922.shim@samsung.com>
Mon, 7 Sep 2009 03:04:37 +0000 (12:04 +0900)
committerMark Brown <broonie@opensource.wolfsonmicro.com>
Mon, 7 Sep 2009 10:14:12 +0000 (11:14 +0100)
This patch is for the AK4671 codec driver using this format.

Signed-off-by: Joonyoung Shim <jy0922.shim@samsung.com>
Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
sound/soc/soc-cache.c

index c8ceddc2a26c8c6af4c1f1b93135fd7b5f8e8e98..404231ee878004d7b0ea5b60a75ca3e75cc53920 100644 (file)
@@ -77,6 +77,35 @@ static int snd_soc_7_9_spi_write(void *control_data, const char *data,
 #define snd_soc_7_9_spi_write NULL
 #endif
 
+static int snd_soc_8_8_write(struct snd_soc_codec *codec, unsigned int reg,
+                            unsigned int value)
+{
+       u8 *cache = codec->reg_cache;
+       u8 data[2];
+
+       BUG_ON(codec->volatile_register);
+
+       data[0] = reg & 0xff;
+       data[1] = value & 0xff;
+
+       if (reg < codec->reg_cache_size)
+               cache[reg] = value;
+
+       if (codec->hw_write(codec->control_data, data, 2) == 2)
+               return 0;
+       else
+               return -EIO;
+}
+
+static unsigned int snd_soc_8_8_read(struct snd_soc_codec *codec,
+                                    unsigned int reg)
+{
+       u8 *cache = codec->reg_cache;
+       if (reg >= codec->reg_cache_size)
+               return -1;
+       return cache[reg];
+}
+
 static int snd_soc_8_16_write(struct snd_soc_codec *codec, unsigned int reg,
                              unsigned int value)
 {
@@ -151,6 +180,7 @@ static struct {
        unsigned int (*i2c_read)(struct snd_soc_codec *, unsigned int);
 } io_types[] = {
        { 7, 9, snd_soc_7_9_write, snd_soc_7_9_spi_write, snd_soc_7_9_read },
+       { 8, 8, snd_soc_8_8_write, NULL, snd_soc_8_8_read, NULL },
        { 8, 16, snd_soc_8_16_write, NULL, snd_soc_8_16_read,
          snd_soc_8_16_read_i2c },
 };