Commit 1c62ec5f authored by Mark Brown's avatar Mark Brown

Merge series "ASoC: mediatek: mt8183: support DP audio" from Tzung-Bi Shih <tzungbi@google.com>:

This series is a follow up for a long time ago series
(https://patchwork.kernel.org/cover/11204303/).

The old series bound too much on the patches of DRM bridge and ASoC
machine driver.  And unluckily, the dependencies
(https://lore.kernel.org/patchwork/patch/1126819/) have not applied.

Revewing the ASoC patches in the old series, I found that they could be
decoupled from the DRM bridge patches.  And they are harmless as it is
an optional attribute ("hdmi-codec") in DTS.

This series arranges and rebases the harmless ASoC patches for
mt8183-mt6358-ts3a227-max98357 and mt8183-da7219-max98357.

The 1st and 4th patch add an optional DT property.  The 1st patch was
acked long time ago (https://patchwork.kernel.org/patch/11204321/).

The 2nd and 5th patch add DAI link for using hdmi-codec.

The 3rd and 6th patch support the HDMI jack reporting.

Tzung-Bi Shih (6):
  ASoC: dt-bindings: mt8183: add a property "mediatek,hdmi-codec"
  ASoC: mediatek: mt8183: use hdmi-codec
  ASoC: mediatek: mt8183: support HDMI jack reporting
  ASoC: dt-bindings: mt8183-da7219: add a property "mediatek,hdmi-codec"
  ASoC: mediatek: mt8183-da7219: use hdmi-codec
  ASoC: mediatek: mt8183-da7219: support HDMI jack reporting

 .../bindings/sound/mt8183-da7219-max98357.txt |  4 +++
 .../sound/mt8183-mt6358-ts3a227-max98357.txt  |  2 ++
 sound/soc/mediatek/Kconfig                    |  2 ++
 .../mediatek/mt8183/mt8183-da7219-max98357.c  | 29 +++++++++++++++++--
 .../mt8183/mt8183-mt6358-ts3a227-max98357.c   | 29 +++++++++++++++++--
 5 files changed, 60 insertions(+), 6 deletions(-)

--
2.27.0.383.g050319c2ae-goog
parents 3689eb0b e25f8afd
...@@ -6,11 +6,15 @@ Required properties: ...@@ -6,11 +6,15 @@ Required properties:
- mediatek,headset-codec: the phandles of da7219 codecs - mediatek,headset-codec: the phandles of da7219 codecs
- mediatek,platform: the phandle of MT8183 ASoC platform - mediatek,platform: the phandle of MT8183 ASoC platform
Optional properties:
- mediatek,hdmi-codec: the phandles of HDMI codec
Example: Example:
sound { sound {
compatible = "mediatek,mt8183_da7219_max98357"; compatible = "mediatek,mt8183_da7219_max98357";
mediatek,headset-codec = <&da7219>; mediatek,headset-codec = <&da7219>;
mediatek,hdmi-codec = <&it6505dptx>;
mediatek,platform = <&afe>; mediatek,platform = <&afe>;
}; };
...@@ -9,6 +9,7 @@ Optional properties: ...@@ -9,6 +9,7 @@ Optional properties:
- mediatek,headset-codec: the phandles of ts3a227 codecs - mediatek,headset-codec: the phandles of ts3a227 codecs
- mediatek,ec-codec: the phandle of EC codecs. - mediatek,ec-codec: the phandle of EC codecs.
See google,cros-ec-codec.txt for more details. See google,cros-ec-codec.txt for more details.
- mediatek,hdmi-codec: the phandles of HDMI codec
Example: Example:
...@@ -16,6 +17,7 @@ Example: ...@@ -16,6 +17,7 @@ Example:
compatible = "mediatek,mt8183_mt6358_ts3a227_max98357"; compatible = "mediatek,mt8183_mt6358_ts3a227_max98357";
mediatek,headset-codec = <&ts3a227>; mediatek,headset-codec = <&ts3a227>;
mediatek,ec-codec = <&ec_codec>; mediatek,ec-codec = <&ec_codec>;
mediatek,hdmi-codec = <&it6505dptx>;
mediatek,platform = <&afe>; mediatek,platform = <&afe>;
}; };
...@@ -127,6 +127,7 @@ config SND_SOC_MT8183_MT6358_TS3A227E_MAX98357A ...@@ -127,6 +127,7 @@ config SND_SOC_MT8183_MT6358_TS3A227E_MAX98357A
select SND_SOC_BT_SCO select SND_SOC_BT_SCO
select SND_SOC_TS3A227E select SND_SOC_TS3A227E
select SND_SOC_CROS_EC_CODEC if CROS_EC select SND_SOC_CROS_EC_CODEC if CROS_EC
select SND_SOC_HDMI_CODEC
help help
This adds ASoC driver for Mediatek MT8183 boards This adds ASoC driver for Mediatek MT8183 boards
with the MT6358 TS3A227E MAX98357A RT1015 audio codec. with the MT6358 TS3A227E MAX98357A RT1015 audio codec.
...@@ -141,6 +142,7 @@ config SND_SOC_MT8183_DA7219_MAX98357A ...@@ -141,6 +142,7 @@ config SND_SOC_MT8183_DA7219_MAX98357A
select SND_SOC_RT1015 select SND_SOC_RT1015
select SND_SOC_DA7219 select SND_SOC_DA7219
select SND_SOC_BT_SCO select SND_SOC_BT_SCO
select SND_SOC_HDMI_CODEC
help help
This adds ASoC driver for Mediatek MT8183 boards This adds ASoC driver for Mediatek MT8183 boards
with the DA7219 MAX98357A RT1015 audio codec. with the DA7219 MAX98357A RT1015 audio codec.
......
...@@ -10,6 +10,7 @@ ...@@ -10,6 +10,7 @@
#include <linux/module.h> #include <linux/module.h>
#include <linux/of_device.h> #include <linux/of_device.h>
#include <linux/pinctrl/consumer.h> #include <linux/pinctrl/consumer.h>
#include <sound/hdmi-codec.h>
#include <sound/jack.h> #include <sound/jack.h>
#include <sound/pcm_params.h> #include <sound/pcm_params.h>
#include <sound/soc.h> #include <sound/soc.h>
...@@ -26,7 +27,7 @@ ...@@ -26,7 +27,7 @@
#define RT1015_DEV1_NAME "rt1015.6-0029" #define RT1015_DEV1_NAME "rt1015.6-0029"
struct mt8183_da7219_max98357_priv { struct mt8183_da7219_max98357_priv {
struct snd_soc_jack headset_jack; struct snd_soc_jack headset_jack, hdmi_jack;
}; };
static int mt8183_mt6358_i2s_hw_params(struct snd_pcm_substream *substream, static int mt8183_mt6358_i2s_hw_params(struct snd_pcm_substream *substream,
...@@ -354,9 +355,24 @@ SND_SOC_DAILINK_DEFS(i2s5, ...@@ -354,9 +355,24 @@ SND_SOC_DAILINK_DEFS(i2s5,
SND_SOC_DAILINK_DEFS(tdm, SND_SOC_DAILINK_DEFS(tdm,
DAILINK_COMP_ARRAY(COMP_CPU("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())); DAILINK_COMP_ARRAY(COMP_EMPTY()));
static int mt8183_da7219_max98357_hdmi_init(struct snd_soc_pcm_runtime *rtd)
{
struct mt8183_da7219_max98357_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)
return ret;
return hdmi_codec_set_jack_detect(asoc_rtd_to_codec(rtd, 0)->component,
&priv->hdmi_jack);
}
static struct snd_soc_dai_link mt8183_da7219_dai_links[] = { static struct snd_soc_dai_link mt8183_da7219_dai_links[] = {
/* FE */ /* FE */
{ {
...@@ -511,6 +527,7 @@ static struct snd_soc_dai_link mt8183_da7219_dai_links[] = { ...@@ -511,6 +527,7 @@ static struct snd_soc_dai_link mt8183_da7219_dai_links[] = {
.dpcm_playback = 1, .dpcm_playback = 1,
.ignore_suspend = 1, .ignore_suspend = 1,
.be_hw_params_fixup = mt8183_i2s_hw_params_fixup, .be_hw_params_fixup = mt8183_i2s_hw_params_fixup,
.init = mt8183_da7219_max98357_hdmi_init,
SND_SOC_DAILINK_REG(tdm), SND_SOC_DAILINK_REG(tdm),
}, },
}; };
...@@ -627,7 +644,7 @@ static struct snd_soc_card mt8183_da7219_rt1015_card = { ...@@ -627,7 +644,7 @@ static struct snd_soc_card mt8183_da7219_rt1015_card = {
static int mt8183_da7219_max98357_dev_probe(struct platform_device *pdev) static int mt8183_da7219_max98357_dev_probe(struct platform_device *pdev)
{ {
struct snd_soc_card *card; struct snd_soc_card *card;
struct device_node *platform_node; struct device_node *platform_node, *hdmi_codec;
struct snd_soc_dai_link *dai_link; struct snd_soc_dai_link *dai_link;
struct mt8183_da7219_max98357_priv *priv; struct mt8183_da7219_max98357_priv *priv;
struct pinctrl *pinctrl; struct pinctrl *pinctrl;
...@@ -648,6 +665,9 @@ static int mt8183_da7219_max98357_dev_probe(struct platform_device *pdev) ...@@ -648,6 +665,9 @@ static int mt8183_da7219_max98357_dev_probe(struct platform_device *pdev)
card = (struct snd_soc_card *)match->data; card = (struct snd_soc_card *)match->data;
card->dev = &pdev->dev; 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) { for_each_card_prelinks(card, i, dai_link) {
if (strcmp(dai_link->name, "I2S3") == 0) { if (strcmp(dai_link->name, "I2S3") == 0) {
if (card == &mt8183_da7219_max98357_card) { if (card == &mt8183_da7219_max98357_card) {
...@@ -679,6 +699,9 @@ static int mt8183_da7219_max98357_dev_probe(struct platform_device *pdev) ...@@ -679,6 +699,9 @@ static int mt8183_da7219_max98357_dev_probe(struct platform_device *pdev)
} }
} }
if (hdmi_codec && strcmp(dai_link->name, "TDM") == 0)
dai_link->codecs->of_node = hdmi_codec;
if (!dai_link->platforms->name) if (!dai_link->platforms->name)
dai_link->platforms->of_node = platform_node; dai_link->platforms->of_node = platform_node;
} }
......
...@@ -9,6 +9,7 @@ ...@@ -9,6 +9,7 @@
#include <linux/module.h> #include <linux/module.h>
#include <linux/of_device.h> #include <linux/of_device.h>
#include <linux/pinctrl/consumer.h> #include <linux/pinctrl/consumer.h>
#include <sound/hdmi-codec.h>
#include <sound/jack.h> #include <sound/jack.h>
#include <sound/pcm_params.h> #include <sound/pcm_params.h>
#include <sound/soc.h> #include <sound/soc.h>
...@@ -36,7 +37,7 @@ static const char * const mt8183_pin_str[PIN_STATE_MAX] = { ...@@ -36,7 +37,7 @@ static const char * const mt8183_pin_str[PIN_STATE_MAX] = {
struct mt8183_mt6358_ts3a227_max98357_priv { struct mt8183_mt6358_ts3a227_max98357_priv {
struct pinctrl *pinctrl; struct pinctrl *pinctrl;
struct pinctrl_state *pin_states[PIN_STATE_MAX]; struct pinctrl_state *pin_states[PIN_STATE_MAX];
struct snd_soc_jack headset_jack; struct snd_soc_jack headset_jack, hdmi_jack;
}; };
static int mt8183_mt6358_i2s_hw_params(struct snd_pcm_substream *substream, static int mt8183_mt6358_i2s_hw_params(struct snd_pcm_substream *substream,
...@@ -258,7 +259,7 @@ SND_SOC_DAILINK_DEFS(i2s5, ...@@ -258,7 +259,7 @@ SND_SOC_DAILINK_DEFS(i2s5,
SND_SOC_DAILINK_DEFS(tdm, SND_SOC_DAILINK_DEFS(tdm,
DAILINK_COMP_ARRAY(COMP_CPU("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())); DAILINK_COMP_ARRAY(COMP_EMPTY()));
static int mt8183_mt6358_tdm_startup(struct snd_pcm_substream *substream) static int mt8183_mt6358_tdm_startup(struct snd_pcm_substream *substream)
...@@ -337,6 +338,22 @@ static const struct snd_soc_ops mt8183_mt6358_ts3a227_max98357_wov_ops = { ...@@ -337,6 +338,22 @@ static const struct snd_soc_ops mt8183_mt6358_ts3a227_max98357_wov_ops = {
.shutdown = mt8183_mt6358_ts3a227_max98357_wov_shutdown, .shutdown = mt8183_mt6358_ts3a227_max98357_wov_shutdown,
}; };
static int
mt8183_mt6358_ts3a227_max98357_hdmi_init(struct snd_soc_pcm_runtime *rtd)
{
struct mt8183_mt6358_ts3a227_max98357_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)
return ret;
return hdmi_codec_set_jack_detect(asoc_rtd_to_codec(rtd, 0)->component,
&priv->hdmi_jack);
}
static struct snd_soc_dai_link mt8183_mt6358_ts3a227_dai_links[] = { static struct snd_soc_dai_link mt8183_mt6358_ts3a227_dai_links[] = {
/* FE */ /* FE */
{ {
...@@ -499,6 +516,7 @@ static struct snd_soc_dai_link mt8183_mt6358_ts3a227_dai_links[] = { ...@@ -499,6 +516,7 @@ static struct snd_soc_dai_link mt8183_mt6358_ts3a227_dai_links[] = {
.ignore_suspend = 1, .ignore_suspend = 1,
.be_hw_params_fixup = mt8183_i2s_hw_params_fixup, .be_hw_params_fixup = mt8183_i2s_hw_params_fixup,
.ops = &mt8183_mt6358_tdm_ops, .ops = &mt8183_mt6358_tdm_ops,
.init = mt8183_mt6358_ts3a227_max98357_hdmi_init,
SND_SOC_DAILINK_REG(tdm), SND_SOC_DAILINK_REG(tdm),
}, },
}; };
...@@ -562,7 +580,7 @@ static int ...@@ -562,7 +580,7 @@ static int
mt8183_mt6358_ts3a227_max98357_dev_probe(struct platform_device *pdev) mt8183_mt6358_ts3a227_max98357_dev_probe(struct platform_device *pdev)
{ {
struct snd_soc_card *card; struct snd_soc_card *card;
struct device_node *platform_node, *ec_codec; struct device_node *platform_node, *ec_codec, *hdmi_codec;
struct snd_soc_dai_link *dai_link; struct snd_soc_dai_link *dai_link;
struct mt8183_mt6358_ts3a227_max98357_priv *priv; struct mt8183_mt6358_ts3a227_max98357_priv *priv;
const struct of_device_id *match; const struct of_device_id *match;
...@@ -583,6 +601,8 @@ mt8183_mt6358_ts3a227_max98357_dev_probe(struct platform_device *pdev) ...@@ -583,6 +601,8 @@ mt8183_mt6358_ts3a227_max98357_dev_probe(struct platform_device *pdev)
card->dev = &pdev->dev; card->dev = &pdev->dev;
ec_codec = of_parse_phandle(pdev->dev.of_node, "mediatek,ec-codec", 0); ec_codec = of_parse_phandle(pdev->dev.of_node, "mediatek,ec-codec", 0);
hdmi_codec = of_parse_phandle(pdev->dev.of_node,
"mediatek,hdmi-codec", 0);
for_each_card_prelinks(card, i, dai_link) { for_each_card_prelinks(card, i, dai_link) {
if (ec_codec && strcmp(dai_link->name, "Wake on Voice") == 0) { if (ec_codec && strcmp(dai_link->name, "Wake on Voice") == 0) {
...@@ -626,6 +646,9 @@ mt8183_mt6358_ts3a227_max98357_dev_probe(struct platform_device *pdev) ...@@ -626,6 +646,9 @@ mt8183_mt6358_ts3a227_max98357_dev_probe(struct platform_device *pdev)
} }
} }
if (hdmi_codec && strcmp(dai_link->name, "TDM") == 0)
dai_link->codecs->of_node = hdmi_codec;
if (!dai_link->platforms->name) if (!dai_link->platforms->name)
dai_link->platforms->of_node = platform_node; dai_link->platforms->of_node = platform_node;
} }
......
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