1 // SPDX-License-Identifier: GPL-2.0-only
3 * wm2000.c -- WM2000 ALSA Soc Audio driver
5 * Copyright 2008-2011 Wolfson Microelectronics PLC.
7 * Author: Mark Brown <broonie@opensource.wolfsonmicro.com>
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:
17 * perl -e 'while (<>) { s/[\r\n]+// ; printf("%c", hex($_)); }'
18 * < file > wm2000_anc.bin
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>
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>
41 #include <sound/wm2000.h>
45 #define WM2000_NUM_SUPPLIES 3
47 static const char *wm2000_supplies
[WM2000_NUM_SUPPLIES
] = {
53 enum wm2000_anc_mode
{
61 struct i2c_client
*i2c
;
62 struct regmap
*regmap
;
65 struct regulator_bulk_data supplies
[WM2000_NUM_SUPPLIES
];
67 enum wm2000_anc_mode anc_mode
;
69 unsigned int anc_active
:1;
70 unsigned int anc_eng_ena
:1;
71 unsigned int spk_ena
:1;
73 unsigned int speech_clarity
:1;
75 int anc_download_size
;
81 static int wm2000_write(struct i2c_client
*i2c
, unsigned int reg
,
84 struct wm2000_priv
*wm2000
= i2c_get_clientdata(i2c
);
85 return regmap_write(wm2000
->regmap
, reg
, value
);
88 static void wm2000_reset(struct wm2000_priv
*wm2000
)
90 struct i2c_client
*i2c
= wm2000
->i2c
;
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);
96 wm2000
->anc_mode
= ANC_OFF
;
99 static int wm2000_poll_bit(struct i2c_client
*i2c
,
100 unsigned int reg
, u8 mask
)
102 struct wm2000_priv
*wm2000
= i2c_get_clientdata(i2c
);
106 regmap_read(wm2000
->regmap
, reg
, &val
);
108 while (!(val
& mask
) && --timeout
) {
110 regmap_read(wm2000
->regmap
, reg
, &val
);
119 static int wm2000_power_up(struct i2c_client
*i2c
, int analogue
)
121 struct wm2000_priv
*wm2000
= dev_get_drvdata(&i2c
->dev
);
126 if (WARN_ON(wm2000
->anc_mode
!= ANC_OFF
))
129 dev_dbg(&i2c
->dev
, "Beginning power up\n");
131 ret
= regulator_bulk_enable(WM2000_NUM_SUPPLIES
, wm2000
->supplies
);
133 dev_err(&i2c
->dev
, "Failed to enable supplies: %d\n", ret
);
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
);
143 dev_dbg(&i2c
->dev
, "Enabling MCLK divider\n");
144 wm2000_write(i2c
, WM2000_REG_SYS_CTL2
,
145 WM2000_MCLK_DIV2_ENA_SET
);
148 wm2000_write(i2c
, WM2000_REG_SYS_CTL2
, WM2000_ANC_ENG_CLR
);
149 wm2000_write(i2c
, WM2000_REG_SYS_CTL2
, WM2000_ANC_ENG_SET
);
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
);
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
);
166 wm2000_write(i2c
, WM2000_REG_SYS_CTL2
, WM2000_RAM_SET
);
168 /* Open code download of the data since it is the only bulk
170 dev_dbg(&i2c
->dev
, "Downloading %d bytes\n",
171 wm2000
->anc_download_size
- 2);
173 ret
= i2c_master_send(i2c
, wm2000
->anc_download
,
174 wm2000
->anc_download_size
);
176 dev_err(&i2c
->dev
, "i2c_transfer() failed: %d\n", ret
);
177 regulator_bulk_disable(WM2000_NUM_SUPPLIES
, wm2000
->supplies
);
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
);
187 dev_dbg(&i2c
->dev
, "Download complete\n");
190 wm2000_write(i2c
, WM2000_REG_ANA_VMID_PU_TIME
, 248 / 4);
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
);
197 wm2000_write(i2c
, WM2000_REG_SYS_MODE_CNTRL
,
198 WM2000_MODE_MOUSE_ENABLE
|
199 WM2000_MODE_THERMAL_ENABLE
);
202 ret
= regmap_read(wm2000
->regmap
, WM2000_REG_SPEECH_CLARITY
, &val
);
204 dev_err(&i2c
->dev
, "Unable to read Speech Clarity: %d\n", ret
);
205 regulator_bulk_disable(WM2000_NUM_SUPPLIES
, wm2000
->supplies
);
208 if (wm2000
->speech_clarity
)
209 val
|= WM2000_SPEECH_CLARITY
;
211 val
&= ~WM2000_SPEECH_CLARITY
;
212 wm2000_write(i2c
, WM2000_REG_SPEECH_CLARITY
, val
);
214 wm2000_write(i2c
, WM2000_REG_SYS_START0
, 0x33);
215 wm2000_write(i2c
, WM2000_REG_SYS_START1
, 0x02);
217 wm2000_write(i2c
, WM2000_REG_SYS_CTL2
, WM2000_ANC_INT_N_CLR
);
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
);
226 dev_dbg(&i2c
->dev
, "ANC active\n");
228 dev_dbg(&i2c
->dev
, "Analogue active\n");
229 wm2000
->anc_mode
= ANC_ACTIVE
;
234 static int wm2000_power_down(struct i2c_client
*i2c
, int analogue
)
236 struct wm2000_priv
*wm2000
= dev_get_drvdata(&i2c
->dev
);
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
);
244 wm2000_write(i2c
, WM2000_REG_SYS_MODE_CNTRL
,
245 WM2000_MODE_POWER_DOWN
);
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");
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");
260 regulator_bulk_disable(WM2000_NUM_SUPPLIES
, wm2000
->supplies
);
262 dev_dbg(&i2c
->dev
, "powered off\n");
263 wm2000
->anc_mode
= ANC_OFF
;
268 static int wm2000_enter_bypass(struct i2c_client
*i2c
, int analogue
)
270 struct wm2000_priv
*wm2000
= dev_get_drvdata(&i2c
->dev
);
272 if (WARN_ON(wm2000
->anc_mode
!= ANC_ACTIVE
))
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
);
281 wm2000_write(i2c
, WM2000_REG_SYS_MODE_CNTRL
,
282 WM2000_MODE_THERMAL_ENABLE
|
283 WM2000_MODE_BYPASS_ENTRY
);
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");
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");
298 wm2000_write(i2c
, WM2000_REG_SYS_CTL1
, WM2000_SYS_STBY
);
299 wm2000_write(i2c
, WM2000_REG_SYS_CTL2
, WM2000_RAM_CLR
);
301 wm2000
->anc_mode
= ANC_BYPASS
;
302 dev_dbg(&i2c
->dev
, "bypass enabled\n");
307 static int wm2000_exit_bypass(struct i2c_client
*i2c
, int analogue
)
309 struct wm2000_priv
*wm2000
= dev_get_drvdata(&i2c
->dev
);
311 if (WARN_ON(wm2000
->anc_mode
!= ANC_BYPASS
))
314 wm2000_write(i2c
, WM2000_REG_SYS_CTL1
, 0);
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
);
322 wm2000_write(i2c
, WM2000_REG_SYS_MODE_CNTRL
,
323 WM2000_MODE_MOUSE_ENABLE
|
324 WM2000_MODE_THERMAL_ENABLE
);
327 wm2000_write(i2c
, WM2000_REG_SYS_CTL2
, WM2000_RAM_SET
);
328 wm2000_write(i2c
, WM2000_REG_SYS_CTL2
, WM2000_ANC_INT_N_CLR
);
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");
336 wm2000
->anc_mode
= ANC_ACTIVE
;
337 dev_dbg(&i2c
->dev
, "MOUSE active\n");
342 static int wm2000_enter_standby(struct i2c_client
*i2c
, int analogue
)
344 struct wm2000_priv
*wm2000
= dev_get_drvdata(&i2c
->dev
);
346 if (WARN_ON(wm2000
->anc_mode
!= ANC_ACTIVE
))
350 wm2000_write(i2c
, WM2000_REG_ANA_VMID_PD_TIME
, 248 / 4);
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
);
357 wm2000_write(i2c
, WM2000_REG_SYS_MODE_CNTRL
,
358 WM2000_MODE_THERMAL_ENABLE
|
359 WM2000_MODE_STANDBY_ENTRY
);
362 if (!wm2000_poll_bit(i2c
, WM2000_REG_SYS_STATUS
,
363 WM2000_STATUS_ANC_DISABLED
)) {
365 "Timed out waiting for ANC disable after 1ms\n");
369 if (!wm2000_poll_bit(i2c
, WM2000_REG_ANC_STAT
, WM2000_ANC_ENG_IDLE
)) {
371 "Timed out waiting for standby\n");
375 wm2000_write(i2c
, WM2000_REG_SYS_CTL1
, WM2000_SYS_STBY
);
376 wm2000_write(i2c
, WM2000_REG_SYS_CTL2
, WM2000_RAM_CLR
);
378 wm2000
->anc_mode
= ANC_STANDBY
;
379 dev_dbg(&i2c
->dev
, "standby\n");
381 dev_dbg(&i2c
->dev
, "Analogue disabled\n");
386 static int wm2000_exit_standby(struct i2c_client
*i2c
, int analogue
)
388 struct wm2000_priv
*wm2000
= dev_get_drvdata(&i2c
->dev
);
390 if (WARN_ON(wm2000
->anc_mode
!= ANC_STANDBY
))
393 wm2000_write(i2c
, WM2000_REG_SYS_CTL1
, 0);
396 wm2000_write(i2c
, WM2000_REG_ANA_VMID_PU_TIME
, 248 / 4);
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
);
403 wm2000_write(i2c
, WM2000_REG_SYS_MODE_CNTRL
,
404 WM2000_MODE_THERMAL_ENABLE
|
405 WM2000_MODE_MOUSE_ENABLE
);
408 wm2000_write(i2c
, WM2000_REG_SYS_CTL2
, WM2000_RAM_SET
);
409 wm2000_write(i2c
, WM2000_REG_SYS_CTL2
, WM2000_ANC_INT_N_CLR
);
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");
417 wm2000
->anc_mode
= ANC_ACTIVE
;
418 dev_dbg(&i2c
->dev
, "MOUSE active\n");
420 dev_dbg(&i2c
->dev
, "Analogue enabled\n");
425 typedef int (*wm2000_mode_fn
)(struct i2c_client
*i2c
, int analogue
);
428 enum wm2000_anc_mode source
;
429 enum wm2000_anc_mode dest
;
431 wm2000_mode_fn step
[2];
432 } anc_transitions
[] = {
446 wm2000_enter_standby
,
459 .source
= ANC_ACTIVE
,
467 .source
= ANC_ACTIVE
,
471 wm2000_enter_standby
,
475 .source
= ANC_ACTIVE
,
483 .source
= ANC_BYPASS
,
491 .source
= ANC_BYPASS
,
496 wm2000_enter_standby
,
500 .source
= ANC_BYPASS
,
508 .source
= ANC_STANDBY
,
516 .source
= ANC_STANDBY
,
525 .source
= ANC_STANDBY
,
534 static int wm2000_anc_transition(struct wm2000_priv
*wm2000
,
535 enum wm2000_anc_mode mode
)
537 struct i2c_client
*i2c
= wm2000
->i2c
;
541 if (wm2000
->anc_mode
== mode
)
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
)
548 if (i
== ARRAY_SIZE(anc_transitions
)) {
549 dev_err(&i2c
->dev
, "No transition for %d->%d\n",
550 wm2000
->anc_mode
, mode
);
554 /* Maintain clock while active */
555 if (anc_transitions
[i
].source
== ANC_OFF
) {
556 ret
= clk_prepare_enable(wm2000
->mclk
);
558 dev_err(&i2c
->dev
, "Failed to enable MCLK: %d\n", ret
);
563 for (j
= 0; j
< ARRAY_SIZE(anc_transitions
[j
].step
); j
++) {
564 if (!anc_transitions
[i
].step
[j
])
566 ret
= anc_transitions
[i
].step
[j
](i2c
,
567 anc_transitions
[i
].analogue
);
572 if (anc_transitions
[i
].dest
== ANC_OFF
)
573 clk_disable_unprepare(wm2000
->mclk
);
578 static int wm2000_anc_set_mode(struct wm2000_priv
*wm2000
)
580 struct i2c_client
*i2c
= wm2000
->i2c
;
581 enum wm2000_anc_mode mode
;
583 if (wm2000
->anc_eng_ena
&& wm2000
->spk_ena
)
584 if (wm2000
->anc_active
)
591 dev_dbg(&i2c
->dev
, "Set mode %d (enabled %d, mute %d, active %d)\n",
592 mode
, wm2000
->anc_eng_ena
, !wm2000
->spk_ena
,
595 return wm2000_anc_transition(wm2000
, mode
);
598 static int wm2000_anc_mode_get(struct snd_kcontrol
*kcontrol
,
599 struct snd_ctl_elem_value
*ucontrol
)
601 struct snd_soc_component
*component
= snd_soc_kcontrol_component(kcontrol
);
602 struct wm2000_priv
*wm2000
= dev_get_drvdata(component
->dev
);
604 ucontrol
->value
.integer
.value
[0] = wm2000
->anc_active
;
609 static int wm2000_anc_mode_put(struct snd_kcontrol
*kcontrol
,
610 struct snd_ctl_elem_value
*ucontrol
)
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];
620 mutex_lock(&wm2000
->lock
);
622 wm2000
->anc_active
= anc_active
;
624 ret
= wm2000_anc_set_mode(wm2000
);
626 mutex_unlock(&wm2000
->lock
);
631 static int wm2000_speaker_get(struct snd_kcontrol
*kcontrol
,
632 struct snd_ctl_elem_value
*ucontrol
)
634 struct snd_soc_component
*component
= snd_soc_kcontrol_component(kcontrol
);
635 struct wm2000_priv
*wm2000
= dev_get_drvdata(component
->dev
);
637 ucontrol
->value
.integer
.value
[0] = wm2000
->spk_ena
;
642 static int wm2000_speaker_put(struct snd_kcontrol
*kcontrol
,
643 struct snd_ctl_elem_value
*ucontrol
)
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];
653 mutex_lock(&wm2000
->lock
);
655 wm2000
->spk_ena
= val
;
657 ret
= wm2000_anc_set_mode(wm2000
);
659 mutex_unlock(&wm2000
->lock
);
664 static 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,
668 wm2000_anc_mode_put
),
669 SOC_SINGLE_BOOL_EXT("WM2000 Switch", 0,
674 static int wm2000_anc_power_event(struct snd_soc_dapm_widget
*w
,
675 struct snd_kcontrol
*kcontrol
, int event
)
677 struct snd_soc_component
*component
= snd_soc_dapm_to_component(w
->dapm
);
678 struct wm2000_priv
*wm2000
= dev_get_drvdata(component
->dev
);
681 mutex_lock(&wm2000
->lock
);
683 if (SND_SOC_DAPM_EVENT_ON(event
))
684 wm2000
->anc_eng_ena
= 1;
686 if (SND_SOC_DAPM_EVENT_OFF(event
))
687 wm2000
->anc_eng_ena
= 0;
689 ret
= wm2000_anc_set_mode(wm2000
);
691 mutex_unlock(&wm2000
->lock
);
696 static const struct snd_soc_dapm_widget wm2000_dapm_widgets
[] = {
697 /* Externally visible pins */
698 SND_SOC_DAPM_OUTPUT("SPKN"),
699 SND_SOC_DAPM_OUTPUT("SPKP"),
701 SND_SOC_DAPM_INPUT("LINN"),
702 SND_SOC_DAPM_INPUT("LINP"),
704 SND_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
),
709 /* Target, Path, Source */
710 static 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" },
718 static int wm2000_suspend(struct snd_soc_component
*component
)
720 struct wm2000_priv
*wm2000
= dev_get_drvdata(component
->dev
);
722 return wm2000_anc_transition(wm2000
, ANC_OFF
);
725 static int wm2000_resume(struct snd_soc_component
*component
)
727 struct wm2000_priv
*wm2000
= dev_get_drvdata(component
->dev
);
729 return wm2000_anc_set_mode(wm2000
);
732 #define wm2000_suspend NULL
733 #define wm2000_resume NULL
736 static bool wm2000_readable_reg(struct device
*dev
, unsigned int 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
:
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
:
768 static const struct regmap_config wm2000_regmap
= {
772 .max_register
= WM2000_REG_SPK_CTL
,
773 .readable_reg
= wm2000_readable_reg
,
776 static int wm2000_probe(struct snd_soc_component
*component
)
778 struct wm2000_priv
*wm2000
= dev_get_drvdata(component
->dev
);
780 /* This will trigger a transition to standby mode by default */
781 wm2000_anc_set_mode(wm2000
);
786 static void wm2000_remove(struct snd_soc_component
*component
)
788 struct wm2000_priv
*wm2000
= dev_get_drvdata(component
->dev
);
790 wm2000_anc_transition(wm2000
, ANC_OFF
);
793 static 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
),
805 .use_pmdown_time
= 1,
807 .non_legacy_dai_naming
= 1,
810 static int wm2000_i2c_probe(struct i2c_client
*i2c
,
811 const struct i2c_device_id
*i2c_id
)
813 struct wm2000_priv
*wm2000
;
814 struct wm2000_platform_data
*pdata
;
815 const char *filename
;
816 const struct firmware
*fw
= NULL
;
821 wm2000
= devm_kzalloc(&i2c
->dev
, sizeof(*wm2000
), GFP_KERNEL
);
825 mutex_init(&wm2000
->lock
);
827 dev_set_drvdata(&i2c
->dev
, wm2000
);
829 wm2000
->regmap
= devm_regmap_init_i2c(i2c
, &wm2000_regmap
);
830 if (IS_ERR(wm2000
->regmap
)) {
831 ret
= PTR_ERR(wm2000
->regmap
);
832 dev_err(&i2c
->dev
, "Failed to allocate register map: %d\n",
837 for (i
= 0; i
< WM2000_NUM_SUPPLIES
; i
++)
838 wm2000
->supplies
[i
].supply
= wm2000_supplies
[i
];
840 ret
= devm_regulator_bulk_get(&i2c
->dev
, WM2000_NUM_SUPPLIES
,
843 dev_err(&i2c
->dev
, "Failed to get supplies: %d\n", ret
);
847 ret
= regulator_bulk_enable(WM2000_NUM_SUPPLIES
, wm2000
->supplies
);
849 dev_err(&i2c
->dev
, "Failed to enable supplies: %d\n", ret
);
853 /* Verify that this is a WM2000 */
854 ret
= regmap_read(wm2000
->regmap
, WM2000_REG_ID1
, ®
);
856 dev_err(&i2c
->dev
, "Unable to read ID1: %d\n", ret
);
860 ret
= regmap_read(wm2000
->regmap
, WM2000_REG_ID2
, ®
);
862 dev_err(&i2c
->dev
, "Unable to read ID2: %d\n", ret
);
868 dev_err(&i2c
->dev
, "Device is not a WM2000 - ID %x\n", id
);
873 ret
= regmap_read(wm2000
->regmap
, WM2000_REG_REVISON
, ®
);
875 dev_err(&i2c
->dev
, "Unable to read Revision: %d\n", ret
);
878 dev_info(&i2c
->dev
, "revision %c\n", reg
+ 'A');
880 wm2000
->mclk
= devm_clk_get(&i2c
->dev
, "MCLK");
881 if (IS_ERR(wm2000
->mclk
)) {
882 ret
= PTR_ERR(wm2000
->mclk
);
883 dev_err(&i2c
->dev
, "Failed to get MCLK: %d\n", ret
);
887 filename
= "wm2000_anc.bin";
888 pdata
= dev_get_platdata(&i2c
->dev
);
890 wm2000
->speech_clarity
= !pdata
->speech_enh_disable
;
892 if (pdata
->download_file
)
893 filename
= pdata
->download_file
;
896 ret
= request_firmware(&fw
, filename
, &i2c
->dev
);
898 dev_err(&i2c
->dev
, "Failed to acquire ANC data: %d\n", ret
);
902 /* Pre-cook the concatenation of the register address onto the image */
903 wm2000
->anc_download_size
= fw
->size
+ 2;
904 wm2000
->anc_download
= devm_kzalloc(&i2c
->dev
,
905 wm2000
->anc_download_size
,
907 if (wm2000
->anc_download
== NULL
) {
912 wm2000
->anc_download
[0] = 0x80;
913 wm2000
->anc_download
[1] = 0x00;
914 memcpy(wm2000
->anc_download
+ 2, fw
->data
, fw
->size
);
916 wm2000
->anc_eng_ena
= 1;
917 wm2000
->anc_active
= 1;
921 wm2000_reset(wm2000
);
923 ret
= devm_snd_soc_register_component(&i2c
->dev
,
924 &soc_component_dev_wm2000
, NULL
, 0);
927 regulator_bulk_disable(WM2000_NUM_SUPPLIES
, wm2000
->supplies
);
930 release_firmware(fw
);
934 static const struct i2c_device_id wm2000_i2c_id
[] = {
938 MODULE_DEVICE_TABLE(i2c
, wm2000_i2c_id
);
940 static struct i2c_driver wm2000_i2c_driver
= {
944 .probe
= wm2000_i2c_probe
,
945 .id_table
= wm2000_i2c_id
,
948 module_i2c_driver(wm2000_i2c_driver
);
950 MODULE_DESCRIPTION("ASoC WM2000 driver");
951 MODULE_AUTHOR("Mark Brown <broonie@opensource.wolfonmicro.com>");
952 MODULE_LICENSE("GPL");