diff options
-rw-r--r-- | sound/soc/codecs/Kconfig | 2 | ||||
-rw-r--r-- | sound/soc/codecs/wm5110.c | 119 |
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 | |||
163 | config SND_SOC_WM_ADSP | 163 | config 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 | ||
170 | config SND_SOC_AB8500_CODEC | 172 | config 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 | |||
35 | struct wm5110_priv { | 38 | struct 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 | ||
43 | static 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 | |||
50 | static 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 | |||
57 | static 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 | |||
64 | static 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 | |||
71 | static 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 | |||
40 | static const struct reg_default wm5110_sysclk_revd_patch[] = { | 78 | static 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); | |||
395 | ARIZONA_MIXER_ENUMS(LHPF3, ARIZONA_HPLP3MIX_INPUT_1_SOURCE); | 433 | ARIZONA_MIXER_ENUMS(LHPF3, ARIZONA_HPLP3MIX_INPUT_1_SOURCE); |
396 | ARIZONA_MIXER_ENUMS(LHPF4, ARIZONA_HPLP4MIX_INPUT_1_SOURCE); | 434 | ARIZONA_MIXER_ENUMS(LHPF4, ARIZONA_HPLP4MIX_INPUT_1_SOURCE); |
397 | 435 | ||
436 | ARIZONA_MIXER_ENUMS(DSP1L, ARIZONA_DSP1LMIX_INPUT_1_SOURCE); | ||
437 | ARIZONA_MIXER_ENUMS(DSP1R, ARIZONA_DSP1RMIX_INPUT_1_SOURCE); | ||
438 | ARIZONA_DSP_AUX_ENUMS(DSP1, ARIZONA_DSP1AUX1MIX_INPUT_1_SOURCE); | ||
439 | |||
440 | ARIZONA_MIXER_ENUMS(DSP2L, ARIZONA_DSP2LMIX_INPUT_1_SOURCE); | ||
441 | ARIZONA_MIXER_ENUMS(DSP2R, ARIZONA_DSP2RMIX_INPUT_1_SOURCE); | ||
442 | ARIZONA_DSP_AUX_ENUMS(DSP2, ARIZONA_DSP2AUX1MIX_INPUT_1_SOURCE); | ||
443 | |||
444 | ARIZONA_MIXER_ENUMS(DSP3L, ARIZONA_DSP3LMIX_INPUT_1_SOURCE); | ||
445 | ARIZONA_MIXER_ENUMS(DSP3R, ARIZONA_DSP3RMIX_INPUT_1_SOURCE); | ||
446 | ARIZONA_DSP_AUX_ENUMS(DSP3, ARIZONA_DSP3AUX1MIX_INPUT_1_SOURCE); | ||
447 | |||
448 | ARIZONA_MIXER_ENUMS(DSP4L, ARIZONA_DSP4LMIX_INPUT_1_SOURCE); | ||
449 | ARIZONA_MIXER_ENUMS(DSP4R, ARIZONA_DSP4RMIX_INPUT_1_SOURCE); | ||
450 | ARIZONA_DSP_AUX_ENUMS(DSP4, ARIZONA_DSP4AUX1MIX_INPUT_1_SOURCE); | ||
451 | |||
398 | ARIZONA_MIXER_ENUMS(Mic, ARIZONA_MICMIX_INPUT_1_SOURCE); | 452 | ARIZONA_MIXER_ENUMS(Mic, ARIZONA_MICMIX_INPUT_1_SOURCE); |
399 | ARIZONA_MIXER_ENUMS(Noise, ARIZONA_NOISEMIX_INPUT_1_SOURCE); | 453 | ARIZONA_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, | |||
587 | SND_SOC_DAPM_PGA("ASRC2R", ARIZONA_ASRC_ENABLE, ARIZONA_ASRC2R_ENA_SHIFT, 0, | 641 | SND_SOC_DAPM_PGA("ASRC2R", ARIZONA_ASRC_ENABLE, ARIZONA_ASRC2R_ENA_SHIFT, 0, |
588 | NULL, 0), | 642 | NULL, 0), |
589 | 643 | ||
644 | WM_ADSP2("DSP1", 0), | ||
645 | WM_ADSP2("DSP2", 1), | ||
646 | WM_ADSP2("DSP3", 2), | ||
647 | WM_ADSP2("DSP4", 3), | ||
648 | |||
590 | SND_SOC_DAPM_VALUE_MUX("AEC Loopback", ARIZONA_DAC_AEC_CONTROL_1, | 649 | SND_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"), | |||
809 | ARIZONA_MUX_WIDGETS(ASRC2L, "ASRC2L"), | 868 | ARIZONA_MUX_WIDGETS(ASRC2L, "ASRC2L"), |
810 | ARIZONA_MUX_WIDGETS(ASRC2R, "ASRC2R"), | 869 | ARIZONA_MUX_WIDGETS(ASRC2R, "ASRC2R"), |
811 | 870 | ||
871 | ARIZONA_DSP_WIDGETS(DSP1, "DSP1"), | ||
872 | ARIZONA_DSP_WIDGETS(DSP2, "DSP2"), | ||
873 | ARIZONA_DSP_WIDGETS(DSP3, "DSP3"), | ||
874 | ARIZONA_DSP_WIDGETS(DSP4, "DSP4"), | ||
875 | |||
812 | SND_SOC_DAPM_OUTPUT("HPOUT1L"), | 876 | SND_SOC_DAPM_OUTPUT("HPOUT1L"), |
813 | SND_SOC_DAPM_OUTPUT("HPOUT1R"), | 877 | SND_SOC_DAPM_OUTPUT("HPOUT1R"), |
814 | SND_SOC_DAPM_OUTPUT("HPOUT2L"), | 878 | SND_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 | ||
886 | static const struct snd_soc_dapm_route wm5110_dapm_routes[] = { | 974 | static 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 | ||