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