~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

TOMOYO Linux Cross Reference
Linux/sound/soc/codecs/rt5616.c

Version: ~ [ linux-5.12-rc7 ] ~ [ linux-5.11.13 ] ~ [ linux-5.10.29 ] ~ [ linux-5.9.16 ] ~ [ linux-5.8.18 ] ~ [ linux-5.7.19 ] ~ [ linux-5.6.19 ] ~ [ linux-5.5.19 ] ~ [ linux-5.4.111 ] ~ [ linux-5.3.18 ] ~ [ linux-5.2.21 ] ~ [ linux-5.1.21 ] ~ [ linux-5.0.21 ] ~ [ linux-4.20.17 ] ~ [ linux-4.19.186 ] ~ [ linux-4.18.20 ] ~ [ linux-4.17.19 ] ~ [ linux-4.16.18 ] ~ [ linux-4.15.18 ] ~ [ linux-4.14.230 ] ~ [ linux-4.13.16 ] ~ [ linux-4.12.14 ] ~ [ linux-4.11.12 ] ~ [ linux-4.10.17 ] ~ [ linux-4.9.266 ] ~ [ linux-4.8.17 ] ~ [ linux-4.7.10 ] ~ [ linux-4.6.7 ] ~ [ linux-4.5.7 ] ~ [ linux-4.4.266 ] ~ [ linux-4.3.6 ] ~ [ linux-4.2.8 ] ~ [ linux-4.1.52 ] ~ [ linux-4.0.9 ] ~ [ linux-3.18.140 ] ~ [ linux-3.16.85 ] ~ [ linux-3.14.79 ] ~ [ linux-3.12.74 ] ~ [ linux-3.10.108 ] ~ [ linux-2.6.32.71 ] ~ [ linux-2.6.0 ] ~ [ linux-2.4.37.11 ] ~ [ unix-v6-master ] ~ [ ccs-tools-1.8.5 ] ~ [ policy-sample ] ~
Architecture: ~ [ i386 ] ~ [ alpha ] ~ [ m68k ] ~ [ mips ] ~ [ ppc ] ~ [ sparc ] ~ [ sparc64 ] ~

  1 /*
  2  * rt5616.c  --  RT5616 ALSA SoC audio codec driver
  3  *
  4  * Copyright 2015 Realtek Semiconductor Corp.
  5  * Author: Bard Liao <bardliao@realtek.com>
  6  *
  7  * This program is free software; you can redistribute it and/or modify
  8  * it under the terms of the GNU General Public License version 2 as
  9  * published by the Free Software Foundation.
 10  */
 11 
 12 #include <linux/module.h>
 13 #include <linux/moduleparam.h>
 14 #include <linux/init.h>
 15 #include <linux/delay.h>
 16 #include <linux/pm.h>
 17 #include <linux/i2c.h>
 18 #include <linux/platform_device.h>
 19 #include <linux/spi/spi.h>
 20 #include <sound/core.h>
 21 #include <sound/pcm.h>
 22 #include <sound/pcm_params.h>
 23 #include <sound/soc.h>
 24 #include <sound/soc-dapm.h>
 25 #include <sound/initval.h>
 26 #include <sound/tlv.h>
 27 
 28 #include "rl6231.h"
 29 #include "rt5616.h"
 30 
 31 #define RT5616_PR_RANGE_BASE (0xff + 1)
 32 #define RT5616_PR_SPACING 0x100
 33 
 34 #define RT5616_PR_BASE (RT5616_PR_RANGE_BASE + (0 * RT5616_PR_SPACING))
 35 
 36 static const struct regmap_range_cfg rt5616_ranges[] = {
 37         {
 38                 .name = "PR",
 39                 .range_min = RT5616_PR_BASE,
 40                 .range_max = RT5616_PR_BASE + 0xf8,
 41                 .selector_reg = RT5616_PRIV_INDEX,
 42                 .selector_mask = 0xff,
 43                 .selector_shift = 0x0,
 44                 .window_start = RT5616_PRIV_DATA,
 45                 .window_len = 0x1,
 46         },
 47 };
 48 
 49 static const struct reg_sequence init_list[] = {
 50         {RT5616_PR_BASE + 0x3d, 0x3e00},
 51         {RT5616_PR_BASE + 0x25, 0x6110},
 52         {RT5616_PR_BASE + 0x20, 0x611f},
 53         {RT5616_PR_BASE + 0x21, 0x4040},
 54         {RT5616_PR_BASE + 0x23, 0x0004},
 55 };
 56 #define RT5616_INIT_REG_LEN ARRAY_SIZE(init_list)
 57 
 58 static const struct reg_default rt5616_reg[] = {
 59         { 0x00, 0x0021 },
 60         { 0x02, 0xc8c8 },
 61         { 0x03, 0xc8c8 },
 62         { 0x05, 0x0000 },
 63         { 0x0d, 0x0000 },
 64         { 0x0f, 0x0808 },
 65         { 0x19, 0xafaf },
 66         { 0x1c, 0x2f2f },
 67         { 0x1e, 0x0000 },
 68         { 0x27, 0x7860 },
 69         { 0x29, 0x8080 },
 70         { 0x2a, 0x5252 },
 71         { 0x3b, 0x0000 },
 72         { 0x3c, 0x006f },
 73         { 0x3d, 0x0000 },
 74         { 0x3e, 0x006f },
 75         { 0x45, 0x6000 },
 76         { 0x4d, 0x0000 },
 77         { 0x4e, 0x0000 },
 78         { 0x4f, 0x0279 },
 79         { 0x50, 0x0000 },
 80         { 0x51, 0x0000 },
 81         { 0x52, 0x0279 },
 82         { 0x53, 0xf000 },
 83         { 0x61, 0x0000 },
 84         { 0x62, 0x0000 },
 85         { 0x63, 0x00c0 },
 86         { 0x64, 0x0000 },
 87         { 0x65, 0x0000 },
 88         { 0x66, 0x0000 },
 89         { 0x70, 0x8000 },
 90         { 0x73, 0x1104 },
 91         { 0x74, 0x0c00 },
 92         { 0x80, 0x0000 },
 93         { 0x81, 0x0000 },
 94         { 0x82, 0x0000 },
 95         { 0x8b, 0x0600 },
 96         { 0x8e, 0x0004 },
 97         { 0x8f, 0x1100 },
 98         { 0x90, 0x0000 },
 99         { 0x91, 0x0000 },
100         { 0x92, 0x0000 },
101         { 0x93, 0x2000 },
102         { 0x94, 0x0200 },
103         { 0x95, 0x0000 },
104         { 0xb0, 0x2080 },
105         { 0xb1, 0x0000 },
106         { 0xb2, 0x0000 },
107         { 0xb4, 0x2206 },
108         { 0xb5, 0x1f00 },
109         { 0xb6, 0x0000 },
110         { 0xb7, 0x0000 },
111         { 0xbb, 0x0000 },
112         { 0xbc, 0x0000 },
113         { 0xbd, 0x0000 },
114         { 0xbe, 0x0000 },
115         { 0xbf, 0x0000 },
116         { 0xc0, 0x0100 },
117         { 0xc1, 0x0000 },
118         { 0xc2, 0x0000 },
119         { 0xc8, 0x0000 },
120         { 0xc9, 0x0000 },
121         { 0xca, 0x0000 },
122         { 0xcb, 0x0000 },
123         { 0xcc, 0x0000 },
124         { 0xcd, 0x0000 },
125         { 0xce, 0x0000 },
126         { 0xcf, 0x0013 },
127         { 0xd0, 0x0680 },
128         { 0xd1, 0x1c17 },
129         { 0xd3, 0xb320 },
130         { 0xd4, 0x0000 },
131         { 0xd6, 0x0000 },
132         { 0xd7, 0x0000 },
133         { 0xd9, 0x0809 },
134         { 0xda, 0x0000 },
135         { 0xfa, 0x0010 },
136         { 0xfb, 0x0000 },
137         { 0xfc, 0x0000 },
138         { 0xfe, 0x10ec },
139         { 0xff, 0x6281 },
140 };
141 
142 struct rt5616_priv {
143         struct snd_soc_codec *codec;
144         struct delayed_work patch_work;
145         struct regmap *regmap;
146 
147         int sysclk;
148         int sysclk_src;
149         int lrck[RT5616_AIFS];
150         int bclk[RT5616_AIFS];
151         int master[RT5616_AIFS];
152 
153         int pll_src;
154         int pll_in;
155         int pll_out;
156 
157 };
158 
159 static bool rt5616_volatile_register(struct device *dev, unsigned int reg)
160 {
161         int i;
162 
163         for (i = 0; i < ARRAY_SIZE(rt5616_ranges); i++) {
164                 if (reg >= rt5616_ranges[i].range_min &&
165                         reg <= rt5616_ranges[i].range_max) {
166                         return true;
167                 }
168         }
169 
170         switch (reg) {
171         case RT5616_RESET:
172         case RT5616_PRIV_DATA:
173         case RT5616_EQ_CTRL1:
174         case RT5616_DRC_AGC_1:
175         case RT5616_IRQ_CTRL2:
176         case RT5616_INT_IRQ_ST:
177         case RT5616_PGM_REG_ARR1:
178         case RT5616_PGM_REG_ARR3:
179         case RT5616_VENDOR_ID:
180         case RT5616_DEVICE_ID:
181                 return true;
182         default:
183                 return false;
184         }
185 }
186 
187 static bool rt5616_readable_register(struct device *dev, unsigned int reg)
188 {
189         int i;
190 
191         for (i = 0; i < ARRAY_SIZE(rt5616_ranges); i++) {
192                 if (reg >= rt5616_ranges[i].range_min &&
193                         reg <= rt5616_ranges[i].range_max) {
194                         return true;
195                 }
196         }
197 
198         switch (reg) {
199         case RT5616_RESET:
200         case RT5616_VERSION_ID:
201         case RT5616_VENDOR_ID:
202         case RT5616_DEVICE_ID:
203         case RT5616_HP_VOL:
204         case RT5616_LOUT_CTRL1:
205         case RT5616_LOUT_CTRL2:
206         case RT5616_IN1_IN2:
207         case RT5616_INL1_INR1_VOL:
208         case RT5616_DAC1_DIG_VOL:
209         case RT5616_ADC_DIG_VOL:
210         case RT5616_ADC_BST_VOL:
211         case RT5616_STO1_ADC_MIXER:
212         case RT5616_AD_DA_MIXER:
213         case RT5616_STO_DAC_MIXER:
214         case RT5616_REC_L1_MIXER:
215         case RT5616_REC_L2_MIXER:
216         case RT5616_REC_R1_MIXER:
217         case RT5616_REC_R2_MIXER:
218         case RT5616_HPO_MIXER:
219         case RT5616_OUT_L1_MIXER:
220         case RT5616_OUT_L2_MIXER:
221         case RT5616_OUT_L3_MIXER:
222         case RT5616_OUT_R1_MIXER:
223         case RT5616_OUT_R2_MIXER:
224         case RT5616_OUT_R3_MIXER:
225         case RT5616_LOUT_MIXER:
226         case RT5616_PWR_DIG1:
227         case RT5616_PWR_DIG2:
228         case RT5616_PWR_ANLG1:
229         case RT5616_PWR_ANLG2:
230         case RT5616_PWR_MIXER:
231         case RT5616_PWR_VOL:
232         case RT5616_PRIV_INDEX:
233         case RT5616_PRIV_DATA:
234         case RT5616_I2S1_SDP:
235         case RT5616_ADDA_CLK1:
236         case RT5616_ADDA_CLK2:
237         case RT5616_GLB_CLK:
238         case RT5616_PLL_CTRL1:
239         case RT5616_PLL_CTRL2:
240         case RT5616_HP_OVCD:
241         case RT5616_DEPOP_M1:
242         case RT5616_DEPOP_M2:
243         case RT5616_DEPOP_M3:
244         case RT5616_CHARGE_PUMP:
245         case RT5616_PV_DET_SPK_G:
246         case RT5616_MICBIAS:
247         case RT5616_A_JD_CTL1:
248         case RT5616_A_JD_CTL2:
249         case RT5616_EQ_CTRL1:
250         case RT5616_EQ_CTRL2:
251         case RT5616_WIND_FILTER:
252         case RT5616_DRC_AGC_1:
253         case RT5616_DRC_AGC_2:
254         case RT5616_DRC_AGC_3:
255         case RT5616_SVOL_ZC:
256         case RT5616_JD_CTRL1:
257         case RT5616_JD_CTRL2:
258         case RT5616_IRQ_CTRL1:
259         case RT5616_IRQ_CTRL2:
260         case RT5616_INT_IRQ_ST:
261         case RT5616_GPIO_CTRL1:
262         case RT5616_GPIO_CTRL2:
263         case RT5616_GPIO_CTRL3:
264         case RT5616_PGM_REG_ARR1:
265         case RT5616_PGM_REG_ARR2:
266         case RT5616_PGM_REG_ARR3:
267         case RT5616_PGM_REG_ARR4:
268         case RT5616_PGM_REG_ARR5:
269         case RT5616_SCB_FUNC:
270         case RT5616_SCB_CTRL:
271         case RT5616_BASE_BACK:
272         case RT5616_MP3_PLUS1:
273         case RT5616_MP3_PLUS2:
274         case RT5616_ADJ_HPF_CTRL1:
275         case RT5616_ADJ_HPF_CTRL2:
276         case RT5616_HP_CALIB_AMP_DET:
277         case RT5616_HP_CALIB2:
278         case RT5616_SV_ZCD1:
279         case RT5616_SV_ZCD2:
280         case RT5616_D_MISC:
281         case RT5616_DUMMY2:
282         case RT5616_DUMMY3:
283                 return true;
284         default:
285                 return false;
286         }
287 }
288 
289 static const DECLARE_TLV_DB_SCALE(out_vol_tlv, -4650, 150, 0);
290 static const DECLARE_TLV_DB_SCALE(dac_vol_tlv, -65625, 375, 0);
291 static const DECLARE_TLV_DB_SCALE(in_vol_tlv, -3450, 150, 0);
292 static const DECLARE_TLV_DB_SCALE(adc_vol_tlv, -17625, 375, 0);
293 static const DECLARE_TLV_DB_SCALE(adc_bst_tlv, 0, 1200, 0);
294 
295 /* {0, +20, +24, +30, +35, +40, +44, +50, +52} dB */
296 static unsigned int bst_tlv[] = {
297         TLV_DB_RANGE_HEAD(7),
298         0, 0, TLV_DB_SCALE_ITEM(0, 0, 0),
299         1, 1, TLV_DB_SCALE_ITEM(2000, 0, 0),
300         2, 2, TLV_DB_SCALE_ITEM(2400, 0, 0),
301         3, 5, TLV_DB_SCALE_ITEM(3000, 500, 0),
302         6, 6, TLV_DB_SCALE_ITEM(4400, 0, 0),
303         7, 7, TLV_DB_SCALE_ITEM(5000, 0, 0),
304         8, 8, TLV_DB_SCALE_ITEM(5200, 0, 0),
305 };
306 
307 static const struct snd_kcontrol_new rt5616_snd_controls[] = {
308         /* Headphone Output Volume */
309         SOC_DOUBLE("HP Playback Switch", RT5616_HP_VOL,
310                 RT5616_L_MUTE_SFT, RT5616_R_MUTE_SFT, 1, 1),
311         SOC_DOUBLE_TLV("HP Playback Volume", RT5616_HP_VOL,
312                 RT5616_L_VOL_SFT, RT5616_R_VOL_SFT, 39, 1, out_vol_tlv),
313         /* OUTPUT Control */
314         SOC_DOUBLE("OUT Playback Switch", RT5616_LOUT_CTRL1,
315                 RT5616_L_MUTE_SFT, RT5616_R_MUTE_SFT, 1, 1),
316         SOC_DOUBLE("OUT Channel Switch", RT5616_LOUT_CTRL1,
317                 RT5616_VOL_L_SFT, RT5616_VOL_R_SFT, 1, 1),
318         SOC_DOUBLE_TLV("OUT Playback Volume", RT5616_LOUT_CTRL1,
319                 RT5616_L_VOL_SFT, RT5616_R_VOL_SFT, 39, 1, out_vol_tlv),
320 
321         /* DAC Digital Volume */
322         SOC_DOUBLE_TLV("DAC1 Playback Volume", RT5616_DAC1_DIG_VOL,
323                         RT5616_L_VOL_SFT, RT5616_R_VOL_SFT,
324                         175, 0, dac_vol_tlv),
325         /* IN1/IN2 Control */
326         SOC_SINGLE_TLV("IN1 Boost Volume", RT5616_IN1_IN2,
327                 RT5616_BST_SFT1, 8, 0, bst_tlv),
328         SOC_SINGLE_TLV("IN2 Boost Volume", RT5616_IN1_IN2,
329                 RT5616_BST_SFT2, 8, 0, bst_tlv),
330         /* INL/INR Volume Control */
331         SOC_DOUBLE_TLV("IN Capture Volume", RT5616_INL1_INR1_VOL,
332                         RT5616_INL_VOL_SFT, RT5616_INR_VOL_SFT,
333                         31, 1, in_vol_tlv),
334         /* ADC Digital Volume Control */
335         SOC_DOUBLE("ADC Capture Switch", RT5616_ADC_DIG_VOL,
336                 RT5616_L_MUTE_SFT, RT5616_R_MUTE_SFT, 1, 1),
337         SOC_DOUBLE_TLV("ADC Capture Volume", RT5616_ADC_DIG_VOL,
338                         RT5616_L_VOL_SFT, RT5616_R_VOL_SFT,
339                         127, 0, adc_vol_tlv),
340 
341         /* ADC Boost Volume Control */
342         SOC_DOUBLE_TLV("ADC Boost Volume", RT5616_ADC_BST_VOL,
343                         RT5616_ADC_L_BST_SFT, RT5616_ADC_R_BST_SFT,
344                         3, 0, adc_bst_tlv),
345 };
346 
347 static int is_sys_clk_from_pll(struct snd_soc_dapm_widget *source,
348                          struct snd_soc_dapm_widget *sink)
349 {
350         unsigned int val;
351 
352         val = snd_soc_read(snd_soc_dapm_to_codec(source->dapm), RT5616_GLB_CLK);
353         val &= RT5616_SCLK_SRC_MASK;
354         if (val == RT5616_SCLK_SRC_PLL1)
355                 return 1;
356         else
357                 return 0;
358 }
359 
360 /* Digital Mixer */
361 static const struct snd_kcontrol_new rt5616_sto1_adc_l_mix[] = {
362         SOC_DAPM_SINGLE("ADC1 Switch", RT5616_STO1_ADC_MIXER,
363                         RT5616_M_STO1_ADC_L1_SFT, 1, 1),
364 };
365 
366 static const struct snd_kcontrol_new rt5616_sto1_adc_r_mix[] = {
367         SOC_DAPM_SINGLE("ADC1 Switch", RT5616_STO1_ADC_MIXER,
368                         RT5616_M_STO1_ADC_R1_SFT, 1, 1),
369 };
370 
371 static const struct snd_kcontrol_new rt5616_dac_l_mix[] = {
372         SOC_DAPM_SINGLE("Stereo ADC Switch", RT5616_AD_DA_MIXER,
373                         RT5616_M_ADCMIX_L_SFT, 1, 1),
374         SOC_DAPM_SINGLE("INF1 Switch", RT5616_AD_DA_MIXER,
375                         RT5616_M_IF1_DAC_L_SFT, 1, 1),
376 };
377 
378 static const struct snd_kcontrol_new rt5616_dac_r_mix[] = {
379         SOC_DAPM_SINGLE("Stereo ADC Switch", RT5616_AD_DA_MIXER,
380                         RT5616_M_ADCMIX_R_SFT, 1, 1),
381         SOC_DAPM_SINGLE("INF1 Switch", RT5616_AD_DA_MIXER,
382                         RT5616_M_IF1_DAC_R_SFT, 1, 1),
383 };
384 
385 static const struct snd_kcontrol_new rt5616_sto_dac_l_mix[] = {
386         SOC_DAPM_SINGLE("DAC L1 Switch", RT5616_STO_DAC_MIXER,
387                         RT5616_M_DAC_L1_MIXL_SFT, 1, 1),
388         SOC_DAPM_SINGLE("DAC R1 Switch", RT5616_STO_DAC_MIXER,
389                         RT5616_M_DAC_R1_MIXL_SFT, 1, 1),
390 };
391 
392 static const struct snd_kcontrol_new rt5616_sto_dac_r_mix[] = {
393         SOC_DAPM_SINGLE("DAC R1 Switch", RT5616_STO_DAC_MIXER,
394                         RT5616_M_DAC_R1_MIXR_SFT, 1, 1),
395         SOC_DAPM_SINGLE("DAC L1 Switch", RT5616_STO_DAC_MIXER,
396                         RT5616_M_DAC_L1_MIXR_SFT, 1, 1),
397 };
398 
399 /* Analog Input Mixer */
400 static const struct snd_kcontrol_new rt5616_rec_l_mix[] = {
401         SOC_DAPM_SINGLE("INL1 Switch", RT5616_REC_L2_MIXER,
402                         RT5616_M_IN1_L_RM_L_SFT, 1, 1),
403         SOC_DAPM_SINGLE("BST2 Switch", RT5616_REC_L2_MIXER,
404                         RT5616_M_BST2_RM_L_SFT, 1, 1),
405         SOC_DAPM_SINGLE("BST1 Switch", RT5616_REC_L2_MIXER,
406                         RT5616_M_BST1_RM_L_SFT, 1, 1),
407 };
408 
409 static const struct snd_kcontrol_new rt5616_rec_r_mix[] = {
410         SOC_DAPM_SINGLE("INR1 Switch", RT5616_REC_R2_MIXER,
411                         RT5616_M_IN1_R_RM_R_SFT, 1, 1),
412         SOC_DAPM_SINGLE("BST2 Switch", RT5616_REC_R2_MIXER,
413                         RT5616_M_BST2_RM_R_SFT, 1, 1),
414         SOC_DAPM_SINGLE("BST1 Switch", RT5616_REC_R2_MIXER,
415                         RT5616_M_BST1_RM_R_SFT, 1, 1),
416 };
417 
418 /* Analog Output Mixer */
419 
420 static const struct snd_kcontrol_new rt5616_out_l_mix[] = {
421         SOC_DAPM_SINGLE("BST1 Switch", RT5616_OUT_L3_MIXER,
422                         RT5616_M_BST1_OM_L_SFT, 1, 1),
423         SOC_DAPM_SINGLE("BST2 Switch", RT5616_OUT_L3_MIXER,
424                         RT5616_M_BST2_OM_L_SFT, 1, 1),
425         SOC_DAPM_SINGLE("INL1 Switch", RT5616_OUT_L3_MIXER,
426                         RT5616_M_IN1_L_OM_L_SFT, 1, 1),
427         SOC_DAPM_SINGLE("REC MIXL Switch", RT5616_OUT_L3_MIXER,
428                         RT5616_M_RM_L_OM_L_SFT, 1, 1),
429         SOC_DAPM_SINGLE("DAC L1 Switch", RT5616_OUT_L3_MIXER,
430                         RT5616_M_DAC_L1_OM_L_SFT, 1, 1),
431 };
432 
433 static const struct snd_kcontrol_new rt5616_out_r_mix[] = {
434         SOC_DAPM_SINGLE("BST2 Switch", RT5616_OUT_R3_MIXER,
435                         RT5616_M_BST2_OM_R_SFT, 1, 1),
436         SOC_DAPM_SINGLE("BST1 Switch", RT5616_OUT_R3_MIXER,
437                         RT5616_M_BST1_OM_R_SFT, 1, 1),
438         SOC_DAPM_SINGLE("INR1 Switch", RT5616_OUT_R3_MIXER,
439                         RT5616_M_IN1_R_OM_R_SFT, 1, 1),
440         SOC_DAPM_SINGLE("REC MIXR Switch", RT5616_OUT_R3_MIXER,
441                         RT5616_M_RM_R_OM_R_SFT, 1, 1),
442         SOC_DAPM_SINGLE("DAC R1 Switch", RT5616_OUT_R3_MIXER,
443                         RT5616_M_DAC_R1_OM_R_SFT, 1, 1),
444 };
445 
446 static const struct snd_kcontrol_new rt5616_hpo_mix[] = {
447         SOC_DAPM_SINGLE("DAC1 Switch", RT5616_HPO_MIXER,
448                         RT5616_M_DAC1_HM_SFT, 1, 1),
449         SOC_DAPM_SINGLE("HPVOL Switch", RT5616_HPO_MIXER,
450                         RT5616_M_HPVOL_HM_SFT, 1, 1),
451 };
452 
453 static const struct snd_kcontrol_new rt5616_lout_mix[] = {
454         SOC_DAPM_SINGLE("DAC L1 Switch", RT5616_LOUT_MIXER,
455                         RT5616_M_DAC_L1_LM_SFT, 1, 1),
456         SOC_DAPM_SINGLE("DAC R1 Switch", RT5616_LOUT_MIXER,
457                         RT5616_M_DAC_R1_LM_SFT, 1, 1),
458         SOC_DAPM_SINGLE("OUTVOL L Switch", RT5616_LOUT_MIXER,
459                         RT5616_M_OV_L_LM_SFT, 1, 1),
460         SOC_DAPM_SINGLE("OUTVOL R Switch", RT5616_LOUT_MIXER,
461                         RT5616_M_OV_R_LM_SFT, 1, 1),
462 };
463 
464 static int rt5616_adc_event(struct snd_soc_dapm_widget *w,
465         struct snd_kcontrol *kcontrol, int event)
466 {
467         struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm);
468 
469         switch (event) {
470         case SND_SOC_DAPM_POST_PMU:
471                 snd_soc_update_bits(codec, RT5616_ADC_DIG_VOL,
472                                 RT5616_L_MUTE | RT5616_R_MUTE, 0);
473                 break;
474 
475         case SND_SOC_DAPM_POST_PMD:
476                 snd_soc_update_bits(codec, RT5616_ADC_DIG_VOL,
477                                 RT5616_L_MUTE | RT5616_R_MUTE,
478                                 RT5616_L_MUTE | RT5616_R_MUTE);
479                 break;
480 
481         default:
482                 return 0;
483         }
484 
485         return 0;
486 }
487 
488 static int rt5616_charge_pump_event(struct snd_soc_dapm_widget *w,
489                            struct snd_kcontrol *kcontrol, int event)
490 {
491         struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm);
492 
493         switch (event) {
494         case SND_SOC_DAPM_POST_PMU:
495                 /* depop parameters */
496                 snd_soc_update_bits(codec, RT5616_DEPOP_M2,
497                         RT5616_DEPOP_MASK, RT5616_DEPOP_MAN);
498                 snd_soc_update_bits(codec, RT5616_DEPOP_M1,
499                         RT5616_HP_CP_MASK | RT5616_HP_SG_MASK |
500                         RT5616_HP_CB_MASK, RT5616_HP_CP_PU |
501                         RT5616_HP_SG_DIS | RT5616_HP_CB_PU);
502                 snd_soc_write(codec, RT5616_PR_BASE +
503                         RT5616_HP_DCC_INT1, 0x9f00);
504                 /* headphone amp power on */
505                 snd_soc_update_bits(codec, RT5616_PWR_ANLG1,
506                         RT5616_PWR_FV1 | RT5616_PWR_FV2, 0);
507                 snd_soc_update_bits(codec, RT5616_PWR_VOL,
508                         RT5616_PWR_HV_L | RT5616_PWR_HV_R,
509                         RT5616_PWR_HV_L | RT5616_PWR_HV_R);
510                 snd_soc_update_bits(codec, RT5616_PWR_ANLG1,
511                         RT5616_PWR_HP_L | RT5616_PWR_HP_R |
512                         RT5616_PWR_HA, RT5616_PWR_HP_L |
513                         RT5616_PWR_HP_R | RT5616_PWR_HA);
514                 msleep(50);
515                 snd_soc_update_bits(codec, RT5616_PWR_ANLG1,
516                         RT5616_PWR_FV1 | RT5616_PWR_FV2,
517                         RT5616_PWR_FV1 | RT5616_PWR_FV2);
518 
519                 snd_soc_update_bits(codec, RT5616_CHARGE_PUMP,
520                         RT5616_PM_HP_MASK, RT5616_PM_HP_HV);
521                 snd_soc_update_bits(codec, RT5616_PR_BASE +
522                         RT5616_CHOP_DAC_ADC, 0x0200, 0x0200);
523                 snd_soc_update_bits(codec, RT5616_DEPOP_M1,
524                         RT5616_HP_CO_MASK | RT5616_HP_SG_MASK,
525                         RT5616_HP_CO_EN | RT5616_HP_SG_EN);
526                 break;
527         case SND_SOC_DAPM_PRE_PMD:
528                 snd_soc_update_bits(codec, RT5616_PR_BASE +
529                         RT5616_CHOP_DAC_ADC, 0x0200, 0x0);
530                 snd_soc_update_bits(codec, RT5616_DEPOP_M1,
531                         RT5616_HP_SG_MASK | RT5616_HP_L_SMT_MASK |
532                         RT5616_HP_R_SMT_MASK, RT5616_HP_SG_DIS |
533                         RT5616_HP_L_SMT_DIS | RT5616_HP_R_SMT_DIS);
534                 /* headphone amp power down */
535                 snd_soc_update_bits(codec, RT5616_DEPOP_M1,
536                         RT5616_SMT_TRIG_MASK | RT5616_HP_CD_PD_MASK |
537                         RT5616_HP_CO_MASK | RT5616_HP_CP_MASK |
538                         RT5616_HP_SG_MASK | RT5616_HP_CB_MASK,
539                         RT5616_SMT_TRIG_DIS | RT5616_HP_CD_PD_EN |
540                         RT5616_HP_CO_DIS | RT5616_HP_CP_PD |
541                         RT5616_HP_SG_EN | RT5616_HP_CB_PD);
542                 snd_soc_update_bits(codec, RT5616_PWR_ANLG1,
543                         RT5616_PWR_HP_L | RT5616_PWR_HP_R |
544                         RT5616_PWR_HA, 0);
545                 break;
546         default:
547                 return 0;
548         }
549 
550         return 0;
551 }
552 
553 static int rt5616_hp_event(struct snd_soc_dapm_widget *w,
554         struct snd_kcontrol *kcontrol, int event)
555 {
556         struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm);
557 
558         switch (event) {
559         case SND_SOC_DAPM_POST_PMU:
560                 /* headphone unmute sequence */
561                 snd_soc_update_bits(codec, RT5616_DEPOP_M3,
562                         RT5616_CP_FQ1_MASK | RT5616_CP_FQ2_MASK |
563                         RT5616_CP_FQ3_MASK,
564                         (RT5616_CP_FQ_192_KHZ << RT5616_CP_FQ1_SFT) |
565                         (RT5616_CP_FQ_12_KHZ << RT5616_CP_FQ2_SFT) |
566                         (RT5616_CP_FQ_192_KHZ << RT5616_CP_FQ3_SFT));
567                 snd_soc_write(codec, RT5616_PR_BASE +
568                         RT5616_MAMP_INT_REG2, 0xfc00);
569                 snd_soc_update_bits(codec, RT5616_DEPOP_M1,
570                         RT5616_SMT_TRIG_MASK, RT5616_SMT_TRIG_EN);
571                 snd_soc_update_bits(codec, RT5616_DEPOP_M1,
572                         RT5616_RSTN_MASK, RT5616_RSTN_EN);
573                 snd_soc_update_bits(codec, RT5616_DEPOP_M1,
574                         RT5616_RSTN_MASK | RT5616_HP_L_SMT_MASK |
575                         RT5616_HP_R_SMT_MASK, RT5616_RSTN_DIS |
576                         RT5616_HP_L_SMT_EN | RT5616_HP_R_SMT_EN);
577                 snd_soc_update_bits(codec, RT5616_HP_VOL,
578                         RT5616_L_MUTE | RT5616_R_MUTE, 0);
579                 msleep(100);
580                 snd_soc_update_bits(codec, RT5616_DEPOP_M1,
581                         RT5616_HP_SG_MASK | RT5616_HP_L_SMT_MASK |
582                         RT5616_HP_R_SMT_MASK, RT5616_HP_SG_DIS |
583                         RT5616_HP_L_SMT_DIS | RT5616_HP_R_SMT_DIS);
584                 msleep(20);
585                 snd_soc_update_bits(codec, RT5616_HP_CALIB_AMP_DET,
586                         RT5616_HPD_PS_MASK, RT5616_HPD_PS_EN);
587                 break;
588 
589         case SND_SOC_DAPM_PRE_PMD:
590                 /* headphone mute sequence */
591                 snd_soc_update_bits(codec, RT5616_DEPOP_M3,
592                         RT5616_CP_FQ1_MASK | RT5616_CP_FQ2_MASK |
593                         RT5616_CP_FQ3_MASK,
594                         (RT5616_CP_FQ_96_KHZ << RT5616_CP_FQ1_SFT) |
595                         (RT5616_CP_FQ_12_KHZ << RT5616_CP_FQ2_SFT) |
596                         (RT5616_CP_FQ_96_KHZ << RT5616_CP_FQ3_SFT));
597                 snd_soc_write(codec, RT5616_PR_BASE +
598                         RT5616_MAMP_INT_REG2, 0xfc00);
599                 snd_soc_update_bits(codec, RT5616_DEPOP_M1,
600                         RT5616_HP_SG_MASK, RT5616_HP_SG_EN);
601                 snd_soc_update_bits(codec, RT5616_DEPOP_M1,
602                         RT5616_RSTP_MASK, RT5616_RSTP_EN);
603                 snd_soc_update_bits(codec, RT5616_DEPOP_M1,
604                         RT5616_RSTP_MASK | RT5616_HP_L_SMT_MASK |
605                         RT5616_HP_R_SMT_MASK, RT5616_RSTP_DIS |
606                         RT5616_HP_L_SMT_EN | RT5616_HP_R_SMT_EN);
607                 snd_soc_update_bits(codec, RT5616_HP_CALIB_AMP_DET,
608                         RT5616_HPD_PS_MASK, RT5616_HPD_PS_DIS);
609                 msleep(90);
610                 snd_soc_update_bits(codec, RT5616_HP_VOL,
611                         RT5616_L_MUTE | RT5616_R_MUTE,
612                         RT5616_L_MUTE | RT5616_R_MUTE);
613                 msleep(30);
614                 break;
615 
616         default:
617                 return 0;
618         }
619 
620         return 0;
621 }
622 
623 static int rt5616_lout_event(struct snd_soc_dapm_widget *w,
624         struct snd_kcontrol *kcontrol, int event)
625 {
626         struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm);
627 
628         switch (event) {
629         case SND_SOC_DAPM_POST_PMU:
630                 snd_soc_update_bits(codec, RT5616_PWR_ANLG1,
631                         RT5616_PWR_LM, RT5616_PWR_LM);
632                 snd_soc_update_bits(codec, RT5616_LOUT_CTRL1,
633                         RT5616_L_MUTE | RT5616_R_MUTE, 0);
634                 break;
635 
636         case SND_SOC_DAPM_PRE_PMD:
637                 snd_soc_update_bits(codec, RT5616_LOUT_CTRL1,
638                         RT5616_L_MUTE | RT5616_R_MUTE,
639                         RT5616_L_MUTE | RT5616_R_MUTE);
640                 snd_soc_update_bits(codec, RT5616_PWR_ANLG1,
641                         RT5616_PWR_LM, 0);
642                 break;
643 
644         default:
645                 return 0;
646         }
647 
648         return 0;
649 }
650 
651 static int rt5616_bst1_event(struct snd_soc_dapm_widget *w,
652         struct snd_kcontrol *kcontrol, int event)
653 {
654         struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm);
655 
656         switch (event) {
657         case SND_SOC_DAPM_POST_PMU:
658                 snd_soc_update_bits(codec, RT5616_PWR_ANLG2,
659                         RT5616_PWR_BST1_OP2, RT5616_PWR_BST1_OP2);
660                 break;
661 
662         case SND_SOC_DAPM_PRE_PMD:
663                 snd_soc_update_bits(codec, RT5616_PWR_ANLG2,
664                         RT5616_PWR_BST1_OP2, 0);
665                 break;
666 
667         default:
668                 return 0;
669         }
670 
671         return 0;
672 }
673 
674 static int rt5616_bst2_event(struct snd_soc_dapm_widget *w,
675         struct snd_kcontrol *kcontrol, int event)
676 {
677         struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm);
678 
679         switch (event) {
680         case SND_SOC_DAPM_POST_PMU:
681                 snd_soc_update_bits(codec, RT5616_PWR_ANLG2,
682                         RT5616_PWR_BST2_OP2, RT5616_PWR_BST2_OP2);
683                 break;
684 
685         case SND_SOC_DAPM_PRE_PMD:
686                 snd_soc_update_bits(codec, RT5616_PWR_ANLG2,
687                         RT5616_PWR_BST2_OP2, 0);
688                 break;
689 
690         default:
691                 return 0;
692         }
693 
694         return 0;
695 }
696 
697 static const struct snd_soc_dapm_widget rt5616_dapm_widgets[] = {
698         SND_SOC_DAPM_SUPPLY("PLL1", RT5616_PWR_ANLG2,
699                         RT5616_PWR_PLL_BIT, 0, NULL, 0),
700         /* Input Side */
701         /* micbias */
702         SND_SOC_DAPM_SUPPLY("LDO", RT5616_PWR_ANLG1,
703                         RT5616_PWR_LDO_BIT, 0, NULL, 0),
704         SND_SOC_DAPM_SUPPLY("micbias1", RT5616_PWR_ANLG2,
705                         RT5616_PWR_MB1_BIT, 0, NULL, 0),
706 
707         /* Input Lines */
708         SND_SOC_DAPM_INPUT("MIC1"),
709         SND_SOC_DAPM_INPUT("MIC2"),
710 
711         SND_SOC_DAPM_INPUT("IN1P"),
712         SND_SOC_DAPM_INPUT("IN2P"),
713         SND_SOC_DAPM_INPUT("IN2N"),
714 
715         /* Boost */
716         SND_SOC_DAPM_PGA_E("BST1", RT5616_PWR_ANLG2,
717                 RT5616_PWR_BST1_BIT, 0, NULL, 0, rt5616_bst1_event,
718                 SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMU),
719         SND_SOC_DAPM_PGA_E("BST2", RT5616_PWR_ANLG2,
720                 RT5616_PWR_BST2_BIT, 0, NULL, 0, rt5616_bst2_event,
721                 SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMU),
722         /* Input Volume */
723         SND_SOC_DAPM_PGA("INL1 VOL", RT5616_PWR_VOL,
724                 RT5616_PWR_IN1_L_BIT, 0, NULL, 0),
725         SND_SOC_DAPM_PGA("INR1 VOL", RT5616_PWR_VOL,
726                 RT5616_PWR_IN1_R_BIT, 0, NULL, 0),
727         SND_SOC_DAPM_PGA("INL2 VOL", RT5616_PWR_VOL,
728                 RT5616_PWR_IN2_L_BIT, 0, NULL, 0),
729         SND_SOC_DAPM_PGA("INR2 VOL", RT5616_PWR_VOL,
730                 RT5616_PWR_IN2_R_BIT, 0, NULL, 0),
731 
732         /* REC Mixer */
733         SND_SOC_DAPM_MIXER("RECMIXL", RT5616_PWR_MIXER, RT5616_PWR_RM_L_BIT, 0,
734                         rt5616_rec_l_mix, ARRAY_SIZE(rt5616_rec_l_mix)),
735         SND_SOC_DAPM_MIXER("RECMIXR", RT5616_PWR_MIXER, RT5616_PWR_RM_R_BIT, 0,
736                         rt5616_rec_r_mix, ARRAY_SIZE(rt5616_rec_r_mix)),
737         /* ADCs */
738         SND_SOC_DAPM_ADC_E("ADC L", NULL, RT5616_PWR_DIG1,
739                 RT5616_PWR_ADC_L_BIT, 0, rt5616_adc_event,
740                 SND_SOC_DAPM_POST_PMD | SND_SOC_DAPM_POST_PMU),
741         SND_SOC_DAPM_ADC_E("ADC R", NULL, RT5616_PWR_DIG1,
742                 RT5616_PWR_ADC_R_BIT, 0, rt5616_adc_event,
743                 SND_SOC_DAPM_POST_PMD | SND_SOC_DAPM_POST_PMU),
744 
745         /* ADC Mixer */
746         SND_SOC_DAPM_SUPPLY("stereo1 filter", RT5616_PWR_DIG2,
747                 RT5616_PWR_ADC_STO1_F_BIT, 0, NULL, 0),
748         SND_SOC_DAPM_MIXER("Stereo1 ADC MIXL", SND_SOC_NOPM, 0, 0,
749                 rt5616_sto1_adc_l_mix, ARRAY_SIZE(rt5616_sto1_adc_l_mix)),
750         SND_SOC_DAPM_MIXER("Stereo1 ADC MIXR", SND_SOC_NOPM, 0, 0,
751                 rt5616_sto1_adc_r_mix, ARRAY_SIZE(rt5616_sto1_adc_r_mix)),
752 
753         /* Digital Interface */
754         SND_SOC_DAPM_SUPPLY("I2S1", RT5616_PWR_DIG1,
755                 RT5616_PWR_I2S1_BIT, 0, NULL, 0),
756         SND_SOC_DAPM_PGA("IF1 DAC", SND_SOC_NOPM, 0, 0, NULL, 0),
757         SND_SOC_DAPM_PGA("IF1 DAC1 L", SND_SOC_NOPM, 0, 0, NULL, 0),
758         SND_SOC_DAPM_PGA("IF1 DAC1 R", SND_SOC_NOPM, 0, 0, NULL, 0),
759         SND_SOC_DAPM_PGA("IF1 ADC1", SND_SOC_NOPM, 0, 0, NULL, 0),
760 
761         /* Digital Interface Select */
762 
763         /* Audio Interface */
764         SND_SOC_DAPM_AIF_IN("AIF1RX", "AIF1 Playback", 0, SND_SOC_NOPM, 0, 0),
765         SND_SOC_DAPM_AIF_OUT("AIF1TX", "AIF1 Capture", 0, SND_SOC_NOPM, 0, 0),
766 
767         /* Audio DSP */
768         SND_SOC_DAPM_PGA("Audio DSP", SND_SOC_NOPM, 0, 0, NULL, 0),
769 
770         /* Output Side */
771         /* DAC mixer before sound effect  */
772         SND_SOC_DAPM_MIXER("DAC MIXL", SND_SOC_NOPM, 0, 0,
773                 rt5616_dac_l_mix, ARRAY_SIZE(rt5616_dac_l_mix)),
774         SND_SOC_DAPM_MIXER("DAC MIXR", SND_SOC_NOPM, 0, 0,
775                 rt5616_dac_r_mix, ARRAY_SIZE(rt5616_dac_r_mix)),
776 
777         SND_SOC_DAPM_SUPPLY("Stero1 DAC Power", RT5616_PWR_DIG2,
778                         RT5616_PWR_DAC_STO1_F_BIT, 0, NULL, 0),
779 
780         /* DAC Mixer */
781         SND_SOC_DAPM_MIXER("Stereo DAC MIXL", SND_SOC_NOPM, 0, 0,
782                 rt5616_sto_dac_l_mix, ARRAY_SIZE(rt5616_sto_dac_l_mix)),
783         SND_SOC_DAPM_MIXER("Stereo DAC MIXR", SND_SOC_NOPM, 0, 0,
784                 rt5616_sto_dac_r_mix, ARRAY_SIZE(rt5616_sto_dac_r_mix)),
785 
786         /* DACs */
787         SND_SOC_DAPM_DAC("DAC L1", NULL, RT5616_PWR_DIG1,
788                         RT5616_PWR_DAC_L1_BIT, 0),
789         SND_SOC_DAPM_DAC("DAC R1", NULL, RT5616_PWR_DIG1,
790                         RT5616_PWR_DAC_R1_BIT, 0),
791         /* OUT Mixer */
792         SND_SOC_DAPM_MIXER("OUT MIXL", RT5616_PWR_MIXER, RT5616_PWR_OM_L_BIT,
793                 0, rt5616_out_l_mix, ARRAY_SIZE(rt5616_out_l_mix)),
794         SND_SOC_DAPM_MIXER("OUT MIXR", RT5616_PWR_MIXER, RT5616_PWR_OM_R_BIT,
795                 0, rt5616_out_r_mix, ARRAY_SIZE(rt5616_out_r_mix)),
796         /* Output Volume */
797         SND_SOC_DAPM_PGA("OUTVOL L", RT5616_PWR_VOL,
798                 RT5616_PWR_OV_L_BIT, 0, NULL, 0),
799         SND_SOC_DAPM_PGA("OUTVOL R", RT5616_PWR_VOL,
800                 RT5616_PWR_OV_R_BIT, 0, NULL, 0),
801         SND_SOC_DAPM_PGA("HPOVOL L", RT5616_PWR_VOL,
802                 RT5616_PWR_HV_L_BIT, 0, NULL, 0),
803         SND_SOC_DAPM_PGA("HPOVOL R", RT5616_PWR_VOL,
804                 RT5616_PWR_HV_R_BIT, 0, NULL, 0),
805         SND_SOC_DAPM_PGA("DAC 1", SND_SOC_NOPM,
806                 0, 0, NULL, 0),
807         SND_SOC_DAPM_PGA("DAC 2", SND_SOC_NOPM,
808                 0, 0, NULL, 0),
809         SND_SOC_DAPM_PGA("HPOVOL", SND_SOC_NOPM,
810                 0, 0, NULL, 0),
811         SND_SOC_DAPM_PGA("INL1", RT5616_PWR_VOL,
812                 RT5616_PWR_IN1_L_BIT, 0, NULL, 0),
813         SND_SOC_DAPM_PGA("INR1", RT5616_PWR_VOL,
814                 RT5616_PWR_IN1_R_BIT, 0, NULL, 0),
815         SND_SOC_DAPM_PGA("INL2", RT5616_PWR_VOL,
816                 RT5616_PWR_IN2_L_BIT, 0, NULL, 0),
817         SND_SOC_DAPM_PGA("INR2", RT5616_PWR_VOL,
818                 RT5616_PWR_IN2_R_BIT, 0, NULL, 0),
819         /* HPO/LOUT/Mono Mixer */
820         SND_SOC_DAPM_MIXER("HPO MIX", SND_SOC_NOPM, 0, 0,
821                 rt5616_hpo_mix, ARRAY_SIZE(rt5616_hpo_mix)),
822         SND_SOC_DAPM_MIXER("LOUT MIX", SND_SOC_NOPM, 0, 0,
823                 rt5616_lout_mix, ARRAY_SIZE(rt5616_lout_mix)),
824 
825         SND_SOC_DAPM_PGA_S("HP amp", 1, SND_SOC_NOPM, 0, 0,
826                 rt5616_hp_event, SND_SOC_DAPM_PRE_PMD |
827                 SND_SOC_DAPM_POST_PMU),
828         SND_SOC_DAPM_PGA_S("LOUT amp", 1, SND_SOC_NOPM, 0, 0,
829                 rt5616_lout_event, SND_SOC_DAPM_PRE_PMD |
830                 SND_SOC_DAPM_POST_PMU),
831 
832         SND_SOC_DAPM_SUPPLY_S("Charge Pump", 1, SND_SOC_NOPM, 0, 0,
833                 rt5616_charge_pump_event, SND_SOC_DAPM_POST_PMU |
834                 SND_SOC_DAPM_PRE_PMD),
835 
836         /* Output Lines */
837         SND_SOC_DAPM_OUTPUT("HPOL"),
838         SND_SOC_DAPM_OUTPUT("HPOR"),
839         SND_SOC_DAPM_OUTPUT("LOUTL"),
840         SND_SOC_DAPM_OUTPUT("LOUTR"),
841 };
842 
843 static const struct snd_soc_dapm_route rt5616_dapm_routes[] = {
844         {"IN1P", NULL, "LDO"},
845         {"IN2P", NULL, "LDO"},
846 
847         {"IN1P", NULL, "MIC1"},
848         {"IN2P", NULL, "MIC2"},
849         {"IN2N", NULL, "MIC2"},
850 
851         {"BST1", NULL, "IN1P"},
852         {"BST2", NULL, "IN2P"},
853         {"BST2", NULL, "IN2N"},
854         {"BST1", NULL, "micbias1"},
855         {"BST2", NULL, "micbias1"},
856 
857         {"INL1 VOL", NULL, "IN2P"},
858         {"INR1 VOL", NULL, "IN2N"},
859 
860         {"RECMIXL", "INL1 Switch", "INL1 VOL"},
861         {"RECMIXL", "BST2 Switch", "BST2"},
862         {"RECMIXL", "BST1 Switch", "BST1"},
863 
864         {"RECMIXR", "INR1 Switch", "INR1 VOL"},
865         {"RECMIXR", "BST2 Switch", "BST2"},
866         {"RECMIXR", "BST1 Switch", "BST1"},
867 
868         {"ADC L", NULL, "RECMIXL"},
869         {"ADC R", NULL, "RECMIXR"},
870 
871         {"Stereo1 ADC MIXL", "ADC1 Switch", "ADC L"},
872         {"Stereo1 ADC MIXL", NULL, "stereo1 filter"},
873         {"stereo1 filter", NULL, "PLL1", is_sys_clk_from_pll},
874 
875         {"Stereo1 ADC MIXR", "ADC1 Switch", "ADC R"},
876         {"Stereo1 ADC MIXR", NULL, "stereo1 filter"},
877         {"stereo1 filter", NULL, "PLL1", is_sys_clk_from_pll},
878 
879         {"IF1 ADC1", NULL, "Stereo1 ADC MIXL"},
880         {"IF1 ADC1", NULL, "Stereo1 ADC MIXR"},
881         {"IF1 ADC1", NULL, "I2S1"},
882 
883         {"AIF1TX", NULL, "IF1 ADC1"},
884 
885         {"IF1 DAC", NULL, "AIF1RX"},
886         {"IF1 DAC", NULL, "I2S1"},
887 
888         {"IF1 DAC1 L", NULL, "IF1 DAC"},
889         {"IF1 DAC1 R", NULL, "IF1 DAC"},
890 
891         {"DAC MIXL", "Stereo ADC Switch", "Stereo1 ADC MIXL"},
892         {"DAC MIXL", "INF1 Switch", "IF1 DAC1 L"},
893         {"DAC MIXR", "Stereo ADC Switch", "Stereo1 ADC MIXR"},
894         {"DAC MIXR", "INF1 Switch", "IF1 DAC1 R"},
895 
896         {"Audio DSP", NULL, "DAC MIXL"},
897         {"Audio DSP", NULL, "DAC MIXR"},
898 
899         {"Stereo DAC MIXL", "DAC L1 Switch", "Audio DSP"},
900         {"Stereo DAC MIXL", "DAC R1 Switch", "DAC MIXR"},
901         {"Stereo DAC MIXL", NULL, "Stero1 DAC Power"},
902         {"Stereo DAC MIXR", "DAC R1 Switch", "Audio DSP"},
903         {"Stereo DAC MIXR", "DAC L1 Switch", "DAC MIXL"},
904         {"Stereo DAC MIXR", NULL, "Stero1 DAC Power"},
905 
906         {"DAC L1", NULL, "Stereo DAC MIXL"},
907         {"DAC L1", NULL, "PLL1", is_sys_clk_from_pll},
908         {"DAC R1", NULL, "Stereo DAC MIXR"},
909         {"DAC R1", NULL, "PLL1", is_sys_clk_from_pll},
910 
911         {"OUT MIXL", "BST1 Switch", "BST1"},
912         {"OUT MIXL", "BST2 Switch", "BST2"},
913         {"OUT MIXL", "INL1 Switch", "INL1 VOL"},
914         {"OUT MIXL", "REC MIXL Switch", "RECMIXL"},
915         {"OUT MIXL", "DAC L1 Switch", "DAC L1"},
916 
917         {"OUT MIXR", "BST2 Switch", "BST2"},
918         {"OUT MIXR", "BST1 Switch", "BST1"},
919         {"OUT MIXR", "INR1 Switch", "INR1 VOL"},
920         {"OUT MIXR", "REC MIXR Switch", "RECMIXR"},
921         {"OUT MIXR", "DAC R1 Switch", "DAC R1"},
922 
923         {"HPOVOL L", NULL, "OUT MIXL"},
924         {"HPOVOL R", NULL, "OUT MIXR"},
925         {"OUTVOL L", NULL, "OUT MIXL"},
926         {"OUTVOL R", NULL, "OUT MIXR"},
927 
928         {"DAC 1", NULL, "DAC L1"},
929         {"DAC 1", NULL, "DAC R1"},
930         {"HPOVOL", NULL, "HPOVOL L"},
931         {"HPOVOL", NULL, "HPOVOL R"},
932         {"HPO MIX", "DAC1 Switch", "DAC 1"},
933         {"HPO MIX", "HPVOL Switch", "HPOVOL"},
934 
935         {"LOUT MIX", "DAC L1 Switch", "DAC L1"},
936         {"LOUT MIX", "DAC R1 Switch", "DAC R1"},
937         {"LOUT MIX", "OUTVOL L Switch", "OUTVOL L"},
938         {"LOUT MIX", "OUTVOL R Switch", "OUTVOL R"},
939 
940         {"HP amp", NULL, "HPO MIX"},
941         {"HP amp", NULL, "Charge Pump"},
942         {"HPOL", NULL, "HP amp"},
943         {"HPOR", NULL, "HP amp"},
944 
945         {"LOUT amp", NULL, "LOUT MIX"},
946         {"LOUT amp", NULL, "Charge Pump"},
947         {"LOUTL", NULL, "LOUT amp"},
948         {"LOUTR", NULL, "LOUT amp"},
949 
950 };
951 
952 static int rt5616_hw_params(struct snd_pcm_substream *substream,
953         struct snd_pcm_hw_params *params, struct snd_soc_dai *dai)
954 {
955         struct snd_soc_pcm_runtime *rtd = substream->private_data;
956         struct snd_soc_codec *codec = rtd->codec;
957         struct rt5616_priv *rt5616 = snd_soc_codec_get_drvdata(codec);
958         unsigned int val_len = 0, val_clk, mask_clk;
959         int pre_div, bclk_ms, frame_size;
960 
961         rt5616->lrck[dai->id] = params_rate(params);
962 
963         pre_div = rl6231_get_clk_info(rt5616->sysclk, rt5616->lrck[dai->id]);
964 
965         if (pre_div < 0) {
966                 dev_err(codec->dev, "Unsupported clock setting\n");
967                 return -EINVAL;
968         }
969         frame_size = snd_soc_params_to_frame_size(params);
970         if (frame_size < 0) {
971                 dev_err(codec->dev, "Unsupported frame size: %d\n", frame_size);
972                 return -EINVAL;
973         }
974         bclk_ms = frame_size > 32 ? 1 : 0;
975         rt5616->bclk[dai->id] = rt5616->lrck[dai->id] * (32 << bclk_ms);
976 
977         dev_dbg(dai->dev, "bclk is %dHz and lrck is %dHz\n",
978                 rt5616->bclk[dai->id], rt5616->lrck[dai->id]);
979         dev_dbg(dai->dev, "bclk_ms is %d and pre_div is %d for iis %d\n",
980                                 bclk_ms, pre_div, dai->id);
981 
982         switch (params_format(params)) {
983         case SNDRV_PCM_FORMAT_S16_LE:
984                 break;
985         case SNDRV_PCM_FORMAT_S20_3LE:
986                 val_len |= RT5616_I2S_DL_20;
987                 break;
988         case SNDRV_PCM_FORMAT_S24_LE:
989                 val_len |= RT5616_I2S_DL_24;
990                 break;
991         case SNDRV_PCM_FORMAT_S8:
992                 val_len |= RT5616_I2S_DL_8;
993                 break;
994         default:
995                 return -EINVAL;
996         }
997 
998         mask_clk = RT5616_I2S_PD1_MASK;
999         val_clk = pre_div << RT5616_I2S_PD1_SFT;
1000         snd_soc_update_bits(codec, RT5616_I2S1_SDP,
1001                 RT5616_I2S_DL_MASK, val_len);
1002         snd_soc_update_bits(codec, RT5616_ADDA_CLK1, mask_clk, val_clk);
1003 
1004 
1005         return 0;
1006 }
1007 
1008 static int rt5616_set_dai_fmt(struct snd_soc_dai *dai, unsigned int fmt)
1009 {
1010         struct snd_soc_codec *codec = dai->codec;
1011         struct rt5616_priv *rt5616 = snd_soc_codec_get_drvdata(codec);
1012         unsigned int reg_val = 0;
1013 
1014         switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) {
1015         case SND_SOC_DAIFMT_CBM_CFM:
1016                 rt5616->master[dai->id] = 1;
1017                 break;
1018         case SND_SOC_DAIFMT_CBS_CFS:
1019                 reg_val |= RT5616_I2S_MS_S;
1020                 rt5616->master[dai->id] = 0;
1021                 break;
1022         default:
1023                 return -EINVAL;
1024         }
1025 
1026         switch (fmt & SND_SOC_DAIFMT_INV_MASK) {
1027         case SND_SOC_DAIFMT_NB_NF:
1028                 break;
1029         case SND_SOC_DAIFMT_IB_NF:
1030                 reg_val |= RT5616_I2S_BP_INV;
1031                 break;
1032         default:
1033                 return -EINVAL;
1034         }
1035 
1036         switch (fmt & SND_SOC_DAIFMT_FORMAT_MASK) {
1037         case SND_SOC_DAIFMT_I2S:
1038                 break;
1039         case SND_SOC_DAIFMT_LEFT_J:
1040                 reg_val |= RT5616_I2S_DF_LEFT;
1041                 break;
1042         case SND_SOC_DAIFMT_DSP_A:
1043                 reg_val |= RT5616_I2S_DF_PCM_A;
1044                 break;
1045         case SND_SOC_DAIFMT_DSP_B:
1046                 reg_val |= RT5616_I2S_DF_PCM_B;
1047                 break;
1048         default:
1049                 return -EINVAL;
1050         }
1051 
1052         snd_soc_update_bits(codec, RT5616_I2S1_SDP,
1053                 RT5616_I2S_MS_MASK | RT5616_I2S_BP_MASK |
1054                 RT5616_I2S_DF_MASK, reg_val);
1055 
1056 
1057         return 0;
1058 }
1059 
1060 static int rt5616_set_dai_sysclk(struct snd_soc_dai *dai,
1061                 int clk_id, unsigned int freq, int dir)
1062 {
1063         struct snd_soc_codec *codec = dai->codec;
1064         struct rt5616_priv *rt5616 = snd_soc_codec_get_drvdata(codec);
1065         unsigned int reg_val = 0;
1066 
1067         if (freq == rt5616->sysclk && clk_id == rt5616->sysclk_src)
1068                 return 0;
1069 
1070         switch (clk_id) {
1071         case RT5616_SCLK_S_MCLK:
1072                 reg_val |= RT5616_SCLK_SRC_MCLK;
1073                 break;
1074         case RT5616_SCLK_S_PLL1:
1075                 reg_val |= RT5616_SCLK_SRC_PLL1;
1076                 break;
1077         default:
1078                 dev_err(codec->dev, "Invalid clock id (%d)\n", clk_id);
1079                 return -EINVAL;
1080         }
1081         snd_soc_update_bits(codec, RT5616_GLB_CLK,
1082                 RT5616_SCLK_SRC_MASK, reg_val);
1083         rt5616->sysclk = freq;
1084         rt5616->sysclk_src = clk_id;
1085 
1086         dev_dbg(dai->dev, "Sysclk is %dHz and clock id is %d\n", freq, clk_id);
1087 
1088         return 0;
1089 }
1090 
1091 static int rt5616_set_dai_pll(struct snd_soc_dai *dai, int pll_id, int source,
1092                         unsigned int freq_in, unsigned int freq_out)
1093 {
1094         struct snd_soc_codec *codec = dai->codec;
1095         struct rt5616_priv *rt5616 = snd_soc_codec_get_drvdata(codec);
1096         struct rl6231_pll_code pll_code;
1097         int ret;
1098 
1099         if (source == rt5616->pll_src && freq_in == rt5616->pll_in &&
1100             freq_out == rt5616->pll_out)
1101                 return 0;
1102 
1103         if (!freq_in || !freq_out) {
1104                 dev_dbg(codec->dev, "PLL disabled\n");
1105 
1106                 rt5616->pll_in = 0;
1107                 rt5616->pll_out = 0;
1108                 snd_soc_update_bits(codec, RT5616_GLB_CLK,
1109                         RT5616_SCLK_SRC_MASK, RT5616_SCLK_SRC_MCLK);
1110                 return 0;
1111         }
1112 
1113         switch (source) {
1114         case RT5616_PLL1_S_MCLK:
1115                 snd_soc_update_bits(codec, RT5616_GLB_CLK,
1116                         RT5616_PLL1_SRC_MASK, RT5616_PLL1_SRC_MCLK);
1117                 break;
1118         case RT5616_PLL1_S_BCLK1:
1119         case RT5616_PLL1_S_BCLK2:
1120                 snd_soc_update_bits(codec, RT5616_GLB_CLK,
1121                         RT5616_PLL1_SRC_MASK, RT5616_PLL1_SRC_BCLK1);
1122                 break;
1123         default:
1124                 dev_err(codec->dev, "Unknown PLL source %d\n", source);
1125                 return -EINVAL;
1126         }
1127 
1128         ret = rl6231_pll_calc(freq_in, freq_out, &pll_code);
1129         if (ret < 0) {
1130                 dev_err(codec->dev, "Unsupport input clock %d\n", freq_in);
1131                 return ret;
1132         }
1133 
1134         dev_dbg(codec->dev, "bypass=%d m=%d n=%d k=%d\n",
1135                 pll_code.m_bp, (pll_code.m_bp ? 0 : pll_code.m_code),
1136                 pll_code.n_code, pll_code.k_code);
1137 
1138         snd_soc_write(codec, RT5616_PLL_CTRL1,
1139                 pll_code.n_code << RT5616_PLL_N_SFT | pll_code.k_code);
1140         snd_soc_write(codec, RT5616_PLL_CTRL2,
1141                 (pll_code.m_bp ? 0 : pll_code.m_code) << RT5616_PLL_M_SFT |
1142                 pll_code.m_bp << RT5616_PLL_M_BP_SFT);
1143 
1144         rt5616->pll_in = freq_in;
1145         rt5616->pll_out = freq_out;
1146         rt5616->pll_src = source;
1147 
1148         return 0;
1149 }
1150 
1151 static int rt5616_set_bias_level(struct snd_soc_codec *codec,
1152                         enum snd_soc_bias_level level)
1153 {
1154         switch (level) {
1155         case SND_SOC_BIAS_STANDBY:
1156                 if (snd_soc_codec_get_bias_level(codec) == SND_SOC_BIAS_OFF) {
1157                         snd_soc_update_bits(codec, RT5616_PWR_ANLG1,
1158                                 RT5616_PWR_VREF1 | RT5616_PWR_MB |
1159                                 RT5616_PWR_BG | RT5616_PWR_VREF2,
1160                                 RT5616_PWR_VREF1 | RT5616_PWR_MB |
1161                                 RT5616_PWR_BG | RT5616_PWR_VREF2);
1162                         mdelay(10);
1163                         snd_soc_update_bits(codec, RT5616_PWR_ANLG1,
1164                                 RT5616_PWR_FV1 | RT5616_PWR_FV2,
1165                                 RT5616_PWR_FV1 | RT5616_PWR_FV2);
1166                         snd_soc_update_bits(codec, RT5616_D_MISC,
1167                                 RT5616_D_GATE_EN, RT5616_D_GATE_EN);
1168                 }
1169                 break;
1170 
1171         case SND_SOC_BIAS_OFF:
1172                 snd_soc_update_bits(codec, RT5616_D_MISC, RT5616_D_GATE_EN, 0);
1173                 snd_soc_write(codec, RT5616_PWR_DIG1, 0x0000);
1174                 snd_soc_write(codec, RT5616_PWR_DIG2, 0x0000);
1175                 snd_soc_write(codec, RT5616_PWR_VOL, 0x0000);
1176                 snd_soc_write(codec, RT5616_PWR_MIXER, 0x0000);
1177                 snd_soc_write(codec, RT5616_PWR_ANLG1, 0x0000);
1178                 snd_soc_write(codec, RT5616_PWR_ANLG2, 0x0000);
1179                 break;
1180 
1181         default:
1182                 break;
1183         }
1184 
1185         return 0;
1186 }
1187 
1188 static int rt5616_probe(struct snd_soc_codec *codec)
1189 {
1190         struct rt5616_priv *rt5616 = snd_soc_codec_get_drvdata(codec);
1191 
1192         rt5616->codec = codec;
1193 
1194         return 0;
1195 }
1196 
1197 #ifdef CONFIG_PM
1198 static int rt5616_suspend(struct snd_soc_codec *codec)
1199 {
1200         struct rt5616_priv *rt5616 = snd_soc_codec_get_drvdata(codec);
1201 
1202         regcache_cache_only(rt5616->regmap, true);
1203         regcache_mark_dirty(rt5616->regmap);
1204 
1205         return 0;
1206 }
1207 
1208 static int rt5616_resume(struct snd_soc_codec *codec)
1209 {
1210         struct rt5616_priv *rt5616 = snd_soc_codec_get_drvdata(codec);
1211 
1212         regcache_cache_only(rt5616->regmap, false);
1213         regcache_sync(rt5616->regmap);
1214         return 0;
1215 }
1216 #else
1217 #define rt5616_suspend NULL
1218 #define rt5616_resume NULL
1219 #endif
1220 
1221 #define RT5616_STEREO_RATES SNDRV_PCM_RATE_8000_96000
1222 #define RT5616_FORMATS (SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S20_3LE | \
1223                         SNDRV_PCM_FMTBIT_S24_LE | SNDRV_PCM_FMTBIT_S8)
1224 
1225 
1226 struct snd_soc_dai_ops rt5616_aif_dai_ops = {
1227         .hw_params = rt5616_hw_params,
1228         .set_fmt = rt5616_set_dai_fmt,
1229         .set_sysclk = rt5616_set_dai_sysclk,
1230         .set_pll = rt5616_set_dai_pll,
1231 };
1232 
1233 struct snd_soc_dai_driver rt5616_dai[] = {
1234         {
1235                 .name = "rt5616-aif1",
1236                 .id = RT5616_AIF1,
1237                 .playback = {
1238                         .stream_name = "AIF1 Playback",
1239                         .channels_min = 1,
1240                         .channels_max = 2,
1241                         .rates = RT5616_STEREO_RATES,
1242                         .formats = RT5616_FORMATS,
1243                 },
1244                 .capture = {
1245                         .stream_name = "AIF1 Capture",
1246                         .channels_min = 1,
1247                         .channels_max = 2,
1248                         .rates = RT5616_STEREO_RATES,
1249                         .formats = RT5616_FORMATS,
1250                 },
1251                 .ops = &rt5616_aif_dai_ops,
1252         },
1253 };
1254 
1255 static struct snd_soc_codec_driver soc_codec_dev_rt5616 = {
1256         .probe = rt5616_probe,
1257         .suspend = rt5616_suspend,
1258         .resume = rt5616_resume,
1259         .set_bias_level = rt5616_set_bias_level,
1260         .idle_bias_off = true,
1261         .controls = rt5616_snd_controls,
1262         .num_controls = ARRAY_SIZE(rt5616_snd_controls),
1263         .dapm_widgets = rt5616_dapm_widgets,
1264         .num_dapm_widgets = ARRAY_SIZE(rt5616_dapm_widgets),
1265         .dapm_routes = rt5616_dapm_routes,
1266         .num_dapm_routes = ARRAY_SIZE(rt5616_dapm_routes),
1267 };
1268 
1269 static const struct regmap_config rt5616_regmap = {
1270         .reg_bits = 8,
1271         .val_bits = 16,
1272         .use_single_rw = true,
1273         .max_register = RT5616_DEVICE_ID + 1 + (ARRAY_SIZE(rt5616_ranges) *
1274                                                RT5616_PR_SPACING),
1275         .volatile_reg = rt5616_volatile_register,
1276         .readable_reg = rt5616_readable_register,
1277         .cache_type = REGCACHE_RBTREE,
1278         .reg_defaults = rt5616_reg,
1279         .num_reg_defaults = ARRAY_SIZE(rt5616_reg),
1280         .ranges = rt5616_ranges,
1281         .num_ranges = ARRAY_SIZE(rt5616_ranges),
1282 };
1283 
1284 static const struct i2c_device_id rt5616_i2c_id[] = {
1285         { "rt5616", 0 },
1286         { }
1287 };
1288 MODULE_DEVICE_TABLE(i2c, rt5616_i2c_id);
1289 
1290 #if defined(CONFIG_OF)
1291 static const struct of_device_id rt5616_of_match[] = {
1292         { .compatible = "realtek,rt5616", },
1293         {},
1294 };
1295 MODULE_DEVICE_TABLE(of, rt5616_of_match);
1296 #endif
1297 
1298 static int rt5616_i2c_probe(struct i2c_client *i2c,
1299                     const struct i2c_device_id *id)
1300 {
1301         struct rt5616_priv *rt5616;
1302         unsigned int val;
1303         int ret;
1304 
1305         rt5616 = devm_kzalloc(&i2c->dev, sizeof(struct rt5616_priv),
1306                                 GFP_KERNEL);
1307         if (rt5616 == NULL)
1308                 return -ENOMEM;
1309 
1310         i2c_set_clientdata(i2c, rt5616);
1311 
1312         rt5616->regmap = devm_regmap_init_i2c(i2c, &rt5616_regmap);
1313         if (IS_ERR(rt5616->regmap)) {
1314                 ret = PTR_ERR(rt5616->regmap);
1315                 dev_err(&i2c->dev, "Failed to allocate register map: %d\n",
1316                         ret);
1317                 return ret;
1318         }
1319 
1320         regmap_read(rt5616->regmap, RT5616_DEVICE_ID, &val);
1321         if (val != 0x6281) {
1322                 dev_err(&i2c->dev,
1323                         "Device with ID register %#x is not rt5616\n",
1324                         val);
1325                 return -ENODEV;
1326         }
1327         regmap_write(rt5616->regmap, RT5616_RESET, 0);
1328         regmap_update_bits(rt5616->regmap, RT5616_PWR_ANLG1,
1329                 RT5616_PWR_VREF1 | RT5616_PWR_MB |
1330                 RT5616_PWR_BG | RT5616_PWR_VREF2,
1331                 RT5616_PWR_VREF1 | RT5616_PWR_MB |
1332                 RT5616_PWR_BG | RT5616_PWR_VREF2);
1333         mdelay(10);
1334         regmap_update_bits(rt5616->regmap, RT5616_PWR_ANLG1,
1335                 RT5616_PWR_FV1 | RT5616_PWR_FV2,
1336                 RT5616_PWR_FV1 | RT5616_PWR_FV2);
1337 
1338         ret = regmap_register_patch(rt5616->regmap, init_list,
1339                                     ARRAY_SIZE(init_list));
1340         if (ret != 0)
1341                 dev_warn(&i2c->dev, "Failed to apply regmap patch: %d\n", ret);
1342 
1343         regmap_update_bits(rt5616->regmap, RT5616_PWR_ANLG1,
1344                 RT5616_PWR_LDO_DVO_MASK, RT5616_PWR_LDO_DVO_1_2V);
1345 
1346         return snd_soc_register_codec(&i2c->dev, &soc_codec_dev_rt5616,
1347                         rt5616_dai, ARRAY_SIZE(rt5616_dai));
1348 
1349 }
1350 
1351 static int rt5616_i2c_remove(struct i2c_client *i2c)
1352 {
1353         snd_soc_unregister_codec(&i2c->dev);
1354 
1355         return 0;
1356 }
1357 
1358 static void rt5616_i2c_shutdown(struct i2c_client *client)
1359 {
1360         struct rt5616_priv *rt5616 = i2c_get_clientdata(client);
1361 
1362         regmap_write(rt5616->regmap, RT5616_HP_VOL, 0xc8c8);
1363         regmap_write(rt5616->regmap, RT5616_LOUT_CTRL1, 0xc8c8);
1364 
1365 }
1366 
1367 static struct i2c_driver rt5616_i2c_driver = {
1368         .driver = {
1369                 .name = "rt5616",
1370                 .of_match_table = of_match_ptr(rt5616_of_match),
1371         },
1372         .probe = rt5616_i2c_probe,
1373         .remove = rt5616_i2c_remove,
1374         .shutdown = rt5616_i2c_shutdown,
1375         .id_table = rt5616_i2c_id,
1376 };
1377 module_i2c_driver(rt5616_i2c_driver);
1378 
1379 MODULE_DESCRIPTION("ASoC RT5616 driver");
1380 MODULE_AUTHOR("Bard Liao <bardliao@realtek.com>");
1381 MODULE_LICENSE("GPL");
1382 

~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

kernel.org | git.kernel.org | LWN.net | Project Home | Wiki (Japanese) | Wiki (English) | SVN repository | Mail admin

Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.

osdn.jp