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