162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0
262306a36Sopenharmony_ci//
362306a36Sopenharmony_ci// MediaTek ALSA SoC Audio DAI Hostless Control
462306a36Sopenharmony_ci//
562306a36Sopenharmony_ci// Copyright (c) 2018 MediaTek Inc.
662306a36Sopenharmony_ci// Author: KaiChieh Chuang <kaichieh.chuang@mediatek.com>
762306a36Sopenharmony_ci
862306a36Sopenharmony_ci#include "mt6797-afe-common.h"
962306a36Sopenharmony_ci
1062306a36Sopenharmony_ci/* dai component */
1162306a36Sopenharmony_cistatic const struct snd_soc_dapm_route mtk_dai_hostless_routes[] = {
1262306a36Sopenharmony_ci	/* Hostless ADDA Loopback */
1362306a36Sopenharmony_ci	{"ADDA_DL_CH1", "ADDA_UL_CH1", "Hostless LPBK DL"},
1462306a36Sopenharmony_ci	{"ADDA_DL_CH1", "ADDA_UL_CH2", "Hostless LPBK DL"},
1562306a36Sopenharmony_ci	{"ADDA_DL_CH2", "ADDA_UL_CH1", "Hostless LPBK DL"},
1662306a36Sopenharmony_ci	{"ADDA_DL_CH2", "ADDA_UL_CH2", "Hostless LPBK DL"},
1762306a36Sopenharmony_ci	{"Hostless LPBK UL", NULL, "ADDA Capture"},
1862306a36Sopenharmony_ci
1962306a36Sopenharmony_ci	/* Hostless Speech */
2062306a36Sopenharmony_ci	{"ADDA_DL_CH1", "PCM_1_CAP_CH1", "Hostless Speech DL"},
2162306a36Sopenharmony_ci	{"ADDA_DL_CH2", "PCM_1_CAP_CH1", "Hostless Speech DL"},
2262306a36Sopenharmony_ci	{"ADDA_DL_CH2", "PCM_1_CAP_CH2", "Hostless Speech DL"},
2362306a36Sopenharmony_ci	{"ADDA_DL_CH1", "PCM_2_CAP_CH1", "Hostless Speech DL"},
2462306a36Sopenharmony_ci	{"ADDA_DL_CH2", "PCM_2_CAP_CH1", "Hostless Speech DL"},
2562306a36Sopenharmony_ci	{"ADDA_DL_CH2", "PCM_2_CAP_CH2", "Hostless Speech DL"},
2662306a36Sopenharmony_ci	{"PCM_1_PB_CH1", "ADDA_UL_CH1", "Hostless Speech DL"},
2762306a36Sopenharmony_ci	{"PCM_1_PB_CH2", "ADDA_UL_CH2", "Hostless Speech DL"},
2862306a36Sopenharmony_ci	{"PCM_2_PB_CH1", "ADDA_UL_CH1", "Hostless Speech DL"},
2962306a36Sopenharmony_ci	{"PCM_2_PB_CH2", "ADDA_UL_CH2", "Hostless Speech DL"},
3062306a36Sopenharmony_ci
3162306a36Sopenharmony_ci	{"Hostless Speech UL", NULL, "PCM 1 Capture"},
3262306a36Sopenharmony_ci	{"Hostless Speech UL", NULL, "PCM 2 Capture"},
3362306a36Sopenharmony_ci	{"Hostless Speech UL", NULL, "ADDA Capture"},
3462306a36Sopenharmony_ci};
3562306a36Sopenharmony_ci
3662306a36Sopenharmony_ci/* dai ops */
3762306a36Sopenharmony_cistatic int mtk_dai_hostless_startup(struct snd_pcm_substream *substream,
3862306a36Sopenharmony_ci				    struct snd_soc_dai *dai)
3962306a36Sopenharmony_ci{
4062306a36Sopenharmony_ci	struct mtk_base_afe *afe = snd_soc_dai_get_drvdata(dai);
4162306a36Sopenharmony_ci
4262306a36Sopenharmony_ci	return snd_soc_set_runtime_hwparams(substream, afe->mtk_afe_hardware);
4362306a36Sopenharmony_ci}
4462306a36Sopenharmony_ci
4562306a36Sopenharmony_cistatic const struct snd_soc_dai_ops mtk_dai_hostless_ops = {
4662306a36Sopenharmony_ci	.startup = mtk_dai_hostless_startup,
4762306a36Sopenharmony_ci};
4862306a36Sopenharmony_ci
4962306a36Sopenharmony_ci/* dai driver */
5062306a36Sopenharmony_ci#define MTK_HOSTLESS_RATES (SNDRV_PCM_RATE_8000_48000 |\
5162306a36Sopenharmony_ci			   SNDRV_PCM_RATE_88200 |\
5262306a36Sopenharmony_ci			   SNDRV_PCM_RATE_96000 |\
5362306a36Sopenharmony_ci			   SNDRV_PCM_RATE_176400 |\
5462306a36Sopenharmony_ci			   SNDRV_PCM_RATE_192000)
5562306a36Sopenharmony_ci
5662306a36Sopenharmony_ci#define MTK_HOSTLESS_FORMATS (SNDRV_PCM_FMTBIT_S16_LE |\
5762306a36Sopenharmony_ci			     SNDRV_PCM_FMTBIT_S24_LE |\
5862306a36Sopenharmony_ci			     SNDRV_PCM_FMTBIT_S32_LE)
5962306a36Sopenharmony_ci
6062306a36Sopenharmony_cistatic struct snd_soc_dai_driver mtk_dai_hostless_driver[] = {
6162306a36Sopenharmony_ci	{
6262306a36Sopenharmony_ci		.name = "Hostless LPBK DAI",
6362306a36Sopenharmony_ci		.id = MT6797_DAI_HOSTLESS_LPBK,
6462306a36Sopenharmony_ci		.playback = {
6562306a36Sopenharmony_ci			.stream_name = "Hostless LPBK DL",
6662306a36Sopenharmony_ci			.channels_min = 1,
6762306a36Sopenharmony_ci			.channels_max = 2,
6862306a36Sopenharmony_ci			.rates = MTK_HOSTLESS_RATES,
6962306a36Sopenharmony_ci			.formats = MTK_HOSTLESS_FORMATS,
7062306a36Sopenharmony_ci		},
7162306a36Sopenharmony_ci		.capture = {
7262306a36Sopenharmony_ci			.stream_name = "Hostless LPBK UL",
7362306a36Sopenharmony_ci			.channels_min = 1,
7462306a36Sopenharmony_ci			.channels_max = 2,
7562306a36Sopenharmony_ci			.rates = MTK_HOSTLESS_RATES,
7662306a36Sopenharmony_ci			.formats = MTK_HOSTLESS_FORMATS,
7762306a36Sopenharmony_ci		},
7862306a36Sopenharmony_ci		.ops = &mtk_dai_hostless_ops,
7962306a36Sopenharmony_ci	},
8062306a36Sopenharmony_ci	{
8162306a36Sopenharmony_ci		.name = "Hostless Speech DAI",
8262306a36Sopenharmony_ci		.id = MT6797_DAI_HOSTLESS_SPEECH,
8362306a36Sopenharmony_ci		.playback = {
8462306a36Sopenharmony_ci			.stream_name = "Hostless Speech DL",
8562306a36Sopenharmony_ci			.channels_min = 1,
8662306a36Sopenharmony_ci			.channels_max = 2,
8762306a36Sopenharmony_ci			.rates = MTK_HOSTLESS_RATES,
8862306a36Sopenharmony_ci			.formats = MTK_HOSTLESS_FORMATS,
8962306a36Sopenharmony_ci		},
9062306a36Sopenharmony_ci		.capture = {
9162306a36Sopenharmony_ci			.stream_name = "Hostless Speech UL",
9262306a36Sopenharmony_ci			.channels_min = 1,
9362306a36Sopenharmony_ci			.channels_max = 2,
9462306a36Sopenharmony_ci			.rates = MTK_HOSTLESS_RATES,
9562306a36Sopenharmony_ci			.formats = MTK_HOSTLESS_FORMATS,
9662306a36Sopenharmony_ci		},
9762306a36Sopenharmony_ci		.ops = &mtk_dai_hostless_ops,
9862306a36Sopenharmony_ci	},
9962306a36Sopenharmony_ci};
10062306a36Sopenharmony_ci
10162306a36Sopenharmony_ciint mt6797_dai_hostless_register(struct mtk_base_afe *afe)
10262306a36Sopenharmony_ci{
10362306a36Sopenharmony_ci	struct mtk_base_afe_dai *dai;
10462306a36Sopenharmony_ci
10562306a36Sopenharmony_ci	dai = devm_kzalloc(afe->dev, sizeof(*dai), GFP_KERNEL);
10662306a36Sopenharmony_ci	if (!dai)
10762306a36Sopenharmony_ci		return -ENOMEM;
10862306a36Sopenharmony_ci
10962306a36Sopenharmony_ci	list_add(&dai->list, &afe->sub_dais);
11062306a36Sopenharmony_ci
11162306a36Sopenharmony_ci	dai->dai_drivers = mtk_dai_hostless_driver;
11262306a36Sopenharmony_ci	dai->num_dai_drivers = ARRAY_SIZE(mtk_dai_hostless_driver);
11362306a36Sopenharmony_ci
11462306a36Sopenharmony_ci	dai->dapm_routes = mtk_dai_hostless_routes;
11562306a36Sopenharmony_ci	dai->num_dapm_routes = ARRAY_SIZE(mtk_dai_hostless_routes);
11662306a36Sopenharmony_ci
11762306a36Sopenharmony_ci	return 0;
11862306a36Sopenharmony_ci}
119