13 #include <linux/module.h>
20 #include <linux/slab.h>
45 static const struct reg_default wm5102_sysclk_reva_patch[] = {
573 switch (arizona->
rev) {
575 patch = wm5102_sysclk_reva_patch;
576 patch_size =
ARRAY_SIZE(wm5102_sysclk_reva_patch);
583 for (i = 0; i < patch_size; i++)
622 0xbf, 0, digital_tlv),
625 0xbf, 0, digital_tlv),
628 0xbf, 0, digital_tlv),
735 0xbf, 0, digital_tlv),
738 0xbf, 0, digital_tlv),
743 0xbf, 0, digital_tlv),
746 0xbf, 0, digital_tlv),
751 0x34, 0x40, 0, ana_tlv),
755 0x34, 0x40, 0, ana_tlv),
828 static const char *wm5102_aec_loopback_texts[] = {
829 "HPOUT1L",
"HPOUT1R",
"HPOUT2L",
"HPOUT2R",
"EPOUT",
830 "SPKOUTL",
"SPKOUTR",
"SPKDAT1L",
"SPKDAT1R",
833 static const unsigned int wm5102_aec_loopback_values[] = {
834 0, 1, 2, 3, 4, 6, 7, 8, 9,
837 static const struct soc_enum wm5102_aec_loopback =
842 wm5102_aec_loopback_texts,
843 wm5102_aec_loopback_values);
1093 #define ARIZONA_MIXER_INPUT_ROUTES(name) \
1094 { name, "Noise Generator", "Noise Generator" }, \
1095 { name, "Tone Generator 1", "Tone Generator 1" }, \
1096 { name, "Tone Generator 2", "Tone Generator 2" }, \
1097 { name, "AEC", "AEC Loopback" }, \
1098 { name, "IN1L", "IN1L PGA" }, \
1099 { name, "IN1R", "IN1R PGA" }, \
1100 { name, "IN2L", "IN2L PGA" }, \
1101 { name, "IN2R", "IN2R PGA" }, \
1102 { name, "IN3L", "IN3L PGA" }, \
1103 { name, "IN3R", "IN3R PGA" }, \
1104 { name, "Mic Mute Mixer", "Mic Mute Mixer" }, \
1105 { name, "AIF1RX1", "AIF1RX1" }, \
1106 { name, "AIF1RX2", "AIF1RX2" }, \
1107 { name, "AIF1RX3", "AIF1RX3" }, \
1108 { name, "AIF1RX4", "AIF1RX4" }, \
1109 { name, "AIF1RX5", "AIF1RX5" }, \
1110 { name, "AIF1RX6", "AIF1RX6" }, \
1111 { name, "AIF1RX7", "AIF1RX7" }, \
1112 { name, "AIF1RX8", "AIF1RX8" }, \
1113 { name, "AIF2RX1", "AIF2RX1" }, \
1114 { name, "AIF2RX2", "AIF2RX2" }, \
1115 { name, "AIF3RX1", "AIF3RX1" }, \
1116 { name, "AIF3RX2", "AIF3RX2" }, \
1117 { name, "EQ1", "EQ1" }, \
1118 { name, "EQ2", "EQ2" }, \
1119 { name, "EQ3", "EQ3" }, \
1120 { name, "EQ4", "EQ4" }, \
1121 { name, "DRC1L", "DRC1L" }, \
1122 { name, "DRC1R", "DRC1R" }, \
1123 { name, "LHPF1", "LHPF1" }, \
1124 { name, "LHPF2", "LHPF2" }, \
1125 { name, "LHPF3", "LHPF3" }, \
1126 { name, "LHPF4", "LHPF4" }, \
1127 { name, "ASRC1L", "ASRC1L" }, \
1128 { name, "ASRC1R", "ASRC1R" }, \
1129 { name, "ASRC2L", "ASRC2L" }, \
1130 { name, "ASRC2R", "ASRC2R" }
1133 {
"AIF2 Capture",
NULL,
"DBVDD2" },
1134 {
"AIF2 Playback",
NULL,
"DBVDD2" },
1136 {
"AIF3 Capture",
NULL,
"DBVDD3" },
1137 {
"AIF3 Playback",
NULL,
"DBVDD3" },
1139 {
"OUT1L",
NULL,
"CPVDD" },
1140 {
"OUT1R",
NULL,
"CPVDD" },
1141 {
"OUT2L",
NULL,
"CPVDD" },
1142 {
"OUT2R",
NULL,
"CPVDD" },
1143 {
"OUT3L",
NULL,
"CPVDD" },
1145 {
"OUT4L",
NULL,
"SPKVDDL" },
1146 {
"OUT4R",
NULL,
"SPKVDDR" },
1148 {
"OUT1L",
NULL,
"SYSCLK" },
1149 {
"OUT1R",
NULL,
"SYSCLK" },
1150 {
"OUT2L",
NULL,
"SYSCLK" },
1151 {
"OUT2R",
NULL,
"SYSCLK" },
1152 {
"OUT3L",
NULL,
"SYSCLK" },
1153 {
"OUT4L",
NULL,
"SYSCLK" },
1154 {
"OUT4R",
NULL,
"SYSCLK" },
1155 {
"OUT5L",
NULL,
"SYSCLK" },
1156 {
"OUT5R",
NULL,
"SYSCLK" },
1158 {
"MICBIAS1",
NULL,
"MICVDD" },
1159 {
"MICBIAS2",
NULL,
"MICVDD" },
1160 {
"MICBIAS3",
NULL,
"MICVDD" },
1162 {
"Noise Generator",
NULL,
"NOISE" },
1163 {
"Tone Generator 1",
NULL,
"TONE" },
1164 {
"Tone Generator 2",
NULL,
"TONE" },
1166 {
"Mic Mute Mixer",
NULL,
"Noise Mixer" },
1167 {
"Mic Mute Mixer",
NULL,
"Mic Mixer" },
1169 {
"AIF1 Capture",
NULL,
"AIF1TX1" },
1170 {
"AIF1 Capture",
NULL,
"AIF1TX2" },
1171 {
"AIF1 Capture",
NULL,
"AIF1TX3" },
1172 {
"AIF1 Capture",
NULL,
"AIF1TX4" },
1173 {
"AIF1 Capture",
NULL,
"AIF1TX5" },
1174 {
"AIF1 Capture",
NULL,
"AIF1TX6" },
1175 {
"AIF1 Capture",
NULL,
"AIF1TX7" },
1176 {
"AIF1 Capture",
NULL,
"AIF1TX8" },
1178 {
"AIF1RX1",
NULL,
"AIF1 Playback" },
1179 {
"AIF1RX2",
NULL,
"AIF1 Playback" },
1180 {
"AIF1RX3",
NULL,
"AIF1 Playback" },
1181 {
"AIF1RX4",
NULL,
"AIF1 Playback" },
1182 {
"AIF1RX5",
NULL,
"AIF1 Playback" },
1183 {
"AIF1RX6",
NULL,
"AIF1 Playback" },
1184 {
"AIF1RX7",
NULL,
"AIF1 Playback" },
1185 {
"AIF1RX8",
NULL,
"AIF1 Playback" },
1187 {
"AIF2 Capture",
NULL,
"AIF2TX1" },
1188 {
"AIF2 Capture",
NULL,
"AIF2TX2" },
1190 {
"AIF2RX1",
NULL,
"AIF2 Playback" },
1191 {
"AIF2RX2",
NULL,
"AIF2 Playback" },
1193 {
"AIF3 Capture",
NULL,
"AIF3TX1" },
1194 {
"AIF3 Capture",
NULL,
"AIF3TX2" },
1196 {
"AIF3RX1",
NULL,
"AIF3 Playback" },
1197 {
"AIF3RX2",
NULL,
"AIF3 Playback" },
1199 {
"AIF1 Playback",
NULL,
"SYSCLK" },
1200 {
"AIF2 Playback",
NULL,
"SYSCLK" },
1201 {
"AIF3 Playback",
NULL,
"SYSCLK" },
1203 {
"AIF1 Capture",
NULL,
"SYSCLK" },
1204 {
"AIF2 Capture",
NULL,
"SYSCLK" },
1205 {
"AIF3 Capture",
NULL,
"SYSCLK" },
1207 {
"IN1L PGA",
NULL,
"IN1L" },
1208 {
"IN1R PGA",
NULL,
"IN1R" },
1210 {
"IN2L PGA",
NULL,
"IN2L" },
1211 {
"IN2R PGA",
NULL,
"IN2R" },
1213 {
"IN3L PGA",
NULL,
"IN3L" },
1214 {
"IN3R PGA",
NULL,
"IN3R" },
1263 {
"AEC Loopback",
"HPOUT1L",
"OUT1L" },
1264 {
"AEC Loopback",
"HPOUT1R",
"OUT1R" },
1265 {
"HPOUT1L",
NULL,
"OUT1L" },
1266 {
"HPOUT1R",
NULL,
"OUT1R" },
1268 {
"AEC Loopback",
"HPOUT2L",
"OUT2L" },
1269 {
"AEC Loopback",
"HPOUT2R",
"OUT2R" },
1270 {
"HPOUT2L",
NULL,
"OUT2L" },
1271 {
"HPOUT2R",
NULL,
"OUT2R" },
1273 {
"AEC Loopback",
"EPOUT",
"OUT3L" },
1274 {
"EPOUTN",
NULL,
"OUT3L" },
1275 {
"EPOUTP",
NULL,
"OUT3L" },
1277 {
"AEC Loopback",
"SPKOUTL",
"OUT4L" },
1278 {
"SPKOUTLN",
NULL,
"OUT4L" },
1279 {
"SPKOUTLP",
NULL,
"OUT4L" },
1281 {
"AEC Loopback",
"SPKOUTR",
"OUT4R" },
1282 {
"SPKOUTRN",
NULL,
"OUT4R" },
1283 {
"SPKOUTRP",
NULL,
"OUT4R" },
1285 {
"AEC Loopback",
"SPKDAT1L",
"OUT5L" },
1286 {
"AEC Loopback",
"SPKDAT1R",
"OUT5R" },
1287 {
"SPKDAT1L",
NULL,
"OUT5L" },
1288 {
"SPKDAT1R",
NULL,
"OUT5R" },
1292 unsigned int Fref,
unsigned int Fout)
1294 struct wm5102_priv *wm5102 = snd_soc_codec_get_drvdata(codec);
1306 #define WM5102_RATES SNDRV_PCM_RATE_8000_192000
1308 #define WM5102_FORMATS (SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S20_3LE |\
1309 SNDRV_PCM_FMTBIT_S24_LE | SNDRV_PCM_FMTBIT_S32_LE)
1313 .name =
"wm5102-aif1",
1317 .stream_name =
"AIF1 Playback",
1324 .stream_name =
"AIF1 Capture",
1331 .symmetric_rates = 1,
1334 .name =
"wm5102-aif2",
1338 .stream_name =
"AIF2 Playback",
1345 .stream_name =
"AIF2 Capture",
1352 .symmetric_rates = 1,
1355 .name =
"wm5102-aif3",
1359 .stream_name =
"AIF3 Playback",
1366 .stream_name =
"AIF3 Capture",
1373 .symmetric_rates = 1,
1385 #define WM5102_DIG_VU 0x0200
1387 static unsigned int wm5102_digital_vu[] = {
1408 .probe = wm5102_codec_probe,
1410 .idle_bias_off =
true,
1413 .set_pll = wm5102_set_fll,
1415 .controls = wm5102_snd_controls,
1416 .num_controls =
ARRAY_SIZE(wm5102_snd_controls),
1417 .dapm_widgets = wm5102_dapm_widgets,
1418 .num_dapm_widgets =
ARRAY_SIZE(wm5102_dapm_widgets),
1419 .dapm_routes = wm5102_dapm_routes,
1420 .num_dapm_routes =
ARRAY_SIZE(wm5102_dapm_routes),
1433 platform_set_drvdata(pdev, wm5102);
1435 wm5102->
core.arizona = arizona;
1438 wm5102->
fll[i].vco_mult = 1;
1451 for (i = 0; i <
ARRAY_SIZE(wm5102_digital_vu); i++)
1456 pm_runtime_idle(&pdev->
dev);
1465 pm_runtime_disable(&pdev->
dev);
1472 .name =
"wm5102-codec",
1475 .probe = wm5102_probe,