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 | /** |