xref: /openbmc/linux/sound/soc/codecs/cs42l56.c (revision d2999e1b)
1 /*
2  * cs42l56.c -- CS42L56 ALSA SoC audio driver
3  *
4  * Copyright 2014 CirrusLogic, Inc.
5  *
6  * Author: Brian Austin <brian.austin@cirrus.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  */
13 
14 #include <linux/module.h>
15 #include <linux/moduleparam.h>
16 #include <linux/kernel.h>
17 #include <linux/init.h>
18 #include <linux/delay.h>
19 #include <linux/pm.h>
20 #include <linux/i2c.h>
21 #include <linux/input.h>
22 #include <linux/regmap.h>
23 #include <linux/slab.h>
24 #include <linux/workqueue.h>
25 #include <linux/platform_device.h>
26 #include <linux/regulator/consumer.h>
27 #include <linux/of_device.h>
28 #include <linux/of_gpio.h>
29 #include <sound/core.h>
30 #include <sound/pcm.h>
31 #include <sound/pcm_params.h>
32 #include <sound/soc.h>
33 #include <sound/soc-dapm.h>
34 #include <sound/initval.h>
35 #include <sound/tlv.h>
36 #include <sound/cs42l56.h>
37 #include "cs42l56.h"
38 
39 #define CS42L56_NUM_SUPPLIES 3
40 static const char *const cs42l56_supply_names[CS42L56_NUM_SUPPLIES] = {
41 	"VA",
42 	"VCP",
43 	"VLDO",
44 };
45 
46 struct  cs42l56_private {
47 	struct regmap *regmap;
48 	struct snd_soc_codec *codec;
49 	struct device *dev;
50 	struct cs42l56_platform_data pdata;
51 	struct regulator_bulk_data supplies[CS42L56_NUM_SUPPLIES];
52 	u32 mclk;
53 	u8 mclk_prediv;
54 	u8 mclk_div2;
55 	u8 mclk_ratio;
56 	u8 iface;
57 	u8 iface_fmt;
58 	u8 iface_inv;
59 #if defined(CONFIG_INPUT) || defined(CONFIG_INPUT_MODULE)
60 	struct input_dev *beep;
61 	struct work_struct beep_work;
62 	int beep_rate;
63 #endif
64 };
65 
66 static const struct reg_default cs42l56_reg_defaults[] = {
67 	{ 1, 0x56 },	/* r01	- ID 1 */
68 	{ 2, 0x04 },	/* r02	- ID 2 */
69 	{ 3, 0x7f },	/* r03	- Power Ctl 1 */
70 	{ 4, 0xff },	/* r04	- Power Ctl 2 */
71 	{ 5, 0x00 },	/* ro5	- Clocking Ctl 1 */
72 	{ 6, 0x0b },	/* r06	- Clocking Ctl 2 */
73 	{ 7, 0x00 },	/* r07	- Serial Format */
74 	{ 8, 0x05 },	/* r08	- Class H Ctl */
75 	{ 9, 0x0c },	/* r09	- Misc Ctl */
76 	{ 10, 0x80 },	/* r0a	- INT Status */
77 	{ 11, 0x00 },	/* r0b	- Playback Ctl */
78 	{ 12, 0x0c },	/* r0c	- DSP Mute Ctl */
79 	{ 13, 0x00 },	/* r0d	- ADCA Mixer Volume */
80 	{ 14, 0x00 },	/* r0e	- ADCB Mixer Volume */
81 	{ 15, 0x00 },	/* r0f	- PCMA Mixer Volume */
82 	{ 16, 0x00 },	/* r10	- PCMB Mixer Volume */
83 	{ 17, 0x00 },	/* r11	- Analog Input Advisory Volume */
84 	{ 18, 0x00 },	/* r12	- Digital Input Advisory Volume */
85 	{ 19, 0x00 },	/* r13	- Master A Volume */
86 	{ 20, 0x00 },	/* r14	- Master B Volume */
87 	{ 21, 0x00 },	/* r15	- Beep Freq / On Time */
88 	{ 22, 0x00 },	/* r16	- Beep Volume / Off Time */
89 	{ 23, 0x00 },	/* r17	- Beep Tone Ctl */
90 	{ 24, 0x88 },	/* r18	- Tone Ctl */
91 	{ 25, 0x00 },	/* r19	- Channel Mixer & Swap */
92 	{ 26, 0x00 },	/* r1a	- AIN Ref Config / ADC Mux */
93 	{ 27, 0xa0 },	/* r1b	- High-Pass Filter Ctl */
94 	{ 28, 0x00 },	/* r1c	- Misc ADC Ctl */
95 	{ 29, 0x00 },	/* r1d	- Gain & Bias Ctl */
96 	{ 30, 0x00 },	/* r1e	- PGAA Mux & Volume */
97 	{ 31, 0x00 },	/* r1f	- PGAB Mux & Volume */
98 	{ 32, 0x00 },	/* r20	- ADCA Attenuator */
99 	{ 33, 0x00 },	/* r21	- ADCB Attenuator */
100 	{ 34, 0x00 },	/* r22	- ALC Enable & Attack Rate */
101 	{ 35, 0xbf },	/* r23	- ALC Release Rate */
102 	{ 36, 0x00 },	/* r24	- ALC Threshold */
103 	{ 37, 0x00 },	/* r25	- Noise Gate Ctl */
104 	{ 38, 0x00 },	/* r26	- ALC, Limiter, SFT, ZeroCross */
105 	{ 39, 0x00 },	/* r27	- Analog Mute, LO & HP Mux */
106 	{ 40, 0x00 },	/* r28	- HP A Volume */
107 	{ 41, 0x00 },	/* r29	- HP B Volume */
108 	{ 42, 0x00 },	/* r2a	- LINEOUT A Volume */
109 	{ 43, 0x00 },	/* r2b	- LINEOUT B Volume */
110 	{ 44, 0x00 },	/* r2c	- Limit Threshold Ctl */
111 	{ 45, 0x7f },	/* r2d	- Limiter Ctl & Release Rate */
112 	{ 46, 0x00 },	/* r2e	- Limiter Attack Rate */
113 };
114 
115 static bool cs42l56_readable_register(struct device *dev, unsigned int reg)
116 {
117 	switch (reg) {
118 	case CS42L56_CHIP_ID_1:
119 	case CS42L56_CHIP_ID_2:
120 	case CS42L56_PWRCTL_1:
121 	case CS42L56_PWRCTL_2:
122 	case CS42L56_CLKCTL_1:
123 	case CS42L56_CLKCTL_2:
124 	case CS42L56_SERIAL_FMT:
125 	case CS42L56_CLASSH_CTL:
126 	case CS42L56_MISC_CTL:
127 	case CS42L56_INT_STATUS:
128 	case CS42L56_PLAYBACK_CTL:
129 	case CS42L56_DSP_MUTE_CTL:
130 	case CS42L56_ADCA_MIX_VOLUME:
131 	case CS42L56_ADCB_MIX_VOLUME:
132 	case CS42L56_PCMA_MIX_VOLUME:
133 	case CS42L56_PCMB_MIX_VOLUME:
134 	case CS42L56_ANAINPUT_ADV_VOLUME:
135 	case CS42L56_DIGINPUT_ADV_VOLUME:
136 	case CS42L56_MASTER_A_VOLUME:
137 	case CS42L56_MASTER_B_VOLUME:
138 	case CS42L56_BEEP_FREQ_ONTIME:
139 	case CS42L56_BEEP_FREQ_OFFTIME:
140 	case CS42L56_BEEP_TONE_CFG:
141 	case CS42L56_TONE_CTL:
142 	case CS42L56_CHAN_MIX_SWAP:
143 	case CS42L56_AIN_REFCFG_ADC_MUX:
144 	case CS42L56_HPF_CTL:
145 	case CS42L56_MISC_ADC_CTL:
146 	case CS42L56_GAIN_BIAS_CTL:
147 	case CS42L56_PGAA_MUX_VOLUME:
148 	case CS42L56_PGAB_MUX_VOLUME:
149 	case CS42L56_ADCA_ATTENUATOR:
150 	case CS42L56_ADCB_ATTENUATOR:
151 	case CS42L56_ALC_EN_ATTACK_RATE:
152 	case CS42L56_ALC_RELEASE_RATE:
153 	case CS42L56_ALC_THRESHOLD:
154 	case CS42L56_NOISE_GATE_CTL:
155 	case CS42L56_ALC_LIM_SFT_ZC:
156 	case CS42L56_AMUTE_HPLO_MUX:
157 	case CS42L56_HPA_VOLUME:
158 	case CS42L56_HPB_VOLUME:
159 	case CS42L56_LOA_VOLUME:
160 	case CS42L56_LOB_VOLUME:
161 	case CS42L56_LIM_THRESHOLD_CTL:
162 	case CS42L56_LIM_CTL_RELEASE_RATE:
163 	case CS42L56_LIM_ATTACK_RATE:
164 		return true;
165 	default:
166 		return false;
167 	}
168 }
169 
170 static bool cs42l56_volatile_register(struct device *dev, unsigned int reg)
171 {
172 	switch (reg) {
173 	case CS42L56_INT_STATUS:
174 		return 1;
175 	default:
176 		return 0;
177 	}
178 }
179 
180 static DECLARE_TLV_DB_SCALE(beep_tlv, -5000, 200, 0);
181 static DECLARE_TLV_DB_SCALE(hl_tlv, -6000, 50, 0);
182 static DECLARE_TLV_DB_SCALE(adv_tlv, -10200, 50, 0);
183 static DECLARE_TLV_DB_SCALE(adc_tlv, -9600, 100, 0);
184 static DECLARE_TLV_DB_SCALE(tone_tlv, -1050, 150, 0);
185 static DECLARE_TLV_DB_SCALE(preamp_tlv, 0, 1000, 0);
186 static DECLARE_TLV_DB_SCALE(pga_tlv, -600, 50, 0);
187 
188 static const unsigned int ngnb_tlv[] = {
189 	TLV_DB_RANGE_HEAD(2),
190 	0, 1, TLV_DB_SCALE_ITEM(-8200, 600, 0),
191 	2, 5, TLV_DB_SCALE_ITEM(-7600, 300, 0),
192 };
193 static const unsigned int ngb_tlv[] = {
194 	TLV_DB_RANGE_HEAD(2),
195 	0, 2, TLV_DB_SCALE_ITEM(-6400, 600, 0),
196 	3, 7, TLV_DB_SCALE_ITEM(-4600, 300, 0),
197 };
198 static const unsigned int alc_tlv[] = {
199 	TLV_DB_RANGE_HEAD(2),
200 	0, 2, TLV_DB_SCALE_ITEM(-3000, 600, 0),
201 	3, 7, TLV_DB_SCALE_ITEM(-1200, 300, 0),
202 };
203 
204 static const char * const beep_config_text[] = {
205 	"Off", "Single", "Multiple", "Continuous"
206 };
207 
208 static const struct soc_enum beep_config_enum =
209 	SOC_ENUM_SINGLE(CS42L56_BEEP_TONE_CFG, 6,
210 			ARRAY_SIZE(beep_config_text), beep_config_text);
211 
212 static const char * const beep_pitch_text[] = {
213 	"C4", "C5", "D5", "E5", "F5", "G5", "A5", "B5",
214 	"C6", "D6", "E6", "F6", "G6", "A6", "B6", "C7"
215 };
216 
217 static const struct soc_enum beep_pitch_enum =
218 	SOC_ENUM_SINGLE(CS42L56_BEEP_FREQ_ONTIME, 4,
219 			ARRAY_SIZE(beep_pitch_text), beep_pitch_text);
220 
221 static const char * const beep_ontime_text[] = {
222 	"86 ms", "430 ms", "780 ms", "1.20 s", "1.50 s",
223 	"1.80 s", "2.20 s", "2.50 s", "2.80 s", "3.20 s",
224 	"3.50 s", "3.80 s", "4.20 s", "4.50 s", "4.80 s", "5.20 s"
225 };
226 
227 static const struct soc_enum beep_ontime_enum =
228 	SOC_ENUM_SINGLE(CS42L56_BEEP_FREQ_ONTIME, 0,
229 			ARRAY_SIZE(beep_ontime_text), beep_ontime_text);
230 
231 static const char * const beep_offtime_text[] = {
232 	"1.23 s", "2.58 s", "3.90 s", "5.20 s",
233 	"6.60 s", "8.05 s", "9.35 s", "10.80 s"
234 };
235 
236 static const struct soc_enum beep_offtime_enum =
237 	SOC_ENUM_SINGLE(CS42L56_BEEP_FREQ_OFFTIME, 5,
238 			ARRAY_SIZE(beep_offtime_text), beep_offtime_text);
239 
240 static const char * const beep_treble_text[] = {
241 	"5kHz", "7kHz", "10kHz", "15kHz"
242 };
243 
244 static const struct soc_enum beep_treble_enum =
245 	SOC_ENUM_SINGLE(CS42L56_BEEP_TONE_CFG, 3,
246 			ARRAY_SIZE(beep_treble_text), beep_treble_text);
247 
248 static const char * const beep_bass_text[] = {
249 	"50Hz", "100Hz", "200Hz", "250Hz"
250 };
251 
252 static const struct soc_enum beep_bass_enum =
253 	SOC_ENUM_SINGLE(CS42L56_BEEP_TONE_CFG, 1,
254 			ARRAY_SIZE(beep_bass_text), beep_bass_text);
255 
256 static const char * const adc_swap_text[] = {
257 	"None", "A+B/2", "A-B/2", "Swap"
258 };
259 
260 static const struct soc_enum adc_swap_enum =
261 	SOC_ENUM_SINGLE(CS42L56_MISC_ADC_CTL, 3,
262 			ARRAY_SIZE(adc_swap_text), adc_swap_text);
263 
264 static const char * const pgaa_mux_text[] = {
265 	"AIN1A", "AIN2A", "AIN3A"};
266 
267 static const struct soc_enum pgaa_mux_enum =
268 	SOC_ENUM_SINGLE(CS42L56_PGAA_MUX_VOLUME, 0,
269 			      ARRAY_SIZE(pgaa_mux_text),
270 			      pgaa_mux_text);
271 
272 static const struct snd_kcontrol_new pgaa_mux =
273 	SOC_DAPM_ENUM("Route", pgaa_mux_enum);
274 
275 static const char * const pgab_mux_text[] = {
276 	"AIN1B", "AIN2B", "AIN3B"};
277 
278 static const struct soc_enum pgab_mux_enum =
279 	SOC_ENUM_SINGLE(CS42L56_PGAB_MUX_VOLUME, 0,
280 			      ARRAY_SIZE(pgab_mux_text),
281 			      pgab_mux_text);
282 
283 static const struct snd_kcontrol_new pgab_mux =
284 	SOC_DAPM_ENUM("Route", pgab_mux_enum);
285 
286 static const char * const adca_mux_text[] = {
287 	"PGAA", "AIN1A", "AIN2A", "AIN3A"};
288 
289 static const struct soc_enum adca_mux_enum =
290 	SOC_ENUM_SINGLE(CS42L56_AIN_REFCFG_ADC_MUX, 0,
291 			      ARRAY_SIZE(adca_mux_text),
292 			      adca_mux_text);
293 
294 static const struct snd_kcontrol_new adca_mux =
295 	SOC_DAPM_ENUM("Route", adca_mux_enum);
296 
297 static const char * const adcb_mux_text[] = {
298 	"PGAB", "AIN1B", "AIN2B", "AIN3B"};
299 
300 static const struct soc_enum adcb_mux_enum =
301 	SOC_ENUM_SINGLE(CS42L56_AIN_REFCFG_ADC_MUX, 2,
302 			      ARRAY_SIZE(adcb_mux_text),
303 			      adcb_mux_text);
304 
305 static const struct snd_kcontrol_new adcb_mux =
306 	SOC_DAPM_ENUM("Route", adcb_mux_enum);
307 
308 static const char * const left_swap_text[] = {
309 	"Left", "LR 2", "Right"};
310 
311 static const char * const right_swap_text[] = {
312 	"Right", "LR 2", "Left"};
313 
314 static const unsigned int swap_values[] = { 0, 1, 3 };
315 
316 static const struct soc_enum adca_swap_enum =
317 	SOC_VALUE_ENUM_SINGLE(CS42L56_CHAN_MIX_SWAP, 0, 3,
318 			      ARRAY_SIZE(left_swap_text),
319 			      left_swap_text,
320 			      swap_values);
321 
322 static const struct soc_enum pcma_swap_enum =
323 	SOC_VALUE_ENUM_SINGLE(CS42L56_CHAN_MIX_SWAP, 4, 3,
324 			      ARRAY_SIZE(left_swap_text),
325 			      left_swap_text,
326 			      swap_values);
327 
328 static const struct soc_enum adcb_swap_enum =
329 	SOC_VALUE_ENUM_SINGLE(CS42L56_CHAN_MIX_SWAP, 2, 3,
330 			      ARRAY_SIZE(right_swap_text),
331 			      right_swap_text,
332 			      swap_values);
333 
334 static const struct soc_enum pcmb_swap_enum =
335 	SOC_VALUE_ENUM_SINGLE(CS42L56_CHAN_MIX_SWAP, 6, 3,
336 			      ARRAY_SIZE(right_swap_text),
337 			      right_swap_text,
338 			      swap_values);
339 
340 static const struct snd_kcontrol_new hpa_switch =
341 	SOC_DAPM_SINGLE("Switch", CS42L56_PWRCTL_2, 6, 1, 1);
342 
343 static const struct snd_kcontrol_new hpb_switch =
344 	SOC_DAPM_SINGLE("Switch", CS42L56_PWRCTL_2, 4, 1, 1);
345 
346 static const struct snd_kcontrol_new loa_switch =
347 	SOC_DAPM_SINGLE("Switch", CS42L56_PWRCTL_2, 2, 1, 1);
348 
349 static const struct snd_kcontrol_new lob_switch =
350 	SOC_DAPM_SINGLE("Switch", CS42L56_PWRCTL_2, 0, 1, 1);
351 
352 static const char * const hploa_input_text[] = {
353 	"DACA", "PGAA"};
354 
355 static const struct soc_enum lineouta_input_enum =
356 	SOC_ENUM_SINGLE(CS42L56_AMUTE_HPLO_MUX, 2,
357 			      ARRAY_SIZE(hploa_input_text),
358 			      hploa_input_text);
359 
360 static const struct snd_kcontrol_new lineouta_input =
361 	SOC_DAPM_ENUM("Route", lineouta_input_enum);
362 
363 static const struct soc_enum hpa_input_enum =
364 	SOC_ENUM_SINGLE(CS42L56_AMUTE_HPLO_MUX, 0,
365 			      ARRAY_SIZE(hploa_input_text),
366 			      hploa_input_text);
367 
368 static const struct snd_kcontrol_new hpa_input =
369 	SOC_DAPM_ENUM("Route", hpa_input_enum);
370 
371 static const char * const hplob_input_text[] = {
372 	"DACB", "PGAB"};
373 
374 static const struct soc_enum lineoutb_input_enum =
375 	SOC_ENUM_SINGLE(CS42L56_AMUTE_HPLO_MUX, 3,
376 			      ARRAY_SIZE(hplob_input_text),
377 			      hplob_input_text);
378 
379 static const struct snd_kcontrol_new lineoutb_input =
380 	SOC_DAPM_ENUM("Route", lineoutb_input_enum);
381 
382 static const struct soc_enum hpb_input_enum =
383 	SOC_ENUM_SINGLE(CS42L56_AMUTE_HPLO_MUX, 1,
384 			      ARRAY_SIZE(hplob_input_text),
385 			      hplob_input_text);
386 
387 static const struct snd_kcontrol_new hpb_input =
388 	SOC_DAPM_ENUM("Route", hpb_input_enum);
389 
390 static const char * const dig_mux_text[] = {
391 	"ADC", "DSP"};
392 
393 static const struct soc_enum dig_mux_enum =
394 	SOC_ENUM_SINGLE(CS42L56_MISC_CTL, 7,
395 			      ARRAY_SIZE(dig_mux_text),
396 			      dig_mux_text);
397 
398 static const struct snd_kcontrol_new dig_mux =
399 	SOC_DAPM_ENUM("Route", dig_mux_enum);
400 
401 static const char * const hpf_freq_text[] = {
402 	"1.8Hz", "119Hz", "236Hz", "464Hz"
403 };
404 
405 static const struct soc_enum hpfa_freq_enum =
406 	SOC_ENUM_SINGLE(CS42L56_HPF_CTL, 0,
407 			ARRAY_SIZE(hpf_freq_text), hpf_freq_text);
408 
409 static const struct soc_enum hpfb_freq_enum =
410 	SOC_ENUM_SINGLE(CS42L56_HPF_CTL, 2,
411 			ARRAY_SIZE(hpf_freq_text), hpf_freq_text);
412 
413 static const char * const ng_delay_text[] = {
414 	"50ms", "100ms", "150ms", "200ms"
415 };
416 
417 static const struct soc_enum ng_delay_enum =
418 	SOC_ENUM_SINGLE(CS42L56_NOISE_GATE_CTL, 0,
419 			ARRAY_SIZE(ng_delay_text), ng_delay_text);
420 
421 static const struct snd_kcontrol_new cs42l56_snd_controls[] = {
422 
423 	SOC_DOUBLE_R_SX_TLV("Master Volume", CS42L56_MASTER_A_VOLUME,
424 			      CS42L56_MASTER_B_VOLUME, 0, 0x34, 0xfd, adv_tlv),
425 	SOC_DOUBLE("Master Mute Switch", CS42L56_DSP_MUTE_CTL, 0, 1, 1, 1),
426 
427 	SOC_DOUBLE_R_SX_TLV("ADC Mixer Volume", CS42L56_ADCA_MIX_VOLUME,
428 			      CS42L56_ADCB_MIX_VOLUME, 0, 0x88, 0xa9, hl_tlv),
429 	SOC_DOUBLE("ADC Mixer Mute Switch", CS42L56_DSP_MUTE_CTL, 6, 7, 1, 1),
430 
431 	SOC_DOUBLE_R_SX_TLV("PCM Mixer Volume", CS42L56_PCMA_MIX_VOLUME,
432 			      CS42L56_PCMB_MIX_VOLUME, 0, 0x88, 0xa9, hl_tlv),
433 	SOC_DOUBLE("PCM Mixer Mute Switch", CS42L56_DSP_MUTE_CTL, 4, 5, 1, 1),
434 
435 	SOC_SINGLE_TLV("Analog Advisory Volume",
436 			  CS42L56_ANAINPUT_ADV_VOLUME, 0, 0x00, 1, adv_tlv),
437 	SOC_SINGLE_TLV("Digital Advisory Volume",
438 			  CS42L56_DIGINPUT_ADV_VOLUME, 0, 0x00, 1, adv_tlv),
439 
440 	SOC_DOUBLE_R_SX_TLV("PGA Volume", CS42L56_PGAA_MUX_VOLUME,
441 			      CS42L56_PGAB_MUX_VOLUME, 0, 0x34, 0xfd, pga_tlv),
442 	SOC_DOUBLE_R_TLV("ADC Volume", CS42L56_ADCA_ATTENUATOR,
443 			      CS42L56_ADCB_ATTENUATOR, 0, 0x00, 1, adc_tlv),
444 	SOC_DOUBLE("ADC Mute Switch", CS42L56_MISC_ADC_CTL, 2, 3, 1, 1),
445 	SOC_DOUBLE("ADC Boost Switch", CS42L56_GAIN_BIAS_CTL, 3, 2, 1, 1),
446 
447 	SOC_DOUBLE_R_SX_TLV("Headphone Volume", CS42L56_HPA_VOLUME,
448 			      CS42L56_HPA_VOLUME, 0, 0x44, 0x55, hl_tlv),
449 	SOC_DOUBLE_R_SX_TLV("LineOut Volume", CS42L56_LOA_VOLUME,
450 			      CS42L56_LOA_VOLUME, 0, 0x44, 0x55, hl_tlv),
451 
452 	SOC_SINGLE_TLV("Bass Shelving Volume", CS42L56_TONE_CTL,
453 			0, 0x00, 1, tone_tlv),
454 	SOC_SINGLE_TLV("Treble Shelving Volume", CS42L56_TONE_CTL,
455 			4, 0x00, 1, tone_tlv),
456 
457 	SOC_DOUBLE_TLV("PGA Preamp Volume", CS42L56_GAIN_BIAS_CTL,
458 			4, 6, 0x02, 1, preamp_tlv),
459 
460 	SOC_SINGLE("DSP Switch", CS42L56_PLAYBACK_CTL, 7, 1, 1),
461 	SOC_SINGLE("Gang Playback Switch", CS42L56_PLAYBACK_CTL, 4, 1, 1),
462 	SOC_SINGLE("Gang ADC Switch", CS42L56_MISC_ADC_CTL, 7, 1, 1),
463 	SOC_SINGLE("Gang PGA Switch", CS42L56_MISC_ADC_CTL, 6, 1, 1),
464 
465 	SOC_SINGLE("PCMA Invert", CS42L56_PLAYBACK_CTL, 2, 1, 1),
466 	SOC_SINGLE("PCMB Invert", CS42L56_PLAYBACK_CTL, 3, 1, 1),
467 	SOC_SINGLE("ADCA Invert", CS42L56_MISC_ADC_CTL, 2, 1, 1),
468 	SOC_SINGLE("ADCB Invert", CS42L56_MISC_ADC_CTL, 3, 1, 1),
469 
470 	SOC_ENUM("PCMA Swap", pcma_swap_enum),
471 	SOC_ENUM("PCMB Swap", pcmb_swap_enum),
472 	SOC_ENUM("ADCA Swap", adca_swap_enum),
473 	SOC_ENUM("ADCB Swap", adcb_swap_enum),
474 
475 	SOC_DOUBLE("HPF Switch", CS42L56_HPF_CTL, 5, 7, 1, 1),
476 	SOC_DOUBLE("HPF Freeze Switch", CS42L56_HPF_CTL, 4, 6, 1, 1),
477 	SOC_ENUM("HPFA Corner Freq", hpfa_freq_enum),
478 	SOC_ENUM("HPFB Corner Freq", hpfb_freq_enum),
479 
480 	SOC_SINGLE("Analog Soft Ramp", CS42L56_MISC_CTL, 4, 1, 1),
481 	SOC_DOUBLE("Analog Soft Ramp Disable", CS42L56_ALC_LIM_SFT_ZC,
482 		7, 5, 1, 1),
483 	SOC_SINGLE("Analog Zero Cross", CS42L56_MISC_CTL, 3, 1, 1),
484 	SOC_DOUBLE("Analog Zero Cross Disable", CS42L56_ALC_LIM_SFT_ZC,
485 		6, 4, 1, 1),
486 	SOC_SINGLE("Digital Soft Ramp", CS42L56_MISC_CTL, 2, 1, 1),
487 	SOC_SINGLE("Digital Soft Ramp Disable", CS42L56_ALC_LIM_SFT_ZC,
488 		3, 1, 1),
489 
490 	SOC_SINGLE("HL Deemphasis", CS42L56_PLAYBACK_CTL, 6, 1, 1),
491 
492 	SOC_SINGLE("ALC Switch", CS42L56_ALC_EN_ATTACK_RATE, 6, 1, 1),
493 	SOC_SINGLE("ALC Limit All Switch", CS42L56_ALC_RELEASE_RATE, 7, 1, 1),
494 	SOC_SINGLE_RANGE("ALC Attack", CS42L56_ALC_EN_ATTACK_RATE,
495 			0, 0, 0x3f, 0),
496 	SOC_SINGLE_RANGE("ALC Release", CS42L56_ALC_RELEASE_RATE,
497 			0, 0x3f, 0, 0),
498 	SOC_SINGLE_TLV("ALC MAX", CS42L56_ALC_THRESHOLD,
499 			5, 0x07, 1, alc_tlv),
500 	SOC_SINGLE_TLV("ALC MIN", CS42L56_ALC_THRESHOLD,
501 			2, 0x07, 1, alc_tlv),
502 
503 	SOC_SINGLE("Limiter Switch", CS42L56_LIM_CTL_RELEASE_RATE, 7, 1, 1),
504 	SOC_SINGLE("Limit All Switch", CS42L56_LIM_CTL_RELEASE_RATE, 6, 1, 1),
505 	SOC_SINGLE_RANGE("Limiter Attack", CS42L56_LIM_ATTACK_RATE,
506 			0, 0, 0x3f, 0),
507 	SOC_SINGLE_RANGE("Limiter Release", CS42L56_LIM_CTL_RELEASE_RATE,
508 			0, 0x3f, 0, 0),
509 	SOC_SINGLE_TLV("Limiter MAX", CS42L56_LIM_THRESHOLD_CTL,
510 			5, 0x07, 1, alc_tlv),
511 	SOC_SINGLE_TLV("Limiter Cushion", CS42L56_ALC_THRESHOLD,
512 			2, 0x07, 1, alc_tlv),
513 
514 	SOC_SINGLE("NG Switch", CS42L56_NOISE_GATE_CTL, 6, 1, 1),
515 	SOC_SINGLE("NG All Switch", CS42L56_NOISE_GATE_CTL, 7, 1, 1),
516 	SOC_SINGLE("NG Boost Switch", CS42L56_NOISE_GATE_CTL, 5, 1, 1),
517 	SOC_SINGLE_TLV("NG Unboost Threshold", CS42L56_NOISE_GATE_CTL,
518 			2, 0x07, 1, ngnb_tlv),
519 	SOC_SINGLE_TLV("NG Boost Threshold", CS42L56_NOISE_GATE_CTL,
520 			2, 0x07, 1, ngb_tlv),
521 	SOC_ENUM("NG Delay", ng_delay_enum),
522 
523 	SOC_ENUM("Beep Config", beep_config_enum),
524 	SOC_ENUM("Beep Pitch", beep_pitch_enum),
525 	SOC_ENUM("Beep on Time", beep_ontime_enum),
526 	SOC_ENUM("Beep off Time", beep_offtime_enum),
527 	SOC_SINGLE_SX_TLV("Beep Volume", CS42L56_BEEP_FREQ_OFFTIME,
528 			0, 0x07, 0x23, beep_tlv),
529 	SOC_SINGLE("Beep Tone Ctl Switch", CS42L56_BEEP_TONE_CFG, 0, 1, 1),
530 	SOC_ENUM("Beep Treble Corner Freq", beep_treble_enum),
531 	SOC_ENUM("Beep Bass Corner Freq", beep_bass_enum),
532 
533 };
534 
535 static const struct snd_soc_dapm_widget cs42l56_dapm_widgets[] = {
536 
537 	SND_SOC_DAPM_SIGGEN("Beep"),
538 	SND_SOC_DAPM_SUPPLY("VBUF", CS42L56_PWRCTL_1, 5, 1, NULL, 0),
539 	SND_SOC_DAPM_MICBIAS("MIC1 Bias", CS42L56_PWRCTL_1, 4, 1),
540 	SND_SOC_DAPM_SUPPLY("Charge Pump", CS42L56_PWRCTL_1, 3, 1, NULL, 0),
541 
542 	SND_SOC_DAPM_INPUT("AIN1A"),
543 	SND_SOC_DAPM_INPUT("AIN2A"),
544 	SND_SOC_DAPM_INPUT("AIN1B"),
545 	SND_SOC_DAPM_INPUT("AIN2B"),
546 	SND_SOC_DAPM_INPUT("AIN3A"),
547 	SND_SOC_DAPM_INPUT("AIN3B"),
548 
549 	SND_SOC_DAPM_AIF_OUT("SDOUT", NULL,  0,
550 			SND_SOC_NOPM, 0, 0),
551 
552 	SND_SOC_DAPM_AIF_IN("SDIN", NULL,  0,
553 			SND_SOC_NOPM, 0, 0),
554 
555 	SND_SOC_DAPM_MUX("Digital Output Mux", SND_SOC_NOPM,
556 			 0, 0, &dig_mux),
557 
558 	SND_SOC_DAPM_PGA("PGAA", SND_SOC_NOPM, 0, 0, NULL, 0),
559 	SND_SOC_DAPM_PGA("PGAB", SND_SOC_NOPM, 0, 0, NULL, 0),
560 	SND_SOC_DAPM_MUX("PGAA Input Mux",
561 			SND_SOC_NOPM, 0, 0, &pgaa_mux),
562 	SND_SOC_DAPM_MUX("PGAB Input Mux",
563 			SND_SOC_NOPM, 0, 0, &pgab_mux),
564 
565 	SND_SOC_DAPM_MUX("ADCA Mux", SND_SOC_NOPM,
566 			 0, 0, &adca_mux),
567 	SND_SOC_DAPM_MUX("ADCB Mux", SND_SOC_NOPM,
568 			 0, 0, &adcb_mux),
569 
570 	SND_SOC_DAPM_ADC("ADCA", NULL, CS42L56_PWRCTL_1, 1, 1),
571 	SND_SOC_DAPM_ADC("ADCB", NULL, CS42L56_PWRCTL_1, 2, 1),
572 
573 	SND_SOC_DAPM_DAC("DACA", NULL, SND_SOC_NOPM, 0, 0),
574 	SND_SOC_DAPM_DAC("DACB", NULL, SND_SOC_NOPM, 0, 0),
575 
576 	SND_SOC_DAPM_OUTPUT("HPA"),
577 	SND_SOC_DAPM_OUTPUT("LOA"),
578 	SND_SOC_DAPM_OUTPUT("HPB"),
579 	SND_SOC_DAPM_OUTPUT("LOB"),
580 
581 	SND_SOC_DAPM_SWITCH("Headphone Right",
582 			    CS42L56_PWRCTL_2, 4, 1, &hpb_switch),
583 	SND_SOC_DAPM_SWITCH("Headphone Left",
584 			    CS42L56_PWRCTL_2, 6, 1, &hpa_switch),
585 
586 	SND_SOC_DAPM_SWITCH("Lineout Right",
587 			    CS42L56_PWRCTL_2, 0, 1, &lob_switch),
588 	SND_SOC_DAPM_SWITCH("Lineout Left",
589 			    CS42L56_PWRCTL_2, 2, 1, &loa_switch),
590 
591 	SND_SOC_DAPM_MUX("LINEOUTA Input Mux", SND_SOC_NOPM,
592 			 0, 0, &lineouta_input),
593 	SND_SOC_DAPM_MUX("LINEOUTB Input Mux", SND_SOC_NOPM,
594 			 0, 0, &lineoutb_input),
595 	SND_SOC_DAPM_MUX("HPA Input Mux", SND_SOC_NOPM,
596 			 0, 0, &hpa_input),
597 	SND_SOC_DAPM_MUX("HPB Input Mux", SND_SOC_NOPM,
598 			 0, 0, &hpb_input),
599 
600 };
601 
602 static const struct snd_soc_dapm_route cs42l56_audio_map[] = {
603 
604 	{"HiFi Capture", "DSP", "Digital Output Mux"},
605 	{"HiFi Capture", "ADC", "Digital Output Mux"},
606 
607 	{"Digital Output Mux", NULL, "ADCA"},
608 	{"Digital Output Mux", NULL, "ADCB"},
609 
610 	{"ADCB", NULL, "ADCB Mux"},
611 	{"ADCA", NULL, "ADCA Mux"},
612 
613 	{"ADCA Mux", NULL, "AIN3A"},
614 	{"ADCA Mux", NULL, "AIN2A"},
615 	{"ADCA Mux", NULL, "AIN1A"},
616 	{"ADCA Mux", NULL, "PGAA"},
617 	{"ADCB Mux", NULL, "AIN3B"},
618 	{"ADCB Mux", NULL, "AIN2B"},
619 	{"ADCB Mux", NULL, "AIN1B"},
620 	{"ADCB Mux", NULL, "PGAB"},
621 
622 	{"PGAA", "AIN1A", "PGAA Input Mux"},
623 	{"PGAA", "AIN2A", "PGAA Input Mux"},
624 	{"PGAA", "AIN3A", "PGAA Input Mux"},
625 	{"PGAB", "AIN1B", "PGAB Input Mux"},
626 	{"PGAB", "AIN2B", "PGAB Input Mux"},
627 	{"PGAB", "AIN3B", "PGAB Input Mux"},
628 
629 	{"PGAA Input Mux", NULL, "AIN1A"},
630 	{"PGAA Input Mux", NULL, "AIN2A"},
631 	{"PGAA Input Mux", NULL, "AIN3A"},
632 	{"PGAB Input Mux", NULL, "AIN1B"},
633 	{"PGAB Input Mux", NULL, "AIN2B"},
634 	{"PGAB Input Mux", NULL, "AIN3B"},
635 
636 	{"LOB", NULL, "Lineout Right"},
637 	{"LOA", NULL, "Lineout Left"},
638 
639 	{"Lineout Right", "Switch", "LINEOUTB Input Mux"},
640 	{"Lineout Left", "Switch", "LINEOUTA Input Mux"},
641 
642 	{"LINEOUTA Input Mux", "PGAA", "PGAA"},
643 	{"LINEOUTB Input Mux", "PGAB", "PGAB"},
644 	{"LINEOUTA Input Mux", "DACA", "DACA"},
645 	{"LINEOUTB Input Mux", "DACB", "DACB"},
646 
647 	{"HPA", NULL, "Headphone Left"},
648 	{"HPB", NULL, "Headphone Right"},
649 
650 	{"Headphone Right", "Switch", "HPB Input Mux"},
651 	{"Headphone Left", "Switch", "HPA Input Mux"},
652 
653 	{"HPA Input Mux", "PGAA", "PGAA"},
654 	{"HPB Input Mux", "PGAB", "PGAB"},
655 	{"HPA Input Mux", "DACA", "DACA"},
656 	{"HPB Input Mux", "DACB", "DACB"},
657 
658 	{"DACB", NULL, "HiFi Playback"},
659 	{"DACA", NULL, "HiFi Playback"},
660 
661 };
662 
663 struct cs42l56_clk_para {
664 	u32 mclk;
665 	u32 srate;
666 	u8 ratio;
667 };
668 
669 static const struct cs42l56_clk_para clk_ratio_table[] = {
670 	/* 8k */
671 	{ 6000000, 8000, CS42L56_MCLK_LRCLK_768 },
672 	{ 6144000, 8000, CS42L56_MCLK_LRCLK_750 },
673 	{ 12000000, 8000, CS42L56_MCLK_LRCLK_768 },
674 	{ 12288000, 8000, CS42L56_MCLK_LRCLK_750 },
675 	{ 24000000, 8000, CS42L56_MCLK_LRCLK_768 },
676 	{ 24576000, 8000, CS42L56_MCLK_LRCLK_750 },
677 	/* 11.025k */
678 	{ 5644800, 11025, CS42L56_MCLK_LRCLK_512},
679 	{ 11289600, 11025, CS42L56_MCLK_LRCLK_512},
680 	{ 22579200, 11025, CS42L56_MCLK_LRCLK_512 },
681 	/* 11.0294k */
682 	{ 6000000, 110294, CS42L56_MCLK_LRCLK_544 },
683 	{ 12000000, 110294, CS42L56_MCLK_LRCLK_544 },
684 	{ 24000000, 110294, CS42L56_MCLK_LRCLK_544 },
685 	/* 12k */
686 	{ 6000000, 12000, CS42L56_MCLK_LRCLK_500 },
687 	{ 6144000, 12000, CS42L56_MCLK_LRCLK_512 },
688 	{ 12000000, 12000, CS42L56_MCLK_LRCLK_500 },
689 	{ 12288000, 12000, CS42L56_MCLK_LRCLK_512 },
690 	{ 24000000, 12000, CS42L56_MCLK_LRCLK_500 },
691 	{ 24576000, 12000, CS42L56_MCLK_LRCLK_512 },
692 	/* 16k */
693 	{ 6000000, 16000, CS42L56_MCLK_LRCLK_375 },
694 	{ 6144000, 16000, CS42L56_MCLK_LRCLK_384 },
695 	{ 12000000, 16000, CS42L56_MCLK_LRCLK_375 },
696 	{ 12288000, 16000, CS42L56_MCLK_LRCLK_384 },
697 	{ 24000000, 16000, CS42L56_MCLK_LRCLK_375 },
698 	{ 24576000, 16000, CS42L56_MCLK_LRCLK_384 },
699 	/* 22.050k */
700 	{ 5644800, 22050, CS42L56_MCLK_LRCLK_256 },
701 	{ 11289600, 22050, CS42L56_MCLK_LRCLK_256 },
702 	{ 22579200, 22050, CS42L56_MCLK_LRCLK_256 },
703 	/* 22.0588k */
704 	{ 6000000, 220588, CS42L56_MCLK_LRCLK_272 },
705 	{ 12000000, 220588, CS42L56_MCLK_LRCLK_272 },
706 	{ 24000000, 220588, CS42L56_MCLK_LRCLK_272 },
707 	/* 24k */
708 	{ 6000000, 24000, CS42L56_MCLK_LRCLK_250 },
709 	{ 6144000, 24000, CS42L56_MCLK_LRCLK_256 },
710 	{ 12000000, 24000, CS42L56_MCLK_LRCLK_250 },
711 	{ 12288000, 24000, CS42L56_MCLK_LRCLK_256 },
712 	{ 24000000, 24000, CS42L56_MCLK_LRCLK_250 },
713 	{ 24576000, 24000, CS42L56_MCLK_LRCLK_256 },
714 	/* 32k */
715 	{ 6000000, 32000, CS42L56_MCLK_LRCLK_187P5 },
716 	{ 6144000, 32000, CS42L56_MCLK_LRCLK_192 },
717 	{ 12000000, 32000, CS42L56_MCLK_LRCLK_187P5 },
718 	{ 12288000, 32000, CS42L56_MCLK_LRCLK_192 },
719 	{ 24000000, 32000, CS42L56_MCLK_LRCLK_187P5 },
720 	{ 24576000, 32000, CS42L56_MCLK_LRCLK_192 },
721 	/* 44.118k */
722 	{ 6000000, 44118, CS42L56_MCLK_LRCLK_136 },
723 	{ 12000000, 44118, CS42L56_MCLK_LRCLK_136 },
724 	{ 24000000, 44118, CS42L56_MCLK_LRCLK_136 },
725 	/* 44.1k */
726 	{ 5644800, 44100, CS42L56_MCLK_LRCLK_128 },
727 	{ 11289600, 44100, CS42L56_MCLK_LRCLK_128 },
728 	{ 22579200, 44100, CS42L56_MCLK_LRCLK_128 },
729 	/* 48k */
730 	{ 6000000, 48000, CS42L56_MCLK_LRCLK_125 },
731 	{ 6144000, 48000, CS42L56_MCLK_LRCLK_128 },
732 	{ 12000000, 48000, CS42L56_MCLK_LRCLK_125 },
733 	{ 12288000, 48000, CS42L56_MCLK_LRCLK_128 },
734 	{ 24000000, 48000, CS42L56_MCLK_LRCLK_125 },
735 	{ 24576000, 48000, CS42L56_MCLK_LRCLK_128 },
736 };
737 
738 static int cs42l56_get_mclk_ratio(int mclk, int rate)
739 {
740 	int i;
741 
742 	for (i = 0; i < ARRAY_SIZE(clk_ratio_table); i++) {
743 		if (clk_ratio_table[i].mclk == mclk &&
744 		    clk_ratio_table[i].srate == rate)
745 			return clk_ratio_table[i].ratio;
746 	}
747 	return -EINVAL;
748 }
749 
750 static int cs42l56_set_sysclk(struct snd_soc_dai *codec_dai,
751 			int clk_id, unsigned int freq, int dir)
752 {
753 	struct snd_soc_codec *codec = codec_dai->codec;
754 	struct cs42l56_private *cs42l56 = snd_soc_codec_get_drvdata(codec);
755 
756 	switch (freq) {
757 	case CS42L56_MCLK_5P6448MHZ:
758 	case CS42L56_MCLK_6MHZ:
759 	case CS42L56_MCLK_6P144MHZ:
760 		cs42l56->mclk_div2 = 0;
761 		cs42l56->mclk_prediv = 0;
762 		break;
763 	case CS42L56_MCLK_11P2896MHZ:
764 	case CS42L56_MCLK_12MHZ:
765 	case CS42L56_MCLK_12P288MHZ:
766 		cs42l56->mclk_div2 = CS42L56_MCLK_DIV2;
767 		cs42l56->mclk_prediv = 0;
768 		break;
769 	case CS42L56_MCLK_22P5792MHZ:
770 	case CS42L56_MCLK_24MHZ:
771 	case CS42L56_MCLK_24P576MHZ:
772 		cs42l56->mclk_div2 = CS42L56_MCLK_DIV2;
773 		cs42l56->mclk_prediv = CS42L56_MCLK_PREDIV;
774 		break;
775 	default:
776 		return -EINVAL;
777 	}
778 	cs42l56->mclk = freq;
779 
780 	snd_soc_update_bits(codec, CS42L56_CLKCTL_1,
781 			    CS42L56_MCLK_PREDIV_MASK,
782 				cs42l56->mclk_prediv);
783 	snd_soc_update_bits(codec, CS42L56_CLKCTL_1,
784 			    CS42L56_MCLK_DIV2_MASK,
785 				cs42l56->mclk_div2);
786 
787 	return 0;
788 }
789 
790 static int cs42l56_set_dai_fmt(struct snd_soc_dai *codec_dai, unsigned int fmt)
791 {
792 	struct snd_soc_codec *codec = codec_dai->codec;
793 	struct cs42l56_private *cs42l56 = snd_soc_codec_get_drvdata(codec);
794 
795 	switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) {
796 	case SND_SOC_DAIFMT_CBM_CFM:
797 		cs42l56->iface = CS42L56_MASTER_MODE;
798 		break;
799 	case SND_SOC_DAIFMT_CBS_CFS:
800 		cs42l56->iface = CS42L56_SLAVE_MODE;
801 		break;
802 	default:
803 		return -EINVAL;
804 	}
805 
806 	 /* interface format */
807 	switch (fmt & SND_SOC_DAIFMT_FORMAT_MASK) {
808 	case SND_SOC_DAIFMT_I2S:
809 		cs42l56->iface_fmt = CS42L56_DIG_FMT_I2S;
810 		break;
811 	case SND_SOC_DAIFMT_LEFT_J:
812 		cs42l56->iface_fmt = CS42L56_DIG_FMT_LEFT_J;
813 		break;
814 	default:
815 		return -EINVAL;
816 	}
817 
818 	/* sclk inversion */
819 	switch (fmt & SND_SOC_DAIFMT_INV_MASK) {
820 	case SND_SOC_DAIFMT_NB_NF:
821 		cs42l56->iface_inv = 0;
822 		break;
823 	case SND_SOC_DAIFMT_IB_NF:
824 		cs42l56->iface_inv = CS42L56_SCLK_INV;
825 		break;
826 	default:
827 		return -EINVAL;
828 	}
829 
830 	snd_soc_update_bits(codec, CS42L56_CLKCTL_1,
831 			    CS42L56_MS_MODE_MASK, cs42l56->iface);
832 	snd_soc_update_bits(codec, CS42L56_SERIAL_FMT,
833 			    CS42L56_DIG_FMT_MASK, cs42l56->iface_fmt);
834 	snd_soc_update_bits(codec, CS42L56_CLKCTL_1,
835 			    CS42L56_SCLK_INV_MASK, cs42l56->iface_inv);
836 	return 0;
837 }
838 
839 static int cs42l56_digital_mute(struct snd_soc_dai *dai, int mute)
840 {
841 	struct snd_soc_codec *codec = dai->codec;
842 
843 	if (mute) {
844 		/* Hit the DSP Mixer first */
845 		snd_soc_update_bits(codec, CS42L56_DSP_MUTE_CTL,
846 				    CS42L56_ADCAMIX_MUTE_MASK |
847 				    CS42L56_ADCBMIX_MUTE_MASK |
848 				    CS42L56_PCMAMIX_MUTE_MASK |
849 				    CS42L56_PCMBMIX_MUTE_MASK |
850 				    CS42L56_MSTB_MUTE_MASK |
851 				    CS42L56_MSTA_MUTE_MASK,
852 				    CS42L56_MUTE_ALL);
853 		/* Mute ADC's */
854 		snd_soc_update_bits(codec, CS42L56_MISC_ADC_CTL,
855 				    CS42L56_ADCA_MUTE_MASK |
856 				    CS42L56_ADCB_MUTE_MASK,
857 				    CS42L56_MUTE_ALL);
858 		/* HP And LO */
859 		snd_soc_update_bits(codec, CS42L56_HPA_VOLUME,
860 				    CS42L56_HP_MUTE_MASK, CS42L56_MUTE_ALL);
861 		snd_soc_update_bits(codec, CS42L56_HPB_VOLUME,
862 				    CS42L56_HP_MUTE_MASK, CS42L56_MUTE_ALL);
863 		snd_soc_update_bits(codec, CS42L56_LOA_VOLUME,
864 				    CS42L56_LO_MUTE_MASK, CS42L56_MUTE_ALL);
865 		snd_soc_update_bits(codec, CS42L56_LOB_VOLUME,
866 				    CS42L56_LO_MUTE_MASK, CS42L56_MUTE_ALL);
867 	} else {
868 		snd_soc_update_bits(codec, CS42L56_DSP_MUTE_CTL,
869 				    CS42L56_ADCAMIX_MUTE_MASK |
870 				    CS42L56_ADCBMIX_MUTE_MASK |
871 				    CS42L56_PCMAMIX_MUTE_MASK |
872 				    CS42L56_PCMBMIX_MUTE_MASK |
873 				    CS42L56_MSTB_MUTE_MASK |
874 				    CS42L56_MSTA_MUTE_MASK,
875 				    CS42L56_UNMUTE);
876 
877 		snd_soc_update_bits(codec, CS42L56_MISC_ADC_CTL,
878 				    CS42L56_ADCA_MUTE_MASK |
879 				    CS42L56_ADCB_MUTE_MASK,
880 				    CS42L56_UNMUTE);
881 
882 		snd_soc_update_bits(codec, CS42L56_HPA_VOLUME,
883 				    CS42L56_HP_MUTE_MASK, CS42L56_UNMUTE);
884 		snd_soc_update_bits(codec, CS42L56_HPB_VOLUME,
885 				    CS42L56_HP_MUTE_MASK, CS42L56_UNMUTE);
886 		snd_soc_update_bits(codec, CS42L56_LOA_VOLUME,
887 				    CS42L56_LO_MUTE_MASK, CS42L56_UNMUTE);
888 		snd_soc_update_bits(codec, CS42L56_LOB_VOLUME,
889 				    CS42L56_LO_MUTE_MASK, CS42L56_UNMUTE);
890 	}
891 	return 0;
892 }
893 
894 static int cs42l56_pcm_hw_params(struct snd_pcm_substream *substream,
895 				     struct snd_pcm_hw_params *params,
896 				     struct snd_soc_dai *dai)
897 {
898 	struct snd_soc_codec *codec = dai->codec;
899 	struct cs42l56_private *cs42l56 = snd_soc_codec_get_drvdata(codec);
900 	int ratio;
901 
902 	ratio = cs42l56_get_mclk_ratio(cs42l56->mclk, params_rate(params));
903 	if (ratio >= 0) {
904 		snd_soc_update_bits(codec, CS42L56_CLKCTL_2,
905 				    CS42L56_CLK_RATIO_MASK, ratio);
906 	} else {
907 		dev_err(codec->dev, "unsupported mclk/sclk/lrclk ratio\n");
908 		return -EINVAL;
909 	}
910 
911 	return 0;
912 }
913 
914 static int cs42l56_set_bias_level(struct snd_soc_codec *codec,
915 					enum snd_soc_bias_level level)
916 {
917 	struct cs42l56_private *cs42l56 = snd_soc_codec_get_drvdata(codec);
918 	int ret;
919 
920 	switch (level) {
921 	case SND_SOC_BIAS_ON:
922 		break;
923 	case SND_SOC_BIAS_PREPARE:
924 		snd_soc_update_bits(codec, CS42L56_CLKCTL_1,
925 				    CS42L56_MCLK_DIS_MASK, 0);
926 		snd_soc_update_bits(codec, CS42L56_PWRCTL_1,
927 				    CS42L56_PDN_ALL_MASK, 0);
928 		break;
929 	case SND_SOC_BIAS_STANDBY:
930 		if (codec->dapm.bias_level == SND_SOC_BIAS_OFF) {
931 			regcache_cache_only(cs42l56->regmap, false);
932 			regcache_sync(cs42l56->regmap);
933 			ret = regulator_bulk_enable(ARRAY_SIZE(cs42l56->supplies),
934 						    cs42l56->supplies);
935 			if (ret != 0) {
936 				dev_err(cs42l56->dev,
937 					"Failed to enable regulators: %d\n",
938 					ret);
939 				return ret;
940 			}
941 		}
942 		snd_soc_update_bits(codec, CS42L56_PWRCTL_1,
943 				    CS42L56_PDN_ALL_MASK, 1);
944 		break;
945 	case SND_SOC_BIAS_OFF:
946 		snd_soc_update_bits(codec, CS42L56_PWRCTL_1,
947 				    CS42L56_PDN_ALL_MASK, 1);
948 		snd_soc_update_bits(codec, CS42L56_CLKCTL_1,
949 				    CS42L56_MCLK_DIS_MASK, 1);
950 		regcache_cache_only(cs42l56->regmap, true);
951 		regulator_bulk_disable(ARRAY_SIZE(cs42l56->supplies),
952 						    cs42l56->supplies);
953 		break;
954 	}
955 	codec->dapm.bias_level = level;
956 
957 	return 0;
958 }
959 
960 #define CS42L56_RATES (SNDRV_PCM_RATE_8000_48000)
961 
962 #define CS42L56_FORMATS (SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S18_3LE | \
963 			SNDRV_PCM_FMTBIT_S20_3LE | SNDRV_PCM_FMTBIT_S24_LE | \
964 			SNDRV_PCM_FMTBIT_S32_LE)
965 
966 
967 static struct snd_soc_dai_ops cs42l56_ops = {
968 	.hw_params	= cs42l56_pcm_hw_params,
969 	.digital_mute	= cs42l56_digital_mute,
970 	.set_fmt	= cs42l56_set_dai_fmt,
971 	.set_sysclk	= cs42l56_set_sysclk,
972 };
973 
974 static struct snd_soc_dai_driver cs42l56_dai = {
975 		.name = "cs42l56",
976 		.playback = {
977 			.stream_name = "HiFi Playback",
978 			.channels_min = 1,
979 			.channels_max = 2,
980 			.rates = CS42L56_RATES,
981 			.formats = CS42L56_FORMATS,
982 		},
983 		.capture = {
984 			.stream_name = "HiFi Capture",
985 			.channels_min = 1,
986 			.channels_max = 2,
987 			.rates = CS42L56_RATES,
988 			.formats = CS42L56_FORMATS,
989 		},
990 		.ops = &cs42l56_ops,
991 };
992 
993 static int cs42l56_suspend(struct snd_soc_codec *codec)
994 {
995 	cs42l56_set_bias_level(codec, SND_SOC_BIAS_OFF);
996 
997 	return 0;
998 }
999 
1000 static int cs42l56_resume(struct snd_soc_codec *codec)
1001 {
1002 	cs42l56_set_bias_level(codec, SND_SOC_BIAS_STANDBY);
1003 
1004 	return 0;
1005 }
1006 
1007 static int beep_freq[] = {
1008 	261, 522, 585, 667, 706, 774, 889, 1000,
1009 	1043, 1200, 1333, 1412, 1600, 1714, 2000, 2182
1010 };
1011 
1012 static void cs42l56_beep_work(struct work_struct *work)
1013 {
1014 	struct cs42l56_private *cs42l56 =
1015 		container_of(work, struct cs42l56_private, beep_work);
1016 	struct snd_soc_codec *codec = cs42l56->codec;
1017 	struct snd_soc_dapm_context *dapm = &codec->dapm;
1018 	int i;
1019 	int val = 0;
1020 	int best = 0;
1021 
1022 	if (cs42l56->beep_rate) {
1023 		for (i = 0; i < ARRAY_SIZE(beep_freq); i++) {
1024 			if (abs(cs42l56->beep_rate - beep_freq[i]) <
1025 			    abs(cs42l56->beep_rate - beep_freq[best]))
1026 				best = i;
1027 		}
1028 
1029 		dev_dbg(codec->dev, "Set beep rate %dHz for requested %dHz\n",
1030 			beep_freq[best], cs42l56->beep_rate);
1031 
1032 		val = (best << CS42L56_BEEP_RATE_SHIFT);
1033 
1034 		snd_soc_dapm_enable_pin(dapm, "Beep");
1035 	} else {
1036 		dev_dbg(codec->dev, "Disabling beep\n");
1037 		snd_soc_dapm_disable_pin(dapm, "Beep");
1038 	}
1039 
1040 	snd_soc_update_bits(codec, CS42L56_BEEP_FREQ_ONTIME,
1041 			    CS42L56_BEEP_FREQ_MASK, val);
1042 
1043 	snd_soc_dapm_sync(dapm);
1044 }
1045 
1046 /* For usability define a way of injecting beep events for the device -
1047  * many systems will not have a keyboard.
1048  */
1049 static int cs42l56_beep_event(struct input_dev *dev, unsigned int type,
1050 			     unsigned int code, int hz)
1051 {
1052 	struct snd_soc_codec *codec = input_get_drvdata(dev);
1053 	struct cs42l56_private *cs42l56 = snd_soc_codec_get_drvdata(codec);
1054 
1055 	dev_dbg(codec->dev, "Beep event %x %x\n", code, hz);
1056 
1057 	switch (code) {
1058 	case SND_BELL:
1059 		if (hz)
1060 			hz = 261;
1061 	case SND_TONE:
1062 		break;
1063 	default:
1064 		return -1;
1065 	}
1066 
1067 	/* Kick the beep from a workqueue */
1068 	cs42l56->beep_rate = hz;
1069 	schedule_work(&cs42l56->beep_work);
1070 	return 0;
1071 }
1072 
1073 static ssize_t cs42l56_beep_set(struct device *dev,
1074 			       struct device_attribute *attr,
1075 			       const char *buf, size_t count)
1076 {
1077 	struct cs42l56_private *cs42l56 = dev_get_drvdata(dev);
1078 	long int time;
1079 	int ret;
1080 
1081 	ret = kstrtol(buf, 10, &time);
1082 	if (ret != 0)
1083 		return ret;
1084 
1085 	input_event(cs42l56->beep, EV_SND, SND_TONE, time);
1086 
1087 	return count;
1088 }
1089 
1090 static DEVICE_ATTR(beep, 0200, NULL, cs42l56_beep_set);
1091 
1092 static void cs42l56_init_beep(struct snd_soc_codec *codec)
1093 {
1094 	struct cs42l56_private *cs42l56 = snd_soc_codec_get_drvdata(codec);
1095 	int ret;
1096 
1097 	cs42l56->beep = devm_input_allocate_device(codec->dev);
1098 	if (!cs42l56->beep) {
1099 		dev_err(codec->dev, "Failed to allocate beep device\n");
1100 		return;
1101 	}
1102 
1103 	INIT_WORK(&cs42l56->beep_work, cs42l56_beep_work);
1104 	cs42l56->beep_rate = 0;
1105 
1106 	cs42l56->beep->name = "CS42L56 Beep Generator";
1107 	cs42l56->beep->phys = dev_name(codec->dev);
1108 	cs42l56->beep->id.bustype = BUS_I2C;
1109 
1110 	cs42l56->beep->evbit[0] = BIT_MASK(EV_SND);
1111 	cs42l56->beep->sndbit[0] = BIT_MASK(SND_BELL) | BIT_MASK(SND_TONE);
1112 	cs42l56->beep->event = cs42l56_beep_event;
1113 	cs42l56->beep->dev.parent = codec->dev;
1114 	input_set_drvdata(cs42l56->beep, codec);
1115 
1116 	ret = input_register_device(cs42l56->beep);
1117 	if (ret != 0) {
1118 		cs42l56->beep = NULL;
1119 		dev_err(codec->dev, "Failed to register beep device\n");
1120 	}
1121 
1122 	ret = device_create_file(codec->dev, &dev_attr_beep);
1123 	if (ret != 0) {
1124 		dev_err(codec->dev, "Failed to create keyclick file: %d\n",
1125 			ret);
1126 	}
1127 }
1128 
1129 static void cs42l56_free_beep(struct snd_soc_codec *codec)
1130 {
1131 	struct cs42l56_private *cs42l56 = snd_soc_codec_get_drvdata(codec);
1132 
1133 	device_remove_file(codec->dev, &dev_attr_beep);
1134 	cancel_work_sync(&cs42l56->beep_work);
1135 	cs42l56->beep = NULL;
1136 
1137 	snd_soc_update_bits(codec, CS42L56_BEEP_TONE_CFG,
1138 			    CS42L56_BEEP_EN_MASK, 0);
1139 }
1140 
1141 static int cs42l56_probe(struct snd_soc_codec *codec)
1142 {
1143 	cs42l56_init_beep(codec);
1144 
1145 	cs42l56_set_bias_level(codec, SND_SOC_BIAS_STANDBY);
1146 
1147 	return 0;
1148 }
1149 
1150 static int cs42l56_remove(struct snd_soc_codec *codec)
1151 {
1152 	struct cs42l56_private *cs42l56 = snd_soc_codec_get_drvdata(codec);
1153 
1154 	cs42l56_free_beep(codec);
1155 	cs42l56_set_bias_level(codec, SND_SOC_BIAS_OFF);
1156 	regulator_bulk_free(ARRAY_SIZE(cs42l56->supplies), cs42l56->supplies);
1157 
1158 	return 0;
1159 }
1160 
1161 static struct snd_soc_codec_driver soc_codec_dev_cs42l56 = {
1162 	.probe = cs42l56_probe,
1163 	.remove = cs42l56_remove,
1164 	.suspend = cs42l56_suspend,
1165 	.resume = cs42l56_resume,
1166 	.set_bias_level = cs42l56_set_bias_level,
1167 
1168 	.dapm_widgets = cs42l56_dapm_widgets,
1169 	.num_dapm_widgets = ARRAY_SIZE(cs42l56_dapm_widgets),
1170 	.dapm_routes = cs42l56_audio_map,
1171 	.num_dapm_routes = ARRAY_SIZE(cs42l56_audio_map),
1172 
1173 	.controls = cs42l56_snd_controls,
1174 	.num_controls = ARRAY_SIZE(cs42l56_snd_controls),
1175 };
1176 
1177 static struct regmap_config cs42l56_regmap = {
1178 	.reg_bits = 8,
1179 	.val_bits = 8,
1180 
1181 	.max_register = CS42L56_MAX_REGISTER,
1182 	.reg_defaults = cs42l56_reg_defaults,
1183 	.num_reg_defaults = ARRAY_SIZE(cs42l56_reg_defaults),
1184 	.readable_reg = cs42l56_readable_register,
1185 	.volatile_reg = cs42l56_volatile_register,
1186 	.cache_type = REGCACHE_RBTREE,
1187 };
1188 
1189 static int cs42l56_handle_of_data(struct i2c_client *i2c_client,
1190 				    struct cs42l56_platform_data *pdata)
1191 {
1192 	struct device_node *np = i2c_client->dev.of_node;
1193 	u32 val32;
1194 
1195 	if (of_property_read_bool(np, "cirrus,ain1a-reference-cfg"))
1196 		pdata->ain1a_ref_cfg = true;
1197 
1198 	if (of_property_read_bool(np, "cirrus,ain2a-reference-cfg"))
1199 		pdata->ain2a_ref_cfg = true;
1200 
1201 	if (of_property_read_bool(np, "cirrus,ain1b-reference-cfg"))
1202 		pdata->ain1b_ref_cfg = true;
1203 
1204 	if (of_property_read_bool(np, "cirrus,ain2b-reference-cfg"))
1205 		pdata->ain2b_ref_cfg = true;
1206 
1207 	if (of_property_read_u32(np, "cirrus,micbias-lvl", &val32) >= 0)
1208 		pdata->micbias_lvl = val32;
1209 
1210 	if (of_property_read_u32(np, "cirrus,chgfreq-divisor", &val32) >= 0)
1211 		pdata->chgfreq = val32;
1212 
1213 	if (of_property_read_u32(np, "cirrus,adaptive-pwr-cfg", &val32) >= 0)
1214 		pdata->adaptive_pwr = val32;
1215 
1216 	if (of_property_read_u32(np, "cirrus,hpf-left-freq", &val32) >= 0)
1217 		pdata->hpfa_freq = val32;
1218 
1219 	if (of_property_read_u32(np, "cirrus,hpf-left-freq", &val32) >= 0)
1220 		pdata->hpfb_freq = val32;
1221 
1222 	pdata->gpio_nreset = of_get_named_gpio(np, "cirrus,gpio-nreset", 0);
1223 
1224 	return 0;
1225 }
1226 
1227 static int cs42l56_i2c_probe(struct i2c_client *i2c_client,
1228 			     const struct i2c_device_id *id)
1229 {
1230 	struct cs42l56_private *cs42l56;
1231 	struct cs42l56_platform_data *pdata =
1232 		dev_get_platdata(&i2c_client->dev);
1233 	int ret, i;
1234 	unsigned int devid = 0;
1235 	unsigned int alpha_rev, metal_rev;
1236 	unsigned int reg;
1237 
1238 	cs42l56 = devm_kzalloc(&i2c_client->dev,
1239 			       sizeof(struct cs42l56_private),
1240 			       GFP_KERNEL);
1241 	if (cs42l56 == NULL)
1242 		return -ENOMEM;
1243 	cs42l56->dev = &i2c_client->dev;
1244 
1245 	cs42l56->regmap = devm_regmap_init_i2c(i2c_client, &cs42l56_regmap);
1246 	if (IS_ERR(cs42l56->regmap)) {
1247 		ret = PTR_ERR(cs42l56->regmap);
1248 		dev_err(&i2c_client->dev, "regmap_init() failed: %d\n", ret);
1249 		return ret;
1250 	}
1251 
1252 	if (pdata) {
1253 		cs42l56->pdata = *pdata;
1254 	} else {
1255 		pdata = devm_kzalloc(&i2c_client->dev,
1256 				     sizeof(struct cs42l56_platform_data),
1257 				     GFP_KERNEL);
1258 		if (!pdata) {
1259 			dev_err(&i2c_client->dev,
1260 				"could not allocate pdata\n");
1261 			return -ENOMEM;
1262 		}
1263 		if (i2c_client->dev.of_node) {
1264 			ret = cs42l56_handle_of_data(i2c_client,
1265 						     &cs42l56->pdata);
1266 			if (ret != 0)
1267 				return ret;
1268 		}
1269 		cs42l56->pdata = *pdata;
1270 	}
1271 
1272 	if (cs42l56->pdata.gpio_nreset) {
1273 		ret = gpio_request_one(cs42l56->pdata.gpio_nreset,
1274 				       GPIOF_OUT_INIT_HIGH, "CS42L56 /RST");
1275 		if (ret < 0) {
1276 			dev_err(&i2c_client->dev,
1277 				"Failed to request /RST %d: %d\n",
1278 				cs42l56->pdata.gpio_nreset, ret);
1279 			return ret;
1280 		}
1281 		gpio_set_value_cansleep(cs42l56->pdata.gpio_nreset, 0);
1282 		gpio_set_value_cansleep(cs42l56->pdata.gpio_nreset, 1);
1283 	}
1284 
1285 
1286 	i2c_set_clientdata(i2c_client, cs42l56);
1287 
1288 	for (i = 0; i < ARRAY_SIZE(cs42l56->supplies); i++)
1289 		cs42l56->supplies[i].supply = cs42l56_supply_names[i];
1290 
1291 	ret = devm_regulator_bulk_get(&i2c_client->dev,
1292 				      ARRAY_SIZE(cs42l56->supplies),
1293 				      cs42l56->supplies);
1294 	if (ret != 0) {
1295 		dev_err(&i2c_client->dev,
1296 			"Failed to request supplies: %d\n", ret);
1297 		return ret;
1298 	}
1299 
1300 	ret = regulator_bulk_enable(ARRAY_SIZE(cs42l56->supplies),
1301 				    cs42l56->supplies);
1302 	if (ret != 0) {
1303 		dev_err(&i2c_client->dev,
1304 			"Failed to enable supplies: %d\n", ret);
1305 		return ret;
1306 	}
1307 
1308 	regcache_cache_bypass(cs42l56->regmap, true);
1309 
1310 	ret = regmap_read(cs42l56->regmap, CS42L56_CHIP_ID_1, &reg);
1311 	devid = reg & CS42L56_CHIP_ID_MASK;
1312 	if (devid != CS42L56_DEVID) {
1313 		dev_err(&i2c_client->dev,
1314 			"CS42L56 Device ID (%X). Expected %X\n",
1315 			devid, CS42L56_DEVID);
1316 		goto err_enable;
1317 	}
1318 	alpha_rev = reg & CS42L56_AREV_MASK;
1319 	metal_rev = reg & CS42L56_MTLREV_MASK;
1320 
1321 	dev_info(&i2c_client->dev, "Cirrus Logic CS42L56 ");
1322 	dev_info(&i2c_client->dev, "Alpha Rev %X Metal Rev %X\n",
1323 		 alpha_rev, metal_rev);
1324 
1325 	regcache_cache_bypass(cs42l56->regmap, false);
1326 
1327 	if (cs42l56->pdata.ain1a_ref_cfg)
1328 		regmap_update_bits(cs42l56->regmap, CS42L56_AIN_REFCFG_ADC_MUX,
1329 				   CS42L56_AIN1A_REF_MASK, 1);
1330 
1331 	if (cs42l56->pdata.ain1b_ref_cfg)
1332 		regmap_update_bits(cs42l56->regmap, CS42L56_AIN_REFCFG_ADC_MUX,
1333 				   CS42L56_AIN1B_REF_MASK, 1);
1334 
1335 	if (cs42l56->pdata.ain2a_ref_cfg)
1336 		regmap_update_bits(cs42l56->regmap, CS42L56_AIN_REFCFG_ADC_MUX,
1337 				   CS42L56_AIN2A_REF_MASK, 1);
1338 
1339 	if (cs42l56->pdata.ain2b_ref_cfg)
1340 		regmap_update_bits(cs42l56->regmap, CS42L56_AIN_REFCFG_ADC_MUX,
1341 				   CS42L56_AIN2B_REF_MASK, 1);
1342 
1343 	if (cs42l56->pdata.micbias_lvl)
1344 		regmap_update_bits(cs42l56->regmap, CS42L56_GAIN_BIAS_CTL,
1345 				   CS42L56_MIC_BIAS_MASK,
1346 				cs42l56->pdata.micbias_lvl);
1347 
1348 	if (cs42l56->pdata.chgfreq)
1349 		regmap_update_bits(cs42l56->regmap, CS42L56_CLASSH_CTL,
1350 				   CS42L56_CHRG_FREQ_MASK,
1351 				cs42l56->pdata.chgfreq);
1352 
1353 	if (cs42l56->pdata.hpfb_freq)
1354 		regmap_update_bits(cs42l56->regmap, CS42L56_HPF_CTL,
1355 				   CS42L56_HPFB_FREQ_MASK,
1356 				cs42l56->pdata.hpfb_freq);
1357 
1358 	if (cs42l56->pdata.hpfa_freq)
1359 		regmap_update_bits(cs42l56->regmap, CS42L56_HPF_CTL,
1360 				   CS42L56_HPFA_FREQ_MASK,
1361 				cs42l56->pdata.hpfa_freq);
1362 
1363 	if (cs42l56->pdata.adaptive_pwr)
1364 		regmap_update_bits(cs42l56->regmap, CS42L56_CLASSH_CTL,
1365 				   CS42L56_ADAPT_PWR_MASK,
1366 				cs42l56->pdata.adaptive_pwr);
1367 
1368 	ret =  snd_soc_register_codec(&i2c_client->dev,
1369 			&soc_codec_dev_cs42l56, &cs42l56_dai, 1);
1370 	if (ret < 0)
1371 		return ret;
1372 
1373 	return 0;
1374 
1375 err_enable:
1376 	regulator_bulk_disable(ARRAY_SIZE(cs42l56->supplies),
1377 			       cs42l56->supplies);
1378 	return ret;
1379 }
1380 
1381 static int cs42l56_i2c_remove(struct i2c_client *client)
1382 {
1383 	struct cs42l56_private *cs42l56 = i2c_get_clientdata(client);
1384 
1385 	snd_soc_unregister_codec(&client->dev);
1386 	regulator_bulk_disable(ARRAY_SIZE(cs42l56->supplies),
1387 			       cs42l56->supplies);
1388 	return 0;
1389 }
1390 
1391 static const struct of_device_id cs42l56_of_match[] = {
1392 	{ .compatible = "cirrus,cs42l56", },
1393 	{ }
1394 };
1395 MODULE_DEVICE_TABLE(of, cs42l56_of_match);
1396 
1397 
1398 static const struct i2c_device_id cs42l56_id[] = {
1399 	{ "cs42l56", 0 },
1400 	{ }
1401 };
1402 MODULE_DEVICE_TABLE(i2c, cs42l56_id);
1403 
1404 static struct i2c_driver cs42l56_i2c_driver = {
1405 	.driver = {
1406 		.name = "cs42l56",
1407 		.owner = THIS_MODULE,
1408 		.of_match_table = cs42l56_of_match,
1409 	},
1410 	.id_table = cs42l56_id,
1411 	.probe =    cs42l56_i2c_probe,
1412 	.remove =   cs42l56_i2c_remove,
1413 };
1414 
1415 module_i2c_driver(cs42l56_i2c_driver);
1416 
1417 MODULE_DESCRIPTION("ASoC CS42L56 driver");
1418 MODULE_AUTHOR("Brian Austin, Cirrus Logic Inc, <brian.austin@cirrus.com>");
1419 MODULE_LICENSE("GPL");
1420