Commit e794a894 authored by Rui Zhou's avatar Rui Zhou Committed by Mark Brown

ASoC: mediatek: mt8188-mt6359: add es8326 support

To use ES8326 as the codec, add a new sound card
named mt8186_es8326.
Reviewed-by: default avatarTrevor Wu <trevor.wu@mediatek.com>
Signed-off-by: default avatarRui Zhou <zhourui@huaqin.corp-partner.google.com>
Reviewed-by: default avatarAngeloGioacchino Del Regno <angelogioacchino.delregno@collabora.com>
Link: https://msgid.link/r/20231212123050.4080083-4-zhourui@huaqin.corp-partner.google.comSigned-off-by: default avatarMark Brown <broonie@kernel.org>
parent 1a268000
...@@ -252,6 +252,7 @@ config SND_SOC_MT8188_MT6359 ...@@ -252,6 +252,7 @@ config SND_SOC_MT8188_MT6359
select SND_SOC_NAU8315 select SND_SOC_NAU8315
select SND_SOC_NAU8825 select SND_SOC_NAU8825
select SND_SOC_RT5682S select SND_SOC_RT5682S
select SND_SOC_ES8326
help help
This adds support for ASoC machine driver for MediaTek MT8188 This adds support for ASoC machine driver for MediaTek MT8188
boards with the MT6359 and other I2S audio codecs. boards with the MT6359 and other I2S audio codecs.
......
...@@ -34,6 +34,8 @@ ...@@ -34,6 +34,8 @@
#define NAU8825_HS_PRESENT BIT(0) #define NAU8825_HS_PRESENT BIT(0)
#define RT5682S_HS_PRESENT BIT(1) #define RT5682S_HS_PRESENT BIT(1)
#define ES8326_HS_PRESENT BIT(2)
#define MAX98390_TWO_AMP BIT(3)
/* /*
* Maxim MAX98390 * Maxim MAX98390
*/ */
...@@ -48,6 +50,11 @@ ...@@ -48,6 +50,11 @@
*/ */
#define NAU8825_CODEC_DAI "nau8825-hifi" #define NAU8825_CODEC_DAI "nau8825-hifi"
/*
* ES8326
*/
#define ES8326_CODEC_DAI "ES8326 HiFi"
#define SOF_DMA_DL2 "SOF_DMA_DL2" #define SOF_DMA_DL2 "SOF_DMA_DL2"
#define SOF_DMA_DL3 "SOF_DMA_DL3" #define SOF_DMA_DL3 "SOF_DMA_DL3"
#define SOF_DMA_UL4 "SOF_DMA_UL4" #define SOF_DMA_UL4 "SOF_DMA_UL4"
...@@ -888,6 +895,30 @@ static const struct snd_soc_ops mt8188_sof_be_ops = { ...@@ -888,6 +895,30 @@ static const struct snd_soc_ops mt8188_sof_be_ops = {
.hw_params = mt8188_sof_be_hw_params, .hw_params = mt8188_sof_be_hw_params,
}; };
static int mt8188_es8326_hw_params(struct snd_pcm_substream *substream,
struct snd_pcm_hw_params *params)
{
struct snd_soc_pcm_runtime *rtd = snd_soc_substream_to_rtd(substream);
struct snd_soc_dai *cpu_dai = snd_soc_rtd_to_cpu(rtd, 0);
struct snd_soc_dai *codec_dai = snd_soc_rtd_to_codec(rtd, 0);
unsigned int rate = params_rate(params);
int ret;
/* Configure MCLK for codec */
ret = snd_soc_dai_set_sysclk(codec_dai, 0, rate * 256, SND_SOC_CLOCK_IN);
if (ret < 0) {
dev_err(codec_dai->dev, "can't set MCLK %d\n", ret);
return ret;
}
/* Configure MCLK for cpu */
return snd_soc_dai_set_sysclk(cpu_dai, 0, rate * 256, SND_SOC_CLOCK_OUT);
}
static const struct snd_soc_ops mt8188_es8326_ops = {
.hw_params = mt8188_es8326_hw_params,
};
static struct snd_soc_dai_link mt8188_mt6359_dai_links[] = { static struct snd_soc_dai_link mt8188_mt6359_dai_links[] = {
/* FE */ /* FE */
[DAI_LINK_DL2_FE] = { [DAI_LINK_DL2_FE] = {
...@@ -1197,7 +1228,7 @@ static void mt8188_fixup_controls(struct snd_soc_card *card) ...@@ -1197,7 +1228,7 @@ static void mt8188_fixup_controls(struct snd_soc_card *card)
struct mt8188_card_data *card_data = (struct mt8188_card_data *)priv->private_data; struct mt8188_card_data *card_data = (struct mt8188_card_data *)priv->private_data;
struct snd_kcontrol *kctl; struct snd_kcontrol *kctl;
if (card_data->quirk & (NAU8825_HS_PRESENT | RT5682S_HS_PRESENT)) { if (card_data->quirk & (NAU8825_HS_PRESENT | RT5682S_HS_PRESENT | ES8326_HS_PRESENT)) {
struct snd_soc_dapm_widget *w, *next_w; struct snd_soc_dapm_widget *w, *next_w;
for_each_card_widgets_safe(card, w, next_w) { for_each_card_widgets_safe(card, w, next_w) {
...@@ -1238,6 +1269,7 @@ static int mt8188_mt6359_dev_probe(struct platform_device *pdev) ...@@ -1238,6 +1269,7 @@ static int mt8188_mt6359_dev_probe(struct platform_device *pdev)
struct mt8188_card_data *card_data; struct mt8188_card_data *card_data;
struct snd_soc_dai_link *dai_link; struct snd_soc_dai_link *dai_link;
bool init_mt6359 = false; bool init_mt6359 = false;
bool init_es8326 = false;
bool init_nau8825 = false; bool init_nau8825 = false;
bool init_rt5682s = false; bool init_rt5682s = false;
bool init_max98390 = false; bool init_max98390 = false;
...@@ -1344,7 +1376,14 @@ static int mt8188_mt6359_dev_probe(struct platform_device *pdev) ...@@ -1344,7 +1376,14 @@ static int mt8188_mt6359_dev_probe(struct platform_device *pdev)
strcmp(dai_link->name, "ETDM1_IN_BE") == 0 || strcmp(dai_link->name, "ETDM1_IN_BE") == 0 ||
strcmp(dai_link->name, "ETDM2_IN_BE") == 0) { strcmp(dai_link->name, "ETDM2_IN_BE") == 0) {
if (!strcmp(dai_link->codecs->dai_name, MAX98390_CODEC_DAI)) { if (!strcmp(dai_link->codecs->dai_name, MAX98390_CODEC_DAI)) {
/*
* The TDM protocol settings with fixed 4 slots are defined in
* mt8188_max98390_ops. Two amps is I2S mode,
* SOC and codec don't require TDM settings.
*/
if (!(card_data->quirk & MAX98390_TWO_AMP)) {
dai_link->ops = &mt8188_max98390_ops; dai_link->ops = &mt8188_max98390_ops;
}
if (!init_max98390) { if (!init_max98390) {
dai_link->init = mt8188_max98390_codec_init; dai_link->init = mt8188_max98390_codec_init;
init_max98390 = true; init_max98390 = true;
...@@ -1363,6 +1402,13 @@ static int mt8188_mt6359_dev_probe(struct platform_device *pdev) ...@@ -1363,6 +1402,13 @@ static int mt8188_mt6359_dev_probe(struct platform_device *pdev)
dai_link->exit = mt8188_headset_codec_exit; dai_link->exit = mt8188_headset_codec_exit;
init_rt5682s = true; init_rt5682s = true;
} }
} else if (!strcmp(dai_link->codecs->dai_name, ES8326_CODEC_DAI)) {
dai_link->ops = &mt8188_es8326_ops;
if (!init_es8326) {
dai_link->init = mt8188_headset_codec_init;
dai_link->exit = mt8188_headset_codec_exit;
init_es8326 = true;
}
} else { } else {
if (strcmp(dai_link->codecs->dai_name, "snd-soc-dummy-dai")) { if (strcmp(dai_link->codecs->dai_name, "snd-soc-dummy-dai")) {
if (!init_dumb) { if (!init_dumb) {
...@@ -1405,10 +1451,16 @@ static struct mt8188_card_data mt8188_rt5682s_card = { ...@@ -1405,10 +1451,16 @@ static struct mt8188_card_data mt8188_rt5682s_card = {
.quirk = RT5682S_HS_PRESENT, .quirk = RT5682S_HS_PRESENT,
}; };
static struct mt8188_card_data mt8188_es8326_card = {
.name = "mt8188_es8326",
.quirk = ES8326_HS_PRESENT | MAX98390_TWO_AMP,
};
static const struct of_device_id mt8188_mt6359_dt_match[] = { static const struct of_device_id mt8188_mt6359_dt_match[] = {
{ .compatible = "mediatek,mt8188-mt6359-evb", .data = &mt8188_evb_card, }, { .compatible = "mediatek,mt8188-mt6359-evb", .data = &mt8188_evb_card, },
{ .compatible = "mediatek,mt8188-nau8825", .data = &mt8188_nau8825_card, }, { .compatible = "mediatek,mt8188-nau8825", .data = &mt8188_nau8825_card, },
{ .compatible = "mediatek,mt8188-rt5682s", .data = &mt8188_rt5682s_card, }, { .compatible = "mediatek,mt8188-rt5682s", .data = &mt8188_rt5682s_card, },
{ .compatible = "mediatek,mt8188-es8326", .data = &mt8188_es8326_card, },
{ /* sentinel */ }, { /* sentinel */ },
}; };
MODULE_DEVICE_TABLE(of, mt8188_mt6359_dt_match); MODULE_DEVICE_TABLE(of, mt8188_mt6359_dt_match);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment