aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--sound/soc/codecs/Kconfig2
-rw-r--r--sound/soc/codecs/wm5110.c119
2 files changed, 119 insertions, 2 deletions
diff --git a/sound/soc/codecs/Kconfig b/sound/soc/codecs/Kconfig
index b33b45dfceec..983d087aa92a 100644
--- a/sound/soc/codecs/Kconfig
+++ b/sound/soc/codecs/Kconfig
@@ -163,8 +163,10 @@ config SND_SOC_WM_HUBS
163config SND_SOC_WM_ADSP 163config SND_SOC_WM_ADSP
164 tristate 164 tristate
165 default y if SND_SOC_WM5102=y 165 default y if SND_SOC_WM5102=y
166 default y if SND_SOC_WM5110=y
166 default y if SND_SOC_WM2200=y 167 default y if SND_SOC_WM2200=y
167 default m if SND_SOC_WM5102=m 168 default m if SND_SOC_WM5102=m
169 default m if SND_SOC_WM5110=m
168 default m if SND_SOC_WM2200=m 170 default m if SND_SOC_WM2200=m
169 171
170config SND_SOC_AB8500_CODEC 172config SND_SOC_AB8500_CODEC
diff --git a/sound/soc/codecs/wm5110.c b/sound/soc/codecs/wm5110.c
index c6dbc1ddaf7f..e5f2804086a1 100644
--- a/sound/soc/codecs/wm5110.c
+++ b/sound/soc/codecs/wm5110.c
@@ -30,13 +30,51 @@
30#include <linux/mfd/arizona/registers.h> 30#include <linux/mfd/arizona/registers.h>
31 31
32#include "arizona.h" 32#include "arizona.h"
33#include "wm_adsp.h"
33#include "wm5110.h" 34#include "wm5110.h"
34 35
36#define WM5110_NUM_ADSP 4
37
35struct wm5110_priv { 38struct wm5110_priv {
36 struct arizona_priv core; 39 struct arizona_priv core;
37 struct arizona_fll fll[2]; 40 struct arizona_fll fll[2];
38}; 41};
39 42
43static const struct wm_adsp_region wm5110_dsp1_regions[] = {
44 { .type = WMFW_ADSP2_PM, .base = 0x100000 },
45 { .type = WMFW_ADSP2_ZM, .base = 0x180000 },
46 { .type = WMFW_ADSP2_XM, .base = 0x190000 },
47 { .type = WMFW_ADSP2_YM, .base = 0x1a8000 },
48};
49
50static const struct wm_adsp_region wm5110_dsp2_regions[] = {
51 { .type = WMFW_ADSP2_PM, .base = 0x200000 },
52 { .type = WMFW_ADSP2_ZM, .base = 0x280000 },
53 { .type = WMFW_ADSP2_XM, .base = 0x290000 },
54 { .type = WMFW_ADSP2_YM, .base = 0x2a8000 },
55};
56
57static const struct wm_adsp_region wm5110_dsp3_regions[] = {
58 { .type = WMFW_ADSP2_PM, .base = 0x300000 },
59 { .type = WMFW_ADSP2_ZM, .base = 0x380000 },
60 { .type = WMFW_ADSP2_XM, .base = 0x390000 },
61 { .type = WMFW_ADSP2_YM, .base = 0x3a8000 },
62};
63
64static const struct wm_adsp_region wm5110_dsp4_regions[] = {
65 { .type = WMFW_ADSP2_PM, .base = 0x400000 },
66 { .type = WMFW_ADSP2_ZM, .base = 0x480000 },
67 { .type = WMFW_ADSP2_XM, .base = 0x490000 },
68 { .type = WMFW_ADSP2_YM, .base = 0x4a8000 },
69};
70
71static const struct wm_adsp_region *wm5110_dsp_regions[] = {
72 wm5110_dsp1_regions,
73 wm5110_dsp2_regions,
74 wm5110_dsp3_regions,
75 wm5110_dsp4_regions,
76};
77
40static const struct reg_default wm5110_sysclk_revd_patch[] = { 78static const struct reg_default wm5110_sysclk_revd_patch[] = {
41 { 0x3093, 0x1001 }, 79 { 0x3093, 0x1001 },
42 { 0x30E3, 0x1301 }, 80 { 0x30E3, 0x1301 },
@@ -395,6 +433,22 @@ ARIZONA_MIXER_ENUMS(LHPF2, ARIZONA_HPLP2MIX_INPUT_1_SOURCE);
395ARIZONA_MIXER_ENUMS(LHPF3, ARIZONA_HPLP3MIX_INPUT_1_SOURCE); 433ARIZONA_MIXER_ENUMS(LHPF3, ARIZONA_HPLP3MIX_INPUT_1_SOURCE);
396ARIZONA_MIXER_ENUMS(LHPF4, ARIZONA_HPLP4MIX_INPUT_1_SOURCE); 434ARIZONA_MIXER_ENUMS(LHPF4, ARIZONA_HPLP4MIX_INPUT_1_SOURCE);
397 435
436ARIZONA_MIXER_ENUMS(DSP1L, ARIZONA_DSP1LMIX_INPUT_1_SOURCE);
437ARIZONA_MIXER_ENUMS(DSP1R, ARIZONA_DSP1RMIX_INPUT_1_SOURCE);
438ARIZONA_DSP_AUX_ENUMS(DSP1, ARIZONA_DSP1AUX1MIX_INPUT_1_SOURCE);
439
440ARIZONA_MIXER_ENUMS(DSP2L, ARIZONA_DSP2LMIX_INPUT_1_SOURCE);
441ARIZONA_MIXER_ENUMS(DSP2R, ARIZONA_DSP2RMIX_INPUT_1_SOURCE);
442ARIZONA_DSP_AUX_ENUMS(DSP2, ARIZONA_DSP2AUX1MIX_INPUT_1_SOURCE);
443
444ARIZONA_MIXER_ENUMS(DSP3L, ARIZONA_DSP3LMIX_INPUT_1_SOURCE);
445ARIZONA_MIXER_ENUMS(DSP3R, ARIZONA_DSP3RMIX_INPUT_1_SOURCE);
446ARIZONA_DSP_AUX_ENUMS(DSP3, ARIZONA_DSP3AUX1MIX_INPUT_1_SOURCE);
447
448ARIZONA_MIXER_ENUMS(DSP4L, ARIZONA_DSP4LMIX_INPUT_1_SOURCE);
449ARIZONA_MIXER_ENUMS(DSP4R, ARIZONA_DSP4RMIX_INPUT_1_SOURCE);
450ARIZONA_DSP_AUX_ENUMS(DSP4, ARIZONA_DSP4AUX1MIX_INPUT_1_SOURCE);
451
398ARIZONA_MIXER_ENUMS(Mic, ARIZONA_MICMIX_INPUT_1_SOURCE); 452ARIZONA_MIXER_ENUMS(Mic, ARIZONA_MICMIX_INPUT_1_SOURCE);
399ARIZONA_MIXER_ENUMS(Noise, ARIZONA_NOISEMIX_INPUT_1_SOURCE); 453ARIZONA_MIXER_ENUMS(Noise, ARIZONA_NOISEMIX_INPUT_1_SOURCE);
400 454
@@ -587,6 +641,11 @@ SND_SOC_DAPM_PGA("ASRC2L", ARIZONA_ASRC_ENABLE, ARIZONA_ASRC2L_ENA_SHIFT, 0,
587SND_SOC_DAPM_PGA("ASRC2R", ARIZONA_ASRC_ENABLE, ARIZONA_ASRC2R_ENA_SHIFT, 0, 641SND_SOC_DAPM_PGA("ASRC2R", ARIZONA_ASRC_ENABLE, ARIZONA_ASRC2R_ENA_SHIFT, 0,
588 NULL, 0), 642 NULL, 0),
589 643
644WM_ADSP2("DSP1", 0),
645WM_ADSP2("DSP2", 1),
646WM_ADSP2("DSP3", 2),
647WM_ADSP2("DSP4", 3),
648
590SND_SOC_DAPM_VALUE_MUX("AEC Loopback", ARIZONA_DAC_AEC_CONTROL_1, 649SND_SOC_DAPM_VALUE_MUX("AEC Loopback", ARIZONA_DAC_AEC_CONTROL_1,
591 ARIZONA_AEC_LOOPBACK_ENA_SHIFT, 0, 650 ARIZONA_AEC_LOOPBACK_ENA_SHIFT, 0,
592 &wm5110_aec_loopback_mux), 651 &wm5110_aec_loopback_mux),
@@ -809,6 +868,11 @@ ARIZONA_MUX_WIDGETS(ASRC1R, "ASRC1R"),
809ARIZONA_MUX_WIDGETS(ASRC2L, "ASRC2L"), 868ARIZONA_MUX_WIDGETS(ASRC2L, "ASRC2L"),
810ARIZONA_MUX_WIDGETS(ASRC2R, "ASRC2R"), 869ARIZONA_MUX_WIDGETS(ASRC2R, "ASRC2R"),
811 870
871ARIZONA_DSP_WIDGETS(DSP1, "DSP1"),
872ARIZONA_DSP_WIDGETS(DSP2, "DSP2"),
873ARIZONA_DSP_WIDGETS(DSP3, "DSP3"),
874ARIZONA_DSP_WIDGETS(DSP4, "DSP4"),
875
812SND_SOC_DAPM_OUTPUT("HPOUT1L"), 876SND_SOC_DAPM_OUTPUT("HPOUT1L"),
813SND_SOC_DAPM_OUTPUT("HPOUT1R"), 877SND_SOC_DAPM_OUTPUT("HPOUT1R"),
814SND_SOC_DAPM_OUTPUT("HPOUT2L"), 878SND_SOC_DAPM_OUTPUT("HPOUT2L"),
@@ -881,7 +945,31 @@ SND_SOC_DAPM_OUTPUT("MICSUPP"),
881 { name, "ASRC1L", "ASRC1L" }, \ 945 { name, "ASRC1L", "ASRC1L" }, \
882 { name, "ASRC1R", "ASRC1R" }, \ 946 { name, "ASRC1R", "ASRC1R" }, \
883 { name, "ASRC2L", "ASRC2L" }, \ 947 { name, "ASRC2L", "ASRC2L" }, \
884 { name, "ASRC2R", "ASRC2R" } 948 { name, "ASRC2R", "ASRC2R" }, \
949 { name, "DSP1.1", "DSP1" }, \
950 { name, "DSP1.2", "DSP1" }, \
951 { name, "DSP1.3", "DSP1" }, \
952 { name, "DSP1.4", "DSP1" }, \
953 { name, "DSP1.5", "DSP1" }, \
954 { name, "DSP1.6", "DSP1" }, \
955 { name, "DSP2.1", "DSP2" }, \
956 { name, "DSP2.2", "DSP2" }, \
957 { name, "DSP2.3", "DSP2" }, \
958 { name, "DSP2.4", "DSP2" }, \
959 { name, "DSP2.5", "DSP2" }, \
960 { name, "DSP2.6", "DSP2" }, \
961 { name, "DSP3.1", "DSP3" }, \
962 { name, "DSP3.2", "DSP3" }, \
963 { name, "DSP3.3", "DSP3" }, \
964 { name, "DSP3.4", "DSP3" }, \
965 { name, "DSP3.5", "DSP3" }, \
966 { name, "DSP3.6", "DSP3" }, \
967 { name, "DSP4.1", "DSP4" }, \
968 { name, "DSP4.2", "DSP4" }, \
969 { name, "DSP4.3", "DSP4" }, \
970 { name, "DSP4.4", "DSP4" }, \
971 { name, "DSP4.5", "DSP4" }, \
972 { name, "DSP4.6", "DSP4" }
885 973
886static const struct snd_soc_dapm_route wm5110_dapm_routes[] = { 974static const struct snd_soc_dapm_route wm5110_dapm_routes[] = {
887 { "AIF2 Capture", NULL, "DBVDD2" }, 975 { "AIF2 Capture", NULL, "DBVDD2" },
@@ -1087,6 +1175,11 @@ static const struct snd_soc_dapm_route wm5110_dapm_routes[] = {
1087 ARIZONA_MUX_ROUTES("ASRC2L", "ASRC2L"), 1175 ARIZONA_MUX_ROUTES("ASRC2L", "ASRC2L"),
1088 ARIZONA_MUX_ROUTES("ASRC2R", "ASRC2R"), 1176 ARIZONA_MUX_ROUTES("ASRC2R", "ASRC2R"),
1089 1177
1178 ARIZONA_DSP_ROUTES("DSP1"),
1179 ARIZONA_DSP_ROUTES("DSP2"),
1180 ARIZONA_DSP_ROUTES("DSP3"),
1181 ARIZONA_DSP_ROUTES("DSP4"),
1182
1090 { "AEC Loopback", "HPOUT1L", "OUT1L" }, 1183 { "AEC Loopback", "HPOUT1L", "OUT1L" },
1091 { "AEC Loopback", "HPOUT1R", "OUT1R" }, 1184 { "AEC Loopback", "HPOUT1R", "OUT1R" },
1092 { "HPOUT1L", NULL, "OUT1L" }, 1185 { "HPOUT1L", NULL, "OUT1L" },
@@ -1292,6 +1385,10 @@ static int wm5110_codec_probe(struct snd_soc_codec *codec)
1292 arizona_init_spk(codec); 1385 arizona_init_spk(codec);
1293 arizona_init_gpio(codec); 1386 arizona_init_gpio(codec);
1294 1387
1388 ret = snd_soc_add_codec_controls(codec, wm_adsp2_fw_controls, 8);
1389 if (ret != 0)
1390 return ret;
1391
1295 snd_soc_dapm_disable_pin(&codec->dapm, "HAPTICS"); 1392 snd_soc_dapm_disable_pin(&codec->dapm, "HAPTICS");
1296 1393
1297 priv->core.arizona->dapm = &codec->dapm; 1394 priv->core.arizona->dapm = &codec->dapm;
@@ -1346,7 +1443,7 @@ static int wm5110_probe(struct platform_device *pdev)
1346{ 1443{
1347 struct arizona *arizona = dev_get_drvdata(pdev->dev.parent); 1444 struct arizona *arizona = dev_get_drvdata(pdev->dev.parent);
1348 struct wm5110_priv *wm5110; 1445 struct wm5110_priv *wm5110;
1349 int i; 1446 int i, ret;
1350 1447
1351 wm5110 = devm_kzalloc(&pdev->dev, sizeof(struct wm5110_priv), 1448 wm5110 = devm_kzalloc(&pdev->dev, sizeof(struct wm5110_priv),
1352 GFP_KERNEL); 1449 GFP_KERNEL);
@@ -1357,6 +1454,24 @@ static int wm5110_probe(struct platform_device *pdev)
1357 wm5110->core.arizona = arizona; 1454 wm5110->core.arizona = arizona;
1358 wm5110->core.num_inputs = 8; 1455 wm5110->core.num_inputs = 8;
1359 1456
1457 for (i = 0; i < WM5110_NUM_ADSP; i++) {
1458 wm5110->core.adsp[i].part = "wm5110";
1459 wm5110->core.adsp[i].num = i + 1;
1460 wm5110->core.adsp[i].type = WMFW_ADSP2;
1461 wm5110->core.adsp[i].dev = arizona->dev;
1462 wm5110->core.adsp[i].regmap = arizona->regmap;
1463
1464 wm5110->core.adsp[i].base = ARIZONA_DSP1_CONTROL_1
1465 + (0x100 * i);
1466 wm5110->core.adsp[i].mem = wm5110_dsp_regions[i];
1467 wm5110->core.adsp[i].num_mems
1468 = ARRAY_SIZE(wm5110_dsp1_regions);
1469
1470 ret = wm_adsp2_init(&wm5110->core.adsp[i], false);
1471 if (ret != 0)
1472 return ret;
1473 }
1474
1360 for (i = 0; i < ARRAY_SIZE(wm5110->fll); i++) 1475 for (i = 0; i < ARRAY_SIZE(wm5110->fll); i++)
1361 wm5110->fll[i].vco_mult = 3; 1476 wm5110->fll[i].vco_mult = 3;
1362 1477