File Index
Files and directories
Sign in
FILE

q6routing.c

File preview with syntax highlighting.

linux-6.19.14/sound/soc/qcom/qdsp6/q6routing.c C
   1// SPDX-License-Identifier: GPL-2.0
   2// Copyright (c) 2011-2017, The Linux Foundation. All rights reserved.
   3// Copyright (c) 2018, Linaro Limited
   4
   5#include <dt-bindings/sound/qcom,q6asm.h>
   6#include <dt-bindings/sound/qcom,q6afe.h>
   7#include <linux/init.h>
   8#include <linux/err.h>
   9#include <linux/module.h>
  10#include <linux/of.h>
  11#include <linux/platform_device.h>
  12#include <linux/bitops.h>
  13#include <linux/mutex.h>
  14#include <linux/slab.h>
  15#include <sound/core.h>
  16#include <sound/soc.h>
  17#include <sound/soc-dapm.h>
  18#include <sound/pcm.h>
  19#include <sound/control.h>
  20#include <sound/asound.h>
  21#include <sound/pcm_params.h>
  22#include "q6afe.h"
  23#include "q6asm.h"
  24#include "q6adm.h"
  25#include "q6routing.h"
  26
  27#define DRV_NAME "q6routing-component"
  28
  29#define Q6ROUTING_RX_MIXERS(id)						\
  30	SOC_SINGLE_EXT("MultiMedia1", id,				\
  31	MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer,\
  32	msm_routing_put_audio_mixer),					\
  33	SOC_SINGLE_EXT("MultiMedia2", id,				\
  34	MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer,\
  35	msm_routing_put_audio_mixer),					\
  36	SOC_SINGLE_EXT("MultiMedia3", id,				\
  37	MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer,\
  38	msm_routing_put_audio_mixer),					\
  39	SOC_SINGLE_EXT("MultiMedia4", id,				\
  40	MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer,\
  41	msm_routing_put_audio_mixer),					\
  42	SOC_SINGLE_EXT("MultiMedia5", id,				\
  43	MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer,\
  44	msm_routing_put_audio_mixer),					\
  45	SOC_SINGLE_EXT("MultiMedia6", id,				\
  46	MSM_FRONTEND_DAI_MULTIMEDIA6, 1, 0, msm_routing_get_audio_mixer,\
  47	msm_routing_put_audio_mixer),					\
  48	SOC_SINGLE_EXT("MultiMedia7", id,				\
  49	MSM_FRONTEND_DAI_MULTIMEDIA7, 1, 0, msm_routing_get_audio_mixer,\
  50	msm_routing_put_audio_mixer),					\
  51	SOC_SINGLE_EXT("MultiMedia8", id,				\
  52	MSM_FRONTEND_DAI_MULTIMEDIA8, 1, 0, msm_routing_get_audio_mixer,\
  53	msm_routing_put_audio_mixer),
  54
  55#define Q6ROUTING_RX_DAPM_ROUTE(mix_name, s)	\
  56	{ mix_name, "MultiMedia1", "MM_DL1" },	\
  57	{ mix_name, "MultiMedia2", "MM_DL2" },	\
  58	{ mix_name, "MultiMedia3", "MM_DL3" },	\
  59	{ mix_name, "MultiMedia4", "MM_DL4" },	\
  60	{ mix_name, "MultiMedia5", "MM_DL5" },	\
  61	{ mix_name, "MultiMedia6", "MM_DL6" },	\
  62	{ mix_name, "MultiMedia7", "MM_DL7" },	\
  63	{ mix_name, "MultiMedia8", "MM_DL8" },	\
  64	{ s, NULL, mix_name }
  65
  66#define Q6ROUTING_TX_DAPM_ROUTE(mix_name)		\
  67	{ mix_name, "PRI_MI2S_TX", "PRI_MI2S_TX" },	\
  68	{ mix_name, "SEC_MI2S_TX", "SEC_MI2S_TX" },	\
  69	{ mix_name, "QUAT_MI2S_TX", "QUAT_MI2S_TX" },	\
  70	{ mix_name, "QUIN_MI2S_TX", "QUIN_MI2S_TX" },	\
  71	{ mix_name, "TERT_MI2S_TX", "TERT_MI2S_TX" },		\
  72	{ mix_name, "SLIMBUS_0_TX", "SLIMBUS_0_TX" },		\
  73	{ mix_name, "SLIMBUS_1_TX", "SLIMBUS_1_TX" },		\
  74	{ mix_name, "SLIMBUS_2_TX", "SLIMBUS_2_TX" },		\
  75	{ mix_name, "SLIMBUS_3_TX", "SLIMBUS_3_TX" },		\
  76	{ mix_name, "SLIMBUS_4_TX", "SLIMBUS_4_TX" },		\
  77	{ mix_name, "SLIMBUS_5_TX", "SLIMBUS_5_TX" },		\
  78	{ mix_name, "SLIMBUS_6_TX", "SLIMBUS_6_TX" },		\
  79	{ mix_name, "PRIMARY_TDM_TX_0", "PRIMARY_TDM_TX_0"},	\
  80	{ mix_name, "PRIMARY_TDM_TX_1", "PRIMARY_TDM_TX_1"},	\
  81	{ mix_name, "PRIMARY_TDM_TX_2", "PRIMARY_TDM_TX_2"},	\
  82	{ mix_name, "PRIMARY_TDM_TX_3", "PRIMARY_TDM_TX_3"},	\
  83	{ mix_name, "PRIMARY_TDM_TX_4", "PRIMARY_TDM_TX_4"},	\
  84	{ mix_name, "PRIMARY_TDM_TX_5", "PRIMARY_TDM_TX_5"},	\
  85	{ mix_name, "PRIMARY_TDM_TX_6", "PRIMARY_TDM_TX_6"},	\
  86	{ mix_name, "PRIMARY_TDM_TX_7", "PRIMARY_TDM_TX_7"},	\
  87	{ mix_name, "SEC_TDM_TX_0", "SEC_TDM_TX_0"},		\
  88	{ mix_name, "SEC_TDM_TX_1", "SEC_TDM_TX_1"},		\
  89	{ mix_name, "SEC_TDM_TX_2", "SEC_TDM_TX_2"},		\
  90	{ mix_name, "SEC_TDM_TX_3", "SEC_TDM_TX_3"},		\
  91	{ mix_name, "SEC_TDM_TX_4", "SEC_TDM_TX_4"},		\
  92	{ mix_name, "SEC_TDM_TX_5", "SEC_TDM_TX_5"},		\
  93	{ mix_name, "SEC_TDM_TX_6", "SEC_TDM_TX_6"},		\
  94	{ mix_name, "SEC_TDM_TX_7", "SEC_TDM_TX_7"},		\
  95	{ mix_name, "TERT_TDM_TX_0", "TERT_TDM_TX_0"},		\
  96	{ mix_name, "TERT_TDM_TX_1", "TERT_TDM_TX_1"},		\
  97	{ mix_name, "TERT_TDM_TX_2", "TERT_TDM_TX_2"},		\
  98	{ mix_name, "TERT_TDM_TX_3", "TERT_TDM_TX_3"},		\
  99	{ mix_name, "TERT_TDM_TX_4", "TERT_TDM_TX_4"},		\
 100	{ mix_name, "TERT_TDM_TX_5", "TERT_TDM_TX_5"},		\
 101	{ mix_name, "TERT_TDM_TX_6", "TERT_TDM_TX_6"},		\
 102	{ mix_name, "TERT_TDM_TX_7", "TERT_TDM_TX_7"},		\
 103	{ mix_name, "QUAT_TDM_TX_0", "QUAT_TDM_TX_0"},		\
 104	{ mix_name, "QUAT_TDM_TX_1", "QUAT_TDM_TX_1"},		\
 105	{ mix_name, "QUAT_TDM_TX_2", "QUAT_TDM_TX_2"},		\
 106	{ mix_name, "QUAT_TDM_TX_3", "QUAT_TDM_TX_3"},		\
 107	{ mix_name, "QUAT_TDM_TX_4", "QUAT_TDM_TX_4"},		\
 108	{ mix_name, "QUAT_TDM_TX_5", "QUAT_TDM_TX_5"},		\
 109	{ mix_name, "QUAT_TDM_TX_6", "QUAT_TDM_TX_6"},		\
 110	{ mix_name, "QUAT_TDM_TX_7", "QUAT_TDM_TX_7"},		\
 111	{ mix_name, "QUIN_TDM_TX_0", "QUIN_TDM_TX_0"},		\
 112	{ mix_name, "QUIN_TDM_TX_1", "QUIN_TDM_TX_1"},		\
 113	{ mix_name, "QUIN_TDM_TX_2", "QUIN_TDM_TX_2"},		\
 114	{ mix_name, "QUIN_TDM_TX_3", "QUIN_TDM_TX_3"},		\
 115	{ mix_name, "QUIN_TDM_TX_4", "QUIN_TDM_TX_4"},		\
 116	{ mix_name, "QUIN_TDM_TX_5", "QUIN_TDM_TX_5"},		\
 117	{ mix_name, "QUIN_TDM_TX_6", "QUIN_TDM_TX_6"},		\
 118	{ mix_name, "QUIN_TDM_TX_7", "QUIN_TDM_TX_7"},		\
 119	{ mix_name, "WSA_CODEC_DMA_TX_0", "WSA_CODEC_DMA_TX_0"},	\
 120	{ mix_name, "WSA_CODEC_DMA_TX_1", "WSA_CODEC_DMA_TX_1"},	\
 121	{ mix_name, "WSA_CODEC_DMA_TX_2", "WSA_CODEC_DMA_TX_2"},	\
 122	{ mix_name, "VA_CODEC_DMA_TX_0", "VA_CODEC_DMA_TX_0"},	\
 123	{ mix_name, "VA_CODEC_DMA_TX_1", "VA_CODEC_DMA_TX_1"},	\
 124	{ mix_name, "VA_CODEC_DMA_TX_2", "VA_CODEC_DMA_TX_2"},	\
 125	{ mix_name, "TX_CODEC_DMA_TX_0", "TX_CODEC_DMA_TX_0"},	\
 126	{ mix_name, "TX_CODEC_DMA_TX_1", "TX_CODEC_DMA_TX_1"},	\
 127	{ mix_name, "TX_CODEC_DMA_TX_2", "TX_CODEC_DMA_TX_2"},	\
 128	{ mix_name, "TX_CODEC_DMA_TX_3", "TX_CODEC_DMA_TX_3"},	\
 129	{ mix_name, "TX_CODEC_DMA_TX_4", "TX_CODEC_DMA_TX_4"},	\
 130	{ mix_name, "TX_CODEC_DMA_TX_5", "TX_CODEC_DMA_TX_5"}
 131
 132#define Q6ROUTING_TX_MIXERS(id)						\
 133	SOC_SINGLE_EXT("PRI_MI2S_TX", PRIMARY_MI2S_TX,			\
 134		id, 1, 0, msm_routing_get_audio_mixer,			\
 135		msm_routing_put_audio_mixer),				\
 136	SOC_SINGLE_EXT("SEC_MI2S_TX", SECONDARY_MI2S_TX,		\
 137		id, 1, 0, msm_routing_get_audio_mixer,			\
 138		msm_routing_put_audio_mixer),				\
 139	SOC_SINGLE_EXT("TERT_MI2S_TX", TERTIARY_MI2S_TX,		\
 140		id, 1, 0, msm_routing_get_audio_mixer,			\
 141		msm_routing_put_audio_mixer),				\
 142	SOC_SINGLE_EXT("QUAT_MI2S_TX", QUATERNARY_MI2S_TX,		\
 143		id, 1, 0, msm_routing_get_audio_mixer,			\
 144		msm_routing_put_audio_mixer),				\
 145	SOC_SINGLE_EXT("QUIN_MI2S_TX", QUINARY_MI2S_TX,			\
 146		id, 1, 0, msm_routing_get_audio_mixer,			\
 147		msm_routing_put_audio_mixer),				\
 148	SOC_SINGLE_EXT("SLIMBUS_0_TX", SLIMBUS_0_TX,			\
 149		id, 1, 0, msm_routing_get_audio_mixer,			\
 150		msm_routing_put_audio_mixer),				\
 151	SOC_SINGLE_EXT("SLIMBUS_1_TX", SLIMBUS_1_TX,			\
 152		id, 1, 0, msm_routing_get_audio_mixer,			\
 153		msm_routing_put_audio_mixer),				\
 154	SOC_SINGLE_EXT("SLIMBUS_2_TX", SLIMBUS_2_TX,			\
 155		id, 1, 0, msm_routing_get_audio_mixer,			\
 156		msm_routing_put_audio_mixer),				\
 157	SOC_SINGLE_EXT("SLIMBUS_3_TX", SLIMBUS_3_TX,			\
 158		id, 1, 0, msm_routing_get_audio_mixer,			\
 159		msm_routing_put_audio_mixer),				\
 160	SOC_SINGLE_EXT("SLIMBUS_4_TX", SLIMBUS_4_TX,			\
 161		id, 1, 0, msm_routing_get_audio_mixer,			\
 162		msm_routing_put_audio_mixer),				\
 163	SOC_SINGLE_EXT("SLIMBUS_5_TX", SLIMBUS_5_TX,			\
 164		id, 1, 0, msm_routing_get_audio_mixer,			\
 165		msm_routing_put_audio_mixer),				\
 166	SOC_SINGLE_EXT("SLIMBUS_6_TX", SLIMBUS_6_TX,			\
 167		id, 1, 0, msm_routing_get_audio_mixer,			\
 168		msm_routing_put_audio_mixer),				\
 169	SOC_SINGLE_EXT("PRIMARY_TDM_TX_0", PRIMARY_TDM_TX_0,		\
 170		id, 1, 0, msm_routing_get_audio_mixer,			\
 171		msm_routing_put_audio_mixer),				\
 172	SOC_SINGLE_EXT("PRIMARY_TDM_TX_1", PRIMARY_TDM_TX_1,		\
 173		id, 1, 0, msm_routing_get_audio_mixer,			\
 174		msm_routing_put_audio_mixer),				\
 175	SOC_SINGLE_EXT("PRIMARY_TDM_TX_2", PRIMARY_TDM_TX_2,		\
 176		id, 1, 0, msm_routing_get_audio_mixer,			\
 177		msm_routing_put_audio_mixer),				\
 178	SOC_SINGLE_EXT("PRIMARY_TDM_TX_3", PRIMARY_TDM_TX_3,		\
 179		id, 1, 0, msm_routing_get_audio_mixer,			\
 180		msm_routing_put_audio_mixer),				\
 181	SOC_SINGLE_EXT("PRIMARY_TDM_TX_4", PRIMARY_TDM_TX_4,		\
 182		id, 1, 0, msm_routing_get_audio_mixer,			\
 183		msm_routing_put_audio_mixer),				\
 184	SOC_SINGLE_EXT("PRIMARY_TDM_TX_5", PRIMARY_TDM_TX_5,		\
 185		id, 1, 0, msm_routing_get_audio_mixer,			\
 186		msm_routing_put_audio_mixer),				\
 187	SOC_SINGLE_EXT("PRIMARY_TDM_TX_6", PRIMARY_TDM_TX_6,		\
 188		id, 1, 0, msm_routing_get_audio_mixer,			\
 189		msm_routing_put_audio_mixer),				\
 190	SOC_SINGLE_EXT("PRIMARY_TDM_TX_7", PRIMARY_TDM_TX_7,		\
 191		id, 1, 0, msm_routing_get_audio_mixer,			\
 192		msm_routing_put_audio_mixer),				\
 193	SOC_SINGLE_EXT("SEC_TDM_TX_0", SECONDARY_TDM_TX_0,		\
 194		id, 1, 0, msm_routing_get_audio_mixer,			\
 195		msm_routing_put_audio_mixer),				\
 196	SOC_SINGLE_EXT("SEC_TDM_TX_1", SECONDARY_TDM_TX_1,		\
 197		id, 1, 0, msm_routing_get_audio_mixer,			\
 198		msm_routing_put_audio_mixer),				\
 199	SOC_SINGLE_EXT("SEC_TDM_TX_2", SECONDARY_TDM_TX_2,		\
 200		id, 1, 0, msm_routing_get_audio_mixer,			\
 201		msm_routing_put_audio_mixer),				\
 202	SOC_SINGLE_EXT("SEC_TDM_TX_3", SECONDARY_TDM_TX_3,		\
 203		id, 1, 0, msm_routing_get_audio_mixer,			\
 204		msm_routing_put_audio_mixer),				\
 205	SOC_SINGLE_EXT("SEC_TDM_TX_4", SECONDARY_TDM_TX_4,		\
 206		id, 1, 0, msm_routing_get_audio_mixer,			\
 207		msm_routing_put_audio_mixer),				\
 208	SOC_SINGLE_EXT("SEC_TDM_TX_5", SECONDARY_TDM_TX_5,		\
 209		id, 1, 0, msm_routing_get_audio_mixer,			\
 210		msm_routing_put_audio_mixer),				\
 211	SOC_SINGLE_EXT("SEC_TDM_TX_6", SECONDARY_TDM_TX_6,		\
 212		id, 1, 0, msm_routing_get_audio_mixer,			\
 213		msm_routing_put_audio_mixer),				\
 214	SOC_SINGLE_EXT("SEC_TDM_TX_7", SECONDARY_TDM_TX_7,		\
 215		id, 1, 0, msm_routing_get_audio_mixer,			\
 216		msm_routing_put_audio_mixer),				\
 217	SOC_SINGLE_EXT("TERT_TDM_TX_0", TERTIARY_TDM_TX_0,		\
 218		id, 1, 0, msm_routing_get_audio_mixer,			\
 219		msm_routing_put_audio_mixer),				\
 220	SOC_SINGLE_EXT("TERT_TDM_TX_1", TERTIARY_TDM_TX_1,		\
 221		id, 1, 0, msm_routing_get_audio_mixer,			\
 222		msm_routing_put_audio_mixer),				\
 223	SOC_SINGLE_EXT("TERT_TDM_TX_2", TERTIARY_TDM_TX_2,		\
 224		id, 1, 0, msm_routing_get_audio_mixer,			\
 225		msm_routing_put_audio_mixer),				\
 226	SOC_SINGLE_EXT("TERT_TDM_TX_3", TERTIARY_TDM_TX_3,		\
 227		id, 1, 0, msm_routing_get_audio_mixer,			\
 228		msm_routing_put_audio_mixer),				\
 229	SOC_SINGLE_EXT("TERT_TDM_TX_4", TERTIARY_TDM_TX_4,		\
 230		id, 1, 0, msm_routing_get_audio_mixer,			\
 231		msm_routing_put_audio_mixer),				\
 232	SOC_SINGLE_EXT("TERT_TDM_TX_5", TERTIARY_TDM_TX_5,		\
 233		id, 1, 0, msm_routing_get_audio_mixer,			\
 234		msm_routing_put_audio_mixer),				\
 235	SOC_SINGLE_EXT("TERT_TDM_TX_6", TERTIARY_TDM_TX_6,		\
 236		id, 1, 0, msm_routing_get_audio_mixer,			\
 237		msm_routing_put_audio_mixer),				\
 238	SOC_SINGLE_EXT("TERT_TDM_TX_7", TERTIARY_TDM_TX_7,		\
 239		id, 1, 0, msm_routing_get_audio_mixer,			\
 240		msm_routing_put_audio_mixer),				\
 241	SOC_SINGLE_EXT("QUAT_TDM_TX_0", QUATERNARY_TDM_TX_0,		\
 242		id, 1, 0, msm_routing_get_audio_mixer,			\
 243		msm_routing_put_audio_mixer),				\
 244	SOC_SINGLE_EXT("QUAT_TDM_TX_1", QUATERNARY_TDM_TX_1,		\
 245		id, 1, 0, msm_routing_get_audio_mixer,			\
 246		msm_routing_put_audio_mixer),				\
 247	SOC_SINGLE_EXT("QUAT_TDM_TX_2", QUATERNARY_TDM_TX_2,		\
 248		id, 1, 0, msm_routing_get_audio_mixer,			\
 249		msm_routing_put_audio_mixer),				\
 250	SOC_SINGLE_EXT("QUAT_TDM_TX_3", QUATERNARY_TDM_TX_3,		\
 251		id, 1, 0, msm_routing_get_audio_mixer,			\
 252		msm_routing_put_audio_mixer),				\
 253	SOC_SINGLE_EXT("QUAT_TDM_TX_4", QUATERNARY_TDM_TX_4,		\
 254		id, 1, 0, msm_routing_get_audio_mixer,			\
 255		msm_routing_put_audio_mixer),				\
 256	SOC_SINGLE_EXT("QUAT_TDM_TX_5", QUATERNARY_TDM_TX_5,		\
 257		id, 1, 0, msm_routing_get_audio_mixer,			\
 258		msm_routing_put_audio_mixer),				\
 259	SOC_SINGLE_EXT("QUAT_TDM_TX_6", QUATERNARY_TDM_TX_6,		\
 260		id, 1, 0, msm_routing_get_audio_mixer,			\
 261		msm_routing_put_audio_mixer),				\
 262	SOC_SINGLE_EXT("QUAT_TDM_TX_7", QUATERNARY_TDM_TX_7,		\
 263		id, 1, 0, msm_routing_get_audio_mixer,			\
 264		msm_routing_put_audio_mixer),				\
 265	SOC_SINGLE_EXT("QUIN_TDM_TX_0", QUINARY_TDM_TX_0,		\
 266		id, 1, 0, msm_routing_get_audio_mixer,			\
 267		msm_routing_put_audio_mixer),				\
 268	SOC_SINGLE_EXT("QUIN_TDM_TX_1", QUINARY_TDM_TX_1,		\
 269		id, 1, 0, msm_routing_get_audio_mixer,			\
 270		msm_routing_put_audio_mixer),				\
 271	SOC_SINGLE_EXT("QUIN_TDM_TX_2", QUINARY_TDM_TX_2,		\
 272		id, 1, 0, msm_routing_get_audio_mixer,			\
 273		msm_routing_put_audio_mixer),				\
 274	SOC_SINGLE_EXT("QUIN_TDM_TX_3", QUINARY_TDM_TX_3,		\
 275		id, 1, 0, msm_routing_get_audio_mixer,			\
 276		msm_routing_put_audio_mixer),				\
 277	SOC_SINGLE_EXT("QUIN_TDM_TX_4", QUINARY_TDM_TX_4,		\
 278		id, 1, 0, msm_routing_get_audio_mixer,			\
 279		msm_routing_put_audio_mixer),				\
 280	SOC_SINGLE_EXT("QUIN_TDM_TX_5", QUINARY_TDM_TX_5,		\
 281		id, 1, 0, msm_routing_get_audio_mixer,			\
 282		msm_routing_put_audio_mixer),				\
 283	SOC_SINGLE_EXT("QUIN_TDM_TX_6", QUINARY_TDM_TX_6,		\
 284		id, 1, 0, msm_routing_get_audio_mixer,			\
 285		msm_routing_put_audio_mixer),				\
 286	SOC_SINGLE_EXT("QUIN_TDM_TX_7", QUINARY_TDM_TX_7,		\
 287		id, 1, 0, msm_routing_get_audio_mixer,			\
 288		msm_routing_put_audio_mixer),				\
 289	SOC_SINGLE_EXT("WSA_CODEC_DMA_TX_0", WSA_CODEC_DMA_TX_0,	\
 290		id, 1, 0, msm_routing_get_audio_mixer,			\
 291		msm_routing_put_audio_mixer),				\
 292	SOC_SINGLE_EXT("WSA_CODEC_DMA_TX_1", WSA_CODEC_DMA_TX_1,	\
 293		id, 1, 0, msm_routing_get_audio_mixer,			\
 294		msm_routing_put_audio_mixer),				\
 295	SOC_SINGLE_EXT("WSA_CODEC_DMA_TX_2", WSA_CODEC_DMA_TX_2,	\
 296		id, 1, 0, msm_routing_get_audio_mixer,			\
 297		msm_routing_put_audio_mixer),				\
 298	SOC_SINGLE_EXT("VA_CODEC_DMA_TX_0", VA_CODEC_DMA_TX_0,		\
 299		id, 1, 0, msm_routing_get_audio_mixer,			\
 300		msm_routing_put_audio_mixer),				\
 301	SOC_SINGLE_EXT("VA_CODEC_DMA_TX_1", VA_CODEC_DMA_TX_1,		\
 302		id, 1, 0, msm_routing_get_audio_mixer,			\
 303		msm_routing_put_audio_mixer),				\
 304	SOC_SINGLE_EXT("VA_CODEC_DMA_TX_2", VA_CODEC_DMA_TX_2,		\
 305		id, 1, 0, msm_routing_get_audio_mixer,			\
 306		msm_routing_put_audio_mixer),				\
 307	SOC_SINGLE_EXT("TX_CODEC_DMA_TX_0", TX_CODEC_DMA_TX_0,		\
 308		id, 1, 0, msm_routing_get_audio_mixer,			\
 309		msm_routing_put_audio_mixer),				\
 310	SOC_SINGLE_EXT("TX_CODEC_DMA_TX_1", TX_CODEC_DMA_TX_1,		\
 311		id, 1, 0, msm_routing_get_audio_mixer,			\
 312		msm_routing_put_audio_mixer),				\
 313	SOC_SINGLE_EXT("TX_CODEC_DMA_TX_2", TX_CODEC_DMA_TX_2,		\
 314		id, 1, 0, msm_routing_get_audio_mixer,			\
 315		msm_routing_put_audio_mixer),				\
 316	SOC_SINGLE_EXT("TX_CODEC_DMA_TX_3", TX_CODEC_DMA_TX_3,		\
 317		id, 1, 0, msm_routing_get_audio_mixer,			\
 318		msm_routing_put_audio_mixer),				\
 319	SOC_SINGLE_EXT("TX_CODEC_DMA_TX_4", TX_CODEC_DMA_TX_4,		\
 320		id, 1, 0, msm_routing_get_audio_mixer,			\
 321		msm_routing_put_audio_mixer),				\
 322	SOC_SINGLE_EXT("TX_CODEC_DMA_TX_5", TX_CODEC_DMA_TX_5,		\
 323		id, 1, 0, msm_routing_get_audio_mixer,			\
 324		msm_routing_put_audio_mixer),
 325
 326struct session_data {
 327	int state;
 328	int port_id;
 329	int path_type;
 330	int app_type;
 331	int acdb_id;
 332	int sample_rate;
 333	int bits_per_sample;
 334	int channels;
 335	int perf_mode;
 336	int numcopps;
 337	int fedai_id;
 338	unsigned long copp_map;
 339	struct q6copp *copps[MAX_COPPS_PER_PORT];
 340};
 341
 342struct msm_routing_data {
 343	struct session_data sessions[MAX_SESSIONS];
 344	struct session_data port_data[AFE_MAX_PORTS];
 345	struct device *dev;
 346	struct mutex lock;
 347};
 348
 349static struct msm_routing_data *routing_data;
 350
 351/**
 352 * q6routing_stream_open() - Register a new stream for route setup
 353 *
 354 * @fedai_id: Frontend dai id.
 355 * @perf_mode: Performance mode.
 356 * @stream_id: ASM stream id to map.
 357 * @stream_type: Direction of stream
 358 *
 359 * Return: Will be an negative on error or a zero on success.
 360 */
 361int q6routing_stream_open(int fedai_id, int perf_mode,
 362			   int stream_id, int stream_type)
 363{
 364	int j, topology, num_copps = 0;
 365	struct route_payload payload;
 366	struct q6copp *copp;
 367	int copp_idx;
 368	struct session_data *session, *pdata;
 369
 370	if (!routing_data) {
 371		pr_err("Routing driver not yet ready\n");
 372		return -EINVAL;
 373	}
 374
 375	session = &routing_data->sessions[stream_id - 1];
 376	if (session->port_id < 0) {
 377		dev_err(routing_data->dev, "Routing not setup for MultiMedia%d Session\n",
 378			session->fedai_id);
 379		return -EINVAL;
 380	}
 381
 382	pdata = &routing_data->port_data[session->port_id];
 383
 384	mutex_lock(&routing_data->lock);
 385	session->fedai_id = fedai_id;
 386
 387	session->path_type = pdata->path_type;
 388	session->sample_rate = pdata->sample_rate;
 389	session->channels = pdata->channels;
 390	session->bits_per_sample = pdata->bits_per_sample;
 391
 392	payload.num_copps = 0; /* only RX needs to use payload */
 393	topology = NULL_COPP_TOPOLOGY;
 394	copp = q6adm_open(routing_data->dev, session->port_id,
 395			      session->path_type, session->sample_rate,
 396			      session->channels, topology, perf_mode,
 397			      session->bits_per_sample, 0, 0);
 398
 399	if (IS_ERR_OR_NULL(copp)) {
 400		mutex_unlock(&routing_data->lock);
 401		return -EINVAL;
 402	}
 403
 404	copp_idx = q6adm_get_copp_id(copp);
 405	set_bit(copp_idx, &session->copp_map);
 406	session->copps[copp_idx] = copp;
 407
 408	for_each_set_bit(j, &session->copp_map, MAX_COPPS_PER_PORT) {
 409		payload.port_id[num_copps] = session->port_id;
 410		payload.copp_idx[num_copps] = j;
 411		num_copps++;
 412	}
 413
 414	if (num_copps) {
 415		payload.num_copps = num_copps;
 416		payload.session_id = stream_id;
 417		q6adm_matrix_map(routing_data->dev, session->path_type,
 418				 payload, perf_mode);
 419	}
 420	mutex_unlock(&routing_data->lock);
 421
 422	return 0;
 423}
 424EXPORT_SYMBOL_GPL(q6routing_stream_open);
 425
 426static struct session_data *get_session_from_id(struct msm_routing_data *data,
 427						int fedai_id)
 428{
 429	int i;
 430
 431	for (i = 0; i < MAX_SESSIONS; i++) {
 432		if (fedai_id == data->sessions[i].fedai_id)
 433			return &data->sessions[i];
 434	}
 435
 436	return NULL;
 437}
 438
 439/**
 440 * q6routing_stream_close() - Deregister a stream
 441 *
 442 * @fedai_id: Frontend dai id.
 443 * @stream_type: Direction of stream
 444 *
 445 * Return: Will be an negative on error or a zero on success.
 446 */
 447void q6routing_stream_close(int fedai_id, int stream_type)
 448{
 449	struct session_data *session;
 450	int idx;
 451
 452	session = get_session_from_id(routing_data, fedai_id);
 453	if (!session)
 454		return;
 455
 456	for_each_set_bit(idx, &session->copp_map, MAX_COPPS_PER_PORT) {
 457		if (session->copps[idx]) {
 458			q6adm_close(routing_data->dev, session->copps[idx]);
 459			session->copps[idx] = NULL;
 460		}
 461	}
 462
 463	session->fedai_id = -1;
 464	session->copp_map = 0;
 465}
 466EXPORT_SYMBOL_GPL(q6routing_stream_close);
 467
 468static int msm_routing_get_audio_mixer(struct snd_kcontrol *kcontrol,
 469				       struct snd_ctl_elem_value *ucontrol)
 470{
 471	struct snd_soc_dapm_context *dapm = snd_soc_dapm_kcontrol_to_dapm(kcontrol);
 472	struct soc_mixer_control *mc =
 473	    (struct soc_mixer_control *)kcontrol->private_value;
 474	int session_id = mc->shift;
 475	struct snd_soc_component *c = snd_soc_dapm_to_component(dapm);
 476	struct msm_routing_data *priv = dev_get_drvdata(c->dev);
 477	struct session_data *session = &priv->sessions[session_id];
 478
 479	if (session->port_id == mc->reg)
 480		ucontrol->value.integer.value[0] = 1;
 481	else
 482		ucontrol->value.integer.value[0] = 0;
 483
 484	return 0;
 485}
 486
 487static int msm_routing_put_audio_mixer(struct snd_kcontrol *kcontrol,
 488				       struct snd_ctl_elem_value *ucontrol)
 489{
 490	struct snd_soc_dapm_context *dapm = snd_soc_dapm_kcontrol_to_dapm(kcontrol);
 491	struct snd_soc_component *c = snd_soc_dapm_to_component(dapm);
 492	struct msm_routing_data *data = dev_get_drvdata(c->dev);
 493	struct soc_mixer_control *mc =
 494		    (struct soc_mixer_control *)kcontrol->private_value;
 495	struct snd_soc_dapm_update *update = NULL;
 496	int be_id = mc->reg;
 497	int session_id = mc->shift;
 498	struct session_data *session = &data->sessions[session_id];
 499
 500	if (ucontrol->value.integer.value[0]) {
 501		if (session->port_id == be_id)
 502			return 0;
 503
 504		session->port_id = be_id;
 505		snd_soc_dapm_mixer_update_power(dapm, kcontrol, 1, update);
 506	} else {
 507		if (session->port_id == -1 || session->port_id != be_id)
 508			return 0;
 509
 510		session->port_id = -1;
 511		snd_soc_dapm_mixer_update_power(dapm, kcontrol, 0, update);
 512	}
 513
 514	return 1;
 515}
 516
 517static const struct snd_kcontrol_new usb_rx_mixer_controls[] = {
 518	Q6ROUTING_RX_MIXERS(USB_RX) };
 519
 520static const struct snd_kcontrol_new hdmi_mixer_controls[] = {
 521	Q6ROUTING_RX_MIXERS(HDMI_RX) };
 522
 523static const struct snd_kcontrol_new display_port_mixer_controls[] = {
 524	Q6ROUTING_RX_MIXERS(DISPLAY_PORT_RX) };
 525
 526static const struct snd_kcontrol_new primary_mi2s_rx_mixer_controls[] = {
 527	Q6ROUTING_RX_MIXERS(PRIMARY_MI2S_RX) };
 528
 529static const struct snd_kcontrol_new secondary_mi2s_rx_mixer_controls[] = {
 530	Q6ROUTING_RX_MIXERS(SECONDARY_MI2S_RX) };
 531
 532static const struct snd_kcontrol_new quaternary_mi2s_rx_mixer_controls[] = {
 533	Q6ROUTING_RX_MIXERS(QUATERNARY_MI2S_RX) };
 534
 535static const struct snd_kcontrol_new quinary_mi2s_rx_mixer_controls[] = {
 536	Q6ROUTING_RX_MIXERS(QUINARY_MI2S_RX) };
 537
 538static const struct snd_kcontrol_new tertiary_mi2s_rx_mixer_controls[] = {
 539	Q6ROUTING_RX_MIXERS(TERTIARY_MI2S_RX) };
 540
 541static const struct snd_kcontrol_new slimbus_rx_mixer_controls[] = {
 542	Q6ROUTING_RX_MIXERS(SLIMBUS_0_RX) };
 543
 544static const struct snd_kcontrol_new slimbus_1_rx_mixer_controls[] = {
 545	Q6ROUTING_RX_MIXERS(SLIMBUS_1_RX) };
 546
 547static const struct snd_kcontrol_new slimbus_2_rx_mixer_controls[] = {
 548	Q6ROUTING_RX_MIXERS(SLIMBUS_2_RX) };
 549
 550static const struct snd_kcontrol_new slimbus_3_rx_mixer_controls[] = {
 551	Q6ROUTING_RX_MIXERS(SLIMBUS_3_RX) };
 552
 553static const struct snd_kcontrol_new slimbus_4_rx_mixer_controls[] = {
 554	Q6ROUTING_RX_MIXERS(SLIMBUS_4_RX) };
 555
 556static const struct snd_kcontrol_new slimbus_5_rx_mixer_controls[] = {
 557	Q6ROUTING_RX_MIXERS(SLIMBUS_5_RX) };
 558
 559static const struct snd_kcontrol_new slimbus_6_rx_mixer_controls[] = {
 560	Q6ROUTING_RX_MIXERS(SLIMBUS_6_RX) };
 561
 562static const struct snd_kcontrol_new pri_tdm_rx_0_mixer_controls[] = {
 563	Q6ROUTING_RX_MIXERS(PRIMARY_TDM_RX_0) };
 564
 565static const struct snd_kcontrol_new pri_tdm_rx_1_mixer_controls[] = {
 566	Q6ROUTING_RX_MIXERS(PRIMARY_TDM_RX_1) };
 567
 568static const struct snd_kcontrol_new pri_tdm_rx_2_mixer_controls[] = {
 569	Q6ROUTING_RX_MIXERS(PRIMARY_TDM_RX_2) };
 570
 571static const struct snd_kcontrol_new pri_tdm_rx_3_mixer_controls[] = {
 572	Q6ROUTING_RX_MIXERS(PRIMARY_TDM_RX_3) };
 573
 574static const struct snd_kcontrol_new pri_tdm_rx_4_mixer_controls[] = {
 575	Q6ROUTING_RX_MIXERS(PRIMARY_TDM_RX_4) };
 576
 577static const struct snd_kcontrol_new pri_tdm_rx_5_mixer_controls[] = {
 578	Q6ROUTING_RX_MIXERS(PRIMARY_TDM_RX_5) };
 579
 580static const struct snd_kcontrol_new pri_tdm_rx_6_mixer_controls[] = {
 581	Q6ROUTING_RX_MIXERS(PRIMARY_TDM_RX_6) };
 582
 583static const struct snd_kcontrol_new pri_tdm_rx_7_mixer_controls[] = {
 584	Q6ROUTING_RX_MIXERS(PRIMARY_TDM_RX_7) };
 585
 586static const struct snd_kcontrol_new sec_tdm_rx_0_mixer_controls[] = {
 587	Q6ROUTING_RX_MIXERS(SECONDARY_TDM_RX_0) };
 588
 589static const struct snd_kcontrol_new sec_tdm_rx_1_mixer_controls[] = {
 590	Q6ROUTING_RX_MIXERS(SECONDARY_TDM_RX_1) };
 591
 592static const struct snd_kcontrol_new sec_tdm_rx_2_mixer_controls[] = {
 593	Q6ROUTING_RX_MIXERS(SECONDARY_TDM_RX_2) };
 594
 595static const struct snd_kcontrol_new sec_tdm_rx_3_mixer_controls[] = {
 596	Q6ROUTING_RX_MIXERS(SECONDARY_TDM_RX_3) };
 597
 598static const struct snd_kcontrol_new sec_tdm_rx_4_mixer_controls[] = {
 599	Q6ROUTING_RX_MIXERS(SECONDARY_TDM_RX_4) };
 600
 601static const struct snd_kcontrol_new sec_tdm_rx_5_mixer_controls[] = {
 602	Q6ROUTING_RX_MIXERS(SECONDARY_TDM_RX_5) };
 603
 604static const struct snd_kcontrol_new sec_tdm_rx_6_mixer_controls[] = {
 605	Q6ROUTING_RX_MIXERS(SECONDARY_TDM_RX_6) };
 606
 607static const struct snd_kcontrol_new sec_tdm_rx_7_mixer_controls[] = {
 608	Q6ROUTING_RX_MIXERS(SECONDARY_TDM_RX_7) };
 609
 610static const struct snd_kcontrol_new tert_tdm_rx_0_mixer_controls[] = {
 611	Q6ROUTING_RX_MIXERS(TERTIARY_TDM_RX_0) };
 612
 613static const struct snd_kcontrol_new tert_tdm_rx_1_mixer_controls[] = {
 614	Q6ROUTING_RX_MIXERS(TERTIARY_TDM_RX_1) };
 615
 616static const struct snd_kcontrol_new tert_tdm_rx_2_mixer_controls[] = {
 617	Q6ROUTING_RX_MIXERS(TERTIARY_TDM_RX_2) };
 618
 619static const struct snd_kcontrol_new tert_tdm_rx_3_mixer_controls[] = {
 620	Q6ROUTING_RX_MIXERS(TERTIARY_TDM_RX_3) };
 621
 622static const struct snd_kcontrol_new tert_tdm_rx_4_mixer_controls[] = {
 623	Q6ROUTING_RX_MIXERS(TERTIARY_TDM_RX_4) };
 624
 625static const struct snd_kcontrol_new tert_tdm_rx_5_mixer_controls[] = {
 626	Q6ROUTING_RX_MIXERS(TERTIARY_TDM_RX_5) };
 627
 628static const struct snd_kcontrol_new tert_tdm_rx_6_mixer_controls[] = {
 629	Q6ROUTING_RX_MIXERS(TERTIARY_TDM_RX_6) };
 630
 631static const struct snd_kcontrol_new tert_tdm_rx_7_mixer_controls[] = {
 632	Q6ROUTING_RX_MIXERS(TERTIARY_TDM_RX_7) };
 633
 634static const struct snd_kcontrol_new quat_tdm_rx_0_mixer_controls[] = {
 635	Q6ROUTING_RX_MIXERS(QUATERNARY_TDM_RX_0) };
 636
 637static const struct snd_kcontrol_new quat_tdm_rx_1_mixer_controls[] = {
 638	Q6ROUTING_RX_MIXERS(QUATERNARY_TDM_RX_1) };
 639
 640static const struct snd_kcontrol_new quat_tdm_rx_2_mixer_controls[] = {
 641	Q6ROUTING_RX_MIXERS(QUATERNARY_TDM_RX_2) };
 642
 643static const struct snd_kcontrol_new quat_tdm_rx_3_mixer_controls[] = {
 644	Q6ROUTING_RX_MIXERS(QUATERNARY_TDM_RX_3) };
 645
 646static const struct snd_kcontrol_new quat_tdm_rx_4_mixer_controls[] = {
 647	Q6ROUTING_RX_MIXERS(QUATERNARY_TDM_RX_4) };
 648
 649static const struct snd_kcontrol_new quat_tdm_rx_5_mixer_controls[] = {
 650	Q6ROUTING_RX_MIXERS(QUATERNARY_TDM_RX_5) };
 651
 652static const struct snd_kcontrol_new quat_tdm_rx_6_mixer_controls[] = {
 653	Q6ROUTING_RX_MIXERS(QUATERNARY_TDM_RX_6) };
 654
 655static const struct snd_kcontrol_new quat_tdm_rx_7_mixer_controls[] = {
 656	Q6ROUTING_RX_MIXERS(QUATERNARY_TDM_RX_7) };
 657
 658static const struct snd_kcontrol_new quin_tdm_rx_0_mixer_controls[] = {
 659	Q6ROUTING_RX_MIXERS(QUINARY_TDM_RX_0) };
 660
 661static const struct snd_kcontrol_new quin_tdm_rx_1_mixer_controls[] = {
 662	Q6ROUTING_RX_MIXERS(QUINARY_TDM_RX_1) };
 663
 664static const struct snd_kcontrol_new quin_tdm_rx_2_mixer_controls[] = {
 665	Q6ROUTING_RX_MIXERS(QUINARY_TDM_RX_2) };
 666
 667static const struct snd_kcontrol_new quin_tdm_rx_3_mixer_controls[] = {
 668	Q6ROUTING_RX_MIXERS(QUINARY_TDM_RX_3) };
 669
 670static const struct snd_kcontrol_new quin_tdm_rx_4_mixer_controls[] = {
 671	Q6ROUTING_RX_MIXERS(QUINARY_TDM_RX_4) };
 672
 673static const struct snd_kcontrol_new quin_tdm_rx_5_mixer_controls[] = {
 674	Q6ROUTING_RX_MIXERS(QUINARY_TDM_RX_5) };
 675
 676static const struct snd_kcontrol_new quin_tdm_rx_6_mixer_controls[] = {
 677	Q6ROUTING_RX_MIXERS(QUINARY_TDM_RX_6) };
 678
 679static const struct snd_kcontrol_new quin_tdm_rx_7_mixer_controls[] = {
 680	Q6ROUTING_RX_MIXERS(QUINARY_TDM_RX_7) };
 681
 682static const struct snd_kcontrol_new wsa_codec_dma_rx_0_mixer_controls[] = {
 683	Q6ROUTING_RX_MIXERS(WSA_CODEC_DMA_RX_0) };
 684
 685static const struct snd_kcontrol_new wsa_codec_dma_rx_1_mixer_controls[] = {
 686	Q6ROUTING_RX_MIXERS(WSA_CODEC_DMA_RX_1) };
 687
 688static const struct snd_kcontrol_new rx_codec_dma_rx_0_mixer_controls[] = {
 689	Q6ROUTING_RX_MIXERS(RX_CODEC_DMA_RX_0) };
 690
 691static const struct snd_kcontrol_new rx_codec_dma_rx_1_mixer_controls[] = {
 692	Q6ROUTING_RX_MIXERS(RX_CODEC_DMA_RX_1) };
 693
 694static const struct snd_kcontrol_new rx_codec_dma_rx_2_mixer_controls[] = {
 695	Q6ROUTING_RX_MIXERS(RX_CODEC_DMA_RX_2) };
 696
 697static const struct snd_kcontrol_new rx_codec_dma_rx_3_mixer_controls[] = {
 698	Q6ROUTING_RX_MIXERS(RX_CODEC_DMA_RX_3) };
 699
 700static const struct snd_kcontrol_new rx_codec_dma_rx_4_mixer_controls[] = {
 701	Q6ROUTING_RX_MIXERS(RX_CODEC_DMA_RX_4) };
 702
 703static const struct snd_kcontrol_new rx_codec_dma_rx_5_mixer_controls[] = {
 704	Q6ROUTING_RX_MIXERS(RX_CODEC_DMA_RX_5) };
 705
 706static const struct snd_kcontrol_new rxcodec_dma_rx_6_mixer_controls[] = {
 707	Q6ROUTING_RX_MIXERS(RX_CODEC_DMA_RX_6) };
 708
 709static const struct snd_kcontrol_new rx_codec_dma_rx_7_mixer_controls[] = {
 710	Q6ROUTING_RX_MIXERS(RX_CODEC_DMA_RX_7) };
 711
 712
 713static const struct snd_kcontrol_new mmul1_mixer_controls[] = {
 714	Q6ROUTING_TX_MIXERS(MSM_FRONTEND_DAI_MULTIMEDIA1) };
 715
 716static const struct snd_kcontrol_new mmul2_mixer_controls[] = {
 717	Q6ROUTING_TX_MIXERS(MSM_FRONTEND_DAI_MULTIMEDIA2) };
 718
 719static const struct snd_kcontrol_new mmul3_mixer_controls[] = {
 720	Q6ROUTING_TX_MIXERS(MSM_FRONTEND_DAI_MULTIMEDIA3) };
 721
 722static const struct snd_kcontrol_new mmul4_mixer_controls[] = {
 723	Q6ROUTING_TX_MIXERS(MSM_FRONTEND_DAI_MULTIMEDIA4) };
 724
 725static const struct snd_kcontrol_new mmul5_mixer_controls[] = {
 726	Q6ROUTING_TX_MIXERS(MSM_FRONTEND_DAI_MULTIMEDIA5) };
 727
 728static const struct snd_kcontrol_new mmul6_mixer_controls[] = {
 729	Q6ROUTING_TX_MIXERS(MSM_FRONTEND_DAI_MULTIMEDIA6) };
 730
 731static const struct snd_kcontrol_new mmul7_mixer_controls[] = {
 732	Q6ROUTING_TX_MIXERS(MSM_FRONTEND_DAI_MULTIMEDIA7) };
 733
 734static const struct snd_kcontrol_new mmul8_mixer_controls[] = {
 735	Q6ROUTING_TX_MIXERS(MSM_FRONTEND_DAI_MULTIMEDIA8) };
 736
 737static const struct snd_soc_dapm_widget msm_qdsp6_widgets[] = {
 738	/* Mixer definitions */
 739	SND_SOC_DAPM_MIXER("HDMI Mixer", SND_SOC_NOPM, 0, 0,
 740			   hdmi_mixer_controls,
 741			   ARRAY_SIZE(hdmi_mixer_controls)),
 742
 743	SND_SOC_DAPM_MIXER("DISPLAY_PORT_RX Audio Mixer", SND_SOC_NOPM, 0, 0,
 744			   display_port_mixer_controls,
 745			   ARRAY_SIZE(display_port_mixer_controls)),
 746
 747	SND_SOC_DAPM_MIXER("SLIMBUS_0_RX Audio Mixer", SND_SOC_NOPM, 0, 0,
 748			   slimbus_rx_mixer_controls,
 749			   ARRAY_SIZE(slimbus_rx_mixer_controls)),
 750	SND_SOC_DAPM_MIXER("SLIMBUS_1_RX Audio Mixer", SND_SOC_NOPM, 0, 0,
 751			   slimbus_1_rx_mixer_controls,
 752			   ARRAY_SIZE(slimbus_1_rx_mixer_controls)),
 753	SND_SOC_DAPM_MIXER("SLIMBUS_2_RX Audio Mixer", SND_SOC_NOPM, 0, 0,
 754			   slimbus_2_rx_mixer_controls,
 755			   ARRAY_SIZE(slimbus_2_rx_mixer_controls)),
 756	SND_SOC_DAPM_MIXER("SLIMBUS_3_RX Audio Mixer", SND_SOC_NOPM, 0, 0,
 757			   slimbus_3_rx_mixer_controls,
 758			   ARRAY_SIZE(slimbus_3_rx_mixer_controls)),
 759	SND_SOC_DAPM_MIXER("SLIMBUS_4_RX Audio Mixer", SND_SOC_NOPM, 0, 0,
 760			   slimbus_4_rx_mixer_controls,
 761			   ARRAY_SIZE(slimbus_4_rx_mixer_controls)),
 762	SND_SOC_DAPM_MIXER("SLIMBUS_5_RX Audio Mixer", SND_SOC_NOPM, 0, 0,
 763			   slimbus_5_rx_mixer_controls,
 764			    ARRAY_SIZE(slimbus_5_rx_mixer_controls)),
 765	SND_SOC_DAPM_MIXER("SLIMBUS_6_RX Audio Mixer", SND_SOC_NOPM, 0, 0,
 766			   slimbus_6_rx_mixer_controls,
 767			   ARRAY_SIZE(slimbus_6_rx_mixer_controls)),
 768	SND_SOC_DAPM_MIXER("PRI_MI2S_RX Audio Mixer", SND_SOC_NOPM, 0, 0,
 769			   primary_mi2s_rx_mixer_controls,
 770			   ARRAY_SIZE(primary_mi2s_rx_mixer_controls)),
 771	SND_SOC_DAPM_MIXER("SEC_MI2S_RX Audio Mixer", SND_SOC_NOPM, 0, 0,
 772			   secondary_mi2s_rx_mixer_controls,
 773			   ARRAY_SIZE(secondary_mi2s_rx_mixer_controls)),
 774	SND_SOC_DAPM_MIXER("QUAT_MI2S_RX Audio Mixer", SND_SOC_NOPM, 0, 0,
 775			   quaternary_mi2s_rx_mixer_controls,
 776			   ARRAY_SIZE(quaternary_mi2s_rx_mixer_controls)),
 777	SND_SOC_DAPM_MIXER("QUIN_MI2S_RX Audio Mixer", SND_SOC_NOPM, 0, 0,
 778			   quinary_mi2s_rx_mixer_controls,
 779			   ARRAY_SIZE(quinary_mi2s_rx_mixer_controls)),
 780	SND_SOC_DAPM_MIXER("TERT_MI2S_RX Audio Mixer", SND_SOC_NOPM, 0, 0,
 781			   tertiary_mi2s_rx_mixer_controls,
 782			   ARRAY_SIZE(tertiary_mi2s_rx_mixer_controls)),
 783	SND_SOC_DAPM_MIXER("PRIMARY_TDM_RX_0 Audio Mixer", SND_SOC_NOPM, 0, 0,
 784				pri_tdm_rx_0_mixer_controls,
 785				ARRAY_SIZE(pri_tdm_rx_0_mixer_controls)),
 786	SND_SOC_DAPM_MIXER("PRIMARY_TDM_RX_1 Audio Mixer", SND_SOC_NOPM, 0, 0,
 787				pri_tdm_rx_1_mixer_controls,
 788				ARRAY_SIZE(pri_tdm_rx_1_mixer_controls)),
 789	SND_SOC_DAPM_MIXER("PRIMARY_TDM_RX_2 Audio Mixer", SND_SOC_NOPM, 0, 0,
 790				pri_tdm_rx_2_mixer_controls,
 791				ARRAY_SIZE(pri_tdm_rx_2_mixer_controls)),
 792	SND_SOC_DAPM_MIXER("PRIMARY_TDM_RX_3 Audio Mixer", SND_SOC_NOPM, 0, 0,
 793				pri_tdm_rx_3_mixer_controls,
 794				ARRAY_SIZE(pri_tdm_rx_3_mixer_controls)),
 795	SND_SOC_DAPM_MIXER("PRIMARY_TDM_RX_4 Audio Mixer", SND_SOC_NOPM, 0, 0,
 796				pri_tdm_rx_4_mixer_controls,
 797				ARRAY_SIZE(pri_tdm_rx_4_mixer_controls)),
 798	SND_SOC_DAPM_MIXER("PRIMARY_TDM_RX_5 Audio Mixer", SND_SOC_NOPM, 0, 0,
 799				pri_tdm_rx_5_mixer_controls,
 800				ARRAY_SIZE(pri_tdm_rx_5_mixer_controls)),
 801	SND_SOC_DAPM_MIXER("PRIMARY_TDM_RX_6 Audio Mixer", SND_SOC_NOPM, 0, 0,
 802				pri_tdm_rx_6_mixer_controls,
 803				ARRAY_SIZE(pri_tdm_rx_6_mixer_controls)),
 804	SND_SOC_DAPM_MIXER("PRIMARY_TDM_RX_7 Audio Mixer", SND_SOC_NOPM, 0, 0,
 805				pri_tdm_rx_7_mixer_controls,
 806				ARRAY_SIZE(pri_tdm_rx_7_mixer_controls)),
 807
 808	SND_SOC_DAPM_MIXER("SEC_TDM_RX_0 Audio Mixer", SND_SOC_NOPM, 0, 0,
 809				sec_tdm_rx_0_mixer_controls,
 810				ARRAY_SIZE(sec_tdm_rx_0_mixer_controls)),
 811	SND_SOC_DAPM_MIXER("SEC_TDM_RX_1 Audio Mixer", SND_SOC_NOPM, 0, 0,
 812				sec_tdm_rx_1_mixer_controls,
 813				ARRAY_SIZE(sec_tdm_rx_1_mixer_controls)),
 814	SND_SOC_DAPM_MIXER("SEC_TDM_RX_2 Audio Mixer", SND_SOC_NOPM, 0, 0,
 815				sec_tdm_rx_2_mixer_controls,
 816				ARRAY_SIZE(sec_tdm_rx_2_mixer_controls)),
 817	SND_SOC_DAPM_MIXER("SEC_TDM_RX_3 Audio Mixer", SND_SOC_NOPM, 0, 0,
 818				sec_tdm_rx_3_mixer_controls,
 819				ARRAY_SIZE(sec_tdm_rx_3_mixer_controls)),
 820	SND_SOC_DAPM_MIXER("SEC_TDM_RX_4 Audio Mixer", SND_SOC_NOPM, 0, 0,
 821				sec_tdm_rx_4_mixer_controls,
 822				ARRAY_SIZE(sec_tdm_rx_4_mixer_controls)),
 823	SND_SOC_DAPM_MIXER("SEC_TDM_RX_5 Audio Mixer", SND_SOC_NOPM, 0, 0,
 824				sec_tdm_rx_5_mixer_controls,
 825				ARRAY_SIZE(sec_tdm_rx_5_mixer_controls)),
 826	SND_SOC_DAPM_MIXER("SEC_TDM_RX_6 Audio Mixer", SND_SOC_NOPM, 0, 0,
 827				sec_tdm_rx_6_mixer_controls,
 828				ARRAY_SIZE(sec_tdm_rx_6_mixer_controls)),
 829	SND_SOC_DAPM_MIXER("SEC_TDM_RX_7 Audio Mixer", SND_SOC_NOPM, 0, 0,
 830				sec_tdm_rx_7_mixer_controls,
 831				ARRAY_SIZE(sec_tdm_rx_7_mixer_controls)),
 832
 833	SND_SOC_DAPM_MIXER("TERT_TDM_RX_0 Audio Mixer", SND_SOC_NOPM, 0, 0,
 834				tert_tdm_rx_0_mixer_controls,
 835				ARRAY_SIZE(tert_tdm_rx_0_mixer_controls)),
 836	SND_SOC_DAPM_MIXER("TERT_TDM_RX_1 Audio Mixer", SND_SOC_NOPM, 0, 0,
 837				tert_tdm_rx_1_mixer_controls,
 838				ARRAY_SIZE(tert_tdm_rx_1_mixer_controls)),
 839	SND_SOC_DAPM_MIXER("TERT_TDM_RX_2 Audio Mixer", SND_SOC_NOPM, 0, 0,
 840				tert_tdm_rx_2_mixer_controls,
 841				ARRAY_SIZE(tert_tdm_rx_2_mixer_controls)),
 842	SND_SOC_DAPM_MIXER("TERT_TDM_RX_3 Audio Mixer", SND_SOC_NOPM, 0, 0,
 843				tert_tdm_rx_3_mixer_controls,
 844				ARRAY_SIZE(tert_tdm_rx_3_mixer_controls)),
 845	SND_SOC_DAPM_MIXER("TERT_TDM_RX_4 Audio Mixer", SND_SOC_NOPM, 0, 0,
 846				tert_tdm_rx_4_mixer_controls,
 847				ARRAY_SIZE(tert_tdm_rx_4_mixer_controls)),
 848	SND_SOC_DAPM_MIXER("TERT_TDM_RX_5 Audio Mixer", SND_SOC_NOPM, 0, 0,
 849				tert_tdm_rx_5_mixer_controls,
 850				ARRAY_SIZE(tert_tdm_rx_5_mixer_controls)),
 851	SND_SOC_DAPM_MIXER("TERT_TDM_RX_6 Audio Mixer", SND_SOC_NOPM, 0, 0,
 852				tert_tdm_rx_6_mixer_controls,
 853				ARRAY_SIZE(tert_tdm_rx_6_mixer_controls)),
 854	SND_SOC_DAPM_MIXER("TERT_TDM_RX_7 Audio Mixer", SND_SOC_NOPM, 0, 0,
 855				tert_tdm_rx_7_mixer_controls,
 856				ARRAY_SIZE(tert_tdm_rx_7_mixer_controls)),
 857
 858	SND_SOC_DAPM_MIXER("QUAT_TDM_RX_0 Audio Mixer", SND_SOC_NOPM, 0, 0,
 859				quat_tdm_rx_0_mixer_controls,
 860				ARRAY_SIZE(quat_tdm_rx_0_mixer_controls)),
 861	SND_SOC_DAPM_MIXER("QUAT_TDM_RX_1 Audio Mixer", SND_SOC_NOPM, 0, 0,
 862				quat_tdm_rx_1_mixer_controls,
 863				ARRAY_SIZE(quat_tdm_rx_1_mixer_controls)),
 864	SND_SOC_DAPM_MIXER("QUAT_TDM_RX_2 Audio Mixer", SND_SOC_NOPM, 0, 0,
 865				quat_tdm_rx_2_mixer_controls,
 866				ARRAY_SIZE(quat_tdm_rx_2_mixer_controls)),
 867	SND_SOC_DAPM_MIXER("QUAT_TDM_RX_3 Audio Mixer", SND_SOC_NOPM, 0, 0,
 868				quat_tdm_rx_3_mixer_controls,
 869				ARRAY_SIZE(quat_tdm_rx_3_mixer_controls)),
 870	SND_SOC_DAPM_MIXER("QUAT_TDM_RX_4 Audio Mixer", SND_SOC_NOPM, 0, 0,
 871				quat_tdm_rx_4_mixer_controls,
 872				ARRAY_SIZE(quat_tdm_rx_4_mixer_controls)),
 873	SND_SOC_DAPM_MIXER("QUAT_TDM_RX_5 Audio Mixer", SND_SOC_NOPM, 0, 0,
 874				quat_tdm_rx_5_mixer_controls,
 875				ARRAY_SIZE(quat_tdm_rx_5_mixer_controls)),
 876	SND_SOC_DAPM_MIXER("QUAT_TDM_RX_6 Audio Mixer", SND_SOC_NOPM, 0, 0,
 877				quat_tdm_rx_6_mixer_controls,
 878				ARRAY_SIZE(quat_tdm_rx_6_mixer_controls)),
 879	SND_SOC_DAPM_MIXER("QUAT_TDM_RX_7 Audio Mixer", SND_SOC_NOPM, 0, 0,
 880				quat_tdm_rx_7_mixer_controls,
 881				ARRAY_SIZE(quat_tdm_rx_7_mixer_controls)),
 882
 883	SND_SOC_DAPM_MIXER("QUIN_TDM_RX_0 Audio Mixer", SND_SOC_NOPM, 0, 0,
 884				quin_tdm_rx_0_mixer_controls,
 885				ARRAY_SIZE(quin_tdm_rx_0_mixer_controls)),
 886	SND_SOC_DAPM_MIXER("QUIN_TDM_RX_1 Audio Mixer", SND_SOC_NOPM, 0, 0,
 887				quin_tdm_rx_1_mixer_controls,
 888				ARRAY_SIZE(quin_tdm_rx_1_mixer_controls)),
 889	SND_SOC_DAPM_MIXER("QUIN_TDM_RX_2 Audio Mixer", SND_SOC_NOPM, 0, 0,
 890				quin_tdm_rx_2_mixer_controls,
 891				ARRAY_SIZE(quin_tdm_rx_2_mixer_controls)),
 892	SND_SOC_DAPM_MIXER("QUIN_TDM_RX_3 Audio Mixer", SND_SOC_NOPM, 0, 0,
 893				quin_tdm_rx_3_mixer_controls,
 894				ARRAY_SIZE(quin_tdm_rx_3_mixer_controls)),
 895	SND_SOC_DAPM_MIXER("QUIN_TDM_RX_4 Audio Mixer", SND_SOC_NOPM, 0, 0,
 896				quin_tdm_rx_4_mixer_controls,
 897				ARRAY_SIZE(quin_tdm_rx_4_mixer_controls)),
 898	SND_SOC_DAPM_MIXER("QUIN_TDM_RX_5 Audio Mixer", SND_SOC_NOPM, 0, 0,
 899				quin_tdm_rx_5_mixer_controls,
 900				ARRAY_SIZE(quin_tdm_rx_5_mixer_controls)),
 901	SND_SOC_DAPM_MIXER("QUIN_TDM_RX_6 Audio Mixer", SND_SOC_NOPM, 0, 0,
 902				quin_tdm_rx_6_mixer_controls,
 903				ARRAY_SIZE(quin_tdm_rx_6_mixer_controls)),
 904	SND_SOC_DAPM_MIXER("QUIN_TDM_RX_7 Audio Mixer", SND_SOC_NOPM, 0, 0,
 905				quin_tdm_rx_7_mixer_controls,
 906				ARRAY_SIZE(quin_tdm_rx_7_mixer_controls)),
 907
 908	SND_SOC_DAPM_MIXER("WSA_CODEC_DMA_RX_0 Audio Mixer", SND_SOC_NOPM, 0, 0,
 909		wsa_codec_dma_rx_0_mixer_controls,
 910		ARRAY_SIZE(wsa_codec_dma_rx_0_mixer_controls)),
 911	SND_SOC_DAPM_MIXER("WSA_CODEC_DMA_RX_1 Audio Mixer", SND_SOC_NOPM, 0, 0,
 912		wsa_codec_dma_rx_1_mixer_controls,
 913		ARRAY_SIZE(wsa_codec_dma_rx_1_mixer_controls)),
 914	SND_SOC_DAPM_MIXER("RX_CODEC_DMA_RX_0 Audio Mixer", SND_SOC_NOPM, 0, 0,
 915		rx_codec_dma_rx_0_mixer_controls,
 916		ARRAY_SIZE(rx_codec_dma_rx_0_mixer_controls)),
 917	SND_SOC_DAPM_MIXER("RX_CODEC_DMA_RX_1 Audio Mixer", SND_SOC_NOPM, 0, 0,
 918		rx_codec_dma_rx_1_mixer_controls,
 919		ARRAY_SIZE(rx_codec_dma_rx_1_mixer_controls)),
 920	SND_SOC_DAPM_MIXER("RX_CODEC_DMA_RX_2 Audio Mixer", SND_SOC_NOPM, 0, 0,
 921		rx_codec_dma_rx_2_mixer_controls,
 922		ARRAY_SIZE(rx_codec_dma_rx_2_mixer_controls)),
 923	SND_SOC_DAPM_MIXER("RX_CODEC_DMA_RX_3 Audio Mixer", SND_SOC_NOPM, 0, 0,
 924		rx_codec_dma_rx_3_mixer_controls,
 925		ARRAY_SIZE(rx_codec_dma_rx_3_mixer_controls)),
 926	SND_SOC_DAPM_MIXER("RX_CODEC_DMA_RX_4 Audio Mixer", SND_SOC_NOPM, 0, 0,
 927		rx_codec_dma_rx_4_mixer_controls,
 928		ARRAY_SIZE(rx_codec_dma_rx_4_mixer_controls)),
 929	SND_SOC_DAPM_MIXER("RX_CODEC_DMA_RX_5 Audio Mixer", SND_SOC_NOPM, 0, 0,
 930		rx_codec_dma_rx_5_mixer_controls,
 931		ARRAY_SIZE(rx_codec_dma_rx_5_mixer_controls)),
 932	SND_SOC_DAPM_MIXER("RX_CODEC_DMA_RX_6 Audio Mixer", SND_SOC_NOPM, 0, 0,
 933		rxcodec_dma_rx_6_mixer_controls,
 934		ARRAY_SIZE(rxcodec_dma_rx_6_mixer_controls)),
 935	SND_SOC_DAPM_MIXER("RX_CODEC_DMA_RX_7 Audio Mixer", SND_SOC_NOPM, 0, 0,
 936		rx_codec_dma_rx_7_mixer_controls,
 937		ARRAY_SIZE(rx_codec_dma_rx_7_mixer_controls)),
 938	SND_SOC_DAPM_MIXER("USB_RX Audio Mixer", SND_SOC_NOPM, 0, 0,
 939			   usb_rx_mixer_controls,
 940			   ARRAY_SIZE(usb_rx_mixer_controls)),
 941	SND_SOC_DAPM_MIXER("MultiMedia1 Mixer", SND_SOC_NOPM, 0, 0,
 942		mmul1_mixer_controls, ARRAY_SIZE(mmul1_mixer_controls)),
 943	SND_SOC_DAPM_MIXER("MultiMedia2 Mixer", SND_SOC_NOPM, 0, 0,
 944		mmul2_mixer_controls, ARRAY_SIZE(mmul2_mixer_controls)),
 945	SND_SOC_DAPM_MIXER("MultiMedia3 Mixer", SND_SOC_NOPM, 0, 0,
 946		mmul3_mixer_controls, ARRAY_SIZE(mmul3_mixer_controls)),
 947	SND_SOC_DAPM_MIXER("MultiMedia4 Mixer", SND_SOC_NOPM, 0, 0,
 948		mmul4_mixer_controls, ARRAY_SIZE(mmul4_mixer_controls)),
 949	SND_SOC_DAPM_MIXER("MultiMedia5 Mixer", SND_SOC_NOPM, 0, 0,
 950		mmul5_mixer_controls, ARRAY_SIZE(mmul5_mixer_controls)),
 951	SND_SOC_DAPM_MIXER("MultiMedia6 Mixer", SND_SOC_NOPM, 0, 0,
 952		mmul6_mixer_controls, ARRAY_SIZE(mmul6_mixer_controls)),
 953	SND_SOC_DAPM_MIXER("MultiMedia7 Mixer", SND_SOC_NOPM, 0, 0,
 954		mmul7_mixer_controls, ARRAY_SIZE(mmul7_mixer_controls)),
 955	SND_SOC_DAPM_MIXER("MultiMedia8 Mixer", SND_SOC_NOPM, 0, 0,
 956		mmul8_mixer_controls, ARRAY_SIZE(mmul8_mixer_controls)),
 957};
 958
 959static const struct snd_soc_dapm_route intercon[] = {
 960	Q6ROUTING_RX_DAPM_ROUTE("HDMI Mixer", "HDMI_RX"),
 961	Q6ROUTING_RX_DAPM_ROUTE("DISPLAY_PORT_RX Audio Mixer",
 962				"DISPLAY_PORT_RX"),
 963	Q6ROUTING_RX_DAPM_ROUTE("SLIMBUS_0_RX Audio Mixer", "SLIMBUS_0_RX"),
 964	Q6ROUTING_RX_DAPM_ROUTE("SLIMBUS_1_RX Audio Mixer", "SLIMBUS_1_RX"),
 965	Q6ROUTING_RX_DAPM_ROUTE("SLIMBUS_2_RX Audio Mixer", "SLIMBUS_2_RX"),
 966	Q6ROUTING_RX_DAPM_ROUTE("SLIMBUS_3_RX Audio Mixer", "SLIMBUS_3_RX"),
 967	Q6ROUTING_RX_DAPM_ROUTE("SLIMBUS_4_RX Audio Mixer", "SLIMBUS_4_RX"),
 968	Q6ROUTING_RX_DAPM_ROUTE("SLIMBUS_5_RX Audio Mixer", "SLIMBUS_5_RX"),
 969	Q6ROUTING_RX_DAPM_ROUTE("SLIMBUS_6_RX Audio Mixer", "SLIMBUS_6_RX"),
 970	Q6ROUTING_RX_DAPM_ROUTE("QUAT_MI2S_RX Audio Mixer", "QUAT_MI2S_RX"),
 971	Q6ROUTING_RX_DAPM_ROUTE("QUIN_MI2S_RX Audio Mixer", "QUIN_MI2S_RX"),
 972	Q6ROUTING_RX_DAPM_ROUTE("TERT_MI2S_RX Audio Mixer", "TERT_MI2S_RX"),
 973	Q6ROUTING_RX_DAPM_ROUTE("SEC_MI2S_RX Audio Mixer", "SEC_MI2S_RX"),
 974	Q6ROUTING_RX_DAPM_ROUTE("PRI_MI2S_RX Audio Mixer", "PRI_MI2S_RX"),
 975	Q6ROUTING_RX_DAPM_ROUTE("PRIMARY_TDM_RX_0 Audio Mixer",
 976				"PRIMARY_TDM_RX_0"),
 977	Q6ROUTING_RX_DAPM_ROUTE("PRIMARY_TDM_RX_1 Audio Mixer",
 978				"PRIMARY_TDM_RX_1"),
 979	Q6ROUTING_RX_DAPM_ROUTE("PRIMARY_TDM_RX_2 Audio Mixer",
 980				"PRIMARY_TDM_RX_2"),
 981	Q6ROUTING_RX_DAPM_ROUTE("PRIMARY_TDM_RX_3 Audio Mixer",
 982				"PRIMARY_TDM_RX_3"),
 983	Q6ROUTING_RX_DAPM_ROUTE("PRIMARY_TDM_RX_4 Audio Mixer",
 984				"PRIMARY_TDM_RX_4"),
 985	Q6ROUTING_RX_DAPM_ROUTE("PRIMARY_TDM_RX_5 Audio Mixer",
 986				"PRIMARY_TDM_RX_5"),
 987	Q6ROUTING_RX_DAPM_ROUTE("PRIMARY_TDM_RX_6 Audio Mixer",
 988				"PRIMARY_TDM_RX_6"),
 989	Q6ROUTING_RX_DAPM_ROUTE("PRIMARY_TDM_RX_7 Audio Mixer",
 990				"PRIMARY_TDM_RX_7"),
 991	Q6ROUTING_RX_DAPM_ROUTE("SEC_TDM_RX_0 Audio Mixer", "SEC_TDM_RX_0"),
 992	Q6ROUTING_RX_DAPM_ROUTE("SEC_TDM_RX_1 Audio Mixer", "SEC_TDM_RX_1"),
 993	Q6ROUTING_RX_DAPM_ROUTE("SEC_TDM_RX_2 Audio Mixer", "SEC_TDM_RX_2"),
 994	Q6ROUTING_RX_DAPM_ROUTE("SEC_TDM_RX_3 Audio Mixer", "SEC_TDM_RX_3"),
 995	Q6ROUTING_RX_DAPM_ROUTE("SEC_TDM_RX_4 Audio Mixer", "SEC_TDM_RX_4"),
 996	Q6ROUTING_RX_DAPM_ROUTE("SEC_TDM_RX_5 Audio Mixer", "SEC_TDM_RX_5"),
 997	Q6ROUTING_RX_DAPM_ROUTE("SEC_TDM_RX_6 Audio Mixer", "SEC_TDM_RX_6"),
 998	Q6ROUTING_RX_DAPM_ROUTE("SEC_TDM_RX_7 Audio Mixer", "SEC_TDM_RX_7"),
 999	Q6ROUTING_RX_DAPM_ROUTE("TERT_TDM_RX_0 Audio Mixer", "TERT_TDM_RX_0"),
1000	Q6ROUTING_RX_DAPM_ROUTE("TERT_TDM_RX_1 Audio Mixer", "TERT_TDM_RX_1"),
1001	Q6ROUTING_RX_DAPM_ROUTE("TERT_TDM_RX_2 Audio Mixer", "TERT_TDM_RX_2"),
1002	Q6ROUTING_RX_DAPM_ROUTE("TERT_TDM_RX_3 Audio Mixer", "TERT_TDM_RX_3"),
1003	Q6ROUTING_RX_DAPM_ROUTE("TERT_TDM_RX_4 Audio Mixer", "TERT_TDM_RX_4"),
1004	Q6ROUTING_RX_DAPM_ROUTE("TERT_TDM_RX_5 Audio Mixer", "TERT_TDM_RX_5"),
1005	Q6ROUTING_RX_DAPM_ROUTE("TERT_TDM_RX_6 Audio Mixer", "TERT_TDM_RX_6"),
1006	Q6ROUTING_RX_DAPM_ROUTE("TERT_TDM_RX_7 Audio Mixer", "TERT_TDM_RX_7"),
1007	Q6ROUTING_RX_DAPM_ROUTE("QUAT_TDM_RX_0 Audio Mixer", "QUAT_TDM_RX_0"),
1008	Q6ROUTING_RX_DAPM_ROUTE("QUAT_TDM_RX_1 Audio Mixer", "QUAT_TDM_RX_1"),
1009	Q6ROUTING_RX_DAPM_ROUTE("QUAT_TDM_RX_2 Audio Mixer", "QUAT_TDM_RX_2"),
1010	Q6ROUTING_RX_DAPM_ROUTE("QUAT_TDM_RX_3 Audio Mixer", "QUAT_TDM_RX_3"),
1011	Q6ROUTING_RX_DAPM_ROUTE("QUAT_TDM_RX_4 Audio Mixer", "QUAT_TDM_RX_4"),
1012	Q6ROUTING_RX_DAPM_ROUTE("QUAT_TDM_RX_5 Audio Mixer", "QUAT_TDM_RX_5"),
1013	Q6ROUTING_RX_DAPM_ROUTE("QUAT_TDM_RX_6 Audio Mixer", "QUAT_TDM_RX_6"),
1014	Q6ROUTING_RX_DAPM_ROUTE("QUAT_TDM_RX_7 Audio Mixer", "QUAT_TDM_RX_7"),
1015	Q6ROUTING_RX_DAPM_ROUTE("QUIN_TDM_RX_0 Audio Mixer", "QUIN_TDM_RX_0"),
1016	Q6ROUTING_RX_DAPM_ROUTE("QUIN_TDM_RX_1 Audio Mixer", "QUIN_TDM_RX_1"),
1017	Q6ROUTING_RX_DAPM_ROUTE("QUIN_TDM_RX_2 Audio Mixer", "QUIN_TDM_RX_2"),
1018	Q6ROUTING_RX_DAPM_ROUTE("QUIN_TDM_RX_3 Audio Mixer", "QUIN_TDM_RX_3"),
1019	Q6ROUTING_RX_DAPM_ROUTE("QUIN_TDM_RX_4 Audio Mixer", "QUIN_TDM_RX_4"),
1020	Q6ROUTING_RX_DAPM_ROUTE("QUIN_TDM_RX_5 Audio Mixer", "QUIN_TDM_RX_5"),
1021	Q6ROUTING_RX_DAPM_ROUTE("QUIN_TDM_RX_6 Audio Mixer", "QUIN_TDM_RX_6"),
1022	Q6ROUTING_RX_DAPM_ROUTE("QUIN_TDM_RX_7 Audio Mixer", "QUIN_TDM_RX_7"),
1023	Q6ROUTING_RX_DAPM_ROUTE("WSA_CODEC_DMA_RX_0 Audio Mixer", "WSA_CODEC_DMA_RX_0"),
1024	Q6ROUTING_RX_DAPM_ROUTE("WSA_CODEC_DMA_RX_1 Audio Mixer", "WSA_CODEC_DMA_RX_1"),
1025	Q6ROUTING_RX_DAPM_ROUTE("RX_CODEC_DMA_RX_0 Audio Mixer", "RX_CODEC_DMA_RX_0"),
1026	Q6ROUTING_RX_DAPM_ROUTE("RX_CODEC_DMA_RX_1 Audio Mixer", "RX_CODEC_DMA_RX_1"),
1027	Q6ROUTING_RX_DAPM_ROUTE("RX_CODEC_DMA_RX_2 Audio Mixer", "RX_CODEC_DMA_RX_2"),
1028	Q6ROUTING_RX_DAPM_ROUTE("RX_CODEC_DMA_RX_3 Audio Mixer", "RX_CODEC_DMA_RX_3"),
1029	Q6ROUTING_RX_DAPM_ROUTE("RX_CODEC_DMA_RX_4 Audio Mixer", "RX_CODEC_DMA_RX_4"),
1030	Q6ROUTING_RX_DAPM_ROUTE("RX_CODEC_DMA_RX_5 Audio Mixer", "RX_CODEC_DMA_RX_5"),
1031	Q6ROUTING_RX_DAPM_ROUTE("RX_CODEC_DMA_RX_6 Audio Mixer", "RX_CODEC_DMA_RX_6"),
1032	Q6ROUTING_RX_DAPM_ROUTE("RX_CODEC_DMA_RX_7 Audio Mixer", "RX_CODEC_DMA_RX_7"),
1033	Q6ROUTING_RX_DAPM_ROUTE("USB_RX Audio Mixer", "USB_RX"),
1034	Q6ROUTING_TX_DAPM_ROUTE("MultiMedia1 Mixer"),
1035	Q6ROUTING_TX_DAPM_ROUTE("MultiMedia2 Mixer"),
1036	Q6ROUTING_TX_DAPM_ROUTE("MultiMedia3 Mixer"),
1037	Q6ROUTING_TX_DAPM_ROUTE("MultiMedia4 Mixer"),
1038	Q6ROUTING_TX_DAPM_ROUTE("MultiMedia5 Mixer"),
1039	Q6ROUTING_TX_DAPM_ROUTE("MultiMedia6 Mixer"),
1040	Q6ROUTING_TX_DAPM_ROUTE("MultiMedia7 Mixer"),
1041	Q6ROUTING_TX_DAPM_ROUTE("MultiMedia8 Mixer"),
1042
1043	{"MM_UL1", NULL, "MultiMedia1 Mixer"},
1044	{"MM_UL2", NULL, "MultiMedia2 Mixer"},
1045	{"MM_UL3", NULL, "MultiMedia3 Mixer"},
1046	{"MM_UL4", NULL, "MultiMedia4 Mixer"},
1047	{"MM_UL5", NULL, "MultiMedia5 Mixer"},
1048	{"MM_UL6", NULL, "MultiMedia6 Mixer"},
1049	{"MM_UL7", NULL, "MultiMedia7 Mixer"},
1050	{"MM_UL8", NULL, "MultiMedia8 Mixer"},
1051};
1052
1053static int routing_hw_params(struct snd_soc_component *component,
1054			     struct snd_pcm_substream *substream,
1055			     struct snd_pcm_hw_params *params)
1056{
1057	struct snd_soc_pcm_runtime *rtd = snd_soc_substream_to_rtd(substream);
1058	struct msm_routing_data *data = dev_get_drvdata(component->dev);
1059	unsigned int be_id = snd_soc_rtd_to_cpu(rtd, 0)->id;
1060	struct session_data *session;
1061	int path_type;
1062
1063	if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
1064		path_type = ADM_PATH_PLAYBACK;
1065	else
1066		path_type = ADM_PATH_LIVE_REC;
1067
1068	if (be_id >= AFE_MAX_PORTS)
1069		return -EINVAL;
1070
1071	session = &data->port_data[be_id];
1072
1073	mutex_lock(&data->lock);
1074
1075	session->path_type = path_type;
1076	session->sample_rate = params_rate(params);
1077	session->channels = params_channels(params);
1078
1079	switch (params_format(params)) {
1080	case SNDRV_PCM_FORMAT_S16_LE:
1081			session->bits_per_sample = 16;
1082		break;
1083	case SNDRV_PCM_FORMAT_S24_LE:
1084			session->bits_per_sample = 24;
1085		break;
1086	default:
1087		break;
1088	}
1089
1090	mutex_unlock(&data->lock);
1091	return 0;
1092}
1093
1094static int msm_routing_probe(struct snd_soc_component *c)
1095{
1096	int i;
1097
1098	for (i = 0; i < MAX_SESSIONS; i++) {
1099		routing_data->sessions[i].port_id = -1;
1100		routing_data->sessions[i].fedai_id = -1;
1101	}
1102
1103	return 0;
1104}
1105
1106static unsigned int q6routing_reg_read(struct snd_soc_component *component,
1107				       unsigned int reg)
1108{
1109	/* default value */
1110	return 0;
1111}
1112
1113static int q6routing_reg_write(struct snd_soc_component *component,
1114			       unsigned int reg, unsigned int val)
1115{
1116	/* dummy */
1117	return 0;
1118}
1119
1120static const struct snd_soc_component_driver msm_soc_routing_component = {
1121	.probe = msm_routing_probe,
1122	.name = DRV_NAME,
1123	.hw_params = routing_hw_params,
1124	.dapm_widgets = msm_qdsp6_widgets,
1125	.num_dapm_widgets = ARRAY_SIZE(msm_qdsp6_widgets),
1126	.dapm_routes = intercon,
1127	.num_dapm_routes = ARRAY_SIZE(intercon),
1128	.read = q6routing_reg_read,
1129	.write = q6routing_reg_write,
1130};
1131
1132static int q6pcm_routing_probe(struct platform_device *pdev)
1133{
1134	struct device *dev = &pdev->dev;
1135
1136	routing_data = kzalloc(sizeof(*routing_data), GFP_KERNEL);
1137	if (!routing_data)
1138		return -ENOMEM;
1139
1140	routing_data->dev = dev;
1141
1142	mutex_init(&routing_data->lock);
1143	dev_set_drvdata(dev, routing_data);
1144
1145	return devm_snd_soc_register_component(dev, &msm_soc_routing_component,
1146					  NULL, 0);
1147}
1148
1149static void q6pcm_routing_remove(struct platform_device *pdev)
1150{
1151	kfree(routing_data);
1152	routing_data = NULL;
1153}
1154
1155#ifdef CONFIG_OF
1156static const struct of_device_id q6pcm_routing_device_id[] = {
1157	{ .compatible = "qcom,q6adm-routing" },
1158	{},
1159};
1160MODULE_DEVICE_TABLE(of, q6pcm_routing_device_id);
1161#endif
1162
1163static struct platform_driver q6pcm_routing_platform_driver = {
1164	.driver = {
1165		.name = "q6routing",
1166		.of_match_table = of_match_ptr(q6pcm_routing_device_id),
1167	},
1168	.probe = q6pcm_routing_probe,
1169	.remove = q6pcm_routing_remove,
1170};
1171module_platform_driver(q6pcm_routing_platform_driver);
1172
1173MODULE_DESCRIPTION("Q6 Routing platform");
1174MODULE_LICENSE("GPL v2");
~/ Read-only file preview.