mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-09-29 13:53:33 +00:00
Merge series "ASoC: mediatek: mt8192-mt6359: support DP audio" from Tzung-Bi Shih <tzungbi@google.com>:
The 1st and 2nd patches refactor the machine driver. The 3rd patch changes the platform driver to support TDM 8 channel output. The 4th patch adds an optional DT property. The 5th patch makes the machine driver support DP audio if the optional DT property is specified. Tzung-Bi Shih (5): ASoC: mediatek: mt8192-mt6359: move headset_jack to card specific data ASoC: mediatek: mt8192-mt6359: simplify mt8192_rt5682_init ASoC: mediatek: mt8192: change mclk_multiple of TDM from 128 to 512 ASoC: dt-bindings: mt8192-mt6359: add hdmi-codec property ASoC: mediatek: mt8192-mt6359: support audio over DP .../sound/mt8192-mt6359-rt1015-rt5682.yaml | 5 ++ sound/soc/mediatek/mt8192/mt8192-dai-tdm.c | 2 +- .../mt8192/mt8192-mt6359-rt1015-rt5682.c | 54 ++++++++++++++++--- 3 files changed, 52 insertions(+), 9 deletions(-) -- 2.30.0.284.gd98b1dd5eaa7-goog
This commit is contained in:
commit
879a67e357
3 changed files with 52 additions and 9 deletions
|
@ -23,6 +23,10 @@ properties:
|
|||
$ref: "/schemas/types.yaml#/definitions/phandle"
|
||||
description: The phandle of MT8192 ASoC platform.
|
||||
|
||||
mediatek,hdmi-codec:
|
||||
$ref: "/schemas/types.yaml#/definitions/phandle"
|
||||
description: The phandle of HDMI codec.
|
||||
|
||||
additionalProperties: false
|
||||
|
||||
required:
|
||||
|
@ -35,6 +39,7 @@ examples:
|
|||
sound: mt8192-sound {
|
||||
compatible = "mediatek,mt8192_mt6359_rt1015_rt5682";
|
||||
mediatek,platform = <&afe>;
|
||||
mediatek,hdmi-codec = <&anx_bridge_dp>;
|
||||
pinctrl-names = "aud_clk_mosi_off",
|
||||
"aud_clk_mosi_on";
|
||||
pinctrl-0 = <&aud_clk_mosi_off>;
|
||||
|
|
|
@ -738,7 +738,7 @@ static struct mtk_afe_tdm_priv *init_tdm_priv_data(struct mtk_base_afe *afe)
|
|||
if (!tdm_priv)
|
||||
return NULL;
|
||||
|
||||
tdm_priv->mclk_multiple = 128;
|
||||
tdm_priv->mclk_multiple = 512;
|
||||
tdm_priv->bck_id = MT8192_I2S4_BCK;
|
||||
tdm_priv->mclk_id = MT8192_I2S4_MCK;
|
||||
tdm_priv->id = MT8192_DAI_TDM;
|
||||
|
|
|
@ -31,7 +31,10 @@
|
|||
#define RT5682_CODEC_DAI "rt5682-aif1"
|
||||
#define RT5682_DEV0_NAME "rt5682.1-001a"
|
||||
|
||||
static struct snd_soc_jack headset_jack;
|
||||
struct mt8192_mt6359_priv {
|
||||
struct snd_soc_jack headset_jack;
|
||||
struct snd_soc_jack hdmi_jack;
|
||||
};
|
||||
|
||||
static int mt8192_rt1015_i2s_hw_params(struct snd_pcm_substream *substream,
|
||||
struct snd_pcm_hw_params *params)
|
||||
|
@ -305,7 +308,8 @@ static int mt8192_rt5682_init(struct snd_soc_pcm_runtime *rtd)
|
|||
{
|
||||
struct snd_soc_component *cmpnt_codec =
|
||||
asoc_rtd_to_codec(rtd, 0)->component;
|
||||
struct snd_soc_jack *jack = &headset_jack;
|
||||
struct mt8192_mt6359_priv *priv = snd_soc_card_get_drvdata(rtd->card);
|
||||
struct snd_soc_jack *jack = &priv->headset_jack;
|
||||
int ret;
|
||||
|
||||
ret = snd_soc_card_jack_new(rtd->card, "Headset Jack",
|
||||
|
@ -323,14 +327,25 @@ static int mt8192_rt5682_init(struct snd_soc_pcm_runtime *rtd)
|
|||
snd_jack_set_key(jack->jack, SND_JACK_BTN_2, KEY_VOLUMEUP);
|
||||
snd_jack_set_key(jack->jack, SND_JACK_BTN_3, KEY_VOLUMEDOWN);
|
||||
|
||||
ret = snd_soc_component_set_jack(cmpnt_codec, jack, NULL);
|
||||
return snd_soc_component_set_jack(cmpnt_codec, jack, NULL);
|
||||
};
|
||||
|
||||
static int mt8192_mt6359_hdmi_init(struct snd_soc_pcm_runtime *rtd)
|
||||
{
|
||||
struct snd_soc_component *cmpnt_codec =
|
||||
asoc_rtd_to_codec(rtd, 0)->component;
|
||||
struct mt8192_mt6359_priv *priv = snd_soc_card_get_drvdata(rtd->card);
|
||||
int ret;
|
||||
|
||||
ret = snd_soc_card_jack_new(rtd->card, "HDMI Jack", SND_JACK_LINEOUT,
|
||||
&priv->hdmi_jack, NULL, 0);
|
||||
if (ret) {
|
||||
dev_err(rtd->dev, "Headset Jack set failed: %d\n", ret);
|
||||
dev_err(rtd->dev, "HDMI Jack creation failed: %d\n", ret);
|
||||
return ret;
|
||||
}
|
||||
|
||||
return 0;
|
||||
};
|
||||
return snd_soc_component_set_jack(cmpnt_codec, &priv->hdmi_jack, NULL);
|
||||
}
|
||||
|
||||
static int mt8192_i2s_hw_params_fixup(struct snd_soc_pcm_runtime *rtd,
|
||||
struct snd_pcm_hw_params *params)
|
||||
|
@ -603,7 +618,7 @@ SND_SOC_DAILINK_DEFS(pcm2,
|
|||
|
||||
SND_SOC_DAILINK_DEFS(tdm,
|
||||
DAILINK_COMP_ARRAY(COMP_CPU("TDM")),
|
||||
DAILINK_COMP_ARRAY(COMP_DUMMY()),
|
||||
DAILINK_COMP_ARRAY(COMP_CODEC(NULL, "i2s-hifi")),
|
||||
DAILINK_COMP_ARRAY(COMP_EMPTY()));
|
||||
|
||||
static struct snd_soc_dai_link mt8192_mt6359_dai_links[] = {
|
||||
|
@ -939,8 +954,14 @@ static struct snd_soc_dai_link mt8192_mt6359_dai_links[] = {
|
|||
{
|
||||
.name = "TDM",
|
||||
.no_pcm = 1,
|
||||
.dai_fmt = SND_SOC_DAIFMT_DSP_A |
|
||||
SND_SOC_DAIFMT_IB_NF |
|
||||
SND_SOC_DAIFMT_CBM_CFM,
|
||||
.dpcm_playback = 1,
|
||||
.ignore_suspend = 1,
|
||||
.be_hw_params_fixup = mt8192_i2s_hw_params_fixup,
|
||||
.ignore = 1,
|
||||
.init = mt8192_mt6359_hdmi_init,
|
||||
SND_SOC_DAILINK_REG(tdm),
|
||||
},
|
||||
};
|
||||
|
@ -951,6 +972,7 @@ mt8192_mt6359_rt1015_rt5682_widgets[] = {
|
|||
SND_SOC_DAPM_SPK("Right Spk", NULL),
|
||||
SND_SOC_DAPM_HP("Headphone Jack", NULL),
|
||||
SND_SOC_DAPM_MIC("Headset Mic", NULL),
|
||||
SND_SOC_DAPM_OUTPUT("TDM Out"),
|
||||
};
|
||||
|
||||
static const struct snd_soc_dapm_route mt8192_mt6359_rt1015_rt5682_routes[] = {
|
||||
|
@ -961,6 +983,8 @@ static const struct snd_soc_dapm_route mt8192_mt6359_rt1015_rt5682_routes[] = {
|
|||
{ "Headphone Jack", NULL, "HPOL" },
|
||||
{ "Headphone Jack", NULL, "HPOR" },
|
||||
{ "IN1P", NULL, "Headset Mic" },
|
||||
/* TDM */
|
||||
{ "TDM Out", NULL, "TDM" },
|
||||
};
|
||||
|
||||
static const struct snd_kcontrol_new mt8192_mt6359_rt1015_rt5682_controls[] = {
|
||||
|
@ -1034,10 +1058,11 @@ static struct snd_soc_card mt8192_mt6359_rt1015p_rt5682_card = {
|
|||
static int mt8192_mt6359_dev_probe(struct platform_device *pdev)
|
||||
{
|
||||
struct snd_soc_card *card;
|
||||
struct device_node *platform_node;
|
||||
struct device_node *platform_node, *hdmi_codec;
|
||||
int ret, i;
|
||||
struct snd_soc_dai_link *dai_link;
|
||||
const struct of_device_id *match;
|
||||
struct mt8192_mt6359_priv *priv;
|
||||
|
||||
platform_node = of_parse_phandle(pdev->dev.of_node,
|
||||
"mediatek,platform", 0);
|
||||
|
@ -1053,6 +1078,9 @@ static int mt8192_mt6359_dev_probe(struct platform_device *pdev)
|
|||
card = (struct snd_soc_card *)match->data;
|
||||
card->dev = &pdev->dev;
|
||||
|
||||
hdmi_codec = of_parse_phandle(pdev->dev.of_node,
|
||||
"mediatek,hdmi-codec", 0);
|
||||
|
||||
for_each_card_prelinks(card, i, dai_link) {
|
||||
if (strcmp(dai_link->name, "I2S3") == 0) {
|
||||
if (card == &mt8192_mt6359_rt1015_rt5682_card) {
|
||||
|
@ -1079,10 +1107,20 @@ static int mt8192_mt6359_dev_probe(struct platform_device *pdev)
|
|||
}
|
||||
}
|
||||
|
||||
if (hdmi_codec && strcmp(dai_link->name, "TDM") == 0) {
|
||||
dai_link->codecs->of_node = hdmi_codec;
|
||||
dai_link->ignore = 0;
|
||||
}
|
||||
|
||||
if (!dai_link->platforms->name)
|
||||
dai_link->platforms->of_node = platform_node;
|
||||
}
|
||||
|
||||
priv = devm_kzalloc(&pdev->dev, sizeof(*priv), GFP_KERNEL);
|
||||
if (!priv)
|
||||
return -ENOMEM;
|
||||
snd_soc_card_set_drvdata(card, priv);
|
||||
|
||||
ret = mt8192_afe_gpio_init(&pdev->dev);
|
||||
if (ret) {
|
||||
dev_err(&pdev->dev, "init gpio error %d\n", ret);
|
||||
|
|
Loading…
Reference in a new issue