// SPDX-License-Identifier: GPL-2.0-only /* * Copyright (c) 2021-2024 NVIDIA CORPORATION & AFFILIATES. All rights reserved. */ #include #include #include #include #include #include #include #include #include #include #include #include "tegra_asoc_machine_virt_alt.h" #define CODEC_NAME NULL #define DAI_NAME(i) "AUDIO" #i #define STREAM_NAME "playback" #define LINK_CPU_NAME DRV_NAME #define CPU_DAI_NAME(i) "ADMAIF" #i #define CODEC_DAI_NAME "dit-hifi" #define PLATFORM_NAME LINK_CPU_NAME static unsigned int num_dai_links; static const struct snd_soc_pcm_stream default_params = { .rate_min = 48000, .rate_max = 48000, .channels_min = 2, .channels_max = 2, }; static const struct snd_soc_pcm_stream adsp_default_params = { .formats = SNDRV_PCM_FMTBIT_S16_LE, .rate_min = 48000, .rate_max = 48000, .channels_min = 2, .channels_max = 2, }; static struct snd_soc_pcm_stream adsp_admaif_params[MAX_ADMAIF_IDS]; #define TEGRA_SND_SOC_DAILINK_DEFS(id, name) \ SND_SOC_DAILINK_DEFS(audio##id, \ DAILINK_COMP_ARRAY(COMP_CODEC(LINK_CPU_NAME, CPU_DAI_NAME(id))), \ DAILINK_COMP_ARRAY(COMP_CODEC(LINK_CPU_NAME, "ADMAIF" name " CIF")), \ DAILINK_COMP_ARRAY(COMP_PLATFORM(PLATFORM_NAME))); TEGRA_SND_SOC_DAILINK_DEFS(1, "1") TEGRA_SND_SOC_DAILINK_DEFS(2, "2") TEGRA_SND_SOC_DAILINK_DEFS(3, "3") TEGRA_SND_SOC_DAILINK_DEFS(4, "4") TEGRA_SND_SOC_DAILINK_DEFS(5, "5") TEGRA_SND_SOC_DAILINK_DEFS(6, "6") TEGRA_SND_SOC_DAILINK_DEFS(7, "7") TEGRA_SND_SOC_DAILINK_DEFS(8, "8") TEGRA_SND_SOC_DAILINK_DEFS(9, "9") TEGRA_SND_SOC_DAILINK_DEFS(10, "10") TEGRA_SND_SOC_DAILINK_DEFS(11, "11") TEGRA_SND_SOC_DAILINK_DEFS(12, "12") TEGRA_SND_SOC_DAILINK_DEFS(13, "13") TEGRA_SND_SOC_DAILINK_DEFS(14, "14") TEGRA_SND_SOC_DAILINK_DEFS(15, "15") TEGRA_SND_SOC_DAILINK_DEFS(16, "16") TEGRA_SND_SOC_DAILINK_DEFS(17, "17") TEGRA_SND_SOC_DAILINK_DEFS(18, "18") TEGRA_SND_SOC_DAILINK_DEFS(19, "19") TEGRA_SND_SOC_DAILINK_DEFS(20, "20") TEGRA_SND_SOC_DAILINK_DEFS(21, "21") TEGRA_SND_SOC_DAILINK_DEFS(22, "22") TEGRA_SND_SOC_DAILINK_DEFS(23, "23") TEGRA_SND_SOC_DAILINK_DEFS(24, "24") TEGRA_SND_SOC_DAILINK_DEFS(25, "25") TEGRA_SND_SOC_DAILINK_DEFS(26, "26") TEGRA_SND_SOC_DAILINK_DEFS(27, "27") TEGRA_SND_SOC_DAILINK_DEFS(28, "28") TEGRA_SND_SOC_DAILINK_DEFS(29, "29") TEGRA_SND_SOC_DAILINK_DEFS(30, "30") TEGRA_SND_SOC_DAILINK_DEFS(31, "31") TEGRA_SND_SOC_DAILINK_DEFS(32, "32") SND_SOC_DAILINK_DEFS(adsp_admaif1, DAILINK_COMP_ARRAY(COMP_CODEC("tegra210-adsp-virt","ADSP-ADMAIF1")), DAILINK_COMP_ARRAY(COMP_CODEC(LINK_CPU_NAME, "ADMAIF1 CIF"))); SND_SOC_DAILINK_DEFS(adsp_admaif2, DAILINK_COMP_ARRAY(COMP_CODEC("tegra210-adsp-virt","ADSP-ADMAIF2")), DAILINK_COMP_ARRAY(COMP_CODEC(LINK_CPU_NAME, "ADMAIF2 CIF"))); SND_SOC_DAILINK_DEFS(adsp_admaif3, DAILINK_COMP_ARRAY(COMP_CODEC("tegra210-adsp-virt","ADSP-ADMAIF3")), DAILINK_COMP_ARRAY(COMP_CODEC(LINK_CPU_NAME, "ADMAIF3 CIF"))); SND_SOC_DAILINK_DEFS(adsp_admaif4, DAILINK_COMP_ARRAY(COMP_CODEC("tegra210-adsp-virt","ADSP-ADMAIF4")), DAILINK_COMP_ARRAY(COMP_CODEC(LINK_CPU_NAME, "ADMAIF4 CIF"))); SND_SOC_DAILINK_DEFS(adsp_admaif5, DAILINK_COMP_ARRAY(COMP_CODEC("tegra210-adsp-virt","ADSP-ADMAIF5")), DAILINK_COMP_ARRAY(COMP_CODEC(LINK_CPU_NAME, "ADMAIF5 CIF"))); SND_SOC_DAILINK_DEFS(adsp_admaif6, DAILINK_COMP_ARRAY(COMP_CODEC("tegra210-adsp-virt","ADSP-ADMAIF6")), DAILINK_COMP_ARRAY(COMP_CODEC(LINK_CPU_NAME, "ADMAIF6 CIF"))); SND_SOC_DAILINK_DEFS(adsp_admaif7, DAILINK_COMP_ARRAY(COMP_CODEC("tegra210-adsp-virt","ADSP-ADMAIF7")), DAILINK_COMP_ARRAY(COMP_CODEC(LINK_CPU_NAME, "ADMAIF7 CIF"))); SND_SOC_DAILINK_DEFS(adsp_admaif8, DAILINK_COMP_ARRAY(COMP_CODEC("tegra210-adsp-virt","ADSP-ADMAIF8")), DAILINK_COMP_ARRAY(COMP_CODEC(LINK_CPU_NAME, "ADMAIF8 CIF"))); SND_SOC_DAILINK_DEFS(adsp_admaif9, DAILINK_COMP_ARRAY(COMP_CODEC("tegra210-adsp-virt","ADSP-ADMAIF9")), DAILINK_COMP_ARRAY(COMP_CODEC(LINK_CPU_NAME, "ADMAIF9 CIF"))); SND_SOC_DAILINK_DEFS(adsp_admaif10, DAILINK_COMP_ARRAY(COMP_CODEC("tegra210-adsp-virt","ADSP-ADMAIF10")), DAILINK_COMP_ARRAY(COMP_CODEC(LINK_CPU_NAME, "ADMAIF10 CIF"))); SND_SOC_DAILINK_DEFS(adsp_admaif11, DAILINK_COMP_ARRAY(COMP_CODEC("tegra210-adsp-virt","ADSP-ADMAIF11")), DAILINK_COMP_ARRAY(COMP_CODEC(LINK_CPU_NAME, "ADMAIF11 CIF"))); SND_SOC_DAILINK_DEFS(adsp_admaif12, DAILINK_COMP_ARRAY(COMP_CODEC("tegra210-adsp-virt","ADSP-ADMAIF12")), DAILINK_COMP_ARRAY(COMP_CODEC(LINK_CPU_NAME, "ADMAIF12 CIF"))); SND_SOC_DAILINK_DEFS(adsp_admaif13, DAILINK_COMP_ARRAY(COMP_CODEC("tegra210-adsp-virt","ADSP-ADMAIF13")), DAILINK_COMP_ARRAY(COMP_CODEC(LINK_CPU_NAME, "ADMAIF13 CIF"))); SND_SOC_DAILINK_DEFS(adsp_admaif14, DAILINK_COMP_ARRAY(COMP_CODEC("tegra210-adsp-virt","ADSP-ADMAIF14")), DAILINK_COMP_ARRAY(COMP_CODEC(LINK_CPU_NAME, "ADMAIF14 CIF"))); SND_SOC_DAILINK_DEFS(adsp_admaif15, DAILINK_COMP_ARRAY(COMP_CODEC("tegra210-adsp-virt","ADSP-ADMAIF15")), DAILINK_COMP_ARRAY(COMP_CODEC(LINK_CPU_NAME, "ADMAIF15 CIF"))); SND_SOC_DAILINK_DEFS(adsp_admaif16, DAILINK_COMP_ARRAY(COMP_CODEC("tegra210-adsp-virt","ADSP-ADMAIF16")), DAILINK_COMP_ARRAY(COMP_CODEC(LINK_CPU_NAME, "ADMAIF16 CIF"))); SND_SOC_DAILINK_DEFS(adsp_admaif17, DAILINK_COMP_ARRAY(COMP_CODEC("tegra210-adsp-virt","ADSP-ADMAIF17")), DAILINK_COMP_ARRAY(COMP_CODEC(LINK_CPU_NAME, "ADMAIF17 CIF"))); SND_SOC_DAILINK_DEFS(adsp_admaif18, DAILINK_COMP_ARRAY(COMP_CODEC("tegra210-adsp-virt","ADSP-ADMAIF18")), DAILINK_COMP_ARRAY(COMP_CODEC(LINK_CPU_NAME, "ADMAIF18 CIF"))); SND_SOC_DAILINK_DEFS(adsp_admaif19, DAILINK_COMP_ARRAY(COMP_CODEC("tegra210-adsp-virt","ADSP-ADMAIF19")), DAILINK_COMP_ARRAY(COMP_CODEC(LINK_CPU_NAME, "ADMAIF19 CIF"))); SND_SOC_DAILINK_DEFS(adsp_admaif20, DAILINK_COMP_ARRAY(COMP_CODEC("tegra210-adsp-virt","ADSP-ADMAIF20")), DAILINK_COMP_ARRAY(COMP_CODEC(LINK_CPU_NAME, "ADMAIF20 CIF"))); SND_SOC_DAILINK_DEFS(adsp_pcm1, DAILINK_COMP_ARRAY(COMP_CODEC("tegra210-adsp-virt","ADSP PCM1")), DAILINK_COMP_ARRAY(COMP_CODEC("tegra210-adsp-virt", "ADSP-FE1")), DAILINK_COMP_ARRAY(COMP_PLATFORM("tegra210-adsp-virt"))); SND_SOC_DAILINK_DEFS(adsp_pcm2, DAILINK_COMP_ARRAY(COMP_CODEC("tegra210-adsp-virt","ADSP PCM2")), DAILINK_COMP_ARRAY(COMP_CODEC("tegra210-adsp-virt", "ADSP-FE2")), DAILINK_COMP_ARRAY(COMP_PLATFORM("tegra210-adsp-virt"))); SND_SOC_DAILINK_DEFS(adsp_pcm3, DAILINK_COMP_ARRAY(COMP_CODEC("tegra210-adsp-virt","ADSP PCM3")), DAILINK_COMP_ARRAY(COMP_CODEC("tegra210-adsp-virt", "ADSP-FE3")), DAILINK_COMP_ARRAY(COMP_PLATFORM("tegra210-adsp-virt"))); SND_SOC_DAILINK_DEFS(adsp_pcm4, DAILINK_COMP_ARRAY(COMP_CODEC("tegra210-adsp-virt","ADSP PCM4")), DAILINK_COMP_ARRAY(COMP_CODEC("tegra210-adsp-virt", "ADSP-FE4")), DAILINK_COMP_ARRAY(COMP_PLATFORM("tegra210-adsp-virt"))); SND_SOC_DAILINK_DEFS(adsp_pcm5, DAILINK_COMP_ARRAY(COMP_CODEC("tegra210-adsp-virt","ADSP PCM5")), DAILINK_COMP_ARRAY(COMP_CODEC("tegra210-adsp-virt", "ADSP-FE5")), DAILINK_COMP_ARRAY(COMP_PLATFORM("tegra210-adsp-virt"))); SND_SOC_DAILINK_DEFS(adsp_pcm6, DAILINK_COMP_ARRAY(COMP_CODEC("tegra210-adsp-virt","ADSP PCM6")), DAILINK_COMP_ARRAY(COMP_CODEC("tegra210-adsp-virt", "ADSP-FE6")), DAILINK_COMP_ARRAY(COMP_PLATFORM("tegra210-adsp-virt"))); SND_SOC_DAILINK_DEFS(adsp_pcm7, DAILINK_COMP_ARRAY(COMP_CODEC("tegra210-adsp-virt","ADSP PCM7")), DAILINK_COMP_ARRAY(COMP_CODEC("tegra210-adsp-virt", "ADSP-FE7")), DAILINK_COMP_ARRAY(COMP_PLATFORM("tegra210-adsp-virt"))); SND_SOC_DAILINK_DEFS(adsp_pcm8, DAILINK_COMP_ARRAY(COMP_CODEC("tegra210-adsp-virt","ADSP PCM8")), DAILINK_COMP_ARRAY(COMP_CODEC("tegra210-adsp-virt", "ADSP-FE8")), DAILINK_COMP_ARRAY(COMP_PLATFORM("tegra210-adsp-virt"))); SND_SOC_DAILINK_DEFS(adsp_pcm9, DAILINK_COMP_ARRAY(COMP_CODEC("tegra210-adsp-virt","ADSP PCM9")), DAILINK_COMP_ARRAY(COMP_CODEC("tegra210-adsp-virt", "ADSP-FE9")), DAILINK_COMP_ARRAY(COMP_PLATFORM("tegra210-adsp-virt"))); SND_SOC_DAILINK_DEFS(adsp_pcm10, DAILINK_COMP_ARRAY(COMP_CODEC("tegra210-adsp-virt","ADSP PCM10")), DAILINK_COMP_ARRAY(COMP_CODEC("tegra210-adsp-virt", "ADSP-FE10")), DAILINK_COMP_ARRAY(COMP_PLATFORM("tegra210-adsp-virt"))); SND_SOC_DAILINK_DEFS(adsp_pcm11, DAILINK_COMP_ARRAY(COMP_CODEC("tegra210-adsp-virt","ADSP PCM11")), DAILINK_COMP_ARRAY(COMP_CODEC("tegra210-adsp-virt", "ADSP-FE11")), DAILINK_COMP_ARRAY(COMP_PLATFORM("tegra210-adsp-virt"))); SND_SOC_DAILINK_DEFS(adsp_pcm12, DAILINK_COMP_ARRAY(COMP_CODEC("tegra210-adsp-virt","ADSP PCM12")), DAILINK_COMP_ARRAY(COMP_CODEC("tegra210-adsp-virt", "ADSP-FE12")), DAILINK_COMP_ARRAY(COMP_PLATFORM("tegra210-adsp-virt"))); SND_SOC_DAILINK_DEFS(adsp_pcm13, DAILINK_COMP_ARRAY(COMP_CODEC("tegra210-adsp-virt","ADSP PCM13")), DAILINK_COMP_ARRAY(COMP_CODEC("tegra210-adsp-virt", "ADSP-FE13")), DAILINK_COMP_ARRAY(COMP_PLATFORM("tegra210-adsp-virt"))); SND_SOC_DAILINK_DEFS(adsp_pcm14, DAILINK_COMP_ARRAY(COMP_CODEC("tegra210-adsp-virt","ADSP PCM14")), DAILINK_COMP_ARRAY(COMP_CODEC("tegra210-adsp-virt", "ADSP-FE14")), DAILINK_COMP_ARRAY(COMP_PLATFORM("tegra210-adsp-virt"))); SND_SOC_DAILINK_DEFS(adsp_pcm15, DAILINK_COMP_ARRAY(COMP_CODEC("tegra210-adsp-virt","ADSP PCM15")), DAILINK_COMP_ARRAY(COMP_CODEC("tegra210-adsp-virt", "ADSP-FE15")), DAILINK_COMP_ARRAY(COMP_PLATFORM("tegra210-adsp-virt"))); #if defined(NV_SND_SOC_DAI_LINK_STRUCT_HAS_C2C_PARAMS_ARG) /* Linux v6.4 */ #define TEGRA_DAI_LINK(id) \ { \ .name = DAI_NAME(id), \ .stream_name = STREAM_NAME, \ .c2c_params = &default_params, \ .ignore_pmdown_time = 1, \ .ignore_suspend = 0, \ SND_SOC_DAILINK_REG(audio##id), \ }, #else #define TEGRA_DAI_LINK(id) \ { \ .name = DAI_NAME(id), \ .stream_name = STREAM_NAME, \ .params = &default_params, \ .ignore_pmdown_time = 1, \ .ignore_suspend = 0, \ SND_SOC_DAILINK_REG(audio##id), \ }, #endif static struct snd_soc_dai_link tegra_virt_t264ref_pcm_links[] = { TEGRA_DAI_LINK(1) TEGRA_DAI_LINK(2) TEGRA_DAI_LINK(3) TEGRA_DAI_LINK(4) TEGRA_DAI_LINK(5) TEGRA_DAI_LINK(6) TEGRA_DAI_LINK(7) TEGRA_DAI_LINK(8) TEGRA_DAI_LINK(9) TEGRA_DAI_LINK(10) TEGRA_DAI_LINK(11) TEGRA_DAI_LINK(12) TEGRA_DAI_LINK(13) TEGRA_DAI_LINK(14) TEGRA_DAI_LINK(15) TEGRA_DAI_LINK(16) TEGRA_DAI_LINK(17) TEGRA_DAI_LINK(18) TEGRA_DAI_LINK(19) TEGRA_DAI_LINK(20) TEGRA_DAI_LINK(21) TEGRA_DAI_LINK(22) TEGRA_DAI_LINK(23) TEGRA_DAI_LINK(24) TEGRA_DAI_LINK(25) TEGRA_DAI_LINK(26) TEGRA_DAI_LINK(27) TEGRA_DAI_LINK(28) TEGRA_DAI_LINK(29) TEGRA_DAI_LINK(30) TEGRA_DAI_LINK(31) TEGRA_DAI_LINK(32) }; static struct snd_soc_dai_link tegra_virt_t186ref_pcm_links[] = { { /* 0 */ .name = DAI_NAME(1), .stream_name = STREAM_NAME, #if defined(NV_SND_SOC_DAI_LINK_STRUCT_HAS_C2C_PARAMS_ARG) /* Linux v6.4 */ .c2c_params = &default_params, #else .params = &default_params, #endif .ignore_pmdown_time = 1, .ignore_suspend = 0, SND_SOC_DAILINK_REG(audio1), }, { /* 1 */ .name = DAI_NAME(2), .stream_name = STREAM_NAME, #if defined(NV_SND_SOC_DAI_LINK_STRUCT_HAS_C2C_PARAMS_ARG) /* Linux v6.4 */ .c2c_params = &default_params, #else .params = &default_params, #endif .ignore_pmdown_time = 1, .ignore_suspend = 0, SND_SOC_DAILINK_REG(audio2), }, { /* 2 */ .name = DAI_NAME(3), .stream_name = STREAM_NAME, #if defined(NV_SND_SOC_DAI_LINK_STRUCT_HAS_C2C_PARAMS_ARG) /* Linux v6.4 */ .c2c_params = &default_params, #else .params = &default_params, #endif .ignore_pmdown_time = 1, .ignore_suspend = 0, SND_SOC_DAILINK_REG(audio3), }, { /* 3 */ .name = DAI_NAME(4), .stream_name = STREAM_NAME, #if defined(NV_SND_SOC_DAI_LINK_STRUCT_HAS_C2C_PARAMS_ARG) /* Linux v6.4 */ .c2c_params = &default_params, #else .params = &default_params, #endif .ignore_pmdown_time = 1, .ignore_suspend = 0, SND_SOC_DAILINK_REG(audio4), }, { /* 4 */ .name = DAI_NAME(5), .stream_name = STREAM_NAME, #if defined(NV_SND_SOC_DAI_LINK_STRUCT_HAS_C2C_PARAMS_ARG) /* Linux v6.4 */ .c2c_params = &default_params, #else .params = &default_params, #endif .ignore_pmdown_time = 1, .ignore_suspend = 0, SND_SOC_DAILINK_REG(audio5), }, { /* 5 */ .name = DAI_NAME(6), .stream_name = STREAM_NAME, #if defined(NV_SND_SOC_DAI_LINK_STRUCT_HAS_C2C_PARAMS_ARG) /* Linux v6.4 */ .c2c_params = &default_params, #else .params = &default_params, #endif .ignore_pmdown_time = 1, .ignore_suspend = 0, SND_SOC_DAILINK_REG(audio6), }, { /* 6 */ .name = DAI_NAME(7), .stream_name = STREAM_NAME, #if defined(NV_SND_SOC_DAI_LINK_STRUCT_HAS_C2C_PARAMS_ARG) /* Linux v6.4 */ .c2c_params = &default_params, #else .params = &default_params, #endif .ignore_pmdown_time = 1, .ignore_suspend = 0, SND_SOC_DAILINK_REG(audio7), }, { /* 7 */ .name = DAI_NAME(8), .stream_name = STREAM_NAME, #if defined(NV_SND_SOC_DAI_LINK_STRUCT_HAS_C2C_PARAMS_ARG) /* Linux v6.4 */ .c2c_params = &default_params, #else .params = &default_params, #endif .ignore_pmdown_time = 1, .ignore_suspend = 0, SND_SOC_DAILINK_REG(audio8), }, { /* 8 */ .name = DAI_NAME(9), .stream_name = STREAM_NAME, #if defined(NV_SND_SOC_DAI_LINK_STRUCT_HAS_C2C_PARAMS_ARG) /* Linux v6.4 */ .c2c_params = &default_params, #else .params = &default_params, #endif .ignore_pmdown_time = 1, .ignore_suspend = 0, SND_SOC_DAILINK_REG(audio9), }, { /* 9 */ .name = DAI_NAME(10), .stream_name = STREAM_NAME, #if defined(NV_SND_SOC_DAI_LINK_STRUCT_HAS_C2C_PARAMS_ARG) /* Linux v6.4 */ .c2c_params = &default_params, #else .params = &default_params, #endif .ignore_pmdown_time = 1, .ignore_suspend = 0, SND_SOC_DAILINK_REG(audio10), }, { /* 10 */ .name = DAI_NAME(11), .stream_name = STREAM_NAME, #if defined(NV_SND_SOC_DAI_LINK_STRUCT_HAS_C2C_PARAMS_ARG) /* Linux v6.4 */ .c2c_params = &default_params, #else .params = &default_params, #endif .ignore_pmdown_time = 1, .ignore_suspend = 0, SND_SOC_DAILINK_REG(audio11), }, { /* 11 */ .name = DAI_NAME(12), .stream_name = STREAM_NAME, #if defined(NV_SND_SOC_DAI_LINK_STRUCT_HAS_C2C_PARAMS_ARG) /* Linux v6.4 */ .c2c_params = &default_params, #else .params = &default_params, #endif .ignore_pmdown_time = 1, .ignore_suspend = 0, SND_SOC_DAILINK_REG(audio12), }, { /* 12 */ .name = DAI_NAME(13), .stream_name = STREAM_NAME, #if defined(NV_SND_SOC_DAI_LINK_STRUCT_HAS_C2C_PARAMS_ARG) /* Linux v6.4 */ .c2c_params = &default_params, #else .params = &default_params, #endif .ignore_pmdown_time = 1, .ignore_suspend = 0, SND_SOC_DAILINK_REG(audio13), }, { /* 13 */ .name = DAI_NAME(14), .stream_name = STREAM_NAME, #if defined(NV_SND_SOC_DAI_LINK_STRUCT_HAS_C2C_PARAMS_ARG) /* Linux v6.4 */ .c2c_params = &default_params, #else .params = &default_params, #endif .ignore_pmdown_time = 1, .ignore_suspend = 0, SND_SOC_DAILINK_REG(audio14), }, { /* 14 */ .name = DAI_NAME(15), .stream_name = STREAM_NAME, #if defined(NV_SND_SOC_DAI_LINK_STRUCT_HAS_C2C_PARAMS_ARG) /* Linux v6.4 */ .c2c_params = &default_params, #else .params = &default_params, #endif .ignore_pmdown_time = 1, .ignore_suspend = 0, SND_SOC_DAILINK_REG(audio15), }, { /* 15 */ .name = DAI_NAME(16), .stream_name = STREAM_NAME, #if defined(NV_SND_SOC_DAI_LINK_STRUCT_HAS_C2C_PARAMS_ARG) /* Linux v6.4 */ .c2c_params = &default_params, #else .params = &default_params, #endif .ignore_pmdown_time = 1, .ignore_suspend = 0, SND_SOC_DAILINK_REG(audio16), }, { /* 16 */ .name = DAI_NAME(17), .stream_name = STREAM_NAME, #if defined(NV_SND_SOC_DAI_LINK_STRUCT_HAS_C2C_PARAMS_ARG) /* Linux v6.4 */ .c2c_params = &default_params, #else .params = &default_params, #endif .ignore_pmdown_time = 1, .ignore_suspend = 0, SND_SOC_DAILINK_REG(audio17), }, { /* 17 */ .name = DAI_NAME(18), .stream_name = STREAM_NAME, #if defined(NV_SND_SOC_DAI_LINK_STRUCT_HAS_C2C_PARAMS_ARG) /* Linux v6.4 */ .c2c_params = &default_params, #else .params = &default_params, #endif .ignore_pmdown_time = 1, .ignore_suspend = 0, SND_SOC_DAILINK_REG(audio18), }, { /* 18 */ .name = DAI_NAME(19), .stream_name = STREAM_NAME, #if defined(NV_SND_SOC_DAI_LINK_STRUCT_HAS_C2C_PARAMS_ARG) /* Linux v6.4 */ .c2c_params = &default_params, #else .params = &default_params, #endif .ignore_pmdown_time = 1, .ignore_suspend = 0, SND_SOC_DAILINK_REG(audio19), }, { /* 19 */ .name = DAI_NAME(20), .stream_name = STREAM_NAME, #if defined(NV_SND_SOC_DAI_LINK_STRUCT_HAS_C2C_PARAMS_ARG) /* Linux v6.4 */ .c2c_params = &default_params, #else .params = &default_params, #endif .ignore_pmdown_time = 1, .ignore_suspend = 0, SND_SOC_DAILINK_REG(audio20), }, { /* 20 */ .name = "ADSP ADMAIF1", .stream_name = "ADSP AFMAIF1", #if defined(NV_SND_SOC_DAI_LINK_STRUCT_HAS_C2C_PARAMS_ARG) /* Linux v6.4 */ .c2c_params = &adsp_default_params, #else .params = &adsp_default_params, #endif .ignore_suspend = 1, SND_SOC_DAILINK_REG(adsp_admaif1), }, { /* 21 */ .name = "ADSP ADMAIF2", .stream_name = "ADSP AFMAIF2", #if defined(NV_SND_SOC_DAI_LINK_STRUCT_HAS_C2C_PARAMS_ARG) /* Linux v6.4 */ .c2c_params = &adsp_default_params, #else .params = &adsp_default_params, #endif .ignore_suspend = 1, SND_SOC_DAILINK_REG(adsp_admaif2), }, { /* 22 */ .name = "ADSP ADMAIF3", .stream_name = "ADSP AFMAIF3", #if defined(NV_SND_SOC_DAI_LINK_STRUCT_HAS_C2C_PARAMS_ARG) /* Linux v6.4 */ .c2c_params = &adsp_default_params, #else .params = &adsp_default_params, #endif .ignore_suspend = 1, SND_SOC_DAILINK_REG(adsp_admaif3), }, { /* 23 */ .name = "ADSP ADMAIF4", .stream_name = "ADSP AFMAIF4", #if defined(NV_SND_SOC_DAI_LINK_STRUCT_HAS_C2C_PARAMS_ARG) /* Linux v6.4 */ .c2c_params = &adsp_default_params, #else .params = &adsp_default_params, #endif .ignore_suspend = 1, SND_SOC_DAILINK_REG(adsp_admaif4), }, { /* 24 */ .name = "ADSP ADMAIF5", .stream_name = "ADSP AFMAIF5", #if defined(NV_SND_SOC_DAI_LINK_STRUCT_HAS_C2C_PARAMS_ARG) /* Linux v6.4 */ .c2c_params = &adsp_default_params, #else .params = &adsp_default_params, #endif .ignore_suspend = 1, SND_SOC_DAILINK_REG(adsp_admaif5), }, { /* 25 */ .name = "ADSP ADMAIF6", .stream_name = "ADSP AFMAIF6", #if defined(NV_SND_SOC_DAI_LINK_STRUCT_HAS_C2C_PARAMS_ARG) /* Linux v6.4 */ .c2c_params = &adsp_default_params, #else .params = &adsp_default_params, #endif .ignore_suspend = 1, SND_SOC_DAILINK_REG(adsp_admaif6), }, { /* 26 */ .name = "ADSP ADMAIF7", .stream_name = "ADSP AFMAIF7", #if defined(NV_SND_SOC_DAI_LINK_STRUCT_HAS_C2C_PARAMS_ARG) /* Linux v6.4 */ .c2c_params = &adsp_default_params, #else .params = &adsp_default_params, #endif .ignore_suspend = 1, SND_SOC_DAILINK_REG(adsp_admaif7), }, { /* 27 */ .name = "ADSP ADMAIF8", .stream_name = "ADSP AFMAIF8", #if defined(NV_SND_SOC_DAI_LINK_STRUCT_HAS_C2C_PARAMS_ARG) /* Linux v6.4 */ .c2c_params = &adsp_default_params, #else .params = &adsp_default_params, #endif .ignore_suspend = 1, SND_SOC_DAILINK_REG(adsp_admaif8), }, { /* 28 */ .name = "ADSP ADMAIF9", .stream_name = "ADSP AFMAIF9", #if defined(NV_SND_SOC_DAI_LINK_STRUCT_HAS_C2C_PARAMS_ARG) /* Linux v6.4 */ .c2c_params = &adsp_default_params, #else .params = &adsp_default_params, #endif .ignore_suspend = 1, SND_SOC_DAILINK_REG(adsp_admaif9), }, { /* 29 */ .name = "ADSP ADMAIF10", .stream_name = "ADSP AFMAIF10", #if defined(NV_SND_SOC_DAI_LINK_STRUCT_HAS_C2C_PARAMS_ARG) /* Linux v6.4 */ .c2c_params = &adsp_default_params, #else .params = &adsp_default_params, #endif .ignore_suspend = 1, SND_SOC_DAILINK_REG(adsp_admaif10), }, { /* 30 */ .name = "ADSP ADMAIF11", .stream_name = "ADSP AFMAIF11", #if defined(NV_SND_SOC_DAI_LINK_STRUCT_HAS_C2C_PARAMS_ARG) /* Linux v6.4 */ .c2c_params = &adsp_default_params, #else .params = &adsp_default_params, #endif .ignore_suspend = 1, SND_SOC_DAILINK_REG(adsp_admaif11), }, { /* 31 */ .name = "ADSP ADMAIF12", .stream_name = "ADSP AFMAIF12", #if defined(NV_SND_SOC_DAI_LINK_STRUCT_HAS_C2C_PARAMS_ARG) /* Linux v6.4 */ .c2c_params = &adsp_default_params, #else .params = &adsp_default_params, #endif .ignore_suspend = 1, SND_SOC_DAILINK_REG(adsp_admaif12), }, { /* 32 */ .name = "ADSP ADMAIF13", .stream_name = "ADSP AFMAIF13", #if defined(NV_SND_SOC_DAI_LINK_STRUCT_HAS_C2C_PARAMS_ARG) /* Linux v6.4 */ .c2c_params = &adsp_default_params, #else .params = &adsp_default_params, #endif .ignore_suspend = 1, SND_SOC_DAILINK_REG(adsp_admaif13), }, { /* 33 */ .name = "ADSP ADMAIF14", .stream_name = "ADSP AFMAIF14", #if defined(NV_SND_SOC_DAI_LINK_STRUCT_HAS_C2C_PARAMS_ARG) /* Linux v6.4 */ .c2c_params = &adsp_default_params, #else .params = &adsp_default_params, #endif .ignore_suspend = 1, SND_SOC_DAILINK_REG(adsp_admaif14), }, { /* 34 */ .name = "ADSP ADMAIF15", .stream_name = "ADSP AFMAIF15", #if defined(NV_SND_SOC_DAI_LINK_STRUCT_HAS_C2C_PARAMS_ARG) /* Linux v6.4 */ .c2c_params = &adsp_default_params, #else .params = &adsp_default_params, #endif .ignore_suspend = 1, SND_SOC_DAILINK_REG(adsp_admaif15), }, { /* 35 */ .name = "ADSP ADMAIF16", .stream_name = "ADSP AFMAIF16", #if defined(NV_SND_SOC_DAI_LINK_STRUCT_HAS_C2C_PARAMS_ARG) /* Linux v6.4 */ .c2c_params = &adsp_default_params, #else .params = &adsp_default_params, #endif .ignore_suspend = 1, SND_SOC_DAILINK_REG(adsp_admaif16), }, { /* 36 */ .name = "ADSP ADMAIF17", .stream_name = "ADSP AFMAIF17", #if defined(NV_SND_SOC_DAI_LINK_STRUCT_HAS_C2C_PARAMS_ARG) /* Linux v6.4 */ .c2c_params = &adsp_default_params, #else .params = &adsp_default_params, #endif .ignore_suspend = 1, SND_SOC_DAILINK_REG(adsp_admaif17), }, { /* 37 */ .name = "ADSP ADMAIF18", .stream_name = "ADSP AFMAIF18", #if defined(NV_SND_SOC_DAI_LINK_STRUCT_HAS_C2C_PARAMS_ARG) /* Linux v6.4 */ .c2c_params = &adsp_default_params, #else .params = &adsp_default_params, #endif .ignore_suspend = 1, SND_SOC_DAILINK_REG(adsp_admaif18), }, { /* 38 */ .name = "ADSP ADMAIF19", .stream_name = "ADSP AFMAIF19", #if defined(NV_SND_SOC_DAI_LINK_STRUCT_HAS_C2C_PARAMS_ARG) /* Linux v6.4 */ .c2c_params = &adsp_default_params, #else .params = &adsp_default_params, #endif .ignore_suspend = 1, SND_SOC_DAILINK_REG(adsp_admaif19), }, { /* 39 */ .name = "ADSP ADMAIF20", .stream_name = "ADSP AFMAIF20", #if defined(NV_SND_SOC_DAI_LINK_STRUCT_HAS_C2C_PARAMS_ARG) /* Linux v6.4 */ .c2c_params = &adsp_default_params, #else .params = &adsp_default_params, #endif .ignore_suspend = 1, SND_SOC_DAILINK_REG(adsp_admaif20), }, { /* 40 */ .name = "ADSP PCM1", .stream_name = "ADSP PCM1", .ignore_pmdown_time = 1, .ignore_suspend = 0, SND_SOC_DAILINK_REG(adsp_pcm1), }, { /* 41 */ .name = "ADSP PCM2", .stream_name = "ADSP PCM2", .ignore_pmdown_time = 1, .ignore_suspend = 0, SND_SOC_DAILINK_REG(adsp_pcm2), }, { .name = "ADSP PCM3", .stream_name = "ADSP PCM3", .ignore_pmdown_time = 1, .ignore_suspend = 0, SND_SOC_DAILINK_REG(adsp_pcm3), }, { .name = "ADSP PCM4", .stream_name = "ADSP PCM4", .ignore_pmdown_time = 1, .ignore_suspend = 0, SND_SOC_DAILINK_REG(adsp_pcm4), }, { .name = "ADSP PCM5", .stream_name = "ADSP PCM5", .ignore_pmdown_time = 1, .ignore_suspend = 0, SND_SOC_DAILINK_REG(adsp_pcm5), }, { .name = "ADSP PCM6", .stream_name = "ADSP PCM6", .ignore_pmdown_time = 1, .ignore_suspend = 0, SND_SOC_DAILINK_REG(adsp_pcm6), }, { .name = "ADSP PCM7", .stream_name = "ADSP PCM7", .ignore_pmdown_time = 1, .ignore_suspend = 0, SND_SOC_DAILINK_REG(adsp_pcm7), }, { .name = "ADSP PCM8", .stream_name = "ADSP PCM8", .ignore_pmdown_time = 1, .ignore_suspend = 0, SND_SOC_DAILINK_REG(adsp_pcm8), }, { .name = "ADSP PCM9", .stream_name = "ADSP PCM9", .ignore_pmdown_time = 1, .ignore_suspend = 0, SND_SOC_DAILINK_REG(adsp_pcm9), }, { .name = "ADSP PCM10", .stream_name = "ADSP PCM10", .ignore_pmdown_time = 1, .ignore_suspend = 0, SND_SOC_DAILINK_REG(adsp_pcm10), }, { .name = "ADSP PCM11", .stream_name = "ADSP PCM11", .ignore_pmdown_time = 1, .ignore_suspend = 0, SND_SOC_DAILINK_REG(adsp_pcm11), }, { .name = "ADSP PCM12", .stream_name = "ADSP PCM12", .ignore_pmdown_time = 1, .ignore_suspend = 0, SND_SOC_DAILINK_REG(adsp_pcm12), }, { .name = "ADSP PCM13", .stream_name = "ADSP PCM13", .ignore_pmdown_time = 1, .ignore_suspend = 0, SND_SOC_DAILINK_REG(adsp_pcm13), }, { .name = "ADSP PCM14", .stream_name = "ADSP PCM14", .ignore_pmdown_time = 1, .ignore_suspend = 0, SND_SOC_DAILINK_REG(adsp_pcm14), }, { .name = "ADSP PCM15", .stream_name = "ADSP PCM15", .ignore_pmdown_time = 1, .ignore_suspend = 0, SND_SOC_DAILINK_REG(adsp_pcm15), }, }; static struct snd_soc_dai_link tegra_virt_t210ref_pcm_links[] = { { /* 0 */ .name = DAI_NAME(1), .stream_name = STREAM_NAME, #if defined(NV_SND_SOC_DAI_LINK_STRUCT_HAS_C2C_PARAMS_ARG) /* Linux v6.4 */ .c2c_params = &default_params, #else .params = &default_params, #endif .ignore_pmdown_time = 1, .ignore_suspend = 1, SND_SOC_DAILINK_REG(audio1), }, { /* 1 */ .name = DAI_NAME(2), .stream_name = STREAM_NAME, #if defined(NV_SND_SOC_DAI_LINK_STRUCT_HAS_C2C_PARAMS_ARG) /* Linux v6.4 */ .c2c_params = &default_params, #else .params = &default_params, #endif .ignore_pmdown_time = 1, .ignore_suspend = 1, SND_SOC_DAILINK_REG(audio2), }, { /* 2 */ .name = DAI_NAME(3), .stream_name = STREAM_NAME, #if defined(NV_SND_SOC_DAI_LINK_STRUCT_HAS_C2C_PARAMS_ARG) /* Linux v6.4 */ .c2c_params = &default_params, #else .params = &default_params, #endif .ignore_pmdown_time = 1, .ignore_suspend = 1, SND_SOC_DAILINK_REG(audio3), }, { /* 3 */ .name = DAI_NAME(4), .stream_name = STREAM_NAME, #if defined(NV_SND_SOC_DAI_LINK_STRUCT_HAS_C2C_PARAMS_ARG) /* Linux v6.4 */ .c2c_params = &default_params, #else .params = &default_params, #endif .ignore_pmdown_time = 1, .ignore_suspend = 1, SND_SOC_DAILINK_REG(audio4), }, { /* 4 */ .name = DAI_NAME(5), .stream_name = STREAM_NAME, #if defined(NV_SND_SOC_DAI_LINK_STRUCT_HAS_C2C_PARAMS_ARG) /* Linux v6.4 */ .c2c_params = &default_params, #else .params = &default_params, #endif .ignore_pmdown_time = 1, .ignore_suspend = 1, SND_SOC_DAILINK_REG(audio5), }, { /* 5 */ .name = DAI_NAME(6), .stream_name = STREAM_NAME, #if defined(NV_SND_SOC_DAI_LINK_STRUCT_HAS_C2C_PARAMS_ARG) /* Linux v6.4 */ .c2c_params = &default_params, #else .params = &default_params, #endif .ignore_pmdown_time = 1, .ignore_suspend = 1, SND_SOC_DAILINK_REG(audio6), }, { /* 6 */ .name = DAI_NAME(7), .stream_name = STREAM_NAME, #if defined(NV_SND_SOC_DAI_LINK_STRUCT_HAS_C2C_PARAMS_ARG) /* Linux v6.4 */ .c2c_params = &default_params, #else .params = &default_params, #endif .ignore_pmdown_time = 1, .ignore_suspend = 1, SND_SOC_DAILINK_REG(audio7), }, { /* 7 */ .name = DAI_NAME(8), .stream_name = STREAM_NAME, #if defined(NV_SND_SOC_DAI_LINK_STRUCT_HAS_C2C_PARAMS_ARG) /* Linux v6.4 */ .c2c_params = &default_params, #else .params = &default_params, #endif .ignore_pmdown_time = 1, .ignore_suspend = 1, SND_SOC_DAILINK_REG(audio8), }, { /* 8 */ .name = DAI_NAME(9), .stream_name = STREAM_NAME, #if defined(NV_SND_SOC_DAI_LINK_STRUCT_HAS_C2C_PARAMS_ARG) /* Linux v6.4 */ .c2c_params = &default_params, #else .params = &default_params, #endif .ignore_pmdown_time = 1, .ignore_suspend = 1, SND_SOC_DAILINK_REG(audio9), }, { /* 9 */ .name = DAI_NAME(10), .stream_name = STREAM_NAME, #if defined(NV_SND_SOC_DAI_LINK_STRUCT_HAS_C2C_PARAMS_ARG) /* Linux v6.4 */ .c2c_params = &default_params, #else .params = &default_params, #endif .ignore_pmdown_time = 1, .ignore_suspend = 1, SND_SOC_DAILINK_REG(audio10), }, }; void tegra_virt_machine_set_num_dai_links(unsigned int val) { num_dai_links = val; } EXPORT_SYMBOL(tegra_virt_machine_set_num_dai_links); unsigned int tegra_virt_machine_get_num_dai_links(void) { return num_dai_links; } EXPORT_SYMBOL(tegra_virt_machine_get_num_dai_links); struct snd_soc_dai_link *tegra_virt_machine_get_dai_link(struct device *dev) { struct snd_soc_dai_link *link = tegra_virt_t186ref_pcm_links; unsigned int size = TEGRA186_XBAR_DAI_LINKS; if (of_machine_is_compatible("nvidia,tegra210")) { link = tegra_virt_t210ref_pcm_links; size = TEGRA210_XBAR_DAI_LINKS; } else if (of_device_is_compatible(dev->of_node, "nvidia,tegra264-virt-pcm-oot")) { link = tegra_virt_t264ref_pcm_links; size = ARRAY_SIZE(tegra_virt_t264ref_pcm_links); } tegra_virt_machine_set_num_dai_links(size); return link; } EXPORT_SYMBOL(tegra_virt_machine_get_dai_link); void tegra_virt_machine_set_adsp_admaif_dai_params( uint32_t id, struct snd_soc_pcm_stream *params) { struct snd_soc_dai_link *link = tegra_virt_t186ref_pcm_links; /* Check for valid ADSP ADMAIF ID */ if (id >= MAX_ADMAIF_IDS) { pr_err("Invalid ADSP ADMAIF ID: %d\n", id); return; } /* Find DAI link corresponding to ADSP ADMAIF */ link += id + MAX_ADMAIF_IDS; memcpy(&adsp_admaif_params[id], params, sizeof(struct snd_soc_pcm_stream)); #if defined(NV_SND_SOC_DAI_LINK_STRUCT_HAS_C2C_PARAMS_ARG) /* Linux v6.4 */ link->c2c_params = &adsp_admaif_params[id]; #else link->params = &adsp_admaif_params[id]; #endif } EXPORT_SYMBOL(tegra_virt_machine_set_adsp_admaif_dai_params); MODULE_AUTHOR("Dipesh Gandhi "); MODULE_DESCRIPTION("Tegra Virt ASoC machine code"); MODULE_LICENSE("GPL");