2 * rt5616.c -- RT5616 ALSA SoC audio codec driver
4 * Copyright 2015 Realtek Semiconductor Corp.
5 * Author: Bard Liao <bardliao@realtek.com>
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.
12 #include <linux/module.h>
13 #include <linux/moduleparam.h>
14 #include <linux/init.h>
15 #include <linux/delay.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>
31 #define RT5616_PR_RANGE_BASE (0xff + 1)
32 #define RT5616_PR_SPACING 0x100
34 #define RT5616_PR_BASE (RT5616_PR_RANGE_BASE + (0 * RT5616_PR_SPACING))
36 static const struct regmap_range_cfg rt5616_ranges
[] = {
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
,
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},
56 #define RT5616_INIT_REG_LEN ARRAY_SIZE(init_list)
58 static const struct reg_default rt5616_reg
[] = {
143 struct snd_soc_codec
*codec
;
144 struct delayed_work patch_work
;
145 struct regmap
*regmap
;
149 int lrck
[RT5616_AIFS
];
150 int bclk
[RT5616_AIFS
];
151 int master
[RT5616_AIFS
];
159 static bool rt5616_volatile_register(struct device
*dev
, unsigned int reg
)
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
) {
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
:
187 static bool rt5616_readable_register(struct device
*dev
, unsigned int reg
)
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
) {
200 case RT5616_VERSION_ID
:
201 case RT5616_VENDOR_ID
:
202 case RT5616_DEVICE_ID
:
204 case RT5616_LOUT_CTRL1
:
205 case RT5616_LOUT_CTRL2
:
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
:
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
:
238 case RT5616_PLL_CTRL1
:
239 case RT5616_PLL_CTRL2
:
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
:
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
:
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
:
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);
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),
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
),
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
),
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
,
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
),
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
,
347 static int is_sys_clk_from_pll(struct snd_soc_dapm_widget
*source
,
348 struct snd_soc_dapm_widget
*sink
)
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
)
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),
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),
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),
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),
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),
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),
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),
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),
418 /* Analog Output Mixer */
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),
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),
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),
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),
464 static int rt5616_adc_event(struct snd_soc_dapm_widget
*w
,
465 struct snd_kcontrol
*kcontrol
, int event
)
467 struct snd_soc_codec
*codec
= snd_soc_dapm_to_codec(w
->dapm
);
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);
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
);
488 static int rt5616_charge_pump_event(struct snd_soc_dapm_widget
*w
,
489 struct snd_kcontrol
*kcontrol
, int event
)
491 struct snd_soc_codec
*codec
= snd_soc_dapm_to_codec(w
->dapm
);
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
);
515 snd_soc_update_bits(codec
, RT5616_PWR_ANLG1
,
516 RT5616_PWR_FV1
| RT5616_PWR_FV2
,
517 RT5616_PWR_FV1
| RT5616_PWR_FV2
);
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
);
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
|
553 static int rt5616_hp_event(struct snd_soc_dapm_widget
*w
,
554 struct snd_kcontrol
*kcontrol
, int event
)
556 struct snd_soc_codec
*codec
= snd_soc_dapm_to_codec(w
->dapm
);
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
|
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);
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
);
585 snd_soc_update_bits(codec
, RT5616_HP_CALIB_AMP_DET
,
586 RT5616_HPD_PS_MASK
, RT5616_HPD_PS_EN
);
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
|
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
);
610 snd_soc_update_bits(codec
, RT5616_HP_VOL
,
611 RT5616_L_MUTE
| RT5616_R_MUTE
,
612 RT5616_L_MUTE
| RT5616_R_MUTE
);
623 static int rt5616_lout_event(struct snd_soc_dapm_widget
*w
,
624 struct snd_kcontrol
*kcontrol
, int event
)
626 struct snd_soc_codec
*codec
= snd_soc_dapm_to_codec(w
->dapm
);
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);
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
,
651 static int rt5616_bst1_event(struct snd_soc_dapm_widget
*w
,
652 struct snd_kcontrol
*kcontrol
, int event
)
654 struct snd_soc_codec
*codec
= snd_soc_dapm_to_codec(w
->dapm
);
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
);
662 case SND_SOC_DAPM_PRE_PMD
:
663 snd_soc_update_bits(codec
, RT5616_PWR_ANLG2
,
664 RT5616_PWR_BST1_OP2
, 0);
674 static int rt5616_bst2_event(struct snd_soc_dapm_widget
*w
,
675 struct snd_kcontrol
*kcontrol
, int event
)
677 struct snd_soc_codec
*codec
= snd_soc_dapm_to_codec(w
->dapm
);
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
);
685 case SND_SOC_DAPM_PRE_PMD
:
686 snd_soc_update_bits(codec
, RT5616_PWR_ANLG2
,
687 RT5616_PWR_BST2_OP2
, 0);
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),
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),
708 SND_SOC_DAPM_INPUT("MIC1"),
709 SND_SOC_DAPM_INPUT("MIC2"),
711 SND_SOC_DAPM_INPUT("IN1P"),
712 SND_SOC_DAPM_INPUT("IN2P"),
713 SND_SOC_DAPM_INPUT("IN2N"),
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
),
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),
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
)),
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
),
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
)),
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),
761 /* Digital Interface Select */
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),
768 SND_SOC_DAPM_PGA("Audio DSP", SND_SOC_NOPM
, 0, 0, NULL
, 0),
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
)),
777 SND_SOC_DAPM_SUPPLY("Stero1 DAC Power", RT5616_PWR_DIG2
,
778 RT5616_PWR_DAC_STO1_F_BIT
, 0, NULL
, 0),
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
)),
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),
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
)),
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
,
807 SND_SOC_DAPM_PGA("DAC 2", SND_SOC_NOPM
,
809 SND_SOC_DAPM_PGA("HPOVOL", SND_SOC_NOPM
,
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
)),
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
),
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
),
837 SND_SOC_DAPM_OUTPUT("HPOL"),
838 SND_SOC_DAPM_OUTPUT("HPOR"),
839 SND_SOC_DAPM_OUTPUT("LOUTL"),
840 SND_SOC_DAPM_OUTPUT("LOUTR"),
843 static const struct snd_soc_dapm_route rt5616_dapm_routes
[] = {
844 {"IN1P", NULL
, "LDO"},
845 {"IN2P", NULL
, "LDO"},
847 {"IN1P", NULL
, "MIC1"},
848 {"IN2P", NULL
, "MIC2"},
849 {"IN2N", NULL
, "MIC2"},
851 {"BST1", NULL
, "IN1P"},
852 {"BST2", NULL
, "IN2P"},
853 {"BST2", NULL
, "IN2N"},
854 {"BST1", NULL
, "micbias1"},
855 {"BST2", NULL
, "micbias1"},
857 {"INL1 VOL", NULL
, "IN2P"},
858 {"INR1 VOL", NULL
, "IN2N"},
860 {"RECMIXL", "INL1 Switch", "INL1 VOL"},
861 {"RECMIXL", "BST2 Switch", "BST2"},
862 {"RECMIXL", "BST1 Switch", "BST1"},
864 {"RECMIXR", "INR1 Switch", "INR1 VOL"},
865 {"RECMIXR", "BST2 Switch", "BST2"},
866 {"RECMIXR", "BST1 Switch", "BST1"},
868 {"ADC L", NULL
, "RECMIXL"},
869 {"ADC R", NULL
, "RECMIXR"},
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
},
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
},
879 {"IF1 ADC1", NULL
, "Stereo1 ADC MIXL"},
880 {"IF1 ADC1", NULL
, "Stereo1 ADC MIXR"},
881 {"IF1 ADC1", NULL
, "I2S1"},
883 {"AIF1TX", NULL
, "IF1 ADC1"},
885 {"IF1 DAC", NULL
, "AIF1RX"},
886 {"IF1 DAC", NULL
, "I2S1"},
888 {"IF1 DAC1 L", NULL
, "IF1 DAC"},
889 {"IF1 DAC1 R", NULL
, "IF1 DAC"},
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"},
896 {"Audio DSP", NULL
, "DAC MIXL"},
897 {"Audio DSP", NULL
, "DAC MIXR"},
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"},
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
},
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"},
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"},
923 {"HPOVOL L", NULL
, "OUT MIXL"},
924 {"HPOVOL R", NULL
, "OUT MIXR"},
925 {"OUTVOL L", NULL
, "OUT MIXL"},
926 {"OUTVOL R", NULL
, "OUT MIXR"},
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"},
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"},
940 {"HP amp", NULL
, "HPO MIX"},
941 {"HP amp", NULL
, "Charge Pump"},
942 {"HPOL", NULL
, "HP amp"},
943 {"HPOR", NULL
, "HP amp"},
945 {"LOUT amp", NULL
, "LOUT MIX"},
946 {"LOUT amp", NULL
, "Charge Pump"},
947 {"LOUTL", NULL
, "LOUT amp"},
948 {"LOUTR", NULL
, "LOUT amp"},
952 static int rt5616_hw_params(struct snd_pcm_substream
*substream
,
953 struct snd_pcm_hw_params
*params
, struct snd_soc_dai
*dai
)
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
;
961 rt5616
->lrck
[dai
->id
] = params_rate(params
);
963 pre_div
= rl6231_get_clk_info(rt5616
->sysclk
, rt5616
->lrck
[dai
->id
]);
966 dev_err(codec
->dev
, "Unsupported clock setting\n");
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
);
974 bclk_ms
= frame_size
> 32 ? 1 : 0;
975 rt5616
->bclk
[dai
->id
] = rt5616
->lrck
[dai
->id
] * (32 << bclk_ms
);
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
);
982 switch (params_format(params
)) {
983 case SNDRV_PCM_FORMAT_S16_LE
:
985 case SNDRV_PCM_FORMAT_S20_3LE
:
986 val_len
|= RT5616_I2S_DL_20
;
988 case SNDRV_PCM_FORMAT_S24_LE
:
989 val_len
|= RT5616_I2S_DL_24
;
991 case SNDRV_PCM_FORMAT_S8
:
992 val_len
|= RT5616_I2S_DL_8
;
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
);
1008 static int rt5616_set_dai_fmt(struct snd_soc_dai
*dai
, unsigned int fmt
)
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;
1014 switch (fmt
& SND_SOC_DAIFMT_MASTER_MASK
) {
1015 case SND_SOC_DAIFMT_CBM_CFM
:
1016 rt5616
->master
[dai
->id
] = 1;
1018 case SND_SOC_DAIFMT_CBS_CFS
:
1019 reg_val
|= RT5616_I2S_MS_S
;
1020 rt5616
->master
[dai
->id
] = 0;
1026 switch (fmt
& SND_SOC_DAIFMT_INV_MASK
) {
1027 case SND_SOC_DAIFMT_NB_NF
:
1029 case SND_SOC_DAIFMT_IB_NF
:
1030 reg_val
|= RT5616_I2S_BP_INV
;
1036 switch (fmt
& SND_SOC_DAIFMT_FORMAT_MASK
) {
1037 case SND_SOC_DAIFMT_I2S
:
1039 case SND_SOC_DAIFMT_LEFT_J
:
1040 reg_val
|= RT5616_I2S_DF_LEFT
;
1042 case SND_SOC_DAIFMT_DSP_A
:
1043 reg_val
|= RT5616_I2S_DF_PCM_A
;
1045 case SND_SOC_DAIFMT_DSP_B
:
1046 reg_val
|= RT5616_I2S_DF_PCM_B
;
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
);
1060 static int rt5616_set_dai_sysclk(struct snd_soc_dai
*dai
,
1061 int clk_id
, unsigned int freq
, int dir
)
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;
1067 if (freq
== rt5616
->sysclk
&& clk_id
== rt5616
->sysclk_src
)
1071 case RT5616_SCLK_S_MCLK
:
1072 reg_val
|= RT5616_SCLK_SRC_MCLK
;
1074 case RT5616_SCLK_S_PLL1
:
1075 reg_val
|= RT5616_SCLK_SRC_PLL1
;
1078 dev_err(codec
->dev
, "Invalid clock id (%d)\n", clk_id
);
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
;
1086 dev_dbg(dai
->dev
, "Sysclk is %dHz and clock id is %d\n", freq
, clk_id
);
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
)
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
;
1099 if (source
== rt5616
->pll_src
&& freq_in
== rt5616
->pll_in
&&
1100 freq_out
== rt5616
->pll_out
)
1103 if (!freq_in
|| !freq_out
) {
1104 dev_dbg(codec
->dev
, "PLL disabled\n");
1107 rt5616
->pll_out
= 0;
1108 snd_soc_update_bits(codec
, RT5616_GLB_CLK
,
1109 RT5616_SCLK_SRC_MASK
, RT5616_SCLK_SRC_MCLK
);
1114 case RT5616_PLL1_S_MCLK
:
1115 snd_soc_update_bits(codec
, RT5616_GLB_CLK
,
1116 RT5616_PLL1_SRC_MASK
, RT5616_PLL1_SRC_MCLK
);
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
);
1124 dev_err(codec
->dev
, "Unknown PLL source %d\n", source
);
1128 ret
= rl6231_pll_calc(freq_in
, freq_out
, &pll_code
);
1130 dev_err(codec
->dev
, "Unsupport input clock %d\n", freq_in
);
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
);
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
);
1144 rt5616
->pll_in
= freq_in
;
1145 rt5616
->pll_out
= freq_out
;
1146 rt5616
->pll_src
= source
;
1151 static int rt5616_set_bias_level(struct snd_soc_codec
*codec
,
1152 enum snd_soc_bias_level 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
);
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
);
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);
1188 static int rt5616_probe(struct snd_soc_codec
*codec
)
1190 struct rt5616_priv
*rt5616
= snd_soc_codec_get_drvdata(codec
);
1192 rt5616
->codec
= codec
;
1198 static int rt5616_suspend(struct snd_soc_codec
*codec
)
1200 struct rt5616_priv
*rt5616
= snd_soc_codec_get_drvdata(codec
);
1202 regcache_cache_only(rt5616
->regmap
, true);
1203 regcache_mark_dirty(rt5616
->regmap
);
1208 static int rt5616_resume(struct snd_soc_codec
*codec
)
1210 struct rt5616_priv
*rt5616
= snd_soc_codec_get_drvdata(codec
);
1212 regcache_cache_only(rt5616
->regmap
, false);
1213 regcache_sync(rt5616
->regmap
);
1217 #define rt5616_suspend NULL
1218 #define rt5616_resume NULL
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)
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
,
1233 struct snd_soc_dai_driver rt5616_dai
[] = {
1235 .name
= "rt5616-aif1",
1238 .stream_name
= "AIF1 Playback",
1241 .rates
= RT5616_STEREO_RATES
,
1242 .formats
= RT5616_FORMATS
,
1245 .stream_name
= "AIF1 Capture",
1248 .rates
= RT5616_STEREO_RATES
,
1249 .formats
= RT5616_FORMATS
,
1251 .ops
= &rt5616_aif_dai_ops
,
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
),
1269 static const struct regmap_config rt5616_regmap
= {
1272 .use_single_rw
= true,
1273 .max_register
= RT5616_DEVICE_ID
+ 1 + (ARRAY_SIZE(rt5616_ranges
) *
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
),
1284 static const struct i2c_device_id rt5616_i2c_id
[] = {
1288 MODULE_DEVICE_TABLE(i2c
, rt5616_i2c_id
);
1290 #if defined(CONFIG_OF)
1291 static const struct of_device_id rt5616_of_match
[] = {
1292 { .compatible
= "realtek,rt5616", },
1295 MODULE_DEVICE_TABLE(of
, rt5616_of_match
);
1298 static int rt5616_i2c_probe(struct i2c_client
*i2c
,
1299 const struct i2c_device_id
*id
)
1301 struct rt5616_priv
*rt5616
;
1305 rt5616
= devm_kzalloc(&i2c
->dev
, sizeof(struct rt5616_priv
),
1310 i2c_set_clientdata(i2c
, rt5616
);
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",
1320 regmap_read(rt5616
->regmap
, RT5616_DEVICE_ID
, &val
);
1321 if (val
!= 0x6281) {
1323 "Device with ID register %#x is not rt5616\n",
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
);
1334 regmap_update_bits(rt5616
->regmap
, RT5616_PWR_ANLG1
,
1335 RT5616_PWR_FV1
| RT5616_PWR_FV2
,
1336 RT5616_PWR_FV1
| RT5616_PWR_FV2
);
1338 ret
= regmap_register_patch(rt5616
->regmap
, init_list
,
1339 ARRAY_SIZE(init_list
));
1341 dev_warn(&i2c
->dev
, "Failed to apply regmap patch: %d\n", ret
);
1343 regmap_update_bits(rt5616
->regmap
, RT5616_PWR_ANLG1
,
1344 RT5616_PWR_LDO_DVO_MASK
, RT5616_PWR_LDO_DVO_1_2V
);
1346 return snd_soc_register_codec(&i2c
->dev
, &soc_codec_dev_rt5616
,
1347 rt5616_dai
, ARRAY_SIZE(rt5616_dai
));
1351 static int rt5616_i2c_remove(struct i2c_client
*i2c
)
1353 snd_soc_unregister_codec(&i2c
->dev
);
1358 static void rt5616_i2c_shutdown(struct i2c_client
*client
)
1360 struct rt5616_priv
*rt5616
= i2c_get_clientdata(client
);
1362 regmap_write(rt5616
->regmap
, RT5616_HP_VOL
, 0xc8c8);
1363 regmap_write(rt5616
->regmap
, RT5616_LOUT_CTRL1
, 0xc8c8);
1367 static struct i2c_driver rt5616_i2c_driver
= {
1370 .of_match_table
= of_match_ptr(rt5616_of_match
),
1372 .probe
= rt5616_i2c_probe
,
1373 .remove
= rt5616_i2c_remove
,
1374 .shutdown
= rt5616_i2c_shutdown
,
1375 .id_table
= rt5616_i2c_id
,
1377 module_i2c_driver(rt5616_i2c_driver
);
1379 MODULE_DESCRIPTION("ASoC RT5616 driver");
1380 MODULE_AUTHOR("Bard Liao <bardliao@realtek.com>");
1381 MODULE_LICENSE("GPL");