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 "mt8183-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 = MT8183_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 = MT8183_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 mt8183_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