0001
0002
0003
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
0352
0353
0354
0355
0356
0357
0358
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;
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
0439
0440
0441
0442
0443
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
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
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
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");