Unverified Commit a155b752 authored by Mark Brown's avatar Mark Brown
Browse files

ASoC: mediatek: mt8195: repair pcmif BE dai

Merge series from Trevor Wu <trevor.wu@mediatek.com>:

This series of patches repairs some problems for pcmif BE dai.
The unexpected control flow is corrected, and the missing playback
support of DPCM is added.
parents 85b57de3 db5e1c20
Loading
Loading
Loading
Loading
+21 −52
Original line number Diff line number Diff line
@@ -80,8 +80,15 @@ static const struct snd_soc_dapm_widget mtk_dai_pcm_widgets[] = {
			   mtk_dai_pcm_o001_mix,
			   ARRAY_SIZE(mtk_dai_pcm_o001_mix)),

	SND_SOC_DAPM_SUPPLY("PCM_EN", PCM_INTF_CON1,
			    PCM_INTF_CON1_PCM_EN_SHIFT, 0, NULL, 0),

	SND_SOC_DAPM_INPUT("PCM1_INPUT"),
	SND_SOC_DAPM_OUTPUT("PCM1_OUTPUT"),

	SND_SOC_DAPM_CLOCK_SUPPLY("aud_asrc11"),
	SND_SOC_DAPM_CLOCK_SUPPLY("aud_asrc12"),
	SND_SOC_DAPM_CLOCK_SUPPLY("aud_pcmif"),
};

static const struct snd_soc_dapm_route mtk_dai_pcm_routes[] = {
@@ -97,22 +104,18 @@ static const struct snd_soc_dapm_route mtk_dai_pcm_routes[] = {
	{"PCM1 Playback", NULL, "O000"},
	{"PCM1 Playback", NULL, "O001"},

	{"PCM1 Playback", NULL, "PCM_EN"},
	{"PCM1 Playback", NULL, "aud_asrc12"},
	{"PCM1 Playback", NULL, "aud_pcmif"},

	{"PCM1 Capture", NULL, "PCM_EN"},
	{"PCM1 Capture", NULL, "aud_asrc11"},
	{"PCM1 Capture", NULL, "aud_pcmif"},

	{"PCM1_OUTPUT", NULL, "PCM1 Playback"},
	{"PCM1 Capture", NULL, "PCM1_INPUT"},
};

static void mtk_dai_pcm_enable(struct mtk_base_afe *afe)
{
	regmap_update_bits(afe->regmap, PCM_INTF_CON1,
			   PCM_INTF_CON1_PCM_EN, PCM_INTF_CON1_PCM_EN);
}

static void mtk_dai_pcm_disable(struct mtk_base_afe *afe)
{
	regmap_update_bits(afe->regmap, PCM_INTF_CON1,
			   PCM_INTF_CON1_PCM_EN, 0x0);
}

static int mtk_dai_pcm_configure(struct snd_pcm_substream *substream,
				 struct snd_soc_dai *dai)
{
@@ -207,54 +210,22 @@ static int mtk_dai_pcm_configure(struct snd_pcm_substream *substream,
}

/* dai ops */
static int mtk_dai_pcm_startup(struct snd_pcm_substream *substream,
			       struct snd_soc_dai *dai)
{
	struct mtk_base_afe *afe = snd_soc_dai_get_drvdata(dai);
	struct mt8195_afe_private *afe_priv = afe->platform_priv;

	if (dai->component->active)
		return 0;

	mt8195_afe_enable_clk(afe, afe_priv->clk[MT8195_CLK_AUD_ASRC11]);
	mt8195_afe_enable_clk(afe, afe_priv->clk[MT8195_CLK_AUD_ASRC12]);
	mt8195_afe_enable_clk(afe, afe_priv->clk[MT8195_CLK_AUD_PCMIF]);

	return 0;
}

static void mtk_dai_pcm_shutdown(struct snd_pcm_substream *substream,
				 struct snd_soc_dai *dai)
{
	struct mtk_base_afe *afe = snd_soc_dai_get_drvdata(dai);
	struct mt8195_afe_private *afe_priv = afe->platform_priv;

	if (dai->component->active)
		return;

	mtk_dai_pcm_disable(afe);

	mt8195_afe_disable_clk(afe, afe_priv->clk[MT8195_CLK_AUD_PCMIF]);
	mt8195_afe_disable_clk(afe, afe_priv->clk[MT8195_CLK_AUD_ASRC12]);
	mt8195_afe_disable_clk(afe, afe_priv->clk[MT8195_CLK_AUD_ASRC11]);
}

static int mtk_dai_pcm_prepare(struct snd_pcm_substream *substream,
			       struct snd_soc_dai *dai)
{
	struct mtk_base_afe *afe = snd_soc_dai_get_drvdata(dai);
	int ret = 0;
	int ret;

	if (snd_soc_dai_stream_active(dai, SNDRV_PCM_STREAM_PLAYBACK) &&
	    snd_soc_dai_stream_active(dai, SNDRV_PCM_STREAM_CAPTURE))
	dev_dbg(dai->dev, "%s(), id %d, stream %d, widget active p %d, c %d\n",
		__func__, dai->id, substream->stream,
		dai->playback_widget->active, dai->capture_widget->active);

	if (dai->playback_widget->active || dai->capture_widget->active)
		return 0;

	ret = mtk_dai_pcm_configure(substream, dai);
	if (ret)
		return ret;

	mtk_dai_pcm_enable(afe);

	return 0;
}

@@ -316,8 +287,6 @@ static int mtk_dai_pcm_set_fmt(struct snd_soc_dai *dai, unsigned int fmt)
}

static const struct snd_soc_dai_ops mtk_dai_pcm_ops = {
	.startup	= mtk_dai_pcm_startup,
	.shutdown	= mtk_dai_pcm_shutdown,
	.prepare	= mtk_dai_pcm_prepare,
	.set_fmt	= mtk_dai_pcm_set_fmt,
};
+1 −0
Original line number Diff line number Diff line
@@ -1045,6 +1045,7 @@ static struct snd_soc_dai_link mt8195_mt6359_rt1011_rt5682_dai_links[] = {
		.dai_fmt = SND_SOC_DAIFMT_I2S |
			SND_SOC_DAIFMT_NB_NF |
			SND_SOC_DAIFMT_CBS_CFS,
		.dpcm_playback = 1,
		.dpcm_capture = 1,
		SND_SOC_DAILINK_REG(PCM1_BE),
	},
+1 −0
Original line number Diff line number Diff line
@@ -1191,6 +1191,7 @@ static struct snd_soc_dai_link mt8195_mt6359_rt1019_rt5682_dai_links[] = {
		.dai_fmt = SND_SOC_DAIFMT_I2S |
			SND_SOC_DAIFMT_NB_NF |
			SND_SOC_DAIFMT_CBS_CFS,
		.dpcm_playback = 1,
		.dpcm_capture = 1,
		SND_SOC_DAILINK_REG(PCM1_BE),
	},
+1 −0
Original line number Diff line number Diff line
@@ -2550,6 +2550,7 @@
#define PCM_INTF_CON1_PCM_FMT(x)       (((x) & 0x3) << 1)
#define PCM_INTF_CON1_PCM_FMT_MASK     (0x3 << 1)
#define PCM_INTF_CON1_PCM_EN           BIT(0)
#define PCM_INTF_CON1_PCM_EN_SHIFT     0

/* PCM_INTF_CON2 */
#define PCM_INTF_CON2_CLK_DOMAIN_SEL(x)   (((x) & 0x3) << 23)