ASoC: da7213: Add DT support to codec driver
[firefly-linux-kernel-4.4.55.git] / sound / soc / codecs / da7213.c
1 /*
2  * DA7213 ALSA SoC Codec Driver
3  *
4  * Copyright (c) 2013 Dialog Semiconductor
5  *
6  * Author: Adam Thomson <Adam.Thomson.Opensource@diasemi.com>
7  * Based on DA9055 ALSA SoC codec driver.
8  *
9  * This program is free software; you can redistribute  it and/or modify it
10  * under  the terms of  the GNU General  Public License as published by the
11  * Free Software Foundation;  either version 2 of the  License, or (at your
12  * option) any later version.
13  */
14
15 #include <linux/delay.h>
16 #include <linux/i2c.h>
17 #include <linux/regmap.h>
18 #include <linux/slab.h>
19 #include <linux/module.h>
20 #include <sound/pcm.h>
21 #include <sound/pcm_params.h>
22 #include <sound/soc.h>
23 #include <sound/initval.h>
24 #include <sound/tlv.h>
25
26 #include <sound/da7213.h>
27 #include "da7213.h"
28
29
30 /* Gain and Volume */
31 static const DECLARE_TLV_DB_RANGE(aux_vol_tlv,
32         /* -54dB */
33         0x0, 0x11, TLV_DB_SCALE_ITEM(-5400, 0, 0),
34         /* -52.5dB to 15dB */
35         0x12, 0x3f, TLV_DB_SCALE_ITEM(-5250, 150, 0)
36 );
37
38 static const DECLARE_TLV_DB_RANGE(digital_gain_tlv,
39         0x0, 0x07, TLV_DB_SCALE_ITEM(TLV_DB_GAIN_MUTE, 0, 1),
40         /* -78dB to 12dB */
41         0x08, 0x7f, TLV_DB_SCALE_ITEM(-7800, 75, 0)
42 );
43
44 static const DECLARE_TLV_DB_RANGE(alc_analog_gain_tlv,
45         0x0, 0x0, TLV_DB_SCALE_ITEM(TLV_DB_GAIN_MUTE, 0, 1),
46         /* 0dB to 36dB */
47         0x01, 0x07, TLV_DB_SCALE_ITEM(0, 600, 0)
48 );
49
50 static const DECLARE_TLV_DB_SCALE(mic_vol_tlv, -600, 600, 0);
51 static const DECLARE_TLV_DB_SCALE(mixin_gain_tlv, -450, 150, 0);
52 static const DECLARE_TLV_DB_SCALE(eq_gain_tlv, -1050, 150, 0);
53 static const DECLARE_TLV_DB_SCALE(hp_vol_tlv, -5700, 100, 0);
54 static const DECLARE_TLV_DB_SCALE(lineout_vol_tlv, -4800, 100, 0);
55 static const DECLARE_TLV_DB_SCALE(alc_threshold_tlv, -9450, 150, 0);
56 static const DECLARE_TLV_DB_SCALE(alc_gain_tlv, 0, 600, 0);
57
58 /* ADC and DAC voice mode (8kHz) high pass cutoff value */
59 static const char * const da7213_voice_hpf_corner_txt[] = {
60         "2.5Hz", "25Hz", "50Hz", "100Hz", "150Hz", "200Hz", "300Hz", "400Hz"
61 };
62
63 static SOC_ENUM_SINGLE_DECL(da7213_dac_voice_hpf_corner,
64                             DA7213_DAC_FILTERS1,
65                             DA7213_VOICE_HPF_CORNER_SHIFT,
66                             da7213_voice_hpf_corner_txt);
67
68 static SOC_ENUM_SINGLE_DECL(da7213_adc_voice_hpf_corner,
69                             DA7213_ADC_FILTERS1,
70                             DA7213_VOICE_HPF_CORNER_SHIFT,
71                             da7213_voice_hpf_corner_txt);
72
73 /* ADC and DAC high pass filter cutoff value */
74 static const char * const da7213_audio_hpf_corner_txt[] = {
75         "Fs/24000", "Fs/12000", "Fs/6000", "Fs/3000"
76 };
77
78 static SOC_ENUM_SINGLE_DECL(da7213_dac_audio_hpf_corner,
79                             DA7213_DAC_FILTERS1
80                             , DA7213_AUDIO_HPF_CORNER_SHIFT,
81                             da7213_audio_hpf_corner_txt);
82
83 static SOC_ENUM_SINGLE_DECL(da7213_adc_audio_hpf_corner,
84                             DA7213_ADC_FILTERS1,
85                             DA7213_AUDIO_HPF_CORNER_SHIFT,
86                             da7213_audio_hpf_corner_txt);
87
88 /* Gain ramping rate value */
89 static const char * const da7213_gain_ramp_rate_txt[] = {
90         "nominal rate * 8", "nominal rate * 16", "nominal rate / 16",
91         "nominal rate / 32"
92 };
93
94 static SOC_ENUM_SINGLE_DECL(da7213_gain_ramp_rate,
95                             DA7213_GAIN_RAMP_CTRL,
96                             DA7213_GAIN_RAMP_RATE_SHIFT,
97                             da7213_gain_ramp_rate_txt);
98
99 /* DAC noise gate setup time value */
100 static const char * const da7213_dac_ng_setup_time_txt[] = {
101         "256 samples", "512 samples", "1024 samples", "2048 samples"
102 };
103
104 static SOC_ENUM_SINGLE_DECL(da7213_dac_ng_setup_time,
105                             DA7213_DAC_NG_SETUP_TIME,
106                             DA7213_DAC_NG_SETUP_TIME_SHIFT,
107                             da7213_dac_ng_setup_time_txt);
108
109 /* DAC noise gate rampup rate value */
110 static const char * const da7213_dac_ng_rampup_txt[] = {
111         "0.02 ms/dB", "0.16 ms/dB"
112 };
113
114 static SOC_ENUM_SINGLE_DECL(da7213_dac_ng_rampup_rate,
115                             DA7213_DAC_NG_SETUP_TIME,
116                             DA7213_DAC_NG_RAMPUP_RATE_SHIFT,
117                             da7213_dac_ng_rampup_txt);
118
119 /* DAC noise gate rampdown rate value */
120 static const char * const da7213_dac_ng_rampdown_txt[] = {
121         "0.64 ms/dB", "20.48 ms/dB"
122 };
123
124 static SOC_ENUM_SINGLE_DECL(da7213_dac_ng_rampdown_rate,
125                             DA7213_DAC_NG_SETUP_TIME,
126                             DA7213_DAC_NG_RAMPDN_RATE_SHIFT,
127                             da7213_dac_ng_rampdown_txt);
128
129 /* DAC soft mute rate value */
130 static const char * const da7213_dac_soft_mute_rate_txt[] = {
131         "1", "2", "4", "8", "16", "32", "64"
132 };
133
134 static SOC_ENUM_SINGLE_DECL(da7213_dac_soft_mute_rate,
135                             DA7213_DAC_FILTERS5,
136                             DA7213_DAC_SOFTMUTE_RATE_SHIFT,
137                             da7213_dac_soft_mute_rate_txt);
138
139 /* ALC Attack Rate select */
140 static const char * const da7213_alc_attack_rate_txt[] = {
141         "44/fs", "88/fs", "176/fs", "352/fs", "704/fs", "1408/fs", "2816/fs",
142         "5632/fs", "11264/fs", "22528/fs", "45056/fs", "90112/fs", "180224/fs"
143 };
144
145 static SOC_ENUM_SINGLE_DECL(da7213_alc_attack_rate,
146                             DA7213_ALC_CTRL2,
147                             DA7213_ALC_ATTACK_SHIFT,
148                             da7213_alc_attack_rate_txt);
149
150 /* ALC Release Rate select */
151 static const char * const da7213_alc_release_rate_txt[] = {
152         "176/fs", "352/fs", "704/fs", "1408/fs", "2816/fs", "5632/fs",
153         "11264/fs", "22528/fs", "45056/fs", "90112/fs", "180224/fs"
154 };
155
156 static SOC_ENUM_SINGLE_DECL(da7213_alc_release_rate,
157                             DA7213_ALC_CTRL2,
158                             DA7213_ALC_RELEASE_SHIFT,
159                             da7213_alc_release_rate_txt);
160
161 /* ALC Hold Time select */
162 static const char * const da7213_alc_hold_time_txt[] = {
163         "62/fs", "124/fs", "248/fs", "496/fs", "992/fs", "1984/fs", "3968/fs",
164         "7936/fs", "15872/fs", "31744/fs", "63488/fs", "126976/fs",
165         "253952/fs", "507904/fs", "1015808/fs", "2031616/fs"
166 };
167
168 static SOC_ENUM_SINGLE_DECL(da7213_alc_hold_time,
169                             DA7213_ALC_CTRL3,
170                             DA7213_ALC_HOLD_SHIFT,
171                             da7213_alc_hold_time_txt);
172
173 /* ALC Input Signal Tracking rate select */
174 static const char * const da7213_alc_integ_rate_txt[] = {
175         "1/4", "1/16", "1/256", "1/65536"
176 };
177
178 static SOC_ENUM_SINGLE_DECL(da7213_alc_integ_attack_rate,
179                             DA7213_ALC_CTRL3,
180                             DA7213_ALC_INTEG_ATTACK_SHIFT,
181                             da7213_alc_integ_rate_txt);
182
183 static SOC_ENUM_SINGLE_DECL(da7213_alc_integ_release_rate,
184                             DA7213_ALC_CTRL3,
185                             DA7213_ALC_INTEG_RELEASE_SHIFT,
186                             da7213_alc_integ_rate_txt);
187
188
189 /*
190  * Control Functions
191  */
192
193 static int da7213_get_alc_data(struct snd_soc_codec *codec, u8 reg_val)
194 {
195         int mid_data, top_data;
196         int sum = 0;
197         u8 iteration;
198
199         for (iteration = 0; iteration < DA7213_ALC_AVG_ITERATIONS;
200              iteration++) {
201                 /* Select the left or right channel and capture data */
202                 snd_soc_write(codec, DA7213_ALC_CIC_OP_LVL_CTRL, reg_val);
203
204                 /* Select middle 8 bits for read back from data register */
205                 snd_soc_write(codec, DA7213_ALC_CIC_OP_LVL_CTRL,
206                               reg_val | DA7213_ALC_DATA_MIDDLE);
207                 mid_data = snd_soc_read(codec, DA7213_ALC_CIC_OP_LVL_DATA);
208
209                 /* Select top 8 bits for read back from data register */
210                 snd_soc_write(codec, DA7213_ALC_CIC_OP_LVL_CTRL,
211                               reg_val | DA7213_ALC_DATA_TOP);
212                 top_data = snd_soc_read(codec, DA7213_ALC_CIC_OP_LVL_DATA);
213
214                 sum += ((mid_data << 8) | (top_data << 16));
215         }
216
217         return sum / DA7213_ALC_AVG_ITERATIONS;
218 }
219
220 static void da7213_alc_calib_man(struct snd_soc_codec *codec)
221 {
222         u8 reg_val;
223         int avg_left_data, avg_right_data, offset_l, offset_r;
224
225         /* Calculate average for Left and Right data */
226         /* Left Data */
227         avg_left_data = da7213_get_alc_data(codec,
228                         DA7213_ALC_CIC_OP_CHANNEL_LEFT);
229         /* Right Data */
230         avg_right_data = da7213_get_alc_data(codec,
231                          DA7213_ALC_CIC_OP_CHANNEL_RIGHT);
232
233         /* Calculate DC offset */
234         offset_l = -avg_left_data;
235         offset_r = -avg_right_data;
236
237         reg_val = (offset_l & DA7213_ALC_OFFSET_15_8) >> 8;
238         snd_soc_write(codec, DA7213_ALC_OFFSET_MAN_M_L, reg_val);
239         reg_val = (offset_l & DA7213_ALC_OFFSET_19_16) >> 16;
240         snd_soc_write(codec, DA7213_ALC_OFFSET_MAN_U_L, reg_val);
241
242         reg_val = (offset_r & DA7213_ALC_OFFSET_15_8) >> 8;
243         snd_soc_write(codec, DA7213_ALC_OFFSET_MAN_M_R, reg_val);
244         reg_val = (offset_r & DA7213_ALC_OFFSET_19_16) >> 16;
245         snd_soc_write(codec, DA7213_ALC_OFFSET_MAN_U_R, reg_val);
246
247         /* Enable analog/digital gain mode & offset cancellation */
248         snd_soc_update_bits(codec, DA7213_ALC_CTRL1,
249                             DA7213_ALC_OFFSET_EN | DA7213_ALC_SYNC_MODE,
250                             DA7213_ALC_OFFSET_EN | DA7213_ALC_SYNC_MODE);
251 }
252
253 static void da7213_alc_calib_auto(struct snd_soc_codec *codec)
254 {
255         u8 alc_ctrl1;
256
257         /* Begin auto calibration and wait for completion */
258         snd_soc_update_bits(codec, DA7213_ALC_CTRL1, DA7213_ALC_AUTO_CALIB_EN,
259                             DA7213_ALC_AUTO_CALIB_EN);
260         do {
261                 alc_ctrl1 = snd_soc_read(codec, DA7213_ALC_CTRL1);
262         } while (alc_ctrl1 & DA7213_ALC_AUTO_CALIB_EN);
263
264         /* If auto calibration fails, fall back to digital gain only mode */
265         if (alc_ctrl1 & DA7213_ALC_CALIB_OVERFLOW) {
266                 dev_warn(codec->dev,
267                          "ALC auto calibration failed with overflow\n");
268                 snd_soc_update_bits(codec, DA7213_ALC_CTRL1,
269                                     DA7213_ALC_OFFSET_EN | DA7213_ALC_SYNC_MODE,
270                                     0);
271         } else {
272                 /* Enable analog/digital gain mode & offset cancellation */
273                 snd_soc_update_bits(codec, DA7213_ALC_CTRL1,
274                                     DA7213_ALC_OFFSET_EN | DA7213_ALC_SYNC_MODE,
275                                     DA7213_ALC_OFFSET_EN | DA7213_ALC_SYNC_MODE);
276         }
277
278 }
279
280 static void da7213_alc_calib(struct snd_soc_codec *codec)
281 {
282         struct da7213_priv *da7213 = snd_soc_codec_get_drvdata(codec);
283         u8 adc_l_ctrl, adc_r_ctrl;
284         u8 mixin_l_sel, mixin_r_sel;
285         u8 mic_1_ctrl, mic_2_ctrl;
286
287         /* Save current values from ADC control registers */
288         adc_l_ctrl = snd_soc_read(codec, DA7213_ADC_L_CTRL);
289         adc_r_ctrl = snd_soc_read(codec, DA7213_ADC_R_CTRL);
290
291         /* Save current values from MIXIN_L/R_SELECT registers */
292         mixin_l_sel = snd_soc_read(codec, DA7213_MIXIN_L_SELECT);
293         mixin_r_sel = snd_soc_read(codec, DA7213_MIXIN_R_SELECT);
294
295         /* Save current values from MIC control registers */
296         mic_1_ctrl = snd_soc_read(codec, DA7213_MIC_1_CTRL);
297         mic_2_ctrl = snd_soc_read(codec, DA7213_MIC_2_CTRL);
298
299         /* Enable ADC Left and Right */
300         snd_soc_update_bits(codec, DA7213_ADC_L_CTRL, DA7213_ADC_EN,
301                             DA7213_ADC_EN);
302         snd_soc_update_bits(codec, DA7213_ADC_R_CTRL, DA7213_ADC_EN,
303                             DA7213_ADC_EN);
304
305         /* Enable MIC paths */
306         snd_soc_update_bits(codec, DA7213_MIXIN_L_SELECT,
307                             DA7213_MIXIN_L_MIX_SELECT_MIC_1 |
308                             DA7213_MIXIN_L_MIX_SELECT_MIC_2,
309                             DA7213_MIXIN_L_MIX_SELECT_MIC_1 |
310                             DA7213_MIXIN_L_MIX_SELECT_MIC_2);
311         snd_soc_update_bits(codec, DA7213_MIXIN_R_SELECT,
312                             DA7213_MIXIN_R_MIX_SELECT_MIC_2 |
313                             DA7213_MIXIN_R_MIX_SELECT_MIC_1,
314                             DA7213_MIXIN_R_MIX_SELECT_MIC_2 |
315                             DA7213_MIXIN_R_MIX_SELECT_MIC_1);
316
317         /* Mute MIC PGAs */
318         snd_soc_update_bits(codec, DA7213_MIC_1_CTRL, DA7213_MUTE_EN,
319                             DA7213_MUTE_EN);
320         snd_soc_update_bits(codec, DA7213_MIC_2_CTRL, DA7213_MUTE_EN,
321                             DA7213_MUTE_EN);
322
323         /* Perform calibration */
324         if (da7213->alc_calib_auto)
325                 da7213_alc_calib_auto(codec);
326         else
327                 da7213_alc_calib_man(codec);
328
329         /* Restore MIXIN_L/R_SELECT registers to their original states */
330         snd_soc_write(codec, DA7213_MIXIN_L_SELECT, mixin_l_sel);
331         snd_soc_write(codec, DA7213_MIXIN_R_SELECT, mixin_r_sel);
332
333         /* Restore ADC control registers to their original states */
334         snd_soc_write(codec, DA7213_ADC_L_CTRL, adc_l_ctrl);
335         snd_soc_write(codec, DA7213_ADC_R_CTRL, adc_r_ctrl);
336
337         /* Restore original values of MIC control registers */
338         snd_soc_write(codec, DA7213_MIC_1_CTRL, mic_1_ctrl);
339         snd_soc_write(codec, DA7213_MIC_2_CTRL, mic_2_ctrl);
340 }
341
342 static int da7213_put_mixin_gain(struct snd_kcontrol *kcontrol,
343                                 struct snd_ctl_elem_value *ucontrol)
344 {
345         struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol);
346         struct da7213_priv *da7213 = snd_soc_codec_get_drvdata(codec);
347         int ret;
348
349         ret = snd_soc_put_volsw_2r(kcontrol, ucontrol);
350
351         /* If ALC in operation, make sure calibrated offsets are updated */
352         if ((!ret) && (da7213->alc_en))
353                 da7213_alc_calib(codec);
354
355         return ret;
356 }
357
358 static int da7213_put_alc_sw(struct snd_kcontrol *kcontrol,
359                             struct snd_ctl_elem_value *ucontrol)
360 {
361         struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol);
362         struct da7213_priv *da7213 = snd_soc_codec_get_drvdata(codec);
363
364         /* Force ALC offset calibration if enabling ALC */
365         if (ucontrol->value.integer.value[0] ||
366             ucontrol->value.integer.value[1]) {
367                 if (!da7213->alc_en) {
368                         da7213_alc_calib(codec);
369                         da7213->alc_en = true;
370                 }
371         } else {
372                 da7213->alc_en = false;
373         }
374
375         return snd_soc_put_volsw(kcontrol, ucontrol);
376 }
377
378
379 /*
380  * KControls
381  */
382
383 static const struct snd_kcontrol_new da7213_snd_controls[] = {
384
385         /* Volume controls */
386         SOC_SINGLE_TLV("Mic 1 Volume", DA7213_MIC_1_GAIN,
387                        DA7213_MIC_AMP_GAIN_SHIFT, DA7213_MIC_AMP_GAIN_MAX,
388                        DA7213_NO_INVERT, mic_vol_tlv),
389         SOC_SINGLE_TLV("Mic 2 Volume", DA7213_MIC_2_GAIN,
390                        DA7213_MIC_AMP_GAIN_SHIFT, DA7213_MIC_AMP_GAIN_MAX,
391                        DA7213_NO_INVERT, mic_vol_tlv),
392         SOC_DOUBLE_R_TLV("Aux Volume", DA7213_AUX_L_GAIN, DA7213_AUX_R_GAIN,
393                          DA7213_AUX_AMP_GAIN_SHIFT, DA7213_AUX_AMP_GAIN_MAX,
394                          DA7213_NO_INVERT, aux_vol_tlv),
395         SOC_DOUBLE_R_EXT_TLV("Mixin PGA Volume", DA7213_MIXIN_L_GAIN,
396                              DA7213_MIXIN_R_GAIN, DA7213_MIXIN_AMP_GAIN_SHIFT,
397                              DA7213_MIXIN_AMP_GAIN_MAX, DA7213_NO_INVERT,
398                              snd_soc_get_volsw_2r, da7213_put_mixin_gain,
399                              mixin_gain_tlv),
400         SOC_DOUBLE_R_TLV("ADC Volume", DA7213_ADC_L_GAIN, DA7213_ADC_R_GAIN,
401                          DA7213_ADC_AMP_GAIN_SHIFT, DA7213_ADC_AMP_GAIN_MAX,
402                          DA7213_NO_INVERT, digital_gain_tlv),
403         SOC_DOUBLE_R_TLV("DAC Volume", DA7213_DAC_L_GAIN, DA7213_DAC_R_GAIN,
404                          DA7213_DAC_AMP_GAIN_SHIFT, DA7213_DAC_AMP_GAIN_MAX,
405                          DA7213_NO_INVERT, digital_gain_tlv),
406         SOC_DOUBLE_R_TLV("Headphone Volume", DA7213_HP_L_GAIN, DA7213_HP_R_GAIN,
407                          DA7213_HP_AMP_GAIN_SHIFT, DA7213_HP_AMP_GAIN_MAX,
408                          DA7213_NO_INVERT, hp_vol_tlv),
409         SOC_SINGLE_TLV("Lineout Volume", DA7213_LINE_GAIN,
410                        DA7213_LINE_AMP_GAIN_SHIFT, DA7213_LINE_AMP_GAIN_MAX,
411                        DA7213_NO_INVERT, lineout_vol_tlv),
412
413         /* DAC Equalizer controls */
414         SOC_SINGLE("DAC EQ Switch", DA7213_DAC_FILTERS4, DA7213_DAC_EQ_EN_SHIFT,
415                    DA7213_DAC_EQ_EN_MAX, DA7213_NO_INVERT),
416         SOC_SINGLE_TLV("DAC EQ1 Volume", DA7213_DAC_FILTERS2,
417                        DA7213_DAC_EQ_BAND1_SHIFT, DA7213_DAC_EQ_BAND_MAX,
418                        DA7213_NO_INVERT, eq_gain_tlv),
419         SOC_SINGLE_TLV("DAC EQ2 Volume", DA7213_DAC_FILTERS2,
420                        DA7213_DAC_EQ_BAND2_SHIFT, DA7213_DAC_EQ_BAND_MAX,
421                        DA7213_NO_INVERT, eq_gain_tlv),
422         SOC_SINGLE_TLV("DAC EQ3 Volume", DA7213_DAC_FILTERS3,
423                        DA7213_DAC_EQ_BAND3_SHIFT, DA7213_DAC_EQ_BAND_MAX,
424                        DA7213_NO_INVERT, eq_gain_tlv),
425         SOC_SINGLE_TLV("DAC EQ4 Volume", DA7213_DAC_FILTERS3,
426                        DA7213_DAC_EQ_BAND4_SHIFT, DA7213_DAC_EQ_BAND_MAX,
427                        DA7213_NO_INVERT, eq_gain_tlv),
428         SOC_SINGLE_TLV("DAC EQ5 Volume", DA7213_DAC_FILTERS4,
429                        DA7213_DAC_EQ_BAND5_SHIFT, DA7213_DAC_EQ_BAND_MAX,
430                        DA7213_NO_INVERT, eq_gain_tlv),
431
432         /* High Pass Filter and Voice Mode controls */
433         SOC_SINGLE("ADC HPF Switch", DA7213_ADC_FILTERS1, DA7213_HPF_EN_SHIFT,
434                    DA7213_HPF_EN_MAX, DA7213_NO_INVERT),
435         SOC_ENUM("ADC HPF Cutoff", da7213_adc_audio_hpf_corner),
436         SOC_SINGLE("ADC Voice Mode Switch", DA7213_ADC_FILTERS1,
437                    DA7213_VOICE_EN_SHIFT, DA7213_VOICE_EN_MAX,
438                    DA7213_NO_INVERT),
439         SOC_ENUM("ADC Voice Cutoff", da7213_adc_voice_hpf_corner),
440
441         SOC_SINGLE("DAC HPF Switch", DA7213_DAC_FILTERS1, DA7213_HPF_EN_SHIFT,
442                    DA7213_HPF_EN_MAX, DA7213_NO_INVERT),
443         SOC_ENUM("DAC HPF Cutoff", da7213_dac_audio_hpf_corner),
444         SOC_SINGLE("DAC Voice Mode Switch", DA7213_DAC_FILTERS1,
445                    DA7213_VOICE_EN_SHIFT, DA7213_VOICE_EN_MAX,
446                    DA7213_NO_INVERT),
447         SOC_ENUM("DAC Voice Cutoff", da7213_dac_voice_hpf_corner),
448
449         /* Mute controls */
450         SOC_SINGLE("Mic 1 Switch", DA7213_MIC_1_CTRL, DA7213_MUTE_EN_SHIFT,
451                    DA7213_MUTE_EN_MAX, DA7213_INVERT),
452         SOC_SINGLE("Mic 2 Switch", DA7213_MIC_2_CTRL, DA7213_MUTE_EN_SHIFT,
453                    DA7213_MUTE_EN_MAX, DA7213_INVERT),
454         SOC_DOUBLE_R("Aux Switch", DA7213_AUX_L_CTRL, DA7213_AUX_R_CTRL,
455                      DA7213_MUTE_EN_SHIFT, DA7213_MUTE_EN_MAX, DA7213_INVERT),
456         SOC_DOUBLE_R("Mixin PGA Switch", DA7213_MIXIN_L_CTRL,
457                      DA7213_MIXIN_R_CTRL, DA7213_MUTE_EN_SHIFT,
458                      DA7213_MUTE_EN_MAX, DA7213_INVERT),
459         SOC_DOUBLE_R("ADC Switch", DA7213_ADC_L_CTRL, DA7213_ADC_R_CTRL,
460                      DA7213_MUTE_EN_SHIFT, DA7213_MUTE_EN_MAX, DA7213_INVERT),
461         SOC_DOUBLE_R("Headphone Switch", DA7213_HP_L_CTRL, DA7213_HP_R_CTRL,
462                      DA7213_MUTE_EN_SHIFT, DA7213_MUTE_EN_MAX, DA7213_INVERT),
463         SOC_SINGLE("Lineout Switch", DA7213_LINE_CTRL, DA7213_MUTE_EN_SHIFT,
464                    DA7213_MUTE_EN_MAX, DA7213_INVERT),
465         SOC_SINGLE("DAC Soft Mute Switch", DA7213_DAC_FILTERS5,
466                    DA7213_DAC_SOFTMUTE_EN_SHIFT, DA7213_DAC_SOFTMUTE_EN_MAX,
467                    DA7213_NO_INVERT),
468         SOC_ENUM("DAC Soft Mute Rate", da7213_dac_soft_mute_rate),
469
470         /* Zero Cross controls */
471         SOC_DOUBLE_R("Aux ZC Switch", DA7213_AUX_L_CTRL, DA7213_AUX_R_CTRL,
472                      DA7213_ZC_EN_SHIFT, DA7213_ZC_EN_MAX, DA7213_NO_INVERT),
473         SOC_DOUBLE_R("Mixin PGA ZC Switch", DA7213_MIXIN_L_CTRL,
474                      DA7213_MIXIN_R_CTRL, DA7213_ZC_EN_SHIFT, DA7213_ZC_EN_MAX,
475                      DA7213_NO_INVERT),
476         SOC_DOUBLE_R("Headphone ZC Switch", DA7213_HP_L_CTRL, DA7213_HP_R_CTRL,
477                      DA7213_ZC_EN_SHIFT, DA7213_ZC_EN_MAX, DA7213_NO_INVERT),
478
479         /* Gain Ramping controls */
480         SOC_DOUBLE_R("Aux Gain Ramping Switch", DA7213_AUX_L_CTRL,
481                      DA7213_AUX_R_CTRL, DA7213_GAIN_RAMP_EN_SHIFT,
482                      DA7213_GAIN_RAMP_EN_MAX, DA7213_NO_INVERT),
483         SOC_DOUBLE_R("Mixin Gain Ramping Switch", DA7213_MIXIN_L_CTRL,
484                      DA7213_MIXIN_R_CTRL, DA7213_GAIN_RAMP_EN_SHIFT,
485                      DA7213_GAIN_RAMP_EN_MAX, DA7213_NO_INVERT),
486         SOC_DOUBLE_R("ADC Gain Ramping Switch", DA7213_ADC_L_CTRL,
487                      DA7213_ADC_R_CTRL, DA7213_GAIN_RAMP_EN_SHIFT,
488                      DA7213_GAIN_RAMP_EN_MAX, DA7213_NO_INVERT),
489         SOC_DOUBLE_R("DAC Gain Ramping Switch", DA7213_DAC_L_CTRL,
490                      DA7213_DAC_R_CTRL, DA7213_GAIN_RAMP_EN_SHIFT,
491                      DA7213_GAIN_RAMP_EN_MAX, DA7213_NO_INVERT),
492         SOC_DOUBLE_R("Headphone Gain Ramping Switch", DA7213_HP_L_CTRL,
493                      DA7213_HP_R_CTRL, DA7213_GAIN_RAMP_EN_SHIFT,
494                      DA7213_GAIN_RAMP_EN_MAX, DA7213_NO_INVERT),
495         SOC_SINGLE("Lineout Gain Ramping Switch", DA7213_LINE_CTRL,
496                    DA7213_GAIN_RAMP_EN_SHIFT, DA7213_GAIN_RAMP_EN_MAX,
497                    DA7213_NO_INVERT),
498         SOC_ENUM("Gain Ramping Rate", da7213_gain_ramp_rate),
499
500         /* DAC Noise Gate controls */
501         SOC_SINGLE("DAC NG Switch", DA7213_DAC_NG_CTRL, DA7213_DAC_NG_EN_SHIFT,
502                    DA7213_DAC_NG_EN_MAX, DA7213_NO_INVERT),
503         SOC_ENUM("DAC NG Setup Time", da7213_dac_ng_setup_time),
504         SOC_ENUM("DAC NG Rampup Rate", da7213_dac_ng_rampup_rate),
505         SOC_ENUM("DAC NG Rampdown Rate", da7213_dac_ng_rampdown_rate),
506         SOC_SINGLE("DAC NG OFF Threshold", DA7213_DAC_NG_OFF_THRESHOLD,
507                    DA7213_DAC_NG_THRESHOLD_SHIFT, DA7213_DAC_NG_THRESHOLD_MAX,
508                    DA7213_NO_INVERT),
509         SOC_SINGLE("DAC NG ON Threshold", DA7213_DAC_NG_ON_THRESHOLD,
510                    DA7213_DAC_NG_THRESHOLD_SHIFT, DA7213_DAC_NG_THRESHOLD_MAX,
511                    DA7213_NO_INVERT),
512
513         /* DAC Routing & Inversion */
514         SOC_DOUBLE("DAC Mono Switch", DA7213_DIG_ROUTING_DAC,
515                    DA7213_DAC_L_MONO_SHIFT, DA7213_DAC_R_MONO_SHIFT,
516                    DA7213_DAC_MONO_MAX, DA7213_NO_INVERT),
517         SOC_DOUBLE("DAC Invert Switch", DA7213_DIG_CTRL, DA7213_DAC_L_INV_SHIFT,
518                    DA7213_DAC_R_INV_SHIFT, DA7213_DAC_INV_MAX,
519                    DA7213_NO_INVERT),
520
521         /* DMIC controls */
522         SOC_DOUBLE_R("DMIC Switch", DA7213_MIXIN_L_SELECT,
523                      DA7213_MIXIN_R_SELECT, DA7213_DMIC_EN_SHIFT,
524                      DA7213_DMIC_EN_MAX, DA7213_NO_INVERT),
525
526         /* ALC Controls */
527         SOC_DOUBLE_EXT("ALC Switch", DA7213_ALC_CTRL1, DA7213_ALC_L_EN_SHIFT,
528                        DA7213_ALC_R_EN_SHIFT, DA7213_ALC_EN_MAX,
529                        DA7213_NO_INVERT, snd_soc_get_volsw, da7213_put_alc_sw),
530         SOC_ENUM("ALC Attack Rate", da7213_alc_attack_rate),
531         SOC_ENUM("ALC Release Rate", da7213_alc_release_rate),
532         SOC_ENUM("ALC Hold Time", da7213_alc_hold_time),
533         /*
534          * Rate at which input signal envelope is tracked as the signal gets
535          * larger
536          */
537         SOC_ENUM("ALC Integ Attack Rate", da7213_alc_integ_attack_rate),
538         /*
539          * Rate at which input signal envelope is tracked as the signal gets
540          * smaller
541          */
542         SOC_ENUM("ALC Integ Release Rate", da7213_alc_integ_release_rate),
543         SOC_SINGLE_TLV("ALC Noise Threshold Volume", DA7213_ALC_NOISE,
544                        DA7213_ALC_THRESHOLD_SHIFT, DA7213_ALC_THRESHOLD_MAX,
545                        DA7213_INVERT, alc_threshold_tlv),
546         SOC_SINGLE_TLV("ALC Min Threshold Volume", DA7213_ALC_TARGET_MIN,
547                        DA7213_ALC_THRESHOLD_SHIFT, DA7213_ALC_THRESHOLD_MAX,
548                        DA7213_INVERT, alc_threshold_tlv),
549         SOC_SINGLE_TLV("ALC Max Threshold Volume", DA7213_ALC_TARGET_MAX,
550                        DA7213_ALC_THRESHOLD_SHIFT, DA7213_ALC_THRESHOLD_MAX,
551                        DA7213_INVERT, alc_threshold_tlv),
552         SOC_SINGLE_TLV("ALC Max Attenuation Volume", DA7213_ALC_GAIN_LIMITS,
553                        DA7213_ALC_ATTEN_MAX_SHIFT,
554                        DA7213_ALC_ATTEN_GAIN_MAX_MAX, DA7213_NO_INVERT,
555                        alc_gain_tlv),
556         SOC_SINGLE_TLV("ALC Max Gain Volume", DA7213_ALC_GAIN_LIMITS,
557                        DA7213_ALC_GAIN_MAX_SHIFT, DA7213_ALC_ATTEN_GAIN_MAX_MAX,
558                        DA7213_NO_INVERT, alc_gain_tlv),
559         SOC_SINGLE_TLV("ALC Min Analog Gain Volume", DA7213_ALC_ANA_GAIN_LIMITS,
560                        DA7213_ALC_ANA_GAIN_MIN_SHIFT, DA7213_ALC_ANA_GAIN_MAX,
561                        DA7213_NO_INVERT, alc_analog_gain_tlv),
562         SOC_SINGLE_TLV("ALC Max Analog Gain Volume", DA7213_ALC_ANA_GAIN_LIMITS,
563                        DA7213_ALC_ANA_GAIN_MAX_SHIFT, DA7213_ALC_ANA_GAIN_MAX,
564                        DA7213_NO_INVERT, alc_analog_gain_tlv),
565         SOC_SINGLE("ALC Anticlip Mode Switch", DA7213_ALC_ANTICLIP_CTRL,
566                    DA7213_ALC_ANTICLIP_EN_SHIFT, DA7213_ALC_ANTICLIP_EN_MAX,
567                    DA7213_NO_INVERT),
568         SOC_SINGLE("ALC Anticlip Level", DA7213_ALC_ANTICLIP_LEVEL,
569                    DA7213_ALC_ANTICLIP_LEVEL_SHIFT,
570                    DA7213_ALC_ANTICLIP_LEVEL_MAX, DA7213_NO_INVERT),
571 };
572
573
574 /*
575  * DAPM
576  */
577
578 /*
579  * Enums
580  */
581
582 /* MIC PGA source select */
583 static const char * const da7213_mic_amp_in_sel_txt[] = {
584         "Differential", "MIC_P", "MIC_N"
585 };
586
587 static SOC_ENUM_SINGLE_DECL(da7213_mic_1_amp_in_sel,
588                             DA7213_MIC_1_CTRL,
589                             DA7213_MIC_AMP_IN_SEL_SHIFT,
590                             da7213_mic_amp_in_sel_txt);
591 static const struct snd_kcontrol_new da7213_mic_1_amp_in_sel_mux =
592         SOC_DAPM_ENUM("Mic 1 Amp Source MUX", da7213_mic_1_amp_in_sel);
593
594 static SOC_ENUM_SINGLE_DECL(da7213_mic_2_amp_in_sel,
595                             DA7213_MIC_2_CTRL,
596                             DA7213_MIC_AMP_IN_SEL_SHIFT,
597                             da7213_mic_amp_in_sel_txt);
598 static const struct snd_kcontrol_new da7213_mic_2_amp_in_sel_mux =
599         SOC_DAPM_ENUM("Mic 2 Amp Source MUX", da7213_mic_2_amp_in_sel);
600
601 /* DAI routing select */
602 static const char * const da7213_dai_src_txt[] = {
603         "ADC Left", "ADC Right", "DAI Input Left", "DAI Input Right"
604 };
605
606 static SOC_ENUM_SINGLE_DECL(da7213_dai_l_src,
607                             DA7213_DIG_ROUTING_DAI,
608                             DA7213_DAI_L_SRC_SHIFT,
609                             da7213_dai_src_txt);
610 static const struct snd_kcontrol_new da7213_dai_l_src_mux =
611         SOC_DAPM_ENUM("DAI Left Source MUX", da7213_dai_l_src);
612
613 static SOC_ENUM_SINGLE_DECL(da7213_dai_r_src,
614                             DA7213_DIG_ROUTING_DAI,
615                             DA7213_DAI_R_SRC_SHIFT,
616                             da7213_dai_src_txt);
617 static const struct snd_kcontrol_new da7213_dai_r_src_mux =
618         SOC_DAPM_ENUM("DAI Right Source MUX", da7213_dai_r_src);
619
620 /* DAC routing select */
621 static const char * const da7213_dac_src_txt[] = {
622         "ADC Output Left", "ADC Output Right", "DAI Input Left",
623         "DAI Input Right"
624 };
625
626 static SOC_ENUM_SINGLE_DECL(da7213_dac_l_src,
627                             DA7213_DIG_ROUTING_DAC,
628                             DA7213_DAC_L_SRC_SHIFT,
629                             da7213_dac_src_txt);
630 static const struct snd_kcontrol_new da7213_dac_l_src_mux =
631         SOC_DAPM_ENUM("DAC Left Source MUX", da7213_dac_l_src);
632
633 static SOC_ENUM_SINGLE_DECL(da7213_dac_r_src,
634                             DA7213_DIG_ROUTING_DAC,
635                             DA7213_DAC_R_SRC_SHIFT,
636                             da7213_dac_src_txt);
637 static const struct snd_kcontrol_new da7213_dac_r_src_mux =
638         SOC_DAPM_ENUM("DAC Right Source MUX", da7213_dac_r_src);
639
640 /*
641  * Mixer Controls
642  */
643
644 /* Mixin Left */
645 static const struct snd_kcontrol_new da7213_dapm_mixinl_controls[] = {
646         SOC_DAPM_SINGLE("Aux Left Switch", DA7213_MIXIN_L_SELECT,
647                         DA7213_MIXIN_L_MIX_SELECT_AUX_L_SHIFT,
648                         DA7213_MIXIN_L_MIX_SELECT_MAX, DA7213_NO_INVERT),
649         SOC_DAPM_SINGLE("Mic 1 Switch", DA7213_MIXIN_L_SELECT,
650                         DA7213_MIXIN_L_MIX_SELECT_MIC_1_SHIFT,
651                         DA7213_MIXIN_L_MIX_SELECT_MAX, DA7213_NO_INVERT),
652         SOC_DAPM_SINGLE("Mic 2 Switch", DA7213_MIXIN_L_SELECT,
653                         DA7213_MIXIN_L_MIX_SELECT_MIC_2_SHIFT,
654                         DA7213_MIXIN_L_MIX_SELECT_MAX, DA7213_NO_INVERT),
655         SOC_DAPM_SINGLE("Mixin Right Switch", DA7213_MIXIN_L_SELECT,
656                         DA7213_MIXIN_L_MIX_SELECT_MIXIN_R_SHIFT,
657                         DA7213_MIXIN_L_MIX_SELECT_MAX, DA7213_NO_INVERT),
658 };
659
660 /* Mixin Right */
661 static const struct snd_kcontrol_new da7213_dapm_mixinr_controls[] = {
662         SOC_DAPM_SINGLE("Aux Right Switch", DA7213_MIXIN_R_SELECT,
663                         DA7213_MIXIN_R_MIX_SELECT_AUX_R_SHIFT,
664                         DA7213_MIXIN_R_MIX_SELECT_MAX, DA7213_NO_INVERT),
665         SOC_DAPM_SINGLE("Mic 2 Switch", DA7213_MIXIN_R_SELECT,
666                         DA7213_MIXIN_R_MIX_SELECT_MIC_2_SHIFT,
667                         DA7213_MIXIN_R_MIX_SELECT_MAX, DA7213_NO_INVERT),
668         SOC_DAPM_SINGLE("Mic 1 Switch", DA7213_MIXIN_R_SELECT,
669                         DA7213_MIXIN_R_MIX_SELECT_MIC_1_SHIFT,
670                         DA7213_MIXIN_R_MIX_SELECT_MAX, DA7213_NO_INVERT),
671         SOC_DAPM_SINGLE("Mixin Left Switch", DA7213_MIXIN_R_SELECT,
672                         DA7213_MIXIN_R_MIX_SELECT_MIXIN_L_SHIFT,
673                         DA7213_MIXIN_R_MIX_SELECT_MAX, DA7213_NO_INVERT),
674 };
675
676 /* Mixout Left */
677 static const struct snd_kcontrol_new da7213_dapm_mixoutl_controls[] = {
678         SOC_DAPM_SINGLE("Aux Left Switch", DA7213_MIXOUT_L_SELECT,
679                         DA7213_MIXOUT_L_MIX_SELECT_AUX_L_SHIFT,
680                         DA7213_MIXOUT_L_MIX_SELECT_MAX, DA7213_NO_INVERT),
681         SOC_DAPM_SINGLE("Mixin Left Switch", DA7213_MIXOUT_L_SELECT,
682                         DA7213_MIXOUT_L_MIX_SELECT_MIXIN_L_SHIFT,
683                         DA7213_MIXOUT_L_MIX_SELECT_MAX, DA7213_NO_INVERT),
684         SOC_DAPM_SINGLE("Mixin Right Switch", DA7213_MIXOUT_L_SELECT,
685                         DA7213_MIXOUT_L_MIX_SELECT_MIXIN_R_SHIFT,
686                         DA7213_MIXOUT_L_MIX_SELECT_MAX, DA7213_NO_INVERT),
687         SOC_DAPM_SINGLE("DAC Left Switch", DA7213_MIXOUT_L_SELECT,
688                         DA7213_MIXOUT_L_MIX_SELECT_DAC_L_SHIFT,
689                         DA7213_MIXOUT_L_MIX_SELECT_MAX, DA7213_NO_INVERT),
690         SOC_DAPM_SINGLE("Aux Left Invert Switch", DA7213_MIXOUT_L_SELECT,
691                         DA7213_MIXOUT_L_MIX_SELECT_AUX_L_INVERTED_SHIFT,
692                         DA7213_MIXOUT_L_MIX_SELECT_MAX, DA7213_NO_INVERT),
693         SOC_DAPM_SINGLE("Mixin Left Invert Switch", DA7213_MIXOUT_L_SELECT,
694                         DA7213_MIXOUT_L_MIX_SELECT_MIXIN_L_INVERTED_SHIFT,
695                         DA7213_MIXOUT_L_MIX_SELECT_MAX, DA7213_NO_INVERT),
696         SOC_DAPM_SINGLE("Mixin Right Invert Switch", DA7213_MIXOUT_L_SELECT,
697                         DA7213_MIXOUT_L_MIX_SELECT_MIXIN_R_INVERTED_SHIFT,
698                         DA7213_MIXOUT_L_MIX_SELECT_MAX, DA7213_NO_INVERT),
699 };
700
701 /* Mixout Right */
702 static const struct snd_kcontrol_new da7213_dapm_mixoutr_controls[] = {
703         SOC_DAPM_SINGLE("Aux Right Switch", DA7213_MIXOUT_R_SELECT,
704                         DA7213_MIXOUT_R_MIX_SELECT_AUX_R_SHIFT,
705                         DA7213_MIXOUT_R_MIX_SELECT_MAX, DA7213_NO_INVERT),
706         SOC_DAPM_SINGLE("Mixin Right Switch", DA7213_MIXOUT_R_SELECT,
707                         DA7213_MIXOUT_R_MIX_SELECT_MIXIN_R_SHIFT,
708                         DA7213_MIXOUT_R_MIX_SELECT_MAX, DA7213_NO_INVERT),
709         SOC_DAPM_SINGLE("Mixin Left Switch", DA7213_MIXOUT_R_SELECT,
710                         DA7213_MIXOUT_R_MIX_SELECT_MIXIN_L_SHIFT,
711                         DA7213_MIXOUT_R_MIX_SELECT_MAX, DA7213_NO_INVERT),
712         SOC_DAPM_SINGLE("DAC Right Switch", DA7213_MIXOUT_R_SELECT,
713                         DA7213_MIXOUT_R_MIX_SELECT_DAC_R_SHIFT,
714                         DA7213_MIXOUT_R_MIX_SELECT_MAX, DA7213_NO_INVERT),
715         SOC_DAPM_SINGLE("Aux Right Invert Switch", DA7213_MIXOUT_R_SELECT,
716                         DA7213_MIXOUT_R_MIX_SELECT_AUX_R_INVERTED_SHIFT,
717                         DA7213_MIXOUT_R_MIX_SELECT_MAX, DA7213_NO_INVERT),
718         SOC_DAPM_SINGLE("Mixin Right Invert Switch", DA7213_MIXOUT_R_SELECT,
719                         DA7213_MIXOUT_R_MIX_SELECT_MIXIN_R_INVERTED_SHIFT,
720                         DA7213_MIXOUT_R_MIX_SELECT_MAX, DA7213_NO_INVERT),
721         SOC_DAPM_SINGLE("Mixin Left Invert Switch", DA7213_MIXOUT_R_SELECT,
722                         DA7213_MIXOUT_R_MIX_SELECT_MIXIN_L_INVERTED_SHIFT,
723                         DA7213_MIXOUT_R_MIX_SELECT_MAX, DA7213_NO_INVERT),
724 };
725
726
727 /*
728  * DAPM widgets
729  */
730
731 static const struct snd_soc_dapm_widget da7213_dapm_widgets[] = {
732         /*
733          * Input & Output
734          */
735
736         /* Use a supply here as this controls both input & output DAIs */
737         SND_SOC_DAPM_SUPPLY("DAI", DA7213_DAI_CTRL, DA7213_DAI_EN_SHIFT,
738                             DA7213_NO_INVERT, NULL, 0),
739
740         /*
741          * Input
742          */
743
744         /* Input Lines */
745         SND_SOC_DAPM_INPUT("MIC1"),
746         SND_SOC_DAPM_INPUT("MIC2"),
747         SND_SOC_DAPM_INPUT("AUXL"),
748         SND_SOC_DAPM_INPUT("AUXR"),
749
750         /* MUXs for Mic PGA source selection */
751         SND_SOC_DAPM_MUX("Mic 1 Amp Source MUX", SND_SOC_NOPM, 0, 0,
752                          &da7213_mic_1_amp_in_sel_mux),
753         SND_SOC_DAPM_MUX("Mic 2 Amp Source MUX", SND_SOC_NOPM, 0, 0,
754                          &da7213_mic_2_amp_in_sel_mux),
755
756         /* Input PGAs */
757         SND_SOC_DAPM_PGA("Mic 1 PGA", DA7213_MIC_1_CTRL, DA7213_AMP_EN_SHIFT,
758                          DA7213_NO_INVERT, NULL, 0),
759         SND_SOC_DAPM_PGA("Mic 2 PGA", DA7213_MIC_2_CTRL, DA7213_AMP_EN_SHIFT,
760                          DA7213_NO_INVERT, NULL, 0),
761         SND_SOC_DAPM_PGA("Aux Left PGA", DA7213_AUX_L_CTRL, DA7213_AMP_EN_SHIFT,
762                          DA7213_NO_INVERT, NULL, 0),
763         SND_SOC_DAPM_PGA("Aux Right PGA", DA7213_AUX_R_CTRL,
764                          DA7213_AMP_EN_SHIFT, DA7213_NO_INVERT, NULL, 0),
765         SND_SOC_DAPM_PGA("Mixin Left PGA", DA7213_MIXIN_L_CTRL,
766                          DA7213_AMP_EN_SHIFT, DA7213_NO_INVERT, NULL, 0),
767         SND_SOC_DAPM_PGA("Mixin Right PGA", DA7213_MIXIN_R_CTRL,
768                          DA7213_AMP_EN_SHIFT, DA7213_NO_INVERT, NULL, 0),
769
770         /* Mic Biases */
771         SND_SOC_DAPM_SUPPLY("Mic Bias 1", DA7213_MICBIAS_CTRL,
772                             DA7213_MICBIAS1_EN_SHIFT, DA7213_NO_INVERT,
773                             NULL, 0),
774         SND_SOC_DAPM_SUPPLY("Mic Bias 2", DA7213_MICBIAS_CTRL,
775                             DA7213_MICBIAS2_EN_SHIFT, DA7213_NO_INVERT,
776                             NULL, 0),
777
778         /* Input Mixers */
779         SND_SOC_DAPM_MIXER("Mixin Left", SND_SOC_NOPM, 0, 0,
780                            &da7213_dapm_mixinl_controls[0],
781                            ARRAY_SIZE(da7213_dapm_mixinl_controls)),
782         SND_SOC_DAPM_MIXER("Mixin Right", SND_SOC_NOPM, 0, 0,
783                            &da7213_dapm_mixinr_controls[0],
784                            ARRAY_SIZE(da7213_dapm_mixinr_controls)),
785
786         /* ADCs */
787         SND_SOC_DAPM_ADC("ADC Left", NULL, DA7213_ADC_L_CTRL,
788                          DA7213_ADC_EN_SHIFT, DA7213_NO_INVERT),
789         SND_SOC_DAPM_ADC("ADC Right", NULL, DA7213_ADC_R_CTRL,
790                          DA7213_ADC_EN_SHIFT, DA7213_NO_INVERT),
791
792         /* DAI */
793         SND_SOC_DAPM_MUX("DAI Left Source MUX", SND_SOC_NOPM, 0, 0,
794                          &da7213_dai_l_src_mux),
795         SND_SOC_DAPM_MUX("DAI Right Source MUX", SND_SOC_NOPM, 0, 0,
796                          &da7213_dai_r_src_mux),
797         SND_SOC_DAPM_AIF_OUT("DAIOUTL", "Capture", 0, SND_SOC_NOPM, 0, 0),
798         SND_SOC_DAPM_AIF_OUT("DAIOUTR", "Capture", 1, SND_SOC_NOPM, 0, 0),
799
800         /*
801          * Output
802          */
803
804         /* DAI */
805         SND_SOC_DAPM_AIF_IN("DAIINL", "Playback", 0, SND_SOC_NOPM, 0, 0),
806         SND_SOC_DAPM_AIF_IN("DAIINR", "Playback", 1, SND_SOC_NOPM, 0, 0),
807         SND_SOC_DAPM_MUX("DAC Left Source MUX", SND_SOC_NOPM, 0, 0,
808                          &da7213_dac_l_src_mux),
809         SND_SOC_DAPM_MUX("DAC Right Source MUX", SND_SOC_NOPM, 0, 0,
810                          &da7213_dac_r_src_mux),
811
812         /* DACs */
813         SND_SOC_DAPM_DAC("DAC Left", NULL, DA7213_DAC_L_CTRL,
814                          DA7213_DAC_EN_SHIFT, DA7213_NO_INVERT),
815         SND_SOC_DAPM_DAC("DAC Right", NULL, DA7213_DAC_R_CTRL,
816                          DA7213_DAC_EN_SHIFT, DA7213_NO_INVERT),
817
818         /* Output Mixers */
819         SND_SOC_DAPM_MIXER("Mixout Left", SND_SOC_NOPM, 0, 0,
820                            &da7213_dapm_mixoutl_controls[0],
821                            ARRAY_SIZE(da7213_dapm_mixoutl_controls)),
822         SND_SOC_DAPM_MIXER("Mixout Right", SND_SOC_NOPM, 0, 0,
823                            &da7213_dapm_mixoutr_controls[0],
824                            ARRAY_SIZE(da7213_dapm_mixoutr_controls)),
825
826         /* Output PGAs */
827         SND_SOC_DAPM_PGA("Mixout Left PGA", DA7213_MIXOUT_L_CTRL,
828                          DA7213_AMP_EN_SHIFT, DA7213_NO_INVERT, NULL, 0),
829         SND_SOC_DAPM_PGA("Mixout Right PGA", DA7213_MIXOUT_R_CTRL,
830                          DA7213_AMP_EN_SHIFT, DA7213_NO_INVERT, NULL, 0),
831         SND_SOC_DAPM_PGA("Lineout PGA", DA7213_LINE_CTRL, DA7213_AMP_EN_SHIFT,
832                          DA7213_NO_INVERT, NULL, 0),
833         SND_SOC_DAPM_PGA("Headphone Left PGA", DA7213_HP_L_CTRL,
834                          DA7213_AMP_EN_SHIFT, DA7213_NO_INVERT, NULL, 0),
835         SND_SOC_DAPM_PGA("Headphone Right PGA", DA7213_HP_R_CTRL,
836                          DA7213_AMP_EN_SHIFT, DA7213_NO_INVERT, NULL, 0),
837
838         /* Charge Pump */
839         SND_SOC_DAPM_SUPPLY("Charge Pump", DA7213_CP_CTRL, DA7213_CP_EN_SHIFT,
840                             DA7213_NO_INVERT, NULL, 0),
841
842         /* Output Lines */
843         SND_SOC_DAPM_OUTPUT("HPL"),
844         SND_SOC_DAPM_OUTPUT("HPR"),
845         SND_SOC_DAPM_OUTPUT("LINE"),
846 };
847
848
849 /*
850  * DAPM audio route definition
851  */
852
853 static const struct snd_soc_dapm_route da7213_audio_map[] = {
854         /* Dest       Connecting Widget    source */
855
856         /* Input path */
857         {"MIC1", NULL, "Mic Bias 1"},
858         {"MIC2", NULL, "Mic Bias 2"},
859
860         {"Mic 1 Amp Source MUX", "Differential", "MIC1"},
861         {"Mic 1 Amp Source MUX", "MIC_P", "MIC1"},
862         {"Mic 1 Amp Source MUX", "MIC_N", "MIC1"},
863
864         {"Mic 2 Amp Source MUX", "Differential", "MIC2"},
865         {"Mic 2 Amp Source MUX", "MIC_P", "MIC2"},
866         {"Mic 2 Amp Source MUX", "MIC_N", "MIC2"},
867
868         {"Mic 1 PGA", NULL, "Mic 1 Amp Source MUX"},
869         {"Mic 2 PGA", NULL, "Mic 2 Amp Source MUX"},
870
871         {"Aux Left PGA", NULL, "AUXL"},
872         {"Aux Right PGA", NULL, "AUXR"},
873
874         {"Mixin Left", "Aux Left Switch", "Aux Left PGA"},
875         {"Mixin Left", "Mic 1 Switch", "Mic 1 PGA"},
876         {"Mixin Left", "Mic 2 Switch", "Mic 2 PGA"},
877         {"Mixin Left", "Mixin Right Switch", "Mixin Right PGA"},
878
879         {"Mixin Right", "Aux Right Switch", "Aux Right PGA"},
880         {"Mixin Right", "Mic 2 Switch", "Mic 2 PGA"},
881         {"Mixin Right", "Mic 1 Switch", "Mic 1 PGA"},
882         {"Mixin Right", "Mixin Left Switch", "Mixin Left PGA"},
883
884         {"Mixin Left PGA", NULL, "Mixin Left"},
885         {"ADC Left", NULL, "Mixin Left PGA"},
886
887         {"Mixin Right PGA", NULL, "Mixin Right"},
888         {"ADC Right", NULL, "Mixin Right PGA"},
889
890         {"DAI Left Source MUX", "ADC Left", "ADC Left"},
891         {"DAI Left Source MUX", "ADC Right", "ADC Right"},
892         {"DAI Left Source MUX", "DAI Input Left", "DAIINL"},
893         {"DAI Left Source MUX", "DAI Input Right", "DAIINR"},
894
895         {"DAI Right Source MUX", "ADC Left", "ADC Left"},
896         {"DAI Right Source MUX", "ADC Right", "ADC Right"},
897         {"DAI Right Source MUX", "DAI Input Left", "DAIINL"},
898         {"DAI Right Source MUX", "DAI Input Right", "DAIINR"},
899
900         {"DAIOUTL", NULL, "DAI Left Source MUX"},
901         {"DAIOUTR", NULL, "DAI Right Source MUX"},
902
903         {"DAIOUTL", NULL, "DAI"},
904         {"DAIOUTR", NULL, "DAI"},
905
906         /* Output path */
907         {"DAIINL", NULL, "DAI"},
908         {"DAIINR", NULL, "DAI"},
909
910         {"DAC Left Source MUX", "ADC Output Left", "ADC Left"},
911         {"DAC Left Source MUX", "ADC Output Right", "ADC Right"},
912         {"DAC Left Source MUX", "DAI Input Left", "DAIINL"},
913         {"DAC Left Source MUX", "DAI Input Right", "DAIINR"},
914
915         {"DAC Right Source MUX", "ADC Output Left", "ADC Left"},
916         {"DAC Right Source MUX", "ADC Output Right", "ADC Right"},
917         {"DAC Right Source MUX", "DAI Input Left", "DAIINL"},
918         {"DAC Right Source MUX", "DAI Input Right", "DAIINR"},
919
920         {"DAC Left", NULL, "DAC Left Source MUX"},
921         {"DAC Right", NULL, "DAC Right Source MUX"},
922
923         {"Mixout Left", "Aux Left Switch", "Aux Left PGA"},
924         {"Mixout Left", "Mixin Left Switch", "Mixin Left PGA"},
925         {"Mixout Left", "Mixin Right Switch", "Mixin Right PGA"},
926         {"Mixout Left", "DAC Left Switch", "DAC Left"},
927         {"Mixout Left", "Aux Left Invert Switch", "Aux Left PGA"},
928         {"Mixout Left", "Mixin Left Invert Switch", "Mixin Left PGA"},
929         {"Mixout Left", "Mixin Right Invert Switch", "Mixin Right PGA"},
930
931         {"Mixout Right", "Aux Right Switch", "Aux Right PGA"},
932         {"Mixout Right", "Mixin Right Switch", "Mixin Right PGA"},
933         {"Mixout Right", "Mixin Left Switch", "Mixin Left PGA"},
934         {"Mixout Right", "DAC Right Switch", "DAC Right"},
935         {"Mixout Right", "Aux Right Invert Switch", "Aux Right PGA"},
936         {"Mixout Right", "Mixin Right Invert Switch", "Mixin Right PGA"},
937         {"Mixout Right", "Mixin Left Invert Switch", "Mixin Left PGA"},
938
939         {"Mixout Left PGA", NULL, "Mixout Left"},
940         {"Mixout Right PGA", NULL, "Mixout Right"},
941
942         {"Headphone Left PGA", NULL, "Mixout Left PGA"},
943         {"Headphone Left PGA", NULL, "Charge Pump"},
944         {"HPL", NULL, "Headphone Left PGA"},
945
946         {"Headphone Right PGA", NULL, "Mixout Right PGA"},
947         {"Headphone Right PGA", NULL, "Charge Pump"},
948         {"HPR", NULL, "Headphone Right PGA"},
949
950         {"Lineout PGA", NULL, "Mixout Right PGA"},
951         {"LINE", NULL, "Lineout PGA"},
952 };
953
954 static const struct reg_default da7213_reg_defaults[] = {
955         { DA7213_DIG_ROUTING_DAI, 0x10 },
956         { DA7213_SR, 0x0A },
957         { DA7213_REFERENCES, 0x80 },
958         { DA7213_PLL_FRAC_TOP, 0x00 },
959         { DA7213_PLL_FRAC_BOT, 0x00 },
960         { DA7213_PLL_INTEGER, 0x20 },
961         { DA7213_PLL_CTRL, 0x0C },
962         { DA7213_DAI_CLK_MODE, 0x01 },
963         { DA7213_DAI_CTRL, 0x08 },
964         { DA7213_DIG_ROUTING_DAC, 0x32 },
965         { DA7213_AUX_L_GAIN, 0x35 },
966         { DA7213_AUX_R_GAIN, 0x35 },
967         { DA7213_MIXIN_L_SELECT, 0x00 },
968         { DA7213_MIXIN_R_SELECT, 0x00 },
969         { DA7213_MIXIN_L_GAIN, 0x03 },
970         { DA7213_MIXIN_R_GAIN, 0x03 },
971         { DA7213_ADC_L_GAIN, 0x6F },
972         { DA7213_ADC_R_GAIN, 0x6F },
973         { DA7213_ADC_FILTERS1, 0x80 },
974         { DA7213_MIC_1_GAIN, 0x01 },
975         { DA7213_MIC_2_GAIN, 0x01 },
976         { DA7213_DAC_FILTERS5, 0x00 },
977         { DA7213_DAC_FILTERS2, 0x88 },
978         { DA7213_DAC_FILTERS3, 0x88 },
979         { DA7213_DAC_FILTERS4, 0x08 },
980         { DA7213_DAC_FILTERS1, 0x80 },
981         { DA7213_DAC_L_GAIN, 0x6F },
982         { DA7213_DAC_R_GAIN, 0x6F },
983         { DA7213_CP_CTRL, 0x61 },
984         { DA7213_HP_L_GAIN, 0x39 },
985         { DA7213_HP_R_GAIN, 0x39 },
986         { DA7213_LINE_GAIN, 0x30 },
987         { DA7213_MIXOUT_L_SELECT, 0x00 },
988         { DA7213_MIXOUT_R_SELECT, 0x00 },
989         { DA7213_SYSTEM_MODES_INPUT, 0x00 },
990         { DA7213_SYSTEM_MODES_OUTPUT, 0x00 },
991         { DA7213_AUX_L_CTRL, 0x44 },
992         { DA7213_AUX_R_CTRL, 0x44 },
993         { DA7213_MICBIAS_CTRL, 0x11 },
994         { DA7213_MIC_1_CTRL, 0x40 },
995         { DA7213_MIC_2_CTRL, 0x40 },
996         { DA7213_MIXIN_L_CTRL, 0x40 },
997         { DA7213_MIXIN_R_CTRL, 0x40 },
998         { DA7213_ADC_L_CTRL, 0x40 },
999         { DA7213_ADC_R_CTRL, 0x40 },
1000         { DA7213_DAC_L_CTRL, 0x48 },
1001         { DA7213_DAC_R_CTRL, 0x40 },
1002         { DA7213_HP_L_CTRL, 0x41 },
1003         { DA7213_HP_R_CTRL, 0x40 },
1004         { DA7213_LINE_CTRL, 0x40 },
1005         { DA7213_MIXOUT_L_CTRL, 0x10 },
1006         { DA7213_MIXOUT_R_CTRL, 0x10 },
1007         { DA7213_LDO_CTRL, 0x00 },
1008         { DA7213_IO_CTRL, 0x00 },
1009         { DA7213_GAIN_RAMP_CTRL, 0x00},
1010         { DA7213_MIC_CONFIG, 0x00 },
1011         { DA7213_PC_COUNT, 0x00 },
1012         { DA7213_CP_VOL_THRESHOLD1, 0x32 },
1013         { DA7213_CP_DELAY, 0x95 },
1014         { DA7213_CP_DETECTOR, 0x00 },
1015         { DA7213_DAI_OFFSET, 0x00 },
1016         { DA7213_DIG_CTRL, 0x00 },
1017         { DA7213_ALC_CTRL2, 0x00 },
1018         { DA7213_ALC_CTRL3, 0x00 },
1019         { DA7213_ALC_NOISE, 0x3F },
1020         { DA7213_ALC_TARGET_MIN, 0x3F },
1021         { DA7213_ALC_TARGET_MAX, 0x00 },
1022         { DA7213_ALC_GAIN_LIMITS, 0xFF },
1023         { DA7213_ALC_ANA_GAIN_LIMITS, 0x71 },
1024         { DA7213_ALC_ANTICLIP_CTRL, 0x00 },
1025         { DA7213_ALC_ANTICLIP_LEVEL, 0x00 },
1026         { DA7213_ALC_OFFSET_MAN_M_L, 0x00 },
1027         { DA7213_ALC_OFFSET_MAN_U_L, 0x00 },
1028         { DA7213_ALC_OFFSET_MAN_M_R, 0x00 },
1029         { DA7213_ALC_OFFSET_MAN_U_R, 0x00 },
1030         { DA7213_ALC_CIC_OP_LVL_CTRL, 0x00 },
1031         { DA7213_DAC_NG_SETUP_TIME, 0x00 },
1032         { DA7213_DAC_NG_OFF_THRESHOLD, 0x00 },
1033         { DA7213_DAC_NG_ON_THRESHOLD, 0x00 },
1034         { DA7213_DAC_NG_CTRL, 0x00 },
1035 };
1036
1037 static bool da7213_volatile_register(struct device *dev, unsigned int reg)
1038 {
1039         switch (reg) {
1040         case DA7213_STATUS1:
1041         case DA7213_PLL_STATUS:
1042         case DA7213_AUX_L_GAIN_STATUS:
1043         case DA7213_AUX_R_GAIN_STATUS:
1044         case DA7213_MIC_1_GAIN_STATUS:
1045         case DA7213_MIC_2_GAIN_STATUS:
1046         case DA7213_MIXIN_L_GAIN_STATUS:
1047         case DA7213_MIXIN_R_GAIN_STATUS:
1048         case DA7213_ADC_L_GAIN_STATUS:
1049         case DA7213_ADC_R_GAIN_STATUS:
1050         case DA7213_DAC_L_GAIN_STATUS:
1051         case DA7213_DAC_R_GAIN_STATUS:
1052         case DA7213_HP_L_GAIN_STATUS:
1053         case DA7213_HP_R_GAIN_STATUS:
1054         case DA7213_LINE_GAIN_STATUS:
1055         case DA7213_ALC_CTRL1:
1056         case DA7213_ALC_OFFSET_AUTO_M_L:
1057         case DA7213_ALC_OFFSET_AUTO_U_L:
1058         case DA7213_ALC_OFFSET_AUTO_M_R:
1059         case DA7213_ALC_OFFSET_AUTO_U_R:
1060         case DA7213_ALC_CIC_OP_LVL_DATA:
1061                 return 1;
1062         default:
1063                 return 0;
1064         }
1065 }
1066
1067 static int da7213_hw_params(struct snd_pcm_substream *substream,
1068                             struct snd_pcm_hw_params *params,
1069                             struct snd_soc_dai *dai)
1070 {
1071         struct snd_soc_codec *codec = dai->codec;
1072         u8 dai_ctrl = 0;
1073         u8 fs;
1074
1075         /* Set DAI format */
1076         switch (params_width(params)) {
1077         case 16:
1078                 dai_ctrl |= DA7213_DAI_WORD_LENGTH_S16_LE;
1079                 break;
1080         case 20:
1081                 dai_ctrl |= DA7213_DAI_WORD_LENGTH_S20_LE;
1082                 break;
1083         case 24:
1084                 dai_ctrl |= DA7213_DAI_WORD_LENGTH_S24_LE;
1085                 break;
1086         case 32:
1087                 dai_ctrl |= DA7213_DAI_WORD_LENGTH_S32_LE;
1088                 break;
1089         default:
1090                 return -EINVAL;
1091         }
1092
1093         /* Set sampling rate */
1094         switch (params_rate(params)) {
1095         case 8000:
1096                 fs = DA7213_SR_8000;
1097                 break;
1098         case 11025:
1099                 fs = DA7213_SR_11025;
1100                 break;
1101         case 12000:
1102                 fs = DA7213_SR_12000;
1103                 break;
1104         case 16000:
1105                 fs = DA7213_SR_16000;
1106                 break;
1107         case 22050:
1108                 fs = DA7213_SR_22050;
1109                 break;
1110         case 32000:
1111                 fs = DA7213_SR_32000;
1112                 break;
1113         case 44100:
1114                 fs = DA7213_SR_44100;
1115                 break;
1116         case 48000:
1117                 fs = DA7213_SR_48000;
1118                 break;
1119         case 88200:
1120                 fs = DA7213_SR_88200;
1121                 break;
1122         case 96000:
1123                 fs = DA7213_SR_96000;
1124                 break;
1125         default:
1126                 return -EINVAL;
1127         }
1128
1129         snd_soc_update_bits(codec, DA7213_DAI_CTRL, DA7213_DAI_WORD_LENGTH_MASK,
1130                             dai_ctrl);
1131         snd_soc_write(codec, DA7213_SR, fs);
1132
1133         return 0;
1134 }
1135
1136 static int da7213_set_dai_fmt(struct snd_soc_dai *codec_dai, unsigned int fmt)
1137 {
1138         struct snd_soc_codec *codec = codec_dai->codec;
1139         struct da7213_priv *da7213 = snd_soc_codec_get_drvdata(codec);
1140         u8 dai_clk_mode = 0, dai_ctrl = 0;
1141
1142         /* Set master/slave mode */
1143         switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) {
1144         case SND_SOC_DAIFMT_CBM_CFM:
1145                 dai_clk_mode |= DA7213_DAI_CLK_EN_MASTER_MODE;
1146                 da7213->master = true;
1147                 break;
1148         case SND_SOC_DAIFMT_CBS_CFS:
1149                 dai_clk_mode |= DA7213_DAI_CLK_EN_SLAVE_MODE;
1150                 da7213->master = false;
1151                 break;
1152         default:
1153                 return -EINVAL;
1154         }
1155
1156         /* Set clock normal/inverted */
1157         switch (fmt & SND_SOC_DAIFMT_INV_MASK) {
1158         case SND_SOC_DAIFMT_NB_NF:
1159                 break;
1160         case SND_SOC_DAIFMT_NB_IF:
1161                 dai_clk_mode |= DA7213_DAI_WCLK_POL_INV;
1162                 break;
1163         case SND_SOC_DAIFMT_IB_NF:
1164                 dai_clk_mode |= DA7213_DAI_CLK_POL_INV;
1165                 break;
1166         case SND_SOC_DAIFMT_IB_IF:
1167                 dai_clk_mode |= DA7213_DAI_WCLK_POL_INV | DA7213_DAI_CLK_POL_INV;
1168                 break;
1169         default:
1170                 return -EINVAL;
1171         }
1172
1173         /* Only I2S is supported */
1174         switch (fmt & SND_SOC_DAIFMT_FORMAT_MASK) {
1175         case SND_SOC_DAIFMT_I2S:
1176                 dai_ctrl |= DA7213_DAI_FORMAT_I2S_MODE;
1177                 break;
1178         case SND_SOC_DAIFMT_LEFT_J:
1179                 dai_ctrl |= DA7213_DAI_FORMAT_LEFT_J;
1180                 break;
1181         case SND_SOC_DAIFMT_RIGHT_J:
1182                 dai_ctrl |= DA7213_DAI_FORMAT_RIGHT_J;
1183                 break;
1184         default:
1185                 return -EINVAL;
1186         }
1187
1188         /* By default only 32 BCLK per WCLK is supported */
1189         dai_clk_mode |= DA7213_DAI_BCLKS_PER_WCLK_32;
1190
1191         snd_soc_write(codec, DA7213_DAI_CLK_MODE, dai_clk_mode);
1192         snd_soc_update_bits(codec, DA7213_DAI_CTRL, DA7213_DAI_FORMAT_MASK,
1193                             dai_ctrl);
1194
1195         return 0;
1196 }
1197
1198 static int da7213_mute(struct snd_soc_dai *dai, int mute)
1199 {
1200         struct snd_soc_codec *codec = dai->codec;
1201
1202         if (mute) {
1203                 snd_soc_update_bits(codec, DA7213_DAC_L_CTRL,
1204                                     DA7213_MUTE_EN, DA7213_MUTE_EN);
1205                 snd_soc_update_bits(codec, DA7213_DAC_R_CTRL,
1206                                     DA7213_MUTE_EN, DA7213_MUTE_EN);
1207         } else {
1208                 snd_soc_update_bits(codec, DA7213_DAC_L_CTRL,
1209                                     DA7213_MUTE_EN, 0);
1210                 snd_soc_update_bits(codec, DA7213_DAC_R_CTRL,
1211                                     DA7213_MUTE_EN, 0);
1212         }
1213
1214         return 0;
1215 }
1216
1217 #define DA7213_FORMATS (SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S20_3LE |\
1218                         SNDRV_PCM_FMTBIT_S24_LE | SNDRV_PCM_FMTBIT_S32_LE)
1219
1220 static int da7213_set_dai_sysclk(struct snd_soc_dai *codec_dai,
1221                                  int clk_id, unsigned int freq, int dir)
1222 {
1223         struct snd_soc_codec *codec = codec_dai->codec;
1224         struct da7213_priv *da7213 = snd_soc_codec_get_drvdata(codec);
1225
1226         switch (clk_id) {
1227         case DA7213_CLKSRC_MCLK:
1228                 if ((freq == 32768) ||
1229                     ((freq >= 5000000) && (freq <= 54000000))) {
1230                         da7213->mclk_rate = freq;
1231                         return 0;
1232                 } else {
1233                         dev_err(codec_dai->dev, "Unsupported MCLK value %d\n",
1234                                 freq);
1235                         return -EINVAL;
1236                 }
1237                 break;
1238         default:
1239                 dev_err(codec_dai->dev, "Unknown clock source %d\n", clk_id);
1240                 return -EINVAL;
1241         }
1242 }
1243
1244 /* Supported PLL input frequencies are 5MHz - 54MHz. */
1245 static int da7213_set_dai_pll(struct snd_soc_dai *codec_dai, int pll_id,
1246                               int source, unsigned int fref, unsigned int fout)
1247 {
1248         struct snd_soc_codec *codec = codec_dai->codec;
1249         struct da7213_priv *da7213 = snd_soc_codec_get_drvdata(codec);
1250
1251         u8 pll_ctrl, indiv_bits, indiv;
1252         u8 pll_frac_top, pll_frac_bot, pll_integer;
1253         u32 freq_ref;
1254         u64 frac_div;
1255
1256         /* Reset PLL configuration */
1257         snd_soc_write(codec, DA7213_PLL_CTRL, 0);
1258
1259         pll_ctrl = 0;
1260
1261         /* Workout input divider based on MCLK rate */
1262         if ((da7213->mclk_rate == 32768) && (source == DA7213_SYSCLK_PLL)) {
1263                 /* 32KHz PLL Mode */
1264                 indiv_bits = DA7213_PLL_INDIV_10_20_MHZ;
1265                 indiv = DA7213_PLL_INDIV_10_20_MHZ_VAL;
1266                 freq_ref = 3750000;
1267                 pll_ctrl |= DA7213_PLL_32K_MODE;
1268         } else {
1269                 /* 5 - 54MHz MCLK */
1270                 if (da7213->mclk_rate < 5000000) {
1271                         goto pll_err;
1272                 } else if (da7213->mclk_rate <= 10000000) {
1273                         indiv_bits = DA7213_PLL_INDIV_5_10_MHZ;
1274                         indiv = DA7213_PLL_INDIV_5_10_MHZ_VAL;
1275                 } else if (da7213->mclk_rate <= 20000000) {
1276                         indiv_bits = DA7213_PLL_INDIV_10_20_MHZ;
1277                         indiv = DA7213_PLL_INDIV_10_20_MHZ_VAL;
1278                 } else if (da7213->mclk_rate <= 40000000) {
1279                         indiv_bits = DA7213_PLL_INDIV_20_40_MHZ;
1280                         indiv = DA7213_PLL_INDIV_20_40_MHZ_VAL;
1281                 } else if (da7213->mclk_rate <= 54000000) {
1282                         indiv_bits = DA7213_PLL_INDIV_40_54_MHZ;
1283                         indiv = DA7213_PLL_INDIV_40_54_MHZ_VAL;
1284                 } else {
1285                         goto pll_err;
1286                 }
1287                 freq_ref = (da7213->mclk_rate / indiv);
1288         }
1289
1290         pll_ctrl |= indiv_bits;
1291
1292         /* PLL Bypass mode */
1293         if (source == DA7213_SYSCLK_MCLK) {
1294                 snd_soc_write(codec, DA7213_PLL_CTRL, pll_ctrl);
1295                 return 0;
1296         }
1297
1298         /*
1299          * If Codec is slave and SRM enabled,
1300          * freq_out is (98304000 + 90316800)/2 = 94310400
1301          */
1302         if (!da7213->master && da7213->srm_en) {
1303                 fout = DA7213_PLL_FREQ_OUT_94310400;
1304                 pll_ctrl |= DA7213_PLL_SRM_EN;
1305         }
1306
1307         /* Enable MCLK squarer if required */
1308         if (da7213->mclk_squarer_en)
1309                 pll_ctrl |= DA7213_PLL_MCLK_SQR_EN;
1310
1311         /* Calculate dividers for PLL */
1312         pll_integer = fout / freq_ref;
1313         frac_div = (u64)(fout % freq_ref) * 8192ULL;
1314         do_div(frac_div, freq_ref);
1315         pll_frac_top = (frac_div >> DA7213_BYTE_SHIFT) & DA7213_BYTE_MASK;
1316         pll_frac_bot = (frac_div) & DA7213_BYTE_MASK;
1317
1318         /* Write PLL dividers */
1319         snd_soc_write(codec, DA7213_PLL_FRAC_TOP, pll_frac_top);
1320         snd_soc_write(codec, DA7213_PLL_FRAC_BOT, pll_frac_bot);
1321         snd_soc_write(codec, DA7213_PLL_INTEGER, pll_integer);
1322
1323         /* Enable PLL */
1324         pll_ctrl |= DA7213_PLL_EN;
1325         snd_soc_write(codec, DA7213_PLL_CTRL, pll_ctrl);
1326
1327         return 0;
1328
1329 pll_err:
1330         dev_err(codec_dai->dev, "Unsupported PLL input frequency %d\n",
1331                 da7213->mclk_rate);
1332         return -EINVAL;
1333 }
1334
1335 /* DAI operations */
1336 static const struct snd_soc_dai_ops da7213_dai_ops = {
1337         .hw_params      = da7213_hw_params,
1338         .set_fmt        = da7213_set_dai_fmt,
1339         .set_sysclk     = da7213_set_dai_sysclk,
1340         .set_pll        = da7213_set_dai_pll,
1341         .digital_mute   = da7213_mute,
1342 };
1343
1344 static struct snd_soc_dai_driver da7213_dai = {
1345         .name = "da7213-hifi",
1346         /* Playback Capabilities */
1347         .playback = {
1348                 .stream_name = "Playback",
1349                 .channels_min = 1,
1350                 .channels_max = 2,
1351                 .rates = SNDRV_PCM_RATE_8000_96000,
1352                 .formats = DA7213_FORMATS,
1353         },
1354         /* Capture Capabilities */
1355         .capture = {
1356                 .stream_name = "Capture",
1357                 .channels_min = 1,
1358                 .channels_max = 2,
1359                 .rates = SNDRV_PCM_RATE_8000_96000,
1360                 .formats = DA7213_FORMATS,
1361         },
1362         .ops = &da7213_dai_ops,
1363         .symmetric_rates = 1,
1364 };
1365
1366 static int da7213_set_bias_level(struct snd_soc_codec *codec,
1367                                  enum snd_soc_bias_level level)
1368 {
1369         switch (level) {
1370         case SND_SOC_BIAS_ON:
1371         case SND_SOC_BIAS_PREPARE:
1372                 break;
1373         case SND_SOC_BIAS_STANDBY:
1374                 if (snd_soc_codec_get_bias_level(codec) == SND_SOC_BIAS_OFF) {
1375                         /* Enable VMID reference & master bias */
1376                         snd_soc_update_bits(codec, DA7213_REFERENCES,
1377                                             DA7213_VMID_EN | DA7213_BIAS_EN,
1378                                             DA7213_VMID_EN | DA7213_BIAS_EN);
1379                 }
1380                 break;
1381         case SND_SOC_BIAS_OFF:
1382                 /* Disable VMID reference & master bias */
1383                 snd_soc_update_bits(codec, DA7213_REFERENCES,
1384                                     DA7213_VMID_EN | DA7213_BIAS_EN, 0);
1385                 break;
1386         }
1387         return 0;
1388 }
1389
1390 /* DT */
1391 static const struct of_device_id da7213_of_match[] = {
1392         { .compatible = "dlg,da7213", },
1393         { }
1394 };
1395 MODULE_DEVICE_TABLE(of, da7213_of_match);
1396
1397 static enum da7213_micbias_voltage
1398         da7213_of_micbias_lvl(struct snd_soc_codec *codec, u32 val)
1399 {
1400         switch (val) {
1401         case 1600:
1402                 return DA7213_MICBIAS_1_6V;
1403         case 2200:
1404                 return DA7213_MICBIAS_2_2V;
1405         case 2500:
1406                 return DA7213_MICBIAS_2_5V;
1407         case 3000:
1408                 return DA7213_MICBIAS_3_0V;
1409         default:
1410                 dev_warn(codec->dev, "Invalid micbias level\n");
1411                 return DA7213_MICBIAS_2_2V;
1412         }
1413 }
1414
1415 static enum da7213_dmic_data_sel
1416         da7213_of_dmic_data_sel(struct snd_soc_codec *codec, const char *str)
1417 {
1418         if (!strcmp(str, "lrise_rfall")) {
1419                 return DA7213_DMIC_DATA_LRISE_RFALL;
1420         } else if (!strcmp(str, "lfall_rrise")) {
1421                 return DA7213_DMIC_DATA_LFALL_RRISE;
1422         } else {
1423                 dev_warn(codec->dev, "Invalid DMIC data select type\n");
1424                 return DA7213_DMIC_DATA_LRISE_RFALL;
1425         }
1426 }
1427
1428 static enum da7213_dmic_samplephase
1429         da7213_of_dmic_samplephase(struct snd_soc_codec *codec, const char *str)
1430 {
1431         if (!strcmp(str, "on_clkedge")) {
1432                 return DA7213_DMIC_SAMPLE_ON_CLKEDGE;
1433         } else if (!strcmp(str, "between_clkedge")) {
1434                 return DA7213_DMIC_SAMPLE_BETWEEN_CLKEDGE;
1435         } else {
1436                 dev_warn(codec->dev, "Invalid DMIC sample phase\n");
1437                 return DA7213_DMIC_SAMPLE_ON_CLKEDGE;
1438         }
1439 }
1440
1441 static enum da7213_dmic_clk_rate
1442         da7213_of_dmic_clkrate(struct snd_soc_codec *codec, u32 val)
1443 {
1444         switch (val) {
1445         case 1500000:
1446                 return DA7213_DMIC_CLK_1_5MHZ;
1447         case 3000000:
1448                 return DA7213_DMIC_CLK_3_0MHZ;
1449         default:
1450                 dev_warn(codec->dev, "Invalid DMIC clock rate\n");
1451                 return DA7213_DMIC_CLK_1_5MHZ;
1452         }
1453 }
1454
1455 static struct da7213_platform_data
1456         *da7213_of_to_pdata(struct snd_soc_codec *codec)
1457 {
1458         struct device_node *np = codec->dev->of_node;
1459         struct da7213_platform_data *pdata;
1460         const char *of_str;
1461         u32 of_val32;
1462
1463         pdata = devm_kzalloc(codec->dev, sizeof(*pdata), GFP_KERNEL);
1464         if (!pdata) {
1465                 dev_warn(codec->dev, "Failed to allocate memory for pdata\n");
1466                 return NULL;
1467         }
1468
1469         if (of_property_read_u32(np, "dlg,micbias1-lvl", &of_val32) >= 0)
1470                 pdata->micbias1_lvl = da7213_of_micbias_lvl(codec, of_val32);
1471         else
1472                 pdata->micbias1_lvl = DA7213_MICBIAS_2_2V;
1473
1474         if (of_property_read_u32(np, "dlg,micbias2-lvl", &of_val32) >= 0)
1475                 pdata->micbias2_lvl = da7213_of_micbias_lvl(codec, of_val32);
1476         else
1477                 pdata->micbias2_lvl = DA7213_MICBIAS_2_2V;
1478
1479         if (!of_property_read_string(np, "dlg,dmic-data-sel", &of_str))
1480                 pdata->dmic_data_sel = da7213_of_dmic_data_sel(codec, of_str);
1481         else
1482                 pdata->dmic_data_sel = DA7213_DMIC_DATA_LRISE_RFALL;
1483
1484         if (!of_property_read_string(np, "dlg,dmic-samplephase", &of_str))
1485                 pdata->dmic_samplephase =
1486                         da7213_of_dmic_samplephase(codec, of_str);
1487         else
1488                 pdata->dmic_samplephase = DA7213_DMIC_SAMPLE_ON_CLKEDGE;
1489
1490         if (of_property_read_u32(np, "dlg,dmic-clkrate", &of_val32) >= 0)
1491                 pdata->dmic_clk_rate = da7213_of_dmic_clkrate(codec, of_val32);
1492         else
1493                 pdata->dmic_clk_rate = DA7213_DMIC_CLK_3_0MHZ;
1494
1495         return pdata;
1496 }
1497
1498
1499 static int da7213_probe(struct snd_soc_codec *codec)
1500 {
1501         struct da7213_priv *da7213 = snd_soc_codec_get_drvdata(codec);
1502
1503         /* Default to using ALC auto offset calibration mode. */
1504         snd_soc_update_bits(codec, DA7213_ALC_CTRL1,
1505                             DA7213_ALC_CALIB_MODE_MAN, 0);
1506         da7213->alc_calib_auto = true;
1507
1508         /* Default to using SRM for slave mode */
1509         da7213->srm_en = true;
1510
1511         /* Enable all Gain Ramps */
1512         snd_soc_update_bits(codec, DA7213_AUX_L_CTRL,
1513                             DA7213_GAIN_RAMP_EN, DA7213_GAIN_RAMP_EN);
1514         snd_soc_update_bits(codec, DA7213_AUX_R_CTRL,
1515                             DA7213_GAIN_RAMP_EN, DA7213_GAIN_RAMP_EN);
1516         snd_soc_update_bits(codec, DA7213_MIXIN_L_CTRL,
1517                             DA7213_GAIN_RAMP_EN, DA7213_GAIN_RAMP_EN);
1518         snd_soc_update_bits(codec, DA7213_MIXIN_R_CTRL,
1519                             DA7213_GAIN_RAMP_EN, DA7213_GAIN_RAMP_EN);
1520         snd_soc_update_bits(codec, DA7213_ADC_L_CTRL,
1521                             DA7213_GAIN_RAMP_EN, DA7213_GAIN_RAMP_EN);
1522         snd_soc_update_bits(codec, DA7213_ADC_R_CTRL,
1523                             DA7213_GAIN_RAMP_EN, DA7213_GAIN_RAMP_EN);
1524         snd_soc_update_bits(codec, DA7213_DAC_L_CTRL,
1525                             DA7213_GAIN_RAMP_EN, DA7213_GAIN_RAMP_EN);
1526         snd_soc_update_bits(codec, DA7213_DAC_R_CTRL,
1527                             DA7213_GAIN_RAMP_EN, DA7213_GAIN_RAMP_EN);
1528         snd_soc_update_bits(codec, DA7213_HP_L_CTRL,
1529                             DA7213_GAIN_RAMP_EN, DA7213_GAIN_RAMP_EN);
1530         snd_soc_update_bits(codec, DA7213_HP_R_CTRL,
1531                             DA7213_GAIN_RAMP_EN, DA7213_GAIN_RAMP_EN);
1532         snd_soc_update_bits(codec, DA7213_LINE_CTRL,
1533                             DA7213_GAIN_RAMP_EN, DA7213_GAIN_RAMP_EN);
1534
1535         /*
1536          * There are two separate control bits for input and output mixers as
1537          * well as headphone and line outs.
1538          * One to enable corresponding amplifier and other to enable its
1539          * output. As amplifier bits are related to power control, they are
1540          * being managed by DAPM while other (non power related) bits are
1541          * enabled here
1542          */
1543         snd_soc_update_bits(codec, DA7213_MIXIN_L_CTRL,
1544                             DA7213_MIXIN_MIX_EN, DA7213_MIXIN_MIX_EN);
1545         snd_soc_update_bits(codec, DA7213_MIXIN_R_CTRL,
1546                             DA7213_MIXIN_MIX_EN, DA7213_MIXIN_MIX_EN);
1547
1548         snd_soc_update_bits(codec, DA7213_MIXOUT_L_CTRL,
1549                             DA7213_MIXOUT_MIX_EN, DA7213_MIXOUT_MIX_EN);
1550         snd_soc_update_bits(codec, DA7213_MIXOUT_R_CTRL,
1551                             DA7213_MIXOUT_MIX_EN, DA7213_MIXOUT_MIX_EN);
1552
1553         snd_soc_update_bits(codec, DA7213_HP_L_CTRL,
1554                             DA7213_HP_AMP_OE, DA7213_HP_AMP_OE);
1555         snd_soc_update_bits(codec, DA7213_HP_R_CTRL,
1556                             DA7213_HP_AMP_OE, DA7213_HP_AMP_OE);
1557
1558         snd_soc_update_bits(codec, DA7213_LINE_CTRL,
1559                             DA7213_LINE_AMP_OE, DA7213_LINE_AMP_OE);
1560
1561         /* Handle DT/Platform data */
1562         if (codec->dev->of_node)
1563                 da7213->pdata = da7213_of_to_pdata(codec);
1564         else
1565                 da7213->pdata = dev_get_platdata(codec->dev);
1566
1567         /* Set platform data values */
1568         if (da7213->pdata) {
1569                 struct da7213_platform_data *pdata = da7213->pdata;
1570                 u8 micbias_lvl = 0, dmic_cfg = 0;
1571
1572                 /* Set Mic Bias voltages */
1573                 switch (pdata->micbias1_lvl) {
1574                 case DA7213_MICBIAS_1_6V:
1575                 case DA7213_MICBIAS_2_2V:
1576                 case DA7213_MICBIAS_2_5V:
1577                 case DA7213_MICBIAS_3_0V:
1578                         micbias_lvl |= (pdata->micbias1_lvl <<
1579                                         DA7213_MICBIAS1_LEVEL_SHIFT);
1580                         break;
1581                 }
1582                 switch (pdata->micbias2_lvl) {
1583                 case DA7213_MICBIAS_1_6V:
1584                 case DA7213_MICBIAS_2_2V:
1585                 case DA7213_MICBIAS_2_5V:
1586                 case DA7213_MICBIAS_3_0V:
1587                         micbias_lvl |= (pdata->micbias2_lvl <<
1588                                          DA7213_MICBIAS2_LEVEL_SHIFT);
1589                         break;
1590                 }
1591                 snd_soc_update_bits(codec, DA7213_MICBIAS_CTRL,
1592                                     DA7213_MICBIAS1_LEVEL_MASK |
1593                                     DA7213_MICBIAS2_LEVEL_MASK, micbias_lvl);
1594
1595                 /* Set DMIC configuration */
1596                 switch (pdata->dmic_data_sel) {
1597                 case DA7213_DMIC_DATA_LFALL_RRISE:
1598                 case DA7213_DMIC_DATA_LRISE_RFALL:
1599                         dmic_cfg |= (pdata->dmic_data_sel <<
1600                                      DA7213_DMIC_DATA_SEL_SHIFT);
1601                         break;
1602                 }
1603                 switch (pdata->dmic_samplephase) {
1604                 case DA7213_DMIC_SAMPLE_ON_CLKEDGE:
1605                 case DA7213_DMIC_SAMPLE_BETWEEN_CLKEDGE:
1606                         dmic_cfg |= (pdata->dmic_samplephase <<
1607                                      DA7213_DMIC_SAMPLEPHASE_SHIFT);
1608                         break;
1609                 }
1610                 switch (pdata->dmic_clk_rate) {
1611                 case DA7213_DMIC_CLK_3_0MHZ:
1612                 case DA7213_DMIC_CLK_1_5MHZ:
1613                         dmic_cfg |= (pdata->dmic_clk_rate <<
1614                                      DA7213_DMIC_CLK_RATE_SHIFT);
1615                         break;
1616                 }
1617                 snd_soc_update_bits(codec, DA7213_MIC_CONFIG,
1618                                     DA7213_DMIC_DATA_SEL_MASK |
1619                                     DA7213_DMIC_SAMPLEPHASE_MASK |
1620                                     DA7213_DMIC_CLK_RATE_MASK, dmic_cfg);
1621
1622                 /* Set MCLK squaring */
1623                 da7213->mclk_squarer_en = pdata->mclk_squaring;
1624         }
1625
1626         return 0;
1627 }
1628
1629 static struct snd_soc_codec_driver soc_codec_dev_da7213 = {
1630         .probe                  = da7213_probe,
1631         .set_bias_level         = da7213_set_bias_level,
1632
1633         .controls               = da7213_snd_controls,
1634         .num_controls           = ARRAY_SIZE(da7213_snd_controls),
1635
1636         .dapm_widgets           = da7213_dapm_widgets,
1637         .num_dapm_widgets       = ARRAY_SIZE(da7213_dapm_widgets),
1638         .dapm_routes            = da7213_audio_map,
1639         .num_dapm_routes        = ARRAY_SIZE(da7213_audio_map),
1640 };
1641
1642 static const struct regmap_config da7213_regmap_config = {
1643         .reg_bits = 8,
1644         .val_bits = 8,
1645
1646         .reg_defaults = da7213_reg_defaults,
1647         .num_reg_defaults = ARRAY_SIZE(da7213_reg_defaults),
1648         .volatile_reg = da7213_volatile_register,
1649         .cache_type = REGCACHE_RBTREE,
1650 };
1651
1652 static int da7213_i2c_probe(struct i2c_client *i2c,
1653                             const struct i2c_device_id *id)
1654 {
1655         struct da7213_priv *da7213;
1656         int ret;
1657
1658         da7213 = devm_kzalloc(&i2c->dev, sizeof(struct da7213_priv),
1659                               GFP_KERNEL);
1660         if (!da7213)
1661                 return -ENOMEM;
1662
1663         i2c_set_clientdata(i2c, da7213);
1664
1665         da7213->regmap = devm_regmap_init_i2c(i2c, &da7213_regmap_config);
1666         if (IS_ERR(da7213->regmap)) {
1667                 ret = PTR_ERR(da7213->regmap);
1668                 dev_err(&i2c->dev, "regmap_init() failed: %d\n", ret);
1669                 return ret;
1670         }
1671
1672         ret = snd_soc_register_codec(&i2c->dev,
1673                         &soc_codec_dev_da7213, &da7213_dai, 1);
1674         if (ret < 0) {
1675                 dev_err(&i2c->dev, "Failed to register da7213 codec: %d\n",
1676                         ret);
1677         }
1678         return ret;
1679 }
1680
1681 static int da7213_remove(struct i2c_client *client)
1682 {
1683         snd_soc_unregister_codec(&client->dev);
1684         return 0;
1685 }
1686
1687 static const struct i2c_device_id da7213_i2c_id[] = {
1688         { "da7213", 0 },
1689         { }
1690 };
1691 MODULE_DEVICE_TABLE(i2c, da7213_i2c_id);
1692
1693 /* I2C codec control layer */
1694 static struct i2c_driver da7213_i2c_driver = {
1695         .driver = {
1696                 .name = "da7213",
1697                 .of_match_table = of_match_ptr(da7213_of_match),
1698         },
1699         .probe          = da7213_i2c_probe,
1700         .remove         = da7213_remove,
1701         .id_table       = da7213_i2c_id,
1702 };
1703
1704 module_i2c_driver(da7213_i2c_driver);
1705
1706 MODULE_DESCRIPTION("ASoC DA7213 Codec driver");
1707 MODULE_AUTHOR("Adam Thomson <Adam.Thomson.Opensource@diasemi.com>");
1708 MODULE_LICENSE("GPL");