Orange Pi5 kernel

Deprecated Linux kernel 5.10.110 for OrangePi 5/5B/5+ boards

3 Commits   0 Branches   0 Tags
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   1) // SPDX-License-Identifier: GPL-2.0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   2) //
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   3) // MediaTek ALSA SoC Audio DAI Hostless Control
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   4) //
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   5) // Copyright (c) 2018 MediaTek Inc.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   6) // Author: KaiChieh Chuang <kaichieh.chuang@mediatek.com>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   7) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   8) #include "mt8183-afe-common.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   9) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  10) /* dai component */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  11) static const struct snd_soc_dapm_route mtk_dai_hostless_routes[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  12) 	/* Hostless ADDA Loopback */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  13) 	{"ADDA_DL_CH1", "ADDA_UL_CH1", "Hostless LPBK DL"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  14) 	{"ADDA_DL_CH1", "ADDA_UL_CH2", "Hostless LPBK DL"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  15) 	{"ADDA_DL_CH2", "ADDA_UL_CH1", "Hostless LPBK DL"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  16) 	{"ADDA_DL_CH2", "ADDA_UL_CH2", "Hostless LPBK DL"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  17) 	{"Hostless LPBK UL", NULL, "ADDA Capture"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  18) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  19) 	/* Hostless Speech */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  20) 	{"ADDA_DL_CH1", "PCM_1_CAP_CH1", "Hostless Speech DL"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  21) 	{"ADDA_DL_CH2", "PCM_1_CAP_CH1", "Hostless Speech DL"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  22) 	{"ADDA_DL_CH2", "PCM_1_CAP_CH2", "Hostless Speech DL"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  23) 	{"ADDA_DL_CH1", "PCM_2_CAP_CH1", "Hostless Speech DL"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  24) 	{"ADDA_DL_CH2", "PCM_2_CAP_CH1", "Hostless Speech DL"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  25) 	{"ADDA_DL_CH2", "PCM_2_CAP_CH2", "Hostless Speech DL"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  26) 	{"PCM_1_PB_CH1", "ADDA_UL_CH1", "Hostless Speech DL"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  27) 	{"PCM_1_PB_CH2", "ADDA_UL_CH2", "Hostless Speech DL"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  28) 	{"PCM_2_PB_CH1", "ADDA_UL_CH1", "Hostless Speech DL"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  29) 	{"PCM_2_PB_CH2", "ADDA_UL_CH2", "Hostless Speech DL"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  30) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  31) 	{"Hostless Speech UL", NULL, "PCM 1 Capture"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  32) 	{"Hostless Speech UL", NULL, "PCM 2 Capture"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  33) 	{"Hostless Speech UL", NULL, "ADDA Capture"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  34) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  35) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  36) /* dai ops */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  37) static int mtk_dai_hostless_startup(struct snd_pcm_substream *substream,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  38) 				    struct snd_soc_dai *dai)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  39) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  40) 	struct mtk_base_afe *afe = snd_soc_dai_get_drvdata(dai);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  41) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  42) 	return snd_soc_set_runtime_hwparams(substream, afe->mtk_afe_hardware);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  43) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  44) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  45) static const struct snd_soc_dai_ops mtk_dai_hostless_ops = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  46) 	.startup = mtk_dai_hostless_startup,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  47) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  48) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  49) /* dai driver */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  50) #define MTK_HOSTLESS_RATES (SNDRV_PCM_RATE_8000_48000 |\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  51) 			   SNDRV_PCM_RATE_88200 |\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  52) 			   SNDRV_PCM_RATE_96000 |\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  53) 			   SNDRV_PCM_RATE_176400 |\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  54) 			   SNDRV_PCM_RATE_192000)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  55) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  56) #define MTK_HOSTLESS_FORMATS (SNDRV_PCM_FMTBIT_S16_LE |\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  57) 			     SNDRV_PCM_FMTBIT_S24_LE |\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  58) 			     SNDRV_PCM_FMTBIT_S32_LE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  59) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  60) static struct snd_soc_dai_driver mtk_dai_hostless_driver[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  61) 	{
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  62) 		.name = "Hostless LPBK DAI",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  63) 		.id = MT8183_DAI_HOSTLESS_LPBK,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  64) 		.playback = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  65) 			.stream_name = "Hostless LPBK DL",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  66) 			.channels_min = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  67) 			.channels_max = 2,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  68) 			.rates = MTK_HOSTLESS_RATES,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  69) 			.formats = MTK_HOSTLESS_FORMATS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  70) 		},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  71) 		.capture = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  72) 			.stream_name = "Hostless LPBK UL",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  73) 			.channels_min = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  74) 			.channels_max = 2,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  75) 			.rates = MTK_HOSTLESS_RATES,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  76) 			.formats = MTK_HOSTLESS_FORMATS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  77) 		},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  78) 		.ops = &mtk_dai_hostless_ops,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  79) 	},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  80) 	{
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  81) 		.name = "Hostless Speech DAI",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  82) 		.id = MT8183_DAI_HOSTLESS_SPEECH,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  83) 		.playback = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  84) 			.stream_name = "Hostless Speech DL",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  85) 			.channels_min = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  86) 			.channels_max = 2,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  87) 			.rates = MTK_HOSTLESS_RATES,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  88) 			.formats = MTK_HOSTLESS_FORMATS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  89) 		},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  90) 		.capture = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  91) 			.stream_name = "Hostless Speech UL",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  92) 			.channels_min = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  93) 			.channels_max = 2,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  94) 			.rates = MTK_HOSTLESS_RATES,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  95) 			.formats = MTK_HOSTLESS_FORMATS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  96) 		},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  97) 		.ops = &mtk_dai_hostless_ops,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  98) 	},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  99) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) int mt8183_dai_hostless_register(struct mtk_base_afe *afe)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) 	struct mtk_base_afe_dai *dai;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) 	dai = devm_kzalloc(afe->dev, sizeof(*dai), GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106) 	if (!dai)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) 		return -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109) 	list_add(&dai->list, &afe->sub_dais);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111) 	dai->dai_drivers = mtk_dai_hostless_driver;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112) 	dai->num_dai_drivers = ARRAY_SIZE(mtk_dai_hostless_driver);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114) 	dai->dapm_routes = mtk_dai_hostless_routes;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115) 	dai->num_dapm_routes = ARRAY_SIZE(mtk_dai_hostless_routes);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118) }