Re: [PATCH 04/14] ASoC: mediatek: mt8196: add common interface for mt8196 DAI driver
From: AngeloGioacchino Del Regno <angelogioacchino.delregno@collabora.com>
Date: 2025-03-10 15:23:17
Also in:
linux-devicetree, linux-gpio, linux-mediatek, linux-sound, lkml
Il 07/03/25 13:47, Darren.Ye ha scritto:
quoted hunk ↗ jump to hunk
From: Darren Ye <redacted> Implement sample rate conversion and set private data for mt8196. Signed-off-by: Darren Ye <redacted> --- .../soc/mediatek/mt8196/mt8196-afe-control.c | 109 ++++++++++++++++++ 1 file changed, 109 insertions(+) create mode 100644 sound/soc/mediatek/mt8196/mt8196-afe-control.cdiff --git a/sound/soc/mediatek/mt8196/mt8196-afe-control.c b/sound/soc/mediatek/mt8196/mt8196-afe-control.c new file mode 100644 index 000000000000..bb85f4ad8585 --- /dev/null +++ b/sound/soc/mediatek/mt8196/mt8196-afe-control.c@@ -0,0 +1,109 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * MediaTek ALSA SoC Audio Control + * + * Copyright (c) 2024 MediaTek Inc. + * Author: Darren Ye <darren.ye@mediatek.com> + */ + +#include "mt8196-afe-common.h" +#include <linux/pm_runtime.h> + +unsigned int mt8196_general_rate_transform(struct device *dev, + unsigned int rate) +{ + switch (rate) { + case 8000: + return MTK_AFE_IPM2P0_RATE_8K; + case 11025: + return MTK_AFE_IPM2P0_RATE_11K; + case 12000: + return MTK_AFE_IPM2P0_RATE_12K; + case 16000: + return MTK_AFE_IPM2P0_RATE_16K; + case 22050: + return MTK_AFE_IPM2P0_RATE_22K; + case 24000: + return MTK_AFE_IPM2P0_RATE_24K; + case 32000: + return MTK_AFE_IPM2P0_RATE_32K; + case 44100: + return MTK_AFE_IPM2P0_RATE_44K; + case 48000: + return MTK_AFE_IPM2P0_RATE_48K; + case 88200: + return MTK_AFE_IPM2P0_RATE_88K; + case 96000: + return MTK_AFE_IPM2P0_RATE_96K; + case 176400: + return MTK_AFE_IPM2P0_RATE_176K; + case 192000: + return MTK_AFE_IPM2P0_RATE_192K; + /* not support 260K */ + case 352800: + return MTK_AFE_IPM2P0_RATE_352K; + case 384000: + return MTK_AFE_IPM2P0_RATE_384K; + default: + dev_info(dev, "%s(), rate %u invalid, use %d!!!\n", + __func__, + rate, MTK_AFE_IPM2P0_RATE_48K); + return MTK_AFE_IPM2P0_RATE_48K; + } +} + +static unsigned int pcm_rate_transform(struct device *dev, + unsigned int rate) +{
You have this function in mt8186-afe-control.c and mt8192-afe-control.c, with the only difference being the default case. Please commonize this function and handle the default case for each SoC (if needed) in each SoC-specific driver. While at it, please do the same with mt8196_general_rate_transform, as this IPM2.0 will be in other MediaTek SoCs, and this function will otherwise be commonized next time anyway. Possible names could be mtk_afe_pcm_rate_transform() for one, and probably mtk_ipm20_general_rate_transform() for the other.
+ switch (rate) {
+ case 8000:
+ return MTK_AFE_PCM_RATE_8K;
+ case 16000:
+ return MTK_AFE_PCM_RATE_16K;
+ case 32000:
+ return MTK_AFE_PCM_RATE_32K;
+ case 48000:
+ return MTK_AFE_PCM_RATE_48K;
+ default:
+ dev_info(dev, "%s(), rate %u invalid, use %d!!!\n",
+ __func__,
+ rate, MTK_AFE_PCM_RATE_32K);
+ return MTK_AFE_PCM_RATE_32K;
+ }
+}
+
+unsigned int mt8196_rate_transform(struct device *dev,
+ unsigned int rate, int aud_blk)
+{
+ switch (aud_blk) {
+ case MT8196_DAI_PCM_0:
+ case MT8196_DAI_PCM_1:
+ return pcm_rate_transform(dev, rate);
+ default:
+ return mt8196_general_rate_transform(dev, rate);
+ }
+}
+
+int mt8196_dai_set_priv(struct mtk_base_afe *afe, int id,
+ int priv_size, const void *priv_data)
+{
+ struct mt8196_afe_private *afe_priv = afe->platform_priv;
+ void *temp_data;
+
+ temp_data = devm_kzalloc(afe->dev,
+ priv_size,
+ GFP_KERNEL);
+ if (!temp_data)
+ return -ENOMEM;
+
+ if (priv_data)
+ memcpy(temp_data, priv_data, priv_size);
+
+ if (id >= MT8196_DAI_NUM || id < 0)
+ return -EINVAL;
+
+ afe_priv->dai_priv[id] = temp_data;
+
+ return 0;
+}
+