* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
+#include <linux/module.h>
#include <linux/of.h>
#include <sound/soc.h>
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,
.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] = {
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
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);
if (!tegra_asoc_machine_links) {
if (link) {
tegra_asoc_machine_links = link;
+ num_dai_links = size2;
return size2;
} else {
return 0;
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;
}
}
}
}
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(¶ms->formats, str)) {
+ dev_err(&pdev->dev,
+ "Wrong codec format\n");
+ goto err;
+ }
+
+ if (of_property_read_u32(subnp,
+ "srate", ¶ms->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", ¶ms->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>");
/*
- * 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,
{
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;
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) {
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
/* 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();
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,
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,
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;
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,
};
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);
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;
}
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