diff options
Diffstat (limited to 'sound/soc/soc-cache.c')
| -rw-r--r-- | sound/soc/soc-cache.c | 46 |
1 files changed, 43 insertions, 3 deletions
diff --git a/sound/soc/soc-cache.c b/sound/soc/soc-cache.c index c8ceddc2a26c..d2505e8b06c9 100644 --- a/sound/soc/soc-cache.c +++ b/sound/soc/soc-cache.c | |||
| @@ -77,6 +77,35 @@ static int snd_soc_7_9_spi_write(void *control_data, const char *data, | |||
| 77 | #define snd_soc_7_9_spi_write NULL | 77 | #define snd_soc_7_9_spi_write NULL |
| 78 | #endif | 78 | #endif |
| 79 | 79 | ||
| 80 | static int snd_soc_8_8_write(struct snd_soc_codec *codec, unsigned int reg, | ||
| 81 | unsigned int value) | ||
| 82 | { | ||
| 83 | u8 *cache = codec->reg_cache; | ||
| 84 | u8 data[2]; | ||
| 85 | |||
| 86 | BUG_ON(codec->volatile_register); | ||
| 87 | |||
| 88 | data[0] = reg & 0xff; | ||
| 89 | data[1] = value & 0xff; | ||
| 90 | |||
| 91 | if (reg < codec->reg_cache_size) | ||
| 92 | cache[reg] = value; | ||
| 93 | |||
| 94 | if (codec->hw_write(codec->control_data, data, 2) == 2) | ||
| 95 | return 0; | ||
| 96 | else | ||
| 97 | return -EIO; | ||
| 98 | } | ||
| 99 | |||
| 100 | static unsigned int snd_soc_8_8_read(struct snd_soc_codec *codec, | ||
| 101 | unsigned int reg) | ||
| 102 | { | ||
| 103 | u8 *cache = codec->reg_cache; | ||
| 104 | if (reg >= codec->reg_cache_size) | ||
| 105 | return -1; | ||
| 106 | return cache[reg]; | ||
| 107 | } | ||
| 108 | |||
| 80 | static int snd_soc_8_16_write(struct snd_soc_codec *codec, unsigned int reg, | 109 | static int snd_soc_8_16_write(struct snd_soc_codec *codec, unsigned int reg, |
| 81 | unsigned int value) | 110 | unsigned int value) |
| 82 | { | 111 | { |
| @@ -150,9 +179,20 @@ static struct { | |||
| 150 | unsigned int (*read)(struct snd_soc_codec *, unsigned int); | 179 | unsigned int (*read)(struct snd_soc_codec *, unsigned int); |
| 151 | unsigned int (*i2c_read)(struct snd_soc_codec *, unsigned int); | 180 | unsigned int (*i2c_read)(struct snd_soc_codec *, unsigned int); |
| 152 | } io_types[] = { | 181 | } io_types[] = { |
| 153 | { 7, 9, snd_soc_7_9_write, snd_soc_7_9_spi_write, snd_soc_7_9_read }, | 182 | { |
| 154 | { 8, 16, snd_soc_8_16_write, NULL, snd_soc_8_16_read, | 183 | .addr_bits = 7, .data_bits = 9, |
| 155 | snd_soc_8_16_read_i2c }, | 184 | .write = snd_soc_7_9_write, .read = snd_soc_7_9_read, |
| 185 | .spi_write = snd_soc_7_9_spi_write | ||
| 186 | }, | ||
| 187 | { | ||
| 188 | .addr_bits = 8, .data_bits = 8, | ||
| 189 | .write = snd_soc_8_8_write, .read = snd_soc_8_8_read, | ||
| 190 | }, | ||
| 191 | { | ||
| 192 | .addr_bits = 8, .data_bits = 16, | ||
| 193 | .write = snd_soc_8_16_write, .read = snd_soc_8_16_read, | ||
| 194 | .i2c_read = snd_soc_8_16_read_i2c, | ||
| 195 | }, | ||
| 156 | }; | 196 | }; |
| 157 | 197 | ||
| 158 | /** | 198 | /** |
