Commit 0c5b270b authored by Mark Brown's avatar Mark Brown

Merge series "ASoC: mediatek: mt8183: support machine driver for max98357b"...

Merge series "ASoC: mediatek: mt8183: support machine driver for max98357b" from Tzung-Bi Shih <tzungbi@google.com>:

The series re-uses mt8183-mt6358-ts3a227-max98357.c to support machine driver
with max98357b.

The 1st patch enables left justified format from mt8183 audio platform.

The 2nd patch adds document for the new proposed compatible string for
max98357b.

The 3rd patch supports machine driver with max98357b and uses left justified
format for it.

Tzung-Bi Shih (3):
  ASoC: mediatek: mt8183: support left justified format for I2S
  ASoC: dt-bindings: mt8183: add compatible string for using max98357b
  ASoC: mediatek: mt8183: support machine driver with max98357b

 .../sound/mt8183-mt6358-ts3a227-max98357.txt  |  1 +
 sound/soc/mediatek/mt8183/mt8183-dai-i2s.c    | 59 ++++++++++++++++---
 .../mt8183/mt8183-mt6358-ts3a227-max98357.c   | 22 ++++++-
 3 files changed, 73 insertions(+), 9 deletions(-)

--
2.28.0.rc0.105.gf9edc3c819-goog
parents 5180ebb8 08145535
...@@ -2,6 +2,7 @@ MT8183 with MT6358, TS3A227, MAX98357, and RT1015 CODECS ...@@ -2,6 +2,7 @@ MT8183 with MT6358, TS3A227, MAX98357, and RT1015 CODECS
Required properties: Required properties:
- compatible : "mediatek,mt8183_mt6358_ts3a227_max98357" for MAX98357A codec - compatible : "mediatek,mt8183_mt6358_ts3a227_max98357" for MAX98357A codec
"mediatek,mt8183_mt6358_ts3a227_max98357b" for MAX98357B codec
"mediatek,mt8183_mt6358_ts3a227_rt1015" for RT1015 codec "mediatek,mt8183_mt6358_ts3a227_rt1015" for RT1015 codec
- mediatek,platform: the phandle of MT8183 ASoC platform - mediatek,platform: the phandle of MT8183 ASoC platform
......
...@@ -49,6 +49,8 @@ struct mtk_afe_i2s_priv { ...@@ -49,6 +49,8 @@ struct mtk_afe_i2s_priv {
int mclk_id; int mclk_id;
int mclk_rate; int mclk_rate;
int mclk_apll; int mclk_apll;
int use_eiaj;
}; };
static unsigned int get_i2s_wlen(snd_pcm_format_t format) static unsigned int get_i2s_wlen(snd_pcm_format_t format)
...@@ -711,7 +713,7 @@ static int mtk_dai_i2s_config(struct mtk_base_afe *afe, ...@@ -711,7 +713,7 @@ static int mtk_dai_i2s_config(struct mtk_base_afe *afe,
unsigned int rate_reg = mt8183_rate_transform(afe->dev, unsigned int rate_reg = mt8183_rate_transform(afe->dev,
rate, i2s_id); rate, i2s_id);
snd_pcm_format_t format = params_format(params); snd_pcm_format_t format = params_format(params);
unsigned int i2s_con = 0; unsigned int i2s_con = 0, fmt_con = I2S_FMT_I2S << I2S_FMT_SFT;
int ret = 0; int ret = 0;
dev_info(afe->dev, "%s(), id %d, rate %d, format %d\n", dev_info(afe->dev, "%s(), id %d, rate %d, format %d\n",
...@@ -719,17 +721,21 @@ static int mtk_dai_i2s_config(struct mtk_base_afe *afe, ...@@ -719,17 +721,21 @@ static int mtk_dai_i2s_config(struct mtk_base_afe *afe,
i2s_id, i2s_id,
rate, format); rate, format);
if (i2s_priv) if (i2s_priv) {
i2s_priv->rate = rate; i2s_priv->rate = rate;
else
if (i2s_priv->use_eiaj)
fmt_con = I2S_FMT_EIAJ << I2S_FMT_SFT;
} else {
dev_warn(afe->dev, "%s(), i2s_priv == NULL", __func__); dev_warn(afe->dev, "%s(), i2s_priv == NULL", __func__);
}
switch (i2s_id) { switch (i2s_id) {
case MT8183_DAI_I2S_0: case MT8183_DAI_I2S_0:
regmap_update_bits(afe->regmap, AFE_DAC_CON1, regmap_update_bits(afe->regmap, AFE_DAC_CON1,
I2S_MODE_MASK_SFT, rate_reg << I2S_MODE_SFT); I2S_MODE_MASK_SFT, rate_reg << I2S_MODE_SFT);
i2s_con = I2S_IN_PAD_IO_MUX << I2SIN_PAD_SEL_SFT; i2s_con = I2S_IN_PAD_IO_MUX << I2SIN_PAD_SEL_SFT;
i2s_con |= I2S_FMT_I2S << I2S_FMT_SFT; i2s_con |= fmt_con;
i2s_con |= get_i2s_wlen(format) << I2S_WLEN_SFT; i2s_con |= get_i2s_wlen(format) << I2S_WLEN_SFT;
regmap_update_bits(afe->regmap, AFE_I2S_CON, regmap_update_bits(afe->regmap, AFE_I2S_CON,
0xffffeffe, i2s_con); 0xffffeffe, i2s_con);
...@@ -737,7 +743,7 @@ static int mtk_dai_i2s_config(struct mtk_base_afe *afe, ...@@ -737,7 +743,7 @@ static int mtk_dai_i2s_config(struct mtk_base_afe *afe,
case MT8183_DAI_I2S_1: case MT8183_DAI_I2S_1:
i2s_con = I2S1_SEL_O28_O29 << I2S2_SEL_O03_O04_SFT; i2s_con = I2S1_SEL_O28_O29 << I2S2_SEL_O03_O04_SFT;
i2s_con |= rate_reg << I2S2_OUT_MODE_SFT; i2s_con |= rate_reg << I2S2_OUT_MODE_SFT;
i2s_con |= I2S_FMT_I2S << I2S2_FMT_SFT; i2s_con |= fmt_con;
i2s_con |= get_i2s_wlen(format) << I2S2_WLEN_SFT; i2s_con |= get_i2s_wlen(format) << I2S2_WLEN_SFT;
regmap_update_bits(afe->regmap, AFE_I2S_CON1, regmap_update_bits(afe->regmap, AFE_I2S_CON1,
0xffffeffe, i2s_con); 0xffffeffe, i2s_con);
...@@ -745,21 +751,21 @@ static int mtk_dai_i2s_config(struct mtk_base_afe *afe, ...@@ -745,21 +751,21 @@ static int mtk_dai_i2s_config(struct mtk_base_afe *afe,
case MT8183_DAI_I2S_2: case MT8183_DAI_I2S_2:
i2s_con = 8 << I2S3_UPDATE_WORD_SFT; i2s_con = 8 << I2S3_UPDATE_WORD_SFT;
i2s_con |= rate_reg << I2S3_OUT_MODE_SFT; i2s_con |= rate_reg << I2S3_OUT_MODE_SFT;
i2s_con |= I2S_FMT_I2S << I2S3_FMT_SFT; i2s_con |= fmt_con;
i2s_con |= get_i2s_wlen(format) << I2S3_WLEN_SFT; i2s_con |= get_i2s_wlen(format) << I2S3_WLEN_SFT;
regmap_update_bits(afe->regmap, AFE_I2S_CON2, regmap_update_bits(afe->regmap, AFE_I2S_CON2,
0xffffeffe, i2s_con); 0xffffeffe, i2s_con);
break; break;
case MT8183_DAI_I2S_3: case MT8183_DAI_I2S_3:
i2s_con = rate_reg << I2S4_OUT_MODE_SFT; i2s_con = rate_reg << I2S4_OUT_MODE_SFT;
i2s_con |= I2S_FMT_I2S << I2S4_FMT_SFT; i2s_con |= fmt_con;
i2s_con |= get_i2s_wlen(format) << I2S4_WLEN_SFT; i2s_con |= get_i2s_wlen(format) << I2S4_WLEN_SFT;
regmap_update_bits(afe->regmap, AFE_I2S_CON3, regmap_update_bits(afe->regmap, AFE_I2S_CON3,
0xffffeffe, i2s_con); 0xffffeffe, i2s_con);
break; break;
case MT8183_DAI_I2S_5: case MT8183_DAI_I2S_5:
i2s_con = rate_reg << I2S5_OUT_MODE_SFT; i2s_con = rate_reg << I2S5_OUT_MODE_SFT;
i2s_con |= I2S_FMT_I2S << I2S5_FMT_SFT; i2s_con |= fmt_con;
i2s_con |= get_i2s_wlen(format) << I2S5_WLEN_SFT; i2s_con |= get_i2s_wlen(format) << I2S5_WLEN_SFT;
regmap_update_bits(afe->regmap, AFE_I2S_CON4, regmap_update_bits(afe->regmap, AFE_I2S_CON4,
0xffffeffe, i2s_con); 0xffffeffe, i2s_con);
...@@ -841,9 +847,46 @@ static int mtk_dai_i2s_set_sysclk(struct snd_soc_dai *dai, ...@@ -841,9 +847,46 @@ static int mtk_dai_i2s_set_sysclk(struct snd_soc_dai *dai,
return 0; return 0;
} }
static int mtk_dai_i2s_set_fmt(struct snd_soc_dai *dai, unsigned int fmt)
{
struct mtk_base_afe *afe = snd_soc_dai_get_drvdata(dai);
struct mt8183_afe_private *afe_priv = afe->platform_priv;
struct mtk_afe_i2s_priv *i2s_priv;
switch (dai->id) {
case MT8183_DAI_I2S_0:
case MT8183_DAI_I2S_1:
case MT8183_DAI_I2S_2:
case MT8183_DAI_I2S_3:
case MT8183_DAI_I2S_5:
break;
default:
dev_warn(afe->dev, "%s(), id %d not support\n",
__func__, dai->id);
return -EINVAL;
}
i2s_priv = afe_priv->dai_priv[dai->id];
switch (fmt & SND_SOC_DAIFMT_FORMAT_MASK) {
case SND_SOC_DAIFMT_LEFT_J:
i2s_priv->use_eiaj = 1;
break;
case SND_SOC_DAIFMT_I2S:
i2s_priv->use_eiaj = 0;
break;
default:
dev_warn(afe->dev, "%s(), DAI format %d not support\n",
__func__, fmt & SND_SOC_DAIFMT_FORMAT_MASK);
return -EINVAL;
}
return 0;
}
static const struct snd_soc_dai_ops mtk_dai_i2s_ops = { static const struct snd_soc_dai_ops mtk_dai_i2s_ops = {
.hw_params = mtk_dai_i2s_hw_params, .hw_params = mtk_dai_i2s_hw_params,
.set_sysclk = mtk_dai_i2s_set_sysclk, .set_sysclk = mtk_dai_i2s_set_sysclk,
.set_fmt = mtk_dai_i2s_set_fmt,
}; };
/* dai driver */ /* dai driver */
......
...@@ -528,6 +528,13 @@ static struct snd_soc_card mt8183_mt6358_ts3a227_max98357_card = { ...@@ -528,6 +528,13 @@ static struct snd_soc_card mt8183_mt6358_ts3a227_max98357_card = {
.num_links = ARRAY_SIZE(mt8183_mt6358_ts3a227_dai_links), .num_links = ARRAY_SIZE(mt8183_mt6358_ts3a227_dai_links),
}; };
static struct snd_soc_card mt8183_mt6358_ts3a227_max98357b_card = {
.name = "mt8183_mt6358_ts3a227_max98357b",
.owner = THIS_MODULE,
.dai_link = mt8183_mt6358_ts3a227_dai_links,
.num_links = ARRAY_SIZE(mt8183_mt6358_ts3a227_dai_links),
};
static struct snd_soc_codec_conf mt8183_mt6358_ts3a227_rt1015_amp_conf[] = { static struct snd_soc_codec_conf mt8183_mt6358_ts3a227_rt1015_amp_conf[] = {
{ {
.dlc = COMP_CODEC_CONF(RT1015_DEV0_NAME), .dlc = COMP_CODEC_CONF(RT1015_DEV0_NAME),
...@@ -617,7 +624,8 @@ mt8183_mt6358_ts3a227_max98357_dev_probe(struct platform_device *pdev) ...@@ -617,7 +624,8 @@ mt8183_mt6358_ts3a227_max98357_dev_probe(struct platform_device *pdev)
} }
if (strcmp(dai_link->name, "I2S3") == 0) { if (strcmp(dai_link->name, "I2S3") == 0) {
if (card == &mt8183_mt6358_ts3a227_max98357_card) { if (card == &mt8183_mt6358_ts3a227_max98357_card ||
card == &mt8183_mt6358_ts3a227_max98357b_card) {
dai_link->be_hw_params_fixup = dai_link->be_hw_params_fixup =
mt8183_i2s_hw_params_fixup; mt8183_i2s_hw_params_fixup;
dai_link->ops = &mt8183_mt6358_i2s_ops; dai_link->ops = &mt8183_mt6358_i2s_ops;
...@@ -646,6 +654,14 @@ mt8183_mt6358_ts3a227_max98357_dev_probe(struct platform_device *pdev) ...@@ -646,6 +654,14 @@ mt8183_mt6358_ts3a227_max98357_dev_probe(struct platform_device *pdev)
} }
} }
if (card == &mt8183_mt6358_ts3a227_max98357b_card) {
if (strcmp(dai_link->name, "I2S2") == 0 ||
strcmp(dai_link->name, "I2S3") == 0)
dai_link->dai_fmt = SND_SOC_DAIFMT_LEFT_J |
SND_SOC_DAIFMT_NB_NF |
SND_SOC_DAIFMT_CBM_CFM;
}
if (hdmi_codec && strcmp(dai_link->name, "TDM") == 0) if (hdmi_codec && strcmp(dai_link->name, "TDM") == 0)
dai_link->codecs->of_node = hdmi_codec; dai_link->codecs->of_node = hdmi_codec;
...@@ -711,6 +727,10 @@ static const struct of_device_id mt8183_mt6358_ts3a227_max98357_dt_match[] = { ...@@ -711,6 +727,10 @@ static const struct of_device_id mt8183_mt6358_ts3a227_max98357_dt_match[] = {
.compatible = "mediatek,mt8183_mt6358_ts3a227_max98357", .compatible = "mediatek,mt8183_mt6358_ts3a227_max98357",
.data = &mt8183_mt6358_ts3a227_max98357_card, .data = &mt8183_mt6358_ts3a227_max98357_card,
}, },
{
.compatible = "mediatek,mt8183_mt6358_ts3a227_max98357b",
.data = &mt8183_mt6358_ts3a227_max98357b_card,
},
{ {
.compatible = "mediatek,mt8183_mt6358_ts3a227_rt1015", .compatible = "mediatek,mt8183_mt6358_ts3a227_rt1015",
.data = &mt8183_mt6358_ts3a227_rt1015_card, .data = &mt8183_mt6358_ts3a227_rt1015_card,
......
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