Unverified Commit 2cc3cd5f authored by Tzung-Bi Shih's avatar Tzung-Bi Shih Committed by Mark Brown
Browse files

ASoC: mediatek: mt8183: support WoV

parent 0cce736d
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -125,6 +125,7 @@ config SND_SOC_MT8183_MT6358_TS3A227E_MAX98357A
	select SND_SOC_MAX98357A
	select SND_SOC_BT_SCO
	select SND_SOC_TS3A227E
	select SND_SOC_CROS_EC_CODEC
	help
	  This adds ASoC driver for Mediatek MT8183 boards
	  with the MT6358 TS3A227E MAX98357A audio codec.
+67 −3
Original line number Diff line number Diff line
@@ -19,11 +19,12 @@ enum PINCTRL_PIN_STATE {
	PIN_STATE_DEFAULT = 0,
	PIN_TDM_OUT_ON,
	PIN_TDM_OUT_OFF,
	PIN_WOV,
	PIN_STATE_MAX
};

static const char * const mt8183_pin_str[PIN_STATE_MAX] = {
	"default", "aud_tdm_out_on", "aud_tdm_out_off",
	"default", "aud_tdm_out_on", "aud_tdm_out_off", "wov",
};

struct mt8183_mt6358_ts3a227_max98357_priv {
@@ -142,6 +143,11 @@ SND_SOC_DAILINK_DEFS(playback_hdmi,
	DAILINK_COMP_ARRAY(COMP_DUMMY()),
	DAILINK_COMP_ARRAY(COMP_EMPTY()));

SND_SOC_DAILINK_DEFS(wake_on_voice,
	DAILINK_COMP_ARRAY(COMP_DUMMY()),
	DAILINK_COMP_ARRAY(COMP_DUMMY()),
	DAILINK_COMP_ARRAY(COMP_EMPTY()));

/* BE */
SND_SOC_DAILINK_DEFS(primary_codec,
	DAILINK_COMP_ARRAY(COMP_CPU("ADDA")),
@@ -229,6 +235,41 @@ static struct snd_soc_ops mt8183_mt6358_tdm_ops = {
	.shutdown = mt8183_mt6358_tdm_shutdown,
};

static int
mt8183_mt6358_ts3a227_max98357_wov_startup(
	struct snd_pcm_substream *substream)
{
	struct snd_soc_pcm_runtime *rtd = substream->private_data;
	struct snd_soc_card *card = rtd->card;
	struct mt8183_mt6358_ts3a227_max98357_priv *priv =
			snd_soc_card_get_drvdata(card);

	return pinctrl_select_state(priv->pinctrl,
				    priv->pin_states[PIN_WOV]);
}

static void
mt8183_mt6358_ts3a227_max98357_wov_shutdown(
	struct snd_pcm_substream *substream)
{
	struct snd_soc_pcm_runtime *rtd = substream->private_data;
	struct snd_soc_card *card = rtd->card;
	struct mt8183_mt6358_ts3a227_max98357_priv *priv =
			snd_soc_card_get_drvdata(card);
	int ret;

	ret = pinctrl_select_state(priv->pinctrl,
				   priv->pin_states[PIN_STATE_DEFAULT]);
	if (ret)
		dev_err(card->dev, "%s failed to select state %d\n",
			__func__, ret);
}

static const struct snd_soc_ops mt8183_mt6358_ts3a227_max98357_wov_ops = {
	.startup = mt8183_mt6358_ts3a227_max98357_wov_startup,
	.shutdown = mt8183_mt6358_ts3a227_max98357_wov_shutdown,
};

static struct snd_soc_dai_link
mt8183_mt6358_ts3a227_max98357_dai_links[] = {
	/* FE */
@@ -306,6 +347,15 @@ mt8183_mt6358_ts3a227_max98357_dai_links[] = {
		.dpcm_playback = 1,
		SND_SOC_DAILINK_REG(playback_hdmi),
	},
	{
		.name = "Wake on Voice",
		.stream_name = "Wake on Voice",
		.ignore_suspend = 1,
		.ignore = 1,
		SND_SOC_DAILINK_REG(wake_on_voice),
		.ops = &mt8183_mt6358_ts3a227_max98357_wov_ops,
	},

	/* BE */
	{
		.name = "Primary Codec",
@@ -429,7 +479,7 @@ static int
mt8183_mt6358_ts3a227_max98357_dev_probe(struct platform_device *pdev)
{
	struct snd_soc_card *card = &mt8183_mt6358_ts3a227_max98357_card;
	struct device_node *platform_node;
	struct device_node *platform_node, *ec_codec;
	struct snd_soc_dai_link *dai_link;
	struct mt8183_mt6358_ts3a227_max98357_priv *priv;
	int ret;
@@ -444,11 +494,25 @@ mt8183_mt6358_ts3a227_max98357_dev_probe(struct platform_device *pdev)
		return -EINVAL;
	}

	ec_codec = of_parse_phandle(pdev->dev.of_node, "mediatek,ec-codec", 0);

	for_each_card_prelinks(card, i, dai_link) {
		if (dai_link->platforms->name)
			continue;

		if (ec_codec && strcmp(dai_link->name, "Wake on Voice") == 0) {
			dai_link->cpus[0].name = NULL;
			dai_link->cpus[0].of_node = ec_codec;
			dai_link->cpus[0].dai_name = NULL;
			dai_link->codecs[0].name = NULL;
			dai_link->codecs[0].of_node = ec_codec;
			dai_link->codecs[0].dai_name = "Wake on Voice";
			dai_link->platforms[0].of_node = ec_codec;
			dai_link->ignore = 0;
		} else {
			dai_link->platforms->of_node = platform_node;
		}
	}

	mt8183_mt6358_ts3a227_max98357_headset_dev.dlc.of_node =
		of_parse_phandle(pdev->dev.of_node,