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