]> rtime.felk.cvut.cz Git - hercules2020/nv-tegra/linux-4.4.git/commitdiff
ASoC: tegra-alt: Update T210 machine utility
authorJunghyun Kim <juskim@nvidia.com>
Mon, 14 Jul 2014 16:42:06 +0000 (09:42 -0700)
committerRavindra Lokhande <rlokhande@nvidia.com>
Tue, 28 Apr 2015 10:34:45 +0000 (16:04 +0530)
This change is for adding T210 DAI LINK in machine
utility and for cleaning up the grenada machine driver.

Bug 1442940
Bug 1537191

Change-Id: I561048fa01153b429122f8d23dc3cabbb73136f9
Signed-off-by: Junghyun Kim <juskim@nvidia.com>
Reviewed-on: http://git-master/r/437762
Reviewed-by: Automatic_Commit_Validation_User
Reviewed-by: Dara Ramesh <dramesh@nvidia.com>
Tested-by: Dara Ramesh <dramesh@nvidia.com>
Reviewed-by: Sachin Nikam <snikam@nvidia.com>
sound/soc/tegra-alt/Makefile
sound/soc/tegra-alt/tegra210_amx_alt.c
sound/soc/tegra-alt/tegra_asoc_machine_alt.c
sound/soc/tegra-alt/tegra_asoc_machine_alt.h
sound/soc/tegra-alt/tegra_grenada_alt.c

index ce3b0b30ce87ae3ee3ed75128f2807663a100cd2..6d035bb17f5f83c2facaf63779ec269dd7432ad7 100644 (file)
@@ -59,4 +59,5 @@ snd-soc-tegra-alt-vcm30t124-objs := tegra_vcm30t124_alt.o
 snd-soc-tegra-alt-grenada-objs := tegra_grenada_alt.o
 obj-$(CONFIG_SND_SOC_TEGRA_VCM30T124_ALT) += snd-soc-tegra-alt-machine.o
 obj-$(CONFIG_SND_SOC_TEGRA_VCM30T124_ALT) += snd-soc-tegra-alt-vcm30t124.o
+obj-$(CONFIG_SND_SOC_TEGRA_GRENADA_ALT) += snd-soc-tegra-alt-machine.o
 obj-$(CONFIG_SND_SOC_TEGRA_GRENADA_ALT) += snd-soc-tegra-alt-grenada.o
index 42e58b360b497878e90eec7a99720b07804df88f..c88cd2339ebfdc13c5fa8173e7f8ee3538351d7d 100644 (file)
@@ -34,7 +34,7 @@
 #include "tegra210_xbar_alt.h"
 #include "tegra210_amx_alt.h"
 
-#define DRV_NAME "tegra210_amx"
+#define DRV_NAME "tegra210-amx"
 
 /**
  * tegra210_amx_set_master_stream - set master stream and dependency
index 9bf77c11d3f6e41b0bc446c7d30f3197e5df0125..a7992cce52ce240b64b596de6d9093343f8a7808 100644 (file)
@@ -16,6 +16,7 @@
  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
  */
 
+#include <linux/module.h>
 #include <linux/of.h>
 #include <sound/soc.h>
 
@@ -23,6 +24,8 @@
 
 static struct snd_soc_dai_link *tegra_asoc_machine_links;
 static struct snd_soc_codec_conf *tegra_asoc_codec_conf;
+static const unsigned int *bclk_ratio;
+static unsigned int num_dai_links;
 
 static const struct snd_soc_pcm_stream default_link_params = {
        .formats = SNDRV_PCM_FMTBIT_S16_LE,
@@ -40,6 +43,29 @@ static const struct snd_soc_pcm_stream tdm_link_params = {
        .channels_max = 8,
 };
 
+static const char * const dai_link_name[] = {"nvidia,dai-link-1",
+       "nvidia,dai-link-2", "nvidia,dai-link-3",
+       "nvidia,dai-link-4", "nvidia,dai-link-5"};
+
+static const char * const bit_format[] = {
+       "s8", "u8", "s16_le", "s16_be",
+       "u16_le", "u16_be", "s24_le", "s24_be",
+       "u24_le", "u24_be", "s32_le", "s32_be",
+       "u32_le", "u32_be", "float_le", "float_be",
+
+       "float64_le", "float64_be", "iec958_subframe_le", "iec958_subframe_be",
+       "mu_law", "a_law", "ima_adpcm", "mpeg",
+       "gsm", "", "", "",
+       "", "", "", "special",
+
+       "s24_3l", "s24_3be", "u24_3le", "u24_3be",
+       "s20_3le", "s20_3be", "u20_3le", "u20_3be",
+       "s18_3le", "s18_3b", "u18_3le", "u18_3be",
+       "g723_24", "g723_24_1b", "g723_40", "g723_40_1b",
+
+       "dsd_u8", "dsd_u16_le",
+};
+
 static struct snd_soc_dai_link
        tegra124_xbar_dai_links[TEGRA124_XBAR_DAI_LINKS] = {
        [TEGRA124_DAI_LINK_APBIF0] = {
@@ -595,7 +621,864 @@ static struct snd_soc_codec_conf
 
 static struct snd_soc_dai_link
        tegra210_xbar_dai_links[TEGRA210_XBAR_DAI_LINKS] = {
-
+       [TEGRA210_DAI_LINK_ADMAIF1] = {
+               .name = "ADMAIF1 CIF",
+               .stream_name = "ADMAIF1 CIF",
+               .cpu_dai_name = "ADMAIF1",
+               .codec_dai_name = "ADMAIF1",
+               .cpu_name = "tegra210-admaif",
+               .codec_name = "tegra210-axbar",
+               .platform_name = "tegra210-admaif",
+               .ignore_pmdown_time = 1,
+       },
+       [TEGRA210_DAI_LINK_ADMAIF2] = {
+               .name = "ADMAIF2 CIF",
+               .stream_name = "ADMAIF2 CIF",
+               .cpu_dai_name = "ADMAIF2",
+               .codec_dai_name = "ADMAIF2",
+               .cpu_name = "tegra210-admaif",
+               .codec_name = "tegra210-axbar",
+               .platform_name = "tegra210-admaif",
+               .ignore_pmdown_time = 1,
+       },
+       [TEGRA210_DAI_LINK_ADMAIF3] = {
+               .name = "ADMAIF3 CIF",
+               .stream_name = "ADMAIF3 CIF",
+               .cpu_dai_name = "ADMAIF3",
+               .codec_dai_name = "ADMAIF3",
+               .cpu_name = "tegra210-admaif",
+               .codec_name = "tegra210-axbar",
+               .platform_name = "tegra210-admaif",
+               .ignore_pmdown_time = 1,
+       },
+       [TEGRA210_DAI_LINK_ADMAIF4] = {
+               .name = "ADMAIF4 CIF",
+               .stream_name = "ADMAIF4 CIF",
+               .cpu_dai_name = "ADMAIF4",
+               .codec_dai_name = "ADMAIF4",
+               .cpu_name = "tegra210-admaif",
+               .codec_name = "tegra210-axbar",
+               .platform_name = "tegra210-admaif",
+               .ignore_pmdown_time = 1,
+       },
+       [TEGRA210_DAI_LINK_ADMAIF5] = {
+               .name = "ADMAIF5 CIF",
+               .stream_name = "ADMAIF5 CIF",
+               .cpu_dai_name = "ADMAIF5",
+               .codec_dai_name = "ADMAIF5",
+               .cpu_name = "tegra210-admaif",
+               .codec_name = "tegra210-axbar",
+               .platform_name = "tegra210-admaif",
+               .ignore_pmdown_time = 1,
+       },
+       [TEGRA210_DAI_LINK_ADMAIF6] = {
+               .name = "ADMAIF6 CIF",
+               .stream_name = "ADMAIF6 CIF",
+               .cpu_dai_name = "ADMAIF6",
+               .codec_dai_name = "ADMAIF6",
+               .cpu_name = "tegra210-admaif",
+               .codec_name = "tegra210-axbar",
+               .platform_name = "tegra210-admaif",
+               .ignore_pmdown_time = 1,
+       },
+       [TEGRA210_DAI_LINK_ADMAIF7] = {
+               .name = "ADMAIF7 CIF",
+               .stream_name = "ADMAIF7 CIF",
+               .cpu_dai_name = "ADMAIF7",
+               .codec_dai_name = "ADMAIF7",
+               .cpu_name = "tegra210-admaif",
+               .codec_name = "tegra210-axbar",
+               .platform_name = "tegra210-admaif",
+               .ignore_pmdown_time = 1,
+       },
+       [TEGRA210_DAI_LINK_ADMAIF8] = {
+               .name = "ADMAIF8 CIF",
+               .stream_name = "ADMAIF8 CIF",
+               .cpu_dai_name = "ADMAIF8",
+               .codec_dai_name = "ADMAIF8",
+               .cpu_name = "tegra210-admaif",
+               .codec_name = "tegra210-axbar",
+               .platform_name = "tegra210-admaif",
+               .ignore_pmdown_time = 1,
+       },
+       [TEGRA210_DAI_LINK_ADMAIF9] = {
+               .name = "ADMAIF9 CIF",
+               .stream_name = "ADMAIF9 CIF",
+               .cpu_dai_name = "ADMAIF9",
+               .codec_dai_name = "ADMAIF9",
+               .cpu_name = "tegra210-admaif",
+               .codec_name = "tegra210-axbar",
+               .platform_name = "tegra210-admaif",
+               .ignore_pmdown_time = 1,
+       },
+       [TEGRA210_DAI_LINK_ADMAIF10] = {
+               .name = "ADMAIF10 CIF",
+               .stream_name = "ADMAIF10 CIF",
+               .cpu_dai_name = "ADMAIF10",
+               .codec_dai_name = "ADMAIF10",
+               .cpu_name = "tegra210-admaif",
+               .codec_name = "tegra210-axbar",
+               .platform_name = "tegra210-admaif",
+               .ignore_pmdown_time = 1,
+       },
+       [TEGRA210_DAI_LINK_AMX1_1] = {
+               .name = "AMX1 IN1",
+               .stream_name = "AMX1 IN",
+               .cpu_dai_name = "AMX1-1",
+               .codec_dai_name = "IN1",
+               .cpu_name = "tegra210-axbar",
+               .codec_name = "tegra210-amx.0",
+               .params = &default_link_params,
+       },
+       [TEGRA210_DAI_LINK_AMX1_2] = {
+               .name = "AMX1 IN2",
+               .stream_name = "AMX1 IN",
+               .cpu_dai_name = "AMX1-2",
+               .codec_dai_name = "IN2",
+               .cpu_name = "tegra210-axbar",
+               .codec_name = "tegra210-amx.0",
+               .params = &default_link_params,
+       },
+       [TEGRA210_DAI_LINK_AMX1_3] = {
+               .name = "AMX1 IN3",
+               .stream_name = "AMX1 IN",
+               .cpu_dai_name = "AMX1-3",
+               .codec_dai_name = "IN3",
+               .cpu_name = "tegra210-axbar",
+               .codec_name = "tegra210-amx.0",
+               .params = &default_link_params,
+       },
+       [TEGRA210_DAI_LINK_AMX1_4] = {
+               .name = "AMX1 IN4",
+               .stream_name = "AMX1 IN",
+               .cpu_dai_name = "AMX1-4",
+               .codec_dai_name = "IN4",
+               .cpu_name = "tegra210-axbar",
+               .codec_name = "tegra210-amx.0",
+               .params = &default_link_params,
+       },
+       [TEGRA210_DAI_LINK_AMX1] = {
+               .name = "AMX1 CIF",
+               .stream_name = "AMX1 CIF",
+               .cpu_dai_name = "OUT",
+               .codec_dai_name = "AMX1",
+               .cpu_name = "tegra210-amx.0",
+               .codec_name = "tegra210-axbar",
+               .params = &tdm_link_params,
+       },
+       [TEGRA210_DAI_LINK_AMX2_1] = {
+               .name = "AMX2 IN1",
+               .stream_name = "AMX2 IN",
+               .cpu_dai_name = "AMX2-1",
+               .codec_dai_name = "IN1",
+               .cpu_name = "tegra210-axbar",
+               .codec_name = "tegra210-amx.1",
+               .params = &default_link_params,
+       },
+       [TEGRA210_DAI_LINK_AMX2_2] = {
+               .name = "AMX2 IN2",
+               .stream_name = "AMX2 IN",
+               .cpu_dai_name = "AMX2-2",
+               .codec_dai_name = "IN2",
+               .cpu_name = "tegra210-axbar",
+               .codec_name = "tegra210-amx.1",
+               .params = &default_link_params,
+       },
+       [TEGRA210_DAI_LINK_AMX2_3] = {
+               .name = "AMX2 IN3",
+               .stream_name = "AMX2 IN",
+               .cpu_dai_name = "AMX2-3",
+               .codec_dai_name = "IN3",
+               .cpu_name = "tegra210-axbar",
+               .codec_name = "tegra210-amx.1",
+               .params = &default_link_params,
+       },
+       [TEGRA210_DAI_LINK_AMX2_4] = {
+               .name = "AMX2 IN4",
+               .stream_name = "AMX2 IN",
+               .cpu_dai_name = "AMX2-4",
+               .codec_dai_name = "IN4",
+               .cpu_name = "tegra210-axbar",
+               .codec_name = "tegra210-amx.1",
+               .params = &default_link_params,
+       },
+       [TEGRA210_DAI_LINK_AMX2] = {
+               .name = "AMX2 CIF",
+               .stream_name = "AMX2 CIF",
+               .cpu_dai_name = "OUT",
+               .codec_dai_name = "AMX2",
+               .cpu_name = "tegra210-amx.1",
+               .codec_name = "tegra210-axbar",
+               .params = &tdm_link_params,
+       },
+       [TEGRA210_DAI_LINK_ADX1] = {
+               .name = "ADX1 CIF",
+               .stream_name = "ADX1 IN",
+               .cpu_dai_name = "ADX1",
+               .codec_dai_name = "IN",
+               .cpu_name = "tegra210-axbar",
+               .codec_name = "tegra210-adx.0",
+               .params = &tdm_link_params,
+       },
+       [TEGRA210_DAI_LINK_ADX1_1] = {
+               .name = "ADX1 OUT1",
+               .stream_name = "ADX1 OUT",
+               .cpu_dai_name = "OUT1",
+               .codec_dai_name = "ADX1-1",
+               .cpu_name = "tegra210-adx.0",
+               .codec_name = "tegra210-axbar",
+               .params = &default_link_params,
+       },
+       [TEGRA210_DAI_LINK_ADX1_2] = {
+               .name = "ADX1 OUT2",
+               .stream_name = "ADX1 OUT",
+               .cpu_dai_name = "OUT2",
+               .codec_dai_name = "ADX1-2",
+               .cpu_name = "tegra210-adx.0",
+               .codec_name = "tegra210-axbar",
+               .params = &default_link_params,
+       },
+       [TEGRA210_DAI_LINK_ADX1_3] = {
+               .name = "ADX1 OUT3",
+               .stream_name = "ADX1 OUT",
+               .cpu_dai_name = "OUT3",
+               .codec_dai_name = "ADX1-3",
+               .cpu_name = "tegra210-adx.0",
+               .codec_name = "tegra210-axbar",
+               .params = &default_link_params,
+       },
+       [TEGRA210_DAI_LINK_ADX1_4] = {
+               .name = "ADX1 OUT4",
+               .stream_name = "ADX1 OUT",
+               .cpu_dai_name = "OUT4",
+               .codec_dai_name = "ADX1-4",
+               .cpu_name = "tegra210-adx.0",
+               .codec_name = "tegra210-axbar",
+               .params = &default_link_params,
+       },
+       [TEGRA210_DAI_LINK_ADX2] = {
+               .name = "ADX2 CIF",
+               .stream_name = "ADX2 IN",
+               .cpu_dai_name = "ADX2",
+               .codec_dai_name = "IN",
+               .cpu_name = "tegra210-axbar",
+               .codec_name = "tegra210-adx.1",
+               .params = &tdm_link_params,
+       },
+       [TEGRA210_DAI_LINK_ADX2_1] = {
+               .name = "ADX2 OUT1",
+               .stream_name = "ADX2 OUT",
+               .cpu_dai_name = "OUT1",
+               .codec_dai_name = "ADX2-1",
+               .cpu_name = "tegra210-adx.1",
+               .codec_name = "tegra210-axbar",
+               .params = &default_link_params,
+       },
+       [TEGRA210_DAI_LINK_ADX2_2] = {
+               .name = "ADX2 OUT2",
+               .stream_name = "ADX2 OUT",
+               .cpu_dai_name = "OUT2",
+               .codec_dai_name = "ADX2-2",
+               .cpu_name = "tegra210-adx.1",
+               .codec_name = "tegra210-axbar",
+               .params = &default_link_params,
+       },
+       [TEGRA210_DAI_LINK_ADX2_3] = {
+               .name = "ADX2 OUT3",
+               .stream_name = "ADX2 OUT",
+               .cpu_dai_name = "OUT3",
+               .codec_dai_name = "ADX2-3",
+               .cpu_name = "tegra210-adx.1",
+               .codec_name = "tegra210-axbar",
+               .params = &default_link_params,
+       },
+       [TEGRA210_DAI_LINK_ADX2_4] = {
+               .name = "ADX2 OUT4",
+               .stream_name = "ADX2 OUT",
+               .cpu_dai_name = "OUT4",
+               .codec_dai_name = "ADX2-4",
+               .cpu_name = "tegra210-adx.1",
+               .codec_name = "tegra210-axbar",
+               .params = &default_link_params,
+       },
+       [TEGRA210_DAI_LINK_MIXER1_RX1] = {
+               .name = "MIXER1 RX1",
+               .stream_name = "MIXER1 RX",
+               .cpu_dai_name = "MIXER1-1",
+               .codec_dai_name = "RX1",
+               .cpu_name = "tegra210-axbar",
+               .codec_name = "tegra210-mixer",
+               .params = &default_link_params,
+       },
+       [TEGRA210_DAI_LINK_MIXER1_RX2] = {
+               .name = "MIXER1 RX2",
+               .stream_name = "MIXER1 RX",
+               .cpu_dai_name = "MIXER1-2",
+               .codec_dai_name = "RX2",
+               .cpu_name = "tegra210-axbar",
+               .codec_name = "tegra210-mixer",
+               .params = &default_link_params,
+       },
+       [TEGRA210_DAI_LINK_MIXER1_RX3] = {
+               .name = "MIXER1 RX3",
+               .stream_name = "MIXER1 RX",
+               .cpu_dai_name = "MIXER1-3",
+               .codec_dai_name = "RX3",
+               .cpu_name = "tegra210-axbar",
+               .codec_name = "tegra210-mixer",
+               .params = &default_link_params,
+       },
+       [TEGRA210_DAI_LINK_MIXER1_RX4] = {
+               .name = "MIXER1 RX4",
+               .stream_name = "MIXER1 RX",
+               .cpu_dai_name = "MIXER1-4",
+               .codec_dai_name = "RX4",
+               .cpu_name = "tegra210-axbar",
+               .codec_name = "tegra210-mixer",
+               .params = &default_link_params,
+       },
+       [TEGRA210_DAI_LINK_MIXER1_RX5] = {
+               .name = "MIXER1 RX5",
+               .stream_name = "MIXER1 RX",
+               .cpu_dai_name = "MIXER1-5",
+               .codec_dai_name = "RX5",
+               .cpu_name = "tegra210-axbar",
+               .codec_name = "tegra210-mixer",
+               .params = &default_link_params,
+       },
+       [TEGRA210_DAI_LINK_MIXER1_RX6] = {
+               .name = "MIXER1 RX6",
+               .stream_name = "MIXER1 RX",
+               .cpu_dai_name = "MIXER1-6",
+               .codec_dai_name = "RX6",
+               .cpu_name = "tegra210-axbar",
+               .codec_name = "tegra210-mixer",
+               .params = &default_link_params,
+       },
+       [TEGRA210_DAI_LINK_MIXER1_RX7] = {
+               .name = "MIXER1 RX7",
+               .stream_name = "MIXER1 RX",
+               .cpu_dai_name = "MIXER1-7",
+               .codec_dai_name = "RX7",
+               .cpu_name = "tegra210-axbar",
+               .codec_name = "tegra210-mixer",
+               .params = &default_link_params,
+       },
+       [TEGRA210_DAI_LINK_MIXER1_RX8] = {
+               .name = "MIXER1 RX8",
+               .stream_name = "MIXER1 RX",
+               .cpu_dai_name = "MIXER1-8",
+               .codec_dai_name = "RX8",
+               .cpu_name = "tegra210-axbar",
+               .codec_name = "tegra210-mixer",
+               .params = &default_link_params,
+       },
+       [TEGRA210_DAI_LINK_MIXER1_RX9] = {
+               .name = "MIXER1 RX9",
+               .stream_name = "MIXER1 RX",
+               .cpu_dai_name = "MIXER1-9",
+               .codec_dai_name = "RX9",
+               .cpu_name = "tegra210-axbar",
+               .codec_name = "tegra210-mixer",
+               .params = &default_link_params,
+       },
+       [TEGRA210_DAI_LINK_MIXER1_RX10] = {
+               .name = "MIXER1 RX10",
+               .stream_name = "MIXER1 RX",
+               .cpu_dai_name = "MIXER1-10",
+               .codec_dai_name = "RX10",
+               .cpu_name = "tegra210-axbar",
+               .codec_name = "tegra210-mixer",
+               .params = &default_link_params,
+       },
+       [TEGRA210_DAI_LINK_MIXER1_TX1] = {
+               .name = "MIXER1 TX1",
+               .stream_name = "MIXER1 TX",
+               .cpu_dai_name = "TX1",
+               .codec_dai_name = "MIXER1-1",
+               .cpu_name = "tegra210-mixer",
+               .codec_name = "tegra210-axbar",
+               .params = &default_link_params,
+       },
+       [TEGRA210_DAI_LINK_MIXER1_TX2] = {
+               .name = "MIXER1 TX2",
+               .stream_name = "MIXER1 TX",
+               .cpu_dai_name = "TX2",
+               .codec_dai_name = "MIXER1-2",
+               .cpu_name = "tegra210-mixer",
+               .codec_name = "tegra210-axbar",
+               .params = &default_link_params,
+       },
+       [TEGRA210_DAI_LINK_MIXER1_TX3] = {
+               .name = "MIXER1 TX3",
+               .stream_name = "MIXER1 TX",
+               .cpu_dai_name = "TX3",
+               .codec_dai_name = "MIXER1-3",
+               .cpu_name = "tegra210-mixer",
+               .codec_name = "tegra210-axbar",
+               .params = &default_link_params,
+       },
+       [TEGRA210_DAI_LINK_MIXER1_TX4] = {
+               .name = "MIXER1 TX4",
+               .stream_name = "MIXER1 TX",
+               .cpu_dai_name = "TX4",
+               .codec_dai_name = "MIXER1-4",
+               .cpu_name = "tegra210-mixer",
+               .codec_name = "tegra210-axbar",
+               .params = &default_link_params,
+       },
+       [TEGRA210_DAI_LINK_MIXER1_TX5] = {
+               .name = "MIXER1 TX5",
+               .stream_name = "MIXER1 TX",
+               .cpu_dai_name = "TX5",
+               .codec_dai_name = "MIXER1-5",
+               .cpu_name = "tegra210-mixer",
+               .codec_name = "tegra210-axbar",
+               .params = &default_link_params,
+       },
+       [TEGRA210_DAI_LINK_SFC1_RX] = {
+               .name = "SFC1 RX",
+               .stream_name = "SFC1 RX",
+               .cpu_dai_name = "SFC1",
+               .codec_dai_name = "CIF",
+               .cpu_name = "tegra210-axbar",
+               .codec_name = "tegra210-sfc.0",
+               .params = &default_link_params,
+       },
+       [TEGRA210_DAI_LINK_SFC1_TX] = {
+               .name = "SFC1 TX",
+               .stream_name = "SFC1 TX",
+               .cpu_dai_name = "DAP",
+               .codec_dai_name = "SFC1",
+               .cpu_name = "tegra210-sfc.0",
+               .codec_name = "tegra210-axbar",
+               .params = &default_link_params,
+       },
+       [TEGRA210_DAI_LINK_SFC2_RX] = {
+               .name = "SFC2 RX",
+               .stream_name = "SFC2 RX",
+               .cpu_dai_name = "SFC2",
+               .codec_dai_name = "CIF",
+               .cpu_name = "tegra210-axbar",
+               .codec_name = "tegra210-sfc.1",
+               .params = &default_link_params,
+       },
+       [TEGRA210_DAI_LINK_SFC2_TX] = {
+               .name = "SFC2 TX",
+               .stream_name = "SFC2 TX",
+               .cpu_dai_name = "DAP",
+               .codec_dai_name = "SFC2",
+               .cpu_name = "tegra210-sfc.1",
+               .codec_name = "tegra210-axbar",
+               .params = &default_link_params,
+       },
+       [TEGRA210_DAI_LINK_SFC3_RX] = {
+               .name = "SFC3 RX",
+               .stream_name = "SFC3 RX",
+               .cpu_dai_name = "SFC3",
+               .codec_dai_name = "CIF",
+               .cpu_name = "tegra210-axbar",
+               .codec_name = "tegra210-sfc.2",
+               .params = &default_link_params,
+       },
+       [TEGRA210_DAI_LINK_SFC3_TX] = {
+               .name = "SFC3 TX",
+               .stream_name = "SFC3 TX",
+               .cpu_dai_name = "DAP",
+               .codec_dai_name = "SFC3",
+               .cpu_name = "tegra210-sfc.2",
+               .codec_name = "tegra210-axbar",
+               .params = &default_link_params,
+       },
+       [TEGRA210_DAI_LINK_SFC4_RX] = {
+               .name = "SFC4 RX",
+               .stream_name = "SFC4 RX",
+               .cpu_dai_name = "SFC4",
+               .codec_dai_name = "CIF",
+               .cpu_name = "tegra210-axbar",
+               .codec_name = "tegra210-sfc.3",
+               .params = &default_link_params,
+       },
+       [TEGRA210_DAI_LINK_SFC4_TX] = {
+               .name = "SFC4 TX",
+               .stream_name = "SFC4 TX",
+               .cpu_dai_name = "DAP",
+               .codec_dai_name = "SFC4",
+               .cpu_name = "tegra210-sfc.3",
+               .codec_name = "tegra210-axbar",
+               .params = &default_link_params,
+       },
+       [TEGRA210_DAI_LINK_AFC1_RX] = {
+               .name = "AFC1 RX",
+               .stream_name = "AFC1 RX",
+               .cpu_dai_name = "AFC1",
+               .codec_dai_name = "AFC IN",
+               .cpu_name = "tegra210-axbar",
+               .codec_name = "tegra210-afc.0",
+               .params = &default_link_params,
+       },
+       [TEGRA210_DAI_LINK_AFC1_TX] = {
+               .name = "AFC1 TX",
+               .stream_name = "AFC1 TX",
+               .cpu_dai_name = "AFC OUT",
+               .codec_dai_name = "AFC1",
+               .cpu_name = "tegra210-afc.0",
+               .codec_name = "tegra210-axbar",
+               .params = &default_link_params,
+       },
+       [TEGRA210_DAI_LINK_AFC2_RX] = {
+               .name = "AFC2 RX",
+               .stream_name = "AFC2 RX",
+               .cpu_dai_name = "AFC2",
+               .codec_dai_name = "AFC IN",
+               .cpu_name = "tegra210-axbar",
+               .codec_name = "tegra210-afc.1",
+               .params = &default_link_params,
+       },
+       [TEGRA210_DAI_LINK_AFC2_TX] = {
+               .name = "AFC2 TX",
+               .stream_name = "AFC2 TX",
+               .cpu_dai_name = "AFC OUT",
+               .codec_dai_name = "AFC2",
+               .cpu_name = "tegra210-afc.1",
+               .codec_name = "tegra210-axbar",
+               .params = &default_link_params,
+       },
+       [TEGRA210_DAI_LINK_AFC3_RX] = {
+               .name = "AFC3 RX",
+               .stream_name = "AFC3 RX",
+               .cpu_dai_name = "AFC3",
+               .codec_dai_name = "AFC IN",
+               .cpu_name = "tegra210-axbar",
+               .codec_name = "tegra210-afc.2",
+               .params = &default_link_params,
+       },
+       [TEGRA210_DAI_LINK_AFC3_TX] = {
+               .name = "AFC3 TX",
+               .stream_name = "AFC3 TX",
+               .cpu_dai_name = "AFC OUT",
+               .codec_dai_name = "AFC3",
+               .cpu_name = "tegra210-afc.2",
+               .codec_name = "tegra210-axbar",
+               .params = &default_link_params,
+       },
+       [TEGRA210_DAI_LINK_AFC4_RX] = {
+               .name = "AFC4 RX",
+               .stream_name = "AFC4 RX",
+               .cpu_dai_name = "AFC4",
+               .codec_dai_name = "AFC IN",
+               .cpu_name = "tegra210-axbar",
+               .codec_name = "tegra210-afc.3",
+               .params = &default_link_params,
+       },
+       [TEGRA210_DAI_LINK_AFC4_TX] = {
+               .name = "AFC4 TX",
+               .stream_name = "AFC4 TX",
+               .cpu_dai_name = "AFC OUT",
+               .codec_dai_name = "AFC4",
+               .cpu_name = "tegra210-afc.3",
+               .codec_name = "tegra210-axbar",
+               .params = &default_link_params,
+       },
+       [TEGRA210_DAI_LINK_AFC5_RX] = {
+               .name = "AFC5 RX",
+               .stream_name = "AFC5 RX",
+               .cpu_dai_name = "AFC5",
+               .codec_dai_name = "AFC IN",
+               .cpu_name = "tegra210-axbar",
+               .codec_name = "tegra210-afc.4",
+               .params = &default_link_params,
+       },
+       [TEGRA210_DAI_LINK_AFC5_TX] = {
+               .name = "AFC5 TX",
+               .stream_name = "AFC5 TX",
+               .cpu_dai_name = "AFC OUT",
+               .codec_dai_name = "AFC5",
+               .cpu_name = "tegra210-afc.4",
+               .codec_name = "tegra210-axbar",
+               .params = &default_link_params,
+       },
+       [TEGRA210_DAI_LINK_AFC6_RX] = {
+               .name = "AFC6 RX",
+               .stream_name = "AFC6 RX",
+               .cpu_dai_name = "AFC6",
+               .codec_dai_name = "AFC IN",
+               .cpu_name = "tegra210-axbar",
+               .codec_name = "tegra210-afc.5",
+               .params = &default_link_params,
+       },
+       [TEGRA210_DAI_LINK_AFC6_TX] = {
+               .name = "AFC6 TX",
+               .stream_name = "AFC6 TX",
+               .cpu_dai_name = "AFC OUT",
+               .codec_dai_name = "AFC6",
+               .cpu_name = "tegra210-afc.5",
+               .codec_name = "tegra210-axbar",
+               .params = &default_link_params,
+       },
+       [TEGRA210_DAI_LINK_MVC1_RX] = {
+               .name = "MVC1 RX",
+               .stream_name = "MVC1 RX",
+               .cpu_dai_name = "MVC1",
+               .codec_dai_name = "MVC IN",
+               .cpu_name = "tegra210-axbar",
+               .codec_name = "tegra210-mvc.0",
+               .params = &default_link_params,
+       },
+       [TEGRA210_DAI_LINK_MVC1_TX] = {
+               .name = "MVC1 TX",
+               .stream_name = "MVC1 TX",
+               .cpu_dai_name = "MVC OUT",
+               .codec_dai_name = "MVC1",
+               .cpu_name = "tegra210-mvc.0",
+               .codec_name = "tegra210-axbar",
+               .params = &default_link_params,
+       },
+       [TEGRA210_DAI_LINK_MVC2_RX] = {
+               .name = "MVC2 RX",
+               .stream_name = "MVC2 RX",
+               .cpu_dai_name = "MVC2",
+               .codec_dai_name = "MVC IN",
+               .cpu_name = "tegra210-axbar",
+               .codec_name = "tegra210-mvc.1",
+               .params = &default_link_params,
+       },
+       [TEGRA210_DAI_LINK_MVC2_TX] = {
+               .name = "MVC2 TX",
+               .stream_name = "AFC2 TX",
+               .cpu_dai_name = "MVC OUT",
+               .codec_dai_name = "MVC2",
+               .cpu_name = "tegra210-mvc.1",
+               .codec_name = "tegra210-axbar",
+               .params = &default_link_params,
+       },
+       [TEGRA210_DAI_LINK_ADMAIF1_CODEC] = {
+               .name = "ADMAIF1 CODEC",
+               .stream_name = "ADMAIF1 CODEC",
+               .cpu_dai_name = "ADMAIF1 CIF",
+               .codec_dai_name = "ADMAIF1",
+               .cpu_name = "tegra210-admaif",
+               .codec_name = "tegra210-axbar",
+               .platform_name = "tegra210-admaif",
+               .ignore_pmdown_time = 1,
+               .params = &default_link_params,
+       },
+       [TEGRA210_DAI_LINK_ADMAIF2_CODEC] = {
+               .name = "ADMAIF2 CODEC",
+               .stream_name = "ADMAIF2 CODEC",
+               .cpu_dai_name = "ADMAIF2 CIF",
+               .codec_dai_name = "ADMAIF2",
+               .cpu_name = "tegra210-admaif",
+               .codec_name = "tegra210-axbar",
+               .platform_name = "tegra210-admaif",
+               .ignore_pmdown_time = 1,
+               .params = &default_link_params,
+       },
+       [TEGRA210_DAI_LINK_ADMAIF3_CODEC] = {
+               .name = "ADMAIF3 CODEC",
+               .stream_name = "ADMAIF3 CODEC",
+               .cpu_dai_name = "ADMAIF3 CIF",
+               .codec_dai_name = "ADMAIF3",
+               .cpu_name = "tegra210-admaif",
+               .codec_name = "tegra210-axbar",
+               .platform_name = "tegra210-admaif",
+               .ignore_pmdown_time = 1,
+               .params = &default_link_params,
+       },
+       [TEGRA210_DAI_LINK_ADMAIF4_CODEC] = {
+               .name = "ADMAIF4 CODEC",
+               .stream_name = "ADMAIF4 CODEC",
+               .cpu_dai_name = "ADMAIF4 CIF",
+               .codec_dai_name = "ADMAIF4",
+               .cpu_name = "tegra210-admaif",
+               .codec_name = "tegra210-axbar",
+               .platform_name = "tegra210-admaif",
+               .ignore_pmdown_time = 1,
+               .params = &default_link_params,
+       },
+       [TEGRA210_DAI_LINK_ADMAIF5_CODEC] = {
+               .name = "ADMAIF5 CODEC",
+               .stream_name = "ADMAIF5 CODEC",
+               .cpu_dai_name = "ADMAIF5 CIF",
+               .codec_dai_name = "ADMAIF5",
+               .cpu_name = "tegra210-admaif",
+               .codec_name = "tegra210-axbar",
+               .platform_name = "tegra210-admaif",
+               .ignore_pmdown_time = 1,
+               .params = &default_link_params,
+       },
+       [TEGRA210_DAI_LINK_ADMAIF6_CODEC] = {
+               .name = "ADMAIF6 CODEC",
+               .stream_name = "ADMAIF6 CODEC",
+               .cpu_dai_name = "ADMAIF6 CIF",
+               .codec_dai_name = "ADMAIF6",
+               .cpu_name = "tegra210-admaif",
+               .codec_name = "tegra210-axbar",
+               .platform_name = "tegra210-admaif",
+               .ignore_pmdown_time = 1,
+               .params = &default_link_params,
+       },
+       [TEGRA210_DAI_LINK_ADMAIF7_CODEC] = {
+               .name = "ADMAIF7 CODEC",
+               .stream_name = "ADMAIF7 CODEC",
+               .cpu_dai_name = "ADMAIF7 CIF",
+               .codec_dai_name = "ADMAIF7",
+               .cpu_name = "tegra210-admaif",
+               .codec_name = "tegra210-axbar",
+               .platform_name = "tegra210-admaif",
+               .ignore_pmdown_time = 1,
+               .params = &default_link_params,
+       },
+       [TEGRA210_DAI_LINK_ADMAIF8_CODEC] = {
+               .name = "ADMAIF8 CODEC",
+               .stream_name = "ADMAIF8 CODEC",
+               .cpu_dai_name = "ADMAIF8 CIF",
+               .codec_dai_name = "ADMAIF8",
+               .cpu_name = "tegra210-admaif",
+               .codec_name = "tegra210-axbar",
+               .platform_name = "tegra210-admaif",
+               .ignore_pmdown_time = 1,
+               .params = &default_link_params,
+       },
+       [TEGRA210_DAI_LINK_ADMAIF9_CODEC] = {
+               .name = "ADMAIF9 CODEC",
+               .stream_name = "ADMAIF9 CODEC",
+               .cpu_dai_name = "ADMAIF9 CIF",
+               .codec_dai_name = "ADMAIF9",
+               .cpu_name = "tegra210-admaif",
+               .codec_name = "tegra210-axbar",
+               .platform_name = "tegra210-admaif",
+               .ignore_pmdown_time = 1,
+               .params = &default_link_params,
+       },
+       [TEGRA210_DAI_LINK_ADMAIF10_CODEC] = {
+               .name = "ADMAIF10 CODEC",
+               .stream_name = "ADMAIF10 CODEC",
+               .cpu_dai_name = "ADMAIF10 CIF",
+               .codec_dai_name = "ADMAIF10",
+               .cpu_name = "tegra210-admaif",
+               .codec_name = "tegra210-axbar",
+               .platform_name = "tegra210-admaif",
+               .ignore_pmdown_time = 1,
+               .params = &default_link_params,
+       },
+       [TEGRA210_DAI_LINK_ADSP_ADMAIF1] = {
+               .name = "ADSP ADMAIF1",
+               .stream_name = "ADSP ADMAIF1",
+               .cpu_dai_name = "ADSP-ADMAIF1",
+               .codec_dai_name = "ADMAIF1 FIFO",
+               .cpu_name = "adsp_audio.3",
+               .codec_name = "tegra210-admaif",
+               .params = &default_link_params,
+       },
+       [TEGRA210_DAI_LINK_ADSP_ADMAIF2] = {
+               .name = "ADSP ADMAIF2",
+               .stream_name = "ADSP ADMAIF2",
+               .cpu_dai_name = "ADSP-ADMAIF2",
+               .codec_dai_name = "ADMAIF2 FIFO",
+               .cpu_name = "adsp_audio.3",
+               .codec_name = "tegra210-admaif",
+               .params = &default_link_params,
+       },
+       [TEGRA210_DAI_LINK_ADSP_ADMAIF3] = {
+               .name = "ADSP ADMAIF3",
+               .stream_name = "ADSP ADMAIF3",
+               .cpu_dai_name = "ADSP-ADMAIF3",
+               .codec_dai_name = "ADMAIF3 FIFO",
+               .cpu_name = "adsp_audio.3",
+               .codec_name = "tegra210-admaif",
+               .params = &default_link_params,
+       },
+       [TEGRA210_DAI_LINK_ADSP_ADMAIF4] = {
+               .name = "ADSP ADMAIF4",
+               .stream_name = "ADSP ADMAIF4",
+               .cpu_dai_name = "ADSP-ADMAIF4",
+               .codec_dai_name = "ADMAIF4 FIFO",
+               .cpu_name = "adsp_audio.3",
+               .codec_name = "tegra210-admaif",
+               .params = &default_link_params,
+       },
+       [TEGRA210_DAI_LINK_ADSP_ADMAIF5] = {
+               .name = "ADSP ADMAIF5",
+               .stream_name = "ADSP ADMAIF5",
+               .cpu_dai_name = "ADSP-ADMAIF5",
+               .codec_dai_name = "ADMAIF5 FIFO",
+               .cpu_name = "adsp_audio.3",
+               .codec_name = "tegra210-admaif",
+               .params = &default_link_params,
+       },
+       [TEGRA210_DAI_LINK_ADSP_ADMAIF6] = {
+               .name = "ADSP ADMAIF6",
+               .stream_name = "ADSP ADMAIF6",
+               .cpu_dai_name = "ADSP-ADMAIF6",
+               .codec_dai_name = "ADMAIF6 FIFO",
+               .cpu_name = "adsp_audio.3",
+               .codec_name = "tegra210-admaif",
+               .params = &default_link_params,
+       },
+       [TEGRA210_DAI_LINK_ADSP_ADMAIF7] = {
+               .name = "ADSP ADMAIF7",
+               .stream_name = "ADSP ADMAIF7",
+               .cpu_dai_name = "ADSP-ADMAIF7",
+               .codec_dai_name = "ADMAIF7 FIFO",
+               .cpu_name = "adsp_audio.3",
+               .codec_name = "tegra210-admaif",
+               .params = &default_link_params,
+       },
+       [TEGRA210_DAI_LINK_ADSP_ADMAIF8] = {
+               .name = "ADSP ADMAIF8",
+               .stream_name = "ADSP ADMAIF8",
+               .cpu_dai_name = "ADSP-ADMAIF8",
+               .codec_dai_name = "ADMAIF8 FIFO",
+               .cpu_name = "adsp_audio.3",
+               .codec_name = "tegra210-admaif",
+               .params = &default_link_params,
+       },
+       [TEGRA210_DAI_LINK_ADSP_ADMAIF9] = {
+               .name = "ADSP ADMAIF9",
+               .stream_name = "ADSP ADMAIF9",
+               .cpu_dai_name = "ADSP-ADMAIF9",
+               .codec_dai_name = "ADMAIF9 FIFO",
+               .cpu_name = "adsp_audio.3",
+               .codec_name = "tegra210-admaif",
+               .params = &default_link_params,
+       },
+       [TEGRA210_DAI_LINK_ADSP_ADMAIF10] = {
+               .name = "ADSP ADMAIF10",
+               .stream_name = "ADSP ADMAIF10",
+               .cpu_dai_name = "ADSP-ADMAIF10",
+               .codec_dai_name = "ADMAIF10 FIFO",
+               .cpu_name = "adsp_audio.3",
+               .codec_name = "tegra210-admaif",
+               .params = &default_link_params,
+       },
+       [TEGRA210_DAI_LINK_ADSP_PCM] = {
+               .name = "ADSP PCM",
+               .stream_name = "ADSP PCM",
+               .cpu_dai_name = "ADSP PCM",
+               .codec_dai_name = "ADSP-FE1",
+               .cpu_name = "adsp_audio.3",
+               .codec_name = "adsp_audio.3",
+               .platform_name = "adsp_audio.3",
+       },
+       [TEGRA210_DAI_LINK_ADSP_COMPR1] = {
+               .name = "ADSP COMPR1",
+               .stream_name = "ADSP COMPR1",
+               .cpu_dai_name = "ADSP COMPR1",
+               .codec_dai_name = "ADSP-FE2",
+               .cpu_name = "adsp_audio.3",
+               .codec_name = "adsp_audio.3",
+               .platform_name = "adsp_audio.3",
+       },
+       [TEGRA210_DAI_LINK_ADSP_COMPR2] = {
+               .name = "ADSP COMPR2",
+               .stream_name = "ADSP COMPR2",
+               .cpu_dai_name = "ADSP COMPR2",
+               .codec_dai_name = "ADSP-FE3",
+               .cpu_name = "adsp_audio.3",
+               .codec_name = "adsp_audio.3",
+               .platform_name = "adsp_audio.3",
+       },
 };
 
 static struct snd_soc_codec_conf
@@ -703,6 +1586,8 @@ struct snd_soc_dai_link *tegra_machine_get_dai_link(void)
        if (tegra_asoc_machine_links)
                return tegra_asoc_machine_links;
 
+       num_dai_links = size;
+
        tegra_asoc_machine_links = kzalloc(size *
                sizeof(struct snd_soc_dai_link), GFP_KERNEL);
 
@@ -733,6 +1618,7 @@ int tegra_machine_append_dai_link(struct snd_soc_dai_link *link,
        if (!tegra_asoc_machine_links) {
                if (link) {
                        tegra_asoc_machine_links = link;
+                       num_dai_links = size2;
                        return size2;
                } else {
                        return 0;
@@ -745,8 +1631,10 @@ int tegra_machine_append_dai_link(struct snd_soc_dai_link *link,
                                sizeof(struct snd_soc_dai_link), GFP_KERNEL);
                        memcpy(&tegra_asoc_machine_links[size1], link,
                                size2 * sizeof(struct snd_soc_dai_link));
+                       num_dai_links = size1+size2;
                        return size1+size2;
                } else {
+                       num_dai_links = size1;
                        return size1;
                }
        }
@@ -844,3 +1732,328 @@ int tegra_machine_append_codec_conf(struct snd_soc_codec_conf *conf,
        }
 }
 EXPORT_SYMBOL_GPL(tegra_machine_append_codec_conf);
+
+static int tegra_machine_get_format(u64 *p_formats, char *fmt)
+{
+       int i;
+
+       for (i = 0; i < ARRAY_SIZE(bit_format); i++) {
+               if (strcmp(bit_format[i], fmt) == 0) {
+                       *p_formats = 1 << i;
+                       return 0;
+               }
+       }
+       return -EINVAL;
+}
+EXPORT_SYMBOL_GPL(tegra_machine_get_format);
+
+struct snd_soc_dai_link *tegra_machine_new_codec_links(
+       struct platform_device *pdev,
+       struct snd_soc_dai_link *tegra_codec_links,
+       unsigned int *pnum_codec_links)
+{
+       unsigned int i, j, num_codec_links;
+       struct device_node *np = pdev->dev.of_node, *subnp;
+       struct snd_soc_pcm_stream *params;
+       char *str;
+       const char *prefix;
+
+       if (tegra_codec_links)
+               return tegra_codec_links;
+
+       if (!np)
+               goto err;
+
+       if (of_property_read_u32(np,
+               "nvidia,num-codec-link", (u32 *)&num_codec_links)) {
+               dev_err(&pdev->dev,
+                       "Property 'nvidia,num-codec-link' missing or invalid\n");
+               goto err;
+       }
+
+       tegra_codec_links = devm_kzalloc(&pdev->dev, 2 * num_codec_links *
+               sizeof(struct snd_soc_dai_link), GFP_KERNEL);
+       if (!tegra_codec_links) {
+               dev_err(&pdev->dev, "Can't allocate tegra_codec_links\n");
+               goto err;
+       }
+
+       if (bclk_ratio == NULL) {
+               bclk_ratio = devm_kzalloc(&pdev->dev, num_codec_links *
+                       sizeof(unsigned int), GFP_KERNEL);
+               if (!bclk_ratio) {
+                       dev_err(&pdev->dev, "Can't allocate bclk_ratio\n");
+                       goto err;
+               }
+       }
+
+       /* i is for DAP and j is for CIF */
+       for (i = 0, j = num_codec_links; i < num_codec_links; i++, j++) {
+               subnp = of_get_child_by_name(np, dai_link_name[i]);
+               if (subnp) {
+                       tegra_codec_links[i].codec_of_node =
+                               of_parse_phandle(subnp, "codec-dai", 0);
+                       if (!tegra_codec_links[i].codec_of_node) {
+                               dev_err(&pdev->dev,
+                                       "Property '%s.codec-dai' missing or invalid\n",
+                                       dai_link_name[i]);
+                               goto err;
+                       }
+
+                       tegra_codec_links[i].cpu_of_node
+                               = of_parse_phandle(subnp, "cpu-dai", 0);
+                       if (!tegra_codec_links[i].cpu_of_node) {
+                               dev_err(&pdev->dev,
+                                       "Property '%s.cpu-dai' missing or invalid\n",
+                                       dai_link_name[i]);
+                               goto err;
+                       }
+
+                       /* DAP configuration */
+                       if (of_property_read_string(subnp,
+                               "name-prefix", &prefix)) {
+                               dev_err(&pdev->dev,
+                                       "Property 'name-prefix' missing or invalid\n");
+                               goto err;
+                       }
+
+                       str = kzalloc(
+                               sizeof(prefix) + 1 +
+                               sizeof(tegra_codec_links[i]
+                               .codec_of_node->name),
+                               GFP_KERNEL);
+                       str = strcat(str, prefix);
+                       str = strcat(str, " ");
+                       str = strcat(str, tegra_codec_links[i]
+                                       .codec_of_node->name);
+
+                       tegra_codec_links[i].name = str;
+
+                       tegra_codec_links[i].stream_name = "Playback";
+                       tegra_codec_links[i].cpu_dai_name = "DAP";
+                       if (of_property_read_string(subnp, "codec-dai-name",
+                               &tegra_codec_links[i].codec_dai_name)) {
+                               dev_err(&pdev->dev,
+                                       "Property 'codec-dai-name' missing or invalid\n");
+                               goto err;
+                       }
+                       tegra_codec_links[i].dai_fmt =
+                               snd_soc_of_parse_daifmt(subnp, NULL);
+
+                       params = kzalloc(sizeof(struct snd_soc_pcm_stream),
+                               GFP_KERNEL);
+
+                       if (of_property_read_string(subnp,
+                               "bit-format", (const char **)&str)) {
+                               dev_err(&pdev->dev,
+                                       "Property 'bit-format' missing or invalid\n");
+                               goto err;
+                       }
+                       if (tegra_machine_get_format(&params->formats, str)) {
+                               dev_err(&pdev->dev,
+                                       "Wrong codec format\n");
+                               goto err;
+                       }
+
+                       if (of_property_read_u32(subnp,
+                               "srate", &params->rate_min)) {
+                               dev_err(&pdev->dev,
+                                       "Property 'srate' missing or invalid\n");
+                               goto err;
+                       }
+                       params->rate_max = params->rate_min;
+
+                       if (of_property_read_u32(subnp,
+                               "num-channel", &params->channels_min)) {
+                               dev_err(&pdev->dev,
+                                       "Property 'num-channel' missing or invalid\n");
+                               goto err;
+                       }
+                       params->channels_max = params->channels_min;
+                       tegra_codec_links[i].params = params;
+
+                       of_property_read_u32(subnp,
+                               "bclk_ratio", (u32 *)&bclk_ratio[i]);
+
+                       /* CIF configuration */
+                       tegra_codec_links[j].codec_of_node =
+                               tegra_codec_links[i].cpu_of_node;
+                       tegra_codec_links[j].cpu_of_node =
+                               of_parse_phandle(np, "nvidia,xbar", 0);
+                       if (!tegra_codec_links[j].cpu_of_node) {
+                               dev_err(&pdev->dev,
+                                       "Property 'nvidia,xbar' missing or invalid\n");
+                               goto err;
+                       }
+
+                       tegra_codec_links[j].codec_dai_name = "CIF";
+
+                       if (of_property_read_string(subnp, "cpu-dai-name",
+                               &tegra_codec_links[j].cpu_dai_name)) {
+                               dev_err(&pdev->dev,
+                                       "Property 'cpu-dai-name' missing or invalid\n");
+                               goto err;
+                       }
+
+                       str = kzalloc(
+                               sizeof(tegra_codec_links[j].cpu_dai_name) +
+                               1 + sizeof(tegra_codec_links[j].cpu_dai_name),
+                               GFP_KERNEL);
+                       str = strcat(str, tegra_codec_links[j].cpu_dai_name);
+                       str = strcat(str, " ");
+                       str = strcat(str, tegra_codec_links[j].codec_dai_name);
+
+                       tegra_codec_links[j].name =
+                               tegra_codec_links[j].stream_name = str;
+                       tegra_codec_links[j].params =
+                               tegra_codec_links[i].params;
+               } else {
+                       dev_err(&pdev->dev,
+                               "Property '%s' missing or invalid\n",
+                               dai_link_name[i]);
+                       goto err;
+               }
+       }
+
+       *pnum_codec_links = num_codec_links;
+
+       return tegra_codec_links;
+err:
+       return NULL;
+}
+EXPORT_SYMBOL_GPL(tegra_machine_new_codec_links);
+
+void tegra_machine_remove_new_codec_links(
+       struct snd_soc_dai_link *tegra_codec_links)
+{
+       kfree(tegra_codec_links);
+}
+EXPORT_SYMBOL_GPL(tegra_machine_remove_new_codec_links);
+
+struct snd_soc_codec_conf *tegra_machine_new_codec_conf(
+       struct platform_device *pdev,
+       struct snd_soc_codec_conf *tegra_codec_conf,
+       unsigned int *pnum_codec_links)
+{
+       unsigned int i, num_codec_links;
+       struct device_node *np = pdev->dev.of_node, *subnp;
+       const struct device_node *of_node;
+
+       if (tegra_codec_conf)
+               return tegra_codec_conf;
+
+       if (!np)
+               goto err;
+
+       if (of_property_read_u32(np,
+               "nvidia,num-codec-link", (u32 *)&num_codec_links)) {
+               dev_err(&pdev->dev,
+                       "Property 'nvidia,num-codec-link' missing or invalid\n");
+               goto err;
+       }
+
+       tegra_codec_conf = kzalloc(num_codec_links *
+               sizeof(struct snd_soc_codec_conf), GFP_KERNEL);
+
+       for (i = 0; i < num_codec_links; i++) {
+               subnp = of_get_child_by_name(np, dai_link_name[i]);
+               if (subnp) {
+                       of_node = of_parse_phandle(subnp, "codec-dai", 0);
+                       tegra_codec_conf[i].dev_name = of_node->name;
+
+                       of_property_read_string(subnp,
+                               "name-prefix",
+                               &tegra_codec_conf[i].name_prefix);
+               }
+       }
+
+       *pnum_codec_links = num_codec_links;
+
+       return tegra_codec_conf;
+err:
+       return NULL;
+}
+EXPORT_SYMBOL_GPL(tegra_machine_new_codec_conf);
+
+void tegra_machine_remove_new_codec_conf(
+       struct snd_soc_codec_conf *tegra_codec_conf)
+{
+       kfree(tegra_codec_conf);
+}
+EXPORT_SYMBOL_GPL(tegra_machine_remove_new_codec_conf);
+
+/* This function is valid when dai_link is initiated from the DT */
+unsigned int tegra_machine_get_codec_dai_link_idx(char *of_node_name)
+{
+       unsigned int idx = of_machine_is_compatible("nvidia,tegra210") ?
+               TEGRA210_XBAR_DAI_LINKS : TEGRA124_XBAR_DAI_LINKS;
+
+       if (num_dai_links <= idx)
+               goto err;
+
+       while (idx < num_dai_links) {
+               if (tegra_asoc_machine_links[idx].codec_of_node->name &&
+                       strstr(tegra_asoc_machine_links[idx]
+                               .codec_of_node->name,
+                       of_node_name))
+                       break;
+               idx++;
+       }
+
+       return idx;
+
+err:
+       return -EINVAL;
+}
+EXPORT_SYMBOL_GPL(tegra_machine_get_codec_dai_link_idx);
+
+unsigned int tegra_machine_get_bclk_ratio(
+       struct snd_soc_pcm_runtime *rtd)
+{
+       struct snd_soc_dai_link *codec_dai_link = rtd->dai_link;
+       char *codec_of_node_name = (char *)codec_dai_link->codec_of_node->name;
+       unsigned int idx =
+               tegra_machine_get_codec_dai_link_idx(codec_of_node_name);
+
+       if (idx == -EINVAL)
+               goto err;
+
+       if (!bclk_ratio)
+               goto err;
+
+       idx = idx - (of_machine_is_compatible("nvidia,tegra210") ?
+               TEGRA210_XBAR_DAI_LINKS : TEGRA124_XBAR_DAI_LINKS);
+
+       return bclk_ratio[idx];
+
+err:
+       return -EINVAL;
+}
+EXPORT_SYMBOL_GPL(tegra_machine_get_bclk_ratio);
+
+unsigned int tegra_machine_get_num_dai_links(void)
+{
+       return num_dai_links;
+}
+EXPORT_SYMBOL_GPL(tegra_machine_get_num_dai_links);
+
+void tegra_machine_remove_extra_mem_alloc(unsigned int num_codec_links)
+{
+       int i, j;
+
+       kfree(bclk_ratio);
+
+       if (num_dai_links > TEGRA210_XBAR_DAI_LINKS)
+               for (i = TEGRA210_XBAR_DAI_LINKS,
+                       j = TEGRA210_XBAR_DAI_LINKS+num_codec_links;
+                       j < num_dai_links; i++, j++) {
+                       kfree(tegra_asoc_machine_links[i].name);
+                       kfree(tegra_asoc_machine_links[i].params);
+                       kfree(tegra_asoc_machine_links[j].name);
+               }
+}
+EXPORT_SYMBOL_GPL(tegra_machine_remove_extra_mem_alloc);
+
+
+MODULE_AUTHOR("Arun Shamanna Lakshmi <aruns@nvidia.com>");
+MODULE_AUTHOR("Junghyun Kim <juskim@nvidia.com>");
index 39872200c284764cfb702b326aa61fa802486a81..0bde750c84583b28dbb0d354a7bd6dceac3ea360 100644 (file)
@@ -144,6 +144,29 @@ enum tegra210_xbar_dai_link {
        TEGRA210_DAI_LINK_AFC5_TX,
        TEGRA210_DAI_LINK_AFC6_RX,
        TEGRA210_DAI_LINK_AFC6_TX,
+       TEGRA210_DAI_LINK_ADMAIF1_CODEC,
+       TEGRA210_DAI_LINK_ADMAIF2_CODEC,
+       TEGRA210_DAI_LINK_ADMAIF3_CODEC,
+       TEGRA210_DAI_LINK_ADMAIF4_CODEC,
+       TEGRA210_DAI_LINK_ADMAIF5_CODEC,
+       TEGRA210_DAI_LINK_ADMAIF6_CODEC,
+       TEGRA210_DAI_LINK_ADMAIF7_CODEC,
+       TEGRA210_DAI_LINK_ADMAIF8_CODEC,
+       TEGRA210_DAI_LINK_ADMAIF9_CODEC,
+       TEGRA210_DAI_LINK_ADMAIF10_CODEC,
+       TEGRA210_DAI_LINK_ADSP_ADMAIF1,
+       TEGRA210_DAI_LINK_ADSP_ADMAIF2,
+       TEGRA210_DAI_LINK_ADSP_ADMAIF3,
+       TEGRA210_DAI_LINK_ADSP_ADMAIF4,
+       TEGRA210_DAI_LINK_ADSP_ADMAIF5,
+       TEGRA210_DAI_LINK_ADSP_ADMAIF6,
+       TEGRA210_DAI_LINK_ADSP_ADMAIF7,
+       TEGRA210_DAI_LINK_ADSP_ADMAIF8,
+       TEGRA210_DAI_LINK_ADSP_ADMAIF9,
+       TEGRA210_DAI_LINK_ADSP_ADMAIF10,
+       TEGRA210_DAI_LINK_ADSP_PCM,
+       TEGRA210_DAI_LINK_ADSP_COMPR1,
+       TEGRA210_DAI_LINK_ADSP_COMPR2,
        TEGRA210_XBAR_DAI_LINKS, /* Total number of xbar dai links */
 };
 
@@ -219,4 +242,30 @@ void tegra_machine_remove_codec_conf(void);
 int tegra_machine_append_codec_conf(struct snd_soc_codec_conf *conf,
                unsigned int conf_size);
 
+struct snd_soc_dai_link *tegra_machine_new_codec_links(
+       struct platform_device *pdev,
+       struct snd_soc_dai_link *tegra_codec_links,
+       unsigned int *pnum_codec_links);
+
+void tegra_machine_remove_new_codec_links(
+       struct snd_soc_dai_link *tegra_codec_links);
+
+struct snd_soc_codec_conf *tegra_machine_new_codec_conf(
+       struct platform_device *pdev,
+       struct snd_soc_codec_conf *tegra_codec_conf,
+       unsigned int *pnum_codec_links);
+
+void tegra_machine_remove_new_codec_conf(
+       struct snd_soc_codec_conf *tegra_codec_conf);
+
+unsigned int tegra_machine_get_codec_dai_link_idx(char *of_node_name);
+
+unsigned int tegra_machine_get_bclk_ratio(
+       struct snd_soc_pcm_runtime *rtd);
+
+unsigned int tegra_machine_get_num_dai_links(void);
+
+void tegra_machine_remove_extra_mem_alloc(unsigned int num_codec_links);
+
+
 #endif
index 480a5a25bf0c007eeeed73f78d2140489a8b5135..13dd69ed6b4997d954e45db36bb9b523570d8cf3 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * tegra_grenada.c - Tegra VCM30 T124 Machine driver
+ * tegra_grenada.c - Tegra grenada Machine driver
  *
  * Copyright (c) 2013-2014 NVIDIA CORPORATION.  All rights reserved.
  *
 #include "../codecs/ad193x.h"
 
 #include "tegra_asoc_utils_alt.h"
+#include "tegra_asoc_machine_alt.h"
 #include "ahub_unit_fpga_clock.h"
 
 #define DRV_NAME "tegra-snd-grenada"
+
+#define MAX_TX_SLOT_SIZE 32
+#define MAX_RX_SLOT_SIZE 32
+
 struct tegra_grenada {
        struct tegra_asoc_audio_clock_info audio_clock;
+       unsigned int num_codec_links;
 };
 
 static int tegra_grenada_hw_params(struct snd_pcm_substream *substream,
@@ -44,12 +50,10 @@ static int tegra_grenada_hw_params(struct snd_pcm_substream *substream,
 {
        return 0;
 }
-
 static int tegra_grenada_startup(struct snd_pcm_substream *substream)
 {
        return 0;
 }
-
 static void tegra_grenada_shutdown(struct snd_pcm_substream *substream)
 {
        return;
@@ -60,12 +64,15 @@ static int tegra_grenada_init(struct snd_soc_pcm_runtime *rtd)
        struct snd_soc_dai *codec_dai = rtd->codec_dai;
        struct snd_soc_codec *codec = codec_dai->codec;
        struct snd_soc_card *card = codec->card;
-       struct snd_soc_dai *i2s_dai = card->rtd[10].cpu_dai;
+       struct snd_soc_dai *i2s_dai = rtd->cpu_dai;
+       struct snd_soc_pcm_stream *dai_params =
+               (struct snd_soc_pcm_stream *)rtd->dai_link->params;
+
        unsigned int srate;
        int err;
        AD1937_EXTRA_INFO ad1937_info;
 
-       srate = 48000;
+       srate = dai_params->rate_min;
 
        err = snd_soc_dai_set_sysclk(i2s_dai, 0, srate, SND_SOC_CLOCK_IN);
        if (err < 0) {
@@ -79,11 +86,11 @@ static int tegra_grenada_init(struct snd_soc_pcm_runtime *rtd)
        program_cdc_pll(2, CLK_OUT_12_2888_MHZ);
        program_io_expander();
        i2s_clk_setup(I2S1, 0, 23);
-       i2s_clk_setup(I2S2, 0, 0);
+       i2s_clk_setup(I2S3, 0, 0);
        i2s_clk_setup(I2S5, 0, 3);
 
        i2s_pinmux_setup(I2S1, 0);
-       i2s_pinmux_setup(I2S2, 0);
+       i2s_pinmux_setup(I2S3, 0);
        i2s_pinmux_setup(I2S5, 1);
 
 #else
@@ -94,7 +101,7 @@ static int tegra_grenada_init(struct snd_soc_pcm_runtime *rtd)
 
        /* I2S1: 23 for 8Khz, 3 for 48Khz */
        i2s_clk_divider(I2S1, 23);
-       i2s_clk_divider(I2S2, 0);
+       i2s_clk_divider(I2S3, 0);
        i2s_clk_divider(I2S5, 3);
 #endif
        program_max_codec();
@@ -103,7 +110,7 @@ static int tegra_grenada_init(struct snd_soc_pcm_runtime *rtd)
        ad1937_info.dacMasterEn = AUDIO_DAC_SLAVE_MODE;
        ad1937_info.daisyEn = 0;
        OnAD1937CaptureAndPlayback(AUDIO_CODEC_SLAVE_MODE,
-                               AUDIO_INTERFACE_TDM_FORMAT,
+                               AUDIO_INTERFACE_I2S_FORMAT,
                                I2S_DATAWIDTH_16,
                                64, 0, 0,
                                AUDIO_SAMPLE_RATE_48_00,
@@ -114,7 +121,7 @@ static int tegra_grenada_init(struct snd_soc_pcm_runtime *rtd)
        ad1937_info.dacMasterEn = AUDIO_DAC_SLAVE_MODE;
        ad1937_info.daisyEn = 0;
        OnAD1937CaptureAndPlayback(AUDIO_CODEC_SLAVE_MODE,
-                               AUDIO_INTERFACE_I2S_FORMAT,
+                               AUDIO_INTERFACE_TDM_FORMAT,
                                I2S_DATAWIDTH_16,
                                256, 0, 0,
                                AUDIO_SAMPLE_RATE_48_00,
@@ -122,78 +129,116 @@ static int tegra_grenada_init(struct snd_soc_pcm_runtime *rtd)
        return 0;
 }
 
-static int tegra_grenada_spdif_init(struct snd_soc_pcm_runtime *rtd)
+static int tegra_grenada_amx1_dai_init(struct snd_soc_pcm_runtime *rtd)
 {
-       struct snd_soc_dai *codec_dai = rtd->codec_dai;
-       struct snd_soc_codec *codec = codec_dai->codec;
-       struct snd_soc_card *card = codec->card;
-       unsigned int mclk, srate;
-       int err;
+       struct snd_soc_dai *amx_dai = rtd->cpu_dai;
+       struct device_node *np = rtd->card->dev->of_node;
+       unsigned int tx_slot[MAX_TX_SLOT_SIZE], i, j;
+
+       if (of_property_read_u32_array(np, "nvidia,amx-slot-map",
+               tx_slot, MAX_TX_SLOT_SIZE))
+               for (i = 0, j = 0; i < MAX_TX_SLOT_SIZE; i += 8) {
+                       tx_slot[i] = 0;
+                       tx_slot[i + 1] = 0;
+                       tx_slot[i + 2] = (j << 16) | (1 << 8) | 0;
+                       tx_slot[i + 3] = (j << 16) | (1 << 8) | 1;
+                       tx_slot[i + 4] = 0;
+                       tx_slot[i + 5] = 0;
+                       tx_slot[i + 6] = (j << 16) | (2 << 8) | 0;
+                       tx_slot[i + 7] = (j << 16) | (2 << 8) | 1;
+                       j++;
+               }
 
-       srate = 48000;
-       mclk = srate * 512;
+       if (amx_dai->driver->ops->set_channel_map)
+               amx_dai->driver->ops->set_channel_map(amx_dai,
+                               MAX_TX_SLOT_SIZE, tx_slot, 0, 0);
 
-       err = snd_soc_dai_set_sysclk(card->rtd[61].cpu_dai, 0, srate,
-                                       SND_SOC_CLOCK_OUT);
-       err = snd_soc_dai_set_sysclk(card->rtd[61].cpu_dai, 0, srate,
-                                       SND_SOC_CLOCK_IN);
        return 0;
 }
 
-static int tegra_grenada_amx_dai_init(struct snd_soc_pcm_runtime *rtd)
+static int tegra_grenada_amx2_dai_init(struct snd_soc_pcm_runtime *rtd)
 {
-       struct snd_soc_dai *codec_dai = rtd->codec_dai;
-       struct snd_soc_codec *codec = codec_dai->codec;
-       struct snd_soc_card *card = codec->card;
-       struct snd_soc_dai *amx_dai = card->rtd[20].cpu_dai;
-       unsigned int tx_slot[32], i, j;
-
-       for (i = 0, j = 0; i < 32; i += 8) {
-               tx_slot[i] = 0;
-               tx_slot[i + 1] = 0;
-               tx_slot[i + 2] = (j << 16) | (1 << 8) | 0;
-               tx_slot[i + 3] = (j << 16) | (1 << 8) | 1;
-               tx_slot[i + 4] = 0;
-               tx_slot[i + 5] = 0;
-               tx_slot[i + 6] = (j << 16) | (2 << 8) | 0;
-               tx_slot[i + 7] = (j << 16) | (2 << 8) | 1;
-               j++;
-       }
+       struct snd_soc_dai *amx_dai = rtd->cpu_dai;
+       struct device_node *np = rtd->card->dev->of_node;
+       unsigned int tx_slot[MAX_TX_SLOT_SIZE], i, j;
+
+       if (of_property_read_u32_array(np, "nvidia,amx-slot-map",
+               tx_slot, MAX_TX_SLOT_SIZE))
+               for (i = 0, j = 0; i < MAX_TX_SLOT_SIZE; i += 8) {
+                       tx_slot[i] = 0;
+                       tx_slot[i + 1] = 0;
+                       tx_slot[i + 2] = (j << 16) | (1 << 8) | 0;
+                       tx_slot[i + 3] = (j << 16) | (1 << 8) | 1;
+                       tx_slot[i + 4] = 0;
+                       tx_slot[i + 5] = 0;
+                       tx_slot[i + 6] = (j << 16) | (2 << 8) | 0;
+                       tx_slot[i + 7] = (j << 16) | (2 << 8) | 1;
+                       j++;
+               }
 
        if (amx_dai->driver->ops->set_channel_map)
                amx_dai->driver->ops->set_channel_map(amx_dai,
-                                                       32, tx_slot, 0, 0);
+                               MAX_TX_SLOT_SIZE, tx_slot, 0, 0);
 
        return 0;
 }
 
-static int tegra_grenada_adx_dai_init(struct snd_soc_pcm_runtime *rtd)
+
+static int tegra_grenada_adx1_dai_init(struct snd_soc_pcm_runtime *rtd)
 {
-       struct snd_soc_dai *codec_dai = rtd->codec_dai;
-       struct snd_soc_codec *codec = codec_dai->codec;
-       struct snd_soc_card *card = codec->card;
-       struct snd_soc_dai *adx_dai = card->rtd[21].codec_dai;
-       unsigned int rx_slot[32], i, j;
-
-       for (i = 0, j = 0; i < 32; i += 8) {
-               rx_slot[i] = 0;
-               rx_slot[i + 1] = 0;
-               rx_slot[i + 2] = (j << 16) | (1 << 8) | 0;
-               rx_slot[i + 3] = (j << 16) | (1 << 8) | 1;
-               rx_slot[i + 4] = 0;
-               rx_slot[i + 5] = 0;
-               rx_slot[i + 6] = (j << 16) | (2 << 8) | 0;
-               rx_slot[i + 7] = (j << 16) | (2 << 8) | 1;
-               j++;
-       }
+       struct snd_soc_dai *adx_dai = rtd->codec_dai;
+       struct device_node *np = rtd->card->dev->of_node;
+       unsigned int rx_slot[MAX_RX_SLOT_SIZE], i, j;
+
+       if (of_property_read_u32_array(np, "nvidia,adx-slot-map",
+               rx_slot, MAX_RX_SLOT_SIZE))
+               for (i = 0, j = 0; i < MAX_RX_SLOT_SIZE; i += 8) {
+                       rx_slot[i] = 0;
+                       rx_slot[i + 1] = 0;
+                       rx_slot[i + 2] = (j << 16) | (1 << 8) | 0;
+                       rx_slot[i + 3] = (j << 16) | (1 << 8) | 1;
+                       rx_slot[i + 4] = 0;
+                       rx_slot[i + 5] = 0;
+                       rx_slot[i + 6] = (j << 16) | (2 << 8) | 0;
+                       rx_slot[i + 7] = (j << 16) | (2 << 8) | 1;
+                       j++;
+               }
+
+       if (adx_dai->driver->ops->set_channel_map)
+               adx_dai->driver->ops->set_channel_map(adx_dai,
+                               0, 0, MAX_RX_SLOT_SIZE, rx_slot);
+
+       return 0;
+}
+
+static int tegra_grenada_adx2_dai_init(struct snd_soc_pcm_runtime *rtd)
+{
+       struct snd_soc_dai *adx_dai = rtd->codec_dai;
+       struct device_node *np = rtd->card->dev->of_node;
+       unsigned int rx_slot[MAX_RX_SLOT_SIZE], i, j;
+
+       if (of_property_read_u32_array(np, "nvidia,adx-slot-map",
+               rx_slot, MAX_RX_SLOT_SIZE))
+               for (i = 0, j = 0; i < MAX_RX_SLOT_SIZE; i += 8) {
+                       rx_slot[i] = 0;
+                       rx_slot[i + 1] = 0;
+                       rx_slot[i + 2] = (j << 16) | (1 << 8) | 0;
+                       rx_slot[i + 3] = (j << 16) | (1 << 8) | 1;
+                       rx_slot[i + 4] = 0;
+                       rx_slot[i + 5] = 0;
+                       rx_slot[i + 6] = (j << 16) | (2 << 8) | 0;
+                       rx_slot[i + 7] = (j << 16) | (2 << 8) | 1;
+                       j++;
+               }
 
        if (adx_dai->driver->ops->set_channel_map)
                adx_dai->driver->ops->set_channel_map(adx_dai,
-                                                       0, 0, 32, rx_slot);
+                               0, 0, MAX_RX_SLOT_SIZE, rx_slot);
 
        return 0;
 }
 
+
 static int tegra_grenada_sfc_init(struct snd_soc_pcm_runtime *rtd)
 {
        struct snd_soc_dai *codec_dai = rtd->codec_dai;
@@ -236,1083 +281,12 @@ static int tegra_grenada_remove(struct snd_soc_card *card)
        return 0;
 }
 
-static const struct snd_soc_pcm_stream tdm_link_params = {
-       .formats = SNDRV_PCM_FMTBIT_S32_LE,
-       .rate_min = 48000,
-       .rate_max = 48000,
-       .channels_min = 8,
-       .channels_max = 8,
-};
-
-static const struct snd_soc_pcm_stream amx_adx_link_params = {
-       .formats = SNDRV_PCM_FMTBIT_S16_LE,
-       .rate_min = 48000,
-       .rate_max = 48000,
-       .channels_min = 2,
-       .channels_max = 2,
-};
-
-static const struct snd_soc_pcm_stream i2s_link_params = {
-       .formats = SNDRV_PCM_FMTBIT_S16_LE,
-       .rate_min = 48000,
-       .rate_max = 48000,
-       .channels_min = 2,
-       .channels_max = 2,
-};
-
-static struct snd_soc_dai_link tegra_grenada_links[] = {
-       {
-               /* 0 */
-               .name = "ADMAIF1 CIF",
-               .stream_name = "ADMAIF1 CIF",
-               /* .cpu_of_node = AHUB ADMAIF */
-               .cpu_dai_name = "ADMAIF1",
-               /* .codec_of_node = AHUB XBAR */
-               .codec_dai_name = "ADMAIF1",
-               .ops = &tegra_grenada_ops,
-       },
-       {
-               /* 1 */
-               .name = "ADMAIF2 CIF",
-               .stream_name = "ADMAIF2 CIF",
-               /* .cpu_of_node = AHUB ADMAIF */
-               .cpu_dai_name = "ADMAIF2",
-               /* .codec_of_node = AHUB XBAR */
-               .codec_dai_name = "ADMAIF2",
-               .ops = &tegra_grenada_ops,
-       },
-       {
-               /* 2 */
-               .name = "ADMAIF3 CIF",
-               .stream_name = "ADMAIF3 CIF",
-               /* .cpu_of_node = AHUB ADMAIF */
-               .cpu_dai_name = "ADMAIF3",
-               /* .codec_of_node = AHUB XBAR */
-               .codec_dai_name = "ADMAIF3",
-               .ops = &tegra_grenada_ops,
-       },
-       {
-               /* 3 */
-               .name = "ADMAIF4 CIF",
-               .stream_name = "ADMAIF4 CIF",
-               /* .cpu_of_node = AHUB ADMAIF */
-               .cpu_dai_name = "ADMAIF4",
-               /* .codec_of_node = AHUB XBAR */
-               .codec_dai_name = "ADMAIF4",
-               .ops = &tegra_grenada_ops,
-       },
-       {
-               /* 4 */
-               .name = "ADMAIF5 CIF",
-               .stream_name = "ADMAIF5 CIF",
-               /* .cpu_of_node = AHUB ADMAIF */
-               .cpu_dai_name = "ADMAIF5",
-               /* .codec_of_node = AHUB XBAR */
-               .codec_dai_name = "ADMAIF5",
-               .ops = &tegra_grenada_ops,
-       },
-
-       {
-               /* 5 */
-               .name = "ADMAIF6 CIF",
-               .stream_name = "ADMAIF6 CIF",
-               /* .cpu_of_node = AHUB ADMAIF */
-               .cpu_dai_name = "ADMAIF6",
-               /* .codec_of_node = AHUB XBAR */
-               .codec_dai_name = "ADMAIF6",
-               .ops = &tegra_grenada_ops,
-       },
-       {
-               /* 6 */
-               .name = "ADMAIF7 CIF",
-               .stream_name = "ADMAIF7 CIF",
-               /* .cpu_of_node = AHUB ADMAIF */
-               .cpu_dai_name = "ADMAIF7",
-               /* .codec_of_node = AHUB XBAR */
-               .codec_dai_name = "ADMAIF7",
-               .ops = &tegra_grenada_ops,
-       },
-       {
-               /* 7 */
-               .name = "ADMAIF8 CIF",
-               .stream_name = "ADMAIF8 CIF",
-               /* .cpu_of_node = AHUB ADMAIF */
-               .cpu_dai_name = "ADMAIF8",
-               /* .codec_of_node = AHUB XBAR */
-               .codec_dai_name = "ADMAIF8",
-               .ops = &tegra_grenada_ops,
-       },
-       {
-               /* 8 */
-               .name = "ADMAIF9 CIF",
-               .stream_name = "ADMAIF9 CIF",
-               /* .cpu_of_node = AHUB ADMAIF */
-               .cpu_dai_name = "ADMAIF9",
-               /* .codec_of_node = AHUB XBAR */
-               .codec_dai_name = "ADMAIF9",
-               .ops = &tegra_grenada_ops,
-       },
-       {
-               /* 9 */
-               .name = "ADMAIF10 CIF",
-               .stream_name = "ADMAIF10 CIF",
-               /* .cpu_of_node = AHUB ADMAIF */
-               .cpu_dai_name = "ADMAIF10",
-               /* .codec_of_node = AHUB XBAR */
-               .codec_dai_name = "ADMAIF10",
-               .ops = &tegra_grenada_ops,
-       },
-       {
-               /* 10 */
-               .name = "x spdif-dit",
-               .stream_name = "Playback",
-               /* .cpu_of_node = I2S1 */
-               .cpu_dai_name = "DAP",
-               /* .codec_of_node = SPDIF dummy */
-               .codec_dai_name = "dit-hifi",
-               .init = tegra_grenada_init,
-               .params = &i2s_link_params,
-               .dai_fmt = SND_SOC_DAIFMT_I2S |
-                          SND_SOC_DAIFMT_NB_NF |
-                          SND_SOC_DAIFMT_CBS_CFS,
-       },
-       {
-               /* 11 */
-               .name = "I2S1 CIF",
-               .stream_name = "I2S1 CIF",
-               /* .cpu_of_node = AHUB XBAR */
-               .cpu_dai_name = "I2S1",
-               /* .codec_of_node = I2S1 */
-               .codec_dai_name = "CIF",
-               .params = &i2s_link_params,
-       },
-       {
-               /* 12 */
-               .name = "y spdif-dit",
-               .stream_name = "Playback",
-               /* .cpu_of_node = I2S2 */
-               .cpu_dai_name = "DAP",
-               /* .codec_of_node = SPDIF dummy */
-               .codec_dai_name = "dit-hifi",
-               .params = &tdm_link_params,
-               .dai_fmt = SND_SOC_DAIFMT_DSP_A |
-                          SND_SOC_DAIFMT_NB_NF |
-                          SND_SOC_DAIFMT_CBS_CFS,
-       },
-       {
-               /* 13 */
-               .name = "I2S2 CIF",
-               .stream_name = "I2S2 CIF",
-               /* .cpu_of_node = AHUB XBAR */
-               .cpu_dai_name = "I2S2",
-               /* .codec_of_node = I2S2 */
-               .codec_dai_name = "CIF",
-               .params = &tdm_link_params,
-       },
-       {
-               /* 14 */
-               .name = "z spdif-dit",
-               .stream_name = "Playback",
-               /* .cpu_of_node = I2S5 */
-               .cpu_dai_name = "DAP",
-               /* .codec_of_node = SPDIF dummy */
-               .codec_dai_name = "dit-hifi",
-               .params = &i2s_link_params,
-               .dai_fmt = SND_SOC_DAIFMT_I2S |
-                          SND_SOC_DAIFMT_NB_NF |
-                          SND_SOC_DAIFMT_CBS_CFS,
-       },
-       {
-               /* 15 */
-               .name = "I2S5 CIF",
-               .stream_name = "I2S5 CIF",
-               /* .cpu_of_node = AHUB XBAR */
-               .cpu_dai_name = "I2S5",
-               /* .codec_of_node = I2S5 */
-               .codec_dai_name = "CIF",
-               .params = &i2s_link_params,
-       },
-       {
-               /* 16 */
-               .name = "AMX1 IN1",
-               .stream_name = "AMX1 IN",
-               /* .cpu_of_node = AHUB XBAR */
-               .cpu_dai_name = "AMX1-1",
-               /* .codec_of_node = AMX1 */
-               .codec_dai_name = "IN1",
-               .params = &amx_adx_link_params,
-       },
-       {
-               /* 17 */
-               .name = "AMX1 IN2",
-               .stream_name = "AMX1 IN",
-               /* .cpu_of_node = AHUB XBAR */
-               .cpu_dai_name = "AMX1-2",
-               /* .codec_of_node = AMX1 */
-               .codec_dai_name = "IN2",
-               .params = &amx_adx_link_params,
-       },
-       {
-               /* 18 */
-               .name = "AMX1 IN3",
-               .stream_name = "AMX1 IN",
-               /* .cpu_of_node = AHUB XBAR */
-               .cpu_dai_name = "AMX1-3",
-               /* .codec_of_node = AMX1 */
-               .codec_dai_name = "IN3",
-               .params = &amx_adx_link_params,
-       },
-       {
-               /* 19 */
-               .name = "AMX1 IN4",
-               .stream_name = "AMX1 IN",
-               /* .cpu_of_node = AHUB XBAR */
-               .cpu_dai_name = "AMX1-4",
-               /* .codec_of_node = AMX1 */
-               .codec_dai_name = "IN4",
-               .params = &amx_adx_link_params,
-       },
-       {
-               /* 20 */
-               .name = "AMX1 CIF",
-               .stream_name = "AMX1 CIF",
-               /* .cpu_of_node = AMX1 OUT */
-               .cpu_dai_name = "OUT",
-               /* .codec_of_node = AHUB XBAR */
-               .codec_dai_name = "AMX1",
-               .init = tegra_grenada_amx_dai_init,
-               .params = &tdm_link_params,
-       },
-       {
-               /* 21 */
-               .name = "ADX1 CIF",
-               .stream_name = "ADX1 IN",
-               .cpu_dai_name = "ADX1",
-               .codec_dai_name = "IN",
-               .init = tegra_grenada_adx_dai_init,
-               .params = &tdm_link_params,
-       },
-       {
-               /* 22 */
-               .name = "ADX1 OUT1",
-               .stream_name = "ADX1 OUT",
-               .cpu_dai_name = "OUT1",
-               .codec_dai_name = "ADX1-1",
-               .params = &amx_adx_link_params,
-       },
-       {
-               /* 23 */
-               .name = "ADX1 OUT2",
-               .stream_name = "ADX1 OUT",
-               .cpu_dai_name = "OUT2",
-               .codec_dai_name = "ADX1-2",
-               .params = &amx_adx_link_params,
-       },
-       {
-               /* 24 */
-               .name = "ADX1 OUT3",
-               .stream_name = "ADX1 OUT",
-               .cpu_dai_name = "OUT3",
-               .codec_dai_name = "ADX1-3",
-               .params = &amx_adx_link_params,
-       },
-       {
-               /* 25 */
-               .name = "ADX1 OUT4",
-               .stream_name = "ADX1 OUT",
-               .cpu_dai_name = "OUT4",
-               .codec_dai_name = "ADX1-4",
-               .params = &amx_adx_link_params,
-       },
-       {
-               /* 26 */
-               .name = "MIXER1 RX1",
-               .stream_name = "MIXER1 RX",
-               /* .cpu_of_node = AHUB XBAR */
-               .cpu_dai_name = "MIXER1-1",
-               /* .codec_of_node = AMX1 */
-               .codec_dai_name = "RX1",
-               .params = &amx_adx_link_params,
-       },
-       {
-               /* 27 */
-               .name = "MIXER1 RX2",
-               .stream_name = "MIXER1 RX",
-               /* .cpu_of_node = AHUB XBAR */
-               .cpu_dai_name = "MIXER1-2",
-               /* .codec_of_node = AMX1 */
-               .codec_dai_name = "RX2",
-               .params = &amx_adx_link_params,
-       },
-       {
-               /* 28 */
-               .name = "MIXER1 RX3",
-               .stream_name = "MIXER1 RX",
-               /* .cpu_of_node = AHUB XBAR */
-               .cpu_dai_name = "MIXER1-3",
-               /* .codec_of_node = AMX1 */
-               .codec_dai_name = "RX3",
-               .params = &amx_adx_link_params,
-       },
-       {
-               /* 29 */
-               .name = "MIXER1 RX4",
-               .stream_name = "MIXER1 RX",
-               /* .cpu_of_node = AHUB XBAR */
-               .cpu_dai_name = "MIXER1-4",
-               /* .codec_of_node = AMX1 */
-               .codec_dai_name = "RX4",
-               .params = &amx_adx_link_params,
-       },
-       {
-               /* 30 */
-               .name = "MIXER1 RX5",
-               .stream_name = "MIXER1 RX",
-               /* .cpu_of_node = AHUB XBAR */
-               .cpu_dai_name = "MIXER1-5",
-               /* .codec_of_node = AMX1 */
-               .codec_dai_name = "RX5",
-               .params = &amx_adx_link_params,
-       },
-       {
-               /* 31 */
-               .name = "MIXER1 RX6",
-               .stream_name = "MIXER1 RX",
-               /* .cpu_of_node = AHUB XBAR */
-               .cpu_dai_name = "MIXER1-6",
-               /* .codec_of_node = AMX1 */
-               .codec_dai_name = "RX6",
-               .params = &amx_adx_link_params,
-       },
-       {
-               /* 32 */
-               .name = "MIXER1 RX7",
-               .stream_name = "MIXER1 RX",
-               /* .cpu_of_node = AHUB XBAR */
-               .cpu_dai_name = "MIXER1-7",
-               /* .codec_of_node = AMX1 */
-               .codec_dai_name = "RX7",
-               .params = &amx_adx_link_params,
-       },
-       {
-               /* 33 */
-               .name = "MIXER1 RX8",
-               .stream_name = "MIXER1 RX",
-               /* .cpu_of_node = AHUB XBAR */
-               .cpu_dai_name = "MIXER1-8",
-               /* .codec_of_node = AMX1 */
-               .codec_dai_name = "RX8",
-               .params = &amx_adx_link_params,
-       },
-       {
-               /* 34 */
-               .name = "MIXER1 RX9",
-               .stream_name = "MIXER1 RX",
-               /* .cpu_of_node = AHUB XBAR */
-               .cpu_dai_name = "MIXER1-9",
-               /* .codec_of_node = AMX1 */
-               .codec_dai_name = "RX9",
-               .params = &amx_adx_link_params,
-       },
-       {
-               /* 35 */
-               .name = "MIXER1 RX10",
-               .stream_name = "MIXER1 RX",
-               /* .cpu_of_node = AHUB XBAR */
-               .cpu_dai_name = "MIXER1-10",
-               /* .codec_of_node = AMX1 */
-               .codec_dai_name = "RX10",
-               .params = &amx_adx_link_params,
-       },
-       {
-               /* 36 */
-               .name = "MIXER1 TX1",
-               .stream_name = "MIXER1 TX",
-               /* .cpu_of_node = AHUB XBAR */
-               .cpu_dai_name = "TX1",
-               /* .codec_of_node = AMX1 */
-               .codec_dai_name = "MIXER1-1",
-               .params = &amx_adx_link_params,
-       },
-       {
-               /* 37 */
-               .name = "MIXER1 TX2",
-               .stream_name = "MIXER1 TX",
-               /* .cpu_of_node = AHUB XBAR */
-               .cpu_dai_name = "TX2",
-               /* .codec_of_node = AMX1 */
-               .codec_dai_name = "MIXER1-2",
-               .params = &amx_adx_link_params,
-       },
-       {
-               /* 38 */
-               .name = "MIXER1 TX3",
-               .stream_name = "MIXER1 TX",
-               /* .cpu_of_node = AHUB XBAR */
-               .cpu_dai_name = "TX3",
-               /* .codec_of_node = AMX1 */
-               .codec_dai_name = "MIXER1-3",
-               .params = &amx_adx_link_params,
-       },
-       {
-               /* 39 */
-               .name = "MIXER1 TX4",
-               .stream_name = "MIXER1 TX",
-               /* .cpu_of_node = AHUB XBAR */
-               .cpu_dai_name = "TX4",
-               /* .codec_of_node = AMX1 */
-               .codec_dai_name = "MIXER1-4",
-               .params = &amx_adx_link_params,
-       },
-       {
-               /* 40 */
-               .name = "MIXER1 TX5",
-               .stream_name = "MIXER1 TX",
-               /* .cpu_of_node = AHUB XBAR */
-               .cpu_dai_name = "TX5",
-               /* .codec_of_node = AMX1 */
-               .codec_dai_name = "MIXER1-5",
-               .params = &amx_adx_link_params,
-       },
-       {
-               /* 41 */
-               .name = "SFC1 RX",
-               .stream_name = "SFC1 RX",
-               /* .cpu_of_node = AHUB XBAR */
-               .cpu_dai_name = "SFC1",
-               /* .codec_of_node = I2S1 */
-               .codec_dai_name = "CIF",
-               .params = &i2s_link_params,
-               .init = tegra_grenada_sfc_init,
-       },
-       {
-               /* 42 */
-               .name = "SFC1 TX",
-               .stream_name = "SFC1 TX",
-               /* .cpu_of_node = AHUB XBAR */
-               .cpu_dai_name = "DAP",
-               /* .codec_of_node = I2S1 */
-               .codec_dai_name = "SFC1",
-               .params = &i2s_link_params,
-       },
-       {
-               /* 43 */
-               .name = "SFC2 RX",
-               .stream_name = "SFC2 RX",
-               /* .cpu_of_node = AHUB XBAR */
-               .cpu_dai_name = "SFC2",
-               /* .codec_of_node = I2S1 */
-               .codec_dai_name = "CIF",
-               .params = &i2s_link_params,
-       },
-       {
-               /* 44 */
-               .name = "SFC2 TX",
-               .stream_name = "SFC2 TX",
-               /* .cpu_of_node = AHUB XBAR */
-               .cpu_dai_name = "DAP",
-               /* .codec_of_node = I2S1 */
-               .codec_dai_name = "SFC2",
-               .params = &i2s_link_params,
-       },
-       {
-               /* 45 */
-               .name = "SFC3 RX",
-               .stream_name = "SFC3 RX",
-               /* .cpu_of_node = AHUB XBAR */
-               .cpu_dai_name = "SFC3",
-               /* .codec_of_node = I2S1 */
-               .codec_dai_name = "CIF",
-               .params = &i2s_link_params,
-       },
-       {
-               /* 46 */
-               .name = "SFC3 TX",
-               .stream_name = "SFC3 TX",
-               /* .cpu_of_node = AHUB XBAR */
-               .cpu_dai_name = "DAP",
-               /* .codec_of_node = I2S1 */
-               .codec_dai_name = "SFC3",
-               .params = &i2s_link_params,
-       },
-       {
-               /* 47 */
-               .name = "SFC4 RX",
-               .stream_name = "SFC4 RX",
-               /* .cpu_of_node = AHUB XBAR */
-               .cpu_dai_name = "SFC4",
-               /* .codec_of_node = I2S1 */
-               .codec_dai_name = "CIF",
-               .params = &i2s_link_params,
-       },
-       {
-               /* 48 */
-               .name = "SFC4 TX",
-               .stream_name = "SFC4 TX",
-               /* .cpu_of_node = AHUB XBAR */
-               .cpu_dai_name = "DAP",
-               /* .codec_of_node = I2S1 */
-               .codec_dai_name = "SFC4",
-               .params = &i2s_link_params,
-       },
-       {
-               /* 49 */
-               .name = "AFC1 RX",
-               .stream_name = "AFC1 RX",
-               /* .cpu_of_node = AHUB XBAR */
-               .cpu_dai_name = "AFC1",
-               /* .codec_of_node = I2S1 */
-               .codec_dai_name = "AFC IN",
-               .params = &i2s_link_params,
-       },
-       {
-               /* 50 */
-               .name = "AFC1 TX",
-               .stream_name = "AFC1 TX",
-               /* .cpu_of_node = AHUB XBAR */
-               .cpu_dai_name = "AFC OUT",
-               /* .codec_of_node = I2S1 */
-               .codec_dai_name = "AFC1",
-               .params = &i2s_link_params,
-       },
-       {
-               /* 51 */
-               .name = "AFC2 RX",
-               .stream_name = "AFC2 RX",
-               /* .cpu_of_node = AHUB XBAR */
-               .cpu_dai_name = "AFC2",
-               /* .codec_of_node = I2S1 */
-               .codec_dai_name = "AFC IN",
-               .params = &i2s_link_params,
-       },
-       {
-               /* 52 */
-               .name = "AFC2 TX",
-               .stream_name = "AFC2 TX",
-               /* .cpu_of_node = AHUB XBAR */
-               .cpu_dai_name = "AFC OUT",
-               /* .codec_of_node = I2S1 */
-               .codec_dai_name = "AFC2",
-               .params = &i2s_link_params,
-       },
-       {
-               /* 53 */
-               .name = "AFC3 RX",
-               .stream_name = "AFC3 RX",
-               /* .cpu_of_node = AHUB XBAR */
-               .cpu_dai_name = "AFC3",
-               /* .codec_of_node = I2S1 */
-               .codec_dai_name = "AFC IN",
-               .params = &i2s_link_params,
-       },
-       {
-               /* 54 */
-               .name = "AFC3 TX",
-               .stream_name = "AFC3 TX",
-               /* .cpu_of_node = AHUB XBAR */
-               .cpu_dai_name = "AFC OUT",
-               /* .codec_of_node = I2S1 */
-               .codec_dai_name = "AFC3",
-               .params = &i2s_link_params,
-       },
-       {
-               /* 55 */
-               .name = "AFC4 RX",
-               .stream_name = "AFC4 RX",
-               /* .cpu_of_node = AHUB XBAR */
-               .cpu_dai_name = "AFC4",
-               /* .codec_of_node = I2S1 */
-               .codec_dai_name = "AFC IN",
-               .params = &i2s_link_params,
-       },
-       {
-               /* 56 */
-               .name = "AFC4 TX",
-               .stream_name = "AFC4 TX",
-               /* .cpu_of_node = AHUB XBAR */
-               .cpu_dai_name = "AFC OUT",
-               /* .codec_of_node = I2S1 */
-               .codec_dai_name = "AFC4",
-               .params = &i2s_link_params,
-       },
-       {
-               /* 57 */
-               .name = "AFC5 RX",
-               .stream_name = "AFC5 RX",
-               /* .cpu_of_node = AHUB XBAR */
-               .cpu_dai_name = "AFC5",
-               /* .codec_of_node = I2S1 */
-               .codec_dai_name = "AFC IN",
-               .params = &i2s_link_params,
-       },
-       {
-               /* 58 */
-               .name = "AFC5 TX",
-               .stream_name = "AFC5 TX",
-               /* .cpu_of_node = AHUB XBAR */
-               .cpu_dai_name = "AFC OUT",
-               /* .codec_of_node = I2S1 */
-               .codec_dai_name = "AFC5",
-               .params = &i2s_link_params,
-       },
-       {
-               /* 59 */
-               .name = "AFC6 RX",
-               .stream_name = "AFC6 RX",
-               /* .cpu_of_node = AHUB XBAR */
-               .cpu_dai_name = "AFC6",
-               /* .codec_of_node = I2S1 */
-               .codec_dai_name = "AFC IN",
-               .params = &i2s_link_params,
-       },
-       {
-               /* 60 */
-               .name = "AFC6 TX",
-               .stream_name = "AFC6 TX",
-               /* .cpu_of_node = AHUB XBAR */
-               .cpu_dai_name = "AFC OUT",
-               /* .codec_of_node = I2S1 */
-               .codec_dai_name = "AFC6",
-               .params = &i2s_link_params,
-       },
-       {
-               /* 61 */
-               .name = "s spdif-dit",
-               .stream_name = "playback",
-               .cpu_dai_name = "DAP",
-               .codec_dai_name = "dit-hifi",
-               .init = tegra_grenada_spdif_init,
-               .params = &i2s_link_params,
-       },
-       {
-               /* 62 */
-               .name = "SPDIF1-1 CIF",
-               .stream_name = "SPDIF1-1 CIF",
-               .cpu_dai_name = "SPDIF1-1",
-               .codec_dai_name = "CIF",
-               .params = &i2s_link_params,
-       },
-       {
-               /* 63 */
-               .name = "MVC1 RX",
-               .stream_name = "MVC1 RX",
-               /* .cpu_of_node = AHUB XBAR */
-               .cpu_dai_name = "MVC1",
-               /* .codec_of_node = I2S1 */
-               .codec_dai_name = "MVC IN",
-               .params = &i2s_link_params,
-       },
-       {
-               /* 64 */
-               .name = "MVC1 TX",
-               .stream_name = "MVC1 TX",
-               /* .cpu_of_node = AHUB XBAR */
-               .cpu_dai_name = "MVC OUT",
-               /* .codec_of_node = I2S1 */
-               .codec_dai_name = "MVC1",
-               .params = &i2s_link_params,
-       },
-       {
-               /* 65 */
-               .name = "MVC2 RX",
-               .stream_name = "MVC2 RX",
-               /* .cpu_of_node = AHUB XBAR */
-               .cpu_dai_name = "MVC2",
-               /* .codec_of_node = I2S1 */
-               .codec_dai_name = "MVC IN",
-               .params = &i2s_link_params,
-       },
-       {
-               /* 66 */
-               .name = "MVC2 TX",
-               .stream_name = "AFC2 TX",
-               /* .cpu_of_node = AHUB XBAR */
-               .cpu_dai_name = "MVC OUT",
-               /* .codec_of_node = I2S1 */
-               .codec_dai_name = "MVC2",
-               .params = &i2s_link_params,
-       },
-       {
-               /* 67 */
-               .name = "ADMAIF1 CODEC",
-               .stream_name = "ADMAIF1 CODEC",
-               /* .cpu_of_node = AHUB ADMAIF */
-               .cpu_dai_name = "ADMAIF1 CIF",
-               /* .codec_of_node = AHUB XBAR */
-               .codec_dai_name = "ADMAIF1",
-               .params = &i2s_link_params,
-       },
-       {
-               /* 68 */
-               .name = "ADMAIF2 CODEC",
-               .stream_name = "ADMAIF2 CODEC",
-               /* .cpu_of_node = AHUB ADMAIF */
-               .cpu_dai_name = "ADMAIF2 CIF",
-               /* .codec_of_node = AHUB XBAR */
-               .codec_dai_name = "ADMAIF2",
-               .params = &i2s_link_params,
-       },
-       {
-               /* 69 */
-               .name = "ADMAIF3 CODEC",
-               .stream_name = "ADMAIF3 CODEC",
-               /* .cpu_of_node = AHUB ADMAIF */
-               .cpu_dai_name = "ADMAIF3 CIF",
-               /* .codec_of_node = AHUB XBAR */
-               .codec_dai_name = "ADMAIF3",
-               .params = &i2s_link_params,
-       },
-       {
-               /* 70 */
-               .name = "ADMAIF4 CODEC",
-               .stream_name = "ADMAIF4 CODEC",
-               /* .cpu_of_node = AHUB ADMAIF */
-               .cpu_dai_name = "ADMAIF4 CIF",
-               /* .codec_of_node = AHUB XBAR */
-               .codec_dai_name = "ADMAIF4",
-               .params = &i2s_link_params,
-       },
-       {
-               /* 71 */
-               .name = "ADMAIF5 CODEC",
-               .stream_name = "ADMAIF5 CODEC",
-               /* .cpu_of_node = AHUB ADMAIF */
-               .cpu_dai_name = "ADMAIF5 CIF",
-               /* .codec_of_node = AHUB XBAR */
-               .codec_dai_name = "ADMAIF5",
-               .params = &i2s_link_params,
-       },
-       {
-               /* 72 */
-               .name = "ADMAIF6 CODEC",
-               .stream_name = "ADMAIF6 CODEC",
-               /* .cpu_of_node = AHUB ADMAIF */
-               .cpu_dai_name = "ADMAIF6 CIF",
-               /* .codec_of_node = AHUB XBAR */
-               .codec_dai_name = "ADMAIF6",
-               .params = &i2s_link_params,
-       },
-       {
-               /* 73 */
-               .name = "ADMAIF7 CODEC",
-               .stream_name = "ADMAIF7 CODEC",
-               /* .cpu_of_node = AHUB ADMAIF */
-               .cpu_dai_name = "ADMAIF7 CIF",
-               /* .codec_of_node = AHUB XBAR */
-               .codec_dai_name = "ADMAIF7",
-               .params = &i2s_link_params,
-       },
-       {
-               /* 74 */
-               .name = "ADMAIF8 CODEC",
-               .stream_name = "ADMAIF8 CODEC",
-               /* .cpu_of_node = AHUB ADMAIF */
-               .cpu_dai_name = "ADMAIF8 CIF",
-               /* .codec_of_node = AHUB XBAR */
-               .codec_dai_name = "ADMAIF8",
-               .params = &i2s_link_params,
-       },
-       {
-               /* 75 */
-               .name = "ADMAIF9 CODEC",
-               .stream_name = "ADMAIF9 CODEC",
-               /* .cpu_of_node = AHUB ADMAIF */
-               .cpu_dai_name = "ADMAIF9 CIF",
-               /* .codec_of_node = AHUB XBAR */
-               .codec_dai_name = "ADMAIF9",
-               .params = &i2s_link_params,
-       },
-       {
-               /* 76 */
-               .name = "ADMAIF10 CODEC",
-               .stream_name = "ADMAIF10 CODEC",
-               /* .cpu_of_node = AHUB ADMAIF */
-               .cpu_dai_name = "ADMAIF10 CIF",
-               /* .codec_of_node = AHUB XBAR */
-               .codec_dai_name = "ADMAIF10",
-               .params = &i2s_link_params,
-       },
-       {
-               /* 77 */
-               .name = "ADSP ADMAIF1",
-               .stream_name = "ADSP ADMAIF1",
-               /* .cpu_of_node = ADSP */
-               .cpu_dai_name = "ADSP-ADMAIF1",
-               /* .codec_of_node = AHUB ADMAIF */
-               .codec_dai_name = "ADMAIF1 FIFO",
-               .params = &i2s_link_params,
-       },
-       {
-               /* 78 */
-               .name = "ADSP ADMAIF2",
-               .stream_name = "ADSP ADMAIF2",
-               /* .cpu_of_node = ADSP */
-               .cpu_dai_name = "ADSP-ADMAIF2",
-               /* .codec_of_node = AHUB ADMAIF */
-               .codec_dai_name = "ADMAIF2 FIFO",
-               .params = &i2s_link_params,
-       },
-       {
-               /* 79 */
-               .name = "ADSP ADMAIF3",
-               .stream_name = "ADSP ADMAIF3",
-               /* .cpu_of_node = ADSP */
-               .cpu_dai_name = "ADSP-ADMAIF3",
-               /* .codec_of_node = AHUB ADMAIF */
-               .codec_dai_name = "ADMAIF3 FIFO",
-               .params = &i2s_link_params,
-       },
-       {
-               /* 80 */
-               .name = "ADSP ADMAIF4",
-               .stream_name = "ADSP ADMAIF4",
-               /* .cpu_of_node = ADSP */
-               .cpu_dai_name = "ADSP-ADMAIF4",
-               /* .codec_of_node = AHUB ADMAIF */
-               .codec_dai_name = "ADMAIF4 FIFO",
-               .params = &i2s_link_params,
-       },
-       {
-               /* 81 */
-               .name = "ADSP ADMAIF5",
-               .stream_name = "ADSP ADMAIF5",
-               /* .cpu_of_node = ADSP */
-               .cpu_dai_name = "ADSP-ADMAIF5",
-               /* .codec_of_node = AHUB ADMAIF */
-               .codec_dai_name = "ADMAIF5 FIFO",
-               .params = &i2s_link_params,
-       },
-       {
-               /* 82 */
-               .name = "ADSP ADMAIF6",
-               .stream_name = "ADSP ADMAIF6",
-               /* .cpu_of_node = ADSP */
-               .cpu_dai_name = "ADSP-ADMAIF6",
-               /* .codec_of_node = AHUB ADMAIF */
-               .codec_dai_name = "ADMAIF6 FIFO",
-               .params = &i2s_link_params,
-       },
-       {
-               /* 83 */
-               .name = "ADSP ADMAIF7",
-               .stream_name = "ADSP ADMAIF7",
-               /* .cpu_of_node = ADSP */
-               .cpu_dai_name = "ADSP-ADMAIF7",
-               /* .codec_of_node = AHUB ADMAIF */
-               .codec_dai_name = "ADMAIF7 FIFO",
-               .params = &i2s_link_params,
-       },
-       {
-               /* 84 */
-               .name = "ADSP ADMAIF8",
-               .stream_name = "ADSP ADMAIF8",
-               /* .cpu_of_node = ADSP */
-               .cpu_dai_name = "ADSP-ADMAIF8",
-               /* .codec_of_node = AHUB ADMAIF */
-               .codec_dai_name = "ADMAIF8 FIFO",
-               .params = &i2s_link_params,
-       },
-       {
-               /* 85 */
-               .name = "ADSP ADMAIF9",
-               .stream_name = "ADSP ADMAIF9",
-               /* .cpu_of_node = ADSP */
-               .cpu_dai_name = "ADSP-ADMAIF9",
-               /* .codec_of_node = AHUB ADMAIF */
-               .codec_dai_name = "ADMAIF9 FIFO",
-               .params = &i2s_link_params,
-       },
-       {
-               /* 86 */
-               .name = "ADSP ADMAIF10",
-               .stream_name = "ADSP ADMAIF10",
-               /* .cpu_of_node = ADSP */
-               .cpu_dai_name = "ADSP-ADMAIF10",
-               /* .codec_of_node = AHUB ADMAIF */
-               .codec_dai_name = "ADMAIF10 FIFO",
-               .params = &i2s_link_params,
-       },
-       {
-               /* 87 */
-               .name = "ADSP PCM",
-               .stream_name = "ADSP PCM",
-               /* .cpu_of_node = ADSP */
-               .cpu_dai_name = "ADSP PCM",
-               /* .codec_of_node = ADSP */
-               .codec_dai_name = "ADSP-FE1",
-               .ops = &tegra_grenada_ops,
-       },
-       {
-               /* 88 */
-               .name = "ADSP COMPR1",
-               .stream_name = "ADSP COMPR1",
-               /* .cpu_of_node = ADSP */
-               .cpu_dai_name = "ADSP COMPR1",
-               /* .codec_of_node = ADSP */
-               .codec_dai_name = "ADSP-FE2",
-               .ops = &tegra_grenada_ops,
-       },
-       {
-               /* 89 */
-               .name = "ADSP COMPR2",
-               .stream_name = "ADSP COMPR2",
-               /* .cpu_of_node = ADSP */
-               .cpu_dai_name = "ADSP COMPR2",
-               /* .codec_of_node = ADSP */
-               .codec_dai_name = "ADSP-FE3",
-               .ops = &tegra_grenada_ops,
-       },
-       {
-               /* 90 */
-               .name = "dmic-x spdif-dit",
-               .stream_name = "Playback",
-               /* .cpu_of_node = DMIC1 */
-               .cpu_dai_name = "DAP",
-               /* .codec_of_node = SPDIF dummy */
-               .codec_dai_name = "dit-hifi",
-               .params = &i2s_link_params,
-       },
-       {
-               /* 91 */
-               .name = "DMIC1 CIF",
-               .stream_name = "DMIC1 CIF",
-               /* .cpu_of_node = AHUB XBAR */
-               .cpu_dai_name = "DMIC1",
-               /* .codec_of_node = DMIC1 */
-               .codec_dai_name = "CIF",
-               .params = &i2s_link_params,
-       },
-       {
-               /* 92 */
-               .name = "dmic-y spdif-dit",
-               .stream_name = "Playback",
-               /* .cpu_of_node = DMIC2 */
-               .cpu_dai_name = "DAP",
-               /* .codec_of_node = SPDIF dummy */
-               .codec_dai_name = "dit-hifi",
-               .params = &i2s_link_params,
-       },
-       {
-               /* 93 */
-               .name = "DMIC2 CIF",
-               .stream_name = "DMIC2 CIF",
-               /* .cpu_of_node = AHUB XBAR */
-               .cpu_dai_name = "DMIC2",
-               /* .codec_of_node = DMIC2 */
-               .codec_dai_name = "CIF",
-               .params = &i2s_link_params,
-       },
-       {
-               /* 94 */
-               .name = "dmic-z spdif-dit",
-               .stream_name = "Playback",
-               /* .cpu_of_node = DMIC3 */
-               .cpu_dai_name = "DAP",
-               /* .codec_of_node = SPDIF dummy */
-               .codec_dai_name = "dit-hifi",
-               .params = &i2s_link_params,
-       },
-       {
-               /* 95 */
-               .name = "DMIC3 CIF",
-               .stream_name = "DMIC3 CIF",
-               /* .cpu_of_node = AHUB XBAR */
-               .cpu_dai_name = "DMIC3",
-               /* .codec_of_node = DMIC3 */
-               .codec_dai_name = "CIF",
-               .params = &i2s_link_params,
-       },
-};
-
-static struct snd_soc_codec_conf ad193x_codec_conf[] = {
-       {
-               .dev_name = "spdif-dit.0",
-               .name_prefix = "x",
-       },
-       {
-               .dev_name = "spdif-dit.1",
-               .name_prefix = "y",
-       },
-       {
-               .dev_name = "spdif-dit.2",
-               .name_prefix = "z",
-       },
-       {
-               .dev_name = "spdif-dit.3",
-               .name_prefix = "s",
-       },
-       {
-               .dev_name = "tegra210-i2s.0",
-               .name_prefix = "I2S1",
-       },
-       {
-               .dev_name = "tegra210-i2s.1",
-               .name_prefix = "I2S2",
-       },
-       {
-               .dev_name = "tegra210-i2s.4",
-               .name_prefix = "I2S5",
-       },
-       {
-               .dev_name = "tegra210-sfc.0",
-               .name_prefix = "SFC1",
-       },
-       {
-               .dev_name = "tegra210-sfc.1",
-               .name_prefix = "SFC2",
-       },
-       {
-               .dev_name = "tegra210-sfc.2",
-               .name_prefix = "SFC3",
-       },
-       {
-               .dev_name = "tegra210-sfc.3",
-               .name_prefix = "SFC4",
-       },
-       {
-               .dev_name = "tegra210-afc.0",
-               .name_prefix = "AFC1",
-       },
-       {
-               .dev_name = "tegra210-afc.1",
-               .name_prefix = "AFC2",
-       },
-       {
-               .dev_name = "tegra210-afc.2",
-               .name_prefix = "AFC3",
-       },
-       {
-               .dev_name = "tegra210-afc.3",
-               .name_prefix = "AFC4",
-       },
-       {
-               .dev_name = "tegra210-afc.4",
-               .name_prefix = "AFC5",
-       },
-       {
-               .dev_name = "tegra210-afc.5",
-               .name_prefix = "AFC6",
-       },
-       {
-               .dev_name = "tegra210-mvc.0",
-               .name_prefix = "MVC1",
-       },
-       {
-               .dev_name = "tegra210-mvc.1",
-               .name_prefix = "MVC2",
-       },
-};
-
 static struct snd_soc_card snd_soc_tegra_grenada = {
        .name = "tegra-grenada",
        .owner = THIS_MODULE,
-       .dai_link = tegra_grenada_links,
-       .num_links = ARRAY_SIZE(tegra_grenada_links),
        .remove = tegra_grenada_remove,
        .dapm_widgets = tegra_grenada_dapm_widgets,
        .num_dapm_widgets = ARRAY_SIZE(tegra_grenada_dapm_widgets),
-       .codec_conf = ad193x_codec_conf,
-       .num_configs = ARRAY_SIZE(ad193x_codec_conf),
        .fully_routed = true,
 };
 
@@ -1321,7 +295,11 @@ static int tegra_grenada_driver_probe(struct platform_device *pdev)
        struct device_node *np = pdev->dev.of_node;
        struct snd_soc_card *card = &snd_soc_tegra_grenada;
        struct tegra_grenada *machine;
-       int ret, i;
+       struct snd_soc_dai_link *tegra_machine_dai_links = NULL;
+       struct snd_soc_dai_link *tegra_grenada_codec_links = NULL;
+       struct snd_soc_codec_conf *tegra_machine_codec_conf = NULL;
+       struct snd_soc_codec_conf *tegra_grenada_codec_conf = NULL;
+       int ret = 0, i;
 
        machine = devm_kzalloc(&pdev->dev, sizeof(struct tegra_grenada),
                               GFP_KERNEL);
@@ -1340,417 +318,93 @@ static int tegra_grenada_driver_probe(struct platform_device *pdev)
                if (ret)
                        goto err;
 
-               /* APBIF dai links */
-               tegra_grenada_links[0].cpu_of_node = of_parse_phandle(np,
-                                       "nvidia,admaif", 0);
-               if (!tegra_grenada_links[0].cpu_of_node) {
-                       dev_err(&pdev->dev,
-                               "Property 'nvidia,admaif' missing or invalid\n");
-                       ret = -EINVAL;
-                       goto err;
-               }
-
-               tegra_grenada_links[0].platform_of_node =
-                               tegra_grenada_links[0].cpu_of_node;
-
-               tegra_grenada_links[0].codec_of_node = of_parse_phandle(np,
-                                       "nvidia,xbar", 0);
-               if (!tegra_grenada_links[0].codec_of_node) {
-                       dev_err(&pdev->dev,
-                               "Property 'nvidia,xbar' missing or invalid\n");
-                       ret = -EINVAL;
-                       goto err;
-               }
-
                ret = snd_soc_of_parse_audio_routing(card,
                                        "nvidia,audio-routing");
                if (ret)
                        goto err;
+       }
 
-               for (i = 1; i < 10; i++) {
-                       tegra_grenada_links[i].cpu_of_node =
-                               tegra_grenada_links[0].cpu_of_node;
-                       tegra_grenada_links[i].codec_of_node =
-                                       tegra_grenada_links[0].codec_of_node;
-                       tegra_grenada_links[i].platform_of_node =
-                                       tegra_grenada_links[0].cpu_of_node;
-               }
-
-               /* audio codec DAI */
-               tegra_grenada_links[10].codec_of_node = of_parse_phandle(np,
-                                       "nvidia,audio-codec-x", 0);
-               if (!tegra_grenada_links[10].codec_of_node) {
-                       dev_err(&pdev->dev,
-                               "Property 'nvidia,audio-codec-x' missing or invalid\n");
-                       ret = -EINVAL;
-                       goto err;
-               }
-               tegra_grenada_links[12].codec_of_node = of_parse_phandle(np,
-                                       "nvidia,audio-codec-y", 0);
-               if (!tegra_grenada_links[12].codec_of_node) {
-                       dev_err(&pdev->dev,
-                               "Property 'nvidia,audio-codec-y' missing or invalid\n");
-                       ret = -EINVAL;
-                       goto err;
-               }
-               tegra_grenada_links[14].codec_of_node = of_parse_phandle(np,
-                                       "nvidia,audio-codec-z", 0);
-               if (!tegra_grenada_links[14].codec_of_node) {
-                       dev_err(&pdev->dev,
-                               "Property 'nvidia,audio-codec-z' missing or invalid\n");
-                       ret = -EINVAL;
-                       goto err;
-               }
-
-               /* I2S dai links */
-               tegra_grenada_links[10].cpu_of_node = of_parse_phandle(np,
-                                       "nvidia,i2s-controller-1", 0);
-               if (!tegra_grenada_links[10].cpu_of_node) {
-                       dev_err(&pdev->dev,
-                               "Property 'nvidia,i2s-controller-1' missing or invalid\n");
-                       ret = -EINVAL;
-                       goto err;
-               }
-
-               tegra_grenada_links[11].codec_of_node =
-                                       tegra_grenada_links[10].cpu_of_node;
-               tegra_grenada_links[11].cpu_of_node = tegra_grenada_links[0].codec_of_node;
-
-               tegra_grenada_links[12].cpu_of_node = of_parse_phandle(np,
-                                       "nvidia,i2s-controller-2", 0);
-               if (!tegra_grenada_links[12].cpu_of_node) {
-                       dev_err(&pdev->dev,
-                               "Property 'nvidia,i2s-controller-2' missing or invalid\n");
-                       ret = -EINVAL;
-                       goto err;
-               }
-
-               tegra_grenada_links[13].codec_of_node =
-                                       tegra_grenada_links[12].cpu_of_node;
-               tegra_grenada_links[13].cpu_of_node = tegra_grenada_links[0].codec_of_node;
-
-               tegra_grenada_links[14].cpu_of_node = of_parse_phandle(np,
-                                       "nvidia,i2s-controller-3", 0);
-               if (!tegra_grenada_links[14].cpu_of_node) {
-                       dev_err(&pdev->dev,
-                               "Property 'nvidia,i2s-controller-3' missing or invalid\n");
-                       ret = -EINVAL;
-                       goto err;
-               }
-
-               /* AMX dai links */
-               tegra_grenada_links[15].codec_of_node =
-                                       tegra_grenada_links[14].cpu_of_node;
-               tegra_grenada_links[15].cpu_of_node = tegra_grenada_links[0].codec_of_node;
-
-               tegra_grenada_links[20].cpu_of_node = of_parse_phandle(np,
-                                       "nvidia,amx-1", 0);
-               if (!tegra_grenada_links[20].cpu_of_node) {
-                       dev_err(&pdev->dev,
-                               "Property 'nvidia,amx-1' missing or invalid\n");
-                       ret = -EINVAL;
-                       goto err;
-               }
-               tegra_grenada_links[20].codec_of_node = tegra_grenada_links[0].codec_of_node;
-
-               /* ADX dai links */
-               tegra_grenada_links[21].codec_of_node = of_parse_phandle(np,
-                                       "nvidia,adx-1", 0);
-               if (!tegra_grenada_links[21].codec_of_node) {
-                       dev_err(&pdev->dev,
-                               "Property 'nvidia,adx-1' missing or invalid\n");
-                       ret = -EINVAL;
-                       goto err;
-               }
-               tegra_grenada_links[21].cpu_of_node = tegra_grenada_links[0].codec_of_node;
-
-
-               for (i = 16; i < 20; i++) {
-                       tegra_grenada_links[i].codec_of_node = tegra_grenada_links[20].cpu_of_node;
-                       tegra_grenada_links[i].cpu_of_node = tegra_grenada_links[20].codec_of_node;
-               }
-
-               for (i = 22; i < 26; i++) {
-                       tegra_grenada_links[i].codec_of_node = tegra_grenada_links[21].cpu_of_node;
-                       tegra_grenada_links[i].cpu_of_node = tegra_grenada_links[21].codec_of_node;
-               }
-
-               /* MIXER dai links */
-               tegra_grenada_links[36].cpu_of_node = of_parse_phandle(np,
-                                       "nvidia,mixer-1", 0);
-               if (!tegra_grenada_links[36].cpu_of_node) {
-                       dev_err(&pdev->dev,
-                               "Property 'nvidia,mixer-1' missing or invalid\n");
-                       ret = -EINVAL;
-                       goto err;
-               }
-               tegra_grenada_links[36].codec_of_node = tegra_grenada_links[0].codec_of_node;
-               for (i = 37; i < 41; i++) {
-                       tegra_grenada_links[i].cpu_of_node = tegra_grenada_links[36].cpu_of_node;
-                       tegra_grenada_links[i].codec_of_node = tegra_grenada_links[36].codec_of_node;
-               }
-
-               for (i = 26; i < 36; i++) {
-                       tegra_grenada_links[i].codec_of_node = tegra_grenada_links[36].cpu_of_node;
-                       tegra_grenada_links[i].cpu_of_node = tegra_grenada_links[36].codec_of_node;
-               }
-
-               /* SFC dai links */
-               tegra_grenada_links[42].cpu_of_node = of_parse_phandle(np,
-                                       "nvidia,sfc-1", 0);
-               if (!tegra_grenada_links[42].cpu_of_node) {
-                       dev_err(&pdev->dev,
-                               "Property 'nvidia,sfc-1' missing or invalid\n");
-                       ret = -EINVAL;
-                       goto err;
-               }
-               tegra_grenada_links[42].codec_of_node = tegra_grenada_links[0].codec_of_node;
-
-               tegra_grenada_links[44].cpu_of_node = of_parse_phandle(np,
-                                       "nvidia,sfc-2", 0);
-               if (!tegra_grenada_links[44].cpu_of_node) {
-                       dev_err(&pdev->dev,
-                               "Property 'nvidia,sfc-2' missing or invalid\n");
-                       ret = -EINVAL;
-                       goto err;
-               }
-               tegra_grenada_links[44].codec_of_node = tegra_grenada_links[0].codec_of_node;
-
-               tegra_grenada_links[46].cpu_of_node = of_parse_phandle(np,
-                                       "nvidia,sfc-3", 0);
-               if (!tegra_grenada_links[46].cpu_of_node) {
-                       dev_err(&pdev->dev,
-                               "Property 'nvidia,sfc-3' missing or invalid\n");
-                       ret = -EINVAL;
-                       goto err;
-               }
-               tegra_grenada_links[46].codec_of_node = tegra_grenada_links[0].codec_of_node;
-
-               tegra_grenada_links[48].cpu_of_node = of_parse_phandle(np,
-                                       "nvidia,sfc-4", 0);
-               if (!tegra_grenada_links[48].cpu_of_node) {
-                       dev_err(&pdev->dev,
-                               "Property 'nvidia,sfc-4' missing or invalid\n");
-                       ret = -EINVAL;
-                       goto err;
-               }
-               tegra_grenada_links[48].codec_of_node = tegra_grenada_links[0].codec_of_node;
-
-               for (i = 41; i < 48; i = i+2) {
-                       tegra_grenada_links[i].codec_of_node = tegra_grenada_links[i+1].cpu_of_node;
-                       tegra_grenada_links[i].cpu_of_node = tegra_grenada_links[i+1].codec_of_node;
-               }
-
-               /* AFC dai links */
-               tegra_grenada_links[50].cpu_of_node = of_parse_phandle(np,
-                                       "nvidia,afc-1", 0);
-               if (!tegra_grenada_links[50].cpu_of_node) {
-                       dev_err(&pdev->dev,
-                               "Property 'nvidia,afc-1' missing or invalid\n");
-                       ret = -EINVAL;
-                       goto err;
-               }
-               tegra_grenada_links[50].codec_of_node = tegra_grenada_links[0].codec_of_node;
-
-               tegra_grenada_links[52].cpu_of_node = of_parse_phandle(np,
-                                       "nvidia,afc-2", 0);
-               if (!tegra_grenada_links[52].cpu_of_node) {
-                       dev_err(&pdev->dev,
-                               "Property 'nvidia,afc-2' missing or invalid\n");
-                       ret = -EINVAL;
-                       goto err;
-               }
-               tegra_grenada_links[52].codec_of_node = tegra_grenada_links[0].codec_of_node;
-
-               tegra_grenada_links[54].cpu_of_node = of_parse_phandle(np,
-                                       "nvidia,afc-3", 0);
-               if (!tegra_grenada_links[54].cpu_of_node) {
-                       dev_err(&pdev->dev,
-                               "Property 'nvidia,afc-3' missing or invalid\n");
-                       ret = -EINVAL;
-                       goto err;
-               }
-               tegra_grenada_links[54].codec_of_node = tegra_grenada_links[0].codec_of_node;
-
-               tegra_grenada_links[56].cpu_of_node = of_parse_phandle(np,
-                                       "nvidia,afc-4", 0);
-               if (!tegra_grenada_links[56].cpu_of_node) {
-                       dev_err(&pdev->dev,
-                               "Property 'nvidia,afc-4' missing or invalid\n");
-                       ret = -EINVAL;
-                       goto err;
-               }
-               tegra_grenada_links[56].codec_of_node = tegra_grenada_links[0].codec_of_node;
-
-               tegra_grenada_links[58].cpu_of_node = of_parse_phandle(np,
-                                       "nvidia,afc-5", 0);
-               if (!tegra_grenada_links[58].cpu_of_node) {
-                       dev_err(&pdev->dev,
-                               "Property 'nvidia,afc-5' missing or invalid\n");
-                       ret = -EINVAL;
-                       goto err;
-               }
-               tegra_grenada_links[58].codec_of_node = tegra_grenada_links[0].codec_of_node;
-
-               tegra_grenada_links[60].cpu_of_node = of_parse_phandle(np,
-                                       "nvidia,afc-6", 0);
-               if (!tegra_grenada_links[60].cpu_of_node) {
-                       dev_err(&pdev->dev,
-                               "Property 'nvidia,afc-6' missing or invalid\n");
-                       ret = -EINVAL;
-                       goto err;
-               }
-               tegra_grenada_links[60].codec_of_node = tegra_grenada_links[0].codec_of_node;
-
-               for (i = 49; i < 60; i = i+2) {
-                       tegra_grenada_links[i].codec_of_node = tegra_grenada_links[i+1].cpu_of_node;
-                       tegra_grenada_links[i].cpu_of_node = tegra_grenada_links[i+1].codec_of_node;
-               }
-
-               /* SPDIF dai links */
-               tegra_grenada_links[61].codec_of_node = of_parse_phandle(np,
-                                       "nvidia,audio-codec-s", 0);
-               if (!tegra_grenada_links[61].codec_of_node) {
-                       dev_err(&pdev->dev,
-                               "Property 'nvidia,audio-codec-s' missing or invalid\n");
-                       ret = -EINVAL;
-                       goto err;
-               }
-
-               tegra_grenada_links[61].cpu_of_node = of_parse_phandle(np,
-                                       "nvidia,spdif", 0);
-               if (!tegra_grenada_links[61].cpu_of_node) {
-                       dev_err(&pdev->dev,
-                               "Property 'nvidia,spdif' missing or invalid\n");
-                       ret = -EINVAL;
-                       goto err;
-               }
-               tegra_grenada_links[62].codec_of_node =
-                                       tegra_grenada_links[61].cpu_of_node;
-               tegra_grenada_links[62].cpu_of_node = tegra_grenada_links[0].codec_of_node;
-
-               /* MVC dai links */
-               tegra_grenada_links[64].cpu_of_node = of_parse_phandle(np,
-                                       "nvidia,mvc-1", 0);
-               if (!tegra_grenada_links[64].cpu_of_node) {
-                       dev_err(&pdev->dev,
-                               "Property 'nvidia,mvc-1' missing or invalid\n");
-                       ret = -EINVAL;
-                       goto err;
-               }
-               tegra_grenada_links[64].codec_of_node = tegra_grenada_links[0].codec_of_node;
-
-               tegra_grenada_links[66].cpu_of_node = of_parse_phandle(np,
-                                       "nvidia,mvc-2", 0);
-               if (!tegra_grenada_links[66].cpu_of_node) {
-                       dev_err(&pdev->dev,
-                               "Property 'nvidia,mvc-2' missing or invalid\n");
-                       ret = -EINVAL;
-                       goto err;
-               }
-               tegra_grenada_links[66].codec_of_node = tegra_grenada_links[0].codec_of_node;
-
-               for (i = 63; i < 66; i = i+2) {
-                       tegra_grenada_links[i].codec_of_node = tegra_grenada_links[i+1].cpu_of_node;
-                       tegra_grenada_links[i].cpu_of_node = tegra_grenada_links[i+1].codec_of_node;
-               }
-
-               /* ADMAIF Codec dai links */
-               for (i = 67; i < 77; i++) {
-                       tegra_grenada_links[i].cpu_of_node =
-                               tegra_grenada_links[0].cpu_of_node;
-                       tegra_grenada_links[i].codec_of_node =
-                               tegra_grenada_links[0].codec_of_node;
-               }
-
-               /* ADSP-ADMAIF dai links */
-               tegra_grenada_links[77].cpu_of_node = of_parse_phandle(np,
-                                       "nvidia,adsp", 0);
-               if (!tegra_grenada_links[77].cpu_of_node) {
-                       dev_err(&pdev->dev,
-                               "Property 'nvidia,adsp' missing or invalid\n");
-                       ret = -EINVAL;
-                       goto err;
-               }
-               tegra_grenada_links[77].codec_of_node =
-                       tegra_grenada_links[67].cpu_of_node;
-
-               for (i = 78; i < 87; i++) {
-                       tegra_grenada_links[i].cpu_of_node =
-                               tegra_grenada_links[77].cpu_of_node;
-                       tegra_grenada_links[i].codec_of_node =
-                               tegra_grenada_links[77].codec_of_node;
-               }
-
-               /* ADSP CPU Dai links*/
-               for (i = 87; i < 90; i++) {
-                       tegra_grenada_links[i].cpu_of_node =
-                               tegra_grenada_links[77].cpu_of_node;
-                       tegra_grenada_links[i].codec_of_node =
-                               tegra_grenada_links[i].cpu_of_node;
-                       tegra_grenada_links[i].platform_of_node =
-                               tegra_grenada_links[i].cpu_of_node;
-               }
-
-               /* DMIC dai links */
-               tegra_grenada_links[90].codec_of_node = tegra_grenada_links[10].codec_of_node;
-               tegra_grenada_links[90].cpu_of_node = of_parse_phandle(np,
-                                       "nvidia,dmic-1", 0);
-               if (!tegra_grenada_links[90].cpu_of_node) {
-                       dev_err(&pdev->dev,
-                               "Property 'nvidia,dmic-1' missing or invalid\n");
-                       ret = -EINVAL;
-                       goto err;
-               }
-               tegra_grenada_links[91].cpu_of_node = tegra_grenada_links[0].codec_of_node;
-               tegra_grenada_links[91].codec_of_node = tegra_grenada_links[90].cpu_of_node;
-
-               tegra_grenada_links[92].codec_of_node = tegra_grenada_links[12].codec_of_node;
-               tegra_grenada_links[92].cpu_of_node = of_parse_phandle(np,
-                                       "nvidia,dmic-2", 0);
-               if (!tegra_grenada_links[92].cpu_of_node) {
-                       dev_err(&pdev->dev,
-                               "Property 'nvidia,dmic-2' missing or invalid\n");
-                       ret = -EINVAL;
-                       goto err;
-               }
-               tegra_grenada_links[93].cpu_of_node = tegra_grenada_links[0].codec_of_node;
-               tegra_grenada_links[93].codec_of_node = tegra_grenada_links[92].cpu_of_node;
-
-               tegra_grenada_links[94].codec_of_node = tegra_grenada_links[14].codec_of_node;
-               tegra_grenada_links[94].cpu_of_node = of_parse_phandle(np,
-                                       "nvidia,dmic-3", 0);
-               if (!tegra_grenada_links[94].cpu_of_node) {
-                       dev_err(&pdev->dev,
-                               "Property 'nvidia,dmic-3' missing or invalid\n");
-                       ret = -EINVAL;
-                       goto err;
-               }
-               tegra_grenada_links[95].cpu_of_node = tegra_grenada_links[0].codec_of_node;
-               tegra_grenada_links[95].codec_of_node = tegra_grenada_links[94].cpu_of_node;
+       /* set new codec links and conf */
+       tegra_grenada_codec_links = tegra_machine_new_codec_links(pdev,
+               tegra_grenada_codec_links,
+               &machine->num_codec_links);
+       if (!tegra_grenada_codec_links)
+               goto err_alloc_dai_link;
+
+       tegra_grenada_codec_conf = tegra_machine_new_codec_conf(pdev,
+               tegra_grenada_codec_conf,
+               &machine->num_codec_links);
+       if (!tegra_grenada_codec_conf)
+               goto err_alloc_dai_link;
+
+       /* get the xbar dai link/codec conf structure */
+       tegra_machine_dai_links = tegra_machine_get_dai_link();
+       if (!tegra_machine_dai_links)
+               goto err_alloc_dai_link;
+       tegra_machine_codec_conf = tegra_machine_get_codec_conf();
+       if (!tegra_machine_codec_conf)
+               goto err_alloc_dai_link;
+
+       tegra_grenada_codec_links[1].init = tegra_grenada_init;
+
+       /* set ADMAIF dai_ops */
+       for (i = TEGRA210_DAI_LINK_ADMAIF1;
+               i <= TEGRA210_DAI_LINK_ADMAIF10; i++)
+               tegra_machine_set_dai_ops(i, &tegra_grenada_ops);
+
+       /* set AMX/ADX dai_init */
+       tegra_machine_set_dai_init(TEGRA210_DAI_LINK_AMX1,
+               &tegra_grenada_amx1_dai_init);
+       tegra_machine_set_dai_init(TEGRA210_DAI_LINK_ADX1,
+               &tegra_grenada_adx1_dai_init);
+       tegra_machine_set_dai_init(TEGRA210_DAI_LINK_AMX2,
+               &tegra_grenada_amx2_dai_init);
+       tegra_machine_set_dai_init(TEGRA210_DAI_LINK_ADX2,
+               &tegra_grenada_adx2_dai_init);
+
+       /* set sfc dai_init */
+       tegra_machine_set_dai_init(TEGRA210_DAI_LINK_SFC1_RX,
+               &tegra_grenada_sfc_init);
+
+       /* set ADSP PCM/COMPR */
+       for (i = TEGRA210_DAI_LINK_ADSP_PCM;
+               i <= TEGRA210_DAI_LINK_ADSP_COMPR2; i++) {
+               tegra_machine_set_dai_ops(i,
+                       &tegra_grenada_ops);
        }
 
-#ifndef CONFIG_MACH_GRENADA
-       ret = tegra_alt_asoc_utils_init(&machine->audio_clock,
-                                       &pdev->dev,
-                                       card);
-       if (ret)
-               goto err;
-#endif
+       /* append grenada specific dai_links */
+       card->num_links =
+               tegra_machine_append_dai_link(tegra_grenada_codec_links,
+                       2 * machine->num_codec_links);
+       tegra_machine_dai_links = tegra_machine_get_dai_link();
+       card->dai_link = tegra_machine_dai_links;
+
+       /* append grenada specific codec_conf */
+       card->num_configs =
+               tegra_machine_append_codec_conf(tegra_grenada_codec_conf,
+                       machine->num_codec_links);
+       tegra_machine_codec_conf = tegra_machine_get_codec_conf();
+       card->codec_conf = tegra_machine_codec_conf;
 
        ret = snd_soc_register_card(card);
        if (ret) {
                dev_err(&pdev->dev, "snd_soc_register_card failed (%d)\n",
                        ret);
-               goto err_fini_utils;
+               goto err_alloc_dai_link;
        }
 
+       /* release new codec_links and codec_conf */
+       tegra_machine_remove_new_codec_links(tegra_grenada_codec_links);
+       tegra_machine_remove_new_codec_conf(tegra_grenada_codec_conf);
+
        return 0;
 
-err_fini_utils:
-#ifndef CONFIG_MACH_GRENADA
-       tegra_alt_asoc_utils_fini(&machine->audio_clock);
-#endif
+err_alloc_dai_link:
+       tegra_machine_remove_codec_conf();
+       tegra_machine_remove_dai_link();
+       tegra_machine_remove_new_codec_links(tegra_grenada_codec_links);
+       tegra_machine_remove_new_codec_conf(tegra_grenada_codec_conf);
 err:
        return ret;
 }
@@ -1758,8 +412,13 @@ err:
 static int tegra_grenada_driver_remove(struct platform_device *pdev)
 {
        struct snd_soc_card *card = platform_get_drvdata(pdev);
+       struct tegra_grenada *machine = snd_soc_card_get_drvdata(card);
 
        snd_soc_unregister_card(card);
+
+       tegra_machine_remove_extra_mem_alloc(machine->num_codec_links);
+       tegra_machine_remove_dai_link();
+       tegra_machine_remove_codec_conf();
 #ifndef CONFIG_MACH_GRENADA
        tegra_alt_asoc_utils_fini(&machine->audio_clock);
 #endif