13 #include <linux/module.h>
15 #include <linux/kernel.h>
19 #include <linux/i2c.h>
21 #include <linux/slab.h>
30 #include <asm/div64.h>
227 static const char *lm49453_mic2mode_text[] = {
"Single Ended",
"Differential"};
230 lm49453_mic2mode_text);
232 static const char *lm49453_dmic_cfg_text[] = {
"DMICDAT1",
"DMICDAT2"};
236 7, lm49453_dmic_cfg_text);
240 7, lm49453_dmic_cfg_text);
243 static const char *lm49453_adcl_mux_text[] = {
"MIC1",
"Aux_L" };
245 static const char *lm49453_adcr_mux_text[] = {
"MIC2",
"Aux_R" };
247 static const struct soc_enum lm49453_adcl_enum =
250 lm49453_adcl_mux_text);
252 static const struct soc_enum lm49453_adcr_enum =
255 lm49453_adcr_mux_text);
534 0, 0x3F, 0, digital_tlv),
536 0, 0x3F, 0, digital_tlv),
538 0, 0x3F, 0, digital_tlv),
540 0, 0x3F, 0, digital_tlv),
542 0, 0x3F, 0, digital_tlv),
544 0, 0x3F, 0, digital_tlv),
581 0, 6, 0, digital_tlv),
693 &lm49453_adcl_mux_control),
695 &lm49453_adcr_mux_control),
730 lm49453_sidetone_mixer_controls,
735 lm49453_headset_left_mixer,
738 lm49453_headset_right_mixer,
741 lm49453_lineout_left_mixer,
744 lm49453_lineout_right_mixer,
747 lm49453_speaker_left_mixer,
750 lm49453_speaker_right_mixer,
753 lm49453_haptic_left_mixer,
756 lm49453_haptic_right_mixer,
761 lm49453_port1_tx1_mixer,
764 lm49453_port1_tx2_mixer,
767 lm49453_port1_tx3_mixer,
770 lm49453_port1_tx4_mixer,
773 lm49453_port1_tx5_mixer,
776 lm49453_port1_tx6_mixer,
779 lm49453_port1_tx7_mixer,
782 lm49453_port1_tx8_mixer,
786 lm49453_port2_tx1_mixer,
789 lm49453_port2_tx2_mixer,
795 {
"PORT1_1_RX",
"Port1 Playback Switch",
"PORT1_SDI" },
796 {
"PORT1_2_RX",
"Port1 Playback Switch",
"PORT1_SDI" },
797 {
"PORT1_3_RX",
"Port1 Playback Switch",
"PORT1_SDI" },
798 {
"PORT1_4_RX",
"Port1 Playback Switch",
"PORT1_SDI" },
799 {
"PORT1_5_RX",
"Port1 Playback Switch",
"PORT1_SDI" },
800 {
"PORT1_6_RX",
"Port1 Playback Switch",
"PORT1_SDI" },
801 {
"PORT1_7_RX",
"Port1 Playback Switch",
"PORT1_SDI" },
802 {
"PORT1_8_RX",
"Port1 Playback Switch",
"PORT1_SDI" },
804 {
"PORT2_1_RX",
"Port2 Playback Switch",
"PORT2_SDI" },
805 {
"PORT2_2_RX",
"Port2 Playback Switch",
"PORT2_SDI" },
808 {
"HPL Mixer",
"Port1_1 Switch",
"PORT1_1_RX" },
809 {
"HPL Mixer",
"Port1_2 Switch",
"PORT1_2_RX" },
810 {
"HPL Mixer",
"Port1_3 Switch",
"PORT1_3_RX" },
811 {
"HPL Mixer",
"Port1_4 Switch",
"PORT1_4_RX" },
812 {
"HPL Mixer",
"Port1_5 Switch",
"PORT1_5_RX" },
813 {
"HPL Mixer",
"Port1_6 Switch",
"PORT1_6_RX" },
814 {
"HPL Mixer",
"Port1_7 Switch",
"PORT1_7_RX" },
815 {
"HPL Mixer",
"Port1_8 Switch",
"PORT1_8_RX" },
817 {
"HPL Mixer",
"Port2_1 Switch",
"PORT2_1_RX" },
818 {
"HPL Mixer",
"Port2_2 Switch",
"PORT2_2_RX" },
820 {
"HPL Mixer",
"ADCL Switch",
"ADC Left" },
821 {
"HPL Mixer",
"ADCR Switch",
"ADC Right" },
822 {
"HPL Mixer",
"DMIC1L Switch",
"DMIC1 Left" },
823 {
"HPL Mixer",
"DMIC1R Switch",
"DMIC1 Right" },
824 {
"HPL Mixer",
"DMIC2L Switch",
"DMIC2 Left" },
825 {
"HPL Mixer",
"DMIC2R Switch",
"DMIC2 Right" },
826 {
"HPL Mixer",
"Sidetone Switch",
"Sidetone" },
828 {
"HPL DAC",
NULL,
"HPL Mixer" },
830 {
"HPR Mixer",
"Port1_1 Switch",
"PORT1_1_RX" },
831 {
"HPR Mixer",
"Port1_2 Switch",
"PORT1_2_RX" },
832 {
"HPR Mixer",
"Port1_3 Switch",
"PORT1_3_RX" },
833 {
"HPR Mixer",
"Port1_4 Switch",
"PORT1_4_RX" },
834 {
"HPR Mixer",
"Port1_5 Switch",
"PORT1_5_RX" },
835 {
"HPR Mixer",
"Port1_6 Switch",
"PORT1_6_RX" },
836 {
"HPR Mixer",
"Port1_7 Switch",
"PORT1_7_RX" },
837 {
"HPR Mixer",
"Port1_8 Switch",
"PORT1_8_RX" },
840 {
"HPR Mixer",
"Port2_1 Switch",
"PORT2_1_RX" },
841 {
"HPR Mixer",
"Port2_2 Switch",
"PORT2_2_RX" },
843 {
"HPR Mixer",
"ADCL Switch",
"ADC Left" },
844 {
"HPR Mixer",
"ADCR Switch",
"ADC Right" },
845 {
"HPR Mixer",
"DMIC1L Switch",
"DMIC1 Left" },
846 {
"HPR Mixer",
"DMIC1R Switch",
"DMIC1 Right" },
847 {
"HPR Mixer",
"DMIC2L Switch",
"DMIC2 Left" },
848 {
"HPR Mixer",
"DMIC2L Switch",
"DMIC2 Right" },
849 {
"HPR Mixer",
"Sidetone Switch",
"Sidetone" },
851 {
"HPR DAC",
NULL,
"HPR Mixer" },
853 {
"HPOUTL",
"Headset Switch",
"HPL DAC"},
854 {
"HPOUTR",
"Headset Switch",
"HPR DAC"},
857 {
"EPOUT",
"Earpiece Switch",
"HPL DAC" },
860 {
"LSL Mixer",
"Port1_1 Switch",
"PORT1_1_RX" },
861 {
"LSL Mixer",
"Port1_2 Switch",
"PORT1_2_RX" },
862 {
"LSL Mixer",
"Port1_3 Switch",
"PORT1_3_RX" },
863 {
"LSL Mixer",
"Port1_4 Switch",
"PORT1_4_RX" },
864 {
"LSL Mixer",
"Port1_5 Switch",
"PORT1_5_RX" },
865 {
"LSL Mixer",
"Port1_6 Switch",
"PORT1_6_RX" },
866 {
"LSL Mixer",
"Port1_7 Switch",
"PORT1_7_RX" },
867 {
"LSL Mixer",
"Port1_8 Switch",
"PORT1_8_RX" },
870 {
"LSL Mixer",
"Port2_1 Switch",
"PORT2_1_RX" },
871 {
"LSL Mixer",
"Port2_2 Switch",
"PORT2_2_RX" },
873 {
"LSL Mixer",
"ADCL Switch",
"ADC Left" },
874 {
"LSL Mixer",
"ADCR Switch",
"ADC Right" },
875 {
"LSL Mixer",
"DMIC1L Switch",
"DMIC1 Left" },
876 {
"LSL Mixer",
"DMIC1R Switch",
"DMIC1 Right" },
877 {
"LSL Mixer",
"DMIC2L Switch",
"DMIC2 Left" },
878 {
"LSL Mixer",
"DMIC2R Switch",
"DMIC2 Right" },
879 {
"LSL Mixer",
"Sidetone Switch",
"Sidetone" },
881 {
"LSL DAC",
NULL,
"LSL Mixer" },
883 {
"LSR Mixer",
"Port1_1 Switch",
"PORT1_1_RX" },
884 {
"LSR Mixer",
"Port1_2 Switch",
"PORT1_2_RX" },
885 {
"LSR Mixer",
"Port1_3 Switch",
"PORT1_3_RX" },
886 {
"LSR Mixer",
"Port1_4 Switch",
"PORT1_4_RX" },
887 {
"LSR Mixer",
"Port1_5 Switch",
"PORT1_5_RX" },
888 {
"LSR Mixer",
"Port1_6 Switch",
"PORT1_6_RX" },
889 {
"LSR Mixer",
"Port1_7 Switch",
"PORT1_7_RX" },
890 {
"LSR Mixer",
"Port1_8 Switch",
"PORT1_8_RX" },
893 {
"LSR Mixer",
"Port2_1 Switch",
"PORT2_1_RX" },
894 {
"LSR Mixer",
"Port2_2 Switch",
"PORT2_2_RX" },
896 {
"LSR Mixer",
"ADCL Switch",
"ADC Left" },
897 {
"LSR Mixer",
"ADCR Switch",
"ADC Right" },
898 {
"LSR Mixer",
"DMIC1L Switch",
"DMIC1 Left" },
899 {
"LSR Mixer",
"DMIC1R Switch",
"DMIC1 Right" },
900 {
"LSR Mixer",
"DMIC2L Switch",
"DMIC2 Left" },
901 {
"LSR Mixer",
"DMIC2R Switch",
"DMIC2 Right" },
902 {
"LSR Mixer",
"Sidetone Switch",
"Sidetone" },
904 {
"LSR DAC",
NULL,
"LSR Mixer" },
906 {
"LSOUTL",
"Speaker Left Switch",
"LSL DAC"},
907 {
"LSOUTR",
"Speaker Left Switch",
"LSR DAC"},
910 {
"HAL Mixer",
"Port1_1 Switch",
"PORT1_1_RX" },
911 {
"HAL Mixer",
"Port1_2 Switch",
"PORT1_2_RX" },
912 {
"HAL Mixer",
"Port1_3 Switch",
"PORT1_3_RX" },
913 {
"HAL Mixer",
"Port1_4 Switch",
"PORT1_4_RX" },
914 {
"HAL Mixer",
"Port1_5 Switch",
"PORT1_5_RX" },
915 {
"HAL Mixer",
"Port1_6 Switch",
"PORT1_6_RX" },
916 {
"HAL Mixer",
"Port1_7 Switch",
"PORT1_7_RX" },
917 {
"HAL Mixer",
"Port1_8 Switch",
"PORT1_8_RX" },
920 {
"HAL Mixer",
"Port2_1 Switch",
"PORT2_1_RX" },
921 {
"HAL Mixer",
"Port2_2 Switch",
"PORT2_2_RX" },
923 {
"HAL Mixer",
"ADCL Switch",
"ADC Left" },
924 {
"HAL Mixer",
"ADCR Switch",
"ADC Right" },
925 {
"HAL Mixer",
"DMIC1L Switch",
"DMIC1 Left" },
926 {
"HAL Mixer",
"DMIC1R Switch",
"DMIC1 Right" },
927 {
"HAL Mixer",
"DMIC2L Switch",
"DMIC2 Left" },
928 {
"HAL Mixer",
"DMIC2R Switch",
"DMIC2 Right" },
929 {
"HAL Mixer",
"Sidetone Switch",
"Sidetone" },
931 {
"HAL DAC",
NULL,
"HAL Mixer" },
933 {
"HAR Mixer",
"Port1_1 Switch",
"PORT1_1_RX" },
934 {
"HAR Mixer",
"Port1_2 Switch",
"PORT1_2_RX" },
935 {
"HAR Mixer",
"Port1_3 Switch",
"PORT1_3_RX" },
936 {
"HAR Mixer",
"Port1_4 Switch",
"PORT1_4_RX" },
937 {
"HAR Mixer",
"Port1_5 Switch",
"PORT1_5_RX" },
938 {
"HAR Mixer",
"Port1_6 Switch",
"PORT1_6_RX" },
939 {
"HAR Mixer",
"Port1_7 Switch",
"PORT1_7_RX" },
940 {
"HAR Mixer",
"Port1_8 Switch",
"PORT1_8_RX" },
943 {
"HAR Mixer",
"Port2_1 Switch",
"PORT2_1_RX" },
944 {
"HAR Mixer",
"Port2_2 Switch",
"PORT2_2_RX" },
946 {
"HAR Mixer",
"ADCL Switch",
"ADC Left" },
947 {
"HAR Mixer",
"ADCR Switch",
"ADC Right" },
948 {
"HAR Mixer",
"DMIC1L Switch",
"DMIC1 Left" },
949 {
"HAR Mixer",
"DMIC1R Switch",
"DMIC1 Right" },
950 {
"HAR Mixer",
"DMIC2L Switch",
"DMIC2 Left" },
951 {
"HAR Mixer",
"DMIC2R Switch",
"DMIC2 Right" },
952 {
"HAR Mixer",
"Sideton Switch",
"Sidetone" },
954 {
"HAR DAC",
NULL,
"HAR Mixer" },
956 {
"HAOUTL",
"Haptic Left Switch",
"HAL DAC" },
957 {
"HAOUTR",
"Haptic Right Switch",
"HAR DAC" },
960 {
"LOL Mixer",
"Port1_1 Switch",
"PORT1_1_RX" },
961 {
"LOL Mixer",
"Port1_2 Switch",
"PORT1_2_RX" },
962 {
"LOL Mixer",
"Port1_3 Switch",
"PORT1_3_RX" },
963 {
"LOL Mixer",
"Port1_4 Switch",
"PORT1_4_RX" },
964 {
"LOL Mixer",
"Port1_5 Switch",
"PORT1_5_RX" },
965 {
"LOL Mixer",
"Port1_6 Switch",
"PORT1_6_RX" },
966 {
"LOL Mixer",
"Port1_7 Switch",
"PORT1_7_RX" },
967 {
"LOL Mixer",
"Port1_8 Switch",
"PORT1_8_RX" },
970 {
"LOL Mixer",
"Port2_1 Switch",
"PORT2_1_RX" },
971 {
"LOL Mixer",
"Port2_2 Switch",
"PORT2_2_RX" },
973 {
"LOL Mixer",
"ADCL Switch",
"ADC Left" },
974 {
"LOL Mixer",
"ADCR Switch",
"ADC Right" },
975 {
"LOL Mixer",
"DMIC1L Switch",
"DMIC1 Left" },
976 {
"LOL Mixer",
"DMIC1R Switch",
"DMIC1 Right" },
977 {
"LOL Mixer",
"DMIC2L Switch",
"DMIC2 Left" },
978 {
"LOL Mixer",
"DMIC2R Switch",
"DMIC2 Right" },
979 {
"LOL Mixer",
"Sidetone Switch",
"Sidetone" },
981 {
"LOL DAC",
NULL,
"LOL Mixer" },
983 {
"LOR Mixer",
"Port1_1 Switch",
"PORT1_1_RX" },
984 {
"LOR Mixer",
"Port1_2 Switch",
"PORT1_2_RX" },
985 {
"LOR Mixer",
"Port1_3 Switch",
"PORT1_3_RX" },
986 {
"LOR Mixer",
"Port1_4 Switch",
"PORT1_4_RX" },
987 {
"LOR Mixer",
"Port1_5 Switch",
"PORT1_5_RX" },
988 {
"LOR Mixer",
"Port1_6 Switch",
"PORT1_6_RX" },
989 {
"LOR Mixer",
"Port1_7 Switch",
"PORT1_7_RX" },
990 {
"LOR Mixer",
"Port1_8 Switch",
"PORT1_8_RX" },
993 {
"LOR Mixer",
"Port2_1 Switch",
"PORT2_1_RX" },
994 {
"LOR Mixer",
"Port2_2 Switch",
"PORT2_2_RX" },
996 {
"LOR Mixer",
"ADCL Switch",
"ADC Left" },
997 {
"LOR Mixer",
"ADCR Switch",
"ADC Right" },
998 {
"LOR Mixer",
"DMIC1L Switch",
"DMIC1 Left" },
999 {
"LOR Mixer",
"DMIC1R Switch",
"DMIC1 Right" },
1000 {
"LOR Mixer",
"DMIC2L Switch",
"DMIC2 Left" },
1001 {
"LOR Mixer",
"DMIC2R Switch",
"DMIC2 Right" },
1002 {
"LOR Mixer",
"Sidetone Switch",
"Sidetone" },
1004 {
"LOR DAC",
NULL,
"LOR Mixer" },
1006 {
"LOOUTL",
NULL,
"LOL DAC" },
1007 {
"LOOUTR",
NULL,
"LOR DAC" },
1011 {
"Port1_1 Mixer",
"ADCL Switch",
"ADC Left" },
1012 {
"Port1_1 Mixer",
"ADCR Switch",
"ADC Right" },
1013 {
"Port1_1 Mixer",
"DMIC1L Switch",
"DMIC1 Left" },
1014 {
"Port1_1 Mixer",
"DMIC1R Switch",
"DMIC1 Right" },
1015 {
"Port1_1 Mixer",
"DMIC2L Switch",
"DMIC2 Left" },
1016 {
"Port1_1 Mixer",
"DMIC2R Switch",
"DMIC2 Right" },
1018 {
"Port1_2 Mixer",
"ADCL Switch",
"ADC Left" },
1019 {
"Port1_2 Mixer",
"ADCR Switch",
"ADC Right" },
1020 {
"Port1_2 Mixer",
"DMIC1L Switch",
"DMIC1 Left" },
1021 {
"Port1_2 Mixer",
"DMIC1R Switch",
"DMIC1 Right" },
1022 {
"Port1_2 Mixer",
"DMIC2L Switch",
"DMIC2 Left" },
1023 {
"Port1_2 Mixer",
"DMIC2R Switch",
"DMIC2 Right" },
1025 {
"Port1_3 Mixer",
"ADCL Switch",
"ADC Left" },
1026 {
"Port1_3 Mixer",
"ADCR Switch",
"ADC Right" },
1027 {
"Port1_3 Mixer",
"DMIC1L Switch",
"DMIC1 Left" },
1028 {
"Port1_3 Mixer",
"DMIC1R Switch",
"DMIC1 Right" },
1029 {
"Port1_3 Mixer",
"DMIC2L Switch",
"DMIC2 Left" },
1030 {
"Port1_3 Mixer",
"DMIC2R Switch",
"DMIC2 Right" },
1032 {
"Port1_4 Mixer",
"ADCL Switch",
"ADC Left" },
1033 {
"Port1_4 Mixer",
"ADCR Switch",
"ADC Right" },
1034 {
"Port1_4 Mixer",
"DMIC1L Switch",
"DMIC1 Left" },
1035 {
"Port1_4 Mixer",
"DMIC1R Switch",
"DMIC1 Right" },
1036 {
"Port1_4 Mixer",
"DMIC2L Switch",
"DMIC2 Left" },
1037 {
"Port1_4 Mixer",
"DMIC2R Switch",
"DMIC2 Right" },
1039 {
"Port1_5 Mixer",
"ADCL Switch",
"ADC Left" },
1040 {
"Port1_5 Mixer",
"ADCR Switch",
"ADC Right" },
1041 {
"Port1_5 Mixer",
"DMIC1L Switch",
"DMIC1 Left" },
1042 {
"Port1_5 Mixer",
"DMIC1R Switch",
"DMIC1 Right" },
1043 {
"Port1_5 Mixer",
"DMIC2L Switch",
"DMIC2 Left" },
1044 {
"Port1_5 Mixer",
"DMIC2R Switch",
"DMIC2 Right" },
1046 {
"Port1_6 Mixer",
"ADCL Switch",
"ADC Left" },
1047 {
"Port1_6 Mixer",
"ADCR Switch",
"ADC Right" },
1048 {
"Port1_6 Mixer",
"DMIC1L Switch",
"DMIC1 Left" },
1049 {
"Port1_6 Mixer",
"DMIC1R Switch",
"DMIC1 Right" },
1050 {
"Port1_6 Mixer",
"DMIC2L Switch",
"DMIC2 Left" },
1051 {
"Port1_6 Mixer",
"DMIC2R Switch",
"DMIC2 Right" },
1053 {
"Port1_7 Mixer",
"ADCL Switch",
"ADC Left" },
1054 {
"Port1_7 Mixer",
"ADCR Switch",
"ADC Right" },
1055 {
"Port1_7 Mixer",
"DMIC1L Switch",
"DMIC1 Left" },
1056 {
"Port1_7 Mixer",
"DMIC1R Switch",
"DMIC1 Right" },
1057 {
"Port1_7 Mixer",
"DMIC2L Switch",
"DMIC2 Left" },
1058 {
"Port1_7 Mixer",
"DMIC2R Switch",
"DMIC2 Right" },
1060 {
"Port1_8 Mixer",
"ADCL Switch",
"ADC Left" },
1061 {
"Port1_8 Mixer",
"ADCR Switch",
"ADC Right" },
1062 {
"Port1_8 Mixer",
"DMIC1L Switch",
"DMIC1 Left" },
1063 {
"Port1_8 Mixer",
"DMIC1R Switch",
"DMIC1 Right" },
1064 {
"Port1_8 Mixer",
"DMIC2L Switch",
"DMIC2 Left" },
1065 {
"Port1_8 Mixer",
"DMIC2R Switch",
"DMIC2 Right" },
1067 {
"Port2_1 Mixer",
"ADCL Switch",
"ADC Left" },
1068 {
"Port2_1 Mixer",
"ADCR Switch",
"ADC Right" },
1069 {
"Port2_1 Mixer",
"DMIC1L Switch",
"DMIC1 Left" },
1070 {
"Port2_1 Mixer",
"DMIC1R Switch",
"DMIC1 Right" },
1071 {
"Port2_1 Mixer",
"DMIC2L Switch",
"DMIC2 Left" },
1072 {
"Port2_1 Mixer",
"DMIC2R Switch",
"DMIC2 Right" },
1074 {
"Port2_2 Mixer",
"ADCL Switch",
"ADC Left" },
1075 {
"Port2_2 Mixer",
"ADCR Switch",
"ADC Right" },
1076 {
"Port2_2 Mixer",
"DMIC1L Switch",
"DMIC1 Left" },
1077 {
"Port2_2 Mixer",
"DMIC1R Switch",
"DMIC1 Right" },
1078 {
"Port2_2 Mixer",
"DMIC2L Switch",
"DMIC2 Left" },
1079 {
"Port2_2 Mixer",
"DMIC2R Switch",
"DMIC2 Right" },
1081 {
"P1_1_TX",
NULL,
"Port1_1 Mixer" },
1082 {
"P1_2_TX",
NULL,
"Port1_2 Mixer" },
1083 {
"P1_3_TX",
NULL,
"Port1_3 Mixer" },
1084 {
"P1_4_TX",
NULL,
"Port1_4 Mixer" },
1085 {
"P1_5_TX",
NULL,
"Port1_5 Mixer" },
1086 {
"P1_6_TX",
NULL,
"Port1_6 Mixer" },
1087 {
"P1_7_TX",
NULL,
"Port1_7 Mixer" },
1088 {
"P1_8_TX",
NULL,
"Port1_8 Mixer" },
1090 {
"P2_1_TX",
NULL,
"Port2_1 Mixer" },
1091 {
"P2_2_TX",
NULL,
"Port2_2 Mixer" },
1093 {
"PORT1_SDO",
"Port1 Capture Switch",
"P1_1_TX"},
1094 {
"PORT1_SDO",
"Port1 Capture Switch",
"P1_2_TX"},
1095 {
"PORT1_SDO",
"Port1 Capture Switch",
"P1_3_TX"},
1096 {
"PORT1_SDO",
"Port1 Capture Switch",
"P1_4_TX"},
1097 {
"PORT1_SDO",
"Port1 Capture Switch",
"P1_5_TX"},
1098 {
"PORT1_SDO",
"Port1 Capture Switch",
"P1_6_TX"},
1099 {
"PORT1_SDO",
"Port1 Capture Switch",
"P1_7_TX"},
1100 {
"PORT1_SDO",
"Port1 Capture Switch",
"P1_8_TX"},
1102 {
"PORT2_SDO",
"Port2 Capture Switch",
"P2_1_TX"},
1103 {
"PORT2_SDO",
"Port2 Capture Switch",
"P2_2_TX"},
1105 {
"Mic1 Input",
NULL,
"AMIC1" },
1106 {
"Mic2 Input",
NULL,
"AMIC2" },
1108 {
"AUXL Input",
NULL,
"AUXL" },
1109 {
"AUXR Input",
NULL,
"AUXR" },
1112 {
"ADCL Mux",
"Aux_L",
"AUXL Input" },
1113 {
"ADCL Mux",
"MIC1",
"Mic1 Input" },
1115 {
"ADCR Mux",
"Aux_R",
"AUXR Input" },
1116 {
"ADCR Mux",
"MIC2",
"Mic2 Input" },
1119 {
"ADC Left",
NULL,
"ADCL Mux"},
1120 {
"ADC Right",
NULL,
"ADCR Mux"},
1122 {
"DMIC1 Left",
NULL,
"DMIC1DAT"},
1123 {
"DMIC1 Right",
NULL,
"DMIC1DAT"},
1124 {
"DMIC2 Left",
NULL,
"DMIC2DAT"},
1125 {
"DMIC2 Right",
NULL,
"DMIC2DAT"},
1128 {
"Sidetone Mixer",
NULL,
"ADC Left" },
1129 {
"Sidetone Mixer",
NULL,
"ADC Right" },
1130 {
"Sidetone Mixer",
NULL,
"DMIC1 Left" },
1131 {
"Sidetone Mixer",
NULL,
"DMIC1 Right" },
1132 {
"Sidetone Mixer",
NULL,
"DMIC2 Left" },
1133 {
"Sidetone Mixer",
NULL,
"DMIC2 Right" },
1135 {
"Sidetone",
"Sidetone Switch",
"Sidetone Mixer" },
1143 struct lm49453_priv *lm49453 = snd_soc_codec_get_drvdata(codec);
1175 static int lm49453_set_dai_fmt(
struct snd_soc_dai *codec_dai,
unsigned int fmt)
1208 clk_phase = (1 << 5);
1213 clk_phase = (1 << 5);
1222 (aif_val | mode | clk_phase));
1229 static int lm49453_set_dai_sysclk(
struct snd_soc_dai *dai,
int clk_id,
1230 unsigned int freq,
int dir)
1259 (mute ? (
BIT(1)|
BIT(0)) : 0));
1263 static int lm49453_lo_mute(
struct snd_soc_dai *dai,
int mute)
1266 (mute ? (
BIT(3)|
BIT(2)) : 0));
1270 static int lm49453_ls_mute(
struct snd_soc_dai *dai,
int mute)
1273 (mute ? (
BIT(5)|
BIT(4)) : 0));
1277 static int lm49453_ep_mute(
struct snd_soc_dai *dai,
int mute)
1280 (mute ?
BIT(4) : 0));
1284 static int lm49453_ha_mute(
struct snd_soc_dai *dai,
int mute)
1287 (mute ? (
BIT(7)|
BIT(6)) : 0));
1291 static int lm49453_set_bias_level(
struct snd_soc_codec *codec,
1294 struct lm49453_priv *lm49453 = snd_soc_codec_get_drvdata(codec);
1321 #define LM49453_FORMATS (SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S20_3LE |\
1322 SNDRV_PCM_FMTBIT_S24_LE | SNDRV_PCM_FMTBIT_S32_LE)
1325 .hw_params = lm49453_hw_params,
1326 .set_sysclk = lm49453_set_dai_sysclk,
1327 .set_fmt = lm49453_set_dai_fmt,
1328 .digital_mute = lm49453_hp_mute,
1332 .hw_params = lm49453_hw_params,
1333 .set_sysclk = lm49453_set_dai_sysclk,
1334 .set_fmt = lm49453_set_dai_fmt,
1335 .digital_mute = lm49453_ls_mute,
1339 .hw_params = lm49453_hw_params,
1340 .set_sysclk = lm49453_set_dai_sysclk,
1341 .set_fmt = lm49453_set_dai_fmt,
1342 .digital_mute = lm49453_ha_mute,
1346 .hw_params = lm49453_hw_params,
1347 .set_sysclk = lm49453_set_dai_sysclk,
1348 .set_fmt = lm49453_set_dai_fmt,
1349 .digital_mute = lm49453_ep_mute,
1353 .hw_params = lm49453_hw_params,
1354 .set_sysclk = lm49453_set_dai_sysclk,
1355 .set_fmt = lm49453_set_dai_fmt,
1356 .digital_mute = lm49453_lo_mute,
1362 .name =
"LM49453 Headset",
1364 .stream_name =
"Headset",
1371 .stream_name =
"Capture",
1377 .ops = &lm49453_headset_dai_ops,
1378 .symmetric_rates = 1,
1381 .name =
"LM49453 Speaker",
1383 .stream_name =
"Speaker",
1389 .ops = &lm49453_speaker_dai_ops,
1392 .name =
"LM49453 Haptic",
1394 .stream_name =
"Haptic",
1400 .ops = &lm49453_haptic_dai_ops,
1403 .name =
"LM49453 Earpiece",
1405 .stream_name =
"Earpiece",
1411 .ops = &lm49453_ep_dai_ops,
1414 .name =
"LM49453 line out",
1416 .stream_name =
"Lineout",
1422 .ops = &lm49453_lineout_dai_ops,
1440 struct lm49453_priv *lm49453 = snd_soc_codec_get_drvdata(codec);
1447 dev_err(codec->
dev,
"Failed to set cache I/O: %d\n", ret);
1462 .probe = lm49453_probe,
1463 .remove = lm49453_remove,
1464 .suspend = lm49453_suspend,
1465 .resume = lm49453_resume,
1466 .set_bias_level = lm49453_set_bias_level,
1467 .controls = lm49453_snd_controls,
1468 .num_controls =
ARRAY_SIZE(lm49453_snd_controls),
1469 .dapm_widgets = lm49453_dapm_widgets,
1470 .num_dapm_widgets =
ARRAY_SIZE(lm49453_dapm_widgets),
1471 .dapm_routes = lm49453_audio_map,
1472 .num_dapm_routes =
ARRAY_SIZE(lm49453_audio_map),
1473 .idle_bias_off =
true,
1476 static const struct regmap_config lm49453_regmap_config = {
1481 .reg_defaults = lm49453_reg_defs,
1482 .num_reg_defaults =
ARRAY_SIZE(lm49453_reg_defs),
1495 if (lm49453 ==
NULL)
1498 i2c_set_clientdata(i2c, lm49453);
1501 if (IS_ERR(lm49453->
regmap)) {
1502 ret = PTR_ERR(lm49453->
regmap);
1503 dev_err(&i2c->
dev,
"Failed to allocate register map: %d\n",
1509 &soc_codec_dev_lm49453,
1512 dev_err(&i2c->
dev,
"Failed to register codec: %d\n", ret);
1522 struct lm49453_priv *lm49453 = i2c_get_clientdata(client);
1535 static struct i2c_driver lm49453_i2c_driver = {
1540 .probe = lm49453_i2c_probe,
1542 .id_table = lm49453_i2c_id,