Re: [PATCH v6 05/10] ASoC: mediatek: mt8196: support I2S in platform driver
From: Chen-Yu Tsai
Date: Mon Aug 11 2025 - 07:24:27 EST
Sorry for another reply, but I lost some of the context I wanted to reply to.
On Tue, Jul 8, 2025 at 7:34 PM Darren.Ye <darren.ye@xxxxxxxxxxxx> wrote:
>
> From: Darren Ye <darren.ye@xxxxxxxxxxxx>
>
> Add mt8196 I2S DAI driver support.
>
> Signed-off-by: Darren Ye <darren.ye@xxxxxxxxxxxx>
> ---
> sound/soc/mediatek/mt8196/mt8196-dai-i2s.c | 3944 ++++++++++++++++++++
> 1 file changed, 3944 insertions(+)
> create mode 100644 sound/soc/mediatek/mt8196/mt8196-dai-i2s.c
>
> diff --git a/sound/soc/mediatek/mt8196/mt8196-dai-i2s.c b/sound/soc/mediatek/mt8196/mt8196-dai-i2s.c
> new file mode 100644
> index 000000000000..59f66ab8fa9f
> --- /dev/null
> +++ b/sound/soc/mediatek/mt8196/mt8196-dai-i2s.c
> @@ -0,0 +1,3944 @@
[...]
> +static int mtk_afe_i2s_share_connect(struct snd_soc_dapm_widget *source,
> + struct snd_soc_dapm_widget *sink)
> +{
> + struct snd_soc_dapm_widget *w = sink;
> + struct snd_soc_component *cmpnt = snd_soc_dapm_to_component(w->dapm);
> + struct mtk_base_afe *afe = snd_soc_component_get_drvdata(cmpnt);
> + struct mtk_afe_i2s_priv *i2s_priv;
> + int ret = 0;
> +
> + i2s_priv = get_i2s_priv_by_name(afe, sink->name);
> +
Drop empty line between assignment and check.
> + if (!i2s_priv)
> + return 0;
> +
> + if (i2s_priv->share_i2s_id < 0)
> + return 0;
> +
> + ret = (i2s_priv->share_i2s_id == get_i2s_id_by_name(afe, source->name)) ? 1 : 0;
> +
> + return ret;
return i2s_priv->share_i2s_id == get_i2s_id_by_name(afe,
source->name);
bool casts to int implicitly in the same way you wrote explicitly.
> +}
> +
> +static int mtk_afe_i2s_hd_connect(struct snd_soc_dapm_widget *source,
> + struct snd_soc_dapm_widget *sink)
> +{
> + struct snd_soc_dapm_widget *w = sink;
> + struct snd_soc_component *cmpnt = snd_soc_dapm_to_component(w->dapm);
> + struct mtk_base_afe *afe = snd_soc_component_get_drvdata(cmpnt);
> + struct mtk_afe_i2s_priv *i2s_priv;
> + int i2s_num;
Rename to "src_i2s_num" to be explicit.
> +
> + i2s_priv = get_i2s_priv_by_name(afe, sink->name);
> +
Drop empty line between assignment and check.
> + if (!i2s_priv)
> + return 0;
> +
> + i2s_num = get_i2s_id_by_name(afe, source->name);
> + if (get_i2s_id_by_name(afe, sink->name) == i2s_num)
Use i2s_priv->id?
> + return !mtk_is_i2s_low_power(i2s_num) ||
> + i2s_priv->low_jitter_en;
> +
> + /* check if share i2s need hd en */
> + if (i2s_priv->share_i2s_id < 0)
> + return 0;
> +
> + if (i2s_priv->share_i2s_id == i2s_num)
> + return !mtk_is_i2s_low_power(i2s_num) ||
> + i2s_priv->low_jitter_en;
> +
> + return 0;
> +}
> +
> +static int mtk_afe_i2s_apll_connect(struct snd_soc_dapm_widget *source,
> + struct snd_soc_dapm_widget *sink)
> +{
> + struct snd_soc_dapm_widget *w = sink;
> + struct snd_soc_component *cmpnt = snd_soc_dapm_to_component(w->dapm);
> + struct mtk_base_afe *afe = snd_soc_component_get_drvdata(cmpnt);
> + struct mtk_afe_i2s_priv *i2s_priv;
> + int cur_apll;
> + int i2s_need_apll;
Rename to needed_apll or desired_apll.
> +
> + i2s_priv = get_i2s_priv_by_name(afe, w->name);
> +
Drop empty line between assignment and check.
> + if (!i2s_priv)
> + return 0;
> +
> + /* which apll */
> + cur_apll = mt8196_get_apll_by_name(afe, source->name);
> +
> + /* choose APLL from i2s rate */
> + i2s_need_apll = mt8196_get_apll_by_rate(afe, i2s_priv->rate);
> +
> + return (i2s_need_apll == cur_apll) ? 1 : 0;
return i2s_need_apll == cur_apll;
> +}
> +
> +static int mtk_afe_i2s_mclk_connect(struct snd_soc_dapm_widget *source,
> + struct snd_soc_dapm_widget *sink)
> +{
> + struct snd_soc_dapm_widget *w = sink;
> + struct snd_soc_component *cmpnt = snd_soc_dapm_to_component(w->dapm);
> + struct mtk_base_afe *afe = snd_soc_component_get_drvdata(cmpnt);
> + struct mtk_afe_i2s_priv *i2s_priv;
> +
> + i2s_priv = get_i2s_priv_by_name(afe, sink->name);
> +
Drop empty line between assignment and check.
> + if (!i2s_priv)
> + return 0;
> +
> + if (get_i2s_id_by_name(afe, sink->name) ==
i2s_priv->id == ...
> + get_i2s_id_by_name(afe, source->name))
Keep a copy of the result ...
> + return (i2s_priv->mclk_rate > 0) ? 1 : 0;
return i2s_priv->mclk_rate > 0;
> +
> + /* check if share i2s need mclk */
> + if (i2s_priv->share_i2s_id < 0)
> + return 0;
> +
> + if (i2s_priv->share_i2s_id == get_i2s_id_by_name(afe, source->name))
and use it here, like in mtk_afe_i2s_hd_connect().
> + return (i2s_priv->mclk_rate > 0) ? 1 : 0;
return i2s_priv->mclk_rate > 0;
> + return 0;
> +}
> +
> +static int mtk_afe_mclk_apll_connect(struct snd_soc_dapm_widget *source,
> + struct snd_soc_dapm_widget *sink)
> +{
> + struct snd_soc_dapm_widget *w = sink;
> + struct snd_soc_component *cmpnt = snd_soc_dapm_to_component(w->dapm);
> + struct mtk_base_afe *afe = snd_soc_component_get_drvdata(cmpnt);
> + struct mtk_afe_i2s_priv *i2s_priv;
> + int cur_apll;
> +
> + i2s_priv = get_i2s_priv_by_name(afe, w->name);
> +
Drop empty line between assignment and check.
> + if (!i2s_priv)
> + return 0;
> +
> + /* which apll */
> + cur_apll = mt8196_get_apll_by_name(afe, source->name);
> +
> + return (i2s_priv->mclk_apll == cur_apll) ? 1 : 0;
return i2s_priv->mclk_apll == cur_apll;
> +}
[...]
ChenYu