Back to home page

OSCL-LXR

 
 

    


0001 // SPDX-License-Identifier: GPL-2.0
0002 // Copyright (c) 2011-2017, The Linux Foundation. All rights reserved.
0003 // Copyright (c) 2018, Linaro Limited
0004 
0005 #include <linux/init.h>
0006 #include <linux/err.h>
0007 #include <linux/module.h>
0008 #include <linux/platform_device.h>
0009 #include <linux/of_platform.h>
0010 #include <linux/bitops.h>
0011 #include <linux/mutex.h>
0012 #include <linux/of_device.h>
0013 #include <linux/slab.h>
0014 #include <sound/core.h>
0015 #include <sound/soc.h>
0016 #include <sound/soc-dapm.h>
0017 #include <sound/pcm.h>
0018 #include <sound/control.h>
0019 #include <sound/asound.h>
0020 #include <sound/pcm_params.h>
0021 #include "q6afe.h"
0022 #include "q6asm.h"
0023 #include "q6adm.h"
0024 #include "q6routing.h"
0025 
0026 #define DRV_NAME "q6routing-component"
0027 
0028 #define Q6ROUTING_RX_MIXERS(id)                     \
0029     SOC_SINGLE_EXT("MultiMedia1", id,               \
0030     MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer,\
0031     msm_routing_put_audio_mixer),                   \
0032     SOC_SINGLE_EXT("MultiMedia2", id,               \
0033     MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer,\
0034     msm_routing_put_audio_mixer),                   \
0035     SOC_SINGLE_EXT("MultiMedia3", id,               \
0036     MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer,\
0037     msm_routing_put_audio_mixer),                   \
0038     SOC_SINGLE_EXT("MultiMedia4", id,               \
0039     MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer,\
0040     msm_routing_put_audio_mixer),                   \
0041     SOC_SINGLE_EXT("MultiMedia5", id,               \
0042     MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer,\
0043     msm_routing_put_audio_mixer),                   \
0044     SOC_SINGLE_EXT("MultiMedia6", id,               \
0045     MSM_FRONTEND_DAI_MULTIMEDIA6, 1, 0, msm_routing_get_audio_mixer,\
0046     msm_routing_put_audio_mixer),                   \
0047     SOC_SINGLE_EXT("MultiMedia7", id,               \
0048     MSM_FRONTEND_DAI_MULTIMEDIA7, 1, 0, msm_routing_get_audio_mixer,\
0049     msm_routing_put_audio_mixer),                   \
0050     SOC_SINGLE_EXT("MultiMedia8", id,               \
0051     MSM_FRONTEND_DAI_MULTIMEDIA8, 1, 0, msm_routing_get_audio_mixer,\
0052     msm_routing_put_audio_mixer),
0053 
0054 #define Q6ROUTING_RX_DAPM_ROUTE(mix_name, s)    \
0055     { mix_name, "MultiMedia1", "MM_DL1" },  \
0056     { mix_name, "MultiMedia2", "MM_DL2" },  \
0057     { mix_name, "MultiMedia3", "MM_DL3" },  \
0058     { mix_name, "MultiMedia4", "MM_DL4" },  \
0059     { mix_name, "MultiMedia5", "MM_DL5" },  \
0060     { mix_name, "MultiMedia6", "MM_DL6" },  \
0061     { mix_name, "MultiMedia7", "MM_DL7" },  \
0062     { mix_name, "MultiMedia8", "MM_DL8" },  \
0063     { s, NULL, mix_name }
0064 
0065 #define Q6ROUTING_TX_DAPM_ROUTE(mix_name)       \
0066     { mix_name, "PRI_MI2S_TX", "PRI_MI2S_TX" }, \
0067     { mix_name, "SEC_MI2S_TX", "SEC_MI2S_TX" }, \
0068     { mix_name, "QUAT_MI2S_TX", "QUAT_MI2S_TX" },   \
0069     { mix_name, "QUIN_MI2S_TX", "QUIN_MI2S_TX" },   \
0070     { mix_name, "TERT_MI2S_TX", "TERT_MI2S_TX" },       \
0071     { mix_name, "SLIMBUS_0_TX", "SLIMBUS_0_TX" },       \
0072     { mix_name, "SLIMBUS_1_TX", "SLIMBUS_1_TX" },       \
0073     { mix_name, "SLIMBUS_2_TX", "SLIMBUS_2_TX" },       \
0074     { mix_name, "SLIMBUS_3_TX", "SLIMBUS_3_TX" },       \
0075     { mix_name, "SLIMBUS_4_TX", "SLIMBUS_4_TX" },       \
0076     { mix_name, "SLIMBUS_5_TX", "SLIMBUS_5_TX" },       \
0077     { mix_name, "SLIMBUS_6_TX", "SLIMBUS_6_TX" },       \
0078     { mix_name, "PRIMARY_TDM_TX_0", "PRIMARY_TDM_TX_0"},    \
0079     { mix_name, "PRIMARY_TDM_TX_1", "PRIMARY_TDM_TX_1"},    \
0080     { mix_name, "PRIMARY_TDM_TX_2", "PRIMARY_TDM_TX_2"},    \
0081     { mix_name, "PRIMARY_TDM_TX_3", "PRIMARY_TDM_TX_3"},    \
0082     { mix_name, "PRIMARY_TDM_TX_4", "PRIMARY_TDM_TX_4"},    \
0083     { mix_name, "PRIMARY_TDM_TX_5", "PRIMARY_TDM_TX_5"},    \
0084     { mix_name, "PRIMARY_TDM_TX_6", "PRIMARY_TDM_TX_6"},    \
0085     { mix_name, "PRIMARY_TDM_TX_7", "PRIMARY_TDM_TX_7"},    \
0086     { mix_name, "SEC_TDM_TX_0", "SEC_TDM_TX_0"},        \
0087     { mix_name, "SEC_TDM_TX_1", "SEC_TDM_TX_1"},        \
0088     { mix_name, "SEC_TDM_TX_2", "SEC_TDM_TX_2"},        \
0089     { mix_name, "SEC_TDM_TX_3", "SEC_TDM_TX_3"},        \
0090     { mix_name, "SEC_TDM_TX_4", "SEC_TDM_TX_4"},        \
0091     { mix_name, "SEC_TDM_TX_5", "SEC_TDM_TX_5"},        \
0092     { mix_name, "SEC_TDM_TX_6", "SEC_TDM_TX_6"},        \
0093     { mix_name, "SEC_TDM_TX_7", "SEC_TDM_TX_7"},        \
0094     { mix_name, "TERT_TDM_TX_0", "TERT_TDM_TX_0"},      \
0095     { mix_name, "TERT_TDM_TX_1", "TERT_TDM_TX_1"},      \
0096     { mix_name, "TERT_TDM_TX_2", "TERT_TDM_TX_2"},      \
0097     { mix_name, "TERT_TDM_TX_3", "TERT_TDM_TX_3"},      \
0098     { mix_name, "TERT_TDM_TX_4", "TERT_TDM_TX_4"},      \
0099     { mix_name, "TERT_TDM_TX_5", "TERT_TDM_TX_5"},      \
0100     { mix_name, "TERT_TDM_TX_6", "TERT_TDM_TX_6"},      \
0101     { mix_name, "TERT_TDM_TX_7", "TERT_TDM_TX_7"},      \
0102     { mix_name, "QUAT_TDM_TX_0", "QUAT_TDM_TX_0"},      \
0103     { mix_name, "QUAT_TDM_TX_1", "QUAT_TDM_TX_1"},      \
0104     { mix_name, "QUAT_TDM_TX_2", "QUAT_TDM_TX_2"},      \
0105     { mix_name, "QUAT_TDM_TX_3", "QUAT_TDM_TX_3"},      \
0106     { mix_name, "QUAT_TDM_TX_4", "QUAT_TDM_TX_4"},      \
0107     { mix_name, "QUAT_TDM_TX_5", "QUAT_TDM_TX_5"},      \
0108     { mix_name, "QUAT_TDM_TX_6", "QUAT_TDM_TX_6"},      \
0109     { mix_name, "QUAT_TDM_TX_7", "QUAT_TDM_TX_7"},      \
0110     { mix_name, "QUIN_TDM_TX_0", "QUIN_TDM_TX_0"},      \
0111     { mix_name, "QUIN_TDM_TX_1", "QUIN_TDM_TX_1"},      \
0112     { mix_name, "QUIN_TDM_TX_2", "QUIN_TDM_TX_2"},      \
0113     { mix_name, "QUIN_TDM_TX_3", "QUIN_TDM_TX_3"},      \
0114     { mix_name, "QUIN_TDM_TX_4", "QUIN_TDM_TX_4"},      \
0115     { mix_name, "QUIN_TDM_TX_5", "QUIN_TDM_TX_5"},      \
0116     { mix_name, "QUIN_TDM_TX_6", "QUIN_TDM_TX_6"},      \
0117     { mix_name, "QUIN_TDM_TX_7", "QUIN_TDM_TX_7"},      \
0118     { mix_name, "WSA_CODEC_DMA_TX_0", "WSA_CODEC_DMA_TX_0"},    \
0119     { mix_name, "WSA_CODEC_DMA_TX_1", "WSA_CODEC_DMA_TX_1"},    \
0120     { mix_name, "WSA_CODEC_DMA_TX_2", "WSA_CODEC_DMA_TX_2"},    \
0121     { mix_name, "VA_CODEC_DMA_TX_0", "VA_CODEC_DMA_TX_0"},  \
0122     { mix_name, "VA_CODEC_DMA_TX_1", "VA_CODEC_DMA_TX_1"},  \
0123     { mix_name, "VA_CODEC_DMA_TX_2", "VA_CODEC_DMA_TX_2"},  \
0124     { mix_name, "TX_CODEC_DMA_TX_0", "TX_CODEC_DMA_TX_0"},  \
0125     { mix_name, "TX_CODEC_DMA_TX_1", "TX_CODEC_DMA_TX_1"},  \
0126     { mix_name, "TX_CODEC_DMA_TX_2", "TX_CODEC_DMA_TX_2"},  \
0127     { mix_name, "TX_CODEC_DMA_TX_3", "TX_CODEC_DMA_TX_3"},  \
0128     { mix_name, "TX_CODEC_DMA_TX_4", "TX_CODEC_DMA_TX_4"},  \
0129     { mix_name, "TX_CODEC_DMA_TX_5", "TX_CODEC_DMA_TX_5"}
0130 
0131 #define Q6ROUTING_TX_MIXERS(id)                     \
0132     SOC_SINGLE_EXT("PRI_MI2S_TX", PRIMARY_MI2S_TX,          \
0133         id, 1, 0, msm_routing_get_audio_mixer,          \
0134         msm_routing_put_audio_mixer),               \
0135     SOC_SINGLE_EXT("SEC_MI2S_TX", SECONDARY_MI2S_TX,        \
0136         id, 1, 0, msm_routing_get_audio_mixer,          \
0137         msm_routing_put_audio_mixer),               \
0138     SOC_SINGLE_EXT("TERT_MI2S_TX", TERTIARY_MI2S_TX,        \
0139         id, 1, 0, msm_routing_get_audio_mixer,          \
0140         msm_routing_put_audio_mixer),               \
0141     SOC_SINGLE_EXT("QUAT_MI2S_TX", QUATERNARY_MI2S_TX,      \
0142         id, 1, 0, msm_routing_get_audio_mixer,          \
0143         msm_routing_put_audio_mixer),               \
0144     SOC_SINGLE_EXT("QUIN_MI2S_TX", QUINARY_MI2S_TX,         \
0145         id, 1, 0, msm_routing_get_audio_mixer,          \
0146         msm_routing_put_audio_mixer),               \
0147     SOC_SINGLE_EXT("SLIMBUS_0_TX", SLIMBUS_0_TX,            \
0148         id, 1, 0, msm_routing_get_audio_mixer,          \
0149         msm_routing_put_audio_mixer),               \
0150     SOC_SINGLE_EXT("SLIMBUS_1_TX", SLIMBUS_1_TX,            \
0151         id, 1, 0, msm_routing_get_audio_mixer,          \
0152         msm_routing_put_audio_mixer),               \
0153     SOC_SINGLE_EXT("SLIMBUS_2_TX", SLIMBUS_2_TX,            \
0154         id, 1, 0, msm_routing_get_audio_mixer,          \
0155         msm_routing_put_audio_mixer),               \
0156     SOC_SINGLE_EXT("SLIMBUS_3_TX", SLIMBUS_3_TX,            \
0157         id, 1, 0, msm_routing_get_audio_mixer,          \
0158         msm_routing_put_audio_mixer),               \
0159     SOC_SINGLE_EXT("SLIMBUS_4_TX", SLIMBUS_4_TX,            \
0160         id, 1, 0, msm_routing_get_audio_mixer,          \
0161         msm_routing_put_audio_mixer),               \
0162     SOC_SINGLE_EXT("SLIMBUS_5_TX", SLIMBUS_5_TX,            \
0163         id, 1, 0, msm_routing_get_audio_mixer,          \
0164         msm_routing_put_audio_mixer),               \
0165     SOC_SINGLE_EXT("SLIMBUS_6_TX", SLIMBUS_6_TX,            \
0166         id, 1, 0, msm_routing_get_audio_mixer,          \
0167         msm_routing_put_audio_mixer),               \
0168     SOC_SINGLE_EXT("PRIMARY_TDM_TX_0", PRIMARY_TDM_TX_0,        \
0169         id, 1, 0, msm_routing_get_audio_mixer,          \
0170         msm_routing_put_audio_mixer),               \
0171     SOC_SINGLE_EXT("PRIMARY_TDM_TX_1", PRIMARY_TDM_TX_1,        \
0172         id, 1, 0, msm_routing_get_audio_mixer,          \
0173         msm_routing_put_audio_mixer),               \
0174     SOC_SINGLE_EXT("PRIMARY_TDM_TX_2", PRIMARY_TDM_TX_2,        \
0175         id, 1, 0, msm_routing_get_audio_mixer,          \
0176         msm_routing_put_audio_mixer),               \
0177     SOC_SINGLE_EXT("PRIMARY_TDM_TX_3", PRIMARY_TDM_TX_3,        \
0178         id, 1, 0, msm_routing_get_audio_mixer,          \
0179         msm_routing_put_audio_mixer),               \
0180     SOC_SINGLE_EXT("PRIMARY_TDM_TX_4", PRIMARY_TDM_TX_4,        \
0181         id, 1, 0, msm_routing_get_audio_mixer,          \
0182         msm_routing_put_audio_mixer),               \
0183     SOC_SINGLE_EXT("PRIMARY_TDM_TX_5", PRIMARY_TDM_TX_5,        \
0184         id, 1, 0, msm_routing_get_audio_mixer,          \
0185         msm_routing_put_audio_mixer),               \
0186     SOC_SINGLE_EXT("PRIMARY_TDM_TX_6", PRIMARY_TDM_TX_6,        \
0187         id, 1, 0, msm_routing_get_audio_mixer,          \
0188         msm_routing_put_audio_mixer),               \
0189     SOC_SINGLE_EXT("PRIMARY_TDM_TX_7", PRIMARY_TDM_TX_7,        \
0190         id, 1, 0, msm_routing_get_audio_mixer,          \
0191         msm_routing_put_audio_mixer),               \
0192     SOC_SINGLE_EXT("SEC_TDM_TX_0", SECONDARY_TDM_TX_0,      \
0193         id, 1, 0, msm_routing_get_audio_mixer,          \
0194         msm_routing_put_audio_mixer),               \
0195     SOC_SINGLE_EXT("SEC_TDM_TX_1", SECONDARY_TDM_TX_1,      \
0196         id, 1, 0, msm_routing_get_audio_mixer,          \
0197         msm_routing_put_audio_mixer),               \
0198     SOC_SINGLE_EXT("SEC_TDM_TX_2", SECONDARY_TDM_TX_2,      \
0199         id, 1, 0, msm_routing_get_audio_mixer,          \
0200         msm_routing_put_audio_mixer),               \
0201     SOC_SINGLE_EXT("SEC_TDM_TX_3", SECONDARY_TDM_TX_3,      \
0202         id, 1, 0, msm_routing_get_audio_mixer,          \
0203         msm_routing_put_audio_mixer),               \
0204     SOC_SINGLE_EXT("SEC_TDM_TX_4", SECONDARY_TDM_TX_4,      \
0205         id, 1, 0, msm_routing_get_audio_mixer,          \
0206         msm_routing_put_audio_mixer),               \
0207     SOC_SINGLE_EXT("SEC_TDM_TX_5", SECONDARY_TDM_TX_5,      \
0208         id, 1, 0, msm_routing_get_audio_mixer,          \
0209         msm_routing_put_audio_mixer),               \
0210     SOC_SINGLE_EXT("SEC_TDM_TX_6", SECONDARY_TDM_TX_6,      \
0211         id, 1, 0, msm_routing_get_audio_mixer,          \
0212         msm_routing_put_audio_mixer),               \
0213     SOC_SINGLE_EXT("SEC_TDM_TX_7", SECONDARY_TDM_TX_7,      \
0214         id, 1, 0, msm_routing_get_audio_mixer,          \
0215         msm_routing_put_audio_mixer),               \
0216     SOC_SINGLE_EXT("TERT_TDM_TX_0", TERTIARY_TDM_TX_0,      \
0217         id, 1, 0, msm_routing_get_audio_mixer,          \
0218         msm_routing_put_audio_mixer),               \
0219     SOC_SINGLE_EXT("TERT_TDM_TX_1", TERTIARY_TDM_TX_1,      \
0220         id, 1, 0, msm_routing_get_audio_mixer,          \
0221         msm_routing_put_audio_mixer),               \
0222     SOC_SINGLE_EXT("TERT_TDM_TX_2", TERTIARY_TDM_TX_2,      \
0223         id, 1, 0, msm_routing_get_audio_mixer,          \
0224         msm_routing_put_audio_mixer),               \
0225     SOC_SINGLE_EXT("TERT_TDM_TX_3", TERTIARY_TDM_TX_3,      \
0226         id, 1, 0, msm_routing_get_audio_mixer,          \
0227         msm_routing_put_audio_mixer),               \
0228     SOC_SINGLE_EXT("TERT_TDM_TX_4", TERTIARY_TDM_TX_4,      \
0229         id, 1, 0, msm_routing_get_audio_mixer,          \
0230         msm_routing_put_audio_mixer),               \
0231     SOC_SINGLE_EXT("TERT_TDM_TX_5", TERTIARY_TDM_TX_5,      \
0232         id, 1, 0, msm_routing_get_audio_mixer,          \
0233         msm_routing_put_audio_mixer),               \
0234     SOC_SINGLE_EXT("TERT_TDM_TX_6", TERTIARY_TDM_TX_6,      \
0235         id, 1, 0, msm_routing_get_audio_mixer,          \
0236         msm_routing_put_audio_mixer),               \
0237     SOC_SINGLE_EXT("TERT_TDM_TX_7", TERTIARY_TDM_TX_7,      \
0238         id, 1, 0, msm_routing_get_audio_mixer,          \
0239         msm_routing_put_audio_mixer),               \
0240     SOC_SINGLE_EXT("QUAT_TDM_TX_0", QUATERNARY_TDM_TX_0,        \
0241         id, 1, 0, msm_routing_get_audio_mixer,          \
0242         msm_routing_put_audio_mixer),               \
0243     SOC_SINGLE_EXT("QUAT_TDM_TX_1", QUATERNARY_TDM_TX_1,        \
0244         id, 1, 0, msm_routing_get_audio_mixer,          \
0245         msm_routing_put_audio_mixer),               \
0246     SOC_SINGLE_EXT("QUAT_TDM_TX_2", QUATERNARY_TDM_TX_2,        \
0247         id, 1, 0, msm_routing_get_audio_mixer,          \
0248         msm_routing_put_audio_mixer),               \
0249     SOC_SINGLE_EXT("QUAT_TDM_TX_3", QUATERNARY_TDM_TX_3,        \
0250         id, 1, 0, msm_routing_get_audio_mixer,          \
0251         msm_routing_put_audio_mixer),               \
0252     SOC_SINGLE_EXT("QUAT_TDM_TX_4", QUATERNARY_TDM_TX_4,        \
0253         id, 1, 0, msm_routing_get_audio_mixer,          \
0254         msm_routing_put_audio_mixer),               \
0255     SOC_SINGLE_EXT("QUAT_TDM_TX_5", QUATERNARY_TDM_TX_5,        \
0256         id, 1, 0, msm_routing_get_audio_mixer,          \
0257         msm_routing_put_audio_mixer),               \
0258     SOC_SINGLE_EXT("QUAT_TDM_TX_6", QUATERNARY_TDM_TX_6,        \
0259         id, 1, 0, msm_routing_get_audio_mixer,          \
0260         msm_routing_put_audio_mixer),               \
0261     SOC_SINGLE_EXT("QUAT_TDM_TX_7", QUATERNARY_TDM_TX_7,        \
0262         id, 1, 0, msm_routing_get_audio_mixer,          \
0263         msm_routing_put_audio_mixer),               \
0264     SOC_SINGLE_EXT("QUIN_TDM_TX_0", QUINARY_TDM_TX_0,       \
0265         id, 1, 0, msm_routing_get_audio_mixer,          \
0266         msm_routing_put_audio_mixer),               \
0267     SOC_SINGLE_EXT("QUIN_TDM_TX_1", QUINARY_TDM_TX_1,       \
0268         id, 1, 0, msm_routing_get_audio_mixer,          \
0269         msm_routing_put_audio_mixer),               \
0270     SOC_SINGLE_EXT("QUIN_TDM_TX_2", QUINARY_TDM_TX_2,       \
0271         id, 1, 0, msm_routing_get_audio_mixer,          \
0272         msm_routing_put_audio_mixer),               \
0273     SOC_SINGLE_EXT("QUIN_TDM_TX_3", QUINARY_TDM_TX_3,       \
0274         id, 1, 0, msm_routing_get_audio_mixer,          \
0275         msm_routing_put_audio_mixer),               \
0276     SOC_SINGLE_EXT("QUIN_TDM_TX_4", QUINARY_TDM_TX_4,       \
0277         id, 1, 0, msm_routing_get_audio_mixer,          \
0278         msm_routing_put_audio_mixer),               \
0279     SOC_SINGLE_EXT("QUIN_TDM_TX_5", QUINARY_TDM_TX_5,       \
0280         id, 1, 0, msm_routing_get_audio_mixer,          \
0281         msm_routing_put_audio_mixer),               \
0282     SOC_SINGLE_EXT("QUIN_TDM_TX_6", QUINARY_TDM_TX_6,       \
0283         id, 1, 0, msm_routing_get_audio_mixer,          \
0284         msm_routing_put_audio_mixer),               \
0285     SOC_SINGLE_EXT("QUIN_TDM_TX_7", QUINARY_TDM_TX_7,       \
0286         id, 1, 0, msm_routing_get_audio_mixer,          \
0287         msm_routing_put_audio_mixer),               \
0288     SOC_SINGLE_EXT("WSA_CODEC_DMA_TX_0", WSA_CODEC_DMA_TX_0,    \
0289         id, 1, 0, msm_routing_get_audio_mixer,          \
0290         msm_routing_put_audio_mixer),               \
0291     SOC_SINGLE_EXT("WSA_CODEC_DMA_TX_1", WSA_CODEC_DMA_TX_1,    \
0292         id, 1, 0, msm_routing_get_audio_mixer,          \
0293         msm_routing_put_audio_mixer),               \
0294     SOC_SINGLE_EXT("WSA_CODEC_DMA_TX_2", WSA_CODEC_DMA_TX_2,    \
0295         id, 1, 0, msm_routing_get_audio_mixer,          \
0296         msm_routing_put_audio_mixer),               \
0297     SOC_SINGLE_EXT("VA_CODEC_DMA_TX_0", VA_CODEC_DMA_TX_0,      \
0298         id, 1, 0, msm_routing_get_audio_mixer,          \
0299         msm_routing_put_audio_mixer),               \
0300     SOC_SINGLE_EXT("VA_CODEC_DMA_TX_1", VA_CODEC_DMA_TX_1,      \
0301         id, 1, 0, msm_routing_get_audio_mixer,          \
0302         msm_routing_put_audio_mixer),               \
0303     SOC_SINGLE_EXT("VA_CODEC_DMA_TX_2", VA_CODEC_DMA_TX_2,      \
0304         id, 1, 0, msm_routing_get_audio_mixer,          \
0305         msm_routing_put_audio_mixer),               \
0306     SOC_SINGLE_EXT("TX_CODEC_DMA_TX_0", TX_CODEC_DMA_TX_0,      \
0307         id, 1, 0, msm_routing_get_audio_mixer,          \
0308         msm_routing_put_audio_mixer),               \
0309     SOC_SINGLE_EXT("TX_CODEC_DMA_TX_1", TX_CODEC_DMA_TX_1,      \
0310         id, 1, 0, msm_routing_get_audio_mixer,          \
0311         msm_routing_put_audio_mixer),               \
0312     SOC_SINGLE_EXT("TX_CODEC_DMA_TX_2", TX_CODEC_DMA_TX_2,      \
0313         id, 1, 0, msm_routing_get_audio_mixer,          \
0314         msm_routing_put_audio_mixer),               \
0315     SOC_SINGLE_EXT("TX_CODEC_DMA_TX_3", TX_CODEC_DMA_TX_3,      \
0316         id, 1, 0, msm_routing_get_audio_mixer,          \
0317         msm_routing_put_audio_mixer),               \
0318     SOC_SINGLE_EXT("TX_CODEC_DMA_TX_4", TX_CODEC_DMA_TX_4,      \
0319         id, 1, 0, msm_routing_get_audio_mixer,          \
0320         msm_routing_put_audio_mixer),               \
0321     SOC_SINGLE_EXT("TX_CODEC_DMA_TX_5", TX_CODEC_DMA_TX_5,      \
0322         id, 1, 0, msm_routing_get_audio_mixer,          \
0323         msm_routing_put_audio_mixer),
0324 
0325 struct session_data {
0326     int state;
0327     int port_id;
0328     int path_type;
0329     int app_type;
0330     int acdb_id;
0331     int sample_rate;
0332     int bits_per_sample;
0333     int channels;
0334     int perf_mode;
0335     int numcopps;
0336     int fedai_id;
0337     unsigned long copp_map;
0338     struct q6copp *copps[MAX_COPPS_PER_PORT];
0339 };
0340 
0341 struct msm_routing_data {
0342     struct session_data sessions[MAX_SESSIONS];
0343     struct session_data port_data[AFE_MAX_PORTS];
0344     struct device *dev;
0345     struct mutex lock;
0346 };
0347 
0348 static struct msm_routing_data *routing_data;
0349 
0350 /**
0351  * q6routing_stream_open() - Register a new stream for route setup
0352  *
0353  * @fedai_id: Frontend dai id.
0354  * @perf_mode: Performance mode.
0355  * @stream_id: ASM stream id to map.
0356  * @stream_type: Direction of stream
0357  *
0358  * Return: Will be an negative on error or a zero on success.
0359  */
0360 int q6routing_stream_open(int fedai_id, int perf_mode,
0361                int stream_id, int stream_type)
0362 {
0363     int j, topology, num_copps = 0;
0364     struct route_payload payload;
0365     struct q6copp *copp;
0366     int copp_idx;
0367     struct session_data *session, *pdata;
0368 
0369     if (!routing_data) {
0370         pr_err("Routing driver not yet ready\n");
0371         return -EINVAL;
0372     }
0373 
0374     session = &routing_data->sessions[stream_id - 1];
0375     if (session->port_id < 0) {
0376         dev_err(routing_data->dev, "Routing not setup for MultiMedia%d Session\n",
0377             session->fedai_id);
0378         return -EINVAL;
0379     }
0380 
0381     pdata = &routing_data->port_data[session->port_id];
0382 
0383     mutex_lock(&routing_data->lock);
0384     session->fedai_id = fedai_id;
0385 
0386     session->path_type = pdata->path_type;
0387     session->sample_rate = pdata->sample_rate;
0388     session->channels = pdata->channels;
0389     session->bits_per_sample = pdata->bits_per_sample;
0390 
0391     payload.num_copps = 0; /* only RX needs to use payload */
0392     topology = NULL_COPP_TOPOLOGY;
0393     copp = q6adm_open(routing_data->dev, session->port_id,
0394                   session->path_type, session->sample_rate,
0395                   session->channels, topology, perf_mode,
0396                   session->bits_per_sample, 0, 0);
0397 
0398     if (IS_ERR_OR_NULL(copp)) {
0399         mutex_unlock(&routing_data->lock);
0400         return -EINVAL;
0401     }
0402 
0403     copp_idx = q6adm_get_copp_id(copp);
0404     set_bit(copp_idx, &session->copp_map);
0405     session->copps[copp_idx] = copp;
0406 
0407     for_each_set_bit(j, &session->copp_map, MAX_COPPS_PER_PORT) {
0408         payload.port_id[num_copps] = session->port_id;
0409         payload.copp_idx[num_copps] = j;
0410         num_copps++;
0411     }
0412 
0413     if (num_copps) {
0414         payload.num_copps = num_copps;
0415         payload.session_id = stream_id;
0416         q6adm_matrix_map(routing_data->dev, session->path_type,
0417                  payload, perf_mode);
0418     }
0419     mutex_unlock(&routing_data->lock);
0420 
0421     return 0;
0422 }
0423 EXPORT_SYMBOL_GPL(q6routing_stream_open);
0424 
0425 static struct session_data *get_session_from_id(struct msm_routing_data *data,
0426                         int fedai_id)
0427 {
0428     int i;
0429 
0430     for (i = 0; i < MAX_SESSIONS; i++) {
0431         if (fedai_id == data->sessions[i].fedai_id)
0432             return &data->sessions[i];
0433     }
0434 
0435     return NULL;
0436 }
0437 /**
0438  * q6routing_stream_close() - Deregister a stream
0439  *
0440  * @fedai_id: Frontend dai id.
0441  * @stream_type: Direction of stream
0442  *
0443  * Return: Will be an negative on error or a zero on success.
0444  */
0445 void q6routing_stream_close(int fedai_id, int stream_type)
0446 {
0447     struct session_data *session;
0448     int idx;
0449 
0450     session = get_session_from_id(routing_data, fedai_id);
0451     if (!session)
0452         return;
0453 
0454     for_each_set_bit(idx, &session->copp_map, MAX_COPPS_PER_PORT) {
0455         if (session->copps[idx]) {
0456             q6adm_close(routing_data->dev, session->copps[idx]);
0457             session->copps[idx] = NULL;
0458         }
0459     }
0460 
0461     session->fedai_id = -1;
0462     session->copp_map = 0;
0463 }
0464 EXPORT_SYMBOL_GPL(q6routing_stream_close);
0465 
0466 static int msm_routing_get_audio_mixer(struct snd_kcontrol *kcontrol,
0467                        struct snd_ctl_elem_value *ucontrol)
0468 {
0469     struct snd_soc_dapm_context *dapm =
0470         snd_soc_dapm_kcontrol_dapm(kcontrol);
0471     struct soc_mixer_control *mc =
0472         (struct soc_mixer_control *)kcontrol->private_value;
0473     int session_id = mc->shift;
0474     struct snd_soc_component *c = snd_soc_dapm_to_component(dapm);
0475     struct msm_routing_data *priv = dev_get_drvdata(c->dev);
0476     struct session_data *session = &priv->sessions[session_id];
0477 
0478     if (session->port_id == mc->reg)
0479         ucontrol->value.integer.value[0] = 1;
0480     else
0481         ucontrol->value.integer.value[0] = 0;
0482 
0483     return 0;
0484 }
0485 
0486 static int msm_routing_put_audio_mixer(struct snd_kcontrol *kcontrol,
0487                        struct snd_ctl_elem_value *ucontrol)
0488 {
0489     struct snd_soc_dapm_context *dapm =
0490                     snd_soc_dapm_kcontrol_dapm(kcontrol);
0491     struct snd_soc_component *c = snd_soc_dapm_to_component(dapm);
0492     struct msm_routing_data *data = dev_get_drvdata(c->dev);
0493     struct soc_mixer_control *mc =
0494             (struct soc_mixer_control *)kcontrol->private_value;
0495     struct snd_soc_dapm_update *update = NULL;
0496     int be_id = mc->reg;
0497     int session_id = mc->shift;
0498     struct session_data *session = &data->sessions[session_id];
0499 
0500     if (ucontrol->value.integer.value[0]) {
0501         if (session->port_id == be_id)
0502             return 0;
0503 
0504         session->port_id = be_id;
0505         snd_soc_dapm_mixer_update_power(dapm, kcontrol, 1, update);
0506     } else {
0507         if (session->port_id == -1 || session->port_id != be_id)
0508             return 0;
0509 
0510         session->port_id = -1;
0511         snd_soc_dapm_mixer_update_power(dapm, kcontrol, 0, update);
0512     }
0513 
0514     return 1;
0515 }
0516 
0517 static const struct snd_kcontrol_new hdmi_mixer_controls[] = {
0518     Q6ROUTING_RX_MIXERS(HDMI_RX) };
0519 
0520 static const struct snd_kcontrol_new display_port_mixer_controls[] = {
0521     Q6ROUTING_RX_MIXERS(DISPLAY_PORT_RX) };
0522 
0523 static const struct snd_kcontrol_new primary_mi2s_rx_mixer_controls[] = {
0524     Q6ROUTING_RX_MIXERS(PRIMARY_MI2S_RX) };
0525 
0526 static const struct snd_kcontrol_new secondary_mi2s_rx_mixer_controls[] = {
0527     Q6ROUTING_RX_MIXERS(SECONDARY_MI2S_RX) };
0528 
0529 static const struct snd_kcontrol_new quaternary_mi2s_rx_mixer_controls[] = {
0530     Q6ROUTING_RX_MIXERS(QUATERNARY_MI2S_RX) };
0531 
0532 static const struct snd_kcontrol_new quinary_mi2s_rx_mixer_controls[] = {
0533     Q6ROUTING_RX_MIXERS(QUINARY_MI2S_RX) };
0534 
0535 static const struct snd_kcontrol_new tertiary_mi2s_rx_mixer_controls[] = {
0536     Q6ROUTING_RX_MIXERS(TERTIARY_MI2S_RX) };
0537 
0538 static const struct snd_kcontrol_new slimbus_rx_mixer_controls[] = {
0539     Q6ROUTING_RX_MIXERS(SLIMBUS_0_RX) };
0540 
0541 static const struct snd_kcontrol_new slimbus_1_rx_mixer_controls[] = {
0542     Q6ROUTING_RX_MIXERS(SLIMBUS_1_RX) };
0543 
0544 static const struct snd_kcontrol_new slimbus_2_rx_mixer_controls[] = {
0545     Q6ROUTING_RX_MIXERS(SLIMBUS_2_RX) };
0546 
0547 static const struct snd_kcontrol_new slimbus_3_rx_mixer_controls[] = {
0548     Q6ROUTING_RX_MIXERS(SLIMBUS_3_RX) };
0549 
0550 static const struct snd_kcontrol_new slimbus_4_rx_mixer_controls[] = {
0551     Q6ROUTING_RX_MIXERS(SLIMBUS_4_RX) };
0552 
0553 static const struct snd_kcontrol_new slimbus_5_rx_mixer_controls[] = {
0554     Q6ROUTING_RX_MIXERS(SLIMBUS_5_RX) };
0555 
0556 static const struct snd_kcontrol_new slimbus_6_rx_mixer_controls[] = {
0557     Q6ROUTING_RX_MIXERS(SLIMBUS_6_RX) };
0558 
0559 static const struct snd_kcontrol_new pri_tdm_rx_0_mixer_controls[] = {
0560     Q6ROUTING_RX_MIXERS(PRIMARY_TDM_RX_0) };
0561 
0562 static const struct snd_kcontrol_new pri_tdm_rx_1_mixer_controls[] = {
0563     Q6ROUTING_RX_MIXERS(PRIMARY_TDM_RX_1) };
0564 
0565 static const struct snd_kcontrol_new pri_tdm_rx_2_mixer_controls[] = {
0566     Q6ROUTING_RX_MIXERS(PRIMARY_TDM_RX_2) };
0567 
0568 static const struct snd_kcontrol_new pri_tdm_rx_3_mixer_controls[] = {
0569     Q6ROUTING_RX_MIXERS(PRIMARY_TDM_RX_3) };
0570 
0571 static const struct snd_kcontrol_new pri_tdm_rx_4_mixer_controls[] = {
0572     Q6ROUTING_RX_MIXERS(PRIMARY_TDM_RX_4) };
0573 
0574 static const struct snd_kcontrol_new pri_tdm_rx_5_mixer_controls[] = {
0575     Q6ROUTING_RX_MIXERS(PRIMARY_TDM_RX_5) };
0576 
0577 static const struct snd_kcontrol_new pri_tdm_rx_6_mixer_controls[] = {
0578     Q6ROUTING_RX_MIXERS(PRIMARY_TDM_RX_6) };
0579 
0580 static const struct snd_kcontrol_new pri_tdm_rx_7_mixer_controls[] = {
0581     Q6ROUTING_RX_MIXERS(PRIMARY_TDM_RX_7) };
0582 
0583 static const struct snd_kcontrol_new sec_tdm_rx_0_mixer_controls[] = {
0584     Q6ROUTING_RX_MIXERS(SECONDARY_TDM_RX_0) };
0585 
0586 static const struct snd_kcontrol_new sec_tdm_rx_1_mixer_controls[] = {
0587     Q6ROUTING_RX_MIXERS(SECONDARY_TDM_RX_1) };
0588 
0589 static const struct snd_kcontrol_new sec_tdm_rx_2_mixer_controls[] = {
0590     Q6ROUTING_RX_MIXERS(SECONDARY_TDM_RX_2) };
0591 
0592 static const struct snd_kcontrol_new sec_tdm_rx_3_mixer_controls[] = {
0593     Q6ROUTING_RX_MIXERS(SECONDARY_TDM_RX_3) };
0594 
0595 static const struct snd_kcontrol_new sec_tdm_rx_4_mixer_controls[] = {
0596     Q6ROUTING_RX_MIXERS(SECONDARY_TDM_RX_4) };
0597 
0598 static const struct snd_kcontrol_new sec_tdm_rx_5_mixer_controls[] = {
0599     Q6ROUTING_RX_MIXERS(SECONDARY_TDM_RX_5) };
0600 
0601 static const struct snd_kcontrol_new sec_tdm_rx_6_mixer_controls[] = {
0602     Q6ROUTING_RX_MIXERS(SECONDARY_TDM_RX_6) };
0603 
0604 static const struct snd_kcontrol_new sec_tdm_rx_7_mixer_controls[] = {
0605     Q6ROUTING_RX_MIXERS(SECONDARY_TDM_RX_7) };
0606 
0607 static const struct snd_kcontrol_new tert_tdm_rx_0_mixer_controls[] = {
0608     Q6ROUTING_RX_MIXERS(TERTIARY_TDM_RX_0) };
0609 
0610 static const struct snd_kcontrol_new tert_tdm_rx_1_mixer_controls[] = {
0611     Q6ROUTING_RX_MIXERS(TERTIARY_TDM_RX_1) };
0612 
0613 static const struct snd_kcontrol_new tert_tdm_rx_2_mixer_controls[] = {
0614     Q6ROUTING_RX_MIXERS(TERTIARY_TDM_RX_2) };
0615 
0616 static const struct snd_kcontrol_new tert_tdm_rx_3_mixer_controls[] = {
0617     Q6ROUTING_RX_MIXERS(TERTIARY_TDM_RX_3) };
0618 
0619 static const struct snd_kcontrol_new tert_tdm_rx_4_mixer_controls[] = {
0620     Q6ROUTING_RX_MIXERS(TERTIARY_TDM_RX_4) };
0621 
0622 static const struct snd_kcontrol_new tert_tdm_rx_5_mixer_controls[] = {
0623     Q6ROUTING_RX_MIXERS(TERTIARY_TDM_RX_5) };
0624 
0625 static const struct snd_kcontrol_new tert_tdm_rx_6_mixer_controls[] = {
0626     Q6ROUTING_RX_MIXERS(TERTIARY_TDM_RX_6) };
0627 
0628 static const struct snd_kcontrol_new tert_tdm_rx_7_mixer_controls[] = {
0629     Q6ROUTING_RX_MIXERS(TERTIARY_TDM_RX_7) };
0630 
0631 static const struct snd_kcontrol_new quat_tdm_rx_0_mixer_controls[] = {
0632     Q6ROUTING_RX_MIXERS(QUATERNARY_TDM_RX_0) };
0633 
0634 static const struct snd_kcontrol_new quat_tdm_rx_1_mixer_controls[] = {
0635     Q6ROUTING_RX_MIXERS(QUATERNARY_TDM_RX_1) };
0636 
0637 static const struct snd_kcontrol_new quat_tdm_rx_2_mixer_controls[] = {
0638     Q6ROUTING_RX_MIXERS(QUATERNARY_TDM_RX_2) };
0639 
0640 static const struct snd_kcontrol_new quat_tdm_rx_3_mixer_controls[] = {
0641     Q6ROUTING_RX_MIXERS(QUATERNARY_TDM_RX_3) };
0642 
0643 static const struct snd_kcontrol_new quat_tdm_rx_4_mixer_controls[] = {
0644     Q6ROUTING_RX_MIXERS(QUATERNARY_TDM_RX_4) };
0645 
0646 static const struct snd_kcontrol_new quat_tdm_rx_5_mixer_controls[] = {
0647     Q6ROUTING_RX_MIXERS(QUATERNARY_TDM_RX_5) };
0648 
0649 static const struct snd_kcontrol_new quat_tdm_rx_6_mixer_controls[] = {
0650     Q6ROUTING_RX_MIXERS(QUATERNARY_TDM_RX_6) };
0651 
0652 static const struct snd_kcontrol_new quat_tdm_rx_7_mixer_controls[] = {
0653     Q6ROUTING_RX_MIXERS(QUATERNARY_TDM_RX_7) };
0654 
0655 static const struct snd_kcontrol_new quin_tdm_rx_0_mixer_controls[] = {
0656     Q6ROUTING_RX_MIXERS(QUINARY_TDM_RX_0) };
0657 
0658 static const struct snd_kcontrol_new quin_tdm_rx_1_mixer_controls[] = {
0659     Q6ROUTING_RX_MIXERS(QUINARY_TDM_RX_1) };
0660 
0661 static const struct snd_kcontrol_new quin_tdm_rx_2_mixer_controls[] = {
0662     Q6ROUTING_RX_MIXERS(QUINARY_TDM_RX_2) };
0663 
0664 static const struct snd_kcontrol_new quin_tdm_rx_3_mixer_controls[] = {
0665     Q6ROUTING_RX_MIXERS(QUINARY_TDM_RX_3) };
0666 
0667 static const struct snd_kcontrol_new quin_tdm_rx_4_mixer_controls[] = {
0668     Q6ROUTING_RX_MIXERS(QUINARY_TDM_RX_4) };
0669 
0670 static const struct snd_kcontrol_new quin_tdm_rx_5_mixer_controls[] = {
0671     Q6ROUTING_RX_MIXERS(QUINARY_TDM_RX_5) };
0672 
0673 static const struct snd_kcontrol_new quin_tdm_rx_6_mixer_controls[] = {
0674     Q6ROUTING_RX_MIXERS(QUINARY_TDM_RX_6) };
0675 
0676 static const struct snd_kcontrol_new quin_tdm_rx_7_mixer_controls[] = {
0677     Q6ROUTING_RX_MIXERS(QUINARY_TDM_RX_7) };
0678 
0679 static const struct snd_kcontrol_new wsa_codec_dma_rx_0_mixer_controls[] = {
0680     Q6ROUTING_RX_MIXERS(WSA_CODEC_DMA_RX_0) };
0681 
0682 static const struct snd_kcontrol_new wsa_codec_dma_rx_1_mixer_controls[] = {
0683     Q6ROUTING_RX_MIXERS(WSA_CODEC_DMA_RX_1) };
0684 
0685 static const struct snd_kcontrol_new rx_codec_dma_rx_0_mixer_controls[] = {
0686     Q6ROUTING_RX_MIXERS(RX_CODEC_DMA_RX_0) };
0687 
0688 static const struct snd_kcontrol_new rx_codec_dma_rx_1_mixer_controls[] = {
0689     Q6ROUTING_RX_MIXERS(RX_CODEC_DMA_RX_1) };
0690 
0691 static const struct snd_kcontrol_new rx_codec_dma_rx_2_mixer_controls[] = {
0692     Q6ROUTING_RX_MIXERS(RX_CODEC_DMA_RX_2) };
0693 
0694 static const struct snd_kcontrol_new rx_codec_dma_rx_3_mixer_controls[] = {
0695     Q6ROUTING_RX_MIXERS(RX_CODEC_DMA_RX_3) };
0696 
0697 static const struct snd_kcontrol_new rx_codec_dma_rx_4_mixer_controls[] = {
0698     Q6ROUTING_RX_MIXERS(RX_CODEC_DMA_RX_4) };
0699 
0700 static const struct snd_kcontrol_new rx_codec_dma_rx_5_mixer_controls[] = {
0701     Q6ROUTING_RX_MIXERS(RX_CODEC_DMA_RX_5) };
0702 
0703 static const struct snd_kcontrol_new rxcodec_dma_rx_6_mixer_controls[] = {
0704     Q6ROUTING_RX_MIXERS(RX_CODEC_DMA_RX_6) };
0705 
0706 static const struct snd_kcontrol_new rx_codec_dma_rx_7_mixer_controls[] = {
0707     Q6ROUTING_RX_MIXERS(RX_CODEC_DMA_RX_7) };
0708 
0709 
0710 static const struct snd_kcontrol_new mmul1_mixer_controls[] = {
0711     Q6ROUTING_TX_MIXERS(MSM_FRONTEND_DAI_MULTIMEDIA1) };
0712 
0713 static const struct snd_kcontrol_new mmul2_mixer_controls[] = {
0714     Q6ROUTING_TX_MIXERS(MSM_FRONTEND_DAI_MULTIMEDIA2) };
0715 
0716 static const struct snd_kcontrol_new mmul3_mixer_controls[] = {
0717     Q6ROUTING_TX_MIXERS(MSM_FRONTEND_DAI_MULTIMEDIA3) };
0718 
0719 static const struct snd_kcontrol_new mmul4_mixer_controls[] = {
0720     Q6ROUTING_TX_MIXERS(MSM_FRONTEND_DAI_MULTIMEDIA4) };
0721 
0722 static const struct snd_kcontrol_new mmul5_mixer_controls[] = {
0723     Q6ROUTING_TX_MIXERS(MSM_FRONTEND_DAI_MULTIMEDIA5) };
0724 
0725 static const struct snd_kcontrol_new mmul6_mixer_controls[] = {
0726     Q6ROUTING_TX_MIXERS(MSM_FRONTEND_DAI_MULTIMEDIA6) };
0727 
0728 static const struct snd_kcontrol_new mmul7_mixer_controls[] = {
0729     Q6ROUTING_TX_MIXERS(MSM_FRONTEND_DAI_MULTIMEDIA7) };
0730 
0731 static const struct snd_kcontrol_new mmul8_mixer_controls[] = {
0732     Q6ROUTING_TX_MIXERS(MSM_FRONTEND_DAI_MULTIMEDIA8) };
0733 
0734 static const struct snd_soc_dapm_widget msm_qdsp6_widgets[] = {
0735     /* Mixer definitions */
0736     SND_SOC_DAPM_MIXER("HDMI Mixer", SND_SOC_NOPM, 0, 0,
0737                hdmi_mixer_controls,
0738                ARRAY_SIZE(hdmi_mixer_controls)),
0739 
0740     SND_SOC_DAPM_MIXER("DISPLAY_PORT_RX Audio Mixer", SND_SOC_NOPM, 0, 0,
0741                display_port_mixer_controls,
0742                ARRAY_SIZE(display_port_mixer_controls)),
0743 
0744     SND_SOC_DAPM_MIXER("SLIMBUS_0_RX Audio Mixer", SND_SOC_NOPM, 0, 0,
0745                slimbus_rx_mixer_controls,
0746                ARRAY_SIZE(slimbus_rx_mixer_controls)),
0747     SND_SOC_DAPM_MIXER("SLIMBUS_1_RX Audio Mixer", SND_SOC_NOPM, 0, 0,
0748                slimbus_1_rx_mixer_controls,
0749                ARRAY_SIZE(slimbus_1_rx_mixer_controls)),
0750     SND_SOC_DAPM_MIXER("SLIMBUS_2_RX Audio Mixer", SND_SOC_NOPM, 0, 0,
0751                slimbus_2_rx_mixer_controls,
0752                ARRAY_SIZE(slimbus_2_rx_mixer_controls)),
0753     SND_SOC_DAPM_MIXER("SLIMBUS_3_RX Audio Mixer", SND_SOC_NOPM, 0, 0,
0754                slimbus_3_rx_mixer_controls,
0755                ARRAY_SIZE(slimbus_3_rx_mixer_controls)),
0756     SND_SOC_DAPM_MIXER("SLIMBUS_4_RX Audio Mixer", SND_SOC_NOPM, 0, 0,
0757                slimbus_4_rx_mixer_controls,
0758                ARRAY_SIZE(slimbus_4_rx_mixer_controls)),
0759     SND_SOC_DAPM_MIXER("SLIMBUS_5_RX Audio Mixer", SND_SOC_NOPM, 0, 0,
0760                slimbus_5_rx_mixer_controls,
0761                 ARRAY_SIZE(slimbus_5_rx_mixer_controls)),
0762     SND_SOC_DAPM_MIXER("SLIMBUS_6_RX Audio Mixer", SND_SOC_NOPM, 0, 0,
0763                slimbus_6_rx_mixer_controls,
0764                ARRAY_SIZE(slimbus_6_rx_mixer_controls)),
0765     SND_SOC_DAPM_MIXER("PRI_MI2S_RX Audio Mixer", SND_SOC_NOPM, 0, 0,
0766                primary_mi2s_rx_mixer_controls,
0767                ARRAY_SIZE(primary_mi2s_rx_mixer_controls)),
0768     SND_SOC_DAPM_MIXER("SEC_MI2S_RX Audio Mixer", SND_SOC_NOPM, 0, 0,
0769                secondary_mi2s_rx_mixer_controls,
0770                ARRAY_SIZE(secondary_mi2s_rx_mixer_controls)),
0771     SND_SOC_DAPM_MIXER("QUAT_MI2S_RX Audio Mixer", SND_SOC_NOPM, 0, 0,
0772                quaternary_mi2s_rx_mixer_controls,
0773                ARRAY_SIZE(quaternary_mi2s_rx_mixer_controls)),
0774     SND_SOC_DAPM_MIXER("QUIN_MI2S_RX Audio Mixer", SND_SOC_NOPM, 0, 0,
0775                quinary_mi2s_rx_mixer_controls,
0776                ARRAY_SIZE(quinary_mi2s_rx_mixer_controls)),
0777     SND_SOC_DAPM_MIXER("TERT_MI2S_RX Audio Mixer", SND_SOC_NOPM, 0, 0,
0778                tertiary_mi2s_rx_mixer_controls,
0779                ARRAY_SIZE(tertiary_mi2s_rx_mixer_controls)),
0780     SND_SOC_DAPM_MIXER("PRIMARY_TDM_RX_0 Audio Mixer", SND_SOC_NOPM, 0, 0,
0781                 pri_tdm_rx_0_mixer_controls,
0782                 ARRAY_SIZE(pri_tdm_rx_0_mixer_controls)),
0783     SND_SOC_DAPM_MIXER("PRIMARY_TDM_RX_1 Audio Mixer", SND_SOC_NOPM, 0, 0,
0784                 pri_tdm_rx_1_mixer_controls,
0785                 ARRAY_SIZE(pri_tdm_rx_1_mixer_controls)),
0786     SND_SOC_DAPM_MIXER("PRIMARY_TDM_RX_2 Audio Mixer", SND_SOC_NOPM, 0, 0,
0787                 pri_tdm_rx_2_mixer_controls,
0788                 ARRAY_SIZE(pri_tdm_rx_2_mixer_controls)),
0789     SND_SOC_DAPM_MIXER("PRIMARY_TDM_RX_3 Audio Mixer", SND_SOC_NOPM, 0, 0,
0790                 pri_tdm_rx_3_mixer_controls,
0791                 ARRAY_SIZE(pri_tdm_rx_3_mixer_controls)),
0792     SND_SOC_DAPM_MIXER("PRIMARY_TDM_RX_4 Audio Mixer", SND_SOC_NOPM, 0, 0,
0793                 pri_tdm_rx_4_mixer_controls,
0794                 ARRAY_SIZE(pri_tdm_rx_4_mixer_controls)),
0795     SND_SOC_DAPM_MIXER("PRIMARY_TDM_RX_5 Audio Mixer", SND_SOC_NOPM, 0, 0,
0796                 pri_tdm_rx_5_mixer_controls,
0797                 ARRAY_SIZE(pri_tdm_rx_5_mixer_controls)),
0798     SND_SOC_DAPM_MIXER("PRIMARY_TDM_RX_6 Audio Mixer", SND_SOC_NOPM, 0, 0,
0799                 pri_tdm_rx_6_mixer_controls,
0800                 ARRAY_SIZE(pri_tdm_rx_6_mixer_controls)),
0801     SND_SOC_DAPM_MIXER("PRIMARY_TDM_RX_7 Audio Mixer", SND_SOC_NOPM, 0, 0,
0802                 pri_tdm_rx_7_mixer_controls,
0803                 ARRAY_SIZE(pri_tdm_rx_7_mixer_controls)),
0804 
0805     SND_SOC_DAPM_MIXER("SEC_TDM_RX_0 Audio Mixer", SND_SOC_NOPM, 0, 0,
0806                 sec_tdm_rx_0_mixer_controls,
0807                 ARRAY_SIZE(sec_tdm_rx_0_mixer_controls)),
0808     SND_SOC_DAPM_MIXER("SEC_TDM_RX_1 Audio Mixer", SND_SOC_NOPM, 0, 0,
0809                 sec_tdm_rx_1_mixer_controls,
0810                 ARRAY_SIZE(sec_tdm_rx_1_mixer_controls)),
0811     SND_SOC_DAPM_MIXER("SEC_TDM_RX_2 Audio Mixer", SND_SOC_NOPM, 0, 0,
0812                 sec_tdm_rx_2_mixer_controls,
0813                 ARRAY_SIZE(sec_tdm_rx_2_mixer_controls)),
0814     SND_SOC_DAPM_MIXER("SEC_TDM_RX_3 Audio Mixer", SND_SOC_NOPM, 0, 0,
0815                 sec_tdm_rx_3_mixer_controls,
0816                 ARRAY_SIZE(sec_tdm_rx_3_mixer_controls)),
0817     SND_SOC_DAPM_MIXER("SEC_TDM_RX_4 Audio Mixer", SND_SOC_NOPM, 0, 0,
0818                 sec_tdm_rx_4_mixer_controls,
0819                 ARRAY_SIZE(sec_tdm_rx_4_mixer_controls)),
0820     SND_SOC_DAPM_MIXER("SEC_TDM_RX_5 Audio Mixer", SND_SOC_NOPM, 0, 0,
0821                 sec_tdm_rx_5_mixer_controls,
0822                 ARRAY_SIZE(sec_tdm_rx_5_mixer_controls)),
0823     SND_SOC_DAPM_MIXER("SEC_TDM_RX_6 Audio Mixer", SND_SOC_NOPM, 0, 0,
0824                 sec_tdm_rx_6_mixer_controls,
0825                 ARRAY_SIZE(sec_tdm_rx_6_mixer_controls)),
0826     SND_SOC_DAPM_MIXER("SEC_TDM_RX_7 Audio Mixer", SND_SOC_NOPM, 0, 0,
0827                 sec_tdm_rx_7_mixer_controls,
0828                 ARRAY_SIZE(sec_tdm_rx_7_mixer_controls)),
0829 
0830     SND_SOC_DAPM_MIXER("TERT_TDM_RX_0 Audio Mixer", SND_SOC_NOPM, 0, 0,
0831                 tert_tdm_rx_0_mixer_controls,
0832                 ARRAY_SIZE(tert_tdm_rx_0_mixer_controls)),
0833     SND_SOC_DAPM_MIXER("TERT_TDM_RX_1 Audio Mixer", SND_SOC_NOPM, 0, 0,
0834                 tert_tdm_rx_1_mixer_controls,
0835                 ARRAY_SIZE(tert_tdm_rx_1_mixer_controls)),
0836     SND_SOC_DAPM_MIXER("TERT_TDM_RX_2 Audio Mixer", SND_SOC_NOPM, 0, 0,
0837                 tert_tdm_rx_2_mixer_controls,
0838                 ARRAY_SIZE(tert_tdm_rx_2_mixer_controls)),
0839     SND_SOC_DAPM_MIXER("TERT_TDM_RX_3 Audio Mixer", SND_SOC_NOPM, 0, 0,
0840                 tert_tdm_rx_3_mixer_controls,
0841                 ARRAY_SIZE(tert_tdm_rx_3_mixer_controls)),
0842     SND_SOC_DAPM_MIXER("TERT_TDM_RX_4 Audio Mixer", SND_SOC_NOPM, 0, 0,
0843                 tert_tdm_rx_4_mixer_controls,
0844                 ARRAY_SIZE(tert_tdm_rx_4_mixer_controls)),
0845     SND_SOC_DAPM_MIXER("TERT_TDM_RX_5 Audio Mixer", SND_SOC_NOPM, 0, 0,
0846                 tert_tdm_rx_5_mixer_controls,
0847                 ARRAY_SIZE(tert_tdm_rx_5_mixer_controls)),
0848     SND_SOC_DAPM_MIXER("TERT_TDM_RX_6 Audio Mixer", SND_SOC_NOPM, 0, 0,
0849                 tert_tdm_rx_6_mixer_controls,
0850                 ARRAY_SIZE(tert_tdm_rx_6_mixer_controls)),
0851     SND_SOC_DAPM_MIXER("TERT_TDM_RX_7 Audio Mixer", SND_SOC_NOPM, 0, 0,
0852                 tert_tdm_rx_7_mixer_controls,
0853                 ARRAY_SIZE(tert_tdm_rx_7_mixer_controls)),
0854 
0855     SND_SOC_DAPM_MIXER("QUAT_TDM_RX_0 Audio Mixer", SND_SOC_NOPM, 0, 0,
0856                 quat_tdm_rx_0_mixer_controls,
0857                 ARRAY_SIZE(quat_tdm_rx_0_mixer_controls)),
0858     SND_SOC_DAPM_MIXER("QUAT_TDM_RX_1 Audio Mixer", SND_SOC_NOPM, 0, 0,
0859                 quat_tdm_rx_1_mixer_controls,
0860                 ARRAY_SIZE(quat_tdm_rx_1_mixer_controls)),
0861     SND_SOC_DAPM_MIXER("QUAT_TDM_RX_2 Audio Mixer", SND_SOC_NOPM, 0, 0,
0862                 quat_tdm_rx_2_mixer_controls,
0863                 ARRAY_SIZE(quat_tdm_rx_2_mixer_controls)),
0864     SND_SOC_DAPM_MIXER("QUAT_TDM_RX_3 Audio Mixer", SND_SOC_NOPM, 0, 0,
0865                 quat_tdm_rx_3_mixer_controls,
0866                 ARRAY_SIZE(quat_tdm_rx_3_mixer_controls)),
0867     SND_SOC_DAPM_MIXER("QUAT_TDM_RX_4 Audio Mixer", SND_SOC_NOPM, 0, 0,
0868                 quat_tdm_rx_4_mixer_controls,
0869                 ARRAY_SIZE(quat_tdm_rx_4_mixer_controls)),
0870     SND_SOC_DAPM_MIXER("QUAT_TDM_RX_5 Audio Mixer", SND_SOC_NOPM, 0, 0,
0871                 quat_tdm_rx_5_mixer_controls,
0872                 ARRAY_SIZE(quat_tdm_rx_5_mixer_controls)),
0873     SND_SOC_DAPM_MIXER("QUAT_TDM_RX_6 Audio Mixer", SND_SOC_NOPM, 0, 0,
0874                 quat_tdm_rx_6_mixer_controls,
0875                 ARRAY_SIZE(quat_tdm_rx_6_mixer_controls)),
0876     SND_SOC_DAPM_MIXER("QUAT_TDM_RX_7 Audio Mixer", SND_SOC_NOPM, 0, 0,
0877                 quat_tdm_rx_7_mixer_controls,
0878                 ARRAY_SIZE(quat_tdm_rx_7_mixer_controls)),
0879 
0880     SND_SOC_DAPM_MIXER("QUIN_TDM_RX_0 Audio Mixer", SND_SOC_NOPM, 0, 0,
0881                 quin_tdm_rx_0_mixer_controls,
0882                 ARRAY_SIZE(quin_tdm_rx_0_mixer_controls)),
0883     SND_SOC_DAPM_MIXER("QUIN_TDM_RX_1 Audio Mixer", SND_SOC_NOPM, 0, 0,
0884                 quin_tdm_rx_1_mixer_controls,
0885                 ARRAY_SIZE(quin_tdm_rx_1_mixer_controls)),
0886     SND_SOC_DAPM_MIXER("QUIN_TDM_RX_2 Audio Mixer", SND_SOC_NOPM, 0, 0,
0887                 quin_tdm_rx_2_mixer_controls,
0888                 ARRAY_SIZE(quin_tdm_rx_2_mixer_controls)),
0889     SND_SOC_DAPM_MIXER("QUIN_TDM_RX_3 Audio Mixer", SND_SOC_NOPM, 0, 0,
0890                 quin_tdm_rx_3_mixer_controls,
0891                 ARRAY_SIZE(quin_tdm_rx_3_mixer_controls)),
0892     SND_SOC_DAPM_MIXER("QUIN_TDM_RX_4 Audio Mixer", SND_SOC_NOPM, 0, 0,
0893                 quin_tdm_rx_4_mixer_controls,
0894                 ARRAY_SIZE(quin_tdm_rx_4_mixer_controls)),
0895     SND_SOC_DAPM_MIXER("QUIN_TDM_RX_5 Audio Mixer", SND_SOC_NOPM, 0, 0,
0896                 quin_tdm_rx_5_mixer_controls,
0897                 ARRAY_SIZE(quin_tdm_rx_5_mixer_controls)),
0898     SND_SOC_DAPM_MIXER("QUIN_TDM_RX_6 Audio Mixer", SND_SOC_NOPM, 0, 0,
0899                 quin_tdm_rx_6_mixer_controls,
0900                 ARRAY_SIZE(quin_tdm_rx_6_mixer_controls)),
0901     SND_SOC_DAPM_MIXER("QUIN_TDM_RX_7 Audio Mixer", SND_SOC_NOPM, 0, 0,
0902                 quin_tdm_rx_7_mixer_controls,
0903                 ARRAY_SIZE(quin_tdm_rx_7_mixer_controls)),
0904 
0905     SND_SOC_DAPM_MIXER("WSA_CODEC_DMA_RX_0 Audio Mixer", SND_SOC_NOPM, 0, 0,
0906         wsa_codec_dma_rx_0_mixer_controls,
0907         ARRAY_SIZE(wsa_codec_dma_rx_0_mixer_controls)),
0908     SND_SOC_DAPM_MIXER("WSA_CODEC_DMA_RX_1 Audio Mixer", SND_SOC_NOPM, 0, 0,
0909         wsa_codec_dma_rx_1_mixer_controls,
0910         ARRAY_SIZE(wsa_codec_dma_rx_1_mixer_controls)),
0911     SND_SOC_DAPM_MIXER("RX_CODEC_DMA_RX_0 Audio Mixer", SND_SOC_NOPM, 0, 0,
0912         rx_codec_dma_rx_0_mixer_controls,
0913         ARRAY_SIZE(rx_codec_dma_rx_0_mixer_controls)),
0914     SND_SOC_DAPM_MIXER("RX_CODEC_DMA_RX_1 Audio Mixer", SND_SOC_NOPM, 0, 0,
0915         rx_codec_dma_rx_1_mixer_controls,
0916         ARRAY_SIZE(rx_codec_dma_rx_1_mixer_controls)),
0917     SND_SOC_DAPM_MIXER("RX_CODEC_DMA_RX_2 Audio Mixer", SND_SOC_NOPM, 0, 0,
0918         rx_codec_dma_rx_2_mixer_controls,
0919         ARRAY_SIZE(rx_codec_dma_rx_2_mixer_controls)),
0920     SND_SOC_DAPM_MIXER("RX_CODEC_DMA_RX_3 Audio Mixer", SND_SOC_NOPM, 0, 0,
0921         rx_codec_dma_rx_3_mixer_controls,
0922         ARRAY_SIZE(rx_codec_dma_rx_3_mixer_controls)),
0923     SND_SOC_DAPM_MIXER("RX_CODEC_DMA_RX_4 Audio Mixer", SND_SOC_NOPM, 0, 0,
0924         rx_codec_dma_rx_4_mixer_controls,
0925         ARRAY_SIZE(rx_codec_dma_rx_4_mixer_controls)),
0926     SND_SOC_DAPM_MIXER("RX_CODEC_DMA_RX_5 Audio Mixer", SND_SOC_NOPM, 0, 0,
0927         rx_codec_dma_rx_5_mixer_controls,
0928         ARRAY_SIZE(rx_codec_dma_rx_5_mixer_controls)),
0929     SND_SOC_DAPM_MIXER("RX_CODEC_DMA_RX_6 Audio Mixer", SND_SOC_NOPM, 0, 0,
0930         rxcodec_dma_rx_6_mixer_controls,
0931         ARRAY_SIZE(rxcodec_dma_rx_6_mixer_controls)),
0932     SND_SOC_DAPM_MIXER("RX_CODEC_DMA_RX_7 Audio Mixer", SND_SOC_NOPM, 0, 0,
0933         rx_codec_dma_rx_7_mixer_controls,
0934         ARRAY_SIZE(rx_codec_dma_rx_7_mixer_controls)),
0935     SND_SOC_DAPM_MIXER("MultiMedia1 Mixer", SND_SOC_NOPM, 0, 0,
0936         mmul1_mixer_controls, ARRAY_SIZE(mmul1_mixer_controls)),
0937     SND_SOC_DAPM_MIXER("MultiMedia2 Mixer", SND_SOC_NOPM, 0, 0,
0938         mmul2_mixer_controls, ARRAY_SIZE(mmul2_mixer_controls)),
0939     SND_SOC_DAPM_MIXER("MultiMedia3 Mixer", SND_SOC_NOPM, 0, 0,
0940         mmul3_mixer_controls, ARRAY_SIZE(mmul3_mixer_controls)),
0941     SND_SOC_DAPM_MIXER("MultiMedia4 Mixer", SND_SOC_NOPM, 0, 0,
0942         mmul4_mixer_controls, ARRAY_SIZE(mmul4_mixer_controls)),
0943     SND_SOC_DAPM_MIXER("MultiMedia5 Mixer", SND_SOC_NOPM, 0, 0,
0944         mmul5_mixer_controls, ARRAY_SIZE(mmul5_mixer_controls)),
0945     SND_SOC_DAPM_MIXER("MultiMedia6 Mixer", SND_SOC_NOPM, 0, 0,
0946         mmul6_mixer_controls, ARRAY_SIZE(mmul6_mixer_controls)),
0947     SND_SOC_DAPM_MIXER("MultiMedia7 Mixer", SND_SOC_NOPM, 0, 0,
0948         mmul7_mixer_controls, ARRAY_SIZE(mmul7_mixer_controls)),
0949     SND_SOC_DAPM_MIXER("MultiMedia8 Mixer", SND_SOC_NOPM, 0, 0,
0950         mmul8_mixer_controls, ARRAY_SIZE(mmul8_mixer_controls)),
0951 
0952 };
0953 
0954 static const struct snd_soc_dapm_route intercon[] = {
0955     Q6ROUTING_RX_DAPM_ROUTE("HDMI Mixer", "HDMI_RX"),
0956     Q6ROUTING_RX_DAPM_ROUTE("DISPLAY_PORT_RX Audio Mixer",
0957                 "DISPLAY_PORT_RX"),
0958     Q6ROUTING_RX_DAPM_ROUTE("SLIMBUS_0_RX Audio Mixer", "SLIMBUS_0_RX"),
0959     Q6ROUTING_RX_DAPM_ROUTE("SLIMBUS_1_RX Audio Mixer", "SLIMBUS_1_RX"),
0960     Q6ROUTING_RX_DAPM_ROUTE("SLIMBUS_2_RX Audio Mixer", "SLIMBUS_2_RX"),
0961     Q6ROUTING_RX_DAPM_ROUTE("SLIMBUS_3_RX Audio Mixer", "SLIMBUS_3_RX"),
0962     Q6ROUTING_RX_DAPM_ROUTE("SLIMBUS_4_RX Audio Mixer", "SLIMBUS_4_RX"),
0963     Q6ROUTING_RX_DAPM_ROUTE("SLIMBUS_5_RX Audio Mixer", "SLIMBUS_5_RX"),
0964     Q6ROUTING_RX_DAPM_ROUTE("SLIMBUS_6_RX Audio Mixer", "SLIMBUS_6_RX"),
0965     Q6ROUTING_RX_DAPM_ROUTE("QUAT_MI2S_RX Audio Mixer", "QUAT_MI2S_RX"),
0966     Q6ROUTING_RX_DAPM_ROUTE("QUIN_MI2S_RX Audio Mixer", "QUIN_MI2S_RX"),
0967     Q6ROUTING_RX_DAPM_ROUTE("TERT_MI2S_RX Audio Mixer", "TERT_MI2S_RX"),
0968     Q6ROUTING_RX_DAPM_ROUTE("SEC_MI2S_RX Audio Mixer", "SEC_MI2S_RX"),
0969     Q6ROUTING_RX_DAPM_ROUTE("PRI_MI2S_RX Audio Mixer", "PRI_MI2S_RX"),
0970     Q6ROUTING_RX_DAPM_ROUTE("PRIMARY_TDM_RX_0 Audio Mixer",
0971                 "PRIMARY_TDM_RX_0"),
0972     Q6ROUTING_RX_DAPM_ROUTE("PRIMARY_TDM_RX_1 Audio Mixer",
0973                 "PRIMARY_TDM_RX_1"),
0974     Q6ROUTING_RX_DAPM_ROUTE("PRIMARY_TDM_RX_2 Audio Mixer",
0975                 "PRIMARY_TDM_RX_2"),
0976     Q6ROUTING_RX_DAPM_ROUTE("PRIMARY_TDM_RX_3 Audio Mixer",
0977                 "PRIMARY_TDM_RX_3"),
0978     Q6ROUTING_RX_DAPM_ROUTE("PRIMARY_TDM_RX_4 Audio Mixer",
0979                 "PRIMARY_TDM_RX_4"),
0980     Q6ROUTING_RX_DAPM_ROUTE("PRIMARY_TDM_RX_5 Audio Mixer",
0981                 "PRIMARY_TDM_RX_5"),
0982     Q6ROUTING_RX_DAPM_ROUTE("PRIMARY_TDM_RX_6 Audio Mixer",
0983                 "PRIMARY_TDM_RX_6"),
0984     Q6ROUTING_RX_DAPM_ROUTE("PRIMARY_TDM_RX_7 Audio Mixer",
0985                 "PRIMARY_TDM_RX_7"),
0986     Q6ROUTING_RX_DAPM_ROUTE("SEC_TDM_RX_0 Audio Mixer", "SEC_TDM_RX_0"),
0987     Q6ROUTING_RX_DAPM_ROUTE("SEC_TDM_RX_1 Audio Mixer", "SEC_TDM_RX_1"),
0988     Q6ROUTING_RX_DAPM_ROUTE("SEC_TDM_RX_2 Audio Mixer", "SEC_TDM_RX_2"),
0989     Q6ROUTING_RX_DAPM_ROUTE("SEC_TDM_RX_3 Audio Mixer", "SEC_TDM_RX_3"),
0990     Q6ROUTING_RX_DAPM_ROUTE("SEC_TDM_RX_4 Audio Mixer", "SEC_TDM_RX_4"),
0991     Q6ROUTING_RX_DAPM_ROUTE("SEC_TDM_RX_5 Audio Mixer", "SEC_TDM_RX_5"),
0992     Q6ROUTING_RX_DAPM_ROUTE("SEC_TDM_RX_6 Audio Mixer", "SEC_TDM_RX_6"),
0993     Q6ROUTING_RX_DAPM_ROUTE("SEC_TDM_RX_7 Audio Mixer", "SEC_TDM_RX_7"),
0994     Q6ROUTING_RX_DAPM_ROUTE("TERT_TDM_RX_0 Audio Mixer", "TERT_TDM_RX_0"),
0995     Q6ROUTING_RX_DAPM_ROUTE("TERT_TDM_RX_1 Audio Mixer", "TERT_TDM_RX_1"),
0996     Q6ROUTING_RX_DAPM_ROUTE("TERT_TDM_RX_2 Audio Mixer", "TERT_TDM_RX_2"),
0997     Q6ROUTING_RX_DAPM_ROUTE("TERT_TDM_RX_3 Audio Mixer", "TERT_TDM_RX_3"),
0998     Q6ROUTING_RX_DAPM_ROUTE("TERT_TDM_RX_4 Audio Mixer", "TERT_TDM_RX_4"),
0999     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 
1047 static 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 
1088 static 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 
1100 static unsigned int q6routing_reg_read(struct snd_soc_component *component,
1101                        unsigned int reg)
1102 {
1103     /* default value */
1104     return 0;
1105 }
1106 
1107 static int q6routing_reg_write(struct snd_soc_component *component,
1108                    unsigned int reg, unsigned int val)
1109 {
1110     /* dummy */
1111     return 0;
1112 }
1113 
1114 static 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 
1126 static 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 
1143 static 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
1152 static const struct of_device_id q6pcm_routing_device_id[] = {
1153     { .compatible = "qcom,q6adm-routing" },
1154     {},
1155 };
1156 MODULE_DEVICE_TABLE(of, q6pcm_routing_device_id);
1157 #endif
1158 
1159 static 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 };
1167 module_platform_driver(q6pcm_routing_platform_driver);
1168 
1169 MODULE_DESCRIPTION("Q6 Routing platform");
1170 MODULE_LICENSE("GPL v2");