diff options
Diffstat (limited to 'sound/soc/codecs/wm8900.c')
-rw-r--r-- | sound/soc/codecs/wm8900.c | 345 |
1 files changed, 143 insertions, 202 deletions
diff --git a/sound/soc/codecs/wm8900.c b/sound/soc/codecs/wm8900.c index 3c78945244b8..5e9c855c0036 100644 --- a/sound/soc/codecs/wm8900.c +++ b/sound/soc/codecs/wm8900.c | |||
@@ -116,6 +116,7 @@ | |||
116 | #define WM8900_REG_CLOCKING2_DAC_CLKDIV 0x1c | 116 | #define WM8900_REG_CLOCKING2_DAC_CLKDIV 0x1c |
117 | 117 | ||
118 | #define WM8900_REG_DACCTRL_MUTE 0x004 | 118 | #define WM8900_REG_DACCTRL_MUTE 0x004 |
119 | #define WM8900_REG_DACCTRL_DAC_SB_FILT 0x100 | ||
119 | #define WM8900_REG_DACCTRL_AIF_LRCLKRATE 0x400 | 120 | #define WM8900_REG_DACCTRL_AIF_LRCLKRATE 0x400 |
120 | 121 | ||
121 | #define WM8900_REG_AUDIO3_ADCLRC_DIR 0x0800 | 122 | #define WM8900_REG_AUDIO3_ADCLRC_DIR 0x0800 |
@@ -182,111 +183,20 @@ static const u16 wm8900_reg_defaults[WM8900_MAXREG] = { | |||
182 | /* Remaining registers all zero */ | 183 | /* Remaining registers all zero */ |
183 | }; | 184 | }; |
184 | 185 | ||
185 | /* | 186 | static int wm8900_volatile_register(unsigned int reg) |
186 | * read wm8900 register cache | ||
187 | */ | ||
188 | static inline unsigned int wm8900_read_reg_cache(struct snd_soc_codec *codec, | ||
189 | unsigned int reg) | ||
190 | { | ||
191 | u16 *cache = codec->reg_cache; | ||
192 | |||
193 | BUG_ON(reg >= WM8900_MAXREG); | ||
194 | |||
195 | if (reg == WM8900_REG_ID) | ||
196 | return 0; | ||
197 | |||
198 | return cache[reg]; | ||
199 | } | ||
200 | |||
201 | /* | ||
202 | * write wm8900 register cache | ||
203 | */ | ||
204 | static inline void wm8900_write_reg_cache(struct snd_soc_codec *codec, | ||
205 | u16 reg, unsigned int value) | ||
206 | { | ||
207 | u16 *cache = codec->reg_cache; | ||
208 | |||
209 | BUG_ON(reg >= WM8900_MAXREG); | ||
210 | |||
211 | cache[reg] = value; | ||
212 | } | ||
213 | |||
214 | /* | ||
215 | * write to the WM8900 register space | ||
216 | */ | ||
217 | static int wm8900_write(struct snd_soc_codec *codec, unsigned int reg, | ||
218 | unsigned int value) | ||
219 | { | ||
220 | u8 data[3]; | ||
221 | |||
222 | if (value == wm8900_read_reg_cache(codec, reg)) | ||
223 | return 0; | ||
224 | |||
225 | /* data is | ||
226 | * D15..D9 WM8900 register offset | ||
227 | * D8...D0 register data | ||
228 | */ | ||
229 | data[0] = reg; | ||
230 | data[1] = value >> 8; | ||
231 | data[2] = value & 0x00ff; | ||
232 | |||
233 | wm8900_write_reg_cache(codec, reg, value); | ||
234 | if (codec->hw_write(codec->control_data, data, 3) == 3) | ||
235 | return 0; | ||
236 | else | ||
237 | return -EIO; | ||
238 | } | ||
239 | |||
240 | /* | ||
241 | * Read from the wm8900. | ||
242 | */ | ||
243 | static unsigned int wm8900_chip_read(struct snd_soc_codec *codec, u8 reg) | ||
244 | { | ||
245 | struct i2c_msg xfer[2]; | ||
246 | u16 data; | ||
247 | int ret; | ||
248 | struct i2c_client *client = codec->control_data; | ||
249 | |||
250 | BUG_ON(reg != WM8900_REG_ID && reg != WM8900_REG_POWER1); | ||
251 | |||
252 | /* Write register */ | ||
253 | xfer[0].addr = client->addr; | ||
254 | xfer[0].flags = 0; | ||
255 | xfer[0].len = 1; | ||
256 | xfer[0].buf = ® | ||
257 | |||
258 | /* Read data */ | ||
259 | xfer[1].addr = client->addr; | ||
260 | xfer[1].flags = I2C_M_RD; | ||
261 | xfer[1].len = 2; | ||
262 | xfer[1].buf = (u8 *)&data; | ||
263 | |||
264 | ret = i2c_transfer(client->adapter, xfer, 2); | ||
265 | if (ret != 2) { | ||
266 | printk(KERN_CRIT "i2c_transfer returned %d\n", ret); | ||
267 | return 0; | ||
268 | } | ||
269 | |||
270 | return (data >> 8) | ((data & 0xff) << 8); | ||
271 | } | ||
272 | |||
273 | /* | ||
274 | * Read from the WM8900 register space. Most registers can't be read | ||
275 | * and are therefore supplied from cache. | ||
276 | */ | ||
277 | static unsigned int wm8900_read(struct snd_soc_codec *codec, unsigned int reg) | ||
278 | { | 187 | { |
279 | switch (reg) { | 188 | switch (reg) { |
280 | case WM8900_REG_ID: | 189 | case WM8900_REG_ID: |
281 | return wm8900_chip_read(codec, reg); | 190 | case WM8900_REG_POWER1: |
191 | return 1; | ||
282 | default: | 192 | default: |
283 | return wm8900_read_reg_cache(codec, reg); | 193 | return 0; |
284 | } | 194 | } |
285 | } | 195 | } |
286 | 196 | ||
287 | static void wm8900_reset(struct snd_soc_codec *codec) | 197 | static void wm8900_reset(struct snd_soc_codec *codec) |
288 | { | 198 | { |
289 | wm8900_write(codec, WM8900_REG_RESET, 0); | 199 | snd_soc_write(codec, WM8900_REG_RESET, 0); |
290 | 200 | ||
291 | memcpy(codec->reg_cache, wm8900_reg_defaults, | 201 | memcpy(codec->reg_cache, wm8900_reg_defaults, |
292 | sizeof(codec->reg_cache)); | 202 | sizeof(codec->reg_cache)); |
@@ -296,14 +206,14 @@ static int wm8900_hp_event(struct snd_soc_dapm_widget *w, | |||
296 | struct snd_kcontrol *kcontrol, int event) | 206 | struct snd_kcontrol *kcontrol, int event) |
297 | { | 207 | { |
298 | struct snd_soc_codec *codec = w->codec; | 208 | struct snd_soc_codec *codec = w->codec; |
299 | u16 hpctl1 = wm8900_read(codec, WM8900_REG_HPCTL1); | 209 | u16 hpctl1 = snd_soc_read(codec, WM8900_REG_HPCTL1); |
300 | 210 | ||
301 | switch (event) { | 211 | switch (event) { |
302 | case SND_SOC_DAPM_PRE_PMU: | 212 | case SND_SOC_DAPM_PRE_PMU: |
303 | /* Clamp headphone outputs */ | 213 | /* Clamp headphone outputs */ |
304 | hpctl1 = WM8900_REG_HPCTL1_HP_CLAMP_IP | | 214 | hpctl1 = WM8900_REG_HPCTL1_HP_CLAMP_IP | |
305 | WM8900_REG_HPCTL1_HP_CLAMP_OP; | 215 | WM8900_REG_HPCTL1_HP_CLAMP_OP; |
306 | wm8900_write(codec, WM8900_REG_HPCTL1, hpctl1); | 216 | snd_soc_write(codec, WM8900_REG_HPCTL1, hpctl1); |
307 | break; | 217 | break; |
308 | 218 | ||
309 | case SND_SOC_DAPM_POST_PMU: | 219 | case SND_SOC_DAPM_POST_PMU: |
@@ -312,41 +222,41 @@ static int wm8900_hp_event(struct snd_soc_dapm_widget *w, | |||
312 | hpctl1 |= WM8900_REG_HPCTL1_HP_SHORT | | 222 | hpctl1 |= WM8900_REG_HPCTL1_HP_SHORT | |
313 | WM8900_REG_HPCTL1_HP_SHORT2 | | 223 | WM8900_REG_HPCTL1_HP_SHORT2 | |
314 | WM8900_REG_HPCTL1_HP_IPSTAGE_ENA; | 224 | WM8900_REG_HPCTL1_HP_IPSTAGE_ENA; |
315 | wm8900_write(codec, WM8900_REG_HPCTL1, hpctl1); | 225 | snd_soc_write(codec, WM8900_REG_HPCTL1, hpctl1); |
316 | 226 | ||
317 | msleep(400); | 227 | msleep(400); |
318 | 228 | ||
319 | /* Enable the output stage */ | 229 | /* Enable the output stage */ |
320 | hpctl1 &= ~WM8900_REG_HPCTL1_HP_CLAMP_OP; | 230 | hpctl1 &= ~WM8900_REG_HPCTL1_HP_CLAMP_OP; |
321 | hpctl1 |= WM8900_REG_HPCTL1_HP_OPSTAGE_ENA; | 231 | hpctl1 |= WM8900_REG_HPCTL1_HP_OPSTAGE_ENA; |
322 | wm8900_write(codec, WM8900_REG_HPCTL1, hpctl1); | 232 | snd_soc_write(codec, WM8900_REG_HPCTL1, hpctl1); |
323 | 233 | ||
324 | /* Remove the shorts */ | 234 | /* Remove the shorts */ |
325 | hpctl1 &= ~WM8900_REG_HPCTL1_HP_SHORT2; | 235 | hpctl1 &= ~WM8900_REG_HPCTL1_HP_SHORT2; |
326 | wm8900_write(codec, WM8900_REG_HPCTL1, hpctl1); | 236 | snd_soc_write(codec, WM8900_REG_HPCTL1, hpctl1); |
327 | hpctl1 &= ~WM8900_REG_HPCTL1_HP_SHORT; | 237 | hpctl1 &= ~WM8900_REG_HPCTL1_HP_SHORT; |
328 | wm8900_write(codec, WM8900_REG_HPCTL1, hpctl1); | 238 | snd_soc_write(codec, WM8900_REG_HPCTL1, hpctl1); |
329 | break; | 239 | break; |
330 | 240 | ||
331 | case SND_SOC_DAPM_PRE_PMD: | 241 | case SND_SOC_DAPM_PRE_PMD: |
332 | /* Short the output */ | 242 | /* Short the output */ |
333 | hpctl1 |= WM8900_REG_HPCTL1_HP_SHORT; | 243 | hpctl1 |= WM8900_REG_HPCTL1_HP_SHORT; |
334 | wm8900_write(codec, WM8900_REG_HPCTL1, hpctl1); | 244 | snd_soc_write(codec, WM8900_REG_HPCTL1, hpctl1); |
335 | 245 | ||
336 | /* Disable the output stage */ | 246 | /* Disable the output stage */ |
337 | hpctl1 &= ~WM8900_REG_HPCTL1_HP_OPSTAGE_ENA; | 247 | hpctl1 &= ~WM8900_REG_HPCTL1_HP_OPSTAGE_ENA; |
338 | wm8900_write(codec, WM8900_REG_HPCTL1, hpctl1); | 248 | snd_soc_write(codec, WM8900_REG_HPCTL1, hpctl1); |
339 | 249 | ||
340 | /* Clamp the outputs and power down input */ | 250 | /* Clamp the outputs and power down input */ |
341 | hpctl1 |= WM8900_REG_HPCTL1_HP_CLAMP_IP | | 251 | hpctl1 |= WM8900_REG_HPCTL1_HP_CLAMP_IP | |
342 | WM8900_REG_HPCTL1_HP_CLAMP_OP; | 252 | WM8900_REG_HPCTL1_HP_CLAMP_OP; |
343 | hpctl1 &= ~WM8900_REG_HPCTL1_HP_IPSTAGE_ENA; | 253 | hpctl1 &= ~WM8900_REG_HPCTL1_HP_IPSTAGE_ENA; |
344 | wm8900_write(codec, WM8900_REG_HPCTL1, hpctl1); | 254 | snd_soc_write(codec, WM8900_REG_HPCTL1, hpctl1); |
345 | break; | 255 | break; |
346 | 256 | ||
347 | case SND_SOC_DAPM_POST_PMD: | 257 | case SND_SOC_DAPM_POST_PMD: |
348 | /* Disable everything */ | 258 | /* Disable everything */ |
349 | wm8900_write(codec, WM8900_REG_HPCTL1, 0); | 259 | snd_soc_write(codec, WM8900_REG_HPCTL1, 0); |
350 | break; | 260 | break; |
351 | 261 | ||
352 | default: | 262 | default: |
@@ -439,7 +349,6 @@ SOC_SINGLE("DAC Soft Mute Switch", WM8900_REG_DACCTRL, 6, 1, 1), | |||
439 | SOC_ENUM("DAC Mute Rate", dac_mute_rate), | 349 | SOC_ENUM("DAC Mute Rate", dac_mute_rate), |
440 | SOC_SINGLE("DAC Mono Switch", WM8900_REG_DACCTRL, 9, 1, 0), | 350 | SOC_SINGLE("DAC Mono Switch", WM8900_REG_DACCTRL, 9, 1, 0), |
441 | SOC_ENUM("DAC Deemphasis", dac_deemphasis), | 351 | SOC_ENUM("DAC Deemphasis", dac_deemphasis), |
442 | SOC_SINGLE("DAC Sloping Stopband Filter Switch", WM8900_REG_DACCTRL, 8, 1, 0), | ||
443 | SOC_SINGLE("DAC Sigma-Delta Modulator Clock Switch", WM8900_REG_DACCTRL, | 352 | SOC_SINGLE("DAC Sigma-Delta Modulator Clock Switch", WM8900_REG_DACCTRL, |
444 | 12, 1, 0), | 353 | 12, 1, 0), |
445 | 354 | ||
@@ -723,7 +632,7 @@ static int wm8900_hw_params(struct snd_pcm_substream *substream, | |||
723 | struct snd_soc_codec *codec = socdev->card->codec; | 632 | struct snd_soc_codec *codec = socdev->card->codec; |
724 | u16 reg; | 633 | u16 reg; |
725 | 634 | ||
726 | reg = wm8900_read(codec, WM8900_REG_AUDIO1) & ~0x60; | 635 | reg = snd_soc_read(codec, WM8900_REG_AUDIO1) & ~0x60; |
727 | 636 | ||
728 | switch (params_format(params)) { | 637 | switch (params_format(params)) { |
729 | case SNDRV_PCM_FORMAT_S16_LE: | 638 | case SNDRV_PCM_FORMAT_S16_LE: |
@@ -741,7 +650,18 @@ static int wm8900_hw_params(struct snd_pcm_substream *substream, | |||
741 | return -EINVAL; | 650 | return -EINVAL; |
742 | } | 651 | } |
743 | 652 | ||
744 | wm8900_write(codec, WM8900_REG_AUDIO1, reg); | 653 | snd_soc_write(codec, WM8900_REG_AUDIO1, reg); |
654 | |||
655 | if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) { | ||
656 | reg = snd_soc_read(codec, WM8900_REG_DACCTRL); | ||
657 | |||
658 | if (params_rate(params) <= 24000) | ||
659 | reg |= WM8900_REG_DACCTRL_DAC_SB_FILT; | ||
660 | else | ||
661 | reg &= ~WM8900_REG_DACCTRL_DAC_SB_FILT; | ||
662 | |||
663 | snd_soc_write(codec, WM8900_REG_DACCTRL, reg); | ||
664 | } | ||
745 | 665 | ||
746 | return 0; | 666 | return 0; |
747 | } | 667 | } |
@@ -834,18 +754,18 @@ static int wm8900_set_fll(struct snd_soc_codec *codec, | |||
834 | return 0; | 754 | return 0; |
835 | 755 | ||
836 | /* The digital side should be disabled during any change. */ | 756 | /* The digital side should be disabled during any change. */ |
837 | reg = wm8900_read(codec, WM8900_REG_POWER1); | 757 | reg = snd_soc_read(codec, WM8900_REG_POWER1); |
838 | wm8900_write(codec, WM8900_REG_POWER1, | 758 | snd_soc_write(codec, WM8900_REG_POWER1, |
839 | reg & (~WM8900_REG_POWER1_FLL_ENA)); | 759 | reg & (~WM8900_REG_POWER1_FLL_ENA)); |
840 | 760 | ||
841 | /* Disable the FLL? */ | 761 | /* Disable the FLL? */ |
842 | if (!freq_in || !freq_out) { | 762 | if (!freq_in || !freq_out) { |
843 | reg = wm8900_read(codec, WM8900_REG_CLOCKING1); | 763 | reg = snd_soc_read(codec, WM8900_REG_CLOCKING1); |
844 | wm8900_write(codec, WM8900_REG_CLOCKING1, | 764 | snd_soc_write(codec, WM8900_REG_CLOCKING1, |
845 | reg & (~WM8900_REG_CLOCKING1_MCLK_SRC)); | 765 | reg & (~WM8900_REG_CLOCKING1_MCLK_SRC)); |
846 | 766 | ||
847 | reg = wm8900_read(codec, WM8900_REG_FLLCTL1); | 767 | reg = snd_soc_read(codec, WM8900_REG_FLLCTL1); |
848 | wm8900_write(codec, WM8900_REG_FLLCTL1, | 768 | snd_soc_write(codec, WM8900_REG_FLLCTL1, |
849 | reg & (~WM8900_REG_FLLCTL1_OSC_ENA)); | 769 | reg & (~WM8900_REG_FLLCTL1_OSC_ENA)); |
850 | 770 | ||
851 | wm8900->fll_in = freq_in; | 771 | wm8900->fll_in = freq_in; |
@@ -862,33 +782,33 @@ static int wm8900_set_fll(struct snd_soc_codec *codec, | |||
862 | 782 | ||
863 | /* The osclilator *MUST* be enabled before we enable the | 783 | /* The osclilator *MUST* be enabled before we enable the |
864 | * digital circuit. */ | 784 | * digital circuit. */ |
865 | wm8900_write(codec, WM8900_REG_FLLCTL1, | 785 | snd_soc_write(codec, WM8900_REG_FLLCTL1, |
866 | fll_div.fll_ratio | WM8900_REG_FLLCTL1_OSC_ENA); | 786 | fll_div.fll_ratio | WM8900_REG_FLLCTL1_OSC_ENA); |
867 | 787 | ||
868 | wm8900_write(codec, WM8900_REG_FLLCTL4, fll_div.n >> 5); | 788 | snd_soc_write(codec, WM8900_REG_FLLCTL4, fll_div.n >> 5); |
869 | wm8900_write(codec, WM8900_REG_FLLCTL5, | 789 | snd_soc_write(codec, WM8900_REG_FLLCTL5, |
870 | (fll_div.fllclk_div << 6) | (fll_div.n & 0x1f)); | 790 | (fll_div.fllclk_div << 6) | (fll_div.n & 0x1f)); |
871 | 791 | ||
872 | if (fll_div.k) { | 792 | if (fll_div.k) { |
873 | wm8900_write(codec, WM8900_REG_FLLCTL2, | 793 | snd_soc_write(codec, WM8900_REG_FLLCTL2, |
874 | (fll_div.k >> 8) | 0x100); | 794 | (fll_div.k >> 8) | 0x100); |
875 | wm8900_write(codec, WM8900_REG_FLLCTL3, fll_div.k & 0xff); | 795 | snd_soc_write(codec, WM8900_REG_FLLCTL3, fll_div.k & 0xff); |
876 | } else | 796 | } else |
877 | wm8900_write(codec, WM8900_REG_FLLCTL2, 0); | 797 | snd_soc_write(codec, WM8900_REG_FLLCTL2, 0); |
878 | 798 | ||
879 | if (fll_div.fll_slow_lock_ref) | 799 | if (fll_div.fll_slow_lock_ref) |
880 | wm8900_write(codec, WM8900_REG_FLLCTL6, | 800 | snd_soc_write(codec, WM8900_REG_FLLCTL6, |
881 | WM8900_REG_FLLCTL6_FLL_SLOW_LOCK_REF); | 801 | WM8900_REG_FLLCTL6_FLL_SLOW_LOCK_REF); |
882 | else | 802 | else |
883 | wm8900_write(codec, WM8900_REG_FLLCTL6, 0); | 803 | snd_soc_write(codec, WM8900_REG_FLLCTL6, 0); |
884 | 804 | ||
885 | reg = wm8900_read(codec, WM8900_REG_POWER1); | 805 | reg = snd_soc_read(codec, WM8900_REG_POWER1); |
886 | wm8900_write(codec, WM8900_REG_POWER1, | 806 | snd_soc_write(codec, WM8900_REG_POWER1, |
887 | reg | WM8900_REG_POWER1_FLL_ENA); | 807 | reg | WM8900_REG_POWER1_FLL_ENA); |
888 | 808 | ||
889 | reenable: | 809 | reenable: |
890 | reg = wm8900_read(codec, WM8900_REG_CLOCKING1); | 810 | reg = snd_soc_read(codec, WM8900_REG_CLOCKING1); |
891 | wm8900_write(codec, WM8900_REG_CLOCKING1, | 811 | snd_soc_write(codec, WM8900_REG_CLOCKING1, |
892 | reg | WM8900_REG_CLOCKING1_MCLK_SRC); | 812 | reg | WM8900_REG_CLOCKING1_MCLK_SRC); |
893 | 813 | ||
894 | return 0; | 814 | return 0; |
@@ -908,38 +828,38 @@ static int wm8900_set_dai_clkdiv(struct snd_soc_dai *codec_dai, | |||
908 | 828 | ||
909 | switch (div_id) { | 829 | switch (div_id) { |
910 | case WM8900_BCLK_DIV: | 830 | case WM8900_BCLK_DIV: |
911 | reg = wm8900_read(codec, WM8900_REG_CLOCKING1); | 831 | reg = snd_soc_read(codec, WM8900_REG_CLOCKING1); |
912 | wm8900_write(codec, WM8900_REG_CLOCKING1, | 832 | snd_soc_write(codec, WM8900_REG_CLOCKING1, |
913 | div | (reg & WM8900_REG_CLOCKING1_BCLK_MASK)); | 833 | div | (reg & WM8900_REG_CLOCKING1_BCLK_MASK)); |
914 | break; | 834 | break; |
915 | case WM8900_OPCLK_DIV: | 835 | case WM8900_OPCLK_DIV: |
916 | reg = wm8900_read(codec, WM8900_REG_CLOCKING1); | 836 | reg = snd_soc_read(codec, WM8900_REG_CLOCKING1); |
917 | wm8900_write(codec, WM8900_REG_CLOCKING1, | 837 | snd_soc_write(codec, WM8900_REG_CLOCKING1, |
918 | div | (reg & WM8900_REG_CLOCKING1_OPCLK_MASK)); | 838 | div | (reg & WM8900_REG_CLOCKING1_OPCLK_MASK)); |
919 | break; | 839 | break; |
920 | case WM8900_DAC_LRCLK: | 840 | case WM8900_DAC_LRCLK: |
921 | reg = wm8900_read(codec, WM8900_REG_AUDIO4); | 841 | reg = snd_soc_read(codec, WM8900_REG_AUDIO4); |
922 | wm8900_write(codec, WM8900_REG_AUDIO4, | 842 | snd_soc_write(codec, WM8900_REG_AUDIO4, |
923 | div | (reg & WM8900_LRC_MASK)); | 843 | div | (reg & WM8900_LRC_MASK)); |
924 | break; | 844 | break; |
925 | case WM8900_ADC_LRCLK: | 845 | case WM8900_ADC_LRCLK: |
926 | reg = wm8900_read(codec, WM8900_REG_AUDIO3); | 846 | reg = snd_soc_read(codec, WM8900_REG_AUDIO3); |
927 | wm8900_write(codec, WM8900_REG_AUDIO3, | 847 | snd_soc_write(codec, WM8900_REG_AUDIO3, |
928 | div | (reg & WM8900_LRC_MASK)); | 848 | div | (reg & WM8900_LRC_MASK)); |
929 | break; | 849 | break; |
930 | case WM8900_DAC_CLKDIV: | 850 | case WM8900_DAC_CLKDIV: |
931 | reg = wm8900_read(codec, WM8900_REG_CLOCKING2); | 851 | reg = snd_soc_read(codec, WM8900_REG_CLOCKING2); |
932 | wm8900_write(codec, WM8900_REG_CLOCKING2, | 852 | snd_soc_write(codec, WM8900_REG_CLOCKING2, |
933 | div | (reg & WM8900_REG_CLOCKING2_DAC_CLKDIV)); | 853 | div | (reg & WM8900_REG_CLOCKING2_DAC_CLKDIV)); |
934 | break; | 854 | break; |
935 | case WM8900_ADC_CLKDIV: | 855 | case WM8900_ADC_CLKDIV: |
936 | reg = wm8900_read(codec, WM8900_REG_CLOCKING2); | 856 | reg = snd_soc_read(codec, WM8900_REG_CLOCKING2); |
937 | wm8900_write(codec, WM8900_REG_CLOCKING2, | 857 | snd_soc_write(codec, WM8900_REG_CLOCKING2, |
938 | div | (reg & WM8900_REG_CLOCKING2_ADC_CLKDIV)); | 858 | div | (reg & WM8900_REG_CLOCKING2_ADC_CLKDIV)); |
939 | break; | 859 | break; |
940 | case WM8900_LRCLK_MODE: | 860 | case WM8900_LRCLK_MODE: |
941 | reg = wm8900_read(codec, WM8900_REG_DACCTRL); | 861 | reg = snd_soc_read(codec, WM8900_REG_DACCTRL); |
942 | wm8900_write(codec, WM8900_REG_DACCTRL, | 862 | snd_soc_write(codec, WM8900_REG_DACCTRL, |
943 | div | (reg & WM8900_REG_DACCTRL_AIF_LRCLKRATE)); | 863 | div | (reg & WM8900_REG_DACCTRL_AIF_LRCLKRATE)); |
944 | break; | 864 | break; |
945 | default: | 865 | default: |
@@ -956,10 +876,10 @@ static int wm8900_set_dai_fmt(struct snd_soc_dai *codec_dai, | |||
956 | struct snd_soc_codec *codec = codec_dai->codec; | 876 | struct snd_soc_codec *codec = codec_dai->codec; |
957 | unsigned int clocking1, aif1, aif3, aif4; | 877 | unsigned int clocking1, aif1, aif3, aif4; |
958 | 878 | ||
959 | clocking1 = wm8900_read(codec, WM8900_REG_CLOCKING1); | 879 | clocking1 = snd_soc_read(codec, WM8900_REG_CLOCKING1); |
960 | aif1 = wm8900_read(codec, WM8900_REG_AUDIO1); | 880 | aif1 = snd_soc_read(codec, WM8900_REG_AUDIO1); |
961 | aif3 = wm8900_read(codec, WM8900_REG_AUDIO3); | 881 | aif3 = snd_soc_read(codec, WM8900_REG_AUDIO3); |
962 | aif4 = wm8900_read(codec, WM8900_REG_AUDIO4); | 882 | aif4 = snd_soc_read(codec, WM8900_REG_AUDIO4); |
963 | 883 | ||
964 | /* set master/slave audio interface */ | 884 | /* set master/slave audio interface */ |
965 | switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) { | 885 | switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) { |
@@ -1055,10 +975,10 @@ static int wm8900_set_dai_fmt(struct snd_soc_dai *codec_dai, | |||
1055 | return -EINVAL; | 975 | return -EINVAL; |
1056 | } | 976 | } |
1057 | 977 | ||
1058 | wm8900_write(codec, WM8900_REG_CLOCKING1, clocking1); | 978 | snd_soc_write(codec, WM8900_REG_CLOCKING1, clocking1); |
1059 | wm8900_write(codec, WM8900_REG_AUDIO1, aif1); | 979 | snd_soc_write(codec, WM8900_REG_AUDIO1, aif1); |
1060 | wm8900_write(codec, WM8900_REG_AUDIO3, aif3); | 980 | snd_soc_write(codec, WM8900_REG_AUDIO3, aif3); |
1061 | wm8900_write(codec, WM8900_REG_AUDIO4, aif4); | 981 | snd_soc_write(codec, WM8900_REG_AUDIO4, aif4); |
1062 | 982 | ||
1063 | return 0; | 983 | return 0; |
1064 | } | 984 | } |
@@ -1068,14 +988,14 @@ static int wm8900_digital_mute(struct snd_soc_dai *codec_dai, int mute) | |||
1068 | struct snd_soc_codec *codec = codec_dai->codec; | 988 | struct snd_soc_codec *codec = codec_dai->codec; |
1069 | u16 reg; | 989 | u16 reg; |
1070 | 990 | ||
1071 | reg = wm8900_read(codec, WM8900_REG_DACCTRL); | 991 | reg = snd_soc_read(codec, WM8900_REG_DACCTRL); |
1072 | 992 | ||
1073 | if (mute) | 993 | if (mute) |
1074 | reg |= WM8900_REG_DACCTRL_MUTE; | 994 | reg |= WM8900_REG_DACCTRL_MUTE; |
1075 | else | 995 | else |
1076 | reg &= ~WM8900_REG_DACCTRL_MUTE; | 996 | reg &= ~WM8900_REG_DACCTRL_MUTE; |
1077 | 997 | ||
1078 | wm8900_write(codec, WM8900_REG_DACCTRL, reg); | 998 | snd_soc_write(codec, WM8900_REG_DACCTRL, reg); |
1079 | 999 | ||
1080 | return 0; | 1000 | return 0; |
1081 | } | 1001 | } |
@@ -1124,11 +1044,11 @@ static int wm8900_set_bias_level(struct snd_soc_codec *codec, | |||
1124 | switch (level) { | 1044 | switch (level) { |
1125 | case SND_SOC_BIAS_ON: | 1045 | case SND_SOC_BIAS_ON: |
1126 | /* Enable thermal shutdown */ | 1046 | /* Enable thermal shutdown */ |
1127 | reg = wm8900_read(codec, WM8900_REG_GPIO); | 1047 | reg = snd_soc_read(codec, WM8900_REG_GPIO); |
1128 | wm8900_write(codec, WM8900_REG_GPIO, | 1048 | snd_soc_write(codec, WM8900_REG_GPIO, |
1129 | reg | WM8900_REG_GPIO_TEMP_ENA); | 1049 | reg | WM8900_REG_GPIO_TEMP_ENA); |
1130 | reg = wm8900_read(codec, WM8900_REG_ADDCTL); | 1050 | reg = snd_soc_read(codec, WM8900_REG_ADDCTL); |
1131 | wm8900_write(codec, WM8900_REG_ADDCTL, | 1051 | snd_soc_write(codec, WM8900_REG_ADDCTL, |
1132 | reg | WM8900_REG_ADDCTL_TEMP_SD); | 1052 | reg | WM8900_REG_ADDCTL_TEMP_SD); |
1133 | break; | 1053 | break; |
1134 | 1054 | ||
@@ -1139,69 +1059,69 @@ static int wm8900_set_bias_level(struct snd_soc_codec *codec, | |||
1139 | /* Charge capacitors if initial power up */ | 1059 | /* Charge capacitors if initial power up */ |
1140 | if (codec->bias_level == SND_SOC_BIAS_OFF) { | 1060 | if (codec->bias_level == SND_SOC_BIAS_OFF) { |
1141 | /* STARTUP_BIAS_ENA on */ | 1061 | /* STARTUP_BIAS_ENA on */ |
1142 | wm8900_write(codec, WM8900_REG_POWER1, | 1062 | snd_soc_write(codec, WM8900_REG_POWER1, |
1143 | WM8900_REG_POWER1_STARTUP_BIAS_ENA); | 1063 | WM8900_REG_POWER1_STARTUP_BIAS_ENA); |
1144 | 1064 | ||
1145 | /* Startup bias mode */ | 1065 | /* Startup bias mode */ |
1146 | wm8900_write(codec, WM8900_REG_ADDCTL, | 1066 | snd_soc_write(codec, WM8900_REG_ADDCTL, |
1147 | WM8900_REG_ADDCTL_BIAS_SRC | | 1067 | WM8900_REG_ADDCTL_BIAS_SRC | |
1148 | WM8900_REG_ADDCTL_VMID_SOFTST); | 1068 | WM8900_REG_ADDCTL_VMID_SOFTST); |
1149 | 1069 | ||
1150 | /* VMID 2x50k */ | 1070 | /* VMID 2x50k */ |
1151 | wm8900_write(codec, WM8900_REG_POWER1, | 1071 | snd_soc_write(codec, WM8900_REG_POWER1, |
1152 | WM8900_REG_POWER1_STARTUP_BIAS_ENA | 0x1); | 1072 | WM8900_REG_POWER1_STARTUP_BIAS_ENA | 0x1); |
1153 | 1073 | ||
1154 | /* Allow capacitors to charge */ | 1074 | /* Allow capacitors to charge */ |
1155 | schedule_timeout_interruptible(msecs_to_jiffies(400)); | 1075 | schedule_timeout_interruptible(msecs_to_jiffies(400)); |
1156 | 1076 | ||
1157 | /* Enable bias */ | 1077 | /* Enable bias */ |
1158 | wm8900_write(codec, WM8900_REG_POWER1, | 1078 | snd_soc_write(codec, WM8900_REG_POWER1, |
1159 | WM8900_REG_POWER1_STARTUP_BIAS_ENA | | 1079 | WM8900_REG_POWER1_STARTUP_BIAS_ENA | |
1160 | WM8900_REG_POWER1_BIAS_ENA | 0x1); | 1080 | WM8900_REG_POWER1_BIAS_ENA | 0x1); |
1161 | 1081 | ||
1162 | wm8900_write(codec, WM8900_REG_ADDCTL, 0); | 1082 | snd_soc_write(codec, WM8900_REG_ADDCTL, 0); |
1163 | 1083 | ||
1164 | wm8900_write(codec, WM8900_REG_POWER1, | 1084 | snd_soc_write(codec, WM8900_REG_POWER1, |
1165 | WM8900_REG_POWER1_BIAS_ENA | 0x1); | 1085 | WM8900_REG_POWER1_BIAS_ENA | 0x1); |
1166 | } | 1086 | } |
1167 | 1087 | ||
1168 | reg = wm8900_read(codec, WM8900_REG_POWER1); | 1088 | reg = snd_soc_read(codec, WM8900_REG_POWER1); |
1169 | wm8900_write(codec, WM8900_REG_POWER1, | 1089 | snd_soc_write(codec, WM8900_REG_POWER1, |
1170 | (reg & WM8900_REG_POWER1_FLL_ENA) | | 1090 | (reg & WM8900_REG_POWER1_FLL_ENA) | |
1171 | WM8900_REG_POWER1_BIAS_ENA | 0x1); | 1091 | WM8900_REG_POWER1_BIAS_ENA | 0x1); |
1172 | wm8900_write(codec, WM8900_REG_POWER2, | 1092 | snd_soc_write(codec, WM8900_REG_POWER2, |
1173 | WM8900_REG_POWER2_SYSCLK_ENA); | 1093 | WM8900_REG_POWER2_SYSCLK_ENA); |
1174 | wm8900_write(codec, WM8900_REG_POWER3, 0); | 1094 | snd_soc_write(codec, WM8900_REG_POWER3, 0); |
1175 | break; | 1095 | break; |
1176 | 1096 | ||
1177 | case SND_SOC_BIAS_OFF: | 1097 | case SND_SOC_BIAS_OFF: |
1178 | /* Startup bias enable */ | 1098 | /* Startup bias enable */ |
1179 | reg = wm8900_read(codec, WM8900_REG_POWER1); | 1099 | reg = snd_soc_read(codec, WM8900_REG_POWER1); |
1180 | wm8900_write(codec, WM8900_REG_POWER1, | 1100 | snd_soc_write(codec, WM8900_REG_POWER1, |
1181 | reg & WM8900_REG_POWER1_STARTUP_BIAS_ENA); | 1101 | reg & WM8900_REG_POWER1_STARTUP_BIAS_ENA); |
1182 | wm8900_write(codec, WM8900_REG_ADDCTL, | 1102 | snd_soc_write(codec, WM8900_REG_ADDCTL, |
1183 | WM8900_REG_ADDCTL_BIAS_SRC | | 1103 | WM8900_REG_ADDCTL_BIAS_SRC | |
1184 | WM8900_REG_ADDCTL_VMID_SOFTST); | 1104 | WM8900_REG_ADDCTL_VMID_SOFTST); |
1185 | 1105 | ||
1186 | /* Discharge caps */ | 1106 | /* Discharge caps */ |
1187 | wm8900_write(codec, WM8900_REG_POWER1, | 1107 | snd_soc_write(codec, WM8900_REG_POWER1, |
1188 | WM8900_REG_POWER1_STARTUP_BIAS_ENA); | 1108 | WM8900_REG_POWER1_STARTUP_BIAS_ENA); |
1189 | schedule_timeout_interruptible(msecs_to_jiffies(500)); | 1109 | schedule_timeout_interruptible(msecs_to_jiffies(500)); |
1190 | 1110 | ||
1191 | /* Remove clamp */ | 1111 | /* Remove clamp */ |
1192 | wm8900_write(codec, WM8900_REG_HPCTL1, 0); | 1112 | snd_soc_write(codec, WM8900_REG_HPCTL1, 0); |
1193 | 1113 | ||
1194 | /* Power down */ | 1114 | /* Power down */ |
1195 | wm8900_write(codec, WM8900_REG_ADDCTL, 0); | 1115 | snd_soc_write(codec, WM8900_REG_ADDCTL, 0); |
1196 | wm8900_write(codec, WM8900_REG_POWER1, 0); | 1116 | snd_soc_write(codec, WM8900_REG_POWER1, 0); |
1197 | wm8900_write(codec, WM8900_REG_POWER2, 0); | 1117 | snd_soc_write(codec, WM8900_REG_POWER2, 0); |
1198 | wm8900_write(codec, WM8900_REG_POWER3, 0); | 1118 | snd_soc_write(codec, WM8900_REG_POWER3, 0); |
1199 | 1119 | ||
1200 | /* Need to let things settle before stopping the clock | 1120 | /* Need to let things settle before stopping the clock |
1201 | * to ensure that restart works, see "Stopping the | 1121 | * to ensure that restart works, see "Stopping the |
1202 | * master clock" in the datasheet. */ | 1122 | * master clock" in the datasheet. */ |
1203 | schedule_timeout_interruptible(msecs_to_jiffies(1)); | 1123 | schedule_timeout_interruptible(msecs_to_jiffies(1)); |
1204 | wm8900_write(codec, WM8900_REG_POWER2, | 1124 | snd_soc_write(codec, WM8900_REG_POWER2, |
1205 | WM8900_REG_POWER2_SYSCLK_ENA); | 1125 | WM8900_REG_POWER2_SYSCLK_ENA); |
1206 | break; | 1126 | break; |
1207 | } | 1127 | } |
@@ -1264,7 +1184,7 @@ static int wm8900_resume(struct platform_device *pdev) | |||
1264 | 1184 | ||
1265 | if (cache) { | 1185 | if (cache) { |
1266 | for (i = 0; i < WM8900_MAXREG; i++) | 1186 | for (i = 0; i < WM8900_MAXREG; i++) |
1267 | wm8900_write(codec, i, cache[i]); | 1187 | snd_soc_write(codec, i, cache[i]); |
1268 | kfree(cache); | 1188 | kfree(cache); |
1269 | } else | 1189 | } else |
1270 | dev_err(&pdev->dev, "Unable to allocate register cache\n"); | 1190 | dev_err(&pdev->dev, "Unable to allocate register cache\n"); |
@@ -1297,16 +1217,20 @@ static __devinit int wm8900_i2c_probe(struct i2c_client *i2c, | |||
1297 | 1217 | ||
1298 | codec->name = "WM8900"; | 1218 | codec->name = "WM8900"; |
1299 | codec->owner = THIS_MODULE; | 1219 | codec->owner = THIS_MODULE; |
1300 | codec->read = wm8900_read; | ||
1301 | codec->write = wm8900_write; | ||
1302 | codec->dai = &wm8900_dai; | 1220 | codec->dai = &wm8900_dai; |
1303 | codec->num_dai = 1; | 1221 | codec->num_dai = 1; |
1304 | codec->hw_write = (hw_write_t)i2c_master_send; | ||
1305 | codec->control_data = i2c; | 1222 | codec->control_data = i2c; |
1306 | codec->set_bias_level = wm8900_set_bias_level; | 1223 | codec->set_bias_level = wm8900_set_bias_level; |
1224 | codec->volatile_register = wm8900_volatile_register; | ||
1307 | codec->dev = &i2c->dev; | 1225 | codec->dev = &i2c->dev; |
1308 | 1226 | ||
1309 | reg = wm8900_read(codec, WM8900_REG_ID); | 1227 | ret = snd_soc_codec_set_cache_io(codec, 8, 16, SND_SOC_I2C); |
1228 | if (ret != 0) { | ||
1229 | dev_err(&i2c->dev, "Failed to set cache I/O: %d\n", ret); | ||
1230 | goto err; | ||
1231 | } | ||
1232 | |||
1233 | reg = snd_soc_read(codec, WM8900_REG_ID); | ||
1310 | if (reg != 0x8900) { | 1234 | if (reg != 0x8900) { |
1311 | dev_err(&i2c->dev, "Device is not a WM8900 - ID %x\n", reg); | 1235 | dev_err(&i2c->dev, "Device is not a WM8900 - ID %x\n", reg); |
1312 | ret = -ENODEV; | 1236 | ret = -ENODEV; |
@@ -1314,7 +1238,7 @@ static __devinit int wm8900_i2c_probe(struct i2c_client *i2c, | |||
1314 | } | 1238 | } |
1315 | 1239 | ||
1316 | /* Read back from the chip */ | 1240 | /* Read back from the chip */ |
1317 | reg = wm8900_chip_read(codec, WM8900_REG_POWER1); | 1241 | reg = snd_soc_read(codec, WM8900_REG_POWER1); |
1318 | reg = (reg >> 12) & 0xf; | 1242 | reg = (reg >> 12) & 0xf; |
1319 | dev_info(&i2c->dev, "WM8900 revision %d\n", reg); | 1243 | dev_info(&i2c->dev, "WM8900 revision %d\n", reg); |
1320 | 1244 | ||
@@ -1324,29 +1248,29 @@ static __devinit int wm8900_i2c_probe(struct i2c_client *i2c, | |||
1324 | wm8900_set_bias_level(codec, SND_SOC_BIAS_STANDBY); | 1248 | wm8900_set_bias_level(codec, SND_SOC_BIAS_STANDBY); |
1325 | 1249 | ||
1326 | /* Latch the volume update bits */ | 1250 | /* Latch the volume update bits */ |
1327 | wm8900_write(codec, WM8900_REG_LINVOL, | 1251 | snd_soc_write(codec, WM8900_REG_LINVOL, |
1328 | wm8900_read(codec, WM8900_REG_LINVOL) | 0x100); | 1252 | snd_soc_read(codec, WM8900_REG_LINVOL) | 0x100); |
1329 | wm8900_write(codec, WM8900_REG_RINVOL, | 1253 | snd_soc_write(codec, WM8900_REG_RINVOL, |
1330 | wm8900_read(codec, WM8900_REG_RINVOL) | 0x100); | 1254 | snd_soc_read(codec, WM8900_REG_RINVOL) | 0x100); |
1331 | wm8900_write(codec, WM8900_REG_LOUT1CTL, | 1255 | snd_soc_write(codec, WM8900_REG_LOUT1CTL, |
1332 | wm8900_read(codec, WM8900_REG_LOUT1CTL) | 0x100); | 1256 | snd_soc_read(codec, WM8900_REG_LOUT1CTL) | 0x100); |
1333 | wm8900_write(codec, WM8900_REG_ROUT1CTL, | 1257 | snd_soc_write(codec, WM8900_REG_ROUT1CTL, |
1334 | wm8900_read(codec, WM8900_REG_ROUT1CTL) | 0x100); | 1258 | snd_soc_read(codec, WM8900_REG_ROUT1CTL) | 0x100); |
1335 | wm8900_write(codec, WM8900_REG_LOUT2CTL, | 1259 | snd_soc_write(codec, WM8900_REG_LOUT2CTL, |
1336 | wm8900_read(codec, WM8900_REG_LOUT2CTL) | 0x100); | 1260 | snd_soc_read(codec, WM8900_REG_LOUT2CTL) | 0x100); |
1337 | wm8900_write(codec, WM8900_REG_ROUT2CTL, | 1261 | snd_soc_write(codec, WM8900_REG_ROUT2CTL, |
1338 | wm8900_read(codec, WM8900_REG_ROUT2CTL) | 0x100); | 1262 | snd_soc_read(codec, WM8900_REG_ROUT2CTL) | 0x100); |
1339 | wm8900_write(codec, WM8900_REG_LDAC_DV, | 1263 | snd_soc_write(codec, WM8900_REG_LDAC_DV, |
1340 | wm8900_read(codec, WM8900_REG_LDAC_DV) | 0x100); | 1264 | snd_soc_read(codec, WM8900_REG_LDAC_DV) | 0x100); |
1341 | wm8900_write(codec, WM8900_REG_RDAC_DV, | 1265 | snd_soc_write(codec, WM8900_REG_RDAC_DV, |
1342 | wm8900_read(codec, WM8900_REG_RDAC_DV) | 0x100); | 1266 | snd_soc_read(codec, WM8900_REG_RDAC_DV) | 0x100); |
1343 | wm8900_write(codec, WM8900_REG_LADC_DV, | 1267 | snd_soc_write(codec, WM8900_REG_LADC_DV, |
1344 | wm8900_read(codec, WM8900_REG_LADC_DV) | 0x100); | 1268 | snd_soc_read(codec, WM8900_REG_LADC_DV) | 0x100); |
1345 | wm8900_write(codec, WM8900_REG_RADC_DV, | 1269 | snd_soc_write(codec, WM8900_REG_RADC_DV, |
1346 | wm8900_read(codec, WM8900_REG_RADC_DV) | 0x100); | 1270 | snd_soc_read(codec, WM8900_REG_RADC_DV) | 0x100); |
1347 | 1271 | ||
1348 | /* Set the DAC and mixer output bias */ | 1272 | /* Set the DAC and mixer output bias */ |
1349 | wm8900_write(codec, WM8900_REG_OUTBIASCTL, 0x81); | 1273 | snd_soc_write(codec, WM8900_REG_OUTBIASCTL, 0x81); |
1350 | 1274 | ||
1351 | wm8900_dai.dev = &i2c->dev; | 1275 | wm8900_dai.dev = &i2c->dev; |
1352 | 1276 | ||
@@ -1388,6 +1312,21 @@ static __devexit int wm8900_i2c_remove(struct i2c_client *client) | |||
1388 | return 0; | 1312 | return 0; |
1389 | } | 1313 | } |
1390 | 1314 | ||
1315 | #ifdef CONFIG_PM | ||
1316 | static int wm8900_i2c_suspend(struct i2c_client *client, pm_message_t msg) | ||
1317 | { | ||
1318 | return snd_soc_suspend_device(&client->dev); | ||
1319 | } | ||
1320 | |||
1321 | static int wm8900_i2c_resume(struct i2c_client *client) | ||
1322 | { | ||
1323 | return snd_soc_resume_device(&client->dev); | ||
1324 | } | ||
1325 | #else | ||
1326 | #define wm8900_i2c_suspend NULL | ||
1327 | #define wm8900_i2c_resume NULL | ||
1328 | #endif | ||
1329 | |||
1391 | static const struct i2c_device_id wm8900_i2c_id[] = { | 1330 | static const struct i2c_device_id wm8900_i2c_id[] = { |
1392 | { "wm8900", 0 }, | 1331 | { "wm8900", 0 }, |
1393 | { } | 1332 | { } |
@@ -1401,6 +1340,8 @@ static struct i2c_driver wm8900_i2c_driver = { | |||
1401 | }, | 1340 | }, |
1402 | .probe = wm8900_i2c_probe, | 1341 | .probe = wm8900_i2c_probe, |
1403 | .remove = __devexit_p(wm8900_i2c_remove), | 1342 | .remove = __devexit_p(wm8900_i2c_remove), |
1343 | .suspend = wm8900_i2c_suspend, | ||
1344 | .resume = wm8900_i2c_resume, | ||
1404 | .id_table = wm8900_i2c_id, | 1345 | .id_table = wm8900_i2c_id, |
1405 | }; | 1346 | }; |
1406 | 1347 | ||