1 #include <linux/module.h>
2 #include <linux/kernel.h>
3 #include <linux/init.h>
5 #include <linux/slab.h>
7 #include <linux/delay.h>
10 #include <linux/uaccess.h>
11 #include <linux/debugfs.h>
12 #include <linux/slab.h>
13 #include <linux/string.h>
16 #include <sound/soc.h>
17 #include <sound/soc-dai.h>
18 #include <sound/soc-dapm.h>
19 #include <sound/pcm.h>
20 #include <sound/pcm_params.h>
21 #include <sound/tlv.h>
22 #include <sound/jack.h>
26 #define RT5512_SRATE_MASK 0x7
27 #define RT5512_AUDBIT_MASK 0x3
28 #define RT5512_MCLKSELBIT_MASK 0xf
29 #define RT5512_CLKBASEBIT_MASK 0x2
30 #define RT5512_AUDFMT_MASK 0xc
31 #define RT5512_PDBIT_MASK 0x40
32 #define RT5512_RSTBIT_MASK 0x80
34 #define RT5512_RATES SNDRV_PCM_RATE_8000_96000
35 #define RT5512_FORMATS (SNDRV_PCM_FMTBIT_S16_LE|SNDRV_PCM_FMTBIT_S20_3LE|SNDRV_PCM_FMTBIT_S24_LE)
37 #define RT5512_MAX_REG 0xEC
38 #define RT5512_VIRTUAL_REG 0xEC
40 struct rt5512_codec_reg
42 unsigned char reg_size;
43 unsigned int reg_cache; // support maximum 4 byte data
44 unsigned char sync_needed;
47 static struct rt5512_codec_reg rt5512_reg_priv[RT5512_MAX_REG+1] =
101 [0x40] = { 16, 0, 0},
102 [0x41] = { 16, 0, 0},
103 [0x42] = { 16, 0, 0},
104 [0x43] = { 16, 0, 0},
105 [0x44] = { 16, 0, 0},
106 [0x45] = { 16, 0, 0},
173 struct rt5512_init_reg {
178 static struct rt5512_init_reg init_list[] = {
190 #define RT5512_INIT_REG_LEN ARRAY_SIZE(init_list)
192 static int rt5512_reg_init(struct snd_soc_codec *codec)
196 for (i = 0; i < RT5512_INIT_REG_LEN; i++)
197 snd_soc_write(codec, init_list[i].reg, init_list[i].regval);
203 static int rt5512_hw_params(struct snd_pcm_substream *substream,
204 struct snd_pcm_hw_params *params, struct snd_soc_dai *dai)
206 struct snd_soc_codec *codec = dai->codec;
207 unsigned short srate_reg;
208 unsigned int new_srate_regval, new_datfmt_regval;
211 RT_DBG("codec hw_param\n");
212 RT_DBG("codec hw_param dai id %d\n", dai->id);
222 dev_err(codec->dev, "this codec dai id is not supported\n");
226 RT_DBG("codec hw_param rate%d\n", params_rate(params));
227 switch (params_rate(params))
230 new_srate_regval = 0x0;
234 new_srate_regval = 0x1;
237 new_srate_regval = 0x2;
241 new_srate_regval = 0x3;
244 new_srate_regval = 0x4;
248 new_srate_regval = 0x5;
252 new_srate_regval = 0x6;
255 dev_err(codec->dev, "not supported sampling rate\n");
258 snd_soc_update_bits(codec, srate_reg, RT5512_SRATE_MASK, new_srate_regval);
261 RT_DBG("codec hw_param format%d\n", params_format(params));
262 switch (params_format(params))
264 case SNDRV_PCM_FORMAT_S16_LE:
265 new_datfmt_regval = 0x3;
267 case SNDRV_PCM_FORMAT_S20_3LE:
268 new_datfmt_regval = 0x1;
270 case SNDRV_PCM_FORMAT_S24_LE:
271 new_datfmt_regval = 0x0;
274 dev_err(codec->dev, "not supported data bit format\n");
277 snd_soc_update_bits(codec, 0x02, RT5512_AUDBIT_MASK, new_datfmt_regval);
279 RT_DBG("stream direction %d\n", substream->stream);
280 if (substream->stream == 0) //Playback
281 snd_soc_write(codec, 0x56, 0xA4);
282 else if (substream->stream == 1) //Record
284 snd_soc_update_bits(codec, 0x9F, 0xC0, 0x40);
285 snd_soc_update_bits(codec, 0x81, 0x40, 0x00);
286 snd_soc_write(codec, 0x9E, 0x00);
289 RT_DBG("special register configuration\n");
290 snd_soc_write(codec, 0xE0, 0x2F);
291 snd_soc_write(codec, 0xEB, 0xB4);
292 snd_soc_write(codec, 0xE8, 0x53);
297 static int rt5512_set_dai_sysclk(struct snd_soc_dai *dai,
298 int clk_id, unsigned int freq, int dir)
300 struct snd_soc_codec *codec = dai->codec;
301 unsigned int new_mclk_sel, new_clk_basesel;
303 RT_DBG("codec dai_sysclk\n");
313 dev_err(codec->dev, "no this codec dai id\n");
316 snd_soc_update_bits(codec, 0x01, RT5512_MCLKSELBIT_MASK, new_mclk_sel);
318 if (freq == 11289600) //22.579200 MHz
319 new_clk_basesel = RT5512_CLKBASEBIT_MASK;
323 snd_soc_update_bits(codec, 0x1A, RT5512_CLKBASEBIT_MASK, new_clk_basesel);
325 snd_soc_dapm_sync(&codec->dapm);
329 static int rt5512_digital_mute(struct snd_soc_dai *dai, int mute)
331 struct snd_soc_codec *codec = dai->codec;
332 unsigned int mute_mask;
334 RT_DBG("codec digital_mute id = %d\n", dai->id);
344 dev_err(codec->dev, "no this codec dai id\n");
347 snd_soc_update_bits(codec, 0x07, mute_mask, (mute?mute_mask:0));
353 static int rt5512_set_dai_fmt(struct snd_soc_dai *codec_dai,
356 struct snd_soc_codec *codec = codec_dai->codec;
357 unsigned int new_daifmt_regval;
359 RT_DBG("codec dai_fmt\n");
360 if (fmt & SND_SOC_DAIFMT_I2S)
361 new_daifmt_regval = 0x00;
362 else if (fmt & SND_SOC_DAIFMT_RIGHT_J)
363 new_daifmt_regval = 0x08;
364 else if (fmt & SND_SOC_DAIFMT_LEFT_J)
365 new_daifmt_regval = 0x04;
367 new_daifmt_regval = 0x00;
369 snd_soc_update_bits(codec, 0x02, RT5512_AUDFMT_MASK, new_daifmt_regval);
373 static int rt5512_set_clkdiv(struct snd_soc_dai *codec_dai, int div_id, int div)
375 struct snd_soc_codec *codec = codec_dai->codec;
377 RT_DBG("codec clk_div(%d) value %d\n", div_id, div);
380 case RT5512_CLK_DIV_ID:
381 snd_soc_write(codec, 0x55, (div&0x1ffff) << 16);
384 dev_err(codec->dev, "Invalid clock divider");
391 static struct snd_soc_dai_ops rt5512_dai_ops =
393 .hw_params = rt5512_hw_params,
394 .digital_mute = rt5512_digital_mute,
395 .set_sysclk = rt5512_set_dai_sysclk,
396 .set_fmt = rt5512_set_dai_fmt,
397 .set_clkdiv = rt5512_set_clkdiv,
400 static struct snd_soc_dai_driver rt5512_dai[] =
404 .name = "RT5512-aif1",
407 .stream_name = "AIF1 Playback",
410 .rates = RT5512_RATES,
411 .formats = RT5512_FORMATS,
415 .stream_name = "AIF1 Capture",
418 .rates = RT5512_RATES,
419 .formats = RT5512_FORMATS,
421 .ops = &rt5512_dai_ops,
422 .symmetric_rates = 1,
427 .name = "RT5512-aif2",
430 .stream_name = "AIF2 Playback",
433 .rates = RT5512_RATES,
434 .formats = RT5512_FORMATS,
438 .stream_name = "AIF2 Capture",
441 .rates = RT5512_RATES,
442 .formats = RT5512_FORMATS,
444 .ops = &rt5512_dai_ops,
445 .symmetric_rates = 1,
450 static const DECLARE_TLV_DB_SCALE(mic_pga_tlv, -1650, 150, 0);
451 static const DECLARE_TLV_DB_SCALE(mic_lrpga_tlv, 0, 600, 0);
452 static const DECLARE_TLV_DB_SCALE(aux_pga_tlv, -500, 100, 0); // range from -5dB to 26dB
453 static const DECLARE_TLV_DB_SCALE(aux_lrpga_tlv, -300, 300, 0);
454 static const DECLARE_TLV_DB_SCALE(lrpga2lrspk_tlv, -600, 300, 0);
455 static const DECLARE_TLV_DB_SCALE(lrpga2lrhp_tlv, -6000, 300, 0);
456 static const DECLARE_TLV_DB_SCALE(lrspkpga_tlv, -4300, 100, 0);
457 static const DECLARE_TLV_DB_SCALE(lrhppga_tlv, -3100, 100, 0);
458 static const DECLARE_TLV_DB_SCALE(recvoutdrv_tlv, -600, 600, 0);
459 static const DECLARE_TLV_DB_SCALE(spkoutdrv_tlv, 600, 300, 0);
460 static const DECLARE_TLV_DB_SCALE(hpoutdrv_tlv, -1200, 100, 0);
461 static const DECLARE_TLV_DB_SCALE(digital_tlv, -10375, 25, 0);
462 static const char *mic_mode_sel[] = {"Single Ended", "Differential"};
463 static const char *mic_inv_mode_sel[] = {"Non-inverting mode", "Inverting mode"};
464 static const char *analog_bypass_sel[] = {"Aux", "Mic1", "Mic2", "Mic3"};
465 static const char *digital_output_percent[] = {"zero", "quarter", "half", "one"};
466 static const char *out_path[] = { "Off", "Recv", "LR_SPK", "LR_HP"};
467 static const char *in_path[] = {"Off", "Mic1", "Mic2", "Mic3", "Aux"};
468 static const char *hpf_freqcut_option[] = {"4Hz", "379Hz", "770Hz", "1594Hz"};
469 static const struct soc_enum rt5512_enum[] =
471 SOC_ENUM_SINGLE(0x92, 7, 2, mic_mode_sel),
472 SOC_ENUM_SINGLE(0x92, 6, 2, mic_inv_mode_sel),
473 SOC_ENUM_SINGLE(0x98, 0, 4, analog_bypass_sel),
474 SOC_ENUM_SINGLE(0x10, 6, 4, digital_output_percent),
475 SOC_ENUM_SINGLE(0x10, 4, 4, digital_output_percent), //4
476 SOC_ENUM_SINGLE(0x10, 2, 4, digital_output_percent),
477 SOC_ENUM_SINGLE(0x10, 0, 4, digital_output_percent),
478 SOC_ENUM_SINGLE(0x11, 6, 4, digital_output_percent),
479 SOC_ENUM_SINGLE(0x11, 4, 4, digital_output_percent),
480 SOC_ENUM_SINGLE(0x11, 2, 4, digital_output_percent),
481 SOC_ENUM_SINGLE(0x11, 0, 4, digital_output_percent),
482 SOC_ENUM_SINGLE(0x12, 6, 4, digital_output_percent),
483 SOC_ENUM_SINGLE(0x12, 4, 4, digital_output_percent),
484 SOC_ENUM_SINGLE(0x12, 2, 4, digital_output_percent),
485 SOC_ENUM_SINGLE(0x12, 0, 4, digital_output_percent),
486 SOC_ENUM_SINGLE(0x13, 6, 4, digital_output_percent),
487 SOC_ENUM_SINGLE(0x13, 4, 4, digital_output_percent),
488 SOC_ENUM_SINGLE(0x13, 2, 4, digital_output_percent),
489 SOC_ENUM_SINGLE(0x13, 0, 4, digital_output_percent),
490 SOC_ENUM_SINGLE(0x93, 7, 2, mic_mode_sel),
491 SOC_ENUM_SINGLE(0x93, 6, 2, mic_inv_mode_sel),
492 SOC_ENUM_SINGLE(0x94, 7, 2, mic_mode_sel),
493 SOC_ENUM_SINGLE(0x94, 6, 2, mic_inv_mode_sel),
494 SOC_ENUM_SINGLE_EXT(ARRAY_SIZE(out_path), out_path),
495 SOC_ENUM_SINGLE_EXT(ARRAY_SIZE(in_path), in_path),
496 SOC_ENUM_SINGLE(0x17, 0, 4, hpf_freqcut_option),
497 SOC_ENUM_SINGLE(0x17, 2, 4, hpf_freqcut_option),
498 SOC_ENUM_SINGLE(0x17, 4, 4, hpf_freqcut_option),
502 static const char *rt5512_playback_path_mode[] = {"OFF", "RCV", "SPK", "HP", "HP_NO_MIC", "BT", "SPK_HP", //0-6
503 "RING_SPK", "RING_HP", "RING_HP_NO_MIC", "RING_SPK_HP"};//7-10
505 static const SOC_ENUM_SINGLE_DECL(rt5512_path_type, 0, 0, rt5512_playback_path_mode);
507 static int rt5512_playback_path_get(struct snd_kcontrol *kcontrol,
508 struct snd_ctl_elem_value *ucontrol)
510 struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol);
511 struct rt5512_codec_chip *chip = snd_soc_codec_get_drvdata(codec);
514 RT_DBG("%s:playback_path=%ld\n",__func__,ucontrol->value.integer.value[0]);
516 ucontrol->value.integer.value[0] = chip->curr_outpath;
521 static int rt5512_playback_path_put(struct snd_kcontrol *kcontrol,
522 struct snd_ctl_elem_value *ucontrol)
525 struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol);
526 struct rt5512_codec_chip *chip = snd_soc_codec_get_drvdata(codec);
527 struct snd_soc_dapm_context *dapm = &codec->dapm;
530 if (ucontrol->value.integer.value[0] != chip->curr_outpath)
532 mutex_lock(&codec->mutex);
533 switch (ucontrol->value.integer.value[0])
536 RT_DBG(">>>>>>>>>>>>>>>>%s OFF",__FUNCTION__);
537 snd_soc_dapm_disable_pin(dapm, "Headphone Jack");
538 snd_soc_dapm_disable_pin(dapm, "Ext Spk");
539 snd_soc_dapm_sync(dapm);
540 chip->curr_outpath = ucontrol->value.integer.value[0];
548 RT_DBG(">>>>>>>>>>>>>>>>%s spk",__FUNCTION__);
549 snd_soc_dapm_enable_pin(dapm, "Ext Spk");
550 snd_soc_dapm_disable_pin(dapm, "Headphone Jack");
551 snd_soc_dapm_sync(dapm);
552 RT_DBG("Ext Spk status=%d\n", snd_soc_dapm_get_pin_status(dapm, "Ext Spk"));
553 RT_DBG("Headphone Jack status=%d\n", snd_soc_dapm_get_pin_status(dapm, "Headphone Jack"));
554 chip->curr_outpath = ucontrol->value.integer.value[0];
561 RT_DBG(">>>>>>>>>>>>>>>>%s hp",__FUNCTION__);
562 snd_soc_dapm_disable_pin(dapm, "Ext Spk");
563 snd_soc_dapm_enable_pin(dapm, "Headphone Jack");
564 snd_soc_dapm_sync(dapm);
565 chip->curr_outpath = ucontrol->value.integer.value[0];
573 RT_DBG(">>>>>>>>>>>>>>>>%s spk+hp",__FUNCTION__);
574 snd_soc_dapm_enable_pin(dapm, "Ext Spk");
575 snd_soc_dapm_enable_pin(dapm, "Headphone Jack");
576 snd_soc_dapm_sync(dapm);
577 chip->curr_outpath = ucontrol->value.integer.value[0];
581 dev_err(codec->dev, "Not valid path\n");
582 mutex_unlock(&codec->mutex);
586 mutex_unlock(&codec->mutex);
592 static const char *rt5512_capture_path_mode[] = {"MIC OFF", "Main Mic", "Hands Free Mic", "BT Sco Mic"};//
594 static const SOC_ENUM_SINGLE_DECL(rt5512_capture_type, 0, 0, rt5512_capture_path_mode);
596 static int rt5512_capture_path_get(struct snd_kcontrol *kcontrol,
597 struct snd_ctl_elem_value *ucontrol)
599 struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol);
600 struct rt5512_codec_chip *chip = snd_soc_codec_get_drvdata(codec);
603 RT_DBG("%s:capture_path=%ld\n",__func__,ucontrol->value.integer.value[0]);
605 ucontrol->value.integer.value[0] = chip->curr_outpath;
610 static int rt5512_capture_path_put(struct snd_kcontrol *kcontrol,
611 struct snd_ctl_elem_value *ucontrol)
614 struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol);
615 struct rt5512_codec_chip *chip = snd_soc_codec_get_drvdata(codec);
616 struct snd_soc_dapm_context *dapm = &codec->dapm;
619 if (ucontrol->value.integer.value[0] != chip->curr_outpath)
621 mutex_lock(&codec->mutex);
622 switch (ucontrol->value.integer.value[0])
625 RT_DBG(">>>>>>>>>>>>>>>>%s MIC_OFF",__FUNCTION__);
626 snd_soc_dapm_disable_pin(dapm, "Main Mic");
627 snd_soc_dapm_disable_pin(dapm, "LineIn");
628 snd_soc_dapm_sync(dapm);
629 chip->curr_outpath = ucontrol->value.integer.value[0];
633 RT_DBG(">>>>>>>>>>>>>>>>%s Main_Mic",__FUNCTION__);
635 snd_soc_update_bits(codec, 0x93, 0x1f, 0x15);
636 snd_soc_update_bits(codec, 0x97, 0x0c, 0x08);
637 snd_soc_dapm_enable_pin(dapm, "Main Mic");
638 snd_soc_dapm_disable_pin(dapm, "LineIn");
639 snd_soc_dapm_sync(dapm);
640 RT_DBG("Main Mic status=%d\n", snd_soc_dapm_get_pin_status(dapm, "Main Mic"));
641 RT_DBG("LineIn status=%d\n", snd_soc_dapm_get_pin_status(dapm, "LineIn"));
642 chip->curr_outpath = ucontrol->value.integer.value[0];
646 RT_DBG(">>>>>>>>>>>>>>>>%s Hands_Free_Mic",__FUNCTION__);
648 snd_soc_update_bits(codec, 0x91, 0x1f, 0x15);
649 snd_soc_update_bits(codec, 0x96, 0xc0, 0x80);
650 snd_soc_dapm_disable_pin(dapm, "Main Mic");
651 snd_soc_dapm_enable_pin(dapm, "LineIn");
652 snd_soc_dapm_sync(dapm);
653 chip->curr_outpath = ucontrol->value.integer.value[0];
660 dev_err(codec->dev, "Not valid path\n");
661 mutex_unlock(&codec->mutex);
665 mutex_unlock(&codec->mutex);
672 static int rt5512_inpath_get(struct snd_kcontrol *kcontrol,
673 struct snd_ctl_elem_value *ucontrol)
675 struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol);
676 struct rt5512_codec_chip *chip = snd_soc_codec_get_drvdata(codec);
679 ucontrol->value.integer.value[0] = chip->curr_inpath;
683 static int rt5512_inpath_set(struct snd_kcontrol *kcontrol,
684 struct snd_ctl_elem_value *ucontrol)
687 struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol);
688 struct rt5512_codec_chip *chip = snd_soc_codec_get_drvdata(codec);
689 struct snd_soc_dapm_context *dapm = &codec->dapm;
692 if (ucontrol->value.integer.value[0] != chip->curr_inpath)
694 switch (ucontrol->value.integer.value[0])
697 snd_soc_dapm_disable_pin(dapm, "Mic1");
698 snd_soc_dapm_disable_pin(dapm, "Mic2");
699 snd_soc_dapm_disable_pin(dapm, "Mic3");
700 snd_soc_dapm_disable_pin(dapm, "Aux");
701 chip->curr_inpath = ucontrol->value.integer.value[0];
704 snd_soc_dapm_enable_pin(dapm, "Mic1");
705 snd_soc_dapm_disable_pin(dapm, "Mic2");
706 snd_soc_dapm_disable_pin(dapm, "Mic3");
707 snd_soc_dapm_disable_pin(dapm, "Aux");
708 chip->curr_inpath = ucontrol->value.integer.value[0];
711 snd_soc_dapm_disable_pin(dapm, "Mic1");
712 snd_soc_dapm_enable_pin(dapm, "Mic2");
713 snd_soc_dapm_disable_pin(dapm, "Mic3");
714 snd_soc_dapm_enable_pin(dapm, "Aux");
715 chip->curr_inpath = ucontrol->value.integer.value[0];
718 snd_soc_dapm_disable_pin(dapm, "Mic1");
719 snd_soc_dapm_disable_pin(dapm, "Mic2");
720 snd_soc_dapm_enable_pin(dapm, "Mic3");
721 snd_soc_dapm_disable_pin(dapm, "Aux");
722 chip->curr_inpath = ucontrol->value.integer.value[0];
725 snd_soc_dapm_disable_pin(dapm, "Mic1");
726 snd_soc_dapm_disable_pin(dapm, "Mic2");
727 snd_soc_dapm_disable_pin(dapm, "Mic3");
728 snd_soc_dapm_enable_pin(dapm, "Aux");
729 chip->curr_inpath = ucontrol->value.integer.value[0];
732 dev_err(codec->dev, "Not valid path\n");
741 static int rt5512_outpath_get(struct snd_kcontrol *kcontrol,
742 struct snd_ctl_elem_value *ucontrol)
744 struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol);
745 struct rt5512_codec_chip *chip = snd_soc_codec_get_drvdata(codec);
748 ucontrol->value.integer.value[0] = chip->curr_outpath;
752 static int rt5512_outpath_set(struct snd_kcontrol *kcontrol,
753 struct snd_ctl_elem_value *ucontrol)
756 struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol);
757 struct rt5512_codec_chip *chip = snd_soc_codec_get_drvdata(codec);
758 struct snd_soc_dapm_context *dapm = &codec->dapm;
761 if (ucontrol->value.integer.value[0] != chip->curr_outpath)
763 switch (ucontrol->value.integer.value[0])
766 snd_soc_dapm_disable_pin(dapm, "Receiver");
767 snd_soc_dapm_disable_pin(dapm, "LSpeaker");
768 snd_soc_dapm_disable_pin(dapm, "RSpeaker");
769 snd_soc_dapm_disable_pin(dapm, "LHeadphone");
770 snd_soc_dapm_disable_pin(dapm, "RHeadphone");
771 chip->curr_outpath = ucontrol->value.integer.value[0];
774 snd_soc_dapm_enable_pin(dapm, "Receiver");
775 snd_soc_dapm_disable_pin(dapm, "LSpeaker");
776 snd_soc_dapm_disable_pin(dapm, "RSpeaker");
777 snd_soc_dapm_disable_pin(dapm, "LHeadphone");
778 snd_soc_dapm_disable_pin(dapm, "RHeadphone");
779 chip->curr_outpath = ucontrol->value.integer.value[0];
782 snd_soc_dapm_disable_pin(dapm, "Receiver");
783 snd_soc_dapm_enable_pin(dapm, "LSpeaker");
784 snd_soc_dapm_enable_pin(dapm, "RSpeaker");
785 snd_soc_dapm_disable_pin(dapm, "LHeadphone");
786 snd_soc_dapm_disable_pin(dapm, "RHeadphone");
787 chip->curr_outpath = ucontrol->value.integer.value[0];
790 snd_soc_dapm_disable_pin(dapm, "Receiver");
791 snd_soc_dapm_disable_pin(dapm, "LSpeaker");
792 snd_soc_dapm_disable_pin(dapm, "RSpeaker");
793 snd_soc_dapm_enable_pin(dapm, "LHeadphone");
794 snd_soc_dapm_enable_pin(dapm, "RHeadphone");
795 chip->curr_outpath = ucontrol->value.integer.value[0];
798 dev_err(codec->dev, "Not valid path\n");
809 static const struct snd_kcontrol_new rt5512_snd_controls[] =
812 SOC_ENUM("Mic1 ModeSel", rt5512_enum[0]),
813 SOC_ENUM("Mic1 InvModeSel", rt5512_enum[1]),
814 SOC_ENUM("Mic2 ModeSel", rt5512_enum[19]),
815 SOC_ENUM("Mic2 InvModeSel", rt5512_enum[20]),
816 SOC_ENUM("Mic3 ModeSel", rt5512_enum[21]),
817 SOC_ENUM("Mic3 InvModeSel", rt5512_enum[22]),
818 SOC_SINGLE_TLV("Aux PGA Volume", 0x91, 0, 31, 0, aux_pga_tlv),
819 SOC_SINGLE_TLV("Mic1 PGA Volume", 0x92, 0, 31, 0, mic_pga_tlv),
820 SOC_SINGLE_TLV("Mic2 PGA Volume", 0x93, 0, 31, 0, mic_pga_tlv),
821 SOC_SINGLE_TLV("Mic3 PGA Volume", 0x94, 0, 31, 0, mic_pga_tlv),
822 SOC_SINGLE_TLV("AuxL LPGA Volume", 0x96, 6, 3, 0, aux_lrpga_tlv),
823 SOC_SINGLE_TLV("AuxR RPGA Volume", 0x97, 6, 3, 0, aux_lrpga_tlv),
824 SOC_SINGLE_TLV("Mic1 LPGA Volume", 0x96, 4, 3, 0, mic_lrpga_tlv),
825 SOC_SINGLE_TLV("Mic1 RPGA Volume", 0x97, 4, 3, 0, mic_lrpga_tlv),
826 SOC_SINGLE_TLV("Mic2 LPGA Volume", 0x96, 2, 3, 0, mic_lrpga_tlv),
827 SOC_SINGLE_TLV("Mic2 RPGA Volume", 0x97, 2, 3, 0, mic_lrpga_tlv),
828 SOC_SINGLE_TLV("Mic3 LPGA Volume", 0x96, 0, 3, 0, mic_lrpga_tlv),
829 SOC_SINGLE_TLV("Mic3 RPGA Volume", 0x97, 0, 3, 0, mic_lrpga_tlv),
830 SOC_SINGLE_TLV("LPGA2LSPK PGA Volume", 0x8d, 6, 3, 0, lrpga2lrspk_tlv),
831 SOC_SINGLE_TLV("RPGA2LSPK PGA Volume", 0x8d, 4, 3, 0, lrpga2lrspk_tlv),
832 SOC_SINGLE_TLV("LPGA2RSPK PGA Volume", 0x8d, 2, 3, 0, lrpga2lrspk_tlv),
833 SOC_SINGLE_TLV("RPGA2RSPK PGA Volume", 0x8d, 0, 3, 0, lrpga2lrspk_tlv),
834 SOC_SINGLE_TLV("LPGA2LHP PGA Volume", 0x87, 6, 3, 0, lrpga2lrhp_tlv),
835 SOC_SINGLE_TLV("RPGA2LHP PGA Volume", 0x87, 4, 3, 0, lrpga2lrhp_tlv),
836 SOC_SINGLE_TLV("LPGA2RHP PGA Volume", 0x87, 2, 3, 0, lrpga2lrhp_tlv),
837 SOC_SINGLE_TLV("RPGA2RHP PGA Volume", 0x87, 0, 3, 0, lrpga2lrhp_tlv),
838 SOC_SINGLE_TLV("LSPKPreMixer PGA Volume", 0x8e, 0, 46, 0, lrspkpga_tlv),
839 SOC_SINGLE_TLV("RSPKPreMixer PGA Volume", 0x8f, 0, 46, 0, lrspkpga_tlv),
840 SOC_SINGLE_TLV("LHPPreMixer PGA Volume", 0x88, 0, 31, 0, lrhppga_tlv),
841 SOC_SINGLE_TLV("RHPPreMixer PGA Volume", 0x89, 0, 31, 0, lrhppga_tlv),
842 SOC_SINGLE_TLV("RECVDrv Volume", 0x84, 3, 1, 0, recvoutdrv_tlv),
843 SOC_SINGLE_TLV("LSPKDrv Volume", 0x90, 4, 3, 0, spkoutdrv_tlv),
844 SOC_SINGLE_TLV("RSPKDrv Volume", 0x90, 0, 3, 0, spkoutdrv_tlv),
845 SOC_SINGLE_TLV("LHPDrv Volume", 0x8a, 0, 15, 0, hpoutdrv_tlv),
846 SOC_SINGLE_TLV("RHPDrv Volume", 0x8b, 0, 15, 0, hpoutdrv_tlv),
847 SOC_DOUBLE_TLV("AUD_ADC1 PGA Volume", 0x0c, 17, 1, 511, 1, digital_tlv),
848 SOC_DOUBLE_TLV("AUD_ADC2 PGA Volume", 0x0d, 17, 1, 511, 1, digital_tlv),
849 SOC_DOUBLE_TLV("AUD_DAC1 PGA Volume", 0x0a, 17, 1, 511, 1, digital_tlv),
850 SOC_DOUBLE_TLV("AUD_DAC2 PGA Volume", 0x0b, 17, 1, 511, 1, digital_tlv),
851 SOC_DOUBLE_TLV("Sidetone PGA Volume", 0x0e, 17, 1, 511, 1, digital_tlv),
852 SOC_ENUM("AIF2L2DACL sel", rt5512_enum[3]),
853 SOC_ENUM("AIF1L2DACL sel", rt5512_enum[4]),
854 SOC_ENUM("ADCL2DACL sel", rt5512_enum[5]),
855 SOC_ENUM("ADCR2DACL sel", rt5512_enum[6]),
856 SOC_ENUM("AIF2R2DACR sel", rt5512_enum[7]),
857 SOC_ENUM("AIF1R2DACR sel", rt5512_enum[8]),
858 SOC_ENUM("ADCL2DACR sel", rt5512_enum[9]),
859 SOC_ENUM("ADCR2DACR sel", rt5512_enum[10]),
860 SOC_ENUM("AIF2L2TX2L sel", rt5512_enum[11]),
861 SOC_ENUM("AIF1L2TX2L sel", rt5512_enum[12]),
862 SOC_ENUM("ADCL2TX2L sel", rt5512_enum[13]),
863 SOC_ENUM("ADCR2TX2L sel", rt5512_enum[14]),
864 SOC_ENUM("AIF2R2TX2R sel", rt5512_enum[15]),
865 SOC_ENUM("AIF1R2TX2R sel", rt5512_enum[16]),
866 SOC_ENUM("ADCL2TX2R sel", rt5512_enum[17]),
867 SOC_ENUM("ADCR2TX2R sel", rt5512_enum[18]),
868 SOC_SINGLE("ADC_HPF1 Switch", 0x16, 1, 1, 0),
869 SOC_ENUM("ADC_HPF1 FC", rt5512_enum[25]),
870 SOC_SINGLE("ADC_HPF2 Switch", 0x16, 2, 1, 0),
871 SOC_ENUM("ADC_HPF2 FC", rt5512_enum[26]),
872 SOC_SINGLE("ADC_HPF3 Switch", 0x16, 3, 1, 0),
873 SOC_ENUM("ADC_HPF3 FC", rt5512_enum[27]),
874 SOC_SINGLE("ADC_DRC1 Switch", 0x16, 4, 1, 0),
875 SOC_SINGLE("ADC_DRC2 Switch", 0x16, 5, 1, 0),
876 SOC_SINGLE("ADC_DRC NG Switch", 0x31, 0, 1, 0),
877 SOC_SINGLE("DAC_3D1 Switch", 0x14, 0, 1, 0),
878 SOC_SINGLE("DAC_3D2 Switch", 0x14, 1, 1, 0),
879 SOC_SINGLE("DAC_DRC1 Switch", 0x15, 2, 1, 0),
880 SOC_SINGLE("DAC_DRC2 Switch", 0x15, 3, 1, 0),
881 SOC_SINGLE("DAC_DRC3 Switch", 0x15, 4, 1, 0),
882 SOC_SINGLE("DAC_DRC4 Switch", 0x15, 5, 1, 0),
883 SOC_SINGLE("DAC_DRC NG Switch", 0x31, 1, 1, 0),
884 SOC_SINGLE("DAC_BASS1 Switch", 0x14, 2, 1, 0),
885 SOC_SINGLE("DAC_BASS2 Switch", 0x14, 3, 1, 0),
886 SOC_SINGLE("DAC_EQ1 Switch", 0x15, 0, 1, 0),
887 SOC_SINGLE("DAC_EQ2 Switch", 0x15, 1, 1, 0),
889 SOC_ENUM_EXT("Playback Path", rt5512_path_type,
890 rt5512_playback_path_get, rt5512_playback_path_put),
891 SOC_ENUM_EXT("Capture MIC Path", rt5512_capture_type,
892 rt5512_capture_path_get, rt5512_capture_path_put),
894 SOC_ENUM_EXT("Out Sel", rt5512_enum[23], rt5512_outpath_get, rt5512_outpath_set),
895 SOC_ENUM_EXT("In Sel", rt5512_enum[24], rt5512_inpath_get, rt5512_inpath_set),
899 static const struct snd_kcontrol_new linput_mixer_controls[] =
901 SOC_DAPM_SINGLE("AuxL Switch", 0x95, 7, 1, 0),
902 SOC_DAPM_SINGLE("Mic1 Switch", 0x95, 6, 1, 0),
903 SOC_DAPM_SINGLE("Mic2 Switch", 0x95, 5, 1, 0),
904 SOC_DAPM_SINGLE("Mic3 Switch", 0x95, 4, 1, 0),
907 static const struct snd_kcontrol_new rinput_mixer_controls[] =
909 SOC_DAPM_SINGLE("AuxR Switch", 0x95, 3, 1, 0),
910 SOC_DAPM_SINGLE("Mic1 Switch", 0x95, 2, 1, 0),
911 SOC_DAPM_SINGLE("Mic2 Switch", 0x95, 1, 1, 0),
912 SOC_DAPM_SINGLE("Mic3 Switch", 0x95, 0, 1, 0),
915 static const struct snd_kcontrol_new analog_bypass_controls =
916 SOC_DAPM_ENUM("Analog Bypass", rt5512_enum[2]);
918 static const struct snd_kcontrol_new lspkpre_mixer_controls[] =
920 SOC_DAPM_SINGLE("LPGA Switch", 0x8c, 7, 1, 0),
921 SOC_DAPM_SINGLE("LSPKDAC Switch", 0x84, 1, 1, 0),
922 SOC_DAPM_SINGLE("RPGA Switch", 0x8c, 6, 1, 0),
925 static const struct snd_kcontrol_new rspkpre_mixer_controls[] =
927 SOC_DAPM_SINGLE("LPGA Switch", 0x8c, 5, 1, 0),
928 SOC_DAPM_SINGLE("RSPKDAC Switch", 0x84, 0, 1, 0),
929 SOC_DAPM_SINGLE("RPGA Switch", 0x8c, 4, 1, 0),
932 static const struct snd_kcontrol_new recvout_mixer_controls[] =
934 SOC_DAPM_SINGLE("LSPKPGA Switch", 0x84, 6, 1, 0),
935 SOC_DAPM_SINGLE("RSPKPGA Switch", 0x84, 5, 1, 0),
936 SOC_DAPM_SINGLE("BYPASS Switch", 0x84, 4, 1, 0),
939 static const struct snd_kcontrol_new lspkpost_mixer_controls[] =
941 SOC_DAPM_SINGLE("RSPKPGA Switch", 0x8c, 2, 1, 0),
942 SOC_DAPM_SINGLE("LSPKPGA Switch", 0x8c, 3, 1, 0),
943 SOC_DAPM_SINGLE("BYPASS Switch", 0x90, 7, 1, 0),
946 static const struct snd_kcontrol_new rspkpost_mixer_controls[] =
948 SOC_DAPM_SINGLE("LSPKPGA Switch", 0x8c, 1, 1, 0),
949 SOC_DAPM_SINGLE("RSPKPGA Switch", 0x8c, 0, 1, 0),
950 SOC_DAPM_SINGLE("BYPASS Switch", 0x90, 3, 1, 0),
953 static const struct snd_kcontrol_new lhppre_mixer_controls[] =
955 SOC_DAPM_SINGLE("LPGA Switch", 0x86, 7, 1, 0),
956 SOC_DAPM_SINGLE("RPGA Switch", 0x86, 6, 1, 0),
959 static const struct snd_kcontrol_new rhppre_mixer_controls[] =
961 SOC_DAPM_SINGLE("LPGA Switch", 0x86, 5, 1, 0),
962 SOC_DAPM_SINGLE("RPGA Switch", 0x86, 4, 1, 0),
965 static const struct snd_kcontrol_new lhppost_mixer_controls[] =
967 SOC_DAPM_SINGLE("LHPDAC Switch", RT5512_VIRTUAL_REG, 6, 1, 0),
968 SOC_DAPM_SINGLE("BYPASS Switch", 0x86, 1, 1, 0),
969 SOC_DAPM_SINGLE("LRPGAMixer Switch", RT5512_VIRTUAL_REG, 7, 1, 0),
972 static const struct snd_kcontrol_new rhppost_mixer_controls[] =
974 SOC_DAPM_SINGLE("LRPGAMixer Switch", RT5512_VIRTUAL_REG, 8, 1, 0),
975 SOC_DAPM_SINGLE("BYPASS Switch", 0x86, 0, 1, 0),
976 SOC_DAPM_SINGLE("RHPDAC Switch", RT5512_VIRTUAL_REG, 9, 1, 0),
979 static int rt5512_power_event(struct snd_soc_dapm_widget *w, struct snd_kcontrol *kcontrol, int event)
984 case SND_SOC_DAPM_PRE_PMU:
985 snd_soc_update_bits(w->codec, 0x81, 0x7, 0x7);
987 snd_soc_update_bits(w->codec, 0x81, 0x4, 0x0);
990 case SND_SOC_DAPM_POST_PMD:
991 snd_soc_update_bits(w->codec, 0x81, 0x7, 0x4);
997 static int rt5512_lhpdrv_pevent(struct snd_soc_dapm_widget *w, struct snd_kcontrol *kcontrol, int event)
1002 case SND_SOC_DAPM_PRE_PMU:
1003 snd_soc_update_bits(w->codec, 0x83, 0x80, 0x80);
1006 case SND_SOC_DAPM_PRE_PMD:
1007 snd_soc_update_bits(w->codec, 0x8A, 0x0F, 0x00);
1010 case SND_SOC_DAPM_POST_PMD:
1012 snd_soc_update_bits(w->codec, 0x83, 0x80, 0x0);
1014 snd_soc_update_bits(w->codec, 0x8A, 0x0F, 0x0B);
1020 static int rt5512_rhpdrv_pevent(struct snd_soc_dapm_widget *w, struct snd_kcontrol *kcontrol, int event)
1025 case SND_SOC_DAPM_PRE_PMU:
1026 snd_soc_update_bits(w->codec, 0x83, 0x80, 0x80);
1029 case SND_SOC_DAPM_PRE_PMD:
1030 snd_soc_update_bits(w->codec, 0x8B, 0x0F, 0x00);
1033 case SND_SOC_DAPM_POST_PMD:
1035 snd_soc_update_bits(w->codec, 0x83, 0x80, 0x0);
1037 snd_soc_update_bits(w->codec, 0x8B, 0x0F, 0x0B);
1043 static int rt5512_spkdac_pevent(struct snd_soc_dapm_widget *w, struct snd_kcontrol *kcontrol, int event)
1048 case SND_SOC_DAPM_POST_PMU:
1055 static int rt5512_spkdrv_pevent(struct snd_soc_dapm_widget *w, struct snd_kcontrol *kcontrol, int event)
1060 case SND_SOC_DAPM_PRE_PMU:
1063 case SND_SOC_DAPM_POST_PMD:
1070 static int rt5512_recvdrv_pevent(struct snd_soc_dapm_widget *w, struct snd_kcontrol *kcontrol, int event)
1075 case SND_SOC_DAPM_PRE_PMU:
1076 snd_soc_update_bits(w->codec, 0x83, 0x80, 0x80);
1079 case SND_SOC_DAPM_POST_PMD:
1081 snd_soc_update_bits(w->codec, 0x83, 0x80, 0x0);
1088 static const struct snd_soc_dapm_widget rt5512_dapm_widgets[] =
1090 SND_SOC_DAPM_PRE("Pre Power", rt5512_power_event),
1091 SND_SOC_DAPM_POST("Post Power",rt5512_power_event),
1094 SND_SOC_DAPM_INPUT("Mic1"),
1095 SND_SOC_DAPM_INPUT("Mic2"),
1096 SND_SOC_DAPM_INPUT("Mic3"),
1097 SND_SOC_DAPM_INPUT("Aux"),
1099 SND_SOC_DAPM_MUX("Analog Bypass Mux", RT5512_VIRTUAL_REG, 0, 0, &analog_bypass_controls),
1101 SND_SOC_DAPM_PGA("Aux PGA", 0x85, 3, 0, NULL, 0),
1102 SND_SOC_DAPM_PGA("Mic1 PGA", 0x85, 2, 0, NULL, 0),
1103 SND_SOC_DAPM_PGA("Mic2 PGA", 0x85, 1, 0, NULL, 0),
1104 SND_SOC_DAPM_PGA("Mic3 PGA", 0x85, 0, 0, NULL, 0),
1106 SND_SOC_DAPM_MIXER("LInput Mixer", 0x85, 5, 0, linput_mixer_controls, ARRAY_SIZE(linput_mixer_controls)),
1107 SND_SOC_DAPM_MIXER("RInput Mixer", 0x85, 4, 0, rinput_mixer_controls, ARRAY_SIZE(rinput_mixer_controls)),
1109 SND_SOC_DAPM_ADC("LADC", NULL, 0x85, 7, 0),
1110 SND_SOC_DAPM_ADC("RADC", NULL, 0x85, 6, 0),
1111 // Digital Input Interface
1112 SND_SOC_DAPM_AIF_OUT("AIF1ADC", NULL, 0, 0x06, 0, 0),
1113 //SND_SOC_DAPM_AIF_OUT("AIF1ADCR", NULL, 0, 0x06, 0, 0),
1114 SND_SOC_DAPM_AIF_OUT("AIF1ADCDAT", "AIF1 Capture", 0, 0x05, 2, 1),
1115 SND_SOC_DAPM_AIF_OUT("AIF2ADC", NULL, 0, 0x06, 1, 0),
1116 //SND_SOC_DAPM_AIF_OUT("AIF2ADCR", NULL, 0, 0x06, 1, 0),
1117 SND_SOC_DAPM_AIF_OUT("AIF2ADCDAT", "AIF2 Capture", 0, 0x05, 3, 1),
1119 //Digital DSP Routing
1121 SND_SOC_DAPM_MIXER("DACL Mixer", 0x07, 7, 1, NULL, 0),
1122 SND_SOC_DAPM_MIXER("DACR Mixer", 0x07, 6, 1, NULL, 0),
1123 SND_SOC_DAPM_MIXER("TX2L Mixer", 0x07, 5, 1, NULL, 0),
1124 SND_SOC_DAPM_MIXER("TX2R Mixer", 0x07, 4, 1, NULL, 0),
1127 SND_SOC_DAPM_AIF_IN("AIF1DAC", NULL, 0, 0x06, 2, 0),
1128 //SND_SOC_DAPM_AIF_IN("AIF1DACR", NULL, 0, 0x06, 2, 0),
1129 SND_SOC_DAPM_AIF_IN("AIF1DACDAT", "AIF1 Playback", 0, 0x05, 0, 1),
1130 SND_SOC_DAPM_AIF_IN("AIF2DAC", NULL, 0, 0x06, 3, 0),
1131 //SND_SOC_DAPM_AIF_IN("AIF2DACR", NULL, 0, 0x06, 3, 0),
1132 SND_SOC_DAPM_AIF_IN("AIF2DACDAT", "AIF2 Playback", 0, 0x05, 1, 1),
1134 SND_SOC_DAPM_DAC_E("LSPKDAC", NULL, 0x82, 1, 0, rt5512_spkdac_pevent,
1135 SND_SOC_DAPM_POST_PMU),
1136 SND_SOC_DAPM_DAC("RSPKDAC", NULL, 0x82, 0, 0),
1137 SND_SOC_DAPM_DAC("LHPDAC", NULL, 0x82, 3, 0),
1138 SND_SOC_DAPM_DAC("RHPDAC", NULL, 0x82, 2, 0),
1140 SND_SOC_DAPM_MIXER("LSPK Pre Mixer", 0x82, 5, 0, lspkpre_mixer_controls, ARRAY_SIZE(lspkpre_mixer_controls)),
1141 SND_SOC_DAPM_MIXER("RSPK Pre Mixer", 0x82, 4, 0, rspkpre_mixer_controls, ARRAY_SIZE(rspkpre_mixer_controls)),
1142 SND_SOC_DAPM_MIXER("RECV Mixer", RT5512_VIRTUAL_REG, 1, 0, recvout_mixer_controls, ARRAY_SIZE(recvout_mixer_controls)),
1143 SND_SOC_DAPM_MIXER("LSPK Post Mixer", RT5512_VIRTUAL_REG, 2, 0, lspkpost_mixer_controls, ARRAY_SIZE(lspkpost_mixer_controls)),
1144 SND_SOC_DAPM_MIXER("RSPK Post Mixer", RT5512_VIRTUAL_REG, 3, 0, rspkpost_mixer_controls, ARRAY_SIZE(rspkpost_mixer_controls)),
1145 SND_SOC_DAPM_MIXER("LHP Pre Mixer", 0x82, 7, 0, lhppre_mixer_controls, ARRAY_SIZE(lhppre_mixer_controls)),
1146 SND_SOC_DAPM_MIXER("RHP Pre Mixer", 0x82, 6, 0, rhppre_mixer_controls, ARRAY_SIZE(rhppre_mixer_controls)),
1147 SND_SOC_DAPM_MIXER("LHP Post Mixer", RT5512_VIRTUAL_REG, 4, 0, lhppost_mixer_controls, ARRAY_SIZE(lhppost_mixer_controls)),
1148 SND_SOC_DAPM_MIXER("RHP Post Mixer", RT5512_VIRTUAL_REG, 5, 0, rhppost_mixer_controls, ARRAY_SIZE(rhppost_mixer_controls)),
1150 SND_SOC_DAPM_OUT_DRV_E("RECV Drv", 0x84, 7, 0, NULL, 0, rt5512_recvdrv_pevent,
1151 SND_SOC_DAPM_PRE_PMU|SND_SOC_DAPM_POST_PMD),
1152 SND_SOC_DAPM_OUT_DRV_E("LSPK Drv", 0x83, 3, 0, NULL, 0, rt5512_spkdrv_pevent,
1153 SND_SOC_DAPM_PRE_PMU|SND_SOC_DAPM_POST_PMD),
1154 SND_SOC_DAPM_OUT_DRV_E("RSPK Drv", 0x83, 2, 0, NULL, 0, rt5512_spkdrv_pevent,
1155 SND_SOC_DAPM_PRE_PMU|SND_SOC_DAPM_POST_PMD),
1156 SND_SOC_DAPM_OUT_DRV_E("LHP Drv", 0x83, 1, 0, NULL, 0, rt5512_lhpdrv_pevent,
1157 SND_SOC_DAPM_PRE_PMU|SND_SOC_DAPM_PRE_PMD|SND_SOC_DAPM_POST_PMD),
1158 SND_SOC_DAPM_OUT_DRV_E("RHP Drv", 0x83, 0, 0, NULL, 0, rt5512_rhpdrv_pevent,
1159 SND_SOC_DAPM_PRE_PMU|SND_SOC_DAPM_PRE_PMD||SND_SOC_DAPM_POST_PMU),
1161 SND_SOC_DAPM_OUTPUT("Receiver"),
1162 SND_SOC_DAPM_OUTPUT("LSpeaker"),
1163 SND_SOC_DAPM_OUTPUT("RSpeaker"),
1164 SND_SOC_DAPM_OUTPUT("LHeadphone"),
1165 SND_SOC_DAPM_OUTPUT("RHeadphone"),
1167 SND_SOC_DAPM_MICBIAS("MicBias1", 0x81, 5, 0),
1168 SND_SOC_DAPM_MICBIAS("MicBias2", 0x81, 5, 0),
1171 static const struct snd_soc_dapm_route rt5512_dapm_routes[] =
1174 {"Mic1 PGA", NULL, "Mic1"},
1175 {"Mic2 PGA", NULL, "Mic2"},
1176 {"Mic3 PGA", NULL, "Mic3"},
1177 {"Aux PGA", NULL, "Aux"},
1178 {"Analog Bypass Mux", "Mic1", "Mic1"},
1179 {"Analog Bypass Mux", "Mic2", "Mic2"},
1180 {"Analog Bypass Mux", "Mic3", "Mic3"},
1181 {"Analog Bypass Mux", "Aux", "Aux"},
1182 {"LInput Mixer", "Mic1 Switch", "Mic1 PGA"},
1183 {"LInput Mixer", "Mic2 Switch", "Mic2 PGA"},
1184 {"LInput Mixer", "Mic3 Switch", "Mic3 PGA"},
1185 {"LInput Mixer", "AuxL Switch", "Aux PGA"},
1186 {"RInput Mixer", "Mic1 Switch", "Mic1 PGA"},
1187 {"RInput Mixer", "Mic2 Switch", "Mic2 PGA"},
1188 {"RInput Mixer", "Mic3 Switch", "Mic3 PGA"},
1189 {"RInput Mixer", "AuxR Switch", "Aux PGA"},
1190 {"LADC", NULL, "LInput Mixer"},
1191 {"RADC", NULL, "RInput Mixer"},
1192 {"AIF1ADC", NULL, "LADC"},
1193 {"AIF1ADC", NULL, "RADC"},
1194 {"AIF1ADCDAT", NULL, "AIF1ADC"},
1195 //{"AIF1ADCDAT", NULL, "AIF1ADCR"},
1196 {"AIF2ADC", NULL, "TX2L Mixer"},
1197 {"AIF2ADC", NULL, "TX2R Mixer"},
1198 {"AIF2ADCDAT", NULL, "AIF2ADC"},
1199 //{"AIF2ADCDAT", NULL, "AIF2ADCR"},
1201 {"AIF1DAC", NULL, "AIF1DACDAT"},
1202 //{"AIF1DACR", NULL, "AIF1DACDAT"},
1203 {"AIF2DAC", NULL, "AIF2DACDAT"},
1204 //{"AIF2DACR", NULL, "AIF2DACDAT"},
1205 {"DACL Mixer", NULL, "AIF1DAC"},
1206 {"DACL Mixer", NULL, "AIF2DAC"},
1207 {"DACL Mixer", NULL, "LADC"},
1208 {"DACL Mixer", NULL, "RADC"},
1209 {"DACR Mixer", NULL, "AIF1DAC"},
1210 {"DACR Mixer", NULL, "AIF2DAC"},
1211 {"DACR Mixer", NULL, "LADC"},
1212 {"DACR Mixer", NULL, "RADC"},
1213 {"TX2L Mixer", NULL, "AIF1DAC"},
1214 {"TX2L Mixer", NULL, "AIF2DAC"},
1215 {"TX2L Mixer", NULL, "LADC"},
1216 {"TX2L Mixer", NULL, "RADC"},
1217 {"TX2R Mixer", NULL, "AIF1DAC"},
1218 {"TX2R Mixer", NULL, "AIF2DAC"},
1219 {"TX2R Mixer", NULL, "LADC"},
1220 {"TX2R Mixer", NULL, "RADC"},
1221 {"LSPKDAC", NULL, "DACL Mixer"},
1222 {"RSPKDAC", NULL, "DACR Mixer"},
1223 {"LHPDAC", NULL, "DACL Mixer"},
1224 {"RHPDAC", NULL, "DACR Mixer"},
1225 {"LSPK Pre Mixer", "LPGA Switch", "LInput Mixer"},
1226 {"LSPK Pre Mixer", "LSPKDAC Switch", "LSPKDAC"},
1227 {"LSPK Pre Mixer", "RPGA Switch", "RInput Mixer"},
1228 {"RSPK Pre Mixer", "LPGA Switch", "LInput Mixer"},
1229 {"RSPK Pre Mixer", "RSPKDAC Switch", "RSPKDAC"},
1230 {"RSPK Pre Mixer", "RPGA Switch", "RInput Mixer"},
1231 {"LHP Pre Mixer", "LPGA Switch", "LInput Mixer"},
1232 {"LHP Pre Mixer", "RPGA Switch", "RInput Mixer"},
1233 {"RHP Pre Mixer", "LPGA Switch", "LInput Mixer"},
1234 {"RHP Pre Mixer", "RPGA Switch", "RInput Mixer"},
1235 {"RECV Mixer", "LSPKPGA Switch", "LSPK Pre Mixer"},
1236 {"RECV Mixer", "RSPKPGA Switch", "RSPK Pre Mixer"},
1237 {"RECV Mixer", "BYPASS Switch", "Analog Bypass Mux"},
1238 {"LSPK Post Mixer", "RSPKPGA Switch", "RSPK Pre Mixer"},
1239 {"LSPK Post Mixer", "LSPKPGA Switch", "LSPK Pre Mixer"},
1240 {"LSPK Post Mixer", "BYPASS Switch", "Analog Bypass Mux"},
1241 {"RSPK Post Mixer", "LSPKPGA Switch", "LSPK Pre Mixer"},
1242 {"RSPK Post Mixer", "RSPKPGA Switch", "RSPK Pre Mixer"},
1243 {"RSPK Post Mixer", "BYPASS Switch", "Analog Bypass Mux"},
1244 {"LHP Post Mixer", "LHPDAC Switch", "LHPDAC"},
1245 {"LHP Post Mixer", "BYPASS Switch", "Analog Bypass Mux"},
1246 {"LHP Post Mixer", "LRPGAMixer Switch", "LHP Pre Mixer"},
1247 {"RHP Post Mixer", "LRPGAMixer Switch", "RHP Pre Mixer"},
1248 {"RHP Post Mixer", "BYPASS Switch", "Analog Bypass Mux"},
1249 {"RHP Post Mixer", "RHPDAC Switch", "RHPDAC"},
1250 {"RECV Drv", NULL, "RECV Mixer"},
1251 {"LSPK Drv", NULL, "LSPK Post Mixer"},
1252 {"RSPK Drv", NULL, "RSPK Post Mixer"},
1253 {"LHP Drv", NULL, "LHP Post Mixer"},
1254 {"RHP Drv", NULL, "RHP Post Mixer"},
1255 {"Receiver", NULL, "RECV Drv"},
1256 {"LSpeaker", NULL, "LSPK Drv"},
1257 {"RSpeaker", NULL, "RSPK Drv"},
1258 {"LHeadphone", NULL, "LHP Drv"},
1259 {"RHeadphone", NULL, "RHP Drv"},
1262 void odroid_audio_tvout(bool tvout)
1268 static int rt5512_id_check(struct snd_soc_codec *codec)
1271 u8 regaddr = 0x00; // always revision id register
1274 ret = i2c_master_send(codec->control_data, ®addr, 1);
1277 dev_err(codec->dev, "send reg addr fail\n");
1280 ret = i2c_master_recv(codec->control_data, ®val, 1);
1283 dev_err(codec->dev, "read regval fail\n");
1289 static unsigned int rt5512_io_read(struct snd_soc_codec *codec, unsigned int reg)
1292 char regaddr = reg&0xff; // 8bit register address
1293 char regval[4] = {0};
1294 int len = rt5512_reg_priv[reg].reg_size;
1297 RT_DBG("reg 0x%02x\n", reg);
1298 if (reg == RT5512_VIRTUAL_REG)
1300 return rt5512_reg_priv[reg].reg_cache;
1303 if (len == 8 || len == 16 || len == 20)
1305 pr_err("rt5512-codec: not supported reg data size in this read function\n");
1310 dev_err(codec->dev, "Invalid reg_addr 0x%02x\n", reg);
1314 if (rt5512_reg_priv[reg].sync_needed)
1316 ret = i2c_master_send(codec->control_data, ®addr, 1);
1319 dev_err(codec->dev, "send reg addr fail\n");
1322 ret = i2c_master_recv(codec->control_data, regval, len);
1325 dev_err(codec->dev, "read regval fail\n");
1332 ret = 0x00 | regval[0];
1335 for (i=0, ret=0x0; i<4 ; i++)
1336 ret |= (regval[i] << (24-8*i));
1339 rt5512_reg_priv[reg].reg_cache = ret;
1340 rt5512_reg_priv[reg].sync_needed = 0;
1343 ret = rt5512_reg_priv[reg].reg_cache;
1348 static int rt5512_io_write(struct snd_soc_codec *codec, unsigned int reg, unsigned int regval)
1352 int len = rt5512_reg_priv[reg].reg_size;
1355 RT_DBG("reg 0x%02x, val 0x%08x\n", reg, regval);
1356 if (reg == RT5512_VIRTUAL_REG)
1358 rt5512_reg_priv[reg].reg_cache = regval;
1362 if (len == 8 || len == 16 || len == 20)
1364 pr_err("rt5512-codec: not supported reg data size in this write function\n");
1369 dev_err(codec->dev, "Invalid reg_addr 0x%02x\n", reg);
1378 data[1] = regval&0xff;
1382 data[i] = (regval>>(32-8*i))&0xff;
1386 ret = i2c_master_send(codec->control_data, data, 1+len);
1389 dev_err(codec->dev, "write register fail\n");
1392 rt5512_reg_priv[reg].sync_needed = 1;
1396 static int rt5512_set_codec_io(struct snd_soc_codec *codec)
1398 struct rt5512_codec_chip *chip = snd_soc_codec_get_drvdata(codec);
1401 codec->read = rt5512_io_read;
1402 codec->write = rt5512_io_write;
1403 codec->control_data = chip->client;
1407 static int rt5512_digital_block_power(struct snd_soc_codec *codec, int pd)
1409 RT_DBG("powerdown = %d\n", pd);
1410 snd_soc_update_bits(codec, 0x80, RT5512_PDBIT_MASK, (pd?RT5512_PDBIT_MASK:0));
1414 static int rt5512_set_bias_level(struct snd_soc_codec *codec,
1415 enum snd_soc_bias_level level)
1417 RT_DBG("bias_level->%d\n",(int)level);
1418 if (codec->dapm.bias_level != level)
1422 case SND_SOC_BIAS_ON:
1423 case SND_SOC_BIAS_PREPARE:
1424 case SND_SOC_BIAS_STANDBY:
1425 rt5512_digital_block_power(codec, 0);
1427 case SND_SOC_BIAS_OFF:
1428 rt5512_digital_block_power(codec, 1);
1431 dev_err(codec->dev, "not supported bias level\n");
1433 //snd_soc_write(codec, reg, value);
1434 codec->dapm.bias_level = level;
1437 dev_warn(codec->dev, "the same bias level, no need to change\n");
1441 static void rt5512_codec_reset(struct snd_soc_codec *codec)
1444 snd_soc_update_bits(codec, 0x80, RT5512_RSTBIT_MASK, RT5512_RSTBIT_MASK);
1447 static void rt5512_codec_force_reload_cache(struct snd_soc_codec *codec)
1452 for (i=0; i<RT5512_MAX_REG; i++)
1454 if (rt5512_reg_priv[i].reg_size == 1 || rt5512_reg_priv[i].reg_size == 4)
1456 rt5512_reg_priv[i].sync_needed = 1;
1457 ret = snd_soc_read(codec, i);
1458 rt5512_reg_priv[i].reg_cache = ret;
1463 static int rt5512_codec_probe(struct snd_soc_codec *codec)
1466 // unsigned int val1,val2;
1467 rt5512_set_codec_io(codec);
1469 if (rt5512_id_check(codec) != 0x20)
1471 printk("read codec chip id is 0x%x\n",rt5512_id_check(codec));
1473 rt5512_codec_reset(codec);
1474 rt5512_codec_force_reload_cache(codec);
1477 rt5512_reg_init(codec);
1479 rt5512_set_bias_level(codec, SND_SOC_BIAS_STANDBY);
1483 snd_soc_add_codec_controls(codec, rt5512_snd_controls,
1484 ARRAY_SIZE(rt5512_snd_controls));
1488 static int rt5512_codec_remove(struct snd_soc_codec *codec)
1491 rt5512_set_bias_level(codec, SND_SOC_BIAS_OFF);
1496 static int rt5512_codec_suspend(struct snd_soc_codec *codec)
1499 rt5512_set_bias_level(codec, SND_SOC_BIAS_OFF);
1503 static int rt5512_codec_resume(struct snd_soc_codec *codec)
1506 rt5512_set_bias_level(codec, SND_SOC_BIAS_STANDBY);
1510 #define rt5512_codec_suspend NULL
1511 #define rt5512_codec_resume NULL
1512 #endif /* #ifdef CONFIG_PM */
1514 static struct snd_soc_codec_driver soc_codec_dev_rt5512 =
1516 .probe = rt5512_codec_probe,
1517 .remove = rt5512_codec_remove,
1518 .suspend = rt5512_codec_suspend,
1519 .resume = rt5512_codec_resume,
1520 .set_bias_level = rt5512_set_bias_level,
1521 //.reg_cache_size = ARRAY_SIZE(rt5512_reg),
1522 //.reg_word_size = sizeof(u32),
1523 //.reg_cache_default = rt5512_reg,
1524 .dapm_widgets = rt5512_dapm_widgets,
1525 .num_dapm_widgets = ARRAY_SIZE(rt5512_dapm_widgets),
1526 .dapm_routes = rt5512_dapm_routes,
1527 .num_dapm_routes = ARRAY_SIZE(rt5512_dapm_routes),
1530 #ifdef CONFIG_DEBUG_FS
1531 static struct i2c_client *this_client;
1532 static struct dentry *debugfs_rt_dent;
1533 static struct dentry *debugfs_peek;
1534 static struct dentry *debugfs_poke;
1535 static struct dentry *debugfs_headset_test;
1537 static unsigned char read_data[20];
1538 static unsigned int read_size;
1540 static int codec_debug_open(struct inode *inode, struct file *file)
1544 file->private_data = inode->i_private;
1548 static int get_parameters(char *buf, long int *param1, int num_of_par)
1555 token = strsep(&buf, " ");
1557 for (cnt = 0; cnt < num_of_par; cnt++) {
1558 if (token != NULL) {
1559 if ((token[1] == 'x') || (token[1] == 'X'))
1564 if (strict_strtoul(token, base, ¶m1[cnt]) != 0)
1567 token = strsep(&buf, " ");
1575 #define STR_4TIMES "0x%02x 0x%02x 0x%02x 0x%02x "
1577 static ssize_t codec_debug_read(struct file *filp, char __user *ubuf,
1578 size_t count, loff_t *ppos)
1587 snprintf(lbuf, sizeof(lbuf), "0x%02x\n", read_data[0]);
1590 snprintf(lbuf, sizeof(lbuf), STR_4TIMES "\n",
1591 read_data[0], read_data[1], read_data[2], read_data[3]);
1594 snprintf(lbuf, sizeof(lbuf), STR_4TIMES STR_4TIMES "\n",
1595 read_data[0], read_data[1], read_data[2], read_data[3],
1596 read_data[4], read_data[5], read_data[6], read_data[7]);
1599 snprintf(lbuf, sizeof(lbuf), STR_4TIMES STR_4TIMES STR_4TIMES STR_4TIMES "\n",
1600 read_data[0], read_data[1], read_data[2], read_data[3],
1601 read_data[4], read_data[5], read_data[6], read_data[7],
1602 read_data[8], read_data[9], read_data[10], read_data[11],
1603 read_data[12], read_data[13], read_data[14], read_data[15]);
1606 snprintf(lbuf, sizeof(lbuf), STR_4TIMES STR_4TIMES STR_4TIMES STR_4TIMES STR_4TIMES "\n",
1607 read_data[0], read_data[1], read_data[2], read_data[3],
1608 read_data[4], read_data[5], read_data[6], read_data[7],
1609 read_data[8], read_data[9], read_data[10], read_data[11],
1610 read_data[12], read_data[13], read_data[14], read_data[15],
1611 read_data[16], read_data[17], read_data[18], read_data[19]);
1616 return simple_read_from_buffer(ubuf, count, ppos, lbuf, strlen(lbuf));
1619 static int rt5512_simulate_headset(struct i2c_client *client, int id)
1621 struct rt5512_codec_chip *chip = i2c_get_clientdata(client);
1623 RT_DBG("id = %d\n", id);
1626 case 0: // simulate headset insert
1627 snd_soc_jack_report(chip->rt_jack, SND_JACK_HEADSET, SND_JACK_HEADSET);
1629 case 1: // simulate headset plug out
1630 snd_soc_jack_report(chip->rt_jack, 0, SND_JACK_HEADSET);
1632 case 2: // simulate headphone(no microphone) insert
1633 snd_soc_jack_report(chip->rt_jack, SND_JACK_HEADPHONE, SND_JACK_HEADPHONE);
1635 case 3: // simulate headphone(no microphone) plug out
1636 snd_soc_jack_report(chip->rt_jack, 0, SND_JACK_HEADPHONE);
1638 case 4: // simulate headset jack btn 0 click
1639 snd_soc_jack_report(chip->rt_jack, SND_JACK_BTN_0, SND_JACK_BTN_0);
1641 snd_soc_jack_report(chip->rt_jack, 0, SND_JACK_BTN_0);
1643 case 5: // simulate headset jack btn 1 click
1644 snd_soc_jack_report(chip->rt_jack, SND_JACK_BTN_1, SND_JACK_BTN_1);
1646 snd_soc_jack_report(chip->rt_jack, 0, SND_JACK_BTN_1);
1648 case 6: // simulate headset jack btn 2 click
1649 snd_soc_jack_report(chip->rt_jack, SND_JACK_BTN_2, SND_JACK_BTN_2);
1651 snd_soc_jack_report(chip->rt_jack, 0, SND_JACK_BTN_2);
1657 static ssize_t codec_debug_write(struct file *filp,
1658 const char __user *ubuf, size_t cnt, loff_t *ppos)
1660 char *access_str = filp->private_data;
1669 if (cnt > sizeof(lbuf) - 1)
1672 rc = copy_from_user(lbuf, ubuf, cnt);
1678 if (!strcmp(access_str, "poke")) {
1680 rc = get_parameters(lbuf, param, 21);
1681 if (rc > 0 && param[0]<=RT5512_MAX_REG && rc == (rt5512_reg_priv[param[0]].reg_size+1))
1683 reg_dsize = rt5512_reg_priv[param[0]].reg_size;
1691 for (i = 0; i<reg_dsize+1; i++)
1692 lbuf[i] = (unsigned char)param[i];
1694 i2c_master_send(this_client, lbuf, reg_dsize+1);
1695 rt5512_reg_priv[param[0]].sync_needed = 1;
1704 } else if (!strcmp(access_str, "peek")) {
1706 rc = get_parameters(lbuf, param, 1);
1707 if (rc > 0 && param[0] <= RT5512_MAX_REG)
1709 reg_dsize = rt5512_reg_priv[param[0]].reg_size;
1717 lbuf[0] = (unsigned char)param[0];
1718 i2c_master_send(this_client, lbuf, 1);
1719 i2c_master_recv(this_client, lbuf, reg_dsize);
1720 for (i=0; i< reg_dsize; i++)
1721 read_data[i] = lbuf[i];
1722 read_size = reg_dsize;
1730 } else if (!strcmp(access_str, "headset_test")) {
1731 rc = get_parameters(lbuf, param, 1);
1734 if (param[0] >= 0 && param[0] <= 6)
1735 rt5512_simulate_headset(this_client, param[0]);
1749 static const struct file_operations codec_debug_ops = {
1750 .open = codec_debug_open,
1751 .write = codec_debug_write,
1752 .read = codec_debug_read
1756 static int rt5512_i2c_probe(struct i2c_client *client, const struct i2c_device_id *id)
1759 struct rt5512_codec_chip *chip;
1762 chip = kzalloc(sizeof(*chip), GFP_KERNEL);
1765 pr_err("%s: could not allocate kernel memory\n", __func__);
1769 chip->dev = &client->dev;
1770 chip->client = client;
1771 chip->control_type = SND_SOC_I2C;
1773 i2c_set_clientdata(client, chip);
1775 ret = snd_soc_register_codec(&client->dev,
1776 &soc_codec_dev_rt5512, rt5512_dai, ARRAY_SIZE(rt5512_dai));
1779 dev_err(&client->dev, "register codec failed\n");
1780 goto codec_reg_fail;
1783 #ifdef CONFIG_DEBUG_FS
1784 RT_DBG("add debugfs for core debug\n");
1785 this_client = client;
1786 debugfs_rt_dent = debugfs_create_dir("rt5512_codec_dbg", 0);
1787 if (!IS_ERR(debugfs_rt_dent)) {
1788 debugfs_peek = debugfs_create_file("peek",
1789 S_IFREG | S_IRUGO, debugfs_rt_dent,
1790 (void *) "peek", &codec_debug_ops);
1792 debugfs_poke = debugfs_create_file("poke",
1793 S_IFREG | S_IRUGO, debugfs_rt_dent,
1794 (void *) "poke", &codec_debug_ops);
1796 debugfs_headset_test = debugfs_create_file("headset_test",
1797 S_IFREG | S_IRUGO, debugfs_rt_dent,
1798 (void *) "headset_test", &codec_debug_ops);
1802 pr_info("rt5512-codec driver successfully loaded\n");
1810 static int rt5512_i2c_remove(struct i2c_client *client)
1812 struct rt5512_codec_chip *chip = i2c_get_clientdata(client);
1814 if (!IS_ERR(debugfs_rt_dent))
1815 debugfs_remove_recursive(debugfs_rt_dent);
1820 static const struct i2c_device_id rt5512_i2c_id[] =
1825 MODULE_DEVICE_TABLE(i2c, rt5512_i2c_id);
1827 struct i2c_driver rt5512_i2c_driver =
1831 .owner = THIS_MODULE,
1833 .probe = rt5512_i2c_probe,
1834 .remove = rt5512_i2c_remove,
1835 .id_table = rt5512_i2c_id,
1838 static int __init rt5512_init(void)
1840 return i2c_add_driver(&rt5512_i2c_driver);
1843 static void __exit rt5512_exit(void)
1845 i2c_del_driver(&rt5512_i2c_driver);
1848 module_init(rt5512_init);
1849 module_exit(rt5512_exit);
1851 MODULE_AUTHOR("cy_huang <cy_huang@richtek.com>");
1852 MODULE_DESCRIPTION("RT5512 audio codec for Rockchip board");
1853 MODULE_LICENSE("GPL");
1854 MODULE_VERSION(RT5512_DRV_VER);