|
34 | 34 |
|
35 | 35 | #define NAU8825_HS_PRESENT BIT(0) |
36 | 36 | #define RT5682S_HS_PRESENT BIT(1) |
| 37 | +#define ES8326_HS_PRESENT BIT(2) |
| 38 | +#define MAX98390_TWO_AMP BIT(3) |
37 | 39 | /* |
38 | 40 | * Maxim MAX98390 |
39 | 41 | */ |
|
48 | 50 | */ |
49 | 51 | #define NAU8825_CODEC_DAI "nau8825-hifi" |
50 | 52 |
|
| 53 | +/* |
| 54 | + * ES8326 |
| 55 | + */ |
| 56 | +#define ES8326_CODEC_DAI "ES8326 HiFi" |
| 57 | + |
51 | 58 | #define SOF_DMA_DL2 "SOF_DMA_DL2" |
52 | 59 | #define SOF_DMA_DL3 "SOF_DMA_DL3" |
53 | 60 | #define SOF_DMA_UL4 "SOF_DMA_UL4" |
@@ -726,7 +733,7 @@ static int mt8188_max98390_codec_init(struct snd_soc_pcm_runtime *rtd) |
726 | 733 | return 0; |
727 | 734 | } |
728 | 735 |
|
729 | | -static int mt8188_nau8825_codec_init(struct snd_soc_pcm_runtime *rtd) |
| 736 | +static int mt8188_headset_codec_init(struct snd_soc_pcm_runtime *rtd) |
730 | 737 | { |
731 | 738 | struct snd_soc_card *card = rtd->card; |
732 | 739 | struct mtk_soc_card_data *soc_card_data = snd_soc_card_get_drvdata(card); |
@@ -775,68 +782,13 @@ static int mt8188_nau8825_codec_init(struct snd_soc_pcm_runtime *rtd) |
775 | 782 | return 0; |
776 | 783 | }; |
777 | 784 |
|
778 | | -static int mt8188_rt5682s_codec_init(struct snd_soc_pcm_runtime *rtd) |
779 | | -{ |
780 | | - struct snd_soc_card *card = rtd->card; |
781 | | - struct mtk_soc_card_data *soc_card_data = snd_soc_card_get_drvdata(card); |
782 | | - struct mt8188_mt6359_priv *priv = soc_card_data->mach_priv; |
783 | | - struct snd_soc_component *component = snd_soc_rtd_to_codec(rtd, 0)->component; |
784 | | - struct snd_soc_jack *jack = &priv->headset_jack; |
785 | | - int ret; |
786 | | - |
787 | | - ret = snd_soc_dapm_new_controls(&card->dapm, mt8188_nau8825_widgets, |
788 | | - ARRAY_SIZE(mt8188_nau8825_widgets)); |
789 | | - if (ret) { |
790 | | - dev_err(rtd->dev, "unable to add rt5682s card widget, ret %d\n", ret); |
791 | | - return ret; |
792 | | - } |
793 | | - |
794 | | - ret = snd_soc_add_card_controls(card, mt8188_nau8825_controls, |
795 | | - ARRAY_SIZE(mt8188_nau8825_controls)); |
796 | | - if (ret) { |
797 | | - dev_err(rtd->dev, "unable to add rt5682s card controls, ret %d\n", ret); |
798 | | - return ret; |
799 | | - } |
800 | | - |
801 | | - ret = snd_soc_card_jack_new_pins(rtd->card, "Headset Jack", |
802 | | - SND_JACK_HEADSET | SND_JACK_BTN_0 | |
803 | | - SND_JACK_BTN_1 | SND_JACK_BTN_2 | |
804 | | - SND_JACK_BTN_3, |
805 | | - jack, |
806 | | - nau8825_jack_pins, |
807 | | - ARRAY_SIZE(nau8825_jack_pins)); |
808 | | - if (ret) { |
809 | | - dev_err(rtd->dev, "Headset Jack creation failed: %d\n", ret); |
810 | | - return ret; |
811 | | - } |
812 | | - |
813 | | - snd_jack_set_key(jack->jack, SND_JACK_BTN_0, KEY_PLAYPAUSE); |
814 | | - snd_jack_set_key(jack->jack, SND_JACK_BTN_1, KEY_VOICECOMMAND); |
815 | | - snd_jack_set_key(jack->jack, SND_JACK_BTN_2, KEY_VOLUMEUP); |
816 | | - snd_jack_set_key(jack->jack, SND_JACK_BTN_3, KEY_VOLUMEDOWN); |
817 | | - ret = snd_soc_component_set_jack(component, jack, NULL); |
818 | | - |
819 | | - if (ret) { |
820 | | - dev_err(rtd->dev, "Headset Jack call-back failed: %d\n", ret); |
821 | | - return ret; |
822 | | - } |
823 | | - |
824 | | - return 0; |
825 | | -}; |
826 | | - |
827 | | -static void mt8188_nau8825_codec_exit(struct snd_soc_pcm_runtime *rtd) |
| 785 | +static void mt8188_headset_codec_exit(struct snd_soc_pcm_runtime *rtd) |
828 | 786 | { |
829 | 787 | struct snd_soc_component *component = snd_soc_rtd_to_codec(rtd, 0)->component; |
830 | 788 |
|
831 | 789 | snd_soc_component_set_jack(component, NULL, NULL); |
832 | 790 | } |
833 | 791 |
|
834 | | -static void mt8188_rt5682s_codec_exit(struct snd_soc_pcm_runtime *rtd) |
835 | | -{ |
836 | | - struct snd_soc_component *component = snd_soc_rtd_to_codec(rtd, 0)->component; |
837 | | - |
838 | | - snd_soc_component_set_jack(component, NULL, NULL); |
839 | | -} |
840 | 792 |
|
841 | 793 | static int mt8188_nau8825_hw_params(struct snd_pcm_substream *substream, |
842 | 794 | struct snd_pcm_hw_params *params) |
@@ -943,6 +895,30 @@ static const struct snd_soc_ops mt8188_sof_be_ops = { |
943 | 895 | .hw_params = mt8188_sof_be_hw_params, |
944 | 896 | }; |
945 | 897 |
|
| 898 | +static int mt8188_es8326_hw_params(struct snd_pcm_substream *substream, |
| 899 | + struct snd_pcm_hw_params *params) |
| 900 | +{ |
| 901 | + struct snd_soc_pcm_runtime *rtd = snd_soc_substream_to_rtd(substream); |
| 902 | + struct snd_soc_dai *cpu_dai = snd_soc_rtd_to_cpu(rtd, 0); |
| 903 | + struct snd_soc_dai *codec_dai = snd_soc_rtd_to_codec(rtd, 0); |
| 904 | + unsigned int rate = params_rate(params); |
| 905 | + int ret; |
| 906 | + |
| 907 | + /* Configure MCLK for codec */ |
| 908 | + ret = snd_soc_dai_set_sysclk(codec_dai, 0, rate * 256, SND_SOC_CLOCK_IN); |
| 909 | + if (ret < 0) { |
| 910 | + dev_err(codec_dai->dev, "can't set MCLK %d\n", ret); |
| 911 | + return ret; |
| 912 | + } |
| 913 | + |
| 914 | + /* Configure MCLK for cpu */ |
| 915 | + return snd_soc_dai_set_sysclk(cpu_dai, 0, rate * 256, SND_SOC_CLOCK_OUT); |
| 916 | +} |
| 917 | + |
| 918 | +static const struct snd_soc_ops mt8188_es8326_ops = { |
| 919 | + .hw_params = mt8188_es8326_hw_params, |
| 920 | +}; |
| 921 | + |
946 | 922 | static struct snd_soc_dai_link mt8188_mt6359_dai_links[] = { |
947 | 923 | /* FE */ |
948 | 924 | [DAI_LINK_DL2_FE] = { |
@@ -1252,7 +1228,7 @@ static void mt8188_fixup_controls(struct snd_soc_card *card) |
1252 | 1228 | struct mt8188_card_data *card_data = (struct mt8188_card_data *)priv->private_data; |
1253 | 1229 | struct snd_kcontrol *kctl; |
1254 | 1230 |
|
1255 | | - if (card_data->quirk & (NAU8825_HS_PRESENT | RT5682S_HS_PRESENT)) { |
| 1231 | + if (card_data->quirk & (NAU8825_HS_PRESENT | RT5682S_HS_PRESENT | ES8326_HS_PRESENT)) { |
1256 | 1232 | struct snd_soc_dapm_widget *w, *next_w; |
1257 | 1233 |
|
1258 | 1234 | for_each_card_widgets_safe(card, w, next_w) { |
@@ -1293,6 +1269,7 @@ static int mt8188_mt6359_dev_probe(struct platform_device *pdev) |
1293 | 1269 | struct mt8188_card_data *card_data; |
1294 | 1270 | struct snd_soc_dai_link *dai_link; |
1295 | 1271 | bool init_mt6359 = false; |
| 1272 | + bool init_es8326 = false; |
1296 | 1273 | bool init_nau8825 = false; |
1297 | 1274 | bool init_rt5682s = false; |
1298 | 1275 | bool init_max98390 = false; |
@@ -1399,25 +1376,39 @@ static int mt8188_mt6359_dev_probe(struct platform_device *pdev) |
1399 | 1376 | strcmp(dai_link->name, "ETDM1_IN_BE") == 0 || |
1400 | 1377 | strcmp(dai_link->name, "ETDM2_IN_BE") == 0) { |
1401 | 1378 | if (!strcmp(dai_link->codecs->dai_name, MAX98390_CODEC_DAI)) { |
1402 | | - dai_link->ops = &mt8188_max98390_ops; |
| 1379 | + /* |
| 1380 | + * The TDM protocol settings with fixed 4 slots are defined in |
| 1381 | + * mt8188_max98390_ops. Two amps is I2S mode, |
| 1382 | + * SOC and codec don't require TDM settings. |
| 1383 | + */ |
| 1384 | + if (!(card_data->quirk & MAX98390_TWO_AMP)) { |
| 1385 | + dai_link->ops = &mt8188_max98390_ops; |
| 1386 | + } |
1403 | 1387 | if (!init_max98390) { |
1404 | 1388 | dai_link->init = mt8188_max98390_codec_init; |
1405 | 1389 | init_max98390 = true; |
1406 | 1390 | } |
1407 | 1391 | } else if (!strcmp(dai_link->codecs->dai_name, NAU8825_CODEC_DAI)) { |
1408 | 1392 | dai_link->ops = &mt8188_nau8825_ops; |
1409 | 1393 | if (!init_nau8825) { |
1410 | | - dai_link->init = mt8188_nau8825_codec_init; |
1411 | | - dai_link->exit = mt8188_nau8825_codec_exit; |
| 1394 | + dai_link->init = mt8188_headset_codec_init; |
| 1395 | + dai_link->exit = mt8188_headset_codec_exit; |
1412 | 1396 | init_nau8825 = true; |
1413 | 1397 | } |
1414 | 1398 | } else if (!strcmp(dai_link->codecs->dai_name, RT5682S_CODEC_DAI)) { |
1415 | 1399 | dai_link->ops = &mt8188_rt5682s_i2s_ops; |
1416 | 1400 | if (!init_rt5682s) { |
1417 | | - dai_link->init = mt8188_rt5682s_codec_init; |
1418 | | - dai_link->exit = mt8188_rt5682s_codec_exit; |
| 1401 | + dai_link->init = mt8188_headset_codec_init; |
| 1402 | + dai_link->exit = mt8188_headset_codec_exit; |
1419 | 1403 | init_rt5682s = true; |
1420 | 1404 | } |
| 1405 | + } else if (!strcmp(dai_link->codecs->dai_name, ES8326_CODEC_DAI)) { |
| 1406 | + dai_link->ops = &mt8188_es8326_ops; |
| 1407 | + if (!init_es8326) { |
| 1408 | + dai_link->init = mt8188_headset_codec_init; |
| 1409 | + dai_link->exit = mt8188_headset_codec_exit; |
| 1410 | + init_es8326 = true; |
| 1411 | + } |
1421 | 1412 | } else { |
1422 | 1413 | if (strcmp(dai_link->codecs->dai_name, "snd-soc-dummy-dai")) { |
1423 | 1414 | if (!init_dumb) { |
@@ -1457,13 +1448,19 @@ static struct mt8188_card_data mt8188_nau8825_card = { |
1457 | 1448 |
|
1458 | 1449 | static struct mt8188_card_data mt8188_rt5682s_card = { |
1459 | 1450 | .name = "mt8188_rt5682s", |
1460 | | - .quirk = RT5682S_HS_PRESENT, |
| 1451 | + .quirk = RT5682S_HS_PRESENT | MAX98390_TWO_AMP, |
| 1452 | +}; |
| 1453 | + |
| 1454 | +static struct mt8188_card_data mt8188_es8326_card = { |
| 1455 | + .name = "mt8188_es8326", |
| 1456 | + .quirk = ES8326_HS_PRESENT | MAX98390_TWO_AMP, |
1461 | 1457 | }; |
1462 | 1458 |
|
1463 | 1459 | static const struct of_device_id mt8188_mt6359_dt_match[] = { |
1464 | 1460 | { .compatible = "mediatek,mt8188-mt6359-evb", .data = &mt8188_evb_card, }, |
1465 | 1461 | { .compatible = "mediatek,mt8188-nau8825", .data = &mt8188_nau8825_card, }, |
1466 | 1462 | { .compatible = "mediatek,mt8188-rt5682s", .data = &mt8188_rt5682s_card, }, |
| 1463 | + { .compatible = "mediatek,mt8188-es8326", .data = &mt8188_es8326_card, }, |
1467 | 1464 | { /* sentinel */ }, |
1468 | 1465 | }; |
1469 | 1466 | MODULE_DEVICE_TABLE(of, mt8188_mt6359_dt_match); |
|
0 commit comments