xref: /openbmc/linux/sound/soc/codecs/wm8731.c (revision bd903b6e)
1 /*
2  * wm8731.c  --  WM8731 ALSA SoC Audio driver
3  *
4  * Copyright 2005 Openedhand Ltd.
5  *
6  * Author: Richard Purdie <richard@openedhand.com>
7  *
8  * Based on wm8753.c by Liam Girdwood
9  *
10  * This program is free software; you can redistribute it and/or modify
11  * it under the terms of the GNU General Public License version 2 as
12  * published by the Free Software Foundation.
13  */
14 
15 #include <linux/module.h>
16 #include <linux/moduleparam.h>
17 #include <linux/init.h>
18 #include <linux/delay.h>
19 #include <linux/pm.h>
20 #include <linux/i2c.h>
21 #include <linux/platform_device.h>
22 #include <sound/driver.h>
23 #include <sound/core.h>
24 #include <sound/pcm.h>
25 #include <sound/pcm_params.h>
26 #include <sound/soc.h>
27 #include <sound/soc-dapm.h>
28 #include <sound/initval.h>
29 
30 #include "wm8731.h"
31 
32 #define AUDIO_NAME "wm8731"
33 #define WM8731_VERSION "0.12"
34 
35 /*
36  * Debug
37  */
38 
39 #define WM8731_DEBUG 0
40 
41 #ifdef WM8731_DEBUG
42 #define dbg(format, arg...) \
43 	printk(KERN_DEBUG AUDIO_NAME ": " format "\n" , ## arg)
44 #else
45 #define dbg(format, arg...) do {} while (0)
46 #endif
47 #define err(format, arg...) \
48 	printk(KERN_ERR AUDIO_NAME ": " format "\n" , ## arg)
49 #define info(format, arg...) \
50 	printk(KERN_INFO AUDIO_NAME ": " format "\n" , ## arg)
51 #define warn(format, arg...) \
52 	printk(KERN_WARNING AUDIO_NAME ": " format "\n" , ## arg)
53 
54 struct snd_soc_codec_device soc_codec_dev_wm8731;
55 
56 /*
57  * wm8731 register cache
58  * We can't read the WM8731 register space when we are
59  * using 2 wire for device control, so we cache them instead.
60  * There is no point in caching the reset register
61  */
62 static const u16 wm8731_reg[WM8731_CACHEREGNUM] = {
63     0x0097, 0x0097, 0x0079, 0x0079,
64     0x000a, 0x0008, 0x009f, 0x000a,
65     0x0000, 0x0000
66 };
67 
68 #define WM8731_DAIFMT \
69 	(SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_LEFT_J | SND_SOC_DAIFMT_RIGHT_J | \
70 	SND_SOC_DAIFMT_NB_NF | SND_SOC_DAIFMT_NB_IF | SND_SOC_DAIFMT_IB_NF | \
71 	SND_SOC_DAIFMT_IB_IF)
72 
73 #define WM8731_DIR \
74 	(SND_SOC_DAIDIR_PLAYBACK | SND_SOC_DAIDIR_CAPTURE)
75 
76 #define WM8731_RATES \
77 	(SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_11025 | SNDRV_PCM_RATE_16000 | \
78 	SNDRV_PCM_RATE_22050 | SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_44100 | \
79 	SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_88200 | SNDRV_PCM_RATE_96000)
80 
81 #define WM8731_HIFI_BITS \
82 	(SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S20_3LE | \
83 	SNDRV_PCM_FMTBIT_S24_LE | SNDRV_PCM_FMTBIT_S32_LE)
84 
85 static struct snd_soc_dai_mode wm8731_modes[] = {
86 	/* codec frame and clock master modes */
87 	/* 8k */
88 	{
89 		.fmt = WM8731_DAIFMT | SND_SOC_DAIFMT_CBM_CFM,
90 		.pcmfmt = WM8731_HIFI_BITS,
91 		.pcmrate = SNDRV_PCM_RATE_8000,
92 		.pcmdir = WM8731_DIR,
93 		.flags = SND_SOC_DAI_BFS_RATE,
94 		.fs = 1536,
95 		.bfs = 64,
96 	},
97 	{
98 		.fmt = WM8731_DAIFMT | SND_SOC_DAIFMT_CBM_CFM,
99 		.pcmfmt = WM8731_HIFI_BITS,
100 		.pcmrate = SNDRV_PCM_RATE_8000,
101 		.pcmdir = WM8731_DIR,
102 		.flags = SND_SOC_DAI_BFS_RATE,
103 		.fs = 2304,
104 		.bfs = 64,
105 	},
106 	{
107 		.fmt = WM8731_DAIFMT | SND_SOC_DAIFMT_CBM_CFM,
108 		.pcmfmt = WM8731_HIFI_BITS,
109 		.pcmrate = SNDRV_PCM_RATE_8000,
110 		.pcmdir = WM8731_DIR,
111 		.flags = SND_SOC_DAI_BFS_RATE,
112 		.fs = 1408,
113 		.bfs = 64,
114 	},
115 	{
116 		.fmt = WM8731_DAIFMT | SND_SOC_DAIFMT_CBM_CFM,
117 		.pcmfmt = WM8731_HIFI_BITS,
118 		.pcmrate = SNDRV_PCM_RATE_8000,
119 		.pcmdir = WM8731_DIR,
120 		.flags = SND_SOC_DAI_BFS_RATE,
121 		.fs = 2112,
122 		.bfs = 64,
123 	},
124 
125 	/* 32k */
126 	{
127 		.fmt = WM8731_DAIFMT | SND_SOC_DAIFMT_CBM_CFM,
128 		.pcmfmt = WM8731_HIFI_BITS,
129 		.pcmrate = SNDRV_PCM_RATE_32000,
130 		.pcmdir = WM8731_DIR,
131 		.flags = SND_SOC_DAI_BFS_RATE,
132 		.fs = 384,
133 		.bfs = 64,
134 	},
135 	{
136 		.fmt = WM8731_DAIFMT | SND_SOC_DAIFMT_CBM_CFM,
137 		.pcmfmt = WM8731_HIFI_BITS,
138 		.pcmrate = SNDRV_PCM_RATE_32000,
139 		.pcmdir = WM8731_DIR,
140 		.flags = SND_SOC_DAI_BFS_RATE,
141 		.fs = 576,
142 		.bfs = 64,
143 	},
144 
145 	/* 44.1k & 48k */
146 	{
147 		.fmt = WM8731_DAIFMT | SND_SOC_DAIFMT_CBM_CFM,
148 		.pcmfmt = WM8731_HIFI_BITS,
149 		.pcmrate = SNDRV_PCM_RATE_44100 | SNDRV_PCM_RATE_48000,
150 		.pcmdir = WM8731_DIR,
151 		.flags = SND_SOC_DAI_BFS_RATE,
152 		.fs = 256,
153 		.bfs = 64,
154 	},
155 	{
156 		.fmt = WM8731_DAIFMT | SND_SOC_DAIFMT_CBM_CFM,
157 		.pcmfmt = WM8731_HIFI_BITS,
158 		.pcmrate = SNDRV_PCM_RATE_44100 | SNDRV_PCM_RATE_48000,
159 		.pcmdir = WM8731_DIR,
160 		.flags = SND_SOC_DAI_BFS_RATE,
161 		.fs = 384,
162 		.bfs = 64,
163 	},
164 
165 	/* 88.2 & 96k */
166 	{
167 		.fmt = WM8731_DAIFMT | SND_SOC_DAIFMT_CBM_CFM,
168 		.pcmfmt = WM8731_HIFI_BITS,
169 		.pcmrate = SNDRV_PCM_RATE_88200 | SNDRV_PCM_RATE_96000,
170 		.pcmdir = WM8731_DIR,
171 		.flags = SND_SOC_DAI_BFS_RATE,
172 		.fs = 128,
173 		.bfs = 64,
174 	},
175 	{
176 		.fmt = WM8731_DAIFMT | SND_SOC_DAIFMT_CBM_CFM,
177 		.pcmfmt = WM8731_HIFI_BITS,
178 		.pcmrate = SNDRV_PCM_RATE_88200 | SNDRV_PCM_RATE_96000,
179 		.pcmdir = WM8731_DIR,
180 		.flags = SND_SOC_DAI_BFS_RATE,
181 		.fs = 192,
182 		.bfs = 64,
183 	},
184 
185 	/* USB codec frame and clock master modes */
186 	/* 8k */
187 	{
188 		.fmt = WM8731_DAIFMT | SND_SOC_DAIFMT_CBM_CFM,
189 		.pcmfmt = WM8731_HIFI_BITS,
190 		.pcmrate = SNDRV_PCM_RATE_8000,
191 		.pcmdir = WM8731_DIR,
192 		.flags = SND_SOC_DAI_BFS_DIV,
193 		.fs = 1500,
194 		.bfs = SND_SOC_FSBD(1),
195 	},
196 
197 	/* 44.1k */
198 	{
199 		.fmt = WM8731_DAIFMT | SND_SOC_DAIFMT_CBM_CFM,
200 		.pcmfmt = WM8731_HIFI_BITS,
201 		.pcmrate = SNDRV_PCM_RATE_44100,
202 		.pcmdir = WM8731_DIR,
203 		.flags = SND_SOC_DAI_BFS_DIV,
204 		.fs = 272,
205 		.bfs = SND_SOC_FSBD(1),
206 	},
207 
208 	/* 48k */
209 	{
210 		.fmt = WM8731_DAIFMT | SND_SOC_DAIFMT_CBM_CFM,
211 		.pcmfmt = WM8731_HIFI_BITS,
212 		.pcmrate = SNDRV_PCM_RATE_48000,
213 		.pcmdir = WM8731_DIR,
214 		.flags = SND_SOC_DAI_BFS_DIV,
215 		.fs = 250,
216 		.bfs = SND_SOC_FSBD(1),
217 	},
218 
219 	/* 88.2k */
220 	{
221 		.fmt = WM8731_DAIFMT | SND_SOC_DAIFMT_CBM_CFM,
222 		.pcmfmt = WM8731_HIFI_BITS,
223 		.pcmrate = SNDRV_PCM_RATE_88200,
224 		.pcmdir = WM8731_DIR,
225 		.flags = SND_SOC_DAI_BFS_DIV,
226 		.fs = 136,
227 		.bfs = SND_SOC_FSBD(1),
228 	},
229 
230 	/* 96k */
231 	{
232 		.fmt = WM8731_DAIFMT | SND_SOC_DAIFMT_CBM_CFM,
233 		.pcmfmt = WM8731_HIFI_BITS,
234 		.pcmrate = SNDRV_PCM_RATE_96000,
235 		.pcmdir = WM8731_DIR,
236 		.flags = SND_SOC_DAI_BFS_DIV,
237 		.fs = 125,
238 		.bfs = SND_SOC_FSBD(1),
239 	},
240 
241 	/* codec frame and clock slave modes */
242 	{
243 		.fmt = WM8731_DAIFMT | SND_SOC_DAIFMT_CBS_CFS,
244 		.pcmfmt = WM8731_HIFI_BITS,
245 		.pcmrate = WM8731_RATES,
246 		.pcmdir = WM8731_DIR,
247 		.flags = SND_SOC_DAI_BFS_DIV,
248 		.fs = SND_SOC_FS_ALL,
249 		.bfs = SND_SOC_FSB_ALL,
250 	},
251 };
252 
253 /*
254  * read wm8731 register cache
255  */
256 static inline unsigned int wm8731_read_reg_cache(struct snd_soc_codec *codec,
257 	unsigned int reg)
258 {
259 	u16 *cache = codec->reg_cache;
260 	if (reg == WM8731_RESET)
261 		return 0;
262 	if (reg >= WM8731_CACHEREGNUM)
263 		return -1;
264 	return cache[reg];
265 }
266 
267 /*
268  * write wm8731 register cache
269  */
270 static inline void wm8731_write_reg_cache(struct snd_soc_codec *codec,
271 	u16 reg, unsigned int value)
272 {
273 	u16 *cache = codec->reg_cache;
274 	if (reg >= WM8731_CACHEREGNUM)
275 		return;
276 	cache[reg] = value;
277 }
278 
279 /*
280  * write to the WM8731 register space
281  */
282 static int wm8731_write(struct snd_soc_codec *codec, unsigned int reg,
283 	unsigned int value)
284 {
285 	u8 data[2];
286 
287 	/* data is
288 	 *   D15..D9 WM8731 register offset
289 	 *   D8...D0 register data
290 	 */
291 	data[0] = (reg << 1) | ((value >> 8) & 0x0001);
292 	data[1] = value & 0x00ff;
293 
294 	wm8731_write_reg_cache (codec, reg, value);
295 	if (codec->hw_write(codec->control_data, data, 2) == 2)
296 		return 0;
297 	else
298 		return -EIO;
299 }
300 
301 #define wm8731_reset(c)	wm8731_write(c, WM8731_RESET, 0)
302 
303 static const char *wm8731_input_select[] = {"Line In", "Mic"};
304 static const char *wm8731_deemph[] = {"None", "32Khz", "44.1Khz", "48Khz"};
305 
306 static const struct soc_enum wm8731_enum[] = {
307 	SOC_ENUM_SINGLE(WM8731_APANA, 2, 2, wm8731_input_select),
308 	SOC_ENUM_SINGLE(WM8731_APDIGI, 1, 4, wm8731_deemph),
309 };
310 
311 static const struct snd_kcontrol_new wm8731_snd_controls[] = {
312 
313 SOC_DOUBLE_R("Master Playback Volume", WM8731_LOUT1V, WM8731_ROUT1V,
314 	0, 127, 0),
315 SOC_DOUBLE_R("Master Playback ZC Switch", WM8731_LOUT1V, WM8731_ROUT1V,
316 	7, 1, 0),
317 
318 SOC_DOUBLE_R("Capture Volume", WM8731_LINVOL, WM8731_RINVOL, 0, 31, 0),
319 SOC_DOUBLE_R("Line Capture Switch", WM8731_LINVOL, WM8731_RINVOL, 7, 1, 1),
320 
321 SOC_SINGLE("Mic Boost (+20dB)", WM8731_APANA, 0, 1, 0),
322 SOC_SINGLE("Capture Mic Switch", WM8731_APANA, 1, 1, 1),
323 
324 SOC_SINGLE("Sidetone Playback Volume", WM8731_APANA, 6, 3, 1),
325 
326 SOC_SINGLE("ADC High Pass Filter Switch", WM8731_APDIGI, 0, 1, 1),
327 SOC_SINGLE("Store DC Offset Switch", WM8731_APDIGI, 4, 1, 0),
328 
329 SOC_ENUM("Playback De-emphasis", wm8731_enum[1]),
330 };
331 
332 /* add non dapm controls */
333 static int wm8731_add_controls(struct snd_soc_codec *codec)
334 {
335 	int err, i;
336 
337 	for (i = 0; i < ARRAY_SIZE(wm8731_snd_controls); i++) {
338 		if ((err = snd_ctl_add(codec->card,
339 				snd_soc_cnew(&wm8731_snd_controls[i],codec, NULL))) < 0)
340 			return err;
341 	}
342 
343 	return 0;
344 }
345 
346 /* Output Mixer */
347 static const struct snd_kcontrol_new wm8731_output_mixer_controls[] = {
348 SOC_DAPM_SINGLE("Line Bypass Switch", WM8731_APANA, 3, 1, 0),
349 SOC_DAPM_SINGLE("Mic Sidetone Switch", WM8731_APANA, 5, 1, 0),
350 SOC_DAPM_SINGLE("HiFi Playback Switch", WM8731_APANA, 4, 1, 0),
351 };
352 
353 /* Input mux */
354 static const struct snd_kcontrol_new wm8731_input_mux_controls =
355 SOC_DAPM_ENUM("Input Select", wm8731_enum[0]);
356 
357 static const struct snd_soc_dapm_widget wm8731_dapm_widgets[] = {
358 SND_SOC_DAPM_MIXER("Output Mixer", WM8731_PWR, 4, 1,
359 	&wm8731_output_mixer_controls[0],
360 	ARRAY_SIZE(wm8731_output_mixer_controls)),
361 SND_SOC_DAPM_DAC("DAC", "HiFi Playback", WM8731_PWR, 3, 1),
362 SND_SOC_DAPM_OUTPUT("LOUT"),
363 SND_SOC_DAPM_OUTPUT("LHPOUT"),
364 SND_SOC_DAPM_OUTPUT("ROUT"),
365 SND_SOC_DAPM_OUTPUT("RHPOUT"),
366 SND_SOC_DAPM_ADC("ADC", "HiFi Capture", WM8731_PWR, 2, 1),
367 SND_SOC_DAPM_MUX("Input Mux", SND_SOC_NOPM, 0, 0, &wm8731_input_mux_controls),
368 SND_SOC_DAPM_PGA("Line Input", WM8731_PWR, 0, 1, NULL, 0),
369 SND_SOC_DAPM_MICBIAS("Mic Bias", WM8731_PWR, 1, 1),
370 SND_SOC_DAPM_INPUT("MICIN"),
371 SND_SOC_DAPM_INPUT("RLINEIN"),
372 SND_SOC_DAPM_INPUT("LLINEIN"),
373 };
374 
375 static const char *intercon[][3] = {
376 	/* output mixer */
377 	{"Output Mixer", "Line Bypass Switch", "Line Input"},
378 	{"Output Mixer", "HiFi Playback Switch", "DAC"},
379 	{"Output Mixer", "Mic Sidetone Switch", "Mic Bias"},
380 
381 	/* outputs */
382 	{"RHPOUT", NULL, "Output Mixer"},
383 	{"ROUT", NULL, "Output Mixer"},
384 	{"LHPOUT", NULL, "Output Mixer"},
385 	{"LOUT", NULL, "Output Mixer"},
386 
387 	/* input mux */
388 	{"Input Mux", "Line In", "Line Input"},
389 	{"Input Mux", "Mic", "Mic Bias"},
390 	{"ADC", NULL, "Input Mux"},
391 
392 	/* inputs */
393 	{"Line Input", NULL, "LLINEIN"},
394 	{"Line Input", NULL, "RLINEIN"},
395 	{"Mic Bias", NULL, "MICIN"},
396 
397 	/* terminator */
398 	{NULL, NULL, NULL},
399 };
400 
401 static int wm8731_add_widgets(struct snd_soc_codec *codec)
402 {
403 	int i;
404 
405 	for(i = 0; i < ARRAY_SIZE(wm8731_dapm_widgets); i++) {
406 		snd_soc_dapm_new_control(codec, &wm8731_dapm_widgets[i]);
407 	}
408 
409 	/* set up audio path interconnects */
410 	for(i = 0; intercon[i][0] != NULL; i++) {
411 		snd_soc_dapm_connect_input(codec, intercon[i][0],
412 			intercon[i][1], intercon[i][2]);
413 	}
414 
415 	snd_soc_dapm_new_widgets(codec);
416 	return 0;
417 }
418 
419 struct _coeff_div {
420 	u32 mclk;
421 	u32 rate;
422 	u16 fs;
423 	u8 sr:4;
424 	u8 bosr:1;
425 	u8 usb:1;
426 };
427 
428 /* codec mclk clock divider coefficients */
429 static const struct _coeff_div coeff_div[] = {
430 	/* 48k */
431 	{12288000, 48000, 256, 0x0, 0x0, 0x0},
432 	{18432000, 48000, 384, 0x0, 0x1, 0x0},
433 	{12000000, 48000, 250, 0x0, 0x0, 0x1},
434 
435 	/* 32k */
436 	{12288000, 32000, 384, 0x6, 0x0, 0x0},
437 	{18432000, 32000, 576, 0x6, 0x1, 0x0},
438 
439 	/* 8k */
440 	{12288000, 8000, 1536, 0x3, 0x0, 0x0},
441 	{18432000, 8000, 2304, 0x3, 0x1, 0x0},
442 	{11289600, 8000, 1408, 0xb, 0x0, 0x0},
443 	{16934400, 8000, 2112, 0xb, 0x1, 0x0},
444 	{12000000, 8000, 1500, 0x3, 0x0, 0x1},
445 
446 	/* 96k */
447 	{12288000, 96000, 128, 0x7, 0x0, 0x0},
448 	{18432000, 96000, 192, 0x7, 0x1, 0x0},
449 	{12000000, 96000, 125, 0x7, 0x0, 0x1},
450 
451 	/* 44.1k */
452 	{11289600, 44100, 256, 0x8, 0x0, 0x0},
453 	{16934400, 44100, 384, 0x8, 0x1, 0x0},
454 	{12000000, 44100, 272, 0x8, 0x1, 0x1},
455 
456 	/* 88.2k */
457 	{11289600, 88200, 128, 0xf, 0x0, 0x0},
458 	{16934400, 88200, 192, 0xf, 0x1, 0x0},
459 	{12000000, 88200, 136, 0xf, 0x1, 0x1},
460 };
461 
462 static inline int get_coeff(int mclk, int rate)
463 {
464 	int i;
465 
466 	for (i = 0; i < ARRAY_SIZE(coeff_div); i++) {
467 		if (coeff_div[i].rate == rate && coeff_div[i].mclk == mclk)
468 			return i;
469 	}
470 	return 0;
471 }
472 
473 /* WM8731 supports numerous clocks per sample rate */
474 static unsigned int wm8731_config_sysclk(struct snd_soc_codec_dai *dai,
475 	struct snd_soc_clock_info *info, unsigned int clk)
476 {
477 	dai->mclk = 0;
478 
479 	/* check that the calculated FS and rate actually match a clock from
480 	 * the machine driver */
481 	if (info->fs * info->rate == clk)
482 		dai->mclk = clk;
483 
484 	return dai->mclk;
485 }
486 
487 static int wm8731_pcm_prepare(struct snd_pcm_substream *substream)
488 {
489 	struct snd_soc_pcm_runtime *rtd = substream->private_data;
490 	struct snd_soc_device *socdev = rtd->socdev;
491 	struct snd_soc_codec *codec = socdev->codec;
492 	u16 iface = 0, srate;
493 	int i = get_coeff(rtd->codec_dai->mclk,
494 		snd_soc_get_rate(rtd->codec_dai->dai_runtime.pcmrate));
495 
496 	/* set master/slave audio interface */
497 	switch (rtd->codec_dai->dai_runtime.fmt & SND_SOC_DAIFMT_CLOCK_MASK) {
498 	case SND_SOC_DAIFMT_CBM_CFM:
499 		iface |= 0x0040;
500 		break;
501 	case SND_SOC_DAIFMT_CBS_CFS:
502 		break;
503 	}
504 	srate = (coeff_div[i].sr << 2) |
505 		(coeff_div[i].bosr << 1) | coeff_div[i].usb;
506 	wm8731_write(codec, WM8731_SRATE, srate);
507 
508 	/* interface format */
509 	switch (rtd->codec_dai->dai_runtime.fmt & SND_SOC_DAIFMT_FORMAT_MASK) {
510 	case SND_SOC_DAIFMT_I2S:
511 		iface |= 0x0002;
512 		break;
513 	case SND_SOC_DAIFMT_RIGHT_J:
514 		break;
515 	case SND_SOC_DAIFMT_LEFT_J:
516 		iface |= 0x0001;
517 		break;
518 	case SND_SOC_DAIFMT_DSP_A:
519 		iface |= 0x0003;
520 		break;
521 	case SND_SOC_DAIFMT_DSP_B:
522 		iface |= 0x0013;
523 		break;
524 	}
525 
526 	/* bit size */
527 	switch (rtd->codec_dai->dai_runtime.pcmfmt) {
528 	case SNDRV_PCM_FMTBIT_S16_LE:
529 		break;
530 	case SNDRV_PCM_FMTBIT_S20_3LE:
531 		iface |= 0x0004;
532 		break;
533 	case SNDRV_PCM_FMTBIT_S24_LE:
534 		iface |= 0x0008;
535 		break;
536 	case SNDRV_PCM_FMTBIT_S32_LE:
537 		iface |= 0x000c;
538 		break;
539 	}
540 
541 	/* clock inversion */
542 	switch (rtd->codec_dai->dai_runtime.fmt & SND_SOC_DAIFMT_INV_MASK) {
543 	case SND_SOC_DAIFMT_NB_NF:
544 		break;
545 	case SND_SOC_DAIFMT_IB_IF:
546 		iface |= 0x0090;
547 		break;
548 	case SND_SOC_DAIFMT_IB_NF:
549 		iface |= 0x0080;
550 		break;
551 	case SND_SOC_DAIFMT_NB_IF:
552 		iface |= 0x0010;
553 		break;
554 	}
555 
556 	/* set iface */
557 	wm8731_write(codec, WM8731_IFACE, iface);
558 
559 	/* set active */
560 	wm8731_write(codec, WM8731_ACTIVE, 0x0001);
561 	return 0;
562 }
563 
564 static void wm8731_shutdown(struct snd_pcm_substream *substream)
565 {
566 	struct snd_soc_pcm_runtime *rtd = substream->private_data;
567 	struct snd_soc_device *socdev = rtd->socdev;
568 	struct snd_soc_codec *codec = socdev->codec;
569 
570 	/* deactivate */
571 	if (!codec->active) {
572 		udelay(50);
573 		wm8731_write(codec, WM8731_ACTIVE, 0x0);
574 	}
575 }
576 
577 static int wm8731_mute(struct snd_soc_codec *codec,
578 	struct snd_soc_codec_dai *dai, int mute)
579 {
580 	u16 mute_reg = wm8731_read_reg_cache(codec, WM8731_APDIGI) & 0xfff7;
581 	if (mute)
582 		wm8731_write(codec, WM8731_APDIGI, mute_reg | 0x8);
583 	else
584 		wm8731_write(codec, WM8731_APDIGI, mute_reg);
585 	return 0;
586 }
587 
588 static int wm8731_dapm_event(struct snd_soc_codec *codec, int event)
589 {
590 	u16 reg = wm8731_read_reg_cache(codec, WM8731_PWR) & 0xff7f;
591 
592 	switch (event) {
593 	case SNDRV_CTL_POWER_D0: /* full On */
594 		/* vref/mid, osc on, dac unmute */
595 		wm8731_write(codec, WM8731_PWR, reg);
596 		break;
597 	case SNDRV_CTL_POWER_D1: /* partial On */
598 	case SNDRV_CTL_POWER_D2: /* partial On */
599 		break;
600 	case SNDRV_CTL_POWER_D3hot: /* Off, with power */
601 		/* everything off except vref/vmid, */
602 		wm8731_write(codec, WM8731_PWR, reg | 0x0040);
603 		break;
604 	case SNDRV_CTL_POWER_D3cold: /* Off, without power */
605 		/* everything off, dac mute, inactive */
606 		wm8731_write(codec, WM8731_ACTIVE, 0x0);
607 		wm8731_write(codec, WM8731_PWR, 0xffff);
608 		break;
609 	}
610 	codec->dapm_state = event;
611 	return 0;
612 }
613 
614 struct snd_soc_codec_dai wm8731_dai = {
615 	.name = "WM8731",
616 	.playback = {
617 		.stream_name = "Playback",
618 		.channels_min = 1,
619 		.channels_max = 2,
620 	},
621 	.capture = {
622 		.stream_name = "Capture",
623 		.channels_min = 1,
624 		.channels_max = 2,
625 	},
626 	.config_sysclk = wm8731_config_sysclk,
627 	.digital_mute = wm8731_mute,
628 	.ops = {
629 		.prepare = wm8731_pcm_prepare,
630 		.shutdown = wm8731_shutdown,
631 	},
632 	.caps = {
633 		.num_modes = ARRAY_SIZE(wm8731_modes),
634 		.mode = wm8731_modes,
635 	},
636 };
637 EXPORT_SYMBOL_GPL(wm8731_dai);
638 
639 static int wm8731_suspend(struct platform_device *pdev, pm_message_t state)
640 {
641 	struct snd_soc_device *socdev = platform_get_drvdata(pdev);
642 	struct snd_soc_codec *codec = socdev->codec;
643 
644 	wm8731_write(codec, WM8731_ACTIVE, 0x0);
645 	wm8731_dapm_event(codec, SNDRV_CTL_POWER_D3cold);
646 	return 0;
647 }
648 
649 static int wm8731_resume(struct platform_device *pdev)
650 {
651 	struct snd_soc_device *socdev = platform_get_drvdata(pdev);
652 	struct snd_soc_codec *codec = socdev->codec;
653 	int i;
654 	u8 data[2];
655 	u16 *cache = codec->reg_cache;
656 
657 	/* Sync reg_cache with the hardware */
658 	for (i = 0; i < ARRAY_SIZE(wm8731_reg); i++) {
659 		data[0] = (i << 1) | ((cache[i] >> 8) & 0x0001);
660 		data[1] = cache[i] & 0x00ff;
661 		codec->hw_write(codec->control_data, data, 2);
662 	}
663 	wm8731_dapm_event(codec, SNDRV_CTL_POWER_D3hot);
664 	wm8731_dapm_event(codec, codec->suspend_dapm_state);
665 	return 0;
666 }
667 
668 /*
669  * initialise the WM8731 driver
670  * register the mixer and dsp interfaces with the kernel
671  */
672 static int wm8731_init(struct snd_soc_device *socdev)
673 {
674 	struct snd_soc_codec *codec = socdev->codec;
675 	int reg, ret = 0;
676 
677 	codec->name = "WM8731";
678 	codec->owner = THIS_MODULE;
679 	codec->read = wm8731_read_reg_cache;
680 	codec->write = wm8731_write;
681 	codec->dapm_event = wm8731_dapm_event;
682 	codec->dai = &wm8731_dai;
683 	codec->num_dai = 1;
684 	codec->reg_cache_size = ARRAY_SIZE(wm8731_reg);
685 
686 	codec->reg_cache =
687 			kzalloc(sizeof(u16) * ARRAY_SIZE(wm8731_reg), GFP_KERNEL);
688 	if (codec->reg_cache == NULL)
689 		return -ENOMEM;
690 	memcpy(codec->reg_cache,
691 		wm8731_reg, sizeof(u16) * ARRAY_SIZE(wm8731_reg));
692 	codec->reg_cache_size = sizeof(u16) * ARRAY_SIZE(wm8731_reg);
693 
694 	wm8731_reset(codec);
695 
696 	/* register pcms */
697 	ret = snd_soc_new_pcms(socdev, SNDRV_DEFAULT_IDX1, SNDRV_DEFAULT_STR1);
698 	if (ret < 0) {
699 		kfree(codec->reg_cache);
700 		return ret;
701 	}
702 
703 	/* power on device */
704 	wm8731_dapm_event(codec, SNDRV_CTL_POWER_D3hot);
705 
706 	/* set the update bits */
707 	reg = wm8731_read_reg_cache(codec, WM8731_LOUT1V);
708 	wm8731_write(codec, WM8731_LOUT1V, reg | 0x0100);
709 	reg = wm8731_read_reg_cache(codec, WM8731_ROUT1V);
710 	wm8731_write(codec, WM8731_ROUT1V, reg | 0x0100);
711 	reg = wm8731_read_reg_cache(codec, WM8731_LINVOL);
712 	wm8731_write(codec, WM8731_LINVOL, reg | 0x0100);
713 	reg = wm8731_read_reg_cache(codec, WM8731_RINVOL);
714 	wm8731_write(codec, WM8731_RINVOL, reg | 0x0100);
715 
716 	wm8731_add_controls(codec);
717 	wm8731_add_widgets(codec);
718 	ret = snd_soc_register_card(socdev);
719 	if (ret < 0) {
720 		snd_soc_free_pcms(socdev);
721 		snd_soc_dapm_free(socdev);
722 	}
723 
724 	return ret;
725 }
726 
727 static struct snd_soc_device *wm8731_socdev;
728 
729 #if defined (CONFIG_I2C) || defined (CONFIG_I2C_MODULE)
730 
731 /*
732  * WM8731 2 wire address is determined by GPIO5
733  * state during powerup.
734  *    low  = 0x1a
735  *    high = 0x1b
736  */
737 static unsigned short normal_i2c[] = { 0, I2C_CLIENT_END };
738 
739 /* Magic definition of all other variables and things */
740 I2C_CLIENT_INSMOD;
741 
742 static struct i2c_driver wm8731_i2c_driver;
743 static struct i2c_client client_template;
744 
745 /* If the i2c layer weren't so broken, we could pass this kind of data
746    around */
747 
748 static int wm8731_codec_probe(struct i2c_adapter *adap, int addr, int kind)
749 {
750 	struct snd_soc_device *socdev = wm8731_socdev;
751 	struct wm8731_setup_data *setup = socdev->codec_data;
752 	struct snd_soc_codec *codec = socdev->codec;
753 	struct i2c_client *i2c;
754 	int ret;
755 
756 	if (addr != setup->i2c_address)
757 		return -ENODEV;
758 
759 	client_template.adapter = adap;
760 	client_template.addr = addr;
761 
762 	i2c = kzalloc(sizeof(struct i2c_client), GFP_KERNEL);
763 	if (i2c == NULL) {
764 		kfree(codec);
765 		return -ENOMEM;
766 	}
767 	memcpy(i2c, &client_template, sizeof(struct i2c_client));
768 	i2c_set_clientdata(i2c, codec);
769 	codec->control_data = i2c;
770 
771 	ret = i2c_attach_client(i2c);
772 	if (ret < 0) {
773 		err("failed to attach codec at addr %x\n", addr);
774 		goto err;
775 	}
776 
777 	ret = wm8731_init(socdev);
778 	if (ret < 0) {
779 		err("failed to initialise WM8731\n");
780 		goto err;
781 	}
782 	return ret;
783 
784 err:
785 	kfree(codec);
786 	kfree(i2c);
787 	return ret;
788 }
789 
790 static int wm8731_i2c_detach(struct i2c_client *client)
791 {
792 	struct snd_soc_codec* codec = i2c_get_clientdata(client);
793 	i2c_detach_client(client);
794 	kfree(codec->reg_cache);
795 	kfree(client);
796 	return 0;
797 }
798 
799 static int wm8731_i2c_attach(struct i2c_adapter *adap)
800 {
801 	return i2c_probe(adap, &addr_data, wm8731_codec_probe);
802 }
803 
804 /* corgi i2c codec control layer */
805 static struct i2c_driver wm8731_i2c_driver = {
806 	.driver = {
807 		.name = "WM8731 I2C Codec",
808 		.owner = THIS_MODULE,
809 	},
810 	.id =             I2C_DRIVERID_WM8731,
811 	.attach_adapter = wm8731_i2c_attach,
812 	.detach_client =  wm8731_i2c_detach,
813 	.command =        NULL,
814 };
815 
816 static struct i2c_client client_template = {
817 	.name =   "WM8731",
818 	.driver = &wm8731_i2c_driver,
819 };
820 #endif
821 
822 static int wm8731_probe(struct platform_device *pdev)
823 {
824 	struct snd_soc_device *socdev = platform_get_drvdata(pdev);
825 	struct wm8731_setup_data *setup;
826 	struct snd_soc_codec *codec;
827 	int ret = 0;
828 
829 	info("WM8731 Audio Codec %s", WM8731_VERSION);
830 
831 	setup = socdev->codec_data;
832 	codec = kzalloc(sizeof(struct snd_soc_codec), GFP_KERNEL);
833 	if (codec == NULL)
834 		return -ENOMEM;
835 
836 	socdev->codec = codec;
837 	mutex_init(&codec->mutex);
838 	INIT_LIST_HEAD(&codec->dapm_widgets);
839 	INIT_LIST_HEAD(&codec->dapm_paths);
840 
841 	wm8731_socdev = socdev;
842 #if defined (CONFIG_I2C) || defined (CONFIG_I2C_MODULE)
843 	if (setup->i2c_address) {
844 		normal_i2c[0] = setup->i2c_address;
845 		codec->hw_write = (hw_write_t)i2c_master_send;
846 		ret = i2c_add_driver(&wm8731_i2c_driver);
847 		if (ret != 0)
848 			printk(KERN_ERR "can't add i2c driver");
849 	}
850 #else
851 	/* Add other interfaces here */
852 #endif
853 	return ret;
854 }
855 
856 /* power down chip */
857 static int wm8731_remove(struct platform_device *pdev)
858 {
859 	struct snd_soc_device *socdev = platform_get_drvdata(pdev);
860 	struct snd_soc_codec *codec = socdev->codec;
861 
862 	if (codec->control_data)
863 		wm8731_dapm_event(codec, SNDRV_CTL_POWER_D3cold);
864 
865 	snd_soc_free_pcms(socdev);
866 	snd_soc_dapm_free(socdev);
867 #if defined (CONFIG_I2C) || defined (CONFIG_I2C_MODULE)
868 	i2c_del_driver(&wm8731_i2c_driver);
869 #endif
870 	kfree(codec);
871 
872 	return 0;
873 }
874 
875 struct snd_soc_codec_device soc_codec_dev_wm8731 = {
876 	.probe = 	wm8731_probe,
877 	.remove = 	wm8731_remove,
878 	.suspend = 	wm8731_suspend,
879 	.resume =	wm8731_resume,
880 };
881 
882 EXPORT_SYMBOL_GPL(soc_codec_dev_wm8731);
883 
884 MODULE_DESCRIPTION("ASoC WM8731 driver");
885 MODULE_AUTHOR("Richard Purdie");
886 MODULE_LICENSE("GPL");
887