162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0
262306a36Sopenharmony_ci// Copyright (c) 2011-2017, The Linux Foundation. All rights reserved.
362306a36Sopenharmony_ci// Copyright (c) 2018, Linaro Limited
462306a36Sopenharmony_ci
562306a36Sopenharmony_ci#include <linux/init.h>
662306a36Sopenharmony_ci#include <linux/err.h>
762306a36Sopenharmony_ci#include <linux/module.h>
862306a36Sopenharmony_ci#include <linux/platform_device.h>
962306a36Sopenharmony_ci#include <linux/of_platform.h>
1062306a36Sopenharmony_ci#include <linux/bitops.h>
1162306a36Sopenharmony_ci#include <linux/mutex.h>
1262306a36Sopenharmony_ci#include <linux/of_device.h>
1362306a36Sopenharmony_ci#include <linux/slab.h>
1462306a36Sopenharmony_ci#include <sound/core.h>
1562306a36Sopenharmony_ci#include <sound/soc.h>
1662306a36Sopenharmony_ci#include <sound/soc-dapm.h>
1762306a36Sopenharmony_ci#include <sound/pcm.h>
1862306a36Sopenharmony_ci#include <sound/control.h>
1962306a36Sopenharmony_ci#include <sound/asound.h>
2062306a36Sopenharmony_ci#include <sound/pcm_params.h>
2162306a36Sopenharmony_ci#include "q6afe.h"
2262306a36Sopenharmony_ci#include "q6asm.h"
2362306a36Sopenharmony_ci#include "q6adm.h"
2462306a36Sopenharmony_ci#include "q6routing.h"
2562306a36Sopenharmony_ci
2662306a36Sopenharmony_ci#define DRV_NAME "q6routing-component"
2762306a36Sopenharmony_ci
2862306a36Sopenharmony_ci#define Q6ROUTING_RX_MIXERS(id)						\
2962306a36Sopenharmony_ci	SOC_SINGLE_EXT("MultiMedia1", id,				\
3062306a36Sopenharmony_ci	MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer,\
3162306a36Sopenharmony_ci	msm_routing_put_audio_mixer),					\
3262306a36Sopenharmony_ci	SOC_SINGLE_EXT("MultiMedia2", id,				\
3362306a36Sopenharmony_ci	MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer,\
3462306a36Sopenharmony_ci	msm_routing_put_audio_mixer),					\
3562306a36Sopenharmony_ci	SOC_SINGLE_EXT("MultiMedia3", id,				\
3662306a36Sopenharmony_ci	MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer,\
3762306a36Sopenharmony_ci	msm_routing_put_audio_mixer),					\
3862306a36Sopenharmony_ci	SOC_SINGLE_EXT("MultiMedia4", id,				\
3962306a36Sopenharmony_ci	MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer,\
4062306a36Sopenharmony_ci	msm_routing_put_audio_mixer),					\
4162306a36Sopenharmony_ci	SOC_SINGLE_EXT("MultiMedia5", id,				\
4262306a36Sopenharmony_ci	MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer,\
4362306a36Sopenharmony_ci	msm_routing_put_audio_mixer),					\
4462306a36Sopenharmony_ci	SOC_SINGLE_EXT("MultiMedia6", id,				\
4562306a36Sopenharmony_ci	MSM_FRONTEND_DAI_MULTIMEDIA6, 1, 0, msm_routing_get_audio_mixer,\
4662306a36Sopenharmony_ci	msm_routing_put_audio_mixer),					\
4762306a36Sopenharmony_ci	SOC_SINGLE_EXT("MultiMedia7", id,				\
4862306a36Sopenharmony_ci	MSM_FRONTEND_DAI_MULTIMEDIA7, 1, 0, msm_routing_get_audio_mixer,\
4962306a36Sopenharmony_ci	msm_routing_put_audio_mixer),					\
5062306a36Sopenharmony_ci	SOC_SINGLE_EXT("MultiMedia8", id,				\
5162306a36Sopenharmony_ci	MSM_FRONTEND_DAI_MULTIMEDIA8, 1, 0, msm_routing_get_audio_mixer,\
5262306a36Sopenharmony_ci	msm_routing_put_audio_mixer),
5362306a36Sopenharmony_ci
5462306a36Sopenharmony_ci#define Q6ROUTING_RX_DAPM_ROUTE(mix_name, s)	\
5562306a36Sopenharmony_ci	{ mix_name, "MultiMedia1", "MM_DL1" },	\
5662306a36Sopenharmony_ci	{ mix_name, "MultiMedia2", "MM_DL2" },	\
5762306a36Sopenharmony_ci	{ mix_name, "MultiMedia3", "MM_DL3" },	\
5862306a36Sopenharmony_ci	{ mix_name, "MultiMedia4", "MM_DL4" },	\
5962306a36Sopenharmony_ci	{ mix_name, "MultiMedia5", "MM_DL5" },	\
6062306a36Sopenharmony_ci	{ mix_name, "MultiMedia6", "MM_DL6" },	\
6162306a36Sopenharmony_ci	{ mix_name, "MultiMedia7", "MM_DL7" },	\
6262306a36Sopenharmony_ci	{ mix_name, "MultiMedia8", "MM_DL8" },	\
6362306a36Sopenharmony_ci	{ s, NULL, mix_name }
6462306a36Sopenharmony_ci
6562306a36Sopenharmony_ci#define Q6ROUTING_TX_DAPM_ROUTE(mix_name)		\
6662306a36Sopenharmony_ci	{ mix_name, "PRI_MI2S_TX", "PRI_MI2S_TX" },	\
6762306a36Sopenharmony_ci	{ mix_name, "SEC_MI2S_TX", "SEC_MI2S_TX" },	\
6862306a36Sopenharmony_ci	{ mix_name, "QUAT_MI2S_TX", "QUAT_MI2S_TX" },	\
6962306a36Sopenharmony_ci	{ mix_name, "QUIN_MI2S_TX", "QUIN_MI2S_TX" },	\
7062306a36Sopenharmony_ci	{ mix_name, "TERT_MI2S_TX", "TERT_MI2S_TX" },		\
7162306a36Sopenharmony_ci	{ mix_name, "SLIMBUS_0_TX", "SLIMBUS_0_TX" },		\
7262306a36Sopenharmony_ci	{ mix_name, "SLIMBUS_1_TX", "SLIMBUS_1_TX" },		\
7362306a36Sopenharmony_ci	{ mix_name, "SLIMBUS_2_TX", "SLIMBUS_2_TX" },		\
7462306a36Sopenharmony_ci	{ mix_name, "SLIMBUS_3_TX", "SLIMBUS_3_TX" },		\
7562306a36Sopenharmony_ci	{ mix_name, "SLIMBUS_4_TX", "SLIMBUS_4_TX" },		\
7662306a36Sopenharmony_ci	{ mix_name, "SLIMBUS_5_TX", "SLIMBUS_5_TX" },		\
7762306a36Sopenharmony_ci	{ mix_name, "SLIMBUS_6_TX", "SLIMBUS_6_TX" },		\
7862306a36Sopenharmony_ci	{ mix_name, "PRIMARY_TDM_TX_0", "PRIMARY_TDM_TX_0"},	\
7962306a36Sopenharmony_ci	{ mix_name, "PRIMARY_TDM_TX_1", "PRIMARY_TDM_TX_1"},	\
8062306a36Sopenharmony_ci	{ mix_name, "PRIMARY_TDM_TX_2", "PRIMARY_TDM_TX_2"},	\
8162306a36Sopenharmony_ci	{ mix_name, "PRIMARY_TDM_TX_3", "PRIMARY_TDM_TX_3"},	\
8262306a36Sopenharmony_ci	{ mix_name, "PRIMARY_TDM_TX_4", "PRIMARY_TDM_TX_4"},	\
8362306a36Sopenharmony_ci	{ mix_name, "PRIMARY_TDM_TX_5", "PRIMARY_TDM_TX_5"},	\
8462306a36Sopenharmony_ci	{ mix_name, "PRIMARY_TDM_TX_6", "PRIMARY_TDM_TX_6"},	\
8562306a36Sopenharmony_ci	{ mix_name, "PRIMARY_TDM_TX_7", "PRIMARY_TDM_TX_7"},	\
8662306a36Sopenharmony_ci	{ mix_name, "SEC_TDM_TX_0", "SEC_TDM_TX_0"},		\
8762306a36Sopenharmony_ci	{ mix_name, "SEC_TDM_TX_1", "SEC_TDM_TX_1"},		\
8862306a36Sopenharmony_ci	{ mix_name, "SEC_TDM_TX_2", "SEC_TDM_TX_2"},		\
8962306a36Sopenharmony_ci	{ mix_name, "SEC_TDM_TX_3", "SEC_TDM_TX_3"},		\
9062306a36Sopenharmony_ci	{ mix_name, "SEC_TDM_TX_4", "SEC_TDM_TX_4"},		\
9162306a36Sopenharmony_ci	{ mix_name, "SEC_TDM_TX_5", "SEC_TDM_TX_5"},		\
9262306a36Sopenharmony_ci	{ mix_name, "SEC_TDM_TX_6", "SEC_TDM_TX_6"},		\
9362306a36Sopenharmony_ci	{ mix_name, "SEC_TDM_TX_7", "SEC_TDM_TX_7"},		\
9462306a36Sopenharmony_ci	{ mix_name, "TERT_TDM_TX_0", "TERT_TDM_TX_0"},		\
9562306a36Sopenharmony_ci	{ mix_name, "TERT_TDM_TX_1", "TERT_TDM_TX_1"},		\
9662306a36Sopenharmony_ci	{ mix_name, "TERT_TDM_TX_2", "TERT_TDM_TX_2"},		\
9762306a36Sopenharmony_ci	{ mix_name, "TERT_TDM_TX_3", "TERT_TDM_TX_3"},		\
9862306a36Sopenharmony_ci	{ mix_name, "TERT_TDM_TX_4", "TERT_TDM_TX_4"},		\
9962306a36Sopenharmony_ci	{ mix_name, "TERT_TDM_TX_5", "TERT_TDM_TX_5"},		\
10062306a36Sopenharmony_ci	{ mix_name, "TERT_TDM_TX_6", "TERT_TDM_TX_6"},		\
10162306a36Sopenharmony_ci	{ mix_name, "TERT_TDM_TX_7", "TERT_TDM_TX_7"},		\
10262306a36Sopenharmony_ci	{ mix_name, "QUAT_TDM_TX_0", "QUAT_TDM_TX_0"},		\
10362306a36Sopenharmony_ci	{ mix_name, "QUAT_TDM_TX_1", "QUAT_TDM_TX_1"},		\
10462306a36Sopenharmony_ci	{ mix_name, "QUAT_TDM_TX_2", "QUAT_TDM_TX_2"},		\
10562306a36Sopenharmony_ci	{ mix_name, "QUAT_TDM_TX_3", "QUAT_TDM_TX_3"},		\
10662306a36Sopenharmony_ci	{ mix_name, "QUAT_TDM_TX_4", "QUAT_TDM_TX_4"},		\
10762306a36Sopenharmony_ci	{ mix_name, "QUAT_TDM_TX_5", "QUAT_TDM_TX_5"},		\
10862306a36Sopenharmony_ci	{ mix_name, "QUAT_TDM_TX_6", "QUAT_TDM_TX_6"},		\
10962306a36Sopenharmony_ci	{ mix_name, "QUAT_TDM_TX_7", "QUAT_TDM_TX_7"},		\
11062306a36Sopenharmony_ci	{ mix_name, "QUIN_TDM_TX_0", "QUIN_TDM_TX_0"},		\
11162306a36Sopenharmony_ci	{ mix_name, "QUIN_TDM_TX_1", "QUIN_TDM_TX_1"},		\
11262306a36Sopenharmony_ci	{ mix_name, "QUIN_TDM_TX_2", "QUIN_TDM_TX_2"},		\
11362306a36Sopenharmony_ci	{ mix_name, "QUIN_TDM_TX_3", "QUIN_TDM_TX_3"},		\
11462306a36Sopenharmony_ci	{ mix_name, "QUIN_TDM_TX_4", "QUIN_TDM_TX_4"},		\
11562306a36Sopenharmony_ci	{ mix_name, "QUIN_TDM_TX_5", "QUIN_TDM_TX_5"},		\
11662306a36Sopenharmony_ci	{ mix_name, "QUIN_TDM_TX_6", "QUIN_TDM_TX_6"},		\
11762306a36Sopenharmony_ci	{ mix_name, "QUIN_TDM_TX_7", "QUIN_TDM_TX_7"},		\
11862306a36Sopenharmony_ci	{ mix_name, "WSA_CODEC_DMA_TX_0", "WSA_CODEC_DMA_TX_0"},	\
11962306a36Sopenharmony_ci	{ mix_name, "WSA_CODEC_DMA_TX_1", "WSA_CODEC_DMA_TX_1"},	\
12062306a36Sopenharmony_ci	{ mix_name, "WSA_CODEC_DMA_TX_2", "WSA_CODEC_DMA_TX_2"},	\
12162306a36Sopenharmony_ci	{ mix_name, "VA_CODEC_DMA_TX_0", "VA_CODEC_DMA_TX_0"},	\
12262306a36Sopenharmony_ci	{ mix_name, "VA_CODEC_DMA_TX_1", "VA_CODEC_DMA_TX_1"},	\
12362306a36Sopenharmony_ci	{ mix_name, "VA_CODEC_DMA_TX_2", "VA_CODEC_DMA_TX_2"},	\
12462306a36Sopenharmony_ci	{ mix_name, "TX_CODEC_DMA_TX_0", "TX_CODEC_DMA_TX_0"},	\
12562306a36Sopenharmony_ci	{ mix_name, "TX_CODEC_DMA_TX_1", "TX_CODEC_DMA_TX_1"},	\
12662306a36Sopenharmony_ci	{ mix_name, "TX_CODEC_DMA_TX_2", "TX_CODEC_DMA_TX_2"},	\
12762306a36Sopenharmony_ci	{ mix_name, "TX_CODEC_DMA_TX_3", "TX_CODEC_DMA_TX_3"},	\
12862306a36Sopenharmony_ci	{ mix_name, "TX_CODEC_DMA_TX_4", "TX_CODEC_DMA_TX_4"},	\
12962306a36Sopenharmony_ci	{ mix_name, "TX_CODEC_DMA_TX_5", "TX_CODEC_DMA_TX_5"}
13062306a36Sopenharmony_ci
13162306a36Sopenharmony_ci#define Q6ROUTING_TX_MIXERS(id)						\
13262306a36Sopenharmony_ci	SOC_SINGLE_EXT("PRI_MI2S_TX", PRIMARY_MI2S_TX,			\
13362306a36Sopenharmony_ci		id, 1, 0, msm_routing_get_audio_mixer,			\
13462306a36Sopenharmony_ci		msm_routing_put_audio_mixer),				\
13562306a36Sopenharmony_ci	SOC_SINGLE_EXT("SEC_MI2S_TX", SECONDARY_MI2S_TX,		\
13662306a36Sopenharmony_ci		id, 1, 0, msm_routing_get_audio_mixer,			\
13762306a36Sopenharmony_ci		msm_routing_put_audio_mixer),				\
13862306a36Sopenharmony_ci	SOC_SINGLE_EXT("TERT_MI2S_TX", TERTIARY_MI2S_TX,		\
13962306a36Sopenharmony_ci		id, 1, 0, msm_routing_get_audio_mixer,			\
14062306a36Sopenharmony_ci		msm_routing_put_audio_mixer),				\
14162306a36Sopenharmony_ci	SOC_SINGLE_EXT("QUAT_MI2S_TX", QUATERNARY_MI2S_TX,		\
14262306a36Sopenharmony_ci		id, 1, 0, msm_routing_get_audio_mixer,			\
14362306a36Sopenharmony_ci		msm_routing_put_audio_mixer),				\
14462306a36Sopenharmony_ci	SOC_SINGLE_EXT("QUIN_MI2S_TX", QUINARY_MI2S_TX,			\
14562306a36Sopenharmony_ci		id, 1, 0, msm_routing_get_audio_mixer,			\
14662306a36Sopenharmony_ci		msm_routing_put_audio_mixer),				\
14762306a36Sopenharmony_ci	SOC_SINGLE_EXT("SLIMBUS_0_TX", SLIMBUS_0_TX,			\
14862306a36Sopenharmony_ci		id, 1, 0, msm_routing_get_audio_mixer,			\
14962306a36Sopenharmony_ci		msm_routing_put_audio_mixer),				\
15062306a36Sopenharmony_ci	SOC_SINGLE_EXT("SLIMBUS_1_TX", SLIMBUS_1_TX,			\
15162306a36Sopenharmony_ci		id, 1, 0, msm_routing_get_audio_mixer,			\
15262306a36Sopenharmony_ci		msm_routing_put_audio_mixer),				\
15362306a36Sopenharmony_ci	SOC_SINGLE_EXT("SLIMBUS_2_TX", SLIMBUS_2_TX,			\
15462306a36Sopenharmony_ci		id, 1, 0, msm_routing_get_audio_mixer,			\
15562306a36Sopenharmony_ci		msm_routing_put_audio_mixer),				\
15662306a36Sopenharmony_ci	SOC_SINGLE_EXT("SLIMBUS_3_TX", SLIMBUS_3_TX,			\
15762306a36Sopenharmony_ci		id, 1, 0, msm_routing_get_audio_mixer,			\
15862306a36Sopenharmony_ci		msm_routing_put_audio_mixer),				\
15962306a36Sopenharmony_ci	SOC_SINGLE_EXT("SLIMBUS_4_TX", SLIMBUS_4_TX,			\
16062306a36Sopenharmony_ci		id, 1, 0, msm_routing_get_audio_mixer,			\
16162306a36Sopenharmony_ci		msm_routing_put_audio_mixer),				\
16262306a36Sopenharmony_ci	SOC_SINGLE_EXT("SLIMBUS_5_TX", SLIMBUS_5_TX,			\
16362306a36Sopenharmony_ci		id, 1, 0, msm_routing_get_audio_mixer,			\
16462306a36Sopenharmony_ci		msm_routing_put_audio_mixer),				\
16562306a36Sopenharmony_ci	SOC_SINGLE_EXT("SLIMBUS_6_TX", SLIMBUS_6_TX,			\
16662306a36Sopenharmony_ci		id, 1, 0, msm_routing_get_audio_mixer,			\
16762306a36Sopenharmony_ci		msm_routing_put_audio_mixer),				\
16862306a36Sopenharmony_ci	SOC_SINGLE_EXT("PRIMARY_TDM_TX_0", PRIMARY_TDM_TX_0,		\
16962306a36Sopenharmony_ci		id, 1, 0, msm_routing_get_audio_mixer,			\
17062306a36Sopenharmony_ci		msm_routing_put_audio_mixer),				\
17162306a36Sopenharmony_ci	SOC_SINGLE_EXT("PRIMARY_TDM_TX_1", PRIMARY_TDM_TX_1,		\
17262306a36Sopenharmony_ci		id, 1, 0, msm_routing_get_audio_mixer,			\
17362306a36Sopenharmony_ci		msm_routing_put_audio_mixer),				\
17462306a36Sopenharmony_ci	SOC_SINGLE_EXT("PRIMARY_TDM_TX_2", PRIMARY_TDM_TX_2,		\
17562306a36Sopenharmony_ci		id, 1, 0, msm_routing_get_audio_mixer,			\
17662306a36Sopenharmony_ci		msm_routing_put_audio_mixer),				\
17762306a36Sopenharmony_ci	SOC_SINGLE_EXT("PRIMARY_TDM_TX_3", PRIMARY_TDM_TX_3,		\
17862306a36Sopenharmony_ci		id, 1, 0, msm_routing_get_audio_mixer,			\
17962306a36Sopenharmony_ci		msm_routing_put_audio_mixer),				\
18062306a36Sopenharmony_ci	SOC_SINGLE_EXT("PRIMARY_TDM_TX_4", PRIMARY_TDM_TX_4,		\
18162306a36Sopenharmony_ci		id, 1, 0, msm_routing_get_audio_mixer,			\
18262306a36Sopenharmony_ci		msm_routing_put_audio_mixer),				\
18362306a36Sopenharmony_ci	SOC_SINGLE_EXT("PRIMARY_TDM_TX_5", PRIMARY_TDM_TX_5,		\
18462306a36Sopenharmony_ci		id, 1, 0, msm_routing_get_audio_mixer,			\
18562306a36Sopenharmony_ci		msm_routing_put_audio_mixer),				\
18662306a36Sopenharmony_ci	SOC_SINGLE_EXT("PRIMARY_TDM_TX_6", PRIMARY_TDM_TX_6,		\
18762306a36Sopenharmony_ci		id, 1, 0, msm_routing_get_audio_mixer,			\
18862306a36Sopenharmony_ci		msm_routing_put_audio_mixer),				\
18962306a36Sopenharmony_ci	SOC_SINGLE_EXT("PRIMARY_TDM_TX_7", PRIMARY_TDM_TX_7,		\
19062306a36Sopenharmony_ci		id, 1, 0, msm_routing_get_audio_mixer,			\
19162306a36Sopenharmony_ci		msm_routing_put_audio_mixer),				\
19262306a36Sopenharmony_ci	SOC_SINGLE_EXT("SEC_TDM_TX_0", SECONDARY_TDM_TX_0,		\
19362306a36Sopenharmony_ci		id, 1, 0, msm_routing_get_audio_mixer,			\
19462306a36Sopenharmony_ci		msm_routing_put_audio_mixer),				\
19562306a36Sopenharmony_ci	SOC_SINGLE_EXT("SEC_TDM_TX_1", SECONDARY_TDM_TX_1,		\
19662306a36Sopenharmony_ci		id, 1, 0, msm_routing_get_audio_mixer,			\
19762306a36Sopenharmony_ci		msm_routing_put_audio_mixer),				\
19862306a36Sopenharmony_ci	SOC_SINGLE_EXT("SEC_TDM_TX_2", SECONDARY_TDM_TX_2,		\
19962306a36Sopenharmony_ci		id, 1, 0, msm_routing_get_audio_mixer,			\
20062306a36Sopenharmony_ci		msm_routing_put_audio_mixer),				\
20162306a36Sopenharmony_ci	SOC_SINGLE_EXT("SEC_TDM_TX_3", SECONDARY_TDM_TX_3,		\
20262306a36Sopenharmony_ci		id, 1, 0, msm_routing_get_audio_mixer,			\
20362306a36Sopenharmony_ci		msm_routing_put_audio_mixer),				\
20462306a36Sopenharmony_ci	SOC_SINGLE_EXT("SEC_TDM_TX_4", SECONDARY_TDM_TX_4,		\
20562306a36Sopenharmony_ci		id, 1, 0, msm_routing_get_audio_mixer,			\
20662306a36Sopenharmony_ci		msm_routing_put_audio_mixer),				\
20762306a36Sopenharmony_ci	SOC_SINGLE_EXT("SEC_TDM_TX_5", SECONDARY_TDM_TX_5,		\
20862306a36Sopenharmony_ci		id, 1, 0, msm_routing_get_audio_mixer,			\
20962306a36Sopenharmony_ci		msm_routing_put_audio_mixer),				\
21062306a36Sopenharmony_ci	SOC_SINGLE_EXT("SEC_TDM_TX_6", SECONDARY_TDM_TX_6,		\
21162306a36Sopenharmony_ci		id, 1, 0, msm_routing_get_audio_mixer,			\
21262306a36Sopenharmony_ci		msm_routing_put_audio_mixer),				\
21362306a36Sopenharmony_ci	SOC_SINGLE_EXT("SEC_TDM_TX_7", SECONDARY_TDM_TX_7,		\
21462306a36Sopenharmony_ci		id, 1, 0, msm_routing_get_audio_mixer,			\
21562306a36Sopenharmony_ci		msm_routing_put_audio_mixer),				\
21662306a36Sopenharmony_ci	SOC_SINGLE_EXT("TERT_TDM_TX_0", TERTIARY_TDM_TX_0,		\
21762306a36Sopenharmony_ci		id, 1, 0, msm_routing_get_audio_mixer,			\
21862306a36Sopenharmony_ci		msm_routing_put_audio_mixer),				\
21962306a36Sopenharmony_ci	SOC_SINGLE_EXT("TERT_TDM_TX_1", TERTIARY_TDM_TX_1,		\
22062306a36Sopenharmony_ci		id, 1, 0, msm_routing_get_audio_mixer,			\
22162306a36Sopenharmony_ci		msm_routing_put_audio_mixer),				\
22262306a36Sopenharmony_ci	SOC_SINGLE_EXT("TERT_TDM_TX_2", TERTIARY_TDM_TX_2,		\
22362306a36Sopenharmony_ci		id, 1, 0, msm_routing_get_audio_mixer,			\
22462306a36Sopenharmony_ci		msm_routing_put_audio_mixer),				\
22562306a36Sopenharmony_ci	SOC_SINGLE_EXT("TERT_TDM_TX_3", TERTIARY_TDM_TX_3,		\
22662306a36Sopenharmony_ci		id, 1, 0, msm_routing_get_audio_mixer,			\
22762306a36Sopenharmony_ci		msm_routing_put_audio_mixer),				\
22862306a36Sopenharmony_ci	SOC_SINGLE_EXT("TERT_TDM_TX_4", TERTIARY_TDM_TX_4,		\
22962306a36Sopenharmony_ci		id, 1, 0, msm_routing_get_audio_mixer,			\
23062306a36Sopenharmony_ci		msm_routing_put_audio_mixer),				\
23162306a36Sopenharmony_ci	SOC_SINGLE_EXT("TERT_TDM_TX_5", TERTIARY_TDM_TX_5,		\
23262306a36Sopenharmony_ci		id, 1, 0, msm_routing_get_audio_mixer,			\
23362306a36Sopenharmony_ci		msm_routing_put_audio_mixer),				\
23462306a36Sopenharmony_ci	SOC_SINGLE_EXT("TERT_TDM_TX_6", TERTIARY_TDM_TX_6,		\
23562306a36Sopenharmony_ci		id, 1, 0, msm_routing_get_audio_mixer,			\
23662306a36Sopenharmony_ci		msm_routing_put_audio_mixer),				\
23762306a36Sopenharmony_ci	SOC_SINGLE_EXT("TERT_TDM_TX_7", TERTIARY_TDM_TX_7,		\
23862306a36Sopenharmony_ci		id, 1, 0, msm_routing_get_audio_mixer,			\
23962306a36Sopenharmony_ci		msm_routing_put_audio_mixer),				\
24062306a36Sopenharmony_ci	SOC_SINGLE_EXT("QUAT_TDM_TX_0", QUATERNARY_TDM_TX_0,		\
24162306a36Sopenharmony_ci		id, 1, 0, msm_routing_get_audio_mixer,			\
24262306a36Sopenharmony_ci		msm_routing_put_audio_mixer),				\
24362306a36Sopenharmony_ci	SOC_SINGLE_EXT("QUAT_TDM_TX_1", QUATERNARY_TDM_TX_1,		\
24462306a36Sopenharmony_ci		id, 1, 0, msm_routing_get_audio_mixer,			\
24562306a36Sopenharmony_ci		msm_routing_put_audio_mixer),				\
24662306a36Sopenharmony_ci	SOC_SINGLE_EXT("QUAT_TDM_TX_2", QUATERNARY_TDM_TX_2,		\
24762306a36Sopenharmony_ci		id, 1, 0, msm_routing_get_audio_mixer,			\
24862306a36Sopenharmony_ci		msm_routing_put_audio_mixer),				\
24962306a36Sopenharmony_ci	SOC_SINGLE_EXT("QUAT_TDM_TX_3", QUATERNARY_TDM_TX_3,		\
25062306a36Sopenharmony_ci		id, 1, 0, msm_routing_get_audio_mixer,			\
25162306a36Sopenharmony_ci		msm_routing_put_audio_mixer),				\
25262306a36Sopenharmony_ci	SOC_SINGLE_EXT("QUAT_TDM_TX_4", QUATERNARY_TDM_TX_4,		\
25362306a36Sopenharmony_ci		id, 1, 0, msm_routing_get_audio_mixer,			\
25462306a36Sopenharmony_ci		msm_routing_put_audio_mixer),				\
25562306a36Sopenharmony_ci	SOC_SINGLE_EXT("QUAT_TDM_TX_5", QUATERNARY_TDM_TX_5,		\
25662306a36Sopenharmony_ci		id, 1, 0, msm_routing_get_audio_mixer,			\
25762306a36Sopenharmony_ci		msm_routing_put_audio_mixer),				\
25862306a36Sopenharmony_ci	SOC_SINGLE_EXT("QUAT_TDM_TX_6", QUATERNARY_TDM_TX_6,		\
25962306a36Sopenharmony_ci		id, 1, 0, msm_routing_get_audio_mixer,			\
26062306a36Sopenharmony_ci		msm_routing_put_audio_mixer),				\
26162306a36Sopenharmony_ci	SOC_SINGLE_EXT("QUAT_TDM_TX_7", QUATERNARY_TDM_TX_7,		\
26262306a36Sopenharmony_ci		id, 1, 0, msm_routing_get_audio_mixer,			\
26362306a36Sopenharmony_ci		msm_routing_put_audio_mixer),				\
26462306a36Sopenharmony_ci	SOC_SINGLE_EXT("QUIN_TDM_TX_0", QUINARY_TDM_TX_0,		\
26562306a36Sopenharmony_ci		id, 1, 0, msm_routing_get_audio_mixer,			\
26662306a36Sopenharmony_ci		msm_routing_put_audio_mixer),				\
26762306a36Sopenharmony_ci	SOC_SINGLE_EXT("QUIN_TDM_TX_1", QUINARY_TDM_TX_1,		\
26862306a36Sopenharmony_ci		id, 1, 0, msm_routing_get_audio_mixer,			\
26962306a36Sopenharmony_ci		msm_routing_put_audio_mixer),				\
27062306a36Sopenharmony_ci	SOC_SINGLE_EXT("QUIN_TDM_TX_2", QUINARY_TDM_TX_2,		\
27162306a36Sopenharmony_ci		id, 1, 0, msm_routing_get_audio_mixer,			\
27262306a36Sopenharmony_ci		msm_routing_put_audio_mixer),				\
27362306a36Sopenharmony_ci	SOC_SINGLE_EXT("QUIN_TDM_TX_3", QUINARY_TDM_TX_3,		\
27462306a36Sopenharmony_ci		id, 1, 0, msm_routing_get_audio_mixer,			\
27562306a36Sopenharmony_ci		msm_routing_put_audio_mixer),				\
27662306a36Sopenharmony_ci	SOC_SINGLE_EXT("QUIN_TDM_TX_4", QUINARY_TDM_TX_4,		\
27762306a36Sopenharmony_ci		id, 1, 0, msm_routing_get_audio_mixer,			\
27862306a36Sopenharmony_ci		msm_routing_put_audio_mixer),				\
27962306a36Sopenharmony_ci	SOC_SINGLE_EXT("QUIN_TDM_TX_5", QUINARY_TDM_TX_5,		\
28062306a36Sopenharmony_ci		id, 1, 0, msm_routing_get_audio_mixer,			\
28162306a36Sopenharmony_ci		msm_routing_put_audio_mixer),				\
28262306a36Sopenharmony_ci	SOC_SINGLE_EXT("QUIN_TDM_TX_6", QUINARY_TDM_TX_6,		\
28362306a36Sopenharmony_ci		id, 1, 0, msm_routing_get_audio_mixer,			\
28462306a36Sopenharmony_ci		msm_routing_put_audio_mixer),				\
28562306a36Sopenharmony_ci	SOC_SINGLE_EXT("QUIN_TDM_TX_7", QUINARY_TDM_TX_7,		\
28662306a36Sopenharmony_ci		id, 1, 0, msm_routing_get_audio_mixer,			\
28762306a36Sopenharmony_ci		msm_routing_put_audio_mixer),				\
28862306a36Sopenharmony_ci	SOC_SINGLE_EXT("WSA_CODEC_DMA_TX_0", WSA_CODEC_DMA_TX_0,	\
28962306a36Sopenharmony_ci		id, 1, 0, msm_routing_get_audio_mixer,			\
29062306a36Sopenharmony_ci		msm_routing_put_audio_mixer),				\
29162306a36Sopenharmony_ci	SOC_SINGLE_EXT("WSA_CODEC_DMA_TX_1", WSA_CODEC_DMA_TX_1,	\
29262306a36Sopenharmony_ci		id, 1, 0, msm_routing_get_audio_mixer,			\
29362306a36Sopenharmony_ci		msm_routing_put_audio_mixer),				\
29462306a36Sopenharmony_ci	SOC_SINGLE_EXT("WSA_CODEC_DMA_TX_2", WSA_CODEC_DMA_TX_2,	\
29562306a36Sopenharmony_ci		id, 1, 0, msm_routing_get_audio_mixer,			\
29662306a36Sopenharmony_ci		msm_routing_put_audio_mixer),				\
29762306a36Sopenharmony_ci	SOC_SINGLE_EXT("VA_CODEC_DMA_TX_0", VA_CODEC_DMA_TX_0,		\
29862306a36Sopenharmony_ci		id, 1, 0, msm_routing_get_audio_mixer,			\
29962306a36Sopenharmony_ci		msm_routing_put_audio_mixer),				\
30062306a36Sopenharmony_ci	SOC_SINGLE_EXT("VA_CODEC_DMA_TX_1", VA_CODEC_DMA_TX_1,		\
30162306a36Sopenharmony_ci		id, 1, 0, msm_routing_get_audio_mixer,			\
30262306a36Sopenharmony_ci		msm_routing_put_audio_mixer),				\
30362306a36Sopenharmony_ci	SOC_SINGLE_EXT("VA_CODEC_DMA_TX_2", VA_CODEC_DMA_TX_2,		\
30462306a36Sopenharmony_ci		id, 1, 0, msm_routing_get_audio_mixer,			\
30562306a36Sopenharmony_ci		msm_routing_put_audio_mixer),				\
30662306a36Sopenharmony_ci	SOC_SINGLE_EXT("TX_CODEC_DMA_TX_0", TX_CODEC_DMA_TX_0,		\
30762306a36Sopenharmony_ci		id, 1, 0, msm_routing_get_audio_mixer,			\
30862306a36Sopenharmony_ci		msm_routing_put_audio_mixer),				\
30962306a36Sopenharmony_ci	SOC_SINGLE_EXT("TX_CODEC_DMA_TX_1", TX_CODEC_DMA_TX_1,		\
31062306a36Sopenharmony_ci		id, 1, 0, msm_routing_get_audio_mixer,			\
31162306a36Sopenharmony_ci		msm_routing_put_audio_mixer),				\
31262306a36Sopenharmony_ci	SOC_SINGLE_EXT("TX_CODEC_DMA_TX_2", TX_CODEC_DMA_TX_2,		\
31362306a36Sopenharmony_ci		id, 1, 0, msm_routing_get_audio_mixer,			\
31462306a36Sopenharmony_ci		msm_routing_put_audio_mixer),				\
31562306a36Sopenharmony_ci	SOC_SINGLE_EXT("TX_CODEC_DMA_TX_3", TX_CODEC_DMA_TX_3,		\
31662306a36Sopenharmony_ci		id, 1, 0, msm_routing_get_audio_mixer,			\
31762306a36Sopenharmony_ci		msm_routing_put_audio_mixer),				\
31862306a36Sopenharmony_ci	SOC_SINGLE_EXT("TX_CODEC_DMA_TX_4", TX_CODEC_DMA_TX_4,		\
31962306a36Sopenharmony_ci		id, 1, 0, msm_routing_get_audio_mixer,			\
32062306a36Sopenharmony_ci		msm_routing_put_audio_mixer),				\
32162306a36Sopenharmony_ci	SOC_SINGLE_EXT("TX_CODEC_DMA_TX_5", TX_CODEC_DMA_TX_5,		\
32262306a36Sopenharmony_ci		id, 1, 0, msm_routing_get_audio_mixer,			\
32362306a36Sopenharmony_ci		msm_routing_put_audio_mixer),
32462306a36Sopenharmony_ci
32562306a36Sopenharmony_cistruct session_data {
32662306a36Sopenharmony_ci	int state;
32762306a36Sopenharmony_ci	int port_id;
32862306a36Sopenharmony_ci	int path_type;
32962306a36Sopenharmony_ci	int app_type;
33062306a36Sopenharmony_ci	int acdb_id;
33162306a36Sopenharmony_ci	int sample_rate;
33262306a36Sopenharmony_ci	int bits_per_sample;
33362306a36Sopenharmony_ci	int channels;
33462306a36Sopenharmony_ci	int perf_mode;
33562306a36Sopenharmony_ci	int numcopps;
33662306a36Sopenharmony_ci	int fedai_id;
33762306a36Sopenharmony_ci	unsigned long copp_map;
33862306a36Sopenharmony_ci	struct q6copp *copps[MAX_COPPS_PER_PORT];
33962306a36Sopenharmony_ci};
34062306a36Sopenharmony_ci
34162306a36Sopenharmony_cistruct msm_routing_data {
34262306a36Sopenharmony_ci	struct session_data sessions[MAX_SESSIONS];
34362306a36Sopenharmony_ci	struct session_data port_data[AFE_MAX_PORTS];
34462306a36Sopenharmony_ci	struct device *dev;
34562306a36Sopenharmony_ci	struct mutex lock;
34662306a36Sopenharmony_ci};
34762306a36Sopenharmony_ci
34862306a36Sopenharmony_cistatic struct msm_routing_data *routing_data;
34962306a36Sopenharmony_ci
35062306a36Sopenharmony_ci/**
35162306a36Sopenharmony_ci * q6routing_stream_open() - Register a new stream for route setup
35262306a36Sopenharmony_ci *
35362306a36Sopenharmony_ci * @fedai_id: Frontend dai id.
35462306a36Sopenharmony_ci * @perf_mode: Performance mode.
35562306a36Sopenharmony_ci * @stream_id: ASM stream id to map.
35662306a36Sopenharmony_ci * @stream_type: Direction of stream
35762306a36Sopenharmony_ci *
35862306a36Sopenharmony_ci * Return: Will be an negative on error or a zero on success.
35962306a36Sopenharmony_ci */
36062306a36Sopenharmony_ciint q6routing_stream_open(int fedai_id, int perf_mode,
36162306a36Sopenharmony_ci			   int stream_id, int stream_type)
36262306a36Sopenharmony_ci{
36362306a36Sopenharmony_ci	int j, topology, num_copps = 0;
36462306a36Sopenharmony_ci	struct route_payload payload;
36562306a36Sopenharmony_ci	struct q6copp *copp;
36662306a36Sopenharmony_ci	int copp_idx;
36762306a36Sopenharmony_ci	struct session_data *session, *pdata;
36862306a36Sopenharmony_ci
36962306a36Sopenharmony_ci	if (!routing_data) {
37062306a36Sopenharmony_ci		pr_err("Routing driver not yet ready\n");
37162306a36Sopenharmony_ci		return -EINVAL;
37262306a36Sopenharmony_ci	}
37362306a36Sopenharmony_ci
37462306a36Sopenharmony_ci	session = &routing_data->sessions[stream_id - 1];
37562306a36Sopenharmony_ci	if (session->port_id < 0) {
37662306a36Sopenharmony_ci		dev_err(routing_data->dev, "Routing not setup for MultiMedia%d Session\n",
37762306a36Sopenharmony_ci			session->fedai_id);
37862306a36Sopenharmony_ci		return -EINVAL;
37962306a36Sopenharmony_ci	}
38062306a36Sopenharmony_ci
38162306a36Sopenharmony_ci	pdata = &routing_data->port_data[session->port_id];
38262306a36Sopenharmony_ci
38362306a36Sopenharmony_ci	mutex_lock(&routing_data->lock);
38462306a36Sopenharmony_ci	session->fedai_id = fedai_id;
38562306a36Sopenharmony_ci
38662306a36Sopenharmony_ci	session->path_type = pdata->path_type;
38762306a36Sopenharmony_ci	session->sample_rate = pdata->sample_rate;
38862306a36Sopenharmony_ci	session->channels = pdata->channels;
38962306a36Sopenharmony_ci	session->bits_per_sample = pdata->bits_per_sample;
39062306a36Sopenharmony_ci
39162306a36Sopenharmony_ci	payload.num_copps = 0; /* only RX needs to use payload */
39262306a36Sopenharmony_ci	topology = NULL_COPP_TOPOLOGY;
39362306a36Sopenharmony_ci	copp = q6adm_open(routing_data->dev, session->port_id,
39462306a36Sopenharmony_ci			      session->path_type, session->sample_rate,
39562306a36Sopenharmony_ci			      session->channels, topology, perf_mode,
39662306a36Sopenharmony_ci			      session->bits_per_sample, 0, 0);
39762306a36Sopenharmony_ci
39862306a36Sopenharmony_ci	if (IS_ERR_OR_NULL(copp)) {
39962306a36Sopenharmony_ci		mutex_unlock(&routing_data->lock);
40062306a36Sopenharmony_ci		return -EINVAL;
40162306a36Sopenharmony_ci	}
40262306a36Sopenharmony_ci
40362306a36Sopenharmony_ci	copp_idx = q6adm_get_copp_id(copp);
40462306a36Sopenharmony_ci	set_bit(copp_idx, &session->copp_map);
40562306a36Sopenharmony_ci	session->copps[copp_idx] = copp;
40662306a36Sopenharmony_ci
40762306a36Sopenharmony_ci	for_each_set_bit(j, &session->copp_map, MAX_COPPS_PER_PORT) {
40862306a36Sopenharmony_ci		payload.port_id[num_copps] = session->port_id;
40962306a36Sopenharmony_ci		payload.copp_idx[num_copps] = j;
41062306a36Sopenharmony_ci		num_copps++;
41162306a36Sopenharmony_ci	}
41262306a36Sopenharmony_ci
41362306a36Sopenharmony_ci	if (num_copps) {
41462306a36Sopenharmony_ci		payload.num_copps = num_copps;
41562306a36Sopenharmony_ci		payload.session_id = stream_id;
41662306a36Sopenharmony_ci		q6adm_matrix_map(routing_data->dev, session->path_type,
41762306a36Sopenharmony_ci				 payload, perf_mode);
41862306a36Sopenharmony_ci	}
41962306a36Sopenharmony_ci	mutex_unlock(&routing_data->lock);
42062306a36Sopenharmony_ci
42162306a36Sopenharmony_ci	return 0;
42262306a36Sopenharmony_ci}
42362306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(q6routing_stream_open);
42462306a36Sopenharmony_ci
42562306a36Sopenharmony_cistatic struct session_data *get_session_from_id(struct msm_routing_data *data,
42662306a36Sopenharmony_ci						int fedai_id)
42762306a36Sopenharmony_ci{
42862306a36Sopenharmony_ci	int i;
42962306a36Sopenharmony_ci
43062306a36Sopenharmony_ci	for (i = 0; i < MAX_SESSIONS; i++) {
43162306a36Sopenharmony_ci		if (fedai_id == data->sessions[i].fedai_id)
43262306a36Sopenharmony_ci			return &data->sessions[i];
43362306a36Sopenharmony_ci	}
43462306a36Sopenharmony_ci
43562306a36Sopenharmony_ci	return NULL;
43662306a36Sopenharmony_ci}
43762306a36Sopenharmony_ci/**
43862306a36Sopenharmony_ci * q6routing_stream_close() - Deregister a stream
43962306a36Sopenharmony_ci *
44062306a36Sopenharmony_ci * @fedai_id: Frontend dai id.
44162306a36Sopenharmony_ci * @stream_type: Direction of stream
44262306a36Sopenharmony_ci *
44362306a36Sopenharmony_ci * Return: Will be an negative on error or a zero on success.
44462306a36Sopenharmony_ci */
44562306a36Sopenharmony_civoid q6routing_stream_close(int fedai_id, int stream_type)
44662306a36Sopenharmony_ci{
44762306a36Sopenharmony_ci	struct session_data *session;
44862306a36Sopenharmony_ci	int idx;
44962306a36Sopenharmony_ci
45062306a36Sopenharmony_ci	session = get_session_from_id(routing_data, fedai_id);
45162306a36Sopenharmony_ci	if (!session)
45262306a36Sopenharmony_ci		return;
45362306a36Sopenharmony_ci
45462306a36Sopenharmony_ci	for_each_set_bit(idx, &session->copp_map, MAX_COPPS_PER_PORT) {
45562306a36Sopenharmony_ci		if (session->copps[idx]) {
45662306a36Sopenharmony_ci			q6adm_close(routing_data->dev, session->copps[idx]);
45762306a36Sopenharmony_ci			session->copps[idx] = NULL;
45862306a36Sopenharmony_ci		}
45962306a36Sopenharmony_ci	}
46062306a36Sopenharmony_ci
46162306a36Sopenharmony_ci	session->fedai_id = -1;
46262306a36Sopenharmony_ci	session->copp_map = 0;
46362306a36Sopenharmony_ci}
46462306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(q6routing_stream_close);
46562306a36Sopenharmony_ci
46662306a36Sopenharmony_cistatic int msm_routing_get_audio_mixer(struct snd_kcontrol *kcontrol,
46762306a36Sopenharmony_ci				       struct snd_ctl_elem_value *ucontrol)
46862306a36Sopenharmony_ci{
46962306a36Sopenharmony_ci	struct snd_soc_dapm_context *dapm =
47062306a36Sopenharmony_ci	    snd_soc_dapm_kcontrol_dapm(kcontrol);
47162306a36Sopenharmony_ci	struct soc_mixer_control *mc =
47262306a36Sopenharmony_ci	    (struct soc_mixer_control *)kcontrol->private_value;
47362306a36Sopenharmony_ci	int session_id = mc->shift;
47462306a36Sopenharmony_ci	struct snd_soc_component *c = snd_soc_dapm_to_component(dapm);
47562306a36Sopenharmony_ci	struct msm_routing_data *priv = dev_get_drvdata(c->dev);
47662306a36Sopenharmony_ci	struct session_data *session = &priv->sessions[session_id];
47762306a36Sopenharmony_ci
47862306a36Sopenharmony_ci	if (session->port_id == mc->reg)
47962306a36Sopenharmony_ci		ucontrol->value.integer.value[0] = 1;
48062306a36Sopenharmony_ci	else
48162306a36Sopenharmony_ci		ucontrol->value.integer.value[0] = 0;
48262306a36Sopenharmony_ci
48362306a36Sopenharmony_ci	return 0;
48462306a36Sopenharmony_ci}
48562306a36Sopenharmony_ci
48662306a36Sopenharmony_cistatic int msm_routing_put_audio_mixer(struct snd_kcontrol *kcontrol,
48762306a36Sopenharmony_ci				       struct snd_ctl_elem_value *ucontrol)
48862306a36Sopenharmony_ci{
48962306a36Sopenharmony_ci	struct snd_soc_dapm_context *dapm =
49062306a36Sopenharmony_ci				    snd_soc_dapm_kcontrol_dapm(kcontrol);
49162306a36Sopenharmony_ci	struct snd_soc_component *c = snd_soc_dapm_to_component(dapm);
49262306a36Sopenharmony_ci	struct msm_routing_data *data = dev_get_drvdata(c->dev);
49362306a36Sopenharmony_ci	struct soc_mixer_control *mc =
49462306a36Sopenharmony_ci		    (struct soc_mixer_control *)kcontrol->private_value;
49562306a36Sopenharmony_ci	struct snd_soc_dapm_update *update = NULL;
49662306a36Sopenharmony_ci	int be_id = mc->reg;
49762306a36Sopenharmony_ci	int session_id = mc->shift;
49862306a36Sopenharmony_ci	struct session_data *session = &data->sessions[session_id];
49962306a36Sopenharmony_ci
50062306a36Sopenharmony_ci	if (ucontrol->value.integer.value[0]) {
50162306a36Sopenharmony_ci		if (session->port_id == be_id)
50262306a36Sopenharmony_ci			return 0;
50362306a36Sopenharmony_ci
50462306a36Sopenharmony_ci		session->port_id = be_id;
50562306a36Sopenharmony_ci		snd_soc_dapm_mixer_update_power(dapm, kcontrol, 1, update);
50662306a36Sopenharmony_ci	} else {
50762306a36Sopenharmony_ci		if (session->port_id == -1 || session->port_id != be_id)
50862306a36Sopenharmony_ci			return 0;
50962306a36Sopenharmony_ci
51062306a36Sopenharmony_ci		session->port_id = -1;
51162306a36Sopenharmony_ci		snd_soc_dapm_mixer_update_power(dapm, kcontrol, 0, update);
51262306a36Sopenharmony_ci	}
51362306a36Sopenharmony_ci
51462306a36Sopenharmony_ci	return 1;
51562306a36Sopenharmony_ci}
51662306a36Sopenharmony_ci
51762306a36Sopenharmony_cistatic const struct snd_kcontrol_new hdmi_mixer_controls[] = {
51862306a36Sopenharmony_ci	Q6ROUTING_RX_MIXERS(HDMI_RX) };
51962306a36Sopenharmony_ci
52062306a36Sopenharmony_cistatic const struct snd_kcontrol_new display_port_mixer_controls[] = {
52162306a36Sopenharmony_ci	Q6ROUTING_RX_MIXERS(DISPLAY_PORT_RX) };
52262306a36Sopenharmony_ci
52362306a36Sopenharmony_cistatic const struct snd_kcontrol_new primary_mi2s_rx_mixer_controls[] = {
52462306a36Sopenharmony_ci	Q6ROUTING_RX_MIXERS(PRIMARY_MI2S_RX) };
52562306a36Sopenharmony_ci
52662306a36Sopenharmony_cistatic const struct snd_kcontrol_new secondary_mi2s_rx_mixer_controls[] = {
52762306a36Sopenharmony_ci	Q6ROUTING_RX_MIXERS(SECONDARY_MI2S_RX) };
52862306a36Sopenharmony_ci
52962306a36Sopenharmony_cistatic const struct snd_kcontrol_new quaternary_mi2s_rx_mixer_controls[] = {
53062306a36Sopenharmony_ci	Q6ROUTING_RX_MIXERS(QUATERNARY_MI2S_RX) };
53162306a36Sopenharmony_ci
53262306a36Sopenharmony_cistatic const struct snd_kcontrol_new quinary_mi2s_rx_mixer_controls[] = {
53362306a36Sopenharmony_ci	Q6ROUTING_RX_MIXERS(QUINARY_MI2S_RX) };
53462306a36Sopenharmony_ci
53562306a36Sopenharmony_cistatic const struct snd_kcontrol_new tertiary_mi2s_rx_mixer_controls[] = {
53662306a36Sopenharmony_ci	Q6ROUTING_RX_MIXERS(TERTIARY_MI2S_RX) };
53762306a36Sopenharmony_ci
53862306a36Sopenharmony_cistatic const struct snd_kcontrol_new slimbus_rx_mixer_controls[] = {
53962306a36Sopenharmony_ci	Q6ROUTING_RX_MIXERS(SLIMBUS_0_RX) };
54062306a36Sopenharmony_ci
54162306a36Sopenharmony_cistatic const struct snd_kcontrol_new slimbus_1_rx_mixer_controls[] = {
54262306a36Sopenharmony_ci	Q6ROUTING_RX_MIXERS(SLIMBUS_1_RX) };
54362306a36Sopenharmony_ci
54462306a36Sopenharmony_cistatic const struct snd_kcontrol_new slimbus_2_rx_mixer_controls[] = {
54562306a36Sopenharmony_ci	Q6ROUTING_RX_MIXERS(SLIMBUS_2_RX) };
54662306a36Sopenharmony_ci
54762306a36Sopenharmony_cistatic const struct snd_kcontrol_new slimbus_3_rx_mixer_controls[] = {
54862306a36Sopenharmony_ci	Q6ROUTING_RX_MIXERS(SLIMBUS_3_RX) };
54962306a36Sopenharmony_ci
55062306a36Sopenharmony_cistatic const struct snd_kcontrol_new slimbus_4_rx_mixer_controls[] = {
55162306a36Sopenharmony_ci	Q6ROUTING_RX_MIXERS(SLIMBUS_4_RX) };
55262306a36Sopenharmony_ci
55362306a36Sopenharmony_cistatic const struct snd_kcontrol_new slimbus_5_rx_mixer_controls[] = {
55462306a36Sopenharmony_ci	Q6ROUTING_RX_MIXERS(SLIMBUS_5_RX) };
55562306a36Sopenharmony_ci
55662306a36Sopenharmony_cistatic const struct snd_kcontrol_new slimbus_6_rx_mixer_controls[] = {
55762306a36Sopenharmony_ci	Q6ROUTING_RX_MIXERS(SLIMBUS_6_RX) };
55862306a36Sopenharmony_ci
55962306a36Sopenharmony_cistatic const struct snd_kcontrol_new pri_tdm_rx_0_mixer_controls[] = {
56062306a36Sopenharmony_ci	Q6ROUTING_RX_MIXERS(PRIMARY_TDM_RX_0) };
56162306a36Sopenharmony_ci
56262306a36Sopenharmony_cistatic const struct snd_kcontrol_new pri_tdm_rx_1_mixer_controls[] = {
56362306a36Sopenharmony_ci	Q6ROUTING_RX_MIXERS(PRIMARY_TDM_RX_1) };
56462306a36Sopenharmony_ci
56562306a36Sopenharmony_cistatic const struct snd_kcontrol_new pri_tdm_rx_2_mixer_controls[] = {
56662306a36Sopenharmony_ci	Q6ROUTING_RX_MIXERS(PRIMARY_TDM_RX_2) };
56762306a36Sopenharmony_ci
56862306a36Sopenharmony_cistatic const struct snd_kcontrol_new pri_tdm_rx_3_mixer_controls[] = {
56962306a36Sopenharmony_ci	Q6ROUTING_RX_MIXERS(PRIMARY_TDM_RX_3) };
57062306a36Sopenharmony_ci
57162306a36Sopenharmony_cistatic const struct snd_kcontrol_new pri_tdm_rx_4_mixer_controls[] = {
57262306a36Sopenharmony_ci	Q6ROUTING_RX_MIXERS(PRIMARY_TDM_RX_4) };
57362306a36Sopenharmony_ci
57462306a36Sopenharmony_cistatic const struct snd_kcontrol_new pri_tdm_rx_5_mixer_controls[] = {
57562306a36Sopenharmony_ci	Q6ROUTING_RX_MIXERS(PRIMARY_TDM_RX_5) };
57662306a36Sopenharmony_ci
57762306a36Sopenharmony_cistatic const struct snd_kcontrol_new pri_tdm_rx_6_mixer_controls[] = {
57862306a36Sopenharmony_ci	Q6ROUTING_RX_MIXERS(PRIMARY_TDM_RX_6) };
57962306a36Sopenharmony_ci
58062306a36Sopenharmony_cistatic const struct snd_kcontrol_new pri_tdm_rx_7_mixer_controls[] = {
58162306a36Sopenharmony_ci	Q6ROUTING_RX_MIXERS(PRIMARY_TDM_RX_7) };
58262306a36Sopenharmony_ci
58362306a36Sopenharmony_cistatic const struct snd_kcontrol_new sec_tdm_rx_0_mixer_controls[] = {
58462306a36Sopenharmony_ci	Q6ROUTING_RX_MIXERS(SECONDARY_TDM_RX_0) };
58562306a36Sopenharmony_ci
58662306a36Sopenharmony_cistatic const struct snd_kcontrol_new sec_tdm_rx_1_mixer_controls[] = {
58762306a36Sopenharmony_ci	Q6ROUTING_RX_MIXERS(SECONDARY_TDM_RX_1) };
58862306a36Sopenharmony_ci
58962306a36Sopenharmony_cistatic const struct snd_kcontrol_new sec_tdm_rx_2_mixer_controls[] = {
59062306a36Sopenharmony_ci	Q6ROUTING_RX_MIXERS(SECONDARY_TDM_RX_2) };
59162306a36Sopenharmony_ci
59262306a36Sopenharmony_cistatic const struct snd_kcontrol_new sec_tdm_rx_3_mixer_controls[] = {
59362306a36Sopenharmony_ci	Q6ROUTING_RX_MIXERS(SECONDARY_TDM_RX_3) };
59462306a36Sopenharmony_ci
59562306a36Sopenharmony_cistatic const struct snd_kcontrol_new sec_tdm_rx_4_mixer_controls[] = {
59662306a36Sopenharmony_ci	Q6ROUTING_RX_MIXERS(SECONDARY_TDM_RX_4) };
59762306a36Sopenharmony_ci
59862306a36Sopenharmony_cistatic const struct snd_kcontrol_new sec_tdm_rx_5_mixer_controls[] = {
59962306a36Sopenharmony_ci	Q6ROUTING_RX_MIXERS(SECONDARY_TDM_RX_5) };
60062306a36Sopenharmony_ci
60162306a36Sopenharmony_cistatic const struct snd_kcontrol_new sec_tdm_rx_6_mixer_controls[] = {
60262306a36Sopenharmony_ci	Q6ROUTING_RX_MIXERS(SECONDARY_TDM_RX_6) };
60362306a36Sopenharmony_ci
60462306a36Sopenharmony_cistatic const struct snd_kcontrol_new sec_tdm_rx_7_mixer_controls[] = {
60562306a36Sopenharmony_ci	Q6ROUTING_RX_MIXERS(SECONDARY_TDM_RX_7) };
60662306a36Sopenharmony_ci
60762306a36Sopenharmony_cistatic const struct snd_kcontrol_new tert_tdm_rx_0_mixer_controls[] = {
60862306a36Sopenharmony_ci	Q6ROUTING_RX_MIXERS(TERTIARY_TDM_RX_0) };
60962306a36Sopenharmony_ci
61062306a36Sopenharmony_cistatic const struct snd_kcontrol_new tert_tdm_rx_1_mixer_controls[] = {
61162306a36Sopenharmony_ci	Q6ROUTING_RX_MIXERS(TERTIARY_TDM_RX_1) };
61262306a36Sopenharmony_ci
61362306a36Sopenharmony_cistatic const struct snd_kcontrol_new tert_tdm_rx_2_mixer_controls[] = {
61462306a36Sopenharmony_ci	Q6ROUTING_RX_MIXERS(TERTIARY_TDM_RX_2) };
61562306a36Sopenharmony_ci
61662306a36Sopenharmony_cistatic const struct snd_kcontrol_new tert_tdm_rx_3_mixer_controls[] = {
61762306a36Sopenharmony_ci	Q6ROUTING_RX_MIXERS(TERTIARY_TDM_RX_3) };
61862306a36Sopenharmony_ci
61962306a36Sopenharmony_cistatic const struct snd_kcontrol_new tert_tdm_rx_4_mixer_controls[] = {
62062306a36Sopenharmony_ci	Q6ROUTING_RX_MIXERS(TERTIARY_TDM_RX_4) };
62162306a36Sopenharmony_ci
62262306a36Sopenharmony_cistatic const struct snd_kcontrol_new tert_tdm_rx_5_mixer_controls[] = {
62362306a36Sopenharmony_ci	Q6ROUTING_RX_MIXERS(TERTIARY_TDM_RX_5) };
62462306a36Sopenharmony_ci
62562306a36Sopenharmony_cistatic const struct snd_kcontrol_new tert_tdm_rx_6_mixer_controls[] = {
62662306a36Sopenharmony_ci	Q6ROUTING_RX_MIXERS(TERTIARY_TDM_RX_6) };
62762306a36Sopenharmony_ci
62862306a36Sopenharmony_cistatic const struct snd_kcontrol_new tert_tdm_rx_7_mixer_controls[] = {
62962306a36Sopenharmony_ci	Q6ROUTING_RX_MIXERS(TERTIARY_TDM_RX_7) };
63062306a36Sopenharmony_ci
63162306a36Sopenharmony_cistatic const struct snd_kcontrol_new quat_tdm_rx_0_mixer_controls[] = {
63262306a36Sopenharmony_ci	Q6ROUTING_RX_MIXERS(QUATERNARY_TDM_RX_0) };
63362306a36Sopenharmony_ci
63462306a36Sopenharmony_cistatic const struct snd_kcontrol_new quat_tdm_rx_1_mixer_controls[] = {
63562306a36Sopenharmony_ci	Q6ROUTING_RX_MIXERS(QUATERNARY_TDM_RX_1) };
63662306a36Sopenharmony_ci
63762306a36Sopenharmony_cistatic const struct snd_kcontrol_new quat_tdm_rx_2_mixer_controls[] = {
63862306a36Sopenharmony_ci	Q6ROUTING_RX_MIXERS(QUATERNARY_TDM_RX_2) };
63962306a36Sopenharmony_ci
64062306a36Sopenharmony_cistatic const struct snd_kcontrol_new quat_tdm_rx_3_mixer_controls[] = {
64162306a36Sopenharmony_ci	Q6ROUTING_RX_MIXERS(QUATERNARY_TDM_RX_3) };
64262306a36Sopenharmony_ci
64362306a36Sopenharmony_cistatic const struct snd_kcontrol_new quat_tdm_rx_4_mixer_controls[] = {
64462306a36Sopenharmony_ci	Q6ROUTING_RX_MIXERS(QUATERNARY_TDM_RX_4) };
64562306a36Sopenharmony_ci
64662306a36Sopenharmony_cistatic const struct snd_kcontrol_new quat_tdm_rx_5_mixer_controls[] = {
64762306a36Sopenharmony_ci	Q6ROUTING_RX_MIXERS(QUATERNARY_TDM_RX_5) };
64862306a36Sopenharmony_ci
64962306a36Sopenharmony_cistatic const struct snd_kcontrol_new quat_tdm_rx_6_mixer_controls[] = {
65062306a36Sopenharmony_ci	Q6ROUTING_RX_MIXERS(QUATERNARY_TDM_RX_6) };
65162306a36Sopenharmony_ci
65262306a36Sopenharmony_cistatic const struct snd_kcontrol_new quat_tdm_rx_7_mixer_controls[] = {
65362306a36Sopenharmony_ci	Q6ROUTING_RX_MIXERS(QUATERNARY_TDM_RX_7) };
65462306a36Sopenharmony_ci
65562306a36Sopenharmony_cistatic const struct snd_kcontrol_new quin_tdm_rx_0_mixer_controls[] = {
65662306a36Sopenharmony_ci	Q6ROUTING_RX_MIXERS(QUINARY_TDM_RX_0) };
65762306a36Sopenharmony_ci
65862306a36Sopenharmony_cistatic const struct snd_kcontrol_new quin_tdm_rx_1_mixer_controls[] = {
65962306a36Sopenharmony_ci	Q6ROUTING_RX_MIXERS(QUINARY_TDM_RX_1) };
66062306a36Sopenharmony_ci
66162306a36Sopenharmony_cistatic const struct snd_kcontrol_new quin_tdm_rx_2_mixer_controls[] = {
66262306a36Sopenharmony_ci	Q6ROUTING_RX_MIXERS(QUINARY_TDM_RX_2) };
66362306a36Sopenharmony_ci
66462306a36Sopenharmony_cistatic const struct snd_kcontrol_new quin_tdm_rx_3_mixer_controls[] = {
66562306a36Sopenharmony_ci	Q6ROUTING_RX_MIXERS(QUINARY_TDM_RX_3) };
66662306a36Sopenharmony_ci
66762306a36Sopenharmony_cistatic const struct snd_kcontrol_new quin_tdm_rx_4_mixer_controls[] = {
66862306a36Sopenharmony_ci	Q6ROUTING_RX_MIXERS(QUINARY_TDM_RX_4) };
66962306a36Sopenharmony_ci
67062306a36Sopenharmony_cistatic const struct snd_kcontrol_new quin_tdm_rx_5_mixer_controls[] = {
67162306a36Sopenharmony_ci	Q6ROUTING_RX_MIXERS(QUINARY_TDM_RX_5) };
67262306a36Sopenharmony_ci
67362306a36Sopenharmony_cistatic const struct snd_kcontrol_new quin_tdm_rx_6_mixer_controls[] = {
67462306a36Sopenharmony_ci	Q6ROUTING_RX_MIXERS(QUINARY_TDM_RX_6) };
67562306a36Sopenharmony_ci
67662306a36Sopenharmony_cistatic const struct snd_kcontrol_new quin_tdm_rx_7_mixer_controls[] = {
67762306a36Sopenharmony_ci	Q6ROUTING_RX_MIXERS(QUINARY_TDM_RX_7) };
67862306a36Sopenharmony_ci
67962306a36Sopenharmony_cistatic const struct snd_kcontrol_new wsa_codec_dma_rx_0_mixer_controls[] = {
68062306a36Sopenharmony_ci	Q6ROUTING_RX_MIXERS(WSA_CODEC_DMA_RX_0) };
68162306a36Sopenharmony_ci
68262306a36Sopenharmony_cistatic const struct snd_kcontrol_new wsa_codec_dma_rx_1_mixer_controls[] = {
68362306a36Sopenharmony_ci	Q6ROUTING_RX_MIXERS(WSA_CODEC_DMA_RX_1) };
68462306a36Sopenharmony_ci
68562306a36Sopenharmony_cistatic const struct snd_kcontrol_new rx_codec_dma_rx_0_mixer_controls[] = {
68662306a36Sopenharmony_ci	Q6ROUTING_RX_MIXERS(RX_CODEC_DMA_RX_0) };
68762306a36Sopenharmony_ci
68862306a36Sopenharmony_cistatic const struct snd_kcontrol_new rx_codec_dma_rx_1_mixer_controls[] = {
68962306a36Sopenharmony_ci	Q6ROUTING_RX_MIXERS(RX_CODEC_DMA_RX_1) };
69062306a36Sopenharmony_ci
69162306a36Sopenharmony_cistatic const struct snd_kcontrol_new rx_codec_dma_rx_2_mixer_controls[] = {
69262306a36Sopenharmony_ci	Q6ROUTING_RX_MIXERS(RX_CODEC_DMA_RX_2) };
69362306a36Sopenharmony_ci
69462306a36Sopenharmony_cistatic const struct snd_kcontrol_new rx_codec_dma_rx_3_mixer_controls[] = {
69562306a36Sopenharmony_ci	Q6ROUTING_RX_MIXERS(RX_CODEC_DMA_RX_3) };
69662306a36Sopenharmony_ci
69762306a36Sopenharmony_cistatic const struct snd_kcontrol_new rx_codec_dma_rx_4_mixer_controls[] = {
69862306a36Sopenharmony_ci	Q6ROUTING_RX_MIXERS(RX_CODEC_DMA_RX_4) };
69962306a36Sopenharmony_ci
70062306a36Sopenharmony_cistatic const struct snd_kcontrol_new rx_codec_dma_rx_5_mixer_controls[] = {
70162306a36Sopenharmony_ci	Q6ROUTING_RX_MIXERS(RX_CODEC_DMA_RX_5) };
70262306a36Sopenharmony_ci
70362306a36Sopenharmony_cistatic const struct snd_kcontrol_new rxcodec_dma_rx_6_mixer_controls[] = {
70462306a36Sopenharmony_ci	Q6ROUTING_RX_MIXERS(RX_CODEC_DMA_RX_6) };
70562306a36Sopenharmony_ci
70662306a36Sopenharmony_cistatic const struct snd_kcontrol_new rx_codec_dma_rx_7_mixer_controls[] = {
70762306a36Sopenharmony_ci	Q6ROUTING_RX_MIXERS(RX_CODEC_DMA_RX_7) };
70862306a36Sopenharmony_ci
70962306a36Sopenharmony_ci
71062306a36Sopenharmony_cistatic const struct snd_kcontrol_new mmul1_mixer_controls[] = {
71162306a36Sopenharmony_ci	Q6ROUTING_TX_MIXERS(MSM_FRONTEND_DAI_MULTIMEDIA1) };
71262306a36Sopenharmony_ci
71362306a36Sopenharmony_cistatic const struct snd_kcontrol_new mmul2_mixer_controls[] = {
71462306a36Sopenharmony_ci	Q6ROUTING_TX_MIXERS(MSM_FRONTEND_DAI_MULTIMEDIA2) };
71562306a36Sopenharmony_ci
71662306a36Sopenharmony_cistatic const struct snd_kcontrol_new mmul3_mixer_controls[] = {
71762306a36Sopenharmony_ci	Q6ROUTING_TX_MIXERS(MSM_FRONTEND_DAI_MULTIMEDIA3) };
71862306a36Sopenharmony_ci
71962306a36Sopenharmony_cistatic const struct snd_kcontrol_new mmul4_mixer_controls[] = {
72062306a36Sopenharmony_ci	Q6ROUTING_TX_MIXERS(MSM_FRONTEND_DAI_MULTIMEDIA4) };
72162306a36Sopenharmony_ci
72262306a36Sopenharmony_cistatic const struct snd_kcontrol_new mmul5_mixer_controls[] = {
72362306a36Sopenharmony_ci	Q6ROUTING_TX_MIXERS(MSM_FRONTEND_DAI_MULTIMEDIA5) };
72462306a36Sopenharmony_ci
72562306a36Sopenharmony_cistatic const struct snd_kcontrol_new mmul6_mixer_controls[] = {
72662306a36Sopenharmony_ci	Q6ROUTING_TX_MIXERS(MSM_FRONTEND_DAI_MULTIMEDIA6) };
72762306a36Sopenharmony_ci
72862306a36Sopenharmony_cistatic const struct snd_kcontrol_new mmul7_mixer_controls[] = {
72962306a36Sopenharmony_ci	Q6ROUTING_TX_MIXERS(MSM_FRONTEND_DAI_MULTIMEDIA7) };
73062306a36Sopenharmony_ci
73162306a36Sopenharmony_cistatic const struct snd_kcontrol_new mmul8_mixer_controls[] = {
73262306a36Sopenharmony_ci	Q6ROUTING_TX_MIXERS(MSM_FRONTEND_DAI_MULTIMEDIA8) };
73362306a36Sopenharmony_ci
73462306a36Sopenharmony_cistatic const struct snd_soc_dapm_widget msm_qdsp6_widgets[] = {
73562306a36Sopenharmony_ci	/* Mixer definitions */
73662306a36Sopenharmony_ci	SND_SOC_DAPM_MIXER("HDMI Mixer", SND_SOC_NOPM, 0, 0,
73762306a36Sopenharmony_ci			   hdmi_mixer_controls,
73862306a36Sopenharmony_ci			   ARRAY_SIZE(hdmi_mixer_controls)),
73962306a36Sopenharmony_ci
74062306a36Sopenharmony_ci	SND_SOC_DAPM_MIXER("DISPLAY_PORT_RX Audio Mixer", SND_SOC_NOPM, 0, 0,
74162306a36Sopenharmony_ci			   display_port_mixer_controls,
74262306a36Sopenharmony_ci			   ARRAY_SIZE(display_port_mixer_controls)),
74362306a36Sopenharmony_ci
74462306a36Sopenharmony_ci	SND_SOC_DAPM_MIXER("SLIMBUS_0_RX Audio Mixer", SND_SOC_NOPM, 0, 0,
74562306a36Sopenharmony_ci			   slimbus_rx_mixer_controls,
74662306a36Sopenharmony_ci			   ARRAY_SIZE(slimbus_rx_mixer_controls)),
74762306a36Sopenharmony_ci	SND_SOC_DAPM_MIXER("SLIMBUS_1_RX Audio Mixer", SND_SOC_NOPM, 0, 0,
74862306a36Sopenharmony_ci			   slimbus_1_rx_mixer_controls,
74962306a36Sopenharmony_ci			   ARRAY_SIZE(slimbus_1_rx_mixer_controls)),
75062306a36Sopenharmony_ci	SND_SOC_DAPM_MIXER("SLIMBUS_2_RX Audio Mixer", SND_SOC_NOPM, 0, 0,
75162306a36Sopenharmony_ci			   slimbus_2_rx_mixer_controls,
75262306a36Sopenharmony_ci			   ARRAY_SIZE(slimbus_2_rx_mixer_controls)),
75362306a36Sopenharmony_ci	SND_SOC_DAPM_MIXER("SLIMBUS_3_RX Audio Mixer", SND_SOC_NOPM, 0, 0,
75462306a36Sopenharmony_ci			   slimbus_3_rx_mixer_controls,
75562306a36Sopenharmony_ci			   ARRAY_SIZE(slimbus_3_rx_mixer_controls)),
75662306a36Sopenharmony_ci	SND_SOC_DAPM_MIXER("SLIMBUS_4_RX Audio Mixer", SND_SOC_NOPM, 0, 0,
75762306a36Sopenharmony_ci			   slimbus_4_rx_mixer_controls,
75862306a36Sopenharmony_ci			   ARRAY_SIZE(slimbus_4_rx_mixer_controls)),
75962306a36Sopenharmony_ci	SND_SOC_DAPM_MIXER("SLIMBUS_5_RX Audio Mixer", SND_SOC_NOPM, 0, 0,
76062306a36Sopenharmony_ci			   slimbus_5_rx_mixer_controls,
76162306a36Sopenharmony_ci			    ARRAY_SIZE(slimbus_5_rx_mixer_controls)),
76262306a36Sopenharmony_ci	SND_SOC_DAPM_MIXER("SLIMBUS_6_RX Audio Mixer", SND_SOC_NOPM, 0, 0,
76362306a36Sopenharmony_ci			   slimbus_6_rx_mixer_controls,
76462306a36Sopenharmony_ci			   ARRAY_SIZE(slimbus_6_rx_mixer_controls)),
76562306a36Sopenharmony_ci	SND_SOC_DAPM_MIXER("PRI_MI2S_RX Audio Mixer", SND_SOC_NOPM, 0, 0,
76662306a36Sopenharmony_ci			   primary_mi2s_rx_mixer_controls,
76762306a36Sopenharmony_ci			   ARRAY_SIZE(primary_mi2s_rx_mixer_controls)),
76862306a36Sopenharmony_ci	SND_SOC_DAPM_MIXER("SEC_MI2S_RX Audio Mixer", SND_SOC_NOPM, 0, 0,
76962306a36Sopenharmony_ci			   secondary_mi2s_rx_mixer_controls,
77062306a36Sopenharmony_ci			   ARRAY_SIZE(secondary_mi2s_rx_mixer_controls)),
77162306a36Sopenharmony_ci	SND_SOC_DAPM_MIXER("QUAT_MI2S_RX Audio Mixer", SND_SOC_NOPM, 0, 0,
77262306a36Sopenharmony_ci			   quaternary_mi2s_rx_mixer_controls,
77362306a36Sopenharmony_ci			   ARRAY_SIZE(quaternary_mi2s_rx_mixer_controls)),
77462306a36Sopenharmony_ci	SND_SOC_DAPM_MIXER("QUIN_MI2S_RX Audio Mixer", SND_SOC_NOPM, 0, 0,
77562306a36Sopenharmony_ci			   quinary_mi2s_rx_mixer_controls,
77662306a36Sopenharmony_ci			   ARRAY_SIZE(quinary_mi2s_rx_mixer_controls)),
77762306a36Sopenharmony_ci	SND_SOC_DAPM_MIXER("TERT_MI2S_RX Audio Mixer", SND_SOC_NOPM, 0, 0,
77862306a36Sopenharmony_ci			   tertiary_mi2s_rx_mixer_controls,
77962306a36Sopenharmony_ci			   ARRAY_SIZE(tertiary_mi2s_rx_mixer_controls)),
78062306a36Sopenharmony_ci	SND_SOC_DAPM_MIXER("PRIMARY_TDM_RX_0 Audio Mixer", SND_SOC_NOPM, 0, 0,
78162306a36Sopenharmony_ci				pri_tdm_rx_0_mixer_controls,
78262306a36Sopenharmony_ci				ARRAY_SIZE(pri_tdm_rx_0_mixer_controls)),
78362306a36Sopenharmony_ci	SND_SOC_DAPM_MIXER("PRIMARY_TDM_RX_1 Audio Mixer", SND_SOC_NOPM, 0, 0,
78462306a36Sopenharmony_ci				pri_tdm_rx_1_mixer_controls,
78562306a36Sopenharmony_ci				ARRAY_SIZE(pri_tdm_rx_1_mixer_controls)),
78662306a36Sopenharmony_ci	SND_SOC_DAPM_MIXER("PRIMARY_TDM_RX_2 Audio Mixer", SND_SOC_NOPM, 0, 0,
78762306a36Sopenharmony_ci				pri_tdm_rx_2_mixer_controls,
78862306a36Sopenharmony_ci				ARRAY_SIZE(pri_tdm_rx_2_mixer_controls)),
78962306a36Sopenharmony_ci	SND_SOC_DAPM_MIXER("PRIMARY_TDM_RX_3 Audio Mixer", SND_SOC_NOPM, 0, 0,
79062306a36Sopenharmony_ci				pri_tdm_rx_3_mixer_controls,
79162306a36Sopenharmony_ci				ARRAY_SIZE(pri_tdm_rx_3_mixer_controls)),
79262306a36Sopenharmony_ci	SND_SOC_DAPM_MIXER("PRIMARY_TDM_RX_4 Audio Mixer", SND_SOC_NOPM, 0, 0,
79362306a36Sopenharmony_ci				pri_tdm_rx_4_mixer_controls,
79462306a36Sopenharmony_ci				ARRAY_SIZE(pri_tdm_rx_4_mixer_controls)),
79562306a36Sopenharmony_ci	SND_SOC_DAPM_MIXER("PRIMARY_TDM_RX_5 Audio Mixer", SND_SOC_NOPM, 0, 0,
79662306a36Sopenharmony_ci				pri_tdm_rx_5_mixer_controls,
79762306a36Sopenharmony_ci				ARRAY_SIZE(pri_tdm_rx_5_mixer_controls)),
79862306a36Sopenharmony_ci	SND_SOC_DAPM_MIXER("PRIMARY_TDM_RX_6 Audio Mixer", SND_SOC_NOPM, 0, 0,
79962306a36Sopenharmony_ci				pri_tdm_rx_6_mixer_controls,
80062306a36Sopenharmony_ci				ARRAY_SIZE(pri_tdm_rx_6_mixer_controls)),
80162306a36Sopenharmony_ci	SND_SOC_DAPM_MIXER("PRIMARY_TDM_RX_7 Audio Mixer", SND_SOC_NOPM, 0, 0,
80262306a36Sopenharmony_ci				pri_tdm_rx_7_mixer_controls,
80362306a36Sopenharmony_ci				ARRAY_SIZE(pri_tdm_rx_7_mixer_controls)),
80462306a36Sopenharmony_ci
80562306a36Sopenharmony_ci	SND_SOC_DAPM_MIXER("SEC_TDM_RX_0 Audio Mixer", SND_SOC_NOPM, 0, 0,
80662306a36Sopenharmony_ci				sec_tdm_rx_0_mixer_controls,
80762306a36Sopenharmony_ci				ARRAY_SIZE(sec_tdm_rx_0_mixer_controls)),
80862306a36Sopenharmony_ci	SND_SOC_DAPM_MIXER("SEC_TDM_RX_1 Audio Mixer", SND_SOC_NOPM, 0, 0,
80962306a36Sopenharmony_ci				sec_tdm_rx_1_mixer_controls,
81062306a36Sopenharmony_ci				ARRAY_SIZE(sec_tdm_rx_1_mixer_controls)),
81162306a36Sopenharmony_ci	SND_SOC_DAPM_MIXER("SEC_TDM_RX_2 Audio Mixer", SND_SOC_NOPM, 0, 0,
81262306a36Sopenharmony_ci				sec_tdm_rx_2_mixer_controls,
81362306a36Sopenharmony_ci				ARRAY_SIZE(sec_tdm_rx_2_mixer_controls)),
81462306a36Sopenharmony_ci	SND_SOC_DAPM_MIXER("SEC_TDM_RX_3 Audio Mixer", SND_SOC_NOPM, 0, 0,
81562306a36Sopenharmony_ci				sec_tdm_rx_3_mixer_controls,
81662306a36Sopenharmony_ci				ARRAY_SIZE(sec_tdm_rx_3_mixer_controls)),
81762306a36Sopenharmony_ci	SND_SOC_DAPM_MIXER("SEC_TDM_RX_4 Audio Mixer", SND_SOC_NOPM, 0, 0,
81862306a36Sopenharmony_ci				sec_tdm_rx_4_mixer_controls,
81962306a36Sopenharmony_ci				ARRAY_SIZE(sec_tdm_rx_4_mixer_controls)),
82062306a36Sopenharmony_ci	SND_SOC_DAPM_MIXER("SEC_TDM_RX_5 Audio Mixer", SND_SOC_NOPM, 0, 0,
82162306a36Sopenharmony_ci				sec_tdm_rx_5_mixer_controls,
82262306a36Sopenharmony_ci				ARRAY_SIZE(sec_tdm_rx_5_mixer_controls)),
82362306a36Sopenharmony_ci	SND_SOC_DAPM_MIXER("SEC_TDM_RX_6 Audio Mixer", SND_SOC_NOPM, 0, 0,
82462306a36Sopenharmony_ci				sec_tdm_rx_6_mixer_controls,
82562306a36Sopenharmony_ci				ARRAY_SIZE(sec_tdm_rx_6_mixer_controls)),
82662306a36Sopenharmony_ci	SND_SOC_DAPM_MIXER("SEC_TDM_RX_7 Audio Mixer", SND_SOC_NOPM, 0, 0,
82762306a36Sopenharmony_ci				sec_tdm_rx_7_mixer_controls,
82862306a36Sopenharmony_ci				ARRAY_SIZE(sec_tdm_rx_7_mixer_controls)),
82962306a36Sopenharmony_ci
83062306a36Sopenharmony_ci	SND_SOC_DAPM_MIXER("TERT_TDM_RX_0 Audio Mixer", SND_SOC_NOPM, 0, 0,
83162306a36Sopenharmony_ci				tert_tdm_rx_0_mixer_controls,
83262306a36Sopenharmony_ci				ARRAY_SIZE(tert_tdm_rx_0_mixer_controls)),
83362306a36Sopenharmony_ci	SND_SOC_DAPM_MIXER("TERT_TDM_RX_1 Audio Mixer", SND_SOC_NOPM, 0, 0,
83462306a36Sopenharmony_ci				tert_tdm_rx_1_mixer_controls,
83562306a36Sopenharmony_ci				ARRAY_SIZE(tert_tdm_rx_1_mixer_controls)),
83662306a36Sopenharmony_ci	SND_SOC_DAPM_MIXER("TERT_TDM_RX_2 Audio Mixer", SND_SOC_NOPM, 0, 0,
83762306a36Sopenharmony_ci				tert_tdm_rx_2_mixer_controls,
83862306a36Sopenharmony_ci				ARRAY_SIZE(tert_tdm_rx_2_mixer_controls)),
83962306a36Sopenharmony_ci	SND_SOC_DAPM_MIXER("TERT_TDM_RX_3 Audio Mixer", SND_SOC_NOPM, 0, 0,
84062306a36Sopenharmony_ci				tert_tdm_rx_3_mixer_controls,
84162306a36Sopenharmony_ci				ARRAY_SIZE(tert_tdm_rx_3_mixer_controls)),
84262306a36Sopenharmony_ci	SND_SOC_DAPM_MIXER("TERT_TDM_RX_4 Audio Mixer", SND_SOC_NOPM, 0, 0,
84362306a36Sopenharmony_ci				tert_tdm_rx_4_mixer_controls,
84462306a36Sopenharmony_ci				ARRAY_SIZE(tert_tdm_rx_4_mixer_controls)),
84562306a36Sopenharmony_ci	SND_SOC_DAPM_MIXER("TERT_TDM_RX_5 Audio Mixer", SND_SOC_NOPM, 0, 0,
84662306a36Sopenharmony_ci				tert_tdm_rx_5_mixer_controls,
84762306a36Sopenharmony_ci				ARRAY_SIZE(tert_tdm_rx_5_mixer_controls)),
84862306a36Sopenharmony_ci	SND_SOC_DAPM_MIXER("TERT_TDM_RX_6 Audio Mixer", SND_SOC_NOPM, 0, 0,
84962306a36Sopenharmony_ci				tert_tdm_rx_6_mixer_controls,
85062306a36Sopenharmony_ci				ARRAY_SIZE(tert_tdm_rx_6_mixer_controls)),
85162306a36Sopenharmony_ci	SND_SOC_DAPM_MIXER("TERT_TDM_RX_7 Audio Mixer", SND_SOC_NOPM, 0, 0,
85262306a36Sopenharmony_ci				tert_tdm_rx_7_mixer_controls,
85362306a36Sopenharmony_ci				ARRAY_SIZE(tert_tdm_rx_7_mixer_controls)),
85462306a36Sopenharmony_ci
85562306a36Sopenharmony_ci	SND_SOC_DAPM_MIXER("QUAT_TDM_RX_0 Audio Mixer", SND_SOC_NOPM, 0, 0,
85662306a36Sopenharmony_ci				quat_tdm_rx_0_mixer_controls,
85762306a36Sopenharmony_ci				ARRAY_SIZE(quat_tdm_rx_0_mixer_controls)),
85862306a36Sopenharmony_ci	SND_SOC_DAPM_MIXER("QUAT_TDM_RX_1 Audio Mixer", SND_SOC_NOPM, 0, 0,
85962306a36Sopenharmony_ci				quat_tdm_rx_1_mixer_controls,
86062306a36Sopenharmony_ci				ARRAY_SIZE(quat_tdm_rx_1_mixer_controls)),
86162306a36Sopenharmony_ci	SND_SOC_DAPM_MIXER("QUAT_TDM_RX_2 Audio Mixer", SND_SOC_NOPM, 0, 0,
86262306a36Sopenharmony_ci				quat_tdm_rx_2_mixer_controls,
86362306a36Sopenharmony_ci				ARRAY_SIZE(quat_tdm_rx_2_mixer_controls)),
86462306a36Sopenharmony_ci	SND_SOC_DAPM_MIXER("QUAT_TDM_RX_3 Audio Mixer", SND_SOC_NOPM, 0, 0,
86562306a36Sopenharmony_ci				quat_tdm_rx_3_mixer_controls,
86662306a36Sopenharmony_ci				ARRAY_SIZE(quat_tdm_rx_3_mixer_controls)),
86762306a36Sopenharmony_ci	SND_SOC_DAPM_MIXER("QUAT_TDM_RX_4 Audio Mixer", SND_SOC_NOPM, 0, 0,
86862306a36Sopenharmony_ci				quat_tdm_rx_4_mixer_controls,
86962306a36Sopenharmony_ci				ARRAY_SIZE(quat_tdm_rx_4_mixer_controls)),
87062306a36Sopenharmony_ci	SND_SOC_DAPM_MIXER("QUAT_TDM_RX_5 Audio Mixer", SND_SOC_NOPM, 0, 0,
87162306a36Sopenharmony_ci				quat_tdm_rx_5_mixer_controls,
87262306a36Sopenharmony_ci				ARRAY_SIZE(quat_tdm_rx_5_mixer_controls)),
87362306a36Sopenharmony_ci	SND_SOC_DAPM_MIXER("QUAT_TDM_RX_6 Audio Mixer", SND_SOC_NOPM, 0, 0,
87462306a36Sopenharmony_ci				quat_tdm_rx_6_mixer_controls,
87562306a36Sopenharmony_ci				ARRAY_SIZE(quat_tdm_rx_6_mixer_controls)),
87662306a36Sopenharmony_ci	SND_SOC_DAPM_MIXER("QUAT_TDM_RX_7 Audio Mixer", SND_SOC_NOPM, 0, 0,
87762306a36Sopenharmony_ci				quat_tdm_rx_7_mixer_controls,
87862306a36Sopenharmony_ci				ARRAY_SIZE(quat_tdm_rx_7_mixer_controls)),
87962306a36Sopenharmony_ci
88062306a36Sopenharmony_ci	SND_SOC_DAPM_MIXER("QUIN_TDM_RX_0 Audio Mixer", SND_SOC_NOPM, 0, 0,
88162306a36Sopenharmony_ci				quin_tdm_rx_0_mixer_controls,
88262306a36Sopenharmony_ci				ARRAY_SIZE(quin_tdm_rx_0_mixer_controls)),
88362306a36Sopenharmony_ci	SND_SOC_DAPM_MIXER("QUIN_TDM_RX_1 Audio Mixer", SND_SOC_NOPM, 0, 0,
88462306a36Sopenharmony_ci				quin_tdm_rx_1_mixer_controls,
88562306a36Sopenharmony_ci				ARRAY_SIZE(quin_tdm_rx_1_mixer_controls)),
88662306a36Sopenharmony_ci	SND_SOC_DAPM_MIXER("QUIN_TDM_RX_2 Audio Mixer", SND_SOC_NOPM, 0, 0,
88762306a36Sopenharmony_ci				quin_tdm_rx_2_mixer_controls,
88862306a36Sopenharmony_ci				ARRAY_SIZE(quin_tdm_rx_2_mixer_controls)),
88962306a36Sopenharmony_ci	SND_SOC_DAPM_MIXER("QUIN_TDM_RX_3 Audio Mixer", SND_SOC_NOPM, 0, 0,
89062306a36Sopenharmony_ci				quin_tdm_rx_3_mixer_controls,
89162306a36Sopenharmony_ci				ARRAY_SIZE(quin_tdm_rx_3_mixer_controls)),
89262306a36Sopenharmony_ci	SND_SOC_DAPM_MIXER("QUIN_TDM_RX_4 Audio Mixer", SND_SOC_NOPM, 0, 0,
89362306a36Sopenharmony_ci				quin_tdm_rx_4_mixer_controls,
89462306a36Sopenharmony_ci				ARRAY_SIZE(quin_tdm_rx_4_mixer_controls)),
89562306a36Sopenharmony_ci	SND_SOC_DAPM_MIXER("QUIN_TDM_RX_5 Audio Mixer", SND_SOC_NOPM, 0, 0,
89662306a36Sopenharmony_ci				quin_tdm_rx_5_mixer_controls,
89762306a36Sopenharmony_ci				ARRAY_SIZE(quin_tdm_rx_5_mixer_controls)),
89862306a36Sopenharmony_ci	SND_SOC_DAPM_MIXER("QUIN_TDM_RX_6 Audio Mixer", SND_SOC_NOPM, 0, 0,
89962306a36Sopenharmony_ci				quin_tdm_rx_6_mixer_controls,
90062306a36Sopenharmony_ci				ARRAY_SIZE(quin_tdm_rx_6_mixer_controls)),
90162306a36Sopenharmony_ci	SND_SOC_DAPM_MIXER("QUIN_TDM_RX_7 Audio Mixer", SND_SOC_NOPM, 0, 0,
90262306a36Sopenharmony_ci				quin_tdm_rx_7_mixer_controls,
90362306a36Sopenharmony_ci				ARRAY_SIZE(quin_tdm_rx_7_mixer_controls)),
90462306a36Sopenharmony_ci
90562306a36Sopenharmony_ci	SND_SOC_DAPM_MIXER("WSA_CODEC_DMA_RX_0 Audio Mixer", SND_SOC_NOPM, 0, 0,
90662306a36Sopenharmony_ci		wsa_codec_dma_rx_0_mixer_controls,
90762306a36Sopenharmony_ci		ARRAY_SIZE(wsa_codec_dma_rx_0_mixer_controls)),
90862306a36Sopenharmony_ci	SND_SOC_DAPM_MIXER("WSA_CODEC_DMA_RX_1 Audio Mixer", SND_SOC_NOPM, 0, 0,
90962306a36Sopenharmony_ci		wsa_codec_dma_rx_1_mixer_controls,
91062306a36Sopenharmony_ci		ARRAY_SIZE(wsa_codec_dma_rx_1_mixer_controls)),
91162306a36Sopenharmony_ci	SND_SOC_DAPM_MIXER("RX_CODEC_DMA_RX_0 Audio Mixer", SND_SOC_NOPM, 0, 0,
91262306a36Sopenharmony_ci		rx_codec_dma_rx_0_mixer_controls,
91362306a36Sopenharmony_ci		ARRAY_SIZE(rx_codec_dma_rx_0_mixer_controls)),
91462306a36Sopenharmony_ci	SND_SOC_DAPM_MIXER("RX_CODEC_DMA_RX_1 Audio Mixer", SND_SOC_NOPM, 0, 0,
91562306a36Sopenharmony_ci		rx_codec_dma_rx_1_mixer_controls,
91662306a36Sopenharmony_ci		ARRAY_SIZE(rx_codec_dma_rx_1_mixer_controls)),
91762306a36Sopenharmony_ci	SND_SOC_DAPM_MIXER("RX_CODEC_DMA_RX_2 Audio Mixer", SND_SOC_NOPM, 0, 0,
91862306a36Sopenharmony_ci		rx_codec_dma_rx_2_mixer_controls,
91962306a36Sopenharmony_ci		ARRAY_SIZE(rx_codec_dma_rx_2_mixer_controls)),
92062306a36Sopenharmony_ci	SND_SOC_DAPM_MIXER("RX_CODEC_DMA_RX_3 Audio Mixer", SND_SOC_NOPM, 0, 0,
92162306a36Sopenharmony_ci		rx_codec_dma_rx_3_mixer_controls,
92262306a36Sopenharmony_ci		ARRAY_SIZE(rx_codec_dma_rx_3_mixer_controls)),
92362306a36Sopenharmony_ci	SND_SOC_DAPM_MIXER("RX_CODEC_DMA_RX_4 Audio Mixer", SND_SOC_NOPM, 0, 0,
92462306a36Sopenharmony_ci		rx_codec_dma_rx_4_mixer_controls,
92562306a36Sopenharmony_ci		ARRAY_SIZE(rx_codec_dma_rx_4_mixer_controls)),
92662306a36Sopenharmony_ci	SND_SOC_DAPM_MIXER("RX_CODEC_DMA_RX_5 Audio Mixer", SND_SOC_NOPM, 0, 0,
92762306a36Sopenharmony_ci		rx_codec_dma_rx_5_mixer_controls,
92862306a36Sopenharmony_ci		ARRAY_SIZE(rx_codec_dma_rx_5_mixer_controls)),
92962306a36Sopenharmony_ci	SND_SOC_DAPM_MIXER("RX_CODEC_DMA_RX_6 Audio Mixer", SND_SOC_NOPM, 0, 0,
93062306a36Sopenharmony_ci		rxcodec_dma_rx_6_mixer_controls,
93162306a36Sopenharmony_ci		ARRAY_SIZE(rxcodec_dma_rx_6_mixer_controls)),
93262306a36Sopenharmony_ci	SND_SOC_DAPM_MIXER("RX_CODEC_DMA_RX_7 Audio Mixer", SND_SOC_NOPM, 0, 0,
93362306a36Sopenharmony_ci		rx_codec_dma_rx_7_mixer_controls,
93462306a36Sopenharmony_ci		ARRAY_SIZE(rx_codec_dma_rx_7_mixer_controls)),
93562306a36Sopenharmony_ci	SND_SOC_DAPM_MIXER("MultiMedia1 Mixer", SND_SOC_NOPM, 0, 0,
93662306a36Sopenharmony_ci		mmul1_mixer_controls, ARRAY_SIZE(mmul1_mixer_controls)),
93762306a36Sopenharmony_ci	SND_SOC_DAPM_MIXER("MultiMedia2 Mixer", SND_SOC_NOPM, 0, 0,
93862306a36Sopenharmony_ci		mmul2_mixer_controls, ARRAY_SIZE(mmul2_mixer_controls)),
93962306a36Sopenharmony_ci	SND_SOC_DAPM_MIXER("MultiMedia3 Mixer", SND_SOC_NOPM, 0, 0,
94062306a36Sopenharmony_ci		mmul3_mixer_controls, ARRAY_SIZE(mmul3_mixer_controls)),
94162306a36Sopenharmony_ci	SND_SOC_DAPM_MIXER("MultiMedia4 Mixer", SND_SOC_NOPM, 0, 0,
94262306a36Sopenharmony_ci		mmul4_mixer_controls, ARRAY_SIZE(mmul4_mixer_controls)),
94362306a36Sopenharmony_ci	SND_SOC_DAPM_MIXER("MultiMedia5 Mixer", SND_SOC_NOPM, 0, 0,
94462306a36Sopenharmony_ci		mmul5_mixer_controls, ARRAY_SIZE(mmul5_mixer_controls)),
94562306a36Sopenharmony_ci	SND_SOC_DAPM_MIXER("MultiMedia6 Mixer", SND_SOC_NOPM, 0, 0,
94662306a36Sopenharmony_ci		mmul6_mixer_controls, ARRAY_SIZE(mmul6_mixer_controls)),
94762306a36Sopenharmony_ci	SND_SOC_DAPM_MIXER("MultiMedia7 Mixer", SND_SOC_NOPM, 0, 0,
94862306a36Sopenharmony_ci		mmul7_mixer_controls, ARRAY_SIZE(mmul7_mixer_controls)),
94962306a36Sopenharmony_ci	SND_SOC_DAPM_MIXER("MultiMedia8 Mixer", SND_SOC_NOPM, 0, 0,
95062306a36Sopenharmony_ci		mmul8_mixer_controls, ARRAY_SIZE(mmul8_mixer_controls)),
95162306a36Sopenharmony_ci
95262306a36Sopenharmony_ci};
95362306a36Sopenharmony_ci
95462306a36Sopenharmony_cistatic const struct snd_soc_dapm_route intercon[] = {
95562306a36Sopenharmony_ci	Q6ROUTING_RX_DAPM_ROUTE("HDMI Mixer", "HDMI_RX"),
95662306a36Sopenharmony_ci	Q6ROUTING_RX_DAPM_ROUTE("DISPLAY_PORT_RX Audio Mixer",
95762306a36Sopenharmony_ci				"DISPLAY_PORT_RX"),
95862306a36Sopenharmony_ci	Q6ROUTING_RX_DAPM_ROUTE("SLIMBUS_0_RX Audio Mixer", "SLIMBUS_0_RX"),
95962306a36Sopenharmony_ci	Q6ROUTING_RX_DAPM_ROUTE("SLIMBUS_1_RX Audio Mixer", "SLIMBUS_1_RX"),
96062306a36Sopenharmony_ci	Q6ROUTING_RX_DAPM_ROUTE("SLIMBUS_2_RX Audio Mixer", "SLIMBUS_2_RX"),
96162306a36Sopenharmony_ci	Q6ROUTING_RX_DAPM_ROUTE("SLIMBUS_3_RX Audio Mixer", "SLIMBUS_3_RX"),
96262306a36Sopenharmony_ci	Q6ROUTING_RX_DAPM_ROUTE("SLIMBUS_4_RX Audio Mixer", "SLIMBUS_4_RX"),
96362306a36Sopenharmony_ci	Q6ROUTING_RX_DAPM_ROUTE("SLIMBUS_5_RX Audio Mixer", "SLIMBUS_5_RX"),
96462306a36Sopenharmony_ci	Q6ROUTING_RX_DAPM_ROUTE("SLIMBUS_6_RX Audio Mixer", "SLIMBUS_6_RX"),
96562306a36Sopenharmony_ci	Q6ROUTING_RX_DAPM_ROUTE("QUAT_MI2S_RX Audio Mixer", "QUAT_MI2S_RX"),
96662306a36Sopenharmony_ci	Q6ROUTING_RX_DAPM_ROUTE("QUIN_MI2S_RX Audio Mixer", "QUIN_MI2S_RX"),
96762306a36Sopenharmony_ci	Q6ROUTING_RX_DAPM_ROUTE("TERT_MI2S_RX Audio Mixer", "TERT_MI2S_RX"),
96862306a36Sopenharmony_ci	Q6ROUTING_RX_DAPM_ROUTE("SEC_MI2S_RX Audio Mixer", "SEC_MI2S_RX"),
96962306a36Sopenharmony_ci	Q6ROUTING_RX_DAPM_ROUTE("PRI_MI2S_RX Audio Mixer", "PRI_MI2S_RX"),
97062306a36Sopenharmony_ci	Q6ROUTING_RX_DAPM_ROUTE("PRIMARY_TDM_RX_0 Audio Mixer",
97162306a36Sopenharmony_ci				"PRIMARY_TDM_RX_0"),
97262306a36Sopenharmony_ci	Q6ROUTING_RX_DAPM_ROUTE("PRIMARY_TDM_RX_1 Audio Mixer",
97362306a36Sopenharmony_ci				"PRIMARY_TDM_RX_1"),
97462306a36Sopenharmony_ci	Q6ROUTING_RX_DAPM_ROUTE("PRIMARY_TDM_RX_2 Audio Mixer",
97562306a36Sopenharmony_ci				"PRIMARY_TDM_RX_2"),
97662306a36Sopenharmony_ci	Q6ROUTING_RX_DAPM_ROUTE("PRIMARY_TDM_RX_3 Audio Mixer",
97762306a36Sopenharmony_ci				"PRIMARY_TDM_RX_3"),
97862306a36Sopenharmony_ci	Q6ROUTING_RX_DAPM_ROUTE("PRIMARY_TDM_RX_4 Audio Mixer",
97962306a36Sopenharmony_ci				"PRIMARY_TDM_RX_4"),
98062306a36Sopenharmony_ci	Q6ROUTING_RX_DAPM_ROUTE("PRIMARY_TDM_RX_5 Audio Mixer",
98162306a36Sopenharmony_ci				"PRIMARY_TDM_RX_5"),
98262306a36Sopenharmony_ci	Q6ROUTING_RX_DAPM_ROUTE("PRIMARY_TDM_RX_6 Audio Mixer",
98362306a36Sopenharmony_ci				"PRIMARY_TDM_RX_6"),
98462306a36Sopenharmony_ci	Q6ROUTING_RX_DAPM_ROUTE("PRIMARY_TDM_RX_7 Audio Mixer",
98562306a36Sopenharmony_ci				"PRIMARY_TDM_RX_7"),
98662306a36Sopenharmony_ci	Q6ROUTING_RX_DAPM_ROUTE("SEC_TDM_RX_0 Audio Mixer", "SEC_TDM_RX_0"),
98762306a36Sopenharmony_ci	Q6ROUTING_RX_DAPM_ROUTE("SEC_TDM_RX_1 Audio Mixer", "SEC_TDM_RX_1"),
98862306a36Sopenharmony_ci	Q6ROUTING_RX_DAPM_ROUTE("SEC_TDM_RX_2 Audio Mixer", "SEC_TDM_RX_2"),
98962306a36Sopenharmony_ci	Q6ROUTING_RX_DAPM_ROUTE("SEC_TDM_RX_3 Audio Mixer", "SEC_TDM_RX_3"),
99062306a36Sopenharmony_ci	Q6ROUTING_RX_DAPM_ROUTE("SEC_TDM_RX_4 Audio Mixer", "SEC_TDM_RX_4"),
99162306a36Sopenharmony_ci	Q6ROUTING_RX_DAPM_ROUTE("SEC_TDM_RX_5 Audio Mixer", "SEC_TDM_RX_5"),
99262306a36Sopenharmony_ci	Q6ROUTING_RX_DAPM_ROUTE("SEC_TDM_RX_6 Audio Mixer", "SEC_TDM_RX_6"),
99362306a36Sopenharmony_ci	Q6ROUTING_RX_DAPM_ROUTE("SEC_TDM_RX_7 Audio Mixer", "SEC_TDM_RX_7"),
99462306a36Sopenharmony_ci	Q6ROUTING_RX_DAPM_ROUTE("TERT_TDM_RX_0 Audio Mixer", "TERT_TDM_RX_0"),
99562306a36Sopenharmony_ci	Q6ROUTING_RX_DAPM_ROUTE("TERT_TDM_RX_1 Audio Mixer", "TERT_TDM_RX_1"),
99662306a36Sopenharmony_ci	Q6ROUTING_RX_DAPM_ROUTE("TERT_TDM_RX_2 Audio Mixer", "TERT_TDM_RX_2"),
99762306a36Sopenharmony_ci	Q6ROUTING_RX_DAPM_ROUTE("TERT_TDM_RX_3 Audio Mixer", "TERT_TDM_RX_3"),
99862306a36Sopenharmony_ci	Q6ROUTING_RX_DAPM_ROUTE("TERT_TDM_RX_4 Audio Mixer", "TERT_TDM_RX_4"),
99962306a36Sopenharmony_ci	Q6ROUTING_RX_DAPM_ROUTE("TERT_TDM_RX_5 Audio Mixer", "TERT_TDM_RX_5"),
100062306a36Sopenharmony_ci	Q6ROUTING_RX_DAPM_ROUTE("TERT_TDM_RX_6 Audio Mixer", "TERT_TDM_RX_6"),
100162306a36Sopenharmony_ci	Q6ROUTING_RX_DAPM_ROUTE("TERT_TDM_RX_7 Audio Mixer", "TERT_TDM_RX_7"),
100262306a36Sopenharmony_ci	Q6ROUTING_RX_DAPM_ROUTE("QUAT_TDM_RX_0 Audio Mixer", "QUAT_TDM_RX_0"),
100362306a36Sopenharmony_ci	Q6ROUTING_RX_DAPM_ROUTE("QUAT_TDM_RX_1 Audio Mixer", "QUAT_TDM_RX_1"),
100462306a36Sopenharmony_ci	Q6ROUTING_RX_DAPM_ROUTE("QUAT_TDM_RX_2 Audio Mixer", "QUAT_TDM_RX_2"),
100562306a36Sopenharmony_ci	Q6ROUTING_RX_DAPM_ROUTE("QUAT_TDM_RX_3 Audio Mixer", "QUAT_TDM_RX_3"),
100662306a36Sopenharmony_ci	Q6ROUTING_RX_DAPM_ROUTE("QUAT_TDM_RX_4 Audio Mixer", "QUAT_TDM_RX_4"),
100762306a36Sopenharmony_ci	Q6ROUTING_RX_DAPM_ROUTE("QUAT_TDM_RX_5 Audio Mixer", "QUAT_TDM_RX_5"),
100862306a36Sopenharmony_ci	Q6ROUTING_RX_DAPM_ROUTE("QUAT_TDM_RX_6 Audio Mixer", "QUAT_TDM_RX_6"),
100962306a36Sopenharmony_ci	Q6ROUTING_RX_DAPM_ROUTE("QUAT_TDM_RX_7 Audio Mixer", "QUAT_TDM_RX_7"),
101062306a36Sopenharmony_ci	Q6ROUTING_RX_DAPM_ROUTE("QUIN_TDM_RX_0 Audio Mixer", "QUIN_TDM_RX_0"),
101162306a36Sopenharmony_ci	Q6ROUTING_RX_DAPM_ROUTE("QUIN_TDM_RX_1 Audio Mixer", "QUIN_TDM_RX_1"),
101262306a36Sopenharmony_ci	Q6ROUTING_RX_DAPM_ROUTE("QUIN_TDM_RX_2 Audio Mixer", "QUIN_TDM_RX_2"),
101362306a36Sopenharmony_ci	Q6ROUTING_RX_DAPM_ROUTE("QUIN_TDM_RX_3 Audio Mixer", "QUIN_TDM_RX_3"),
101462306a36Sopenharmony_ci	Q6ROUTING_RX_DAPM_ROUTE("QUIN_TDM_RX_4 Audio Mixer", "QUIN_TDM_RX_4"),
101562306a36Sopenharmony_ci	Q6ROUTING_RX_DAPM_ROUTE("QUIN_TDM_RX_5 Audio Mixer", "QUIN_TDM_RX_5"),
101662306a36Sopenharmony_ci	Q6ROUTING_RX_DAPM_ROUTE("QUIN_TDM_RX_6 Audio Mixer", "QUIN_TDM_RX_6"),
101762306a36Sopenharmony_ci	Q6ROUTING_RX_DAPM_ROUTE("QUIN_TDM_RX_7 Audio Mixer", "QUIN_TDM_RX_7"),
101862306a36Sopenharmony_ci	Q6ROUTING_RX_DAPM_ROUTE("WSA_CODEC_DMA_RX_0 Audio Mixer", "WSA_CODEC_DMA_RX_0"),
101962306a36Sopenharmony_ci	Q6ROUTING_RX_DAPM_ROUTE("WSA_CODEC_DMA_RX_1 Audio Mixer", "WSA_CODEC_DMA_RX_1"),
102062306a36Sopenharmony_ci	Q6ROUTING_RX_DAPM_ROUTE("RX_CODEC_DMA_RX_0 Audio Mixer", "RX_CODEC_DMA_RX_0"),
102162306a36Sopenharmony_ci	Q6ROUTING_RX_DAPM_ROUTE("RX_CODEC_DMA_RX_1 Audio Mixer", "RX_CODEC_DMA_RX_1"),
102262306a36Sopenharmony_ci	Q6ROUTING_RX_DAPM_ROUTE("RX_CODEC_DMA_RX_2 Audio Mixer", "RX_CODEC_DMA_RX_2"),
102362306a36Sopenharmony_ci	Q6ROUTING_RX_DAPM_ROUTE("RX_CODEC_DMA_RX_3 Audio Mixer", "RX_CODEC_DMA_RX_3"),
102462306a36Sopenharmony_ci	Q6ROUTING_RX_DAPM_ROUTE("RX_CODEC_DMA_RX_4 Audio Mixer", "RX_CODEC_DMA_RX_4"),
102562306a36Sopenharmony_ci	Q6ROUTING_RX_DAPM_ROUTE("RX_CODEC_DMA_RX_5 Audio Mixer", "RX_CODEC_DMA_RX_5"),
102662306a36Sopenharmony_ci	Q6ROUTING_RX_DAPM_ROUTE("RX_CODEC_DMA_RX_6 Audio Mixer", "RX_CODEC_DMA_RX_6"),
102762306a36Sopenharmony_ci	Q6ROUTING_RX_DAPM_ROUTE("RX_CODEC_DMA_RX_7 Audio Mixer", "RX_CODEC_DMA_RX_7"),
102862306a36Sopenharmony_ci	Q6ROUTING_TX_DAPM_ROUTE("MultiMedia1 Mixer"),
102962306a36Sopenharmony_ci	Q6ROUTING_TX_DAPM_ROUTE("MultiMedia2 Mixer"),
103062306a36Sopenharmony_ci	Q6ROUTING_TX_DAPM_ROUTE("MultiMedia3 Mixer"),
103162306a36Sopenharmony_ci	Q6ROUTING_TX_DAPM_ROUTE("MultiMedia4 Mixer"),
103262306a36Sopenharmony_ci	Q6ROUTING_TX_DAPM_ROUTE("MultiMedia5 Mixer"),
103362306a36Sopenharmony_ci	Q6ROUTING_TX_DAPM_ROUTE("MultiMedia6 Mixer"),
103462306a36Sopenharmony_ci	Q6ROUTING_TX_DAPM_ROUTE("MultiMedia7 Mixer"),
103562306a36Sopenharmony_ci	Q6ROUTING_TX_DAPM_ROUTE("MultiMedia8 Mixer"),
103662306a36Sopenharmony_ci
103762306a36Sopenharmony_ci	{"MM_UL1", NULL, "MultiMedia1 Mixer"},
103862306a36Sopenharmony_ci	{"MM_UL2", NULL, "MultiMedia2 Mixer"},
103962306a36Sopenharmony_ci	{"MM_UL3", NULL, "MultiMedia3 Mixer"},
104062306a36Sopenharmony_ci	{"MM_UL4", NULL, "MultiMedia4 Mixer"},
104162306a36Sopenharmony_ci	{"MM_UL5", NULL, "MultiMedia5 Mixer"},
104262306a36Sopenharmony_ci	{"MM_UL6", NULL, "MultiMedia6 Mixer"},
104362306a36Sopenharmony_ci	{"MM_UL7", NULL, "MultiMedia7 Mixer"},
104462306a36Sopenharmony_ci	{"MM_UL8", NULL, "MultiMedia8 Mixer"},
104562306a36Sopenharmony_ci};
104662306a36Sopenharmony_ci
104762306a36Sopenharmony_cistatic int routing_hw_params(struct snd_soc_component *component,
104862306a36Sopenharmony_ci			     struct snd_pcm_substream *substream,
104962306a36Sopenharmony_ci			     struct snd_pcm_hw_params *params)
105062306a36Sopenharmony_ci{
105162306a36Sopenharmony_ci	struct snd_soc_pcm_runtime *rtd = snd_soc_substream_to_rtd(substream);
105262306a36Sopenharmony_ci	struct msm_routing_data *data = dev_get_drvdata(component->dev);
105362306a36Sopenharmony_ci	unsigned int be_id = snd_soc_rtd_to_cpu(rtd, 0)->id;
105462306a36Sopenharmony_ci	struct session_data *session;
105562306a36Sopenharmony_ci	int path_type;
105662306a36Sopenharmony_ci
105762306a36Sopenharmony_ci	if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
105862306a36Sopenharmony_ci		path_type = ADM_PATH_PLAYBACK;
105962306a36Sopenharmony_ci	else
106062306a36Sopenharmony_ci		path_type = ADM_PATH_LIVE_REC;
106162306a36Sopenharmony_ci
106262306a36Sopenharmony_ci	if (be_id >= AFE_MAX_PORTS)
106362306a36Sopenharmony_ci		return -EINVAL;
106462306a36Sopenharmony_ci
106562306a36Sopenharmony_ci	session = &data->port_data[be_id];
106662306a36Sopenharmony_ci
106762306a36Sopenharmony_ci	mutex_lock(&data->lock);
106862306a36Sopenharmony_ci
106962306a36Sopenharmony_ci	session->path_type = path_type;
107062306a36Sopenharmony_ci	session->sample_rate = params_rate(params);
107162306a36Sopenharmony_ci	session->channels = params_channels(params);
107262306a36Sopenharmony_ci
107362306a36Sopenharmony_ci	switch (params_format(params)) {
107462306a36Sopenharmony_ci	case SNDRV_PCM_FORMAT_S16_LE:
107562306a36Sopenharmony_ci			session->bits_per_sample = 16;
107662306a36Sopenharmony_ci		break;
107762306a36Sopenharmony_ci	case SNDRV_PCM_FORMAT_S24_LE:
107862306a36Sopenharmony_ci			session->bits_per_sample = 24;
107962306a36Sopenharmony_ci		break;
108062306a36Sopenharmony_ci	default:
108162306a36Sopenharmony_ci		break;
108262306a36Sopenharmony_ci	}
108362306a36Sopenharmony_ci
108462306a36Sopenharmony_ci	mutex_unlock(&data->lock);
108562306a36Sopenharmony_ci	return 0;
108662306a36Sopenharmony_ci}
108762306a36Sopenharmony_ci
108862306a36Sopenharmony_cistatic int msm_routing_probe(struct snd_soc_component *c)
108962306a36Sopenharmony_ci{
109062306a36Sopenharmony_ci	int i;
109162306a36Sopenharmony_ci
109262306a36Sopenharmony_ci	for (i = 0; i < MAX_SESSIONS; i++) {
109362306a36Sopenharmony_ci		routing_data->sessions[i].port_id = -1;
109462306a36Sopenharmony_ci		routing_data->sessions[i].fedai_id = -1;
109562306a36Sopenharmony_ci	}
109662306a36Sopenharmony_ci
109762306a36Sopenharmony_ci	return 0;
109862306a36Sopenharmony_ci}
109962306a36Sopenharmony_ci
110062306a36Sopenharmony_cistatic unsigned int q6routing_reg_read(struct snd_soc_component *component,
110162306a36Sopenharmony_ci				       unsigned int reg)
110262306a36Sopenharmony_ci{
110362306a36Sopenharmony_ci	/* default value */
110462306a36Sopenharmony_ci	return 0;
110562306a36Sopenharmony_ci}
110662306a36Sopenharmony_ci
110762306a36Sopenharmony_cistatic int q6routing_reg_write(struct snd_soc_component *component,
110862306a36Sopenharmony_ci			       unsigned int reg, unsigned int val)
110962306a36Sopenharmony_ci{
111062306a36Sopenharmony_ci	/* dummy */
111162306a36Sopenharmony_ci	return 0;
111262306a36Sopenharmony_ci}
111362306a36Sopenharmony_ci
111462306a36Sopenharmony_cistatic const struct snd_soc_component_driver msm_soc_routing_component = {
111562306a36Sopenharmony_ci	.probe = msm_routing_probe,
111662306a36Sopenharmony_ci	.name = DRV_NAME,
111762306a36Sopenharmony_ci	.hw_params = routing_hw_params,
111862306a36Sopenharmony_ci	.dapm_widgets = msm_qdsp6_widgets,
111962306a36Sopenharmony_ci	.num_dapm_widgets = ARRAY_SIZE(msm_qdsp6_widgets),
112062306a36Sopenharmony_ci	.dapm_routes = intercon,
112162306a36Sopenharmony_ci	.num_dapm_routes = ARRAY_SIZE(intercon),
112262306a36Sopenharmony_ci	.read = q6routing_reg_read,
112362306a36Sopenharmony_ci	.write = q6routing_reg_write,
112462306a36Sopenharmony_ci};
112562306a36Sopenharmony_ci
112662306a36Sopenharmony_cistatic int q6pcm_routing_probe(struct platform_device *pdev)
112762306a36Sopenharmony_ci{
112862306a36Sopenharmony_ci	struct device *dev = &pdev->dev;
112962306a36Sopenharmony_ci
113062306a36Sopenharmony_ci	routing_data = kzalloc(sizeof(*routing_data), GFP_KERNEL);
113162306a36Sopenharmony_ci	if (!routing_data)
113262306a36Sopenharmony_ci		return -ENOMEM;
113362306a36Sopenharmony_ci
113462306a36Sopenharmony_ci	routing_data->dev = dev;
113562306a36Sopenharmony_ci
113662306a36Sopenharmony_ci	mutex_init(&routing_data->lock);
113762306a36Sopenharmony_ci	dev_set_drvdata(dev, routing_data);
113862306a36Sopenharmony_ci
113962306a36Sopenharmony_ci	return devm_snd_soc_register_component(dev, &msm_soc_routing_component,
114062306a36Sopenharmony_ci					  NULL, 0);
114162306a36Sopenharmony_ci}
114262306a36Sopenharmony_ci
114362306a36Sopenharmony_cistatic void q6pcm_routing_remove(struct platform_device *pdev)
114462306a36Sopenharmony_ci{
114562306a36Sopenharmony_ci	kfree(routing_data);
114662306a36Sopenharmony_ci	routing_data = NULL;
114762306a36Sopenharmony_ci}
114862306a36Sopenharmony_ci
114962306a36Sopenharmony_ci#ifdef CONFIG_OF
115062306a36Sopenharmony_cistatic const struct of_device_id q6pcm_routing_device_id[] = {
115162306a36Sopenharmony_ci	{ .compatible = "qcom,q6adm-routing" },
115262306a36Sopenharmony_ci	{},
115362306a36Sopenharmony_ci};
115462306a36Sopenharmony_ciMODULE_DEVICE_TABLE(of, q6pcm_routing_device_id);
115562306a36Sopenharmony_ci#endif
115662306a36Sopenharmony_ci
115762306a36Sopenharmony_cistatic struct platform_driver q6pcm_routing_platform_driver = {
115862306a36Sopenharmony_ci	.driver = {
115962306a36Sopenharmony_ci		.name = "q6routing",
116062306a36Sopenharmony_ci		.of_match_table = of_match_ptr(q6pcm_routing_device_id),
116162306a36Sopenharmony_ci	},
116262306a36Sopenharmony_ci	.probe = q6pcm_routing_probe,
116362306a36Sopenharmony_ci	.remove_new = q6pcm_routing_remove,
116462306a36Sopenharmony_ci};
116562306a36Sopenharmony_cimodule_platform_driver(q6pcm_routing_platform_driver);
116662306a36Sopenharmony_ci
116762306a36Sopenharmony_ciMODULE_DESCRIPTION("Q6 Routing platform");
116862306a36Sopenharmony_ciMODULE_LICENSE("GPL v2");
1169