linux/sound/soc/qcom/qdsp6/q6routing.c
<<
>>
Prefs
   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");
1171