cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

q6routing.c (47007B)


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