Linux Audio

Check our new training course

Loading...
v6.13.7
  1// SPDX-License-Identifier: GPL-2.0-only
  2/*
  3 * wm2000.c  --  WM2000 ALSA Soc Audio driver
  4 *
  5 * Copyright 2008-2011 Wolfson Microelectronics PLC.
  6 *
  7 * Author: Mark Brown <broonie@opensource.wolfsonmicro.com>
  8 *
 
 
 
 
  9 * The download image for the WM2000 will be requested as
 10 * 'wm2000_anc.bin' by default (overridable via platform data) at
 11 * runtime and is expected to be in flat binary format.  This is
 12 * generated by Wolfson configuration tools and includes
 13 * system-specific calibration information.  If supplied as a
 14 * sequence of ASCII-encoded hexidecimal bytes this can be converted
 15 * into a flat binary with a command such as this on the command line:
 16 *
 17 * perl -e 'while (<>) { s/[\r\n]+// ; printf("%c", hex($_)); }'
 18 *                 < file  > wm2000_anc.bin
 19 */
 20
 21#include <linux/module.h>
 22#include <linux/moduleparam.h>
 23#include <linux/kernel.h>
 24#include <linux/init.h>
 25#include <linux/firmware.h>
 26#include <linux/clk.h>
 27#include <linux/delay.h>
 28#include <linux/pm.h>
 29#include <linux/i2c.h>
 30#include <linux/regmap.h>
 31#include <linux/debugfs.h>
 32#include <linux/regulator/consumer.h>
 33#include <linux/slab.h>
 34#include <sound/core.h>
 35#include <sound/pcm.h>
 36#include <sound/pcm_params.h>
 37#include <sound/soc.h>
 38#include <sound/initval.h>
 39#include <sound/tlv.h>
 40
 41#include <sound/wm2000.h>
 42
 43#include "wm2000.h"
 44
 45#define WM2000_NUM_SUPPLIES 3
 46
 47static const char *wm2000_supplies[WM2000_NUM_SUPPLIES] = {
 48	"SPKVDD",
 49	"DBVDD",
 50	"DCVDD",
 51};
 52
 53enum wm2000_anc_mode {
 54	ANC_ACTIVE = 0,
 55	ANC_BYPASS = 1,
 56	ANC_STANDBY = 2,
 57	ANC_OFF = 3,
 58};
 59
 60struct wm2000_priv {
 61	struct i2c_client *i2c;
 62	struct regmap *regmap;
 63	struct clk *mclk;
 64
 65	struct regulator_bulk_data supplies[WM2000_NUM_SUPPLIES];
 66
 67	enum wm2000_anc_mode anc_mode;
 68
 69	unsigned int anc_active:1;
 70	unsigned int anc_eng_ena:1;
 71	unsigned int spk_ena:1;
 72
 
 73	unsigned int speech_clarity:1;
 74
 75	int anc_download_size;
 76	char *anc_download;
 77
 78	struct mutex lock;
 79};
 80
 81static int wm2000_write(struct i2c_client *i2c, unsigned int reg,
 82			unsigned int value)
 83{
 84	struct wm2000_priv *wm2000 = i2c_get_clientdata(i2c);
 85	return regmap_write(wm2000->regmap, reg, value);
 86}
 87
 
 
 
 
 
 
 
 
 
 
 
 
 
 88static void wm2000_reset(struct wm2000_priv *wm2000)
 89{
 90	struct i2c_client *i2c = wm2000->i2c;
 91
 92	wm2000_write(i2c, WM2000_REG_SYS_CTL2, WM2000_ANC_ENG_CLR);
 93	wm2000_write(i2c, WM2000_REG_SYS_CTL2, WM2000_RAM_CLR);
 94	wm2000_write(i2c, WM2000_REG_ID1, 0);
 95
 96	wm2000->anc_mode = ANC_OFF;
 97}
 98
 99static int wm2000_poll_bit(struct i2c_client *i2c,
100			   unsigned int reg, u8 mask)
101{
102	struct wm2000_priv *wm2000 = i2c_get_clientdata(i2c);
103	int timeout = 4000;
104	unsigned int val;
105
106	regmap_read(wm2000->regmap, reg, &val);
107
108	while (!(val & mask) && --timeout) {
109		msleep(1);
110		regmap_read(wm2000->regmap, reg, &val);
111	}
112
113	if (timeout == 0)
114		return 0;
115	else
116		return 1;
117}
118
119static int wm2000_power_up(struct i2c_client *i2c, int analogue)
120{
121	struct wm2000_priv *wm2000 = dev_get_drvdata(&i2c->dev);
122	unsigned long rate;
123	unsigned int val;
124	int ret;
125
126	if (WARN_ON(wm2000->anc_mode != ANC_OFF))
127		return -EINVAL;
128
129	dev_dbg(&i2c->dev, "Beginning power up\n");
130
131	ret = regulator_bulk_enable(WM2000_NUM_SUPPLIES, wm2000->supplies);
132	if (ret != 0) {
133		dev_err(&i2c->dev, "Failed to enable supplies: %d\n", ret);
134		return ret;
135	}
136
137	rate = clk_get_rate(wm2000->mclk);
138	if (rate <= 13500000) {
139		dev_dbg(&i2c->dev, "Disabling MCLK divider\n");
140		wm2000_write(i2c, WM2000_REG_SYS_CTL2,
141			     WM2000_MCLK_DIV2_ENA_CLR);
142	} else {
143		dev_dbg(&i2c->dev, "Enabling MCLK divider\n");
144		wm2000_write(i2c, WM2000_REG_SYS_CTL2,
145			     WM2000_MCLK_DIV2_ENA_SET);
146	}
147
148	wm2000_write(i2c, WM2000_REG_SYS_CTL2, WM2000_ANC_ENG_CLR);
149	wm2000_write(i2c, WM2000_REG_SYS_CTL2, WM2000_ANC_ENG_SET);
150
151	/* Wait for ANC engine to become ready */
152	if (!wm2000_poll_bit(i2c, WM2000_REG_ANC_STAT,
153			     WM2000_ANC_ENG_IDLE)) {
154		dev_err(&i2c->dev, "ANC engine failed to reset\n");
155		regulator_bulk_disable(WM2000_NUM_SUPPLIES, wm2000->supplies);
156		return -ETIMEDOUT;
157	}
158
159	if (!wm2000_poll_bit(i2c, WM2000_REG_SYS_STATUS,
160			     WM2000_STATUS_BOOT_COMPLETE)) {
161		dev_err(&i2c->dev, "ANC engine failed to initialise\n");
162		regulator_bulk_disable(WM2000_NUM_SUPPLIES, wm2000->supplies);
163		return -ETIMEDOUT;
164	}
165
166	wm2000_write(i2c, WM2000_REG_SYS_CTL2, WM2000_RAM_SET);
167
168	/* Open code download of the data since it is the only bulk
169	 * write we do. */
170	dev_dbg(&i2c->dev, "Downloading %d bytes\n",
171		wm2000->anc_download_size - 2);
172
173	ret = i2c_master_send(i2c, wm2000->anc_download,
174			      wm2000->anc_download_size);
175	if (ret < 0) {
176		dev_err(&i2c->dev, "i2c_transfer() failed: %d\n", ret);
177		regulator_bulk_disable(WM2000_NUM_SUPPLIES, wm2000->supplies);
178		return ret;
179	}
180	if (ret != wm2000->anc_download_size) {
181		dev_err(&i2c->dev, "i2c_transfer() failed, %d != %d\n",
182			ret, wm2000->anc_download_size);
183		regulator_bulk_disable(WM2000_NUM_SUPPLIES, wm2000->supplies);
184		return -EIO;
185	}
186
187	dev_dbg(&i2c->dev, "Download complete\n");
188
189	if (analogue) {
190		wm2000_write(i2c, WM2000_REG_ANA_VMID_PU_TIME, 248 / 4);
191
192		wm2000_write(i2c, WM2000_REG_SYS_MODE_CNTRL,
193			     WM2000_MODE_ANA_SEQ_INCLUDE |
194			     WM2000_MODE_MOUSE_ENABLE |
195			     WM2000_MODE_THERMAL_ENABLE);
196	} else {
197		wm2000_write(i2c, WM2000_REG_SYS_MODE_CNTRL,
198			     WM2000_MODE_MOUSE_ENABLE |
199			     WM2000_MODE_THERMAL_ENABLE);
200	}
201
202	ret = regmap_read(wm2000->regmap, WM2000_REG_SPEECH_CLARITY, &val);
203	if (ret != 0) {
204		dev_err(&i2c->dev, "Unable to read Speech Clarity: %d\n", ret);
205		regulator_bulk_disable(WM2000_NUM_SUPPLIES, wm2000->supplies);
206		return ret;
207	}
208	if (wm2000->speech_clarity)
209		val |= WM2000_SPEECH_CLARITY;
210	else
211		val &= ~WM2000_SPEECH_CLARITY;
212	wm2000_write(i2c, WM2000_REG_SPEECH_CLARITY, val);
213
214	wm2000_write(i2c, WM2000_REG_SYS_START0, 0x33);
215	wm2000_write(i2c, WM2000_REG_SYS_START1, 0x02);
216
217	wm2000_write(i2c, WM2000_REG_SYS_CTL2, WM2000_ANC_INT_N_CLR);
218
219	if (!wm2000_poll_bit(i2c, WM2000_REG_SYS_STATUS,
220			     WM2000_STATUS_MOUSE_ACTIVE)) {
221		dev_err(&i2c->dev, "Timed out waiting for device\n");
222		regulator_bulk_disable(WM2000_NUM_SUPPLIES, wm2000->supplies);
223		return -ETIMEDOUT;
224	}
225
226	dev_dbg(&i2c->dev, "ANC active\n");
227	if (analogue)
228		dev_dbg(&i2c->dev, "Analogue active\n");
229	wm2000->anc_mode = ANC_ACTIVE;
230
231	return 0;
232}
233
234static int wm2000_power_down(struct i2c_client *i2c, int analogue)
235{
236	struct wm2000_priv *wm2000 = dev_get_drvdata(&i2c->dev);
237
238	if (analogue) {
239		wm2000_write(i2c, WM2000_REG_ANA_VMID_PD_TIME, 248 / 4);
240		wm2000_write(i2c, WM2000_REG_SYS_MODE_CNTRL,
241			     WM2000_MODE_ANA_SEQ_INCLUDE |
242			     WM2000_MODE_POWER_DOWN);
243	} else {
244		wm2000_write(i2c, WM2000_REG_SYS_MODE_CNTRL,
245			     WM2000_MODE_POWER_DOWN);
246	}
247
248	if (!wm2000_poll_bit(i2c, WM2000_REG_SYS_STATUS,
249			     WM2000_STATUS_POWER_DOWN_COMPLETE)) {
250		dev_err(&i2c->dev, "Timeout waiting for ANC power down\n");
251		return -ETIMEDOUT;
252	}
253
254	if (!wm2000_poll_bit(i2c, WM2000_REG_ANC_STAT,
255			     WM2000_ANC_ENG_IDLE)) {
256		dev_err(&i2c->dev, "Timeout waiting for ANC engine idle\n");
257		return -ETIMEDOUT;
258	}
259
260	regulator_bulk_disable(WM2000_NUM_SUPPLIES, wm2000->supplies);
261
262	dev_dbg(&i2c->dev, "powered off\n");
263	wm2000->anc_mode = ANC_OFF;
264
265	return 0;
266}
267
268static int wm2000_enter_bypass(struct i2c_client *i2c, int analogue)
269{
270	struct wm2000_priv *wm2000 = dev_get_drvdata(&i2c->dev);
271
272	if (WARN_ON(wm2000->anc_mode != ANC_ACTIVE))
273		return -EINVAL;
274
275	if (analogue) {
276		wm2000_write(i2c, WM2000_REG_SYS_MODE_CNTRL,
277			     WM2000_MODE_ANA_SEQ_INCLUDE |
278			     WM2000_MODE_THERMAL_ENABLE |
279			     WM2000_MODE_BYPASS_ENTRY);
280	} else {
281		wm2000_write(i2c, WM2000_REG_SYS_MODE_CNTRL,
282			     WM2000_MODE_THERMAL_ENABLE |
283			     WM2000_MODE_BYPASS_ENTRY);
284	}
285
286	if (!wm2000_poll_bit(i2c, WM2000_REG_SYS_STATUS,
287			     WM2000_STATUS_ANC_DISABLED)) {
288		dev_err(&i2c->dev, "Timeout waiting for ANC disable\n");
289		return -ETIMEDOUT;
290	}
291
292	if (!wm2000_poll_bit(i2c, WM2000_REG_ANC_STAT,
293			     WM2000_ANC_ENG_IDLE)) {
294		dev_err(&i2c->dev, "Timeout waiting for ANC engine idle\n");
295		return -ETIMEDOUT;
296	}
297
298	wm2000_write(i2c, WM2000_REG_SYS_CTL1, WM2000_SYS_STBY);
299	wm2000_write(i2c, WM2000_REG_SYS_CTL2, WM2000_RAM_CLR);
300
301	wm2000->anc_mode = ANC_BYPASS;
302	dev_dbg(&i2c->dev, "bypass enabled\n");
303
304	return 0;
305}
306
307static int wm2000_exit_bypass(struct i2c_client *i2c, int analogue)
308{
309	struct wm2000_priv *wm2000 = dev_get_drvdata(&i2c->dev);
310
311	if (WARN_ON(wm2000->anc_mode != ANC_BYPASS))
312		return -EINVAL;
313	
314	wm2000_write(i2c, WM2000_REG_SYS_CTL1, 0);
315
316	if (analogue) {
317		wm2000_write(i2c, WM2000_REG_SYS_MODE_CNTRL,
318			     WM2000_MODE_ANA_SEQ_INCLUDE |
319			     WM2000_MODE_MOUSE_ENABLE |
320			     WM2000_MODE_THERMAL_ENABLE);
321	} else {
322		wm2000_write(i2c, WM2000_REG_SYS_MODE_CNTRL,
323			     WM2000_MODE_MOUSE_ENABLE |
324			     WM2000_MODE_THERMAL_ENABLE);
325	}
326
327	wm2000_write(i2c, WM2000_REG_SYS_CTL2, WM2000_RAM_SET);
328	wm2000_write(i2c, WM2000_REG_SYS_CTL2, WM2000_ANC_INT_N_CLR);
329
330	if (!wm2000_poll_bit(i2c, WM2000_REG_SYS_STATUS,
331			     WM2000_STATUS_MOUSE_ACTIVE)) {
332		dev_err(&i2c->dev, "Timed out waiting for MOUSE\n");
333		return -ETIMEDOUT;
334	}
335
336	wm2000->anc_mode = ANC_ACTIVE;
337	dev_dbg(&i2c->dev, "MOUSE active\n");
338
339	return 0;
340}
341
342static int wm2000_enter_standby(struct i2c_client *i2c, int analogue)
343{
344	struct wm2000_priv *wm2000 = dev_get_drvdata(&i2c->dev);
345
346	if (WARN_ON(wm2000->anc_mode != ANC_ACTIVE))
347		return -EINVAL;
348
349	if (analogue) {
350		wm2000_write(i2c, WM2000_REG_ANA_VMID_PD_TIME, 248 / 4);
351
352		wm2000_write(i2c, WM2000_REG_SYS_MODE_CNTRL,
353			     WM2000_MODE_ANA_SEQ_INCLUDE |
354			     WM2000_MODE_THERMAL_ENABLE |
355			     WM2000_MODE_STANDBY_ENTRY);
356	} else {
357		wm2000_write(i2c, WM2000_REG_SYS_MODE_CNTRL,
358			     WM2000_MODE_THERMAL_ENABLE |
359			     WM2000_MODE_STANDBY_ENTRY);
360	}
361
362	if (!wm2000_poll_bit(i2c, WM2000_REG_SYS_STATUS,
363			     WM2000_STATUS_ANC_DISABLED)) {
364		dev_err(&i2c->dev,
365			"Timed out waiting for ANC disable after 1ms\n");
366		return -ETIMEDOUT;
367	}
368
369	if (!wm2000_poll_bit(i2c, WM2000_REG_ANC_STAT, WM2000_ANC_ENG_IDLE)) {
370		dev_err(&i2c->dev,
371			"Timed out waiting for standby\n");
372		return -ETIMEDOUT;
373	}
374
375	wm2000_write(i2c, WM2000_REG_SYS_CTL1, WM2000_SYS_STBY);
376	wm2000_write(i2c, WM2000_REG_SYS_CTL2, WM2000_RAM_CLR);
377
378	wm2000->anc_mode = ANC_STANDBY;
379	dev_dbg(&i2c->dev, "standby\n");
380	if (analogue)
381		dev_dbg(&i2c->dev, "Analogue disabled\n");
382
383	return 0;
384}
385
386static int wm2000_exit_standby(struct i2c_client *i2c, int analogue)
387{
388	struct wm2000_priv *wm2000 = dev_get_drvdata(&i2c->dev);
389
390	if (WARN_ON(wm2000->anc_mode != ANC_STANDBY))
391		return -EINVAL;
392
393	wm2000_write(i2c, WM2000_REG_SYS_CTL1, 0);
394
395	if (analogue) {
396		wm2000_write(i2c, WM2000_REG_ANA_VMID_PU_TIME, 248 / 4);
397
398		wm2000_write(i2c, WM2000_REG_SYS_MODE_CNTRL,
399			     WM2000_MODE_ANA_SEQ_INCLUDE |
400			     WM2000_MODE_THERMAL_ENABLE |
401			     WM2000_MODE_MOUSE_ENABLE);
402	} else {
403		wm2000_write(i2c, WM2000_REG_SYS_MODE_CNTRL,
404			     WM2000_MODE_THERMAL_ENABLE |
405			     WM2000_MODE_MOUSE_ENABLE);
406	}
407
408	wm2000_write(i2c, WM2000_REG_SYS_CTL2, WM2000_RAM_SET);
409	wm2000_write(i2c, WM2000_REG_SYS_CTL2, WM2000_ANC_INT_N_CLR);
410
411	if (!wm2000_poll_bit(i2c, WM2000_REG_SYS_STATUS,
412			     WM2000_STATUS_MOUSE_ACTIVE)) {
413		dev_err(&i2c->dev, "Timed out waiting for MOUSE\n");
414		return -ETIMEDOUT;
415	}
416
417	wm2000->anc_mode = ANC_ACTIVE;
418	dev_dbg(&i2c->dev, "MOUSE active\n");
419	if (analogue)
420		dev_dbg(&i2c->dev, "Analogue enabled\n");
421
422	return 0;
423}
424
425typedef int (*wm2000_mode_fn)(struct i2c_client *i2c, int analogue);
426
427static struct {
428	enum wm2000_anc_mode source;
429	enum wm2000_anc_mode dest;
430	int analogue;
431	wm2000_mode_fn step[2];
432} anc_transitions[] = {
433	{
434		.source = ANC_OFF,
435		.dest = ANC_ACTIVE,
436		.analogue = 1,
437		.step = {
438			wm2000_power_up,
439		},
440	},
441	{
442		.source = ANC_OFF,
443		.dest = ANC_STANDBY,
444		.step = {
445			wm2000_power_up,
446			wm2000_enter_standby,
447		},
448	},
449	{
450		.source = ANC_OFF,
451		.dest = ANC_BYPASS,
452		.analogue = 1,
453		.step = {
454			wm2000_power_up,
455			wm2000_enter_bypass,
456		},
457	},
458	{
459		.source = ANC_ACTIVE,
460		.dest = ANC_BYPASS,
461		.analogue = 1,
462		.step = {
463			wm2000_enter_bypass,
464		},
465	},
466	{
467		.source = ANC_ACTIVE,
468		.dest = ANC_STANDBY,
469		.analogue = 1,
470		.step = {
471			wm2000_enter_standby,
472		},
473	},
474	{
475		.source = ANC_ACTIVE,
476		.dest = ANC_OFF,
477		.analogue = 1,
478		.step = {
479			wm2000_power_down,
480		},
481	},
482	{
483		.source = ANC_BYPASS,
484		.dest = ANC_ACTIVE,
485		.analogue = 1,
486		.step = {
487			wm2000_exit_bypass,
488		},
489	},
490	{
491		.source = ANC_BYPASS,
492		.dest = ANC_STANDBY,
493		.analogue = 1,
494		.step = {
495			wm2000_exit_bypass,
496			wm2000_enter_standby,
497		},
498	},
499	{
500		.source = ANC_BYPASS,
501		.dest = ANC_OFF,
502		.step = {
503			wm2000_exit_bypass,
504			wm2000_power_down,
505		},
506	},
507	{
508		.source = ANC_STANDBY,
509		.dest = ANC_ACTIVE,
510		.analogue = 1,
511		.step = {
512			wm2000_exit_standby,
513		},
514	},
515	{
516		.source = ANC_STANDBY,
517		.dest = ANC_BYPASS,
518		.analogue = 1,
519		.step = {
520			wm2000_exit_standby,
521			wm2000_enter_bypass,
522		},
523	},
524	{
525		.source = ANC_STANDBY,
526		.dest = ANC_OFF,
527		.step = {
528			wm2000_exit_standby,
529			wm2000_power_down,
530		},
531	},
532};
533
534static int wm2000_anc_transition(struct wm2000_priv *wm2000,
535				 enum wm2000_anc_mode mode)
536{
537	struct i2c_client *i2c = wm2000->i2c;
538	int i, j;
539	int ret = 0;
540
541	if (wm2000->anc_mode == mode)
542		return 0;
543
544	for (i = 0; i < ARRAY_SIZE(anc_transitions); i++)
545		if (anc_transitions[i].source == wm2000->anc_mode &&
546		    anc_transitions[i].dest == mode)
547			break;
548	if (i == ARRAY_SIZE(anc_transitions)) {
549		dev_err(&i2c->dev, "No transition for %d->%d\n",
550			wm2000->anc_mode, mode);
551		return -EINVAL;
552	}
553
554	/* Maintain clock while active */
555	if (anc_transitions[i].source == ANC_OFF) {
556		ret = clk_prepare_enable(wm2000->mclk);
557		if (ret != 0) {
558			dev_err(&i2c->dev, "Failed to enable MCLK: %d\n", ret);
559			return ret;
560		}
561	}
562
563	for (j = 0; j < ARRAY_SIZE(anc_transitions[j].step); j++) {
564		if (!anc_transitions[i].step[j])
565			break;
566		ret = anc_transitions[i].step[j](i2c,
567						 anc_transitions[i].analogue);
568		if (ret != 0)
569			break;
570	}
571
572	if (anc_transitions[i].dest == ANC_OFF)
573		clk_disable_unprepare(wm2000->mclk);
574
575	return ret;
576}
577
578static int wm2000_anc_set_mode(struct wm2000_priv *wm2000)
579{
580	struct i2c_client *i2c = wm2000->i2c;
581	enum wm2000_anc_mode mode;
582
583	if (wm2000->anc_eng_ena && wm2000->spk_ena)
584		if (wm2000->anc_active)
585			mode = ANC_ACTIVE;
586		else
587			mode = ANC_BYPASS;
588	else
589		mode = ANC_STANDBY;
590
591	dev_dbg(&i2c->dev, "Set mode %d (enabled %d, mute %d, active %d)\n",
592		mode, wm2000->anc_eng_ena, !wm2000->spk_ena,
593		wm2000->anc_active);
594
595	return wm2000_anc_transition(wm2000, mode);
596}
597
598static int wm2000_anc_mode_get(struct snd_kcontrol *kcontrol,
599			       struct snd_ctl_elem_value *ucontrol)
600{
601	struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol);
602	struct wm2000_priv *wm2000 = dev_get_drvdata(component->dev);
603
604	ucontrol->value.integer.value[0] = wm2000->anc_active;
605
606	return 0;
607}
608
609static int wm2000_anc_mode_put(struct snd_kcontrol *kcontrol,
610			       struct snd_ctl_elem_value *ucontrol)
611{
612	struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol);
613	struct wm2000_priv *wm2000 = dev_get_drvdata(component->dev);
614	unsigned int anc_active = ucontrol->value.integer.value[0];
615	int ret;
616
617	if (anc_active > 1)
618		return -EINVAL;
619
620	mutex_lock(&wm2000->lock);
621
622	wm2000->anc_active = anc_active;
623
624	ret = wm2000_anc_set_mode(wm2000);
625
626	mutex_unlock(&wm2000->lock);
627
628	return ret;
629}
630
631static int wm2000_speaker_get(struct snd_kcontrol *kcontrol,
632			      struct snd_ctl_elem_value *ucontrol)
633{
634	struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol);
635	struct wm2000_priv *wm2000 = dev_get_drvdata(component->dev);
636
637	ucontrol->value.integer.value[0] = wm2000->spk_ena;
638
639	return 0;
640}
641
642static int wm2000_speaker_put(struct snd_kcontrol *kcontrol,
643			      struct snd_ctl_elem_value *ucontrol)
644{
645	struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol);
646	struct wm2000_priv *wm2000 = dev_get_drvdata(component->dev);
647	unsigned int val = ucontrol->value.integer.value[0];
648	int ret;
649
650	if (val > 1)
651		return -EINVAL;
652
653	mutex_lock(&wm2000->lock);
654
655	wm2000->spk_ena = val;
656
657	ret = wm2000_anc_set_mode(wm2000);
658
659	mutex_unlock(&wm2000->lock);
660
661	return ret;
662}
663
664static const struct snd_kcontrol_new wm2000_controls[] = {
665	SOC_SINGLE("ANC Volume", WM2000_REG_ANC_GAIN_CTRL, 0, 255, 0),
666	SOC_SINGLE_BOOL_EXT("WM2000 ANC Switch", 0,
667			    wm2000_anc_mode_get,
668			    wm2000_anc_mode_put),
669	SOC_SINGLE_BOOL_EXT("WM2000 Switch", 0,
670			    wm2000_speaker_get,
671			    wm2000_speaker_put),
672};
673
674static int wm2000_anc_power_event(struct snd_soc_dapm_widget *w,
675				  struct snd_kcontrol *kcontrol, int event)
676{
677	struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm);
678	struct wm2000_priv *wm2000 = dev_get_drvdata(component->dev);
679	int ret;
680
681	mutex_lock(&wm2000->lock);
682
683	if (SND_SOC_DAPM_EVENT_ON(event))
684		wm2000->anc_eng_ena = 1;
685
686	if (SND_SOC_DAPM_EVENT_OFF(event))
687		wm2000->anc_eng_ena = 0;
688
689	ret = wm2000_anc_set_mode(wm2000);
690
691	mutex_unlock(&wm2000->lock);
692
693	return ret;
694}
695
696static const struct snd_soc_dapm_widget wm2000_dapm_widgets[] = {
697/* Externally visible pins */
698SND_SOC_DAPM_OUTPUT("SPKN"),
699SND_SOC_DAPM_OUTPUT("SPKP"),
700
701SND_SOC_DAPM_INPUT("LINN"),
702SND_SOC_DAPM_INPUT("LINP"),
703
704SND_SOC_DAPM_PGA_E("ANC Engine", SND_SOC_NOPM, 0, 0, NULL, 0,
705		   wm2000_anc_power_event,
706		   SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_PRE_PMD),
707};
708
709/* Target, Path, Source */
710static const struct snd_soc_dapm_route wm2000_audio_map[] = {
711	{ "SPKN", NULL, "ANC Engine" },
712	{ "SPKP", NULL, "ANC Engine" },
713	{ "ANC Engine", NULL, "LINN" },
714	{ "ANC Engine", NULL, "LINP" },
715};
716
717#ifdef CONFIG_PM
718static int wm2000_suspend(struct snd_soc_component *component)
719{
720	struct wm2000_priv *wm2000 = dev_get_drvdata(component->dev);
721
722	return wm2000_anc_transition(wm2000, ANC_OFF);
723}
724
725static int wm2000_resume(struct snd_soc_component *component)
726{
727	struct wm2000_priv *wm2000 = dev_get_drvdata(component->dev);
728
729	return wm2000_anc_set_mode(wm2000);
730}
731#else
732#define wm2000_suspend NULL
733#define wm2000_resume NULL
734#endif
735
736static bool wm2000_readable_reg(struct device *dev, unsigned int reg)
737{
738	switch (reg) {
739	case WM2000_REG_SYS_START:
740	case WM2000_REG_ANC_GAIN_CTRL:
741	case WM2000_REG_MSE_TH1:
742	case WM2000_REG_MSE_TH2:
743	case WM2000_REG_SPEECH_CLARITY:
744	case WM2000_REG_SYS_WATCHDOG:
745	case WM2000_REG_ANA_VMID_PD_TIME:
746	case WM2000_REG_ANA_VMID_PU_TIME:
747	case WM2000_REG_CAT_FLTR_INDX:
748	case WM2000_REG_CAT_GAIN_0:
749	case WM2000_REG_SYS_STATUS:
750	case WM2000_REG_SYS_MODE_CNTRL:
751	case WM2000_REG_SYS_START0:
752	case WM2000_REG_SYS_START1:
753	case WM2000_REG_ID1:
754	case WM2000_REG_ID2:
755	case WM2000_REG_REVISON:
756	case WM2000_REG_SYS_CTL1:
757	case WM2000_REG_SYS_CTL2:
758	case WM2000_REG_ANC_STAT:
759	case WM2000_REG_IF_CTL:
760	case WM2000_REG_ANA_MIC_CTL:
761	case WM2000_REG_SPK_CTL:
762		return true;
763	default:
764		return false;
765	}
766}
767
768static const struct regmap_config wm2000_regmap = {
769	.reg_bits = 16,
770	.val_bits = 8,
771
772	.max_register = WM2000_REG_SPK_CTL,
773	.readable_reg = wm2000_readable_reg,
774};
775
776static int wm2000_probe(struct snd_soc_component *component)
777{
778	struct wm2000_priv *wm2000 = dev_get_drvdata(component->dev);
779
780	/* This will trigger a transition to standby mode by default */
781	wm2000_anc_set_mode(wm2000);
782
783	return 0;
784}
785
786static void wm2000_remove(struct snd_soc_component *component)
787{
788	struct wm2000_priv *wm2000 = dev_get_drvdata(component->dev);
789
790	wm2000_anc_transition(wm2000, ANC_OFF);
791}
792
793static const struct snd_soc_component_driver soc_component_dev_wm2000 = {
794	.probe			= wm2000_probe,
795	.remove			= wm2000_remove,
796	.suspend		= wm2000_suspend,
797	.resume			= wm2000_resume,
798	.controls		= wm2000_controls,
799	.num_controls		= ARRAY_SIZE(wm2000_controls),
800	.dapm_widgets		= wm2000_dapm_widgets,
801	.num_dapm_widgets	= ARRAY_SIZE(wm2000_dapm_widgets),
802	.dapm_routes		= wm2000_audio_map,
803	.num_dapm_routes	= ARRAY_SIZE(wm2000_audio_map),
804	.idle_bias_on		= 1,
805	.use_pmdown_time	= 1,
806};
807
808static int wm2000_i2c_probe(struct i2c_client *i2c)
 
809{
810	struct wm2000_priv *wm2000;
811	struct wm2000_platform_data *pdata;
812	const char *filename;
813	const struct firmware *fw = NULL;
814	int ret, i;
815	unsigned int reg;
816	u16 id;
817
818	wm2000 = devm_kzalloc(&i2c->dev, sizeof(*wm2000), GFP_KERNEL);
819	if (!wm2000)
 
 
820		return -ENOMEM;
821
822	mutex_init(&wm2000->lock);
823
824	dev_set_drvdata(&i2c->dev, wm2000);
825
826	wm2000->regmap = devm_regmap_init_i2c(i2c, &wm2000_regmap);
827	if (IS_ERR(wm2000->regmap)) {
828		ret = PTR_ERR(wm2000->regmap);
829		dev_err(&i2c->dev, "Failed to allocate register map: %d\n",
830			ret);
831		goto out;
832	}
833
834	for (i = 0; i < WM2000_NUM_SUPPLIES; i++)
835		wm2000->supplies[i].supply = wm2000_supplies[i];
836
837	ret = devm_regulator_bulk_get(&i2c->dev, WM2000_NUM_SUPPLIES,
838				      wm2000->supplies);
839	if (ret != 0) {
840		dev_err(&i2c->dev, "Failed to get supplies: %d\n", ret);
841		return ret;
842	}
843
844	ret = regulator_bulk_enable(WM2000_NUM_SUPPLIES, wm2000->supplies);
845	if (ret != 0) {
846		dev_err(&i2c->dev, "Failed to enable supplies: %d\n", ret);
847		return ret;
848	}
849
850	/* Verify that this is a WM2000 */
851	ret = regmap_read(wm2000->regmap, WM2000_REG_ID1, &reg);
852	if (ret != 0) {
853		dev_err(&i2c->dev, "Unable to read ID1: %d\n", ret);
854		return ret;
855	}
856	id = reg << 8;
857	ret = regmap_read(wm2000->regmap, WM2000_REG_ID2, &reg);
858	if (ret != 0) {
859		dev_err(&i2c->dev, "Unable to read ID2: %d\n", ret);
860		return ret;
861	}
862	id |= reg & 0xff;
863
864	if (id != 0x2000) {
865		dev_err(&i2c->dev, "Device is not a WM2000 - ID %x\n", id);
866		ret = -ENODEV;
867		goto err_supplies;
868	}
869
870	ret = regmap_read(wm2000->regmap, WM2000_REG_REVISON, &reg);
871	if (ret != 0) {
872		dev_err(&i2c->dev, "Unable to read Revision: %d\n", ret);
873		return ret;
874	}
875	dev_info(&i2c->dev, "revision %c\n", reg + 'A');
876
877	wm2000->mclk = devm_clk_get(&i2c->dev, "MCLK");
878	if (IS_ERR(wm2000->mclk)) {
879		ret = PTR_ERR(wm2000->mclk);
880		dev_err(&i2c->dev, "Failed to get MCLK: %d\n", ret);
881		goto err_supplies;
882	}
883
884	filename = "wm2000_anc.bin";
885	pdata = dev_get_platdata(&i2c->dev);
886	if (pdata) {
 
887		wm2000->speech_clarity = !pdata->speech_enh_disable;
888
889		if (pdata->download_file)
890			filename = pdata->download_file;
891	}
892
893	ret = request_firmware(&fw, filename, &i2c->dev);
894	if (ret != 0) {
895		dev_err(&i2c->dev, "Failed to acquire ANC data: %d\n", ret);
896		goto err_supplies;
897	}
898
899	/* Pre-cook the concatenation of the register address onto the image */
900	wm2000->anc_download_size = fw->size + 2;
901	wm2000->anc_download = devm_kzalloc(&i2c->dev,
902					    wm2000->anc_download_size,
903					    GFP_KERNEL);
904	if (wm2000->anc_download == NULL) {
 
905		ret = -ENOMEM;
906		goto err_supplies;
907	}
908
909	wm2000->anc_download[0] = 0x80;
910	wm2000->anc_download[1] = 0x00;
911	memcpy(wm2000->anc_download + 2, fw->data, fw->size);
912
913	wm2000->anc_eng_ena = 1;
914	wm2000->anc_active = 1;
915	wm2000->spk_ena = 1;
916	wm2000->i2c = i2c;
917
918	wm2000_reset(wm2000);
919
920	ret = devm_snd_soc_register_component(&i2c->dev,
921					&soc_component_dev_wm2000, NULL, 0);
922
923err_supplies:
924	regulator_bulk_disable(WM2000_NUM_SUPPLIES, wm2000->supplies);
925
 
 
926out:
927	release_firmware(fw);
928	return ret;
929}
930
 
 
 
 
 
 
 
 
 
 
931static const struct i2c_device_id wm2000_i2c_id[] = {
932	{ "wm2000" },
933	{ }
934};
935MODULE_DEVICE_TABLE(i2c, wm2000_i2c_id);
936
937static struct i2c_driver wm2000_i2c_driver = {
938	.driver = {
939		.name = "wm2000",
 
940	},
941	.probe = wm2000_i2c_probe,
 
942	.id_table = wm2000_i2c_id,
943};
944
945module_i2c_driver(wm2000_i2c_driver);
 
 
 
 
 
 
 
 
 
 
946
947MODULE_DESCRIPTION("ASoC WM2000 driver");
948MODULE_AUTHOR("Mark Brown <broonie@opensource.wolfonmicro.com>");
949MODULE_LICENSE("GPL");
v3.5.6
 
  1/*
  2 * wm2000.c  --  WM2000 ALSA Soc Audio driver
  3 *
  4 * Copyright 2008-2010 Wolfson Microelectronics PLC.
  5 *
  6 * Author: Mark Brown <broonie@opensource.wolfsonmicro.com>
  7 *
  8 * This program is free software; you can redistribute it and/or modify
  9 * it under the terms of the GNU General Public License version 2 as
 10 * published by the Free Software Foundation.
 11 *
 12 * The download image for the WM2000 will be requested as
 13 * 'wm2000_anc.bin' by default (overridable via platform data) at
 14 * runtime and is expected to be in flat binary format.  This is
 15 * generated by Wolfson configuration tools and includes
 16 * system-specific callibration information.  If supplied as a
 17 * sequence of ASCII-encoded hexidecimal bytes this can be converted
 18 * into a flat binary with a command such as this on the command line:
 19 *
 20 * perl -e 'while (<>) { s/[\r\n]+// ; printf("%c", hex($_)); }'
 21 *                 < file  > wm2000_anc.bin
 22 */
 23
 24#include <linux/module.h>
 25#include <linux/moduleparam.h>
 26#include <linux/kernel.h>
 27#include <linux/init.h>
 28#include <linux/firmware.h>
 
 29#include <linux/delay.h>
 30#include <linux/pm.h>
 31#include <linux/i2c.h>
 32#include <linux/regmap.h>
 33#include <linux/debugfs.h>
 
 34#include <linux/slab.h>
 35#include <sound/core.h>
 36#include <sound/pcm.h>
 37#include <sound/pcm_params.h>
 38#include <sound/soc.h>
 39#include <sound/initval.h>
 40#include <sound/tlv.h>
 41
 42#include <sound/wm2000.h>
 43
 44#include "wm2000.h"
 45
 
 
 
 
 
 
 
 
 46enum wm2000_anc_mode {
 47	ANC_ACTIVE = 0,
 48	ANC_BYPASS = 1,
 49	ANC_STANDBY = 2,
 50	ANC_OFF = 3,
 51};
 52
 53struct wm2000_priv {
 54	struct i2c_client *i2c;
 55	struct regmap *regmap;
 
 
 
 56
 57	enum wm2000_anc_mode anc_mode;
 58
 59	unsigned int anc_active:1;
 60	unsigned int anc_eng_ena:1;
 61	unsigned int spk_ena:1;
 62
 63	unsigned int mclk_div:1;
 64	unsigned int speech_clarity:1;
 65
 66	int anc_download_size;
 67	char *anc_download;
 
 
 68};
 69
 70static int wm2000_write(struct i2c_client *i2c, unsigned int reg,
 71			unsigned int value)
 72{
 73	struct wm2000_priv *wm2000 = i2c_get_clientdata(i2c);
 74	return regmap_write(wm2000->regmap, reg, value);
 75}
 76
 77static unsigned int wm2000_read(struct i2c_client *i2c, unsigned int r)
 78{
 79	struct wm2000_priv *wm2000 = i2c_get_clientdata(i2c);
 80	unsigned int val;
 81	int ret;
 82
 83	ret = regmap_read(wm2000->regmap, r, &val);
 84	if (ret < 0)
 85		return -1;
 86
 87	return val;
 88}
 89
 90static void wm2000_reset(struct wm2000_priv *wm2000)
 91{
 92	struct i2c_client *i2c = wm2000->i2c;
 93
 94	wm2000_write(i2c, WM2000_REG_SYS_CTL2, WM2000_ANC_ENG_CLR);
 95	wm2000_write(i2c, WM2000_REG_SYS_CTL2, WM2000_RAM_CLR);
 96	wm2000_write(i2c, WM2000_REG_ID1, 0);
 97
 98	wm2000->anc_mode = ANC_OFF;
 99}
100
101static int wm2000_poll_bit(struct i2c_client *i2c,
102			   unsigned int reg, u8 mask)
103{
 
104	int timeout = 4000;
105	int val;
106
107	val = wm2000_read(i2c, reg);
108
109	while (!(val & mask) && --timeout) {
110		msleep(1);
111		val = wm2000_read(i2c, reg);
112	}
113
114	if (timeout == 0)
115		return 0;
116	else
117		return 1;
118}
119
120static int wm2000_power_up(struct i2c_client *i2c, int analogue)
121{
122	struct wm2000_priv *wm2000 = dev_get_drvdata(&i2c->dev);
 
 
123	int ret;
124
125	BUG_ON(wm2000->anc_mode != ANC_OFF);
 
126
127	dev_dbg(&i2c->dev, "Beginning power up\n");
128
129	if (!wm2000->mclk_div) {
 
 
 
 
 
 
 
130		dev_dbg(&i2c->dev, "Disabling MCLK divider\n");
131		wm2000_write(i2c, WM2000_REG_SYS_CTL2,
132			     WM2000_MCLK_DIV2_ENA_CLR);
133	} else {
134		dev_dbg(&i2c->dev, "Enabling MCLK divider\n");
135		wm2000_write(i2c, WM2000_REG_SYS_CTL2,
136			     WM2000_MCLK_DIV2_ENA_SET);
137	}
138
139	wm2000_write(i2c, WM2000_REG_SYS_CTL2, WM2000_ANC_ENG_CLR);
140	wm2000_write(i2c, WM2000_REG_SYS_CTL2, WM2000_ANC_ENG_SET);
141
142	/* Wait for ANC engine to become ready */
143	if (!wm2000_poll_bit(i2c, WM2000_REG_ANC_STAT,
144			     WM2000_ANC_ENG_IDLE)) {
145		dev_err(&i2c->dev, "ANC engine failed to reset\n");
 
146		return -ETIMEDOUT;
147	}
148
149	if (!wm2000_poll_bit(i2c, WM2000_REG_SYS_STATUS,
150			     WM2000_STATUS_BOOT_COMPLETE)) {
151		dev_err(&i2c->dev, "ANC engine failed to initialise\n");
 
152		return -ETIMEDOUT;
153	}
154
155	wm2000_write(i2c, WM2000_REG_SYS_CTL2, WM2000_RAM_SET);
156
157	/* Open code download of the data since it is the only bulk
158	 * write we do. */
159	dev_dbg(&i2c->dev, "Downloading %d bytes\n",
160		wm2000->anc_download_size - 2);
161
162	ret = i2c_master_send(i2c, wm2000->anc_download,
163			      wm2000->anc_download_size);
164	if (ret < 0) {
165		dev_err(&i2c->dev, "i2c_transfer() failed: %d\n", ret);
 
166		return ret;
167	}
168	if (ret != wm2000->anc_download_size) {
169		dev_err(&i2c->dev, "i2c_transfer() failed, %d != %d\n",
170			ret, wm2000->anc_download_size);
 
171		return -EIO;
172	}
173
174	dev_dbg(&i2c->dev, "Download complete\n");
175
176	if (analogue) {
177		wm2000_write(i2c, WM2000_REG_ANA_VMID_PU_TIME, 248 / 4);
178
179		wm2000_write(i2c, WM2000_REG_SYS_MODE_CNTRL,
180			     WM2000_MODE_ANA_SEQ_INCLUDE |
181			     WM2000_MODE_MOUSE_ENABLE |
182			     WM2000_MODE_THERMAL_ENABLE);
183	} else {
184		wm2000_write(i2c, WM2000_REG_SYS_MODE_CNTRL,
185			     WM2000_MODE_MOUSE_ENABLE |
186			     WM2000_MODE_THERMAL_ENABLE);
187	}
188
189	ret = wm2000_read(i2c, WM2000_REG_SPEECH_CLARITY);
 
 
 
 
 
190	if (wm2000->speech_clarity)
191		ret &= ~WM2000_SPEECH_CLARITY;
192	else
193		ret |= WM2000_SPEECH_CLARITY;
194	wm2000_write(i2c, WM2000_REG_SPEECH_CLARITY, ret);
195
196	wm2000_write(i2c, WM2000_REG_SYS_START0, 0x33);
197	wm2000_write(i2c, WM2000_REG_SYS_START1, 0x02);
198
199	wm2000_write(i2c, WM2000_REG_SYS_CTL2, WM2000_ANC_INT_N_CLR);
200
201	if (!wm2000_poll_bit(i2c, WM2000_REG_SYS_STATUS,
202			     WM2000_STATUS_MOUSE_ACTIVE)) {
203		dev_err(&i2c->dev, "Timed out waiting for device\n");
 
204		return -ETIMEDOUT;
205	}
206
207	dev_dbg(&i2c->dev, "ANC active\n");
208	if (analogue)
209		dev_dbg(&i2c->dev, "Analogue active\n");
210	wm2000->anc_mode = ANC_ACTIVE;
211
212	return 0;
213}
214
215static int wm2000_power_down(struct i2c_client *i2c, int analogue)
216{
217	struct wm2000_priv *wm2000 = dev_get_drvdata(&i2c->dev);
218
219	if (analogue) {
220		wm2000_write(i2c, WM2000_REG_ANA_VMID_PD_TIME, 248 / 4);
221		wm2000_write(i2c, WM2000_REG_SYS_MODE_CNTRL,
222			     WM2000_MODE_ANA_SEQ_INCLUDE |
223			     WM2000_MODE_POWER_DOWN);
224	} else {
225		wm2000_write(i2c, WM2000_REG_SYS_MODE_CNTRL,
226			     WM2000_MODE_POWER_DOWN);
227	}
228
229	if (!wm2000_poll_bit(i2c, WM2000_REG_SYS_STATUS,
230			     WM2000_STATUS_POWER_DOWN_COMPLETE)) {
231		dev_err(&i2c->dev, "Timeout waiting for ANC power down\n");
232		return -ETIMEDOUT;
233	}
234
235	if (!wm2000_poll_bit(i2c, WM2000_REG_ANC_STAT,
236			     WM2000_ANC_ENG_IDLE)) {
237		dev_err(&i2c->dev, "Timeout waiting for ANC engine idle\n");
238		return -ETIMEDOUT;
239	}
240
 
 
241	dev_dbg(&i2c->dev, "powered off\n");
242	wm2000->anc_mode = ANC_OFF;
243
244	return 0;
245}
246
247static int wm2000_enter_bypass(struct i2c_client *i2c, int analogue)
248{
249	struct wm2000_priv *wm2000 = dev_get_drvdata(&i2c->dev);
250
251	BUG_ON(wm2000->anc_mode != ANC_ACTIVE);
 
252
253	if (analogue) {
254		wm2000_write(i2c, WM2000_REG_SYS_MODE_CNTRL,
255			     WM2000_MODE_ANA_SEQ_INCLUDE |
256			     WM2000_MODE_THERMAL_ENABLE |
257			     WM2000_MODE_BYPASS_ENTRY);
258	} else {
259		wm2000_write(i2c, WM2000_REG_SYS_MODE_CNTRL,
260			     WM2000_MODE_THERMAL_ENABLE |
261			     WM2000_MODE_BYPASS_ENTRY);
262	}
263
264	if (!wm2000_poll_bit(i2c, WM2000_REG_SYS_STATUS,
265			     WM2000_STATUS_ANC_DISABLED)) {
266		dev_err(&i2c->dev, "Timeout waiting for ANC disable\n");
267		return -ETIMEDOUT;
268	}
269
270	if (!wm2000_poll_bit(i2c, WM2000_REG_ANC_STAT,
271			     WM2000_ANC_ENG_IDLE)) {
272		dev_err(&i2c->dev, "Timeout waiting for ANC engine idle\n");
273		return -ETIMEDOUT;
274	}
275
276	wm2000_write(i2c, WM2000_REG_SYS_CTL1, WM2000_SYS_STBY);
277	wm2000_write(i2c, WM2000_REG_SYS_CTL2, WM2000_RAM_CLR);
278
279	wm2000->anc_mode = ANC_BYPASS;
280	dev_dbg(&i2c->dev, "bypass enabled\n");
281
282	return 0;
283}
284
285static int wm2000_exit_bypass(struct i2c_client *i2c, int analogue)
286{
287	struct wm2000_priv *wm2000 = dev_get_drvdata(&i2c->dev);
288
289	BUG_ON(wm2000->anc_mode != ANC_BYPASS);
 
290	
291	wm2000_write(i2c, WM2000_REG_SYS_CTL1, 0);
292
293	if (analogue) {
294		wm2000_write(i2c, WM2000_REG_SYS_MODE_CNTRL,
295			     WM2000_MODE_ANA_SEQ_INCLUDE |
296			     WM2000_MODE_MOUSE_ENABLE |
297			     WM2000_MODE_THERMAL_ENABLE);
298	} else {
299		wm2000_write(i2c, WM2000_REG_SYS_MODE_CNTRL,
300			     WM2000_MODE_MOUSE_ENABLE |
301			     WM2000_MODE_THERMAL_ENABLE);
302	}
303
304	wm2000_write(i2c, WM2000_REG_SYS_CTL2, WM2000_RAM_SET);
305	wm2000_write(i2c, WM2000_REG_SYS_CTL2, WM2000_ANC_INT_N_CLR);
306
307	if (!wm2000_poll_bit(i2c, WM2000_REG_SYS_STATUS,
308			     WM2000_STATUS_MOUSE_ACTIVE)) {
309		dev_err(&i2c->dev, "Timed out waiting for MOUSE\n");
310		return -ETIMEDOUT;
311	}
312
313	wm2000->anc_mode = ANC_ACTIVE;
314	dev_dbg(&i2c->dev, "MOUSE active\n");
315
316	return 0;
317}
318
319static int wm2000_enter_standby(struct i2c_client *i2c, int analogue)
320{
321	struct wm2000_priv *wm2000 = dev_get_drvdata(&i2c->dev);
322
323	BUG_ON(wm2000->anc_mode != ANC_ACTIVE);
 
324
325	if (analogue) {
326		wm2000_write(i2c, WM2000_REG_ANA_VMID_PD_TIME, 248 / 4);
327
328		wm2000_write(i2c, WM2000_REG_SYS_MODE_CNTRL,
329			     WM2000_MODE_ANA_SEQ_INCLUDE |
330			     WM2000_MODE_THERMAL_ENABLE |
331			     WM2000_MODE_STANDBY_ENTRY);
332	} else {
333		wm2000_write(i2c, WM2000_REG_SYS_MODE_CNTRL,
334			     WM2000_MODE_THERMAL_ENABLE |
335			     WM2000_MODE_STANDBY_ENTRY);
336	}
337
338	if (!wm2000_poll_bit(i2c, WM2000_REG_SYS_STATUS,
339			     WM2000_STATUS_ANC_DISABLED)) {
340		dev_err(&i2c->dev,
341			"Timed out waiting for ANC disable after 1ms\n");
342		return -ETIMEDOUT;
343	}
344
345	if (!wm2000_poll_bit(i2c, WM2000_REG_ANC_STAT, WM2000_ANC_ENG_IDLE)) {
346		dev_err(&i2c->dev,
347			"Timed out waiting for standby\n");
348		return -ETIMEDOUT;
349	}
350
351	wm2000_write(i2c, WM2000_REG_SYS_CTL1, WM2000_SYS_STBY);
352	wm2000_write(i2c, WM2000_REG_SYS_CTL2, WM2000_RAM_CLR);
353
354	wm2000->anc_mode = ANC_STANDBY;
355	dev_dbg(&i2c->dev, "standby\n");
356	if (analogue)
357		dev_dbg(&i2c->dev, "Analogue disabled\n");
358
359	return 0;
360}
361
362static int wm2000_exit_standby(struct i2c_client *i2c, int analogue)
363{
364	struct wm2000_priv *wm2000 = dev_get_drvdata(&i2c->dev);
365
366	BUG_ON(wm2000->anc_mode != ANC_STANDBY);
 
367
368	wm2000_write(i2c, WM2000_REG_SYS_CTL1, 0);
369
370	if (analogue) {
371		wm2000_write(i2c, WM2000_REG_ANA_VMID_PU_TIME, 248 / 4);
372
373		wm2000_write(i2c, WM2000_REG_SYS_MODE_CNTRL,
374			     WM2000_MODE_ANA_SEQ_INCLUDE |
375			     WM2000_MODE_THERMAL_ENABLE |
376			     WM2000_MODE_MOUSE_ENABLE);
377	} else {
378		wm2000_write(i2c, WM2000_REG_SYS_MODE_CNTRL,
379			     WM2000_MODE_THERMAL_ENABLE |
380			     WM2000_MODE_MOUSE_ENABLE);
381	}
382
383	wm2000_write(i2c, WM2000_REG_SYS_CTL2, WM2000_RAM_SET);
384	wm2000_write(i2c, WM2000_REG_SYS_CTL2, WM2000_ANC_INT_N_CLR);
385
386	if (!wm2000_poll_bit(i2c, WM2000_REG_SYS_STATUS,
387			     WM2000_STATUS_MOUSE_ACTIVE)) {
388		dev_err(&i2c->dev, "Timed out waiting for MOUSE\n");
389		return -ETIMEDOUT;
390	}
391
392	wm2000->anc_mode = ANC_ACTIVE;
393	dev_dbg(&i2c->dev, "MOUSE active\n");
394	if (analogue)
395		dev_dbg(&i2c->dev, "Analogue enabled\n");
396
397	return 0;
398}
399
400typedef int (*wm2000_mode_fn)(struct i2c_client *i2c, int analogue);
401
402static struct {
403	enum wm2000_anc_mode source;
404	enum wm2000_anc_mode dest;
405	int analogue;
406	wm2000_mode_fn step[2];
407} anc_transitions[] = {
408	{
409		.source = ANC_OFF,
410		.dest = ANC_ACTIVE,
411		.analogue = 1,
412		.step = {
413			wm2000_power_up,
414		},
415	},
416	{
417		.source = ANC_OFF,
418		.dest = ANC_STANDBY,
419		.step = {
420			wm2000_power_up,
421			wm2000_enter_standby,
422		},
423	},
424	{
425		.source = ANC_OFF,
426		.dest = ANC_BYPASS,
427		.analogue = 1,
428		.step = {
429			wm2000_power_up,
430			wm2000_enter_bypass,
431		},
432	},
433	{
434		.source = ANC_ACTIVE,
435		.dest = ANC_BYPASS,
436		.analogue = 1,
437		.step = {
438			wm2000_enter_bypass,
439		},
440	},
441	{
442		.source = ANC_ACTIVE,
443		.dest = ANC_STANDBY,
444		.analogue = 1,
445		.step = {
446			wm2000_enter_standby,
447		},
448	},
449	{
450		.source = ANC_ACTIVE,
451		.dest = ANC_OFF,
452		.analogue = 1,
453		.step = {
454			wm2000_power_down,
455		},
456	},
457	{
458		.source = ANC_BYPASS,
459		.dest = ANC_ACTIVE,
460		.analogue = 1,
461		.step = {
462			wm2000_exit_bypass,
463		},
464	},
465	{
466		.source = ANC_BYPASS,
467		.dest = ANC_STANDBY,
468		.analogue = 1,
469		.step = {
470			wm2000_exit_bypass,
471			wm2000_enter_standby,
472		},
473	},
474	{
475		.source = ANC_BYPASS,
476		.dest = ANC_OFF,
477		.step = {
478			wm2000_exit_bypass,
479			wm2000_power_down,
480		},
481	},
482	{
483		.source = ANC_STANDBY,
484		.dest = ANC_ACTIVE,
485		.analogue = 1,
486		.step = {
487			wm2000_exit_standby,
488		},
489	},
490	{
491		.source = ANC_STANDBY,
492		.dest = ANC_BYPASS,
493		.analogue = 1,
494		.step = {
495			wm2000_exit_standby,
496			wm2000_enter_bypass,
497		},
498	},
499	{
500		.source = ANC_STANDBY,
501		.dest = ANC_OFF,
502		.step = {
503			wm2000_exit_standby,
504			wm2000_power_down,
505		},
506	},
507};
508
509static int wm2000_anc_transition(struct wm2000_priv *wm2000,
510				 enum wm2000_anc_mode mode)
511{
512	struct i2c_client *i2c = wm2000->i2c;
513	int i, j;
514	int ret;
515
516	if (wm2000->anc_mode == mode)
517		return 0;
518
519	for (i = 0; i < ARRAY_SIZE(anc_transitions); i++)
520		if (anc_transitions[i].source == wm2000->anc_mode &&
521		    anc_transitions[i].dest == mode)
522			break;
523	if (i == ARRAY_SIZE(anc_transitions)) {
524		dev_err(&i2c->dev, "No transition for %d->%d\n",
525			wm2000->anc_mode, mode);
526		return -EINVAL;
527	}
528
 
 
 
 
 
 
 
 
 
529	for (j = 0; j < ARRAY_SIZE(anc_transitions[j].step); j++) {
530		if (!anc_transitions[i].step[j])
531			break;
532		ret = anc_transitions[i].step[j](i2c,
533						 anc_transitions[i].analogue);
534		if (ret != 0)
535			return ret;
536	}
537
538	return 0;
 
 
 
539}
540
541static int wm2000_anc_set_mode(struct wm2000_priv *wm2000)
542{
543	struct i2c_client *i2c = wm2000->i2c;
544	enum wm2000_anc_mode mode;
545
546	if (wm2000->anc_eng_ena && wm2000->spk_ena)
547		if (wm2000->anc_active)
548			mode = ANC_ACTIVE;
549		else
550			mode = ANC_BYPASS;
551	else
552		mode = ANC_STANDBY;
553
554	dev_dbg(&i2c->dev, "Set mode %d (enabled %d, mute %d, active %d)\n",
555		mode, wm2000->anc_eng_ena, !wm2000->spk_ena,
556		wm2000->anc_active);
557
558	return wm2000_anc_transition(wm2000, mode);
559}
560
561static int wm2000_anc_mode_get(struct snd_kcontrol *kcontrol,
562			       struct snd_ctl_elem_value *ucontrol)
563{
564	struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol);
565	struct wm2000_priv *wm2000 = dev_get_drvdata(codec->dev);
566
567	ucontrol->value.enumerated.item[0] = wm2000->anc_active;
568
569	return 0;
570}
571
572static int wm2000_anc_mode_put(struct snd_kcontrol *kcontrol,
573			       struct snd_ctl_elem_value *ucontrol)
574{
575	struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol);
576	struct wm2000_priv *wm2000 = dev_get_drvdata(codec->dev);
577	int anc_active = ucontrol->value.enumerated.item[0];
 
578
579	if (anc_active > 1)
580		return -EINVAL;
581
 
 
582	wm2000->anc_active = anc_active;
583
584	return wm2000_anc_set_mode(wm2000);
 
 
 
 
585}
586
587static int wm2000_speaker_get(struct snd_kcontrol *kcontrol,
588			      struct snd_ctl_elem_value *ucontrol)
589{
590	struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol);
591	struct wm2000_priv *wm2000 = dev_get_drvdata(codec->dev);
592
593	ucontrol->value.enumerated.item[0] = wm2000->spk_ena;
594
595	return 0;
596}
597
598static int wm2000_speaker_put(struct snd_kcontrol *kcontrol,
599			      struct snd_ctl_elem_value *ucontrol)
600{
601	struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol);
602	struct wm2000_priv *wm2000 = dev_get_drvdata(codec->dev);
603	int val = ucontrol->value.enumerated.item[0];
 
604
605	if (val > 1)
606		return -EINVAL;
607
 
 
608	wm2000->spk_ena = val;
609
610	return wm2000_anc_set_mode(wm2000);
 
 
 
 
611}
612
613static const struct snd_kcontrol_new wm2000_controls[] = {
 
614	SOC_SINGLE_BOOL_EXT("WM2000 ANC Switch", 0,
615			    wm2000_anc_mode_get,
616			    wm2000_anc_mode_put),
617	SOC_SINGLE_BOOL_EXT("WM2000 Switch", 0,
618			    wm2000_speaker_get,
619			    wm2000_speaker_put),
620};
621
622static int wm2000_anc_power_event(struct snd_soc_dapm_widget *w,
623				  struct snd_kcontrol *kcontrol, int event)
624{
625	struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol);
626	struct wm2000_priv *wm2000 = dev_get_drvdata(codec->dev);
 
 
 
627
628	if (SND_SOC_DAPM_EVENT_ON(event))
629		wm2000->anc_eng_ena = 1;
630
631	if (SND_SOC_DAPM_EVENT_OFF(event))
632		wm2000->anc_eng_ena = 0;
633
634	return wm2000_anc_set_mode(wm2000);
 
 
 
 
635}
636
637static const struct snd_soc_dapm_widget wm2000_dapm_widgets[] = {
638/* Externally visible pins */
639SND_SOC_DAPM_OUTPUT("SPKN"),
640SND_SOC_DAPM_OUTPUT("SPKP"),
641
642SND_SOC_DAPM_INPUT("LINN"),
643SND_SOC_DAPM_INPUT("LINP"),
644
645SND_SOC_DAPM_PGA_E("ANC Engine", SND_SOC_NOPM, 0, 0, NULL, 0,
646		   wm2000_anc_power_event,
647		   SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_PRE_PMD),
648};
649
650/* Target, Path, Source */
651static const struct snd_soc_dapm_route wm2000_audio_map[] = {
652	{ "SPKN", NULL, "ANC Engine" },
653	{ "SPKP", NULL, "ANC Engine" },
654	{ "ANC Engine", NULL, "LINN" },
655	{ "ANC Engine", NULL, "LINP" },
656};
657
658#ifdef CONFIG_PM
659static int wm2000_suspend(struct snd_soc_codec *codec)
660{
661	struct wm2000_priv *wm2000 = dev_get_drvdata(codec->dev);
662
663	return wm2000_anc_transition(wm2000, ANC_OFF);
664}
665
666static int wm2000_resume(struct snd_soc_codec *codec)
667{
668	struct wm2000_priv *wm2000 = dev_get_drvdata(codec->dev);
669
670	return wm2000_anc_set_mode(wm2000);
671}
672#else
673#define wm2000_suspend NULL
674#define wm2000_resume NULL
675#endif
676
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
677static const struct regmap_config wm2000_regmap = {
678	.reg_bits = 16,
679	.val_bits = 8,
 
 
 
680};
681
682static int wm2000_probe(struct snd_soc_codec *codec)
683{
684	struct wm2000_priv *wm2000 = dev_get_drvdata(codec->dev);
685
686	/* This will trigger a transition to standby mode by default */
687	wm2000_anc_set_mode(wm2000);
688
689	return 0;
690}
691
692static int wm2000_remove(struct snd_soc_codec *codec)
693{
694	struct wm2000_priv *wm2000 = dev_get_drvdata(codec->dev);
695
696	return wm2000_anc_transition(wm2000, ANC_OFF);
697}
698
699static struct snd_soc_codec_driver soc_codec_dev_wm2000 = {
700	.probe = wm2000_probe,
701	.remove = wm2000_remove,
702	.suspend = wm2000_suspend,
703	.resume = wm2000_resume,
704
705	.dapm_widgets = wm2000_dapm_widgets,
706	.num_dapm_widgets = ARRAY_SIZE(wm2000_dapm_widgets),
707	.dapm_routes = wm2000_audio_map,
708	.num_dapm_routes = ARRAY_SIZE(wm2000_audio_map),
709	.controls = wm2000_controls,
710	.num_controls = ARRAY_SIZE(wm2000_controls),
 
711};
712
713static int __devinit wm2000_i2c_probe(struct i2c_client *i2c,
714				      const struct i2c_device_id *i2c_id)
715{
716	struct wm2000_priv *wm2000;
717	struct wm2000_platform_data *pdata;
718	const char *filename;
719	const struct firmware *fw = NULL;
720	int ret;
721	int reg;
722	u16 id;
723
724	wm2000 = devm_kzalloc(&i2c->dev, sizeof(struct wm2000_priv),
725			      GFP_KERNEL);
726	if (wm2000 == NULL) {
727		dev_err(&i2c->dev, "Unable to allocate private data\n");
728		return -ENOMEM;
729	}
 
730
731	dev_set_drvdata(&i2c->dev, wm2000);
732
733	wm2000->regmap = regmap_init_i2c(i2c, &wm2000_regmap);
734	if (IS_ERR(wm2000->regmap)) {
735		ret = PTR_ERR(wm2000->regmap);
736		dev_err(&i2c->dev, "Failed to allocate register map: %d\n",
737			ret);
738		goto out;
739	}
740
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
741	/* Verify that this is a WM2000 */
742	reg = wm2000_read(i2c, WM2000_REG_ID1);
 
 
 
 
743	id = reg << 8;
744	reg = wm2000_read(i2c, WM2000_REG_ID2);
 
 
 
 
745	id |= reg & 0xff;
746
747	if (id != 0x2000) {
748		dev_err(&i2c->dev, "Device is not a WM2000 - ID %x\n", id);
749		ret = -ENODEV;
750		goto out_regmap_exit;
751	}
752
753	reg = wm2000_read(i2c, WM2000_REG_REVISON);
 
 
 
 
754	dev_info(&i2c->dev, "revision %c\n", reg + 'A');
755
 
 
 
 
 
 
 
756	filename = "wm2000_anc.bin";
757	pdata = dev_get_platdata(&i2c->dev);
758	if (pdata) {
759		wm2000->mclk_div = pdata->mclkdiv2;
760		wm2000->speech_clarity = !pdata->speech_enh_disable;
761
762		if (pdata->download_file)
763			filename = pdata->download_file;
764	}
765
766	ret = request_firmware(&fw, filename, &i2c->dev);
767	if (ret != 0) {
768		dev_err(&i2c->dev, "Failed to acquire ANC data: %d\n", ret);
769		goto out_regmap_exit;
770	}
771
772	/* Pre-cook the concatenation of the register address onto the image */
773	wm2000->anc_download_size = fw->size + 2;
774	wm2000->anc_download = devm_kzalloc(&i2c->dev,
775					    wm2000->anc_download_size,
776					    GFP_KERNEL);
777	if (wm2000->anc_download == NULL) {
778		dev_err(&i2c->dev, "Out of memory\n");
779		ret = -ENOMEM;
780		goto out_regmap_exit;
781	}
782
783	wm2000->anc_download[0] = 0x80;
784	wm2000->anc_download[1] = 0x00;
785	memcpy(wm2000->anc_download + 2, fw->data, fw->size);
786
787	wm2000->anc_eng_ena = 1;
788	wm2000->anc_active = 1;
789	wm2000->spk_ena = 1;
790	wm2000->i2c = i2c;
791
792	wm2000_reset(wm2000);
793
794	ret = snd_soc_register_codec(&i2c->dev, &soc_codec_dev_wm2000, NULL, 0);
795	if (!ret)
796		goto out;
 
 
797
798out_regmap_exit:
799	regmap_exit(wm2000->regmap);
800out:
801	release_firmware(fw);
802	return ret;
803}
804
805static __devexit int wm2000_i2c_remove(struct i2c_client *i2c)
806{
807	struct wm2000_priv *wm2000 = dev_get_drvdata(&i2c->dev);
808
809	snd_soc_unregister_codec(&i2c->dev);
810	regmap_exit(wm2000->regmap);
811
812	return 0;
813}
814
815static const struct i2c_device_id wm2000_i2c_id[] = {
816	{ "wm2000", 0 },
817	{ }
818};
819MODULE_DEVICE_TABLE(i2c, wm2000_i2c_id);
820
821static struct i2c_driver wm2000_i2c_driver = {
822	.driver = {
823		.name = "wm2000",
824		.owner = THIS_MODULE,
825	},
826	.probe = wm2000_i2c_probe,
827	.remove = __devexit_p(wm2000_i2c_remove),
828	.id_table = wm2000_i2c_id,
829};
830
831static int __init wm2000_init(void)
832{
833	return i2c_add_driver(&wm2000_i2c_driver);
834}
835module_init(wm2000_init);
836
837static void __exit wm2000_exit(void)
838{
839	i2c_del_driver(&wm2000_i2c_driver);
840}
841module_exit(wm2000_exit);
842
843MODULE_DESCRIPTION("ASoC WM2000 driver");
844MODULE_AUTHOR("Mark Brown <broonie@opensource.wolfonmicro.com>");
845MODULE_LICENSE("GPL");