13 #include <linux/module.h>
20 #include <linux/slab.h>
76 0xbf, 0, digital_tlv),
79 0xbf, 0, digital_tlv),
82 0xbf, 0, digital_tlv),
85 0xbf, 0, digital_tlv),
212 0xbf, 0, digital_tlv),
215 0xbf, 0, digital_tlv),
218 0xbf, 0, digital_tlv),
221 0xbf, 0, digital_tlv),
224 0xbf, 0, digital_tlv),
227 0xbf, 0, digital_tlv),
232 0x34, 0x40, 0, ana_tlv),
236 0x34, 0x40, 0, ana_tlv),
316 static const char *wm5110_aec_loopback_texts[] = {
317 "HPOUT1L",
"HPOUT1R",
"HPOUT2L",
"HPOUT2R",
"HPOUT3L",
"HPOUT3R",
318 "SPKOUTL",
"SPKOUTR",
"SPKDAT1L",
"SPKDAT1R",
"SPKDAT2L",
"SPKDAT2R",
321 static const unsigned int wm5110_aec_loopback_values[] = {
322 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11,
325 static const struct soc_enum wm5110_aec_loopback =
330 wm5110_aec_loopback_texts,
331 wm5110_aec_loopback_values);
609 #define ARIZONA_MIXER_INPUT_ROUTES(name) \
610 { name, "Noise Generator", "Noise Generator" }, \
611 { name, "Tone Generator 1", "Tone Generator 1" }, \
612 { name, "Tone Generator 2", "Tone Generator 2" }, \
613 { name, "AEC", "AEC Loopback" }, \
614 { name, "IN1L", "IN1L PGA" }, \
615 { name, "IN1R", "IN1R PGA" }, \
616 { name, "IN2L", "IN2L PGA" }, \
617 { name, "IN2R", "IN2R PGA" }, \
618 { name, "IN3L", "IN3L PGA" }, \
619 { name, "IN3R", "IN3R PGA" }, \
620 { name, "IN4L", "IN4L PGA" }, \
621 { name, "IN4R", "IN4R PGA" }, \
622 { name, "Mic Mute Mixer", "Mic Mute Mixer" }, \
623 { name, "AIF1RX1", "AIF1RX1" }, \
624 { name, "AIF1RX2", "AIF1RX2" }, \
625 { name, "AIF1RX3", "AIF1RX3" }, \
626 { name, "AIF1RX4", "AIF1RX4" }, \
627 { name, "AIF1RX5", "AIF1RX5" }, \
628 { name, "AIF1RX6", "AIF1RX6" }, \
629 { name, "AIF1RX7", "AIF1RX7" }, \
630 { name, "AIF1RX8", "AIF1RX8" }, \
631 { name, "AIF2RX1", "AIF2RX1" }, \
632 { name, "AIF2RX2", "AIF2RX2" }, \
633 { name, "AIF3RX1", "AIF3RX1" }, \
634 { name, "AIF3RX2", "AIF3RX2" }, \
635 { name, "EQ1", "EQ1" }, \
636 { name, "EQ2", "EQ2" }, \
637 { name, "EQ3", "EQ3" }, \
638 { name, "EQ4", "EQ4" }, \
639 { name, "DRC1L", "DRC1L" }, \
640 { name, "DRC1R", "DRC1R" }, \
641 { name, "DRC2L", "DRC2L" }, \
642 { name, "DRC2R", "DRC2R" }, \
643 { name, "LHPF1", "LHPF1" }, \
644 { name, "LHPF2", "LHPF2" }, \
645 { name, "LHPF3", "LHPF3" }, \
646 { name, "LHPF4", "LHPF4" }, \
647 { name, "ASRC1L", "ASRC1L" }, \
648 { name, "ASRC1R", "ASRC1R" }, \
649 { name, "ASRC2L", "ASRC2L" }, \
650 { name, "ASRC2R", "ASRC2R" }
653 {
"AIF2 Capture",
NULL,
"DBVDD2" },
654 {
"AIF2 Playback",
NULL,
"DBVDD2" },
656 {
"AIF3 Capture",
NULL,
"DBVDD3" },
657 {
"AIF3 Playback",
NULL,
"DBVDD3" },
659 {
"OUT1L",
NULL,
"CPVDD" },
660 {
"OUT1R",
NULL,
"CPVDD" },
661 {
"OUT2L",
NULL,
"CPVDD" },
662 {
"OUT2R",
NULL,
"CPVDD" },
663 {
"OUT3L",
NULL,
"CPVDD" },
664 {
"OUT3R",
NULL,
"CPVDD" },
666 {
"OUT4L",
NULL,
"SPKVDDL" },
667 {
"OUT4R",
NULL,
"SPKVDDR" },
669 {
"OUT1L",
NULL,
"SYSCLK" },
670 {
"OUT1R",
NULL,
"SYSCLK" },
671 {
"OUT2L",
NULL,
"SYSCLK" },
672 {
"OUT2R",
NULL,
"SYSCLK" },
673 {
"OUT3L",
NULL,
"SYSCLK" },
674 {
"OUT4L",
NULL,
"SYSCLK" },
675 {
"OUT4R",
NULL,
"SYSCLK" },
676 {
"OUT5L",
NULL,
"SYSCLK" },
677 {
"OUT5R",
NULL,
"SYSCLK" },
678 {
"OUT6L",
NULL,
"SYSCLK" },
679 {
"OUT6R",
NULL,
"SYSCLK" },
681 {
"MICBIAS1",
NULL,
"MICVDD" },
682 {
"MICBIAS2",
NULL,
"MICVDD" },
683 {
"MICBIAS3",
NULL,
"MICVDD" },
685 {
"Noise Generator",
NULL,
"NOISE" },
686 {
"Tone Generator 1",
NULL,
"TONE" },
687 {
"Tone Generator 2",
NULL,
"TONE" },
689 {
"Mic Mute Mixer",
NULL,
"Noise Mixer" },
690 {
"Mic Mute Mixer",
NULL,
"Mic Mixer" },
692 {
"AIF1 Capture",
NULL,
"AIF1TX1" },
693 {
"AIF1 Capture",
NULL,
"AIF1TX2" },
694 {
"AIF1 Capture",
NULL,
"AIF1TX3" },
695 {
"AIF1 Capture",
NULL,
"AIF1TX4" },
696 {
"AIF1 Capture",
NULL,
"AIF1TX5" },
697 {
"AIF1 Capture",
NULL,
"AIF1TX6" },
698 {
"AIF1 Capture",
NULL,
"AIF1TX7" },
699 {
"AIF1 Capture",
NULL,
"AIF1TX8" },
701 {
"AIF1RX1",
NULL,
"AIF1 Playback" },
702 {
"AIF1RX2",
NULL,
"AIF1 Playback" },
703 {
"AIF1RX3",
NULL,
"AIF1 Playback" },
704 {
"AIF1RX4",
NULL,
"AIF1 Playback" },
705 {
"AIF1RX5",
NULL,
"AIF1 Playback" },
706 {
"AIF1RX6",
NULL,
"AIF1 Playback" },
707 {
"AIF1RX7",
NULL,
"AIF1 Playback" },
708 {
"AIF1RX8",
NULL,
"AIF1 Playback" },
710 {
"AIF2 Capture",
NULL,
"AIF2TX1" },
711 {
"AIF2 Capture",
NULL,
"AIF2TX2" },
713 {
"AIF2RX1",
NULL,
"AIF2 Playback" },
714 {
"AIF2RX2",
NULL,
"AIF2 Playback" },
716 {
"AIF3 Capture",
NULL,
"AIF3TX1" },
717 {
"AIF3 Capture",
NULL,
"AIF3TX2" },
719 {
"AIF3RX1",
NULL,
"AIF3 Playback" },
720 {
"AIF3RX2",
NULL,
"AIF3 Playback" },
722 {
"AIF1 Playback",
NULL,
"SYSCLK" },
723 {
"AIF2 Playback",
NULL,
"SYSCLK" },
724 {
"AIF3 Playback",
NULL,
"SYSCLK" },
726 {
"AIF1 Capture",
NULL,
"SYSCLK" },
727 {
"AIF2 Capture",
NULL,
"SYSCLK" },
728 {
"AIF3 Capture",
NULL,
"SYSCLK" },
730 {
"IN1L PGA",
NULL,
"IN1L" },
731 {
"IN1R PGA",
NULL,
"IN1R" },
733 {
"IN2L PGA",
NULL,
"IN2L" },
734 {
"IN2R PGA",
NULL,
"IN2R" },
736 {
"IN3L PGA",
NULL,
"IN3L" },
737 {
"IN3R PGA",
NULL,
"IN3R" },
739 {
"IN4L PGA",
NULL,
"IN4L" },
740 {
"IN4R PGA",
NULL,
"IN4R" },
794 {
"HPOUT1L",
NULL,
"OUT1L" },
795 {
"HPOUT1R",
NULL,
"OUT1R" },
797 {
"HPOUT2L",
NULL,
"OUT2L" },
798 {
"HPOUT2R",
NULL,
"OUT2R" },
800 {
"HPOUT3L",
NULL,
"OUT3L" },
801 {
"HPOUT3R",
NULL,
"OUT3L" },
803 {
"SPKOUTLN",
NULL,
"OUT4L" },
804 {
"SPKOUTLP",
NULL,
"OUT4L" },
806 {
"SPKOUTRN",
NULL,
"OUT4R" },
807 {
"SPKOUTRP",
NULL,
"OUT4R" },
809 {
"SPKDAT1L",
NULL,
"OUT5L" },
810 {
"SPKDAT1R",
NULL,
"OUT5R" },
812 {
"SPKDAT2L",
NULL,
"OUT6L" },
813 {
"SPKDAT2R",
NULL,
"OUT6R" },
817 unsigned int Fref,
unsigned int Fout)
819 struct wm5110_priv *wm5110 = snd_soc_codec_get_drvdata(codec);
831 #define WM5110_RATES SNDRV_PCM_RATE_8000_192000
833 #define WM5110_FORMATS (SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S20_3LE |\
834 SNDRV_PCM_FMTBIT_S24_LE | SNDRV_PCM_FMTBIT_S32_LE)
838 .name =
"wm5110-aif1",
842 .stream_name =
"AIF1 Playback",
849 .stream_name =
"AIF1 Capture",
856 .symmetric_rates = 1,
859 .name =
"wm5110-aif2",
863 .stream_name =
"AIF2 Playback",
870 .stream_name =
"AIF2 Capture",
877 .symmetric_rates = 1,
880 .name =
"wm5110-aif3",
884 .stream_name =
"AIF3 Playback",
891 .stream_name =
"AIF3 Capture",
898 .symmetric_rates = 1,
910 #define WM5110_DIG_VU 0x0200
912 static unsigned int wm5110_digital_vu[] = {
937 .probe = wm5110_codec_probe,
939 .idle_bias_off =
true,
942 .set_pll = wm5110_set_fll,
944 .controls = wm5110_snd_controls,
945 .num_controls =
ARRAY_SIZE(wm5110_snd_controls),
946 .dapm_widgets = wm5110_dapm_widgets,
947 .num_dapm_widgets =
ARRAY_SIZE(wm5110_dapm_widgets),
948 .dapm_routes = wm5110_dapm_routes,
949 .num_dapm_routes =
ARRAY_SIZE(wm5110_dapm_routes),
962 platform_set_drvdata(pdev, wm5110);
964 wm5110->
core.arizona = arizona;
967 wm5110->
fll[i].vco_mult = 3;
980 for (i = 0; i <
ARRAY_SIZE(wm5110_digital_vu); i++)
985 pm_runtime_idle(&pdev->
dev);
994 pm_runtime_disable(&pdev->
dev);
1001 .name =
"wm5110-codec",
1004 .probe = wm5110_probe,