162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0 262306a36Sopenharmony_ci// Copyright (c) 2011-2017, The Linux Foundation. All rights reserved. 362306a36Sopenharmony_ci// Copyright (c) 2018, Linaro Limited 462306a36Sopenharmony_ci 562306a36Sopenharmony_ci#include <linux/init.h> 662306a36Sopenharmony_ci#include <linux/err.h> 762306a36Sopenharmony_ci#include <linux/module.h> 862306a36Sopenharmony_ci#include <linux/platform_device.h> 962306a36Sopenharmony_ci#include <linux/of_platform.h> 1062306a36Sopenharmony_ci#include <linux/bitops.h> 1162306a36Sopenharmony_ci#include <linux/mutex.h> 1262306a36Sopenharmony_ci#include <linux/of_device.h> 1362306a36Sopenharmony_ci#include <linux/slab.h> 1462306a36Sopenharmony_ci#include <sound/core.h> 1562306a36Sopenharmony_ci#include <sound/soc.h> 1662306a36Sopenharmony_ci#include <sound/soc-dapm.h> 1762306a36Sopenharmony_ci#include <sound/pcm.h> 1862306a36Sopenharmony_ci#include <sound/control.h> 1962306a36Sopenharmony_ci#include <sound/asound.h> 2062306a36Sopenharmony_ci#include <sound/pcm_params.h> 2162306a36Sopenharmony_ci#include "q6afe.h" 2262306a36Sopenharmony_ci#include "q6asm.h" 2362306a36Sopenharmony_ci#include "q6adm.h" 2462306a36Sopenharmony_ci#include "q6routing.h" 2562306a36Sopenharmony_ci 2662306a36Sopenharmony_ci#define DRV_NAME "q6routing-component" 2762306a36Sopenharmony_ci 2862306a36Sopenharmony_ci#define Q6ROUTING_RX_MIXERS(id) \ 2962306a36Sopenharmony_ci SOC_SINGLE_EXT("MultiMedia1", id, \ 3062306a36Sopenharmony_ci MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer,\ 3162306a36Sopenharmony_ci msm_routing_put_audio_mixer), \ 3262306a36Sopenharmony_ci SOC_SINGLE_EXT("MultiMedia2", id, \ 3362306a36Sopenharmony_ci MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer,\ 3462306a36Sopenharmony_ci msm_routing_put_audio_mixer), \ 3562306a36Sopenharmony_ci SOC_SINGLE_EXT("MultiMedia3", id, \ 3662306a36Sopenharmony_ci MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer,\ 3762306a36Sopenharmony_ci msm_routing_put_audio_mixer), \ 3862306a36Sopenharmony_ci SOC_SINGLE_EXT("MultiMedia4", id, \ 3962306a36Sopenharmony_ci MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer,\ 4062306a36Sopenharmony_ci msm_routing_put_audio_mixer), \ 4162306a36Sopenharmony_ci SOC_SINGLE_EXT("MultiMedia5", id, \ 4262306a36Sopenharmony_ci MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer,\ 4362306a36Sopenharmony_ci msm_routing_put_audio_mixer), \ 4462306a36Sopenharmony_ci SOC_SINGLE_EXT("MultiMedia6", id, \ 4562306a36Sopenharmony_ci MSM_FRONTEND_DAI_MULTIMEDIA6, 1, 0, msm_routing_get_audio_mixer,\ 4662306a36Sopenharmony_ci msm_routing_put_audio_mixer), \ 4762306a36Sopenharmony_ci SOC_SINGLE_EXT("MultiMedia7", id, \ 4862306a36Sopenharmony_ci MSM_FRONTEND_DAI_MULTIMEDIA7, 1, 0, msm_routing_get_audio_mixer,\ 4962306a36Sopenharmony_ci msm_routing_put_audio_mixer), \ 5062306a36Sopenharmony_ci SOC_SINGLE_EXT("MultiMedia8", id, \ 5162306a36Sopenharmony_ci MSM_FRONTEND_DAI_MULTIMEDIA8, 1, 0, msm_routing_get_audio_mixer,\ 5262306a36Sopenharmony_ci msm_routing_put_audio_mixer), 5362306a36Sopenharmony_ci 5462306a36Sopenharmony_ci#define Q6ROUTING_RX_DAPM_ROUTE(mix_name, s) \ 5562306a36Sopenharmony_ci { mix_name, "MultiMedia1", "MM_DL1" }, \ 5662306a36Sopenharmony_ci { mix_name, "MultiMedia2", "MM_DL2" }, \ 5762306a36Sopenharmony_ci { mix_name, "MultiMedia3", "MM_DL3" }, \ 5862306a36Sopenharmony_ci { mix_name, "MultiMedia4", "MM_DL4" }, \ 5962306a36Sopenharmony_ci { mix_name, "MultiMedia5", "MM_DL5" }, \ 6062306a36Sopenharmony_ci { mix_name, "MultiMedia6", "MM_DL6" }, \ 6162306a36Sopenharmony_ci { mix_name, "MultiMedia7", "MM_DL7" }, \ 6262306a36Sopenharmony_ci { mix_name, "MultiMedia8", "MM_DL8" }, \ 6362306a36Sopenharmony_ci { s, NULL, mix_name } 6462306a36Sopenharmony_ci 6562306a36Sopenharmony_ci#define Q6ROUTING_TX_DAPM_ROUTE(mix_name) \ 6662306a36Sopenharmony_ci { mix_name, "PRI_MI2S_TX", "PRI_MI2S_TX" }, \ 6762306a36Sopenharmony_ci { mix_name, "SEC_MI2S_TX", "SEC_MI2S_TX" }, \ 6862306a36Sopenharmony_ci { mix_name, "QUAT_MI2S_TX", "QUAT_MI2S_TX" }, \ 6962306a36Sopenharmony_ci { mix_name, "QUIN_MI2S_TX", "QUIN_MI2S_TX" }, \ 7062306a36Sopenharmony_ci { mix_name, "TERT_MI2S_TX", "TERT_MI2S_TX" }, \ 7162306a36Sopenharmony_ci { mix_name, "SLIMBUS_0_TX", "SLIMBUS_0_TX" }, \ 7262306a36Sopenharmony_ci { mix_name, "SLIMBUS_1_TX", "SLIMBUS_1_TX" }, \ 7362306a36Sopenharmony_ci { mix_name, "SLIMBUS_2_TX", "SLIMBUS_2_TX" }, \ 7462306a36Sopenharmony_ci { mix_name, "SLIMBUS_3_TX", "SLIMBUS_3_TX" }, \ 7562306a36Sopenharmony_ci { mix_name, "SLIMBUS_4_TX", "SLIMBUS_4_TX" }, \ 7662306a36Sopenharmony_ci { mix_name, "SLIMBUS_5_TX", "SLIMBUS_5_TX" }, \ 7762306a36Sopenharmony_ci { mix_name, "SLIMBUS_6_TX", "SLIMBUS_6_TX" }, \ 7862306a36Sopenharmony_ci { mix_name, "PRIMARY_TDM_TX_0", "PRIMARY_TDM_TX_0"}, \ 7962306a36Sopenharmony_ci { mix_name, "PRIMARY_TDM_TX_1", "PRIMARY_TDM_TX_1"}, \ 8062306a36Sopenharmony_ci { mix_name, "PRIMARY_TDM_TX_2", "PRIMARY_TDM_TX_2"}, \ 8162306a36Sopenharmony_ci { mix_name, "PRIMARY_TDM_TX_3", "PRIMARY_TDM_TX_3"}, \ 8262306a36Sopenharmony_ci { mix_name, "PRIMARY_TDM_TX_4", "PRIMARY_TDM_TX_4"}, \ 8362306a36Sopenharmony_ci { mix_name, "PRIMARY_TDM_TX_5", "PRIMARY_TDM_TX_5"}, \ 8462306a36Sopenharmony_ci { mix_name, "PRIMARY_TDM_TX_6", "PRIMARY_TDM_TX_6"}, \ 8562306a36Sopenharmony_ci { mix_name, "PRIMARY_TDM_TX_7", "PRIMARY_TDM_TX_7"}, \ 8662306a36Sopenharmony_ci { mix_name, "SEC_TDM_TX_0", "SEC_TDM_TX_0"}, \ 8762306a36Sopenharmony_ci { mix_name, "SEC_TDM_TX_1", "SEC_TDM_TX_1"}, \ 8862306a36Sopenharmony_ci { mix_name, "SEC_TDM_TX_2", "SEC_TDM_TX_2"}, \ 8962306a36Sopenharmony_ci { mix_name, "SEC_TDM_TX_3", "SEC_TDM_TX_3"}, \ 9062306a36Sopenharmony_ci { mix_name, "SEC_TDM_TX_4", "SEC_TDM_TX_4"}, \ 9162306a36Sopenharmony_ci { mix_name, "SEC_TDM_TX_5", "SEC_TDM_TX_5"}, \ 9262306a36Sopenharmony_ci { mix_name, "SEC_TDM_TX_6", "SEC_TDM_TX_6"}, \ 9362306a36Sopenharmony_ci { mix_name, "SEC_TDM_TX_7", "SEC_TDM_TX_7"}, \ 9462306a36Sopenharmony_ci { mix_name, "TERT_TDM_TX_0", "TERT_TDM_TX_0"}, \ 9562306a36Sopenharmony_ci { mix_name, "TERT_TDM_TX_1", "TERT_TDM_TX_1"}, \ 9662306a36Sopenharmony_ci { mix_name, "TERT_TDM_TX_2", "TERT_TDM_TX_2"}, \ 9762306a36Sopenharmony_ci { mix_name, "TERT_TDM_TX_3", "TERT_TDM_TX_3"}, \ 9862306a36Sopenharmony_ci { mix_name, "TERT_TDM_TX_4", "TERT_TDM_TX_4"}, \ 9962306a36Sopenharmony_ci { mix_name, "TERT_TDM_TX_5", "TERT_TDM_TX_5"}, \ 10062306a36Sopenharmony_ci { mix_name, "TERT_TDM_TX_6", "TERT_TDM_TX_6"}, \ 10162306a36Sopenharmony_ci { mix_name, "TERT_TDM_TX_7", "TERT_TDM_TX_7"}, \ 10262306a36Sopenharmony_ci { mix_name, "QUAT_TDM_TX_0", "QUAT_TDM_TX_0"}, \ 10362306a36Sopenharmony_ci { mix_name, "QUAT_TDM_TX_1", "QUAT_TDM_TX_1"}, \ 10462306a36Sopenharmony_ci { mix_name, "QUAT_TDM_TX_2", "QUAT_TDM_TX_2"}, \ 10562306a36Sopenharmony_ci { mix_name, "QUAT_TDM_TX_3", "QUAT_TDM_TX_3"}, \ 10662306a36Sopenharmony_ci { mix_name, "QUAT_TDM_TX_4", "QUAT_TDM_TX_4"}, \ 10762306a36Sopenharmony_ci { mix_name, "QUAT_TDM_TX_5", "QUAT_TDM_TX_5"}, \ 10862306a36Sopenharmony_ci { mix_name, "QUAT_TDM_TX_6", "QUAT_TDM_TX_6"}, \ 10962306a36Sopenharmony_ci { mix_name, "QUAT_TDM_TX_7", "QUAT_TDM_TX_7"}, \ 11062306a36Sopenharmony_ci { mix_name, "QUIN_TDM_TX_0", "QUIN_TDM_TX_0"}, \ 11162306a36Sopenharmony_ci { mix_name, "QUIN_TDM_TX_1", "QUIN_TDM_TX_1"}, \ 11262306a36Sopenharmony_ci { mix_name, "QUIN_TDM_TX_2", "QUIN_TDM_TX_2"}, \ 11362306a36Sopenharmony_ci { mix_name, "QUIN_TDM_TX_3", "QUIN_TDM_TX_3"}, \ 11462306a36Sopenharmony_ci { mix_name, "QUIN_TDM_TX_4", "QUIN_TDM_TX_4"}, \ 11562306a36Sopenharmony_ci { mix_name, "QUIN_TDM_TX_5", "QUIN_TDM_TX_5"}, \ 11662306a36Sopenharmony_ci { mix_name, "QUIN_TDM_TX_6", "QUIN_TDM_TX_6"}, \ 11762306a36Sopenharmony_ci { mix_name, "QUIN_TDM_TX_7", "QUIN_TDM_TX_7"}, \ 11862306a36Sopenharmony_ci { mix_name, "WSA_CODEC_DMA_TX_0", "WSA_CODEC_DMA_TX_0"}, \ 11962306a36Sopenharmony_ci { mix_name, "WSA_CODEC_DMA_TX_1", "WSA_CODEC_DMA_TX_1"}, \ 12062306a36Sopenharmony_ci { mix_name, "WSA_CODEC_DMA_TX_2", "WSA_CODEC_DMA_TX_2"}, \ 12162306a36Sopenharmony_ci { mix_name, "VA_CODEC_DMA_TX_0", "VA_CODEC_DMA_TX_0"}, \ 12262306a36Sopenharmony_ci { mix_name, "VA_CODEC_DMA_TX_1", "VA_CODEC_DMA_TX_1"}, \ 12362306a36Sopenharmony_ci { mix_name, "VA_CODEC_DMA_TX_2", "VA_CODEC_DMA_TX_2"}, \ 12462306a36Sopenharmony_ci { mix_name, "TX_CODEC_DMA_TX_0", "TX_CODEC_DMA_TX_0"}, \ 12562306a36Sopenharmony_ci { mix_name, "TX_CODEC_DMA_TX_1", "TX_CODEC_DMA_TX_1"}, \ 12662306a36Sopenharmony_ci { mix_name, "TX_CODEC_DMA_TX_2", "TX_CODEC_DMA_TX_2"}, \ 12762306a36Sopenharmony_ci { mix_name, "TX_CODEC_DMA_TX_3", "TX_CODEC_DMA_TX_3"}, \ 12862306a36Sopenharmony_ci { mix_name, "TX_CODEC_DMA_TX_4", "TX_CODEC_DMA_TX_4"}, \ 12962306a36Sopenharmony_ci { mix_name, "TX_CODEC_DMA_TX_5", "TX_CODEC_DMA_TX_5"} 13062306a36Sopenharmony_ci 13162306a36Sopenharmony_ci#define Q6ROUTING_TX_MIXERS(id) \ 13262306a36Sopenharmony_ci SOC_SINGLE_EXT("PRI_MI2S_TX", PRIMARY_MI2S_TX, \ 13362306a36Sopenharmony_ci id, 1, 0, msm_routing_get_audio_mixer, \ 13462306a36Sopenharmony_ci msm_routing_put_audio_mixer), \ 13562306a36Sopenharmony_ci SOC_SINGLE_EXT("SEC_MI2S_TX", SECONDARY_MI2S_TX, \ 13662306a36Sopenharmony_ci id, 1, 0, msm_routing_get_audio_mixer, \ 13762306a36Sopenharmony_ci msm_routing_put_audio_mixer), \ 13862306a36Sopenharmony_ci SOC_SINGLE_EXT("TERT_MI2S_TX", TERTIARY_MI2S_TX, \ 13962306a36Sopenharmony_ci id, 1, 0, msm_routing_get_audio_mixer, \ 14062306a36Sopenharmony_ci msm_routing_put_audio_mixer), \ 14162306a36Sopenharmony_ci SOC_SINGLE_EXT("QUAT_MI2S_TX", QUATERNARY_MI2S_TX, \ 14262306a36Sopenharmony_ci id, 1, 0, msm_routing_get_audio_mixer, \ 14362306a36Sopenharmony_ci msm_routing_put_audio_mixer), \ 14462306a36Sopenharmony_ci SOC_SINGLE_EXT("QUIN_MI2S_TX", QUINARY_MI2S_TX, \ 14562306a36Sopenharmony_ci id, 1, 0, msm_routing_get_audio_mixer, \ 14662306a36Sopenharmony_ci msm_routing_put_audio_mixer), \ 14762306a36Sopenharmony_ci SOC_SINGLE_EXT("SLIMBUS_0_TX", SLIMBUS_0_TX, \ 14862306a36Sopenharmony_ci id, 1, 0, msm_routing_get_audio_mixer, \ 14962306a36Sopenharmony_ci msm_routing_put_audio_mixer), \ 15062306a36Sopenharmony_ci SOC_SINGLE_EXT("SLIMBUS_1_TX", SLIMBUS_1_TX, \ 15162306a36Sopenharmony_ci id, 1, 0, msm_routing_get_audio_mixer, \ 15262306a36Sopenharmony_ci msm_routing_put_audio_mixer), \ 15362306a36Sopenharmony_ci SOC_SINGLE_EXT("SLIMBUS_2_TX", SLIMBUS_2_TX, \ 15462306a36Sopenharmony_ci id, 1, 0, msm_routing_get_audio_mixer, \ 15562306a36Sopenharmony_ci msm_routing_put_audio_mixer), \ 15662306a36Sopenharmony_ci SOC_SINGLE_EXT("SLIMBUS_3_TX", SLIMBUS_3_TX, \ 15762306a36Sopenharmony_ci id, 1, 0, msm_routing_get_audio_mixer, \ 15862306a36Sopenharmony_ci msm_routing_put_audio_mixer), \ 15962306a36Sopenharmony_ci SOC_SINGLE_EXT("SLIMBUS_4_TX", SLIMBUS_4_TX, \ 16062306a36Sopenharmony_ci id, 1, 0, msm_routing_get_audio_mixer, \ 16162306a36Sopenharmony_ci msm_routing_put_audio_mixer), \ 16262306a36Sopenharmony_ci SOC_SINGLE_EXT("SLIMBUS_5_TX", SLIMBUS_5_TX, \ 16362306a36Sopenharmony_ci id, 1, 0, msm_routing_get_audio_mixer, \ 16462306a36Sopenharmony_ci msm_routing_put_audio_mixer), \ 16562306a36Sopenharmony_ci SOC_SINGLE_EXT("SLIMBUS_6_TX", SLIMBUS_6_TX, \ 16662306a36Sopenharmony_ci id, 1, 0, msm_routing_get_audio_mixer, \ 16762306a36Sopenharmony_ci msm_routing_put_audio_mixer), \ 16862306a36Sopenharmony_ci SOC_SINGLE_EXT("PRIMARY_TDM_TX_0", PRIMARY_TDM_TX_0, \ 16962306a36Sopenharmony_ci id, 1, 0, msm_routing_get_audio_mixer, \ 17062306a36Sopenharmony_ci msm_routing_put_audio_mixer), \ 17162306a36Sopenharmony_ci SOC_SINGLE_EXT("PRIMARY_TDM_TX_1", PRIMARY_TDM_TX_1, \ 17262306a36Sopenharmony_ci id, 1, 0, msm_routing_get_audio_mixer, \ 17362306a36Sopenharmony_ci msm_routing_put_audio_mixer), \ 17462306a36Sopenharmony_ci SOC_SINGLE_EXT("PRIMARY_TDM_TX_2", PRIMARY_TDM_TX_2, \ 17562306a36Sopenharmony_ci id, 1, 0, msm_routing_get_audio_mixer, \ 17662306a36Sopenharmony_ci msm_routing_put_audio_mixer), \ 17762306a36Sopenharmony_ci SOC_SINGLE_EXT("PRIMARY_TDM_TX_3", PRIMARY_TDM_TX_3, \ 17862306a36Sopenharmony_ci id, 1, 0, msm_routing_get_audio_mixer, \ 17962306a36Sopenharmony_ci msm_routing_put_audio_mixer), \ 18062306a36Sopenharmony_ci SOC_SINGLE_EXT("PRIMARY_TDM_TX_4", PRIMARY_TDM_TX_4, \ 18162306a36Sopenharmony_ci id, 1, 0, msm_routing_get_audio_mixer, \ 18262306a36Sopenharmony_ci msm_routing_put_audio_mixer), \ 18362306a36Sopenharmony_ci SOC_SINGLE_EXT("PRIMARY_TDM_TX_5", PRIMARY_TDM_TX_5, \ 18462306a36Sopenharmony_ci id, 1, 0, msm_routing_get_audio_mixer, \ 18562306a36Sopenharmony_ci msm_routing_put_audio_mixer), \ 18662306a36Sopenharmony_ci SOC_SINGLE_EXT("PRIMARY_TDM_TX_6", PRIMARY_TDM_TX_6, \ 18762306a36Sopenharmony_ci id, 1, 0, msm_routing_get_audio_mixer, \ 18862306a36Sopenharmony_ci msm_routing_put_audio_mixer), \ 18962306a36Sopenharmony_ci SOC_SINGLE_EXT("PRIMARY_TDM_TX_7", PRIMARY_TDM_TX_7, \ 19062306a36Sopenharmony_ci id, 1, 0, msm_routing_get_audio_mixer, \ 19162306a36Sopenharmony_ci msm_routing_put_audio_mixer), \ 19262306a36Sopenharmony_ci SOC_SINGLE_EXT("SEC_TDM_TX_0", SECONDARY_TDM_TX_0, \ 19362306a36Sopenharmony_ci id, 1, 0, msm_routing_get_audio_mixer, \ 19462306a36Sopenharmony_ci msm_routing_put_audio_mixer), \ 19562306a36Sopenharmony_ci SOC_SINGLE_EXT("SEC_TDM_TX_1", SECONDARY_TDM_TX_1, \ 19662306a36Sopenharmony_ci id, 1, 0, msm_routing_get_audio_mixer, \ 19762306a36Sopenharmony_ci msm_routing_put_audio_mixer), \ 19862306a36Sopenharmony_ci SOC_SINGLE_EXT("SEC_TDM_TX_2", SECONDARY_TDM_TX_2, \ 19962306a36Sopenharmony_ci id, 1, 0, msm_routing_get_audio_mixer, \ 20062306a36Sopenharmony_ci msm_routing_put_audio_mixer), \ 20162306a36Sopenharmony_ci SOC_SINGLE_EXT("SEC_TDM_TX_3", SECONDARY_TDM_TX_3, \ 20262306a36Sopenharmony_ci id, 1, 0, msm_routing_get_audio_mixer, \ 20362306a36Sopenharmony_ci msm_routing_put_audio_mixer), \ 20462306a36Sopenharmony_ci SOC_SINGLE_EXT("SEC_TDM_TX_4", SECONDARY_TDM_TX_4, \ 20562306a36Sopenharmony_ci id, 1, 0, msm_routing_get_audio_mixer, \ 20662306a36Sopenharmony_ci msm_routing_put_audio_mixer), \ 20762306a36Sopenharmony_ci SOC_SINGLE_EXT("SEC_TDM_TX_5", SECONDARY_TDM_TX_5, \ 20862306a36Sopenharmony_ci id, 1, 0, msm_routing_get_audio_mixer, \ 20962306a36Sopenharmony_ci msm_routing_put_audio_mixer), \ 21062306a36Sopenharmony_ci SOC_SINGLE_EXT("SEC_TDM_TX_6", SECONDARY_TDM_TX_6, \ 21162306a36Sopenharmony_ci id, 1, 0, msm_routing_get_audio_mixer, \ 21262306a36Sopenharmony_ci msm_routing_put_audio_mixer), \ 21362306a36Sopenharmony_ci SOC_SINGLE_EXT("SEC_TDM_TX_7", SECONDARY_TDM_TX_7, \ 21462306a36Sopenharmony_ci id, 1, 0, msm_routing_get_audio_mixer, \ 21562306a36Sopenharmony_ci msm_routing_put_audio_mixer), \ 21662306a36Sopenharmony_ci SOC_SINGLE_EXT("TERT_TDM_TX_0", TERTIARY_TDM_TX_0, \ 21762306a36Sopenharmony_ci id, 1, 0, msm_routing_get_audio_mixer, \ 21862306a36Sopenharmony_ci msm_routing_put_audio_mixer), \ 21962306a36Sopenharmony_ci SOC_SINGLE_EXT("TERT_TDM_TX_1", TERTIARY_TDM_TX_1, \ 22062306a36Sopenharmony_ci id, 1, 0, msm_routing_get_audio_mixer, \ 22162306a36Sopenharmony_ci msm_routing_put_audio_mixer), \ 22262306a36Sopenharmony_ci SOC_SINGLE_EXT("TERT_TDM_TX_2", TERTIARY_TDM_TX_2, \ 22362306a36Sopenharmony_ci id, 1, 0, msm_routing_get_audio_mixer, \ 22462306a36Sopenharmony_ci msm_routing_put_audio_mixer), \ 22562306a36Sopenharmony_ci SOC_SINGLE_EXT("TERT_TDM_TX_3", TERTIARY_TDM_TX_3, \ 22662306a36Sopenharmony_ci id, 1, 0, msm_routing_get_audio_mixer, \ 22762306a36Sopenharmony_ci msm_routing_put_audio_mixer), \ 22862306a36Sopenharmony_ci SOC_SINGLE_EXT("TERT_TDM_TX_4", TERTIARY_TDM_TX_4, \ 22962306a36Sopenharmony_ci id, 1, 0, msm_routing_get_audio_mixer, \ 23062306a36Sopenharmony_ci msm_routing_put_audio_mixer), \ 23162306a36Sopenharmony_ci SOC_SINGLE_EXT("TERT_TDM_TX_5", TERTIARY_TDM_TX_5, \ 23262306a36Sopenharmony_ci id, 1, 0, msm_routing_get_audio_mixer, \ 23362306a36Sopenharmony_ci msm_routing_put_audio_mixer), \ 23462306a36Sopenharmony_ci SOC_SINGLE_EXT("TERT_TDM_TX_6", TERTIARY_TDM_TX_6, \ 23562306a36Sopenharmony_ci id, 1, 0, msm_routing_get_audio_mixer, \ 23662306a36Sopenharmony_ci msm_routing_put_audio_mixer), \ 23762306a36Sopenharmony_ci SOC_SINGLE_EXT("TERT_TDM_TX_7", TERTIARY_TDM_TX_7, \ 23862306a36Sopenharmony_ci id, 1, 0, msm_routing_get_audio_mixer, \ 23962306a36Sopenharmony_ci msm_routing_put_audio_mixer), \ 24062306a36Sopenharmony_ci SOC_SINGLE_EXT("QUAT_TDM_TX_0", QUATERNARY_TDM_TX_0, \ 24162306a36Sopenharmony_ci id, 1, 0, msm_routing_get_audio_mixer, \ 24262306a36Sopenharmony_ci msm_routing_put_audio_mixer), \ 24362306a36Sopenharmony_ci SOC_SINGLE_EXT("QUAT_TDM_TX_1", QUATERNARY_TDM_TX_1, \ 24462306a36Sopenharmony_ci id, 1, 0, msm_routing_get_audio_mixer, \ 24562306a36Sopenharmony_ci msm_routing_put_audio_mixer), \ 24662306a36Sopenharmony_ci SOC_SINGLE_EXT("QUAT_TDM_TX_2", QUATERNARY_TDM_TX_2, \ 24762306a36Sopenharmony_ci id, 1, 0, msm_routing_get_audio_mixer, \ 24862306a36Sopenharmony_ci msm_routing_put_audio_mixer), \ 24962306a36Sopenharmony_ci SOC_SINGLE_EXT("QUAT_TDM_TX_3", QUATERNARY_TDM_TX_3, \ 25062306a36Sopenharmony_ci id, 1, 0, msm_routing_get_audio_mixer, \ 25162306a36Sopenharmony_ci msm_routing_put_audio_mixer), \ 25262306a36Sopenharmony_ci SOC_SINGLE_EXT("QUAT_TDM_TX_4", QUATERNARY_TDM_TX_4, \ 25362306a36Sopenharmony_ci id, 1, 0, msm_routing_get_audio_mixer, \ 25462306a36Sopenharmony_ci msm_routing_put_audio_mixer), \ 25562306a36Sopenharmony_ci SOC_SINGLE_EXT("QUAT_TDM_TX_5", QUATERNARY_TDM_TX_5, \ 25662306a36Sopenharmony_ci id, 1, 0, msm_routing_get_audio_mixer, \ 25762306a36Sopenharmony_ci msm_routing_put_audio_mixer), \ 25862306a36Sopenharmony_ci SOC_SINGLE_EXT("QUAT_TDM_TX_6", QUATERNARY_TDM_TX_6, \ 25962306a36Sopenharmony_ci id, 1, 0, msm_routing_get_audio_mixer, \ 26062306a36Sopenharmony_ci msm_routing_put_audio_mixer), \ 26162306a36Sopenharmony_ci SOC_SINGLE_EXT("QUAT_TDM_TX_7", QUATERNARY_TDM_TX_7, \ 26262306a36Sopenharmony_ci id, 1, 0, msm_routing_get_audio_mixer, \ 26362306a36Sopenharmony_ci msm_routing_put_audio_mixer), \ 26462306a36Sopenharmony_ci SOC_SINGLE_EXT("QUIN_TDM_TX_0", QUINARY_TDM_TX_0, \ 26562306a36Sopenharmony_ci id, 1, 0, msm_routing_get_audio_mixer, \ 26662306a36Sopenharmony_ci msm_routing_put_audio_mixer), \ 26762306a36Sopenharmony_ci SOC_SINGLE_EXT("QUIN_TDM_TX_1", QUINARY_TDM_TX_1, \ 26862306a36Sopenharmony_ci id, 1, 0, msm_routing_get_audio_mixer, \ 26962306a36Sopenharmony_ci msm_routing_put_audio_mixer), \ 27062306a36Sopenharmony_ci SOC_SINGLE_EXT("QUIN_TDM_TX_2", QUINARY_TDM_TX_2, \ 27162306a36Sopenharmony_ci id, 1, 0, msm_routing_get_audio_mixer, \ 27262306a36Sopenharmony_ci msm_routing_put_audio_mixer), \ 27362306a36Sopenharmony_ci SOC_SINGLE_EXT("QUIN_TDM_TX_3", QUINARY_TDM_TX_3, \ 27462306a36Sopenharmony_ci id, 1, 0, msm_routing_get_audio_mixer, \ 27562306a36Sopenharmony_ci msm_routing_put_audio_mixer), \ 27662306a36Sopenharmony_ci SOC_SINGLE_EXT("QUIN_TDM_TX_4", QUINARY_TDM_TX_4, \ 27762306a36Sopenharmony_ci id, 1, 0, msm_routing_get_audio_mixer, \ 27862306a36Sopenharmony_ci msm_routing_put_audio_mixer), \ 27962306a36Sopenharmony_ci SOC_SINGLE_EXT("QUIN_TDM_TX_5", QUINARY_TDM_TX_5, \ 28062306a36Sopenharmony_ci id, 1, 0, msm_routing_get_audio_mixer, \ 28162306a36Sopenharmony_ci msm_routing_put_audio_mixer), \ 28262306a36Sopenharmony_ci SOC_SINGLE_EXT("QUIN_TDM_TX_6", QUINARY_TDM_TX_6, \ 28362306a36Sopenharmony_ci id, 1, 0, msm_routing_get_audio_mixer, \ 28462306a36Sopenharmony_ci msm_routing_put_audio_mixer), \ 28562306a36Sopenharmony_ci SOC_SINGLE_EXT("QUIN_TDM_TX_7", QUINARY_TDM_TX_7, \ 28662306a36Sopenharmony_ci id, 1, 0, msm_routing_get_audio_mixer, \ 28762306a36Sopenharmony_ci msm_routing_put_audio_mixer), \ 28862306a36Sopenharmony_ci SOC_SINGLE_EXT("WSA_CODEC_DMA_TX_0", WSA_CODEC_DMA_TX_0, \ 28962306a36Sopenharmony_ci id, 1, 0, msm_routing_get_audio_mixer, \ 29062306a36Sopenharmony_ci msm_routing_put_audio_mixer), \ 29162306a36Sopenharmony_ci SOC_SINGLE_EXT("WSA_CODEC_DMA_TX_1", WSA_CODEC_DMA_TX_1, \ 29262306a36Sopenharmony_ci id, 1, 0, msm_routing_get_audio_mixer, \ 29362306a36Sopenharmony_ci msm_routing_put_audio_mixer), \ 29462306a36Sopenharmony_ci SOC_SINGLE_EXT("WSA_CODEC_DMA_TX_2", WSA_CODEC_DMA_TX_2, \ 29562306a36Sopenharmony_ci id, 1, 0, msm_routing_get_audio_mixer, \ 29662306a36Sopenharmony_ci msm_routing_put_audio_mixer), \ 29762306a36Sopenharmony_ci SOC_SINGLE_EXT("VA_CODEC_DMA_TX_0", VA_CODEC_DMA_TX_0, \ 29862306a36Sopenharmony_ci id, 1, 0, msm_routing_get_audio_mixer, \ 29962306a36Sopenharmony_ci msm_routing_put_audio_mixer), \ 30062306a36Sopenharmony_ci SOC_SINGLE_EXT("VA_CODEC_DMA_TX_1", VA_CODEC_DMA_TX_1, \ 30162306a36Sopenharmony_ci id, 1, 0, msm_routing_get_audio_mixer, \ 30262306a36Sopenharmony_ci msm_routing_put_audio_mixer), \ 30362306a36Sopenharmony_ci SOC_SINGLE_EXT("VA_CODEC_DMA_TX_2", VA_CODEC_DMA_TX_2, \ 30462306a36Sopenharmony_ci id, 1, 0, msm_routing_get_audio_mixer, \ 30562306a36Sopenharmony_ci msm_routing_put_audio_mixer), \ 30662306a36Sopenharmony_ci SOC_SINGLE_EXT("TX_CODEC_DMA_TX_0", TX_CODEC_DMA_TX_0, \ 30762306a36Sopenharmony_ci id, 1, 0, msm_routing_get_audio_mixer, \ 30862306a36Sopenharmony_ci msm_routing_put_audio_mixer), \ 30962306a36Sopenharmony_ci SOC_SINGLE_EXT("TX_CODEC_DMA_TX_1", TX_CODEC_DMA_TX_1, \ 31062306a36Sopenharmony_ci id, 1, 0, msm_routing_get_audio_mixer, \ 31162306a36Sopenharmony_ci msm_routing_put_audio_mixer), \ 31262306a36Sopenharmony_ci SOC_SINGLE_EXT("TX_CODEC_DMA_TX_2", TX_CODEC_DMA_TX_2, \ 31362306a36Sopenharmony_ci id, 1, 0, msm_routing_get_audio_mixer, \ 31462306a36Sopenharmony_ci msm_routing_put_audio_mixer), \ 31562306a36Sopenharmony_ci SOC_SINGLE_EXT("TX_CODEC_DMA_TX_3", TX_CODEC_DMA_TX_3, \ 31662306a36Sopenharmony_ci id, 1, 0, msm_routing_get_audio_mixer, \ 31762306a36Sopenharmony_ci msm_routing_put_audio_mixer), \ 31862306a36Sopenharmony_ci SOC_SINGLE_EXT("TX_CODEC_DMA_TX_4", TX_CODEC_DMA_TX_4, \ 31962306a36Sopenharmony_ci id, 1, 0, msm_routing_get_audio_mixer, \ 32062306a36Sopenharmony_ci msm_routing_put_audio_mixer), \ 32162306a36Sopenharmony_ci SOC_SINGLE_EXT("TX_CODEC_DMA_TX_5", TX_CODEC_DMA_TX_5, \ 32262306a36Sopenharmony_ci id, 1, 0, msm_routing_get_audio_mixer, \ 32362306a36Sopenharmony_ci msm_routing_put_audio_mixer), 32462306a36Sopenharmony_ci 32562306a36Sopenharmony_cistruct session_data { 32662306a36Sopenharmony_ci int state; 32762306a36Sopenharmony_ci int port_id; 32862306a36Sopenharmony_ci int path_type; 32962306a36Sopenharmony_ci int app_type; 33062306a36Sopenharmony_ci int acdb_id; 33162306a36Sopenharmony_ci int sample_rate; 33262306a36Sopenharmony_ci int bits_per_sample; 33362306a36Sopenharmony_ci int channels; 33462306a36Sopenharmony_ci int perf_mode; 33562306a36Sopenharmony_ci int numcopps; 33662306a36Sopenharmony_ci int fedai_id; 33762306a36Sopenharmony_ci unsigned long copp_map; 33862306a36Sopenharmony_ci struct q6copp *copps[MAX_COPPS_PER_PORT]; 33962306a36Sopenharmony_ci}; 34062306a36Sopenharmony_ci 34162306a36Sopenharmony_cistruct msm_routing_data { 34262306a36Sopenharmony_ci struct session_data sessions[MAX_SESSIONS]; 34362306a36Sopenharmony_ci struct session_data port_data[AFE_MAX_PORTS]; 34462306a36Sopenharmony_ci struct device *dev; 34562306a36Sopenharmony_ci struct mutex lock; 34662306a36Sopenharmony_ci}; 34762306a36Sopenharmony_ci 34862306a36Sopenharmony_cistatic struct msm_routing_data *routing_data; 34962306a36Sopenharmony_ci 35062306a36Sopenharmony_ci/** 35162306a36Sopenharmony_ci * q6routing_stream_open() - Register a new stream for route setup 35262306a36Sopenharmony_ci * 35362306a36Sopenharmony_ci * @fedai_id: Frontend dai id. 35462306a36Sopenharmony_ci * @perf_mode: Performance mode. 35562306a36Sopenharmony_ci * @stream_id: ASM stream id to map. 35662306a36Sopenharmony_ci * @stream_type: Direction of stream 35762306a36Sopenharmony_ci * 35862306a36Sopenharmony_ci * Return: Will be an negative on error or a zero on success. 35962306a36Sopenharmony_ci */ 36062306a36Sopenharmony_ciint q6routing_stream_open(int fedai_id, int perf_mode, 36162306a36Sopenharmony_ci int stream_id, int stream_type) 36262306a36Sopenharmony_ci{ 36362306a36Sopenharmony_ci int j, topology, num_copps = 0; 36462306a36Sopenharmony_ci struct route_payload payload; 36562306a36Sopenharmony_ci struct q6copp *copp; 36662306a36Sopenharmony_ci int copp_idx; 36762306a36Sopenharmony_ci struct session_data *session, *pdata; 36862306a36Sopenharmony_ci 36962306a36Sopenharmony_ci if (!routing_data) { 37062306a36Sopenharmony_ci pr_err("Routing driver not yet ready\n"); 37162306a36Sopenharmony_ci return -EINVAL; 37262306a36Sopenharmony_ci } 37362306a36Sopenharmony_ci 37462306a36Sopenharmony_ci session = &routing_data->sessions[stream_id - 1]; 37562306a36Sopenharmony_ci if (session->port_id < 0) { 37662306a36Sopenharmony_ci dev_err(routing_data->dev, "Routing not setup for MultiMedia%d Session\n", 37762306a36Sopenharmony_ci session->fedai_id); 37862306a36Sopenharmony_ci return -EINVAL; 37962306a36Sopenharmony_ci } 38062306a36Sopenharmony_ci 38162306a36Sopenharmony_ci pdata = &routing_data->port_data[session->port_id]; 38262306a36Sopenharmony_ci 38362306a36Sopenharmony_ci mutex_lock(&routing_data->lock); 38462306a36Sopenharmony_ci session->fedai_id = fedai_id; 38562306a36Sopenharmony_ci 38662306a36Sopenharmony_ci session->path_type = pdata->path_type; 38762306a36Sopenharmony_ci session->sample_rate = pdata->sample_rate; 38862306a36Sopenharmony_ci session->channels = pdata->channels; 38962306a36Sopenharmony_ci session->bits_per_sample = pdata->bits_per_sample; 39062306a36Sopenharmony_ci 39162306a36Sopenharmony_ci payload.num_copps = 0; /* only RX needs to use payload */ 39262306a36Sopenharmony_ci topology = NULL_COPP_TOPOLOGY; 39362306a36Sopenharmony_ci copp = q6adm_open(routing_data->dev, session->port_id, 39462306a36Sopenharmony_ci session->path_type, session->sample_rate, 39562306a36Sopenharmony_ci session->channels, topology, perf_mode, 39662306a36Sopenharmony_ci session->bits_per_sample, 0, 0); 39762306a36Sopenharmony_ci 39862306a36Sopenharmony_ci if (IS_ERR_OR_NULL(copp)) { 39962306a36Sopenharmony_ci mutex_unlock(&routing_data->lock); 40062306a36Sopenharmony_ci return -EINVAL; 40162306a36Sopenharmony_ci } 40262306a36Sopenharmony_ci 40362306a36Sopenharmony_ci copp_idx = q6adm_get_copp_id(copp); 40462306a36Sopenharmony_ci set_bit(copp_idx, &session->copp_map); 40562306a36Sopenharmony_ci session->copps[copp_idx] = copp; 40662306a36Sopenharmony_ci 40762306a36Sopenharmony_ci for_each_set_bit(j, &session->copp_map, MAX_COPPS_PER_PORT) { 40862306a36Sopenharmony_ci payload.port_id[num_copps] = session->port_id; 40962306a36Sopenharmony_ci payload.copp_idx[num_copps] = j; 41062306a36Sopenharmony_ci num_copps++; 41162306a36Sopenharmony_ci } 41262306a36Sopenharmony_ci 41362306a36Sopenharmony_ci if (num_copps) { 41462306a36Sopenharmony_ci payload.num_copps = num_copps; 41562306a36Sopenharmony_ci payload.session_id = stream_id; 41662306a36Sopenharmony_ci q6adm_matrix_map(routing_data->dev, session->path_type, 41762306a36Sopenharmony_ci payload, perf_mode); 41862306a36Sopenharmony_ci } 41962306a36Sopenharmony_ci mutex_unlock(&routing_data->lock); 42062306a36Sopenharmony_ci 42162306a36Sopenharmony_ci return 0; 42262306a36Sopenharmony_ci} 42362306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(q6routing_stream_open); 42462306a36Sopenharmony_ci 42562306a36Sopenharmony_cistatic struct session_data *get_session_from_id(struct msm_routing_data *data, 42662306a36Sopenharmony_ci int fedai_id) 42762306a36Sopenharmony_ci{ 42862306a36Sopenharmony_ci int i; 42962306a36Sopenharmony_ci 43062306a36Sopenharmony_ci for (i = 0; i < MAX_SESSIONS; i++) { 43162306a36Sopenharmony_ci if (fedai_id == data->sessions[i].fedai_id) 43262306a36Sopenharmony_ci return &data->sessions[i]; 43362306a36Sopenharmony_ci } 43462306a36Sopenharmony_ci 43562306a36Sopenharmony_ci return NULL; 43662306a36Sopenharmony_ci} 43762306a36Sopenharmony_ci/** 43862306a36Sopenharmony_ci * q6routing_stream_close() - Deregister a stream 43962306a36Sopenharmony_ci * 44062306a36Sopenharmony_ci * @fedai_id: Frontend dai id. 44162306a36Sopenharmony_ci * @stream_type: Direction of stream 44262306a36Sopenharmony_ci * 44362306a36Sopenharmony_ci * Return: Will be an negative on error or a zero on success. 44462306a36Sopenharmony_ci */ 44562306a36Sopenharmony_civoid q6routing_stream_close(int fedai_id, int stream_type) 44662306a36Sopenharmony_ci{ 44762306a36Sopenharmony_ci struct session_data *session; 44862306a36Sopenharmony_ci int idx; 44962306a36Sopenharmony_ci 45062306a36Sopenharmony_ci session = get_session_from_id(routing_data, fedai_id); 45162306a36Sopenharmony_ci if (!session) 45262306a36Sopenharmony_ci return; 45362306a36Sopenharmony_ci 45462306a36Sopenharmony_ci for_each_set_bit(idx, &session->copp_map, MAX_COPPS_PER_PORT) { 45562306a36Sopenharmony_ci if (session->copps[idx]) { 45662306a36Sopenharmony_ci q6adm_close(routing_data->dev, session->copps[idx]); 45762306a36Sopenharmony_ci session->copps[idx] = NULL; 45862306a36Sopenharmony_ci } 45962306a36Sopenharmony_ci } 46062306a36Sopenharmony_ci 46162306a36Sopenharmony_ci session->fedai_id = -1; 46262306a36Sopenharmony_ci session->copp_map = 0; 46362306a36Sopenharmony_ci} 46462306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(q6routing_stream_close); 46562306a36Sopenharmony_ci 46662306a36Sopenharmony_cistatic int msm_routing_get_audio_mixer(struct snd_kcontrol *kcontrol, 46762306a36Sopenharmony_ci struct snd_ctl_elem_value *ucontrol) 46862306a36Sopenharmony_ci{ 46962306a36Sopenharmony_ci struct snd_soc_dapm_context *dapm = 47062306a36Sopenharmony_ci snd_soc_dapm_kcontrol_dapm(kcontrol); 47162306a36Sopenharmony_ci struct soc_mixer_control *mc = 47262306a36Sopenharmony_ci (struct soc_mixer_control *)kcontrol->private_value; 47362306a36Sopenharmony_ci int session_id = mc->shift; 47462306a36Sopenharmony_ci struct snd_soc_component *c = snd_soc_dapm_to_component(dapm); 47562306a36Sopenharmony_ci struct msm_routing_data *priv = dev_get_drvdata(c->dev); 47662306a36Sopenharmony_ci struct session_data *session = &priv->sessions[session_id]; 47762306a36Sopenharmony_ci 47862306a36Sopenharmony_ci if (session->port_id == mc->reg) 47962306a36Sopenharmony_ci ucontrol->value.integer.value[0] = 1; 48062306a36Sopenharmony_ci else 48162306a36Sopenharmony_ci ucontrol->value.integer.value[0] = 0; 48262306a36Sopenharmony_ci 48362306a36Sopenharmony_ci return 0; 48462306a36Sopenharmony_ci} 48562306a36Sopenharmony_ci 48662306a36Sopenharmony_cistatic int msm_routing_put_audio_mixer(struct snd_kcontrol *kcontrol, 48762306a36Sopenharmony_ci struct snd_ctl_elem_value *ucontrol) 48862306a36Sopenharmony_ci{ 48962306a36Sopenharmony_ci struct snd_soc_dapm_context *dapm = 49062306a36Sopenharmony_ci snd_soc_dapm_kcontrol_dapm(kcontrol); 49162306a36Sopenharmony_ci struct snd_soc_component *c = snd_soc_dapm_to_component(dapm); 49262306a36Sopenharmony_ci struct msm_routing_data *data = dev_get_drvdata(c->dev); 49362306a36Sopenharmony_ci struct soc_mixer_control *mc = 49462306a36Sopenharmony_ci (struct soc_mixer_control *)kcontrol->private_value; 49562306a36Sopenharmony_ci struct snd_soc_dapm_update *update = NULL; 49662306a36Sopenharmony_ci int be_id = mc->reg; 49762306a36Sopenharmony_ci int session_id = mc->shift; 49862306a36Sopenharmony_ci struct session_data *session = &data->sessions[session_id]; 49962306a36Sopenharmony_ci 50062306a36Sopenharmony_ci if (ucontrol->value.integer.value[0]) { 50162306a36Sopenharmony_ci if (session->port_id == be_id) 50262306a36Sopenharmony_ci return 0; 50362306a36Sopenharmony_ci 50462306a36Sopenharmony_ci session->port_id = be_id; 50562306a36Sopenharmony_ci snd_soc_dapm_mixer_update_power(dapm, kcontrol, 1, update); 50662306a36Sopenharmony_ci } else { 50762306a36Sopenharmony_ci if (session->port_id == -1 || session->port_id != be_id) 50862306a36Sopenharmony_ci return 0; 50962306a36Sopenharmony_ci 51062306a36Sopenharmony_ci session->port_id = -1; 51162306a36Sopenharmony_ci snd_soc_dapm_mixer_update_power(dapm, kcontrol, 0, update); 51262306a36Sopenharmony_ci } 51362306a36Sopenharmony_ci 51462306a36Sopenharmony_ci return 1; 51562306a36Sopenharmony_ci} 51662306a36Sopenharmony_ci 51762306a36Sopenharmony_cistatic const struct snd_kcontrol_new hdmi_mixer_controls[] = { 51862306a36Sopenharmony_ci Q6ROUTING_RX_MIXERS(HDMI_RX) }; 51962306a36Sopenharmony_ci 52062306a36Sopenharmony_cistatic const struct snd_kcontrol_new display_port_mixer_controls[] = { 52162306a36Sopenharmony_ci Q6ROUTING_RX_MIXERS(DISPLAY_PORT_RX) }; 52262306a36Sopenharmony_ci 52362306a36Sopenharmony_cistatic const struct snd_kcontrol_new primary_mi2s_rx_mixer_controls[] = { 52462306a36Sopenharmony_ci Q6ROUTING_RX_MIXERS(PRIMARY_MI2S_RX) }; 52562306a36Sopenharmony_ci 52662306a36Sopenharmony_cistatic const struct snd_kcontrol_new secondary_mi2s_rx_mixer_controls[] = { 52762306a36Sopenharmony_ci Q6ROUTING_RX_MIXERS(SECONDARY_MI2S_RX) }; 52862306a36Sopenharmony_ci 52962306a36Sopenharmony_cistatic const struct snd_kcontrol_new quaternary_mi2s_rx_mixer_controls[] = { 53062306a36Sopenharmony_ci Q6ROUTING_RX_MIXERS(QUATERNARY_MI2S_RX) }; 53162306a36Sopenharmony_ci 53262306a36Sopenharmony_cistatic const struct snd_kcontrol_new quinary_mi2s_rx_mixer_controls[] = { 53362306a36Sopenharmony_ci Q6ROUTING_RX_MIXERS(QUINARY_MI2S_RX) }; 53462306a36Sopenharmony_ci 53562306a36Sopenharmony_cistatic const struct snd_kcontrol_new tertiary_mi2s_rx_mixer_controls[] = { 53662306a36Sopenharmony_ci Q6ROUTING_RX_MIXERS(TERTIARY_MI2S_RX) }; 53762306a36Sopenharmony_ci 53862306a36Sopenharmony_cistatic const struct snd_kcontrol_new slimbus_rx_mixer_controls[] = { 53962306a36Sopenharmony_ci Q6ROUTING_RX_MIXERS(SLIMBUS_0_RX) }; 54062306a36Sopenharmony_ci 54162306a36Sopenharmony_cistatic const struct snd_kcontrol_new slimbus_1_rx_mixer_controls[] = { 54262306a36Sopenharmony_ci Q6ROUTING_RX_MIXERS(SLIMBUS_1_RX) }; 54362306a36Sopenharmony_ci 54462306a36Sopenharmony_cistatic const struct snd_kcontrol_new slimbus_2_rx_mixer_controls[] = { 54562306a36Sopenharmony_ci Q6ROUTING_RX_MIXERS(SLIMBUS_2_RX) }; 54662306a36Sopenharmony_ci 54762306a36Sopenharmony_cistatic const struct snd_kcontrol_new slimbus_3_rx_mixer_controls[] = { 54862306a36Sopenharmony_ci Q6ROUTING_RX_MIXERS(SLIMBUS_3_RX) }; 54962306a36Sopenharmony_ci 55062306a36Sopenharmony_cistatic const struct snd_kcontrol_new slimbus_4_rx_mixer_controls[] = { 55162306a36Sopenharmony_ci Q6ROUTING_RX_MIXERS(SLIMBUS_4_RX) }; 55262306a36Sopenharmony_ci 55362306a36Sopenharmony_cistatic const struct snd_kcontrol_new slimbus_5_rx_mixer_controls[] = { 55462306a36Sopenharmony_ci Q6ROUTING_RX_MIXERS(SLIMBUS_5_RX) }; 55562306a36Sopenharmony_ci 55662306a36Sopenharmony_cistatic const struct snd_kcontrol_new slimbus_6_rx_mixer_controls[] = { 55762306a36Sopenharmony_ci Q6ROUTING_RX_MIXERS(SLIMBUS_6_RX) }; 55862306a36Sopenharmony_ci 55962306a36Sopenharmony_cistatic const struct snd_kcontrol_new pri_tdm_rx_0_mixer_controls[] = { 56062306a36Sopenharmony_ci Q6ROUTING_RX_MIXERS(PRIMARY_TDM_RX_0) }; 56162306a36Sopenharmony_ci 56262306a36Sopenharmony_cistatic const struct snd_kcontrol_new pri_tdm_rx_1_mixer_controls[] = { 56362306a36Sopenharmony_ci Q6ROUTING_RX_MIXERS(PRIMARY_TDM_RX_1) }; 56462306a36Sopenharmony_ci 56562306a36Sopenharmony_cistatic const struct snd_kcontrol_new pri_tdm_rx_2_mixer_controls[] = { 56662306a36Sopenharmony_ci Q6ROUTING_RX_MIXERS(PRIMARY_TDM_RX_2) }; 56762306a36Sopenharmony_ci 56862306a36Sopenharmony_cistatic const struct snd_kcontrol_new pri_tdm_rx_3_mixer_controls[] = { 56962306a36Sopenharmony_ci Q6ROUTING_RX_MIXERS(PRIMARY_TDM_RX_3) }; 57062306a36Sopenharmony_ci 57162306a36Sopenharmony_cistatic const struct snd_kcontrol_new pri_tdm_rx_4_mixer_controls[] = { 57262306a36Sopenharmony_ci Q6ROUTING_RX_MIXERS(PRIMARY_TDM_RX_4) }; 57362306a36Sopenharmony_ci 57462306a36Sopenharmony_cistatic const struct snd_kcontrol_new pri_tdm_rx_5_mixer_controls[] = { 57562306a36Sopenharmony_ci Q6ROUTING_RX_MIXERS(PRIMARY_TDM_RX_5) }; 57662306a36Sopenharmony_ci 57762306a36Sopenharmony_cistatic const struct snd_kcontrol_new pri_tdm_rx_6_mixer_controls[] = { 57862306a36Sopenharmony_ci Q6ROUTING_RX_MIXERS(PRIMARY_TDM_RX_6) }; 57962306a36Sopenharmony_ci 58062306a36Sopenharmony_cistatic const struct snd_kcontrol_new pri_tdm_rx_7_mixer_controls[] = { 58162306a36Sopenharmony_ci Q6ROUTING_RX_MIXERS(PRIMARY_TDM_RX_7) }; 58262306a36Sopenharmony_ci 58362306a36Sopenharmony_cistatic const struct snd_kcontrol_new sec_tdm_rx_0_mixer_controls[] = { 58462306a36Sopenharmony_ci Q6ROUTING_RX_MIXERS(SECONDARY_TDM_RX_0) }; 58562306a36Sopenharmony_ci 58662306a36Sopenharmony_cistatic const struct snd_kcontrol_new sec_tdm_rx_1_mixer_controls[] = { 58762306a36Sopenharmony_ci Q6ROUTING_RX_MIXERS(SECONDARY_TDM_RX_1) }; 58862306a36Sopenharmony_ci 58962306a36Sopenharmony_cistatic const struct snd_kcontrol_new sec_tdm_rx_2_mixer_controls[] = { 59062306a36Sopenharmony_ci Q6ROUTING_RX_MIXERS(SECONDARY_TDM_RX_2) }; 59162306a36Sopenharmony_ci 59262306a36Sopenharmony_cistatic const struct snd_kcontrol_new sec_tdm_rx_3_mixer_controls[] = { 59362306a36Sopenharmony_ci Q6ROUTING_RX_MIXERS(SECONDARY_TDM_RX_3) }; 59462306a36Sopenharmony_ci 59562306a36Sopenharmony_cistatic const struct snd_kcontrol_new sec_tdm_rx_4_mixer_controls[] = { 59662306a36Sopenharmony_ci Q6ROUTING_RX_MIXERS(SECONDARY_TDM_RX_4) }; 59762306a36Sopenharmony_ci 59862306a36Sopenharmony_cistatic const struct snd_kcontrol_new sec_tdm_rx_5_mixer_controls[] = { 59962306a36Sopenharmony_ci Q6ROUTING_RX_MIXERS(SECONDARY_TDM_RX_5) }; 60062306a36Sopenharmony_ci 60162306a36Sopenharmony_cistatic const struct snd_kcontrol_new sec_tdm_rx_6_mixer_controls[] = { 60262306a36Sopenharmony_ci Q6ROUTING_RX_MIXERS(SECONDARY_TDM_RX_6) }; 60362306a36Sopenharmony_ci 60462306a36Sopenharmony_cistatic const struct snd_kcontrol_new sec_tdm_rx_7_mixer_controls[] = { 60562306a36Sopenharmony_ci Q6ROUTING_RX_MIXERS(SECONDARY_TDM_RX_7) }; 60662306a36Sopenharmony_ci 60762306a36Sopenharmony_cistatic const struct snd_kcontrol_new tert_tdm_rx_0_mixer_controls[] = { 60862306a36Sopenharmony_ci Q6ROUTING_RX_MIXERS(TERTIARY_TDM_RX_0) }; 60962306a36Sopenharmony_ci 61062306a36Sopenharmony_cistatic const struct snd_kcontrol_new tert_tdm_rx_1_mixer_controls[] = { 61162306a36Sopenharmony_ci Q6ROUTING_RX_MIXERS(TERTIARY_TDM_RX_1) }; 61262306a36Sopenharmony_ci 61362306a36Sopenharmony_cistatic const struct snd_kcontrol_new tert_tdm_rx_2_mixer_controls[] = { 61462306a36Sopenharmony_ci Q6ROUTING_RX_MIXERS(TERTIARY_TDM_RX_2) }; 61562306a36Sopenharmony_ci 61662306a36Sopenharmony_cistatic const struct snd_kcontrol_new tert_tdm_rx_3_mixer_controls[] = { 61762306a36Sopenharmony_ci Q6ROUTING_RX_MIXERS(TERTIARY_TDM_RX_3) }; 61862306a36Sopenharmony_ci 61962306a36Sopenharmony_cistatic const struct snd_kcontrol_new tert_tdm_rx_4_mixer_controls[] = { 62062306a36Sopenharmony_ci Q6ROUTING_RX_MIXERS(TERTIARY_TDM_RX_4) }; 62162306a36Sopenharmony_ci 62262306a36Sopenharmony_cistatic const struct snd_kcontrol_new tert_tdm_rx_5_mixer_controls[] = { 62362306a36Sopenharmony_ci Q6ROUTING_RX_MIXERS(TERTIARY_TDM_RX_5) }; 62462306a36Sopenharmony_ci 62562306a36Sopenharmony_cistatic const struct snd_kcontrol_new tert_tdm_rx_6_mixer_controls[] = { 62662306a36Sopenharmony_ci Q6ROUTING_RX_MIXERS(TERTIARY_TDM_RX_6) }; 62762306a36Sopenharmony_ci 62862306a36Sopenharmony_cistatic const struct snd_kcontrol_new tert_tdm_rx_7_mixer_controls[] = { 62962306a36Sopenharmony_ci Q6ROUTING_RX_MIXERS(TERTIARY_TDM_RX_7) }; 63062306a36Sopenharmony_ci 63162306a36Sopenharmony_cistatic const struct snd_kcontrol_new quat_tdm_rx_0_mixer_controls[] = { 63262306a36Sopenharmony_ci Q6ROUTING_RX_MIXERS(QUATERNARY_TDM_RX_0) }; 63362306a36Sopenharmony_ci 63462306a36Sopenharmony_cistatic const struct snd_kcontrol_new quat_tdm_rx_1_mixer_controls[] = { 63562306a36Sopenharmony_ci Q6ROUTING_RX_MIXERS(QUATERNARY_TDM_RX_1) }; 63662306a36Sopenharmony_ci 63762306a36Sopenharmony_cistatic const struct snd_kcontrol_new quat_tdm_rx_2_mixer_controls[] = { 63862306a36Sopenharmony_ci Q6ROUTING_RX_MIXERS(QUATERNARY_TDM_RX_2) }; 63962306a36Sopenharmony_ci 64062306a36Sopenharmony_cistatic const struct snd_kcontrol_new quat_tdm_rx_3_mixer_controls[] = { 64162306a36Sopenharmony_ci Q6ROUTING_RX_MIXERS(QUATERNARY_TDM_RX_3) }; 64262306a36Sopenharmony_ci 64362306a36Sopenharmony_cistatic const struct snd_kcontrol_new quat_tdm_rx_4_mixer_controls[] = { 64462306a36Sopenharmony_ci Q6ROUTING_RX_MIXERS(QUATERNARY_TDM_RX_4) }; 64562306a36Sopenharmony_ci 64662306a36Sopenharmony_cistatic const struct snd_kcontrol_new quat_tdm_rx_5_mixer_controls[] = { 64762306a36Sopenharmony_ci Q6ROUTING_RX_MIXERS(QUATERNARY_TDM_RX_5) }; 64862306a36Sopenharmony_ci 64962306a36Sopenharmony_cistatic const struct snd_kcontrol_new quat_tdm_rx_6_mixer_controls[] = { 65062306a36Sopenharmony_ci Q6ROUTING_RX_MIXERS(QUATERNARY_TDM_RX_6) }; 65162306a36Sopenharmony_ci 65262306a36Sopenharmony_cistatic const struct snd_kcontrol_new quat_tdm_rx_7_mixer_controls[] = { 65362306a36Sopenharmony_ci Q6ROUTING_RX_MIXERS(QUATERNARY_TDM_RX_7) }; 65462306a36Sopenharmony_ci 65562306a36Sopenharmony_cistatic const struct snd_kcontrol_new quin_tdm_rx_0_mixer_controls[] = { 65662306a36Sopenharmony_ci Q6ROUTING_RX_MIXERS(QUINARY_TDM_RX_0) }; 65762306a36Sopenharmony_ci 65862306a36Sopenharmony_cistatic const struct snd_kcontrol_new quin_tdm_rx_1_mixer_controls[] = { 65962306a36Sopenharmony_ci Q6ROUTING_RX_MIXERS(QUINARY_TDM_RX_1) }; 66062306a36Sopenharmony_ci 66162306a36Sopenharmony_cistatic const struct snd_kcontrol_new quin_tdm_rx_2_mixer_controls[] = { 66262306a36Sopenharmony_ci Q6ROUTING_RX_MIXERS(QUINARY_TDM_RX_2) }; 66362306a36Sopenharmony_ci 66462306a36Sopenharmony_cistatic const struct snd_kcontrol_new quin_tdm_rx_3_mixer_controls[] = { 66562306a36Sopenharmony_ci Q6ROUTING_RX_MIXERS(QUINARY_TDM_RX_3) }; 66662306a36Sopenharmony_ci 66762306a36Sopenharmony_cistatic const struct snd_kcontrol_new quin_tdm_rx_4_mixer_controls[] = { 66862306a36Sopenharmony_ci Q6ROUTING_RX_MIXERS(QUINARY_TDM_RX_4) }; 66962306a36Sopenharmony_ci 67062306a36Sopenharmony_cistatic const struct snd_kcontrol_new quin_tdm_rx_5_mixer_controls[] = { 67162306a36Sopenharmony_ci Q6ROUTING_RX_MIXERS(QUINARY_TDM_RX_5) }; 67262306a36Sopenharmony_ci 67362306a36Sopenharmony_cistatic const struct snd_kcontrol_new quin_tdm_rx_6_mixer_controls[] = { 67462306a36Sopenharmony_ci Q6ROUTING_RX_MIXERS(QUINARY_TDM_RX_6) }; 67562306a36Sopenharmony_ci 67662306a36Sopenharmony_cistatic const struct snd_kcontrol_new quin_tdm_rx_7_mixer_controls[] = { 67762306a36Sopenharmony_ci Q6ROUTING_RX_MIXERS(QUINARY_TDM_RX_7) }; 67862306a36Sopenharmony_ci 67962306a36Sopenharmony_cistatic const struct snd_kcontrol_new wsa_codec_dma_rx_0_mixer_controls[] = { 68062306a36Sopenharmony_ci Q6ROUTING_RX_MIXERS(WSA_CODEC_DMA_RX_0) }; 68162306a36Sopenharmony_ci 68262306a36Sopenharmony_cistatic const struct snd_kcontrol_new wsa_codec_dma_rx_1_mixer_controls[] = { 68362306a36Sopenharmony_ci Q6ROUTING_RX_MIXERS(WSA_CODEC_DMA_RX_1) }; 68462306a36Sopenharmony_ci 68562306a36Sopenharmony_cistatic const struct snd_kcontrol_new rx_codec_dma_rx_0_mixer_controls[] = { 68662306a36Sopenharmony_ci Q6ROUTING_RX_MIXERS(RX_CODEC_DMA_RX_0) }; 68762306a36Sopenharmony_ci 68862306a36Sopenharmony_cistatic const struct snd_kcontrol_new rx_codec_dma_rx_1_mixer_controls[] = { 68962306a36Sopenharmony_ci Q6ROUTING_RX_MIXERS(RX_CODEC_DMA_RX_1) }; 69062306a36Sopenharmony_ci 69162306a36Sopenharmony_cistatic const struct snd_kcontrol_new rx_codec_dma_rx_2_mixer_controls[] = { 69262306a36Sopenharmony_ci Q6ROUTING_RX_MIXERS(RX_CODEC_DMA_RX_2) }; 69362306a36Sopenharmony_ci 69462306a36Sopenharmony_cistatic const struct snd_kcontrol_new rx_codec_dma_rx_3_mixer_controls[] = { 69562306a36Sopenharmony_ci Q6ROUTING_RX_MIXERS(RX_CODEC_DMA_RX_3) }; 69662306a36Sopenharmony_ci 69762306a36Sopenharmony_cistatic const struct snd_kcontrol_new rx_codec_dma_rx_4_mixer_controls[] = { 69862306a36Sopenharmony_ci Q6ROUTING_RX_MIXERS(RX_CODEC_DMA_RX_4) }; 69962306a36Sopenharmony_ci 70062306a36Sopenharmony_cistatic const struct snd_kcontrol_new rx_codec_dma_rx_5_mixer_controls[] = { 70162306a36Sopenharmony_ci Q6ROUTING_RX_MIXERS(RX_CODEC_DMA_RX_5) }; 70262306a36Sopenharmony_ci 70362306a36Sopenharmony_cistatic const struct snd_kcontrol_new rxcodec_dma_rx_6_mixer_controls[] = { 70462306a36Sopenharmony_ci Q6ROUTING_RX_MIXERS(RX_CODEC_DMA_RX_6) }; 70562306a36Sopenharmony_ci 70662306a36Sopenharmony_cistatic const struct snd_kcontrol_new rx_codec_dma_rx_7_mixer_controls[] = { 70762306a36Sopenharmony_ci Q6ROUTING_RX_MIXERS(RX_CODEC_DMA_RX_7) }; 70862306a36Sopenharmony_ci 70962306a36Sopenharmony_ci 71062306a36Sopenharmony_cistatic const struct snd_kcontrol_new mmul1_mixer_controls[] = { 71162306a36Sopenharmony_ci Q6ROUTING_TX_MIXERS(MSM_FRONTEND_DAI_MULTIMEDIA1) }; 71262306a36Sopenharmony_ci 71362306a36Sopenharmony_cistatic const struct snd_kcontrol_new mmul2_mixer_controls[] = { 71462306a36Sopenharmony_ci Q6ROUTING_TX_MIXERS(MSM_FRONTEND_DAI_MULTIMEDIA2) }; 71562306a36Sopenharmony_ci 71662306a36Sopenharmony_cistatic const struct snd_kcontrol_new mmul3_mixer_controls[] = { 71762306a36Sopenharmony_ci Q6ROUTING_TX_MIXERS(MSM_FRONTEND_DAI_MULTIMEDIA3) }; 71862306a36Sopenharmony_ci 71962306a36Sopenharmony_cistatic const struct snd_kcontrol_new mmul4_mixer_controls[] = { 72062306a36Sopenharmony_ci Q6ROUTING_TX_MIXERS(MSM_FRONTEND_DAI_MULTIMEDIA4) }; 72162306a36Sopenharmony_ci 72262306a36Sopenharmony_cistatic const struct snd_kcontrol_new mmul5_mixer_controls[] = { 72362306a36Sopenharmony_ci Q6ROUTING_TX_MIXERS(MSM_FRONTEND_DAI_MULTIMEDIA5) }; 72462306a36Sopenharmony_ci 72562306a36Sopenharmony_cistatic const struct snd_kcontrol_new mmul6_mixer_controls[] = { 72662306a36Sopenharmony_ci Q6ROUTING_TX_MIXERS(MSM_FRONTEND_DAI_MULTIMEDIA6) }; 72762306a36Sopenharmony_ci 72862306a36Sopenharmony_cistatic const struct snd_kcontrol_new mmul7_mixer_controls[] = { 72962306a36Sopenharmony_ci Q6ROUTING_TX_MIXERS(MSM_FRONTEND_DAI_MULTIMEDIA7) }; 73062306a36Sopenharmony_ci 73162306a36Sopenharmony_cistatic const struct snd_kcontrol_new mmul8_mixer_controls[] = { 73262306a36Sopenharmony_ci Q6ROUTING_TX_MIXERS(MSM_FRONTEND_DAI_MULTIMEDIA8) }; 73362306a36Sopenharmony_ci 73462306a36Sopenharmony_cistatic const struct snd_soc_dapm_widget msm_qdsp6_widgets[] = { 73562306a36Sopenharmony_ci /* Mixer definitions */ 73662306a36Sopenharmony_ci SND_SOC_DAPM_MIXER("HDMI Mixer", SND_SOC_NOPM, 0, 0, 73762306a36Sopenharmony_ci hdmi_mixer_controls, 73862306a36Sopenharmony_ci ARRAY_SIZE(hdmi_mixer_controls)), 73962306a36Sopenharmony_ci 74062306a36Sopenharmony_ci SND_SOC_DAPM_MIXER("DISPLAY_PORT_RX Audio Mixer", SND_SOC_NOPM, 0, 0, 74162306a36Sopenharmony_ci display_port_mixer_controls, 74262306a36Sopenharmony_ci ARRAY_SIZE(display_port_mixer_controls)), 74362306a36Sopenharmony_ci 74462306a36Sopenharmony_ci SND_SOC_DAPM_MIXER("SLIMBUS_0_RX Audio Mixer", SND_SOC_NOPM, 0, 0, 74562306a36Sopenharmony_ci slimbus_rx_mixer_controls, 74662306a36Sopenharmony_ci ARRAY_SIZE(slimbus_rx_mixer_controls)), 74762306a36Sopenharmony_ci SND_SOC_DAPM_MIXER("SLIMBUS_1_RX Audio Mixer", SND_SOC_NOPM, 0, 0, 74862306a36Sopenharmony_ci slimbus_1_rx_mixer_controls, 74962306a36Sopenharmony_ci ARRAY_SIZE(slimbus_1_rx_mixer_controls)), 75062306a36Sopenharmony_ci SND_SOC_DAPM_MIXER("SLIMBUS_2_RX Audio Mixer", SND_SOC_NOPM, 0, 0, 75162306a36Sopenharmony_ci slimbus_2_rx_mixer_controls, 75262306a36Sopenharmony_ci ARRAY_SIZE(slimbus_2_rx_mixer_controls)), 75362306a36Sopenharmony_ci SND_SOC_DAPM_MIXER("SLIMBUS_3_RX Audio Mixer", SND_SOC_NOPM, 0, 0, 75462306a36Sopenharmony_ci slimbus_3_rx_mixer_controls, 75562306a36Sopenharmony_ci ARRAY_SIZE(slimbus_3_rx_mixer_controls)), 75662306a36Sopenharmony_ci SND_SOC_DAPM_MIXER("SLIMBUS_4_RX Audio Mixer", SND_SOC_NOPM, 0, 0, 75762306a36Sopenharmony_ci slimbus_4_rx_mixer_controls, 75862306a36Sopenharmony_ci ARRAY_SIZE(slimbus_4_rx_mixer_controls)), 75962306a36Sopenharmony_ci SND_SOC_DAPM_MIXER("SLIMBUS_5_RX Audio Mixer", SND_SOC_NOPM, 0, 0, 76062306a36Sopenharmony_ci slimbus_5_rx_mixer_controls, 76162306a36Sopenharmony_ci ARRAY_SIZE(slimbus_5_rx_mixer_controls)), 76262306a36Sopenharmony_ci SND_SOC_DAPM_MIXER("SLIMBUS_6_RX Audio Mixer", SND_SOC_NOPM, 0, 0, 76362306a36Sopenharmony_ci slimbus_6_rx_mixer_controls, 76462306a36Sopenharmony_ci ARRAY_SIZE(slimbus_6_rx_mixer_controls)), 76562306a36Sopenharmony_ci SND_SOC_DAPM_MIXER("PRI_MI2S_RX Audio Mixer", SND_SOC_NOPM, 0, 0, 76662306a36Sopenharmony_ci primary_mi2s_rx_mixer_controls, 76762306a36Sopenharmony_ci ARRAY_SIZE(primary_mi2s_rx_mixer_controls)), 76862306a36Sopenharmony_ci SND_SOC_DAPM_MIXER("SEC_MI2S_RX Audio Mixer", SND_SOC_NOPM, 0, 0, 76962306a36Sopenharmony_ci secondary_mi2s_rx_mixer_controls, 77062306a36Sopenharmony_ci ARRAY_SIZE(secondary_mi2s_rx_mixer_controls)), 77162306a36Sopenharmony_ci SND_SOC_DAPM_MIXER("QUAT_MI2S_RX Audio Mixer", SND_SOC_NOPM, 0, 0, 77262306a36Sopenharmony_ci quaternary_mi2s_rx_mixer_controls, 77362306a36Sopenharmony_ci ARRAY_SIZE(quaternary_mi2s_rx_mixer_controls)), 77462306a36Sopenharmony_ci SND_SOC_DAPM_MIXER("QUIN_MI2S_RX Audio Mixer", SND_SOC_NOPM, 0, 0, 77562306a36Sopenharmony_ci quinary_mi2s_rx_mixer_controls, 77662306a36Sopenharmony_ci ARRAY_SIZE(quinary_mi2s_rx_mixer_controls)), 77762306a36Sopenharmony_ci SND_SOC_DAPM_MIXER("TERT_MI2S_RX Audio Mixer", SND_SOC_NOPM, 0, 0, 77862306a36Sopenharmony_ci tertiary_mi2s_rx_mixer_controls, 77962306a36Sopenharmony_ci ARRAY_SIZE(tertiary_mi2s_rx_mixer_controls)), 78062306a36Sopenharmony_ci SND_SOC_DAPM_MIXER("PRIMARY_TDM_RX_0 Audio Mixer", SND_SOC_NOPM, 0, 0, 78162306a36Sopenharmony_ci pri_tdm_rx_0_mixer_controls, 78262306a36Sopenharmony_ci ARRAY_SIZE(pri_tdm_rx_0_mixer_controls)), 78362306a36Sopenharmony_ci SND_SOC_DAPM_MIXER("PRIMARY_TDM_RX_1 Audio Mixer", SND_SOC_NOPM, 0, 0, 78462306a36Sopenharmony_ci pri_tdm_rx_1_mixer_controls, 78562306a36Sopenharmony_ci ARRAY_SIZE(pri_tdm_rx_1_mixer_controls)), 78662306a36Sopenharmony_ci SND_SOC_DAPM_MIXER("PRIMARY_TDM_RX_2 Audio Mixer", SND_SOC_NOPM, 0, 0, 78762306a36Sopenharmony_ci pri_tdm_rx_2_mixer_controls, 78862306a36Sopenharmony_ci ARRAY_SIZE(pri_tdm_rx_2_mixer_controls)), 78962306a36Sopenharmony_ci SND_SOC_DAPM_MIXER("PRIMARY_TDM_RX_3 Audio Mixer", SND_SOC_NOPM, 0, 0, 79062306a36Sopenharmony_ci pri_tdm_rx_3_mixer_controls, 79162306a36Sopenharmony_ci ARRAY_SIZE(pri_tdm_rx_3_mixer_controls)), 79262306a36Sopenharmony_ci SND_SOC_DAPM_MIXER("PRIMARY_TDM_RX_4 Audio Mixer", SND_SOC_NOPM, 0, 0, 79362306a36Sopenharmony_ci pri_tdm_rx_4_mixer_controls, 79462306a36Sopenharmony_ci ARRAY_SIZE(pri_tdm_rx_4_mixer_controls)), 79562306a36Sopenharmony_ci SND_SOC_DAPM_MIXER("PRIMARY_TDM_RX_5 Audio Mixer", SND_SOC_NOPM, 0, 0, 79662306a36Sopenharmony_ci pri_tdm_rx_5_mixer_controls, 79762306a36Sopenharmony_ci ARRAY_SIZE(pri_tdm_rx_5_mixer_controls)), 79862306a36Sopenharmony_ci SND_SOC_DAPM_MIXER("PRIMARY_TDM_RX_6 Audio Mixer", SND_SOC_NOPM, 0, 0, 79962306a36Sopenharmony_ci pri_tdm_rx_6_mixer_controls, 80062306a36Sopenharmony_ci ARRAY_SIZE(pri_tdm_rx_6_mixer_controls)), 80162306a36Sopenharmony_ci SND_SOC_DAPM_MIXER("PRIMARY_TDM_RX_7 Audio Mixer", SND_SOC_NOPM, 0, 0, 80262306a36Sopenharmony_ci pri_tdm_rx_7_mixer_controls, 80362306a36Sopenharmony_ci ARRAY_SIZE(pri_tdm_rx_7_mixer_controls)), 80462306a36Sopenharmony_ci 80562306a36Sopenharmony_ci SND_SOC_DAPM_MIXER("SEC_TDM_RX_0 Audio Mixer", SND_SOC_NOPM, 0, 0, 80662306a36Sopenharmony_ci sec_tdm_rx_0_mixer_controls, 80762306a36Sopenharmony_ci ARRAY_SIZE(sec_tdm_rx_0_mixer_controls)), 80862306a36Sopenharmony_ci SND_SOC_DAPM_MIXER("SEC_TDM_RX_1 Audio Mixer", SND_SOC_NOPM, 0, 0, 80962306a36Sopenharmony_ci sec_tdm_rx_1_mixer_controls, 81062306a36Sopenharmony_ci ARRAY_SIZE(sec_tdm_rx_1_mixer_controls)), 81162306a36Sopenharmony_ci SND_SOC_DAPM_MIXER("SEC_TDM_RX_2 Audio Mixer", SND_SOC_NOPM, 0, 0, 81262306a36Sopenharmony_ci sec_tdm_rx_2_mixer_controls, 81362306a36Sopenharmony_ci ARRAY_SIZE(sec_tdm_rx_2_mixer_controls)), 81462306a36Sopenharmony_ci SND_SOC_DAPM_MIXER("SEC_TDM_RX_3 Audio Mixer", SND_SOC_NOPM, 0, 0, 81562306a36Sopenharmony_ci sec_tdm_rx_3_mixer_controls, 81662306a36Sopenharmony_ci ARRAY_SIZE(sec_tdm_rx_3_mixer_controls)), 81762306a36Sopenharmony_ci SND_SOC_DAPM_MIXER("SEC_TDM_RX_4 Audio Mixer", SND_SOC_NOPM, 0, 0, 81862306a36Sopenharmony_ci sec_tdm_rx_4_mixer_controls, 81962306a36Sopenharmony_ci ARRAY_SIZE(sec_tdm_rx_4_mixer_controls)), 82062306a36Sopenharmony_ci SND_SOC_DAPM_MIXER("SEC_TDM_RX_5 Audio Mixer", SND_SOC_NOPM, 0, 0, 82162306a36Sopenharmony_ci sec_tdm_rx_5_mixer_controls, 82262306a36Sopenharmony_ci ARRAY_SIZE(sec_tdm_rx_5_mixer_controls)), 82362306a36Sopenharmony_ci SND_SOC_DAPM_MIXER("SEC_TDM_RX_6 Audio Mixer", SND_SOC_NOPM, 0, 0, 82462306a36Sopenharmony_ci sec_tdm_rx_6_mixer_controls, 82562306a36Sopenharmony_ci ARRAY_SIZE(sec_tdm_rx_6_mixer_controls)), 82662306a36Sopenharmony_ci SND_SOC_DAPM_MIXER("SEC_TDM_RX_7 Audio Mixer", SND_SOC_NOPM, 0, 0, 82762306a36Sopenharmony_ci sec_tdm_rx_7_mixer_controls, 82862306a36Sopenharmony_ci ARRAY_SIZE(sec_tdm_rx_7_mixer_controls)), 82962306a36Sopenharmony_ci 83062306a36Sopenharmony_ci SND_SOC_DAPM_MIXER("TERT_TDM_RX_0 Audio Mixer", SND_SOC_NOPM, 0, 0, 83162306a36Sopenharmony_ci tert_tdm_rx_0_mixer_controls, 83262306a36Sopenharmony_ci ARRAY_SIZE(tert_tdm_rx_0_mixer_controls)), 83362306a36Sopenharmony_ci SND_SOC_DAPM_MIXER("TERT_TDM_RX_1 Audio Mixer", SND_SOC_NOPM, 0, 0, 83462306a36Sopenharmony_ci tert_tdm_rx_1_mixer_controls, 83562306a36Sopenharmony_ci ARRAY_SIZE(tert_tdm_rx_1_mixer_controls)), 83662306a36Sopenharmony_ci SND_SOC_DAPM_MIXER("TERT_TDM_RX_2 Audio Mixer", SND_SOC_NOPM, 0, 0, 83762306a36Sopenharmony_ci tert_tdm_rx_2_mixer_controls, 83862306a36Sopenharmony_ci ARRAY_SIZE(tert_tdm_rx_2_mixer_controls)), 83962306a36Sopenharmony_ci SND_SOC_DAPM_MIXER("TERT_TDM_RX_3 Audio Mixer", SND_SOC_NOPM, 0, 0, 84062306a36Sopenharmony_ci tert_tdm_rx_3_mixer_controls, 84162306a36Sopenharmony_ci ARRAY_SIZE(tert_tdm_rx_3_mixer_controls)), 84262306a36Sopenharmony_ci SND_SOC_DAPM_MIXER("TERT_TDM_RX_4 Audio Mixer", SND_SOC_NOPM, 0, 0, 84362306a36Sopenharmony_ci tert_tdm_rx_4_mixer_controls, 84462306a36Sopenharmony_ci ARRAY_SIZE(tert_tdm_rx_4_mixer_controls)), 84562306a36Sopenharmony_ci SND_SOC_DAPM_MIXER("TERT_TDM_RX_5 Audio Mixer", SND_SOC_NOPM, 0, 0, 84662306a36Sopenharmony_ci tert_tdm_rx_5_mixer_controls, 84762306a36Sopenharmony_ci ARRAY_SIZE(tert_tdm_rx_5_mixer_controls)), 84862306a36Sopenharmony_ci SND_SOC_DAPM_MIXER("TERT_TDM_RX_6 Audio Mixer", SND_SOC_NOPM, 0, 0, 84962306a36Sopenharmony_ci tert_tdm_rx_6_mixer_controls, 85062306a36Sopenharmony_ci ARRAY_SIZE(tert_tdm_rx_6_mixer_controls)), 85162306a36Sopenharmony_ci SND_SOC_DAPM_MIXER("TERT_TDM_RX_7 Audio Mixer", SND_SOC_NOPM, 0, 0, 85262306a36Sopenharmony_ci tert_tdm_rx_7_mixer_controls, 85362306a36Sopenharmony_ci ARRAY_SIZE(tert_tdm_rx_7_mixer_controls)), 85462306a36Sopenharmony_ci 85562306a36Sopenharmony_ci SND_SOC_DAPM_MIXER("QUAT_TDM_RX_0 Audio Mixer", SND_SOC_NOPM, 0, 0, 85662306a36Sopenharmony_ci quat_tdm_rx_0_mixer_controls, 85762306a36Sopenharmony_ci ARRAY_SIZE(quat_tdm_rx_0_mixer_controls)), 85862306a36Sopenharmony_ci SND_SOC_DAPM_MIXER("QUAT_TDM_RX_1 Audio Mixer", SND_SOC_NOPM, 0, 0, 85962306a36Sopenharmony_ci quat_tdm_rx_1_mixer_controls, 86062306a36Sopenharmony_ci ARRAY_SIZE(quat_tdm_rx_1_mixer_controls)), 86162306a36Sopenharmony_ci SND_SOC_DAPM_MIXER("QUAT_TDM_RX_2 Audio Mixer", SND_SOC_NOPM, 0, 0, 86262306a36Sopenharmony_ci quat_tdm_rx_2_mixer_controls, 86362306a36Sopenharmony_ci ARRAY_SIZE(quat_tdm_rx_2_mixer_controls)), 86462306a36Sopenharmony_ci SND_SOC_DAPM_MIXER("QUAT_TDM_RX_3 Audio Mixer", SND_SOC_NOPM, 0, 0, 86562306a36Sopenharmony_ci quat_tdm_rx_3_mixer_controls, 86662306a36Sopenharmony_ci ARRAY_SIZE(quat_tdm_rx_3_mixer_controls)), 86762306a36Sopenharmony_ci SND_SOC_DAPM_MIXER("QUAT_TDM_RX_4 Audio Mixer", SND_SOC_NOPM, 0, 0, 86862306a36Sopenharmony_ci quat_tdm_rx_4_mixer_controls, 86962306a36Sopenharmony_ci ARRAY_SIZE(quat_tdm_rx_4_mixer_controls)), 87062306a36Sopenharmony_ci SND_SOC_DAPM_MIXER("QUAT_TDM_RX_5 Audio Mixer", SND_SOC_NOPM, 0, 0, 87162306a36Sopenharmony_ci quat_tdm_rx_5_mixer_controls, 87262306a36Sopenharmony_ci ARRAY_SIZE(quat_tdm_rx_5_mixer_controls)), 87362306a36Sopenharmony_ci SND_SOC_DAPM_MIXER("QUAT_TDM_RX_6 Audio Mixer", SND_SOC_NOPM, 0, 0, 87462306a36Sopenharmony_ci quat_tdm_rx_6_mixer_controls, 87562306a36Sopenharmony_ci ARRAY_SIZE(quat_tdm_rx_6_mixer_controls)), 87662306a36Sopenharmony_ci SND_SOC_DAPM_MIXER("QUAT_TDM_RX_7 Audio Mixer", SND_SOC_NOPM, 0, 0, 87762306a36Sopenharmony_ci quat_tdm_rx_7_mixer_controls, 87862306a36Sopenharmony_ci ARRAY_SIZE(quat_tdm_rx_7_mixer_controls)), 87962306a36Sopenharmony_ci 88062306a36Sopenharmony_ci SND_SOC_DAPM_MIXER("QUIN_TDM_RX_0 Audio Mixer", SND_SOC_NOPM, 0, 0, 88162306a36Sopenharmony_ci quin_tdm_rx_0_mixer_controls, 88262306a36Sopenharmony_ci ARRAY_SIZE(quin_tdm_rx_0_mixer_controls)), 88362306a36Sopenharmony_ci SND_SOC_DAPM_MIXER("QUIN_TDM_RX_1 Audio Mixer", SND_SOC_NOPM, 0, 0, 88462306a36Sopenharmony_ci quin_tdm_rx_1_mixer_controls, 88562306a36Sopenharmony_ci ARRAY_SIZE(quin_tdm_rx_1_mixer_controls)), 88662306a36Sopenharmony_ci SND_SOC_DAPM_MIXER("QUIN_TDM_RX_2 Audio Mixer", SND_SOC_NOPM, 0, 0, 88762306a36Sopenharmony_ci quin_tdm_rx_2_mixer_controls, 88862306a36Sopenharmony_ci ARRAY_SIZE(quin_tdm_rx_2_mixer_controls)), 88962306a36Sopenharmony_ci SND_SOC_DAPM_MIXER("QUIN_TDM_RX_3 Audio Mixer", SND_SOC_NOPM, 0, 0, 89062306a36Sopenharmony_ci quin_tdm_rx_3_mixer_controls, 89162306a36Sopenharmony_ci ARRAY_SIZE(quin_tdm_rx_3_mixer_controls)), 89262306a36Sopenharmony_ci SND_SOC_DAPM_MIXER("QUIN_TDM_RX_4 Audio Mixer", SND_SOC_NOPM, 0, 0, 89362306a36Sopenharmony_ci quin_tdm_rx_4_mixer_controls, 89462306a36Sopenharmony_ci ARRAY_SIZE(quin_tdm_rx_4_mixer_controls)), 89562306a36Sopenharmony_ci SND_SOC_DAPM_MIXER("QUIN_TDM_RX_5 Audio Mixer", SND_SOC_NOPM, 0, 0, 89662306a36Sopenharmony_ci quin_tdm_rx_5_mixer_controls, 89762306a36Sopenharmony_ci ARRAY_SIZE(quin_tdm_rx_5_mixer_controls)), 89862306a36Sopenharmony_ci SND_SOC_DAPM_MIXER("QUIN_TDM_RX_6 Audio Mixer", SND_SOC_NOPM, 0, 0, 89962306a36Sopenharmony_ci quin_tdm_rx_6_mixer_controls, 90062306a36Sopenharmony_ci ARRAY_SIZE(quin_tdm_rx_6_mixer_controls)), 90162306a36Sopenharmony_ci SND_SOC_DAPM_MIXER("QUIN_TDM_RX_7 Audio Mixer", SND_SOC_NOPM, 0, 0, 90262306a36Sopenharmony_ci quin_tdm_rx_7_mixer_controls, 90362306a36Sopenharmony_ci ARRAY_SIZE(quin_tdm_rx_7_mixer_controls)), 90462306a36Sopenharmony_ci 90562306a36Sopenharmony_ci SND_SOC_DAPM_MIXER("WSA_CODEC_DMA_RX_0 Audio Mixer", SND_SOC_NOPM, 0, 0, 90662306a36Sopenharmony_ci wsa_codec_dma_rx_0_mixer_controls, 90762306a36Sopenharmony_ci ARRAY_SIZE(wsa_codec_dma_rx_0_mixer_controls)), 90862306a36Sopenharmony_ci SND_SOC_DAPM_MIXER("WSA_CODEC_DMA_RX_1 Audio Mixer", SND_SOC_NOPM, 0, 0, 90962306a36Sopenharmony_ci wsa_codec_dma_rx_1_mixer_controls, 91062306a36Sopenharmony_ci ARRAY_SIZE(wsa_codec_dma_rx_1_mixer_controls)), 91162306a36Sopenharmony_ci SND_SOC_DAPM_MIXER("RX_CODEC_DMA_RX_0 Audio Mixer", SND_SOC_NOPM, 0, 0, 91262306a36Sopenharmony_ci rx_codec_dma_rx_0_mixer_controls, 91362306a36Sopenharmony_ci ARRAY_SIZE(rx_codec_dma_rx_0_mixer_controls)), 91462306a36Sopenharmony_ci SND_SOC_DAPM_MIXER("RX_CODEC_DMA_RX_1 Audio Mixer", SND_SOC_NOPM, 0, 0, 91562306a36Sopenharmony_ci rx_codec_dma_rx_1_mixer_controls, 91662306a36Sopenharmony_ci ARRAY_SIZE(rx_codec_dma_rx_1_mixer_controls)), 91762306a36Sopenharmony_ci SND_SOC_DAPM_MIXER("RX_CODEC_DMA_RX_2 Audio Mixer", SND_SOC_NOPM, 0, 0, 91862306a36Sopenharmony_ci rx_codec_dma_rx_2_mixer_controls, 91962306a36Sopenharmony_ci ARRAY_SIZE(rx_codec_dma_rx_2_mixer_controls)), 92062306a36Sopenharmony_ci SND_SOC_DAPM_MIXER("RX_CODEC_DMA_RX_3 Audio Mixer", SND_SOC_NOPM, 0, 0, 92162306a36Sopenharmony_ci rx_codec_dma_rx_3_mixer_controls, 92262306a36Sopenharmony_ci ARRAY_SIZE(rx_codec_dma_rx_3_mixer_controls)), 92362306a36Sopenharmony_ci SND_SOC_DAPM_MIXER("RX_CODEC_DMA_RX_4 Audio Mixer", SND_SOC_NOPM, 0, 0, 92462306a36Sopenharmony_ci rx_codec_dma_rx_4_mixer_controls, 92562306a36Sopenharmony_ci ARRAY_SIZE(rx_codec_dma_rx_4_mixer_controls)), 92662306a36Sopenharmony_ci SND_SOC_DAPM_MIXER("RX_CODEC_DMA_RX_5 Audio Mixer", SND_SOC_NOPM, 0, 0, 92762306a36Sopenharmony_ci rx_codec_dma_rx_5_mixer_controls, 92862306a36Sopenharmony_ci ARRAY_SIZE(rx_codec_dma_rx_5_mixer_controls)), 92962306a36Sopenharmony_ci SND_SOC_DAPM_MIXER("RX_CODEC_DMA_RX_6 Audio Mixer", SND_SOC_NOPM, 0, 0, 93062306a36Sopenharmony_ci rxcodec_dma_rx_6_mixer_controls, 93162306a36Sopenharmony_ci ARRAY_SIZE(rxcodec_dma_rx_6_mixer_controls)), 93262306a36Sopenharmony_ci SND_SOC_DAPM_MIXER("RX_CODEC_DMA_RX_7 Audio Mixer", SND_SOC_NOPM, 0, 0, 93362306a36Sopenharmony_ci rx_codec_dma_rx_7_mixer_controls, 93462306a36Sopenharmony_ci ARRAY_SIZE(rx_codec_dma_rx_7_mixer_controls)), 93562306a36Sopenharmony_ci SND_SOC_DAPM_MIXER("MultiMedia1 Mixer", SND_SOC_NOPM, 0, 0, 93662306a36Sopenharmony_ci mmul1_mixer_controls, ARRAY_SIZE(mmul1_mixer_controls)), 93762306a36Sopenharmony_ci SND_SOC_DAPM_MIXER("MultiMedia2 Mixer", SND_SOC_NOPM, 0, 0, 93862306a36Sopenharmony_ci mmul2_mixer_controls, ARRAY_SIZE(mmul2_mixer_controls)), 93962306a36Sopenharmony_ci SND_SOC_DAPM_MIXER("MultiMedia3 Mixer", SND_SOC_NOPM, 0, 0, 94062306a36Sopenharmony_ci mmul3_mixer_controls, ARRAY_SIZE(mmul3_mixer_controls)), 94162306a36Sopenharmony_ci SND_SOC_DAPM_MIXER("MultiMedia4 Mixer", SND_SOC_NOPM, 0, 0, 94262306a36Sopenharmony_ci mmul4_mixer_controls, ARRAY_SIZE(mmul4_mixer_controls)), 94362306a36Sopenharmony_ci SND_SOC_DAPM_MIXER("MultiMedia5 Mixer", SND_SOC_NOPM, 0, 0, 94462306a36Sopenharmony_ci mmul5_mixer_controls, ARRAY_SIZE(mmul5_mixer_controls)), 94562306a36Sopenharmony_ci SND_SOC_DAPM_MIXER("MultiMedia6 Mixer", SND_SOC_NOPM, 0, 0, 94662306a36Sopenharmony_ci mmul6_mixer_controls, ARRAY_SIZE(mmul6_mixer_controls)), 94762306a36Sopenharmony_ci SND_SOC_DAPM_MIXER("MultiMedia7 Mixer", SND_SOC_NOPM, 0, 0, 94862306a36Sopenharmony_ci mmul7_mixer_controls, ARRAY_SIZE(mmul7_mixer_controls)), 94962306a36Sopenharmony_ci SND_SOC_DAPM_MIXER("MultiMedia8 Mixer", SND_SOC_NOPM, 0, 0, 95062306a36Sopenharmony_ci mmul8_mixer_controls, ARRAY_SIZE(mmul8_mixer_controls)), 95162306a36Sopenharmony_ci 95262306a36Sopenharmony_ci}; 95362306a36Sopenharmony_ci 95462306a36Sopenharmony_cistatic const struct snd_soc_dapm_route intercon[] = { 95562306a36Sopenharmony_ci Q6ROUTING_RX_DAPM_ROUTE("HDMI Mixer", "HDMI_RX"), 95662306a36Sopenharmony_ci Q6ROUTING_RX_DAPM_ROUTE("DISPLAY_PORT_RX Audio Mixer", 95762306a36Sopenharmony_ci "DISPLAY_PORT_RX"), 95862306a36Sopenharmony_ci Q6ROUTING_RX_DAPM_ROUTE("SLIMBUS_0_RX Audio Mixer", "SLIMBUS_0_RX"), 95962306a36Sopenharmony_ci Q6ROUTING_RX_DAPM_ROUTE("SLIMBUS_1_RX Audio Mixer", "SLIMBUS_1_RX"), 96062306a36Sopenharmony_ci Q6ROUTING_RX_DAPM_ROUTE("SLIMBUS_2_RX Audio Mixer", "SLIMBUS_2_RX"), 96162306a36Sopenharmony_ci Q6ROUTING_RX_DAPM_ROUTE("SLIMBUS_3_RX Audio Mixer", "SLIMBUS_3_RX"), 96262306a36Sopenharmony_ci Q6ROUTING_RX_DAPM_ROUTE("SLIMBUS_4_RX Audio Mixer", "SLIMBUS_4_RX"), 96362306a36Sopenharmony_ci Q6ROUTING_RX_DAPM_ROUTE("SLIMBUS_5_RX Audio Mixer", "SLIMBUS_5_RX"), 96462306a36Sopenharmony_ci Q6ROUTING_RX_DAPM_ROUTE("SLIMBUS_6_RX Audio Mixer", "SLIMBUS_6_RX"), 96562306a36Sopenharmony_ci Q6ROUTING_RX_DAPM_ROUTE("QUAT_MI2S_RX Audio Mixer", "QUAT_MI2S_RX"), 96662306a36Sopenharmony_ci Q6ROUTING_RX_DAPM_ROUTE("QUIN_MI2S_RX Audio Mixer", "QUIN_MI2S_RX"), 96762306a36Sopenharmony_ci Q6ROUTING_RX_DAPM_ROUTE("TERT_MI2S_RX Audio Mixer", "TERT_MI2S_RX"), 96862306a36Sopenharmony_ci Q6ROUTING_RX_DAPM_ROUTE("SEC_MI2S_RX Audio Mixer", "SEC_MI2S_RX"), 96962306a36Sopenharmony_ci Q6ROUTING_RX_DAPM_ROUTE("PRI_MI2S_RX Audio Mixer", "PRI_MI2S_RX"), 97062306a36Sopenharmony_ci Q6ROUTING_RX_DAPM_ROUTE("PRIMARY_TDM_RX_0 Audio Mixer", 97162306a36Sopenharmony_ci "PRIMARY_TDM_RX_0"), 97262306a36Sopenharmony_ci Q6ROUTING_RX_DAPM_ROUTE("PRIMARY_TDM_RX_1 Audio Mixer", 97362306a36Sopenharmony_ci "PRIMARY_TDM_RX_1"), 97462306a36Sopenharmony_ci Q6ROUTING_RX_DAPM_ROUTE("PRIMARY_TDM_RX_2 Audio Mixer", 97562306a36Sopenharmony_ci "PRIMARY_TDM_RX_2"), 97662306a36Sopenharmony_ci Q6ROUTING_RX_DAPM_ROUTE("PRIMARY_TDM_RX_3 Audio Mixer", 97762306a36Sopenharmony_ci "PRIMARY_TDM_RX_3"), 97862306a36Sopenharmony_ci Q6ROUTING_RX_DAPM_ROUTE("PRIMARY_TDM_RX_4 Audio Mixer", 97962306a36Sopenharmony_ci "PRIMARY_TDM_RX_4"), 98062306a36Sopenharmony_ci Q6ROUTING_RX_DAPM_ROUTE("PRIMARY_TDM_RX_5 Audio Mixer", 98162306a36Sopenharmony_ci "PRIMARY_TDM_RX_5"), 98262306a36Sopenharmony_ci Q6ROUTING_RX_DAPM_ROUTE("PRIMARY_TDM_RX_6 Audio Mixer", 98362306a36Sopenharmony_ci "PRIMARY_TDM_RX_6"), 98462306a36Sopenharmony_ci Q6ROUTING_RX_DAPM_ROUTE("PRIMARY_TDM_RX_7 Audio Mixer", 98562306a36Sopenharmony_ci "PRIMARY_TDM_RX_7"), 98662306a36Sopenharmony_ci Q6ROUTING_RX_DAPM_ROUTE("SEC_TDM_RX_0 Audio Mixer", "SEC_TDM_RX_0"), 98762306a36Sopenharmony_ci Q6ROUTING_RX_DAPM_ROUTE("SEC_TDM_RX_1 Audio Mixer", "SEC_TDM_RX_1"), 98862306a36Sopenharmony_ci Q6ROUTING_RX_DAPM_ROUTE("SEC_TDM_RX_2 Audio Mixer", "SEC_TDM_RX_2"), 98962306a36Sopenharmony_ci Q6ROUTING_RX_DAPM_ROUTE("SEC_TDM_RX_3 Audio Mixer", "SEC_TDM_RX_3"), 99062306a36Sopenharmony_ci Q6ROUTING_RX_DAPM_ROUTE("SEC_TDM_RX_4 Audio Mixer", "SEC_TDM_RX_4"), 99162306a36Sopenharmony_ci Q6ROUTING_RX_DAPM_ROUTE("SEC_TDM_RX_5 Audio Mixer", "SEC_TDM_RX_5"), 99262306a36Sopenharmony_ci Q6ROUTING_RX_DAPM_ROUTE("SEC_TDM_RX_6 Audio Mixer", "SEC_TDM_RX_6"), 99362306a36Sopenharmony_ci Q6ROUTING_RX_DAPM_ROUTE("SEC_TDM_RX_7 Audio Mixer", "SEC_TDM_RX_7"), 99462306a36Sopenharmony_ci Q6ROUTING_RX_DAPM_ROUTE("TERT_TDM_RX_0 Audio Mixer", "TERT_TDM_RX_0"), 99562306a36Sopenharmony_ci Q6ROUTING_RX_DAPM_ROUTE("TERT_TDM_RX_1 Audio Mixer", "TERT_TDM_RX_1"), 99662306a36Sopenharmony_ci Q6ROUTING_RX_DAPM_ROUTE("TERT_TDM_RX_2 Audio Mixer", "TERT_TDM_RX_2"), 99762306a36Sopenharmony_ci Q6ROUTING_RX_DAPM_ROUTE("TERT_TDM_RX_3 Audio Mixer", "TERT_TDM_RX_3"), 99862306a36Sopenharmony_ci Q6ROUTING_RX_DAPM_ROUTE("TERT_TDM_RX_4 Audio Mixer", "TERT_TDM_RX_4"), 99962306a36Sopenharmony_ci Q6ROUTING_RX_DAPM_ROUTE("TERT_TDM_RX_5 Audio Mixer", "TERT_TDM_RX_5"), 100062306a36Sopenharmony_ci Q6ROUTING_RX_DAPM_ROUTE("TERT_TDM_RX_6 Audio Mixer", "TERT_TDM_RX_6"), 100162306a36Sopenharmony_ci Q6ROUTING_RX_DAPM_ROUTE("TERT_TDM_RX_7 Audio Mixer", "TERT_TDM_RX_7"), 100262306a36Sopenharmony_ci Q6ROUTING_RX_DAPM_ROUTE("QUAT_TDM_RX_0 Audio Mixer", "QUAT_TDM_RX_0"), 100362306a36Sopenharmony_ci Q6ROUTING_RX_DAPM_ROUTE("QUAT_TDM_RX_1 Audio Mixer", "QUAT_TDM_RX_1"), 100462306a36Sopenharmony_ci Q6ROUTING_RX_DAPM_ROUTE("QUAT_TDM_RX_2 Audio Mixer", "QUAT_TDM_RX_2"), 100562306a36Sopenharmony_ci Q6ROUTING_RX_DAPM_ROUTE("QUAT_TDM_RX_3 Audio Mixer", "QUAT_TDM_RX_3"), 100662306a36Sopenharmony_ci Q6ROUTING_RX_DAPM_ROUTE("QUAT_TDM_RX_4 Audio Mixer", "QUAT_TDM_RX_4"), 100762306a36Sopenharmony_ci Q6ROUTING_RX_DAPM_ROUTE("QUAT_TDM_RX_5 Audio Mixer", "QUAT_TDM_RX_5"), 100862306a36Sopenharmony_ci Q6ROUTING_RX_DAPM_ROUTE("QUAT_TDM_RX_6 Audio Mixer", "QUAT_TDM_RX_6"), 100962306a36Sopenharmony_ci Q6ROUTING_RX_DAPM_ROUTE("QUAT_TDM_RX_7 Audio Mixer", "QUAT_TDM_RX_7"), 101062306a36Sopenharmony_ci Q6ROUTING_RX_DAPM_ROUTE("QUIN_TDM_RX_0 Audio Mixer", "QUIN_TDM_RX_0"), 101162306a36Sopenharmony_ci Q6ROUTING_RX_DAPM_ROUTE("QUIN_TDM_RX_1 Audio Mixer", "QUIN_TDM_RX_1"), 101262306a36Sopenharmony_ci Q6ROUTING_RX_DAPM_ROUTE("QUIN_TDM_RX_2 Audio Mixer", "QUIN_TDM_RX_2"), 101362306a36Sopenharmony_ci Q6ROUTING_RX_DAPM_ROUTE("QUIN_TDM_RX_3 Audio Mixer", "QUIN_TDM_RX_3"), 101462306a36Sopenharmony_ci Q6ROUTING_RX_DAPM_ROUTE("QUIN_TDM_RX_4 Audio Mixer", "QUIN_TDM_RX_4"), 101562306a36Sopenharmony_ci Q6ROUTING_RX_DAPM_ROUTE("QUIN_TDM_RX_5 Audio Mixer", "QUIN_TDM_RX_5"), 101662306a36Sopenharmony_ci Q6ROUTING_RX_DAPM_ROUTE("QUIN_TDM_RX_6 Audio Mixer", "QUIN_TDM_RX_6"), 101762306a36Sopenharmony_ci Q6ROUTING_RX_DAPM_ROUTE("QUIN_TDM_RX_7 Audio Mixer", "QUIN_TDM_RX_7"), 101862306a36Sopenharmony_ci Q6ROUTING_RX_DAPM_ROUTE("WSA_CODEC_DMA_RX_0 Audio Mixer", "WSA_CODEC_DMA_RX_0"), 101962306a36Sopenharmony_ci Q6ROUTING_RX_DAPM_ROUTE("WSA_CODEC_DMA_RX_1 Audio Mixer", "WSA_CODEC_DMA_RX_1"), 102062306a36Sopenharmony_ci Q6ROUTING_RX_DAPM_ROUTE("RX_CODEC_DMA_RX_0 Audio Mixer", "RX_CODEC_DMA_RX_0"), 102162306a36Sopenharmony_ci Q6ROUTING_RX_DAPM_ROUTE("RX_CODEC_DMA_RX_1 Audio Mixer", "RX_CODEC_DMA_RX_1"), 102262306a36Sopenharmony_ci Q6ROUTING_RX_DAPM_ROUTE("RX_CODEC_DMA_RX_2 Audio Mixer", "RX_CODEC_DMA_RX_2"), 102362306a36Sopenharmony_ci Q6ROUTING_RX_DAPM_ROUTE("RX_CODEC_DMA_RX_3 Audio Mixer", "RX_CODEC_DMA_RX_3"), 102462306a36Sopenharmony_ci Q6ROUTING_RX_DAPM_ROUTE("RX_CODEC_DMA_RX_4 Audio Mixer", "RX_CODEC_DMA_RX_4"), 102562306a36Sopenharmony_ci Q6ROUTING_RX_DAPM_ROUTE("RX_CODEC_DMA_RX_5 Audio Mixer", "RX_CODEC_DMA_RX_5"), 102662306a36Sopenharmony_ci Q6ROUTING_RX_DAPM_ROUTE("RX_CODEC_DMA_RX_6 Audio Mixer", "RX_CODEC_DMA_RX_6"), 102762306a36Sopenharmony_ci Q6ROUTING_RX_DAPM_ROUTE("RX_CODEC_DMA_RX_7 Audio Mixer", "RX_CODEC_DMA_RX_7"), 102862306a36Sopenharmony_ci Q6ROUTING_TX_DAPM_ROUTE("MultiMedia1 Mixer"), 102962306a36Sopenharmony_ci Q6ROUTING_TX_DAPM_ROUTE("MultiMedia2 Mixer"), 103062306a36Sopenharmony_ci Q6ROUTING_TX_DAPM_ROUTE("MultiMedia3 Mixer"), 103162306a36Sopenharmony_ci Q6ROUTING_TX_DAPM_ROUTE("MultiMedia4 Mixer"), 103262306a36Sopenharmony_ci Q6ROUTING_TX_DAPM_ROUTE("MultiMedia5 Mixer"), 103362306a36Sopenharmony_ci Q6ROUTING_TX_DAPM_ROUTE("MultiMedia6 Mixer"), 103462306a36Sopenharmony_ci Q6ROUTING_TX_DAPM_ROUTE("MultiMedia7 Mixer"), 103562306a36Sopenharmony_ci Q6ROUTING_TX_DAPM_ROUTE("MultiMedia8 Mixer"), 103662306a36Sopenharmony_ci 103762306a36Sopenharmony_ci {"MM_UL1", NULL, "MultiMedia1 Mixer"}, 103862306a36Sopenharmony_ci {"MM_UL2", NULL, "MultiMedia2 Mixer"}, 103962306a36Sopenharmony_ci {"MM_UL3", NULL, "MultiMedia3 Mixer"}, 104062306a36Sopenharmony_ci {"MM_UL4", NULL, "MultiMedia4 Mixer"}, 104162306a36Sopenharmony_ci {"MM_UL5", NULL, "MultiMedia5 Mixer"}, 104262306a36Sopenharmony_ci {"MM_UL6", NULL, "MultiMedia6 Mixer"}, 104362306a36Sopenharmony_ci {"MM_UL7", NULL, "MultiMedia7 Mixer"}, 104462306a36Sopenharmony_ci {"MM_UL8", NULL, "MultiMedia8 Mixer"}, 104562306a36Sopenharmony_ci}; 104662306a36Sopenharmony_ci 104762306a36Sopenharmony_cistatic int routing_hw_params(struct snd_soc_component *component, 104862306a36Sopenharmony_ci struct snd_pcm_substream *substream, 104962306a36Sopenharmony_ci struct snd_pcm_hw_params *params) 105062306a36Sopenharmony_ci{ 105162306a36Sopenharmony_ci struct snd_soc_pcm_runtime *rtd = snd_soc_substream_to_rtd(substream); 105262306a36Sopenharmony_ci struct msm_routing_data *data = dev_get_drvdata(component->dev); 105362306a36Sopenharmony_ci unsigned int be_id = snd_soc_rtd_to_cpu(rtd, 0)->id; 105462306a36Sopenharmony_ci struct session_data *session; 105562306a36Sopenharmony_ci int path_type; 105662306a36Sopenharmony_ci 105762306a36Sopenharmony_ci if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) 105862306a36Sopenharmony_ci path_type = ADM_PATH_PLAYBACK; 105962306a36Sopenharmony_ci else 106062306a36Sopenharmony_ci path_type = ADM_PATH_LIVE_REC; 106162306a36Sopenharmony_ci 106262306a36Sopenharmony_ci if (be_id >= AFE_MAX_PORTS) 106362306a36Sopenharmony_ci return -EINVAL; 106462306a36Sopenharmony_ci 106562306a36Sopenharmony_ci session = &data->port_data[be_id]; 106662306a36Sopenharmony_ci 106762306a36Sopenharmony_ci mutex_lock(&data->lock); 106862306a36Sopenharmony_ci 106962306a36Sopenharmony_ci session->path_type = path_type; 107062306a36Sopenharmony_ci session->sample_rate = params_rate(params); 107162306a36Sopenharmony_ci session->channels = params_channels(params); 107262306a36Sopenharmony_ci 107362306a36Sopenharmony_ci switch (params_format(params)) { 107462306a36Sopenharmony_ci case SNDRV_PCM_FORMAT_S16_LE: 107562306a36Sopenharmony_ci session->bits_per_sample = 16; 107662306a36Sopenharmony_ci break; 107762306a36Sopenharmony_ci case SNDRV_PCM_FORMAT_S24_LE: 107862306a36Sopenharmony_ci session->bits_per_sample = 24; 107962306a36Sopenharmony_ci break; 108062306a36Sopenharmony_ci default: 108162306a36Sopenharmony_ci break; 108262306a36Sopenharmony_ci } 108362306a36Sopenharmony_ci 108462306a36Sopenharmony_ci mutex_unlock(&data->lock); 108562306a36Sopenharmony_ci return 0; 108662306a36Sopenharmony_ci} 108762306a36Sopenharmony_ci 108862306a36Sopenharmony_cistatic int msm_routing_probe(struct snd_soc_component *c) 108962306a36Sopenharmony_ci{ 109062306a36Sopenharmony_ci int i; 109162306a36Sopenharmony_ci 109262306a36Sopenharmony_ci for (i = 0; i < MAX_SESSIONS; i++) { 109362306a36Sopenharmony_ci routing_data->sessions[i].port_id = -1; 109462306a36Sopenharmony_ci routing_data->sessions[i].fedai_id = -1; 109562306a36Sopenharmony_ci } 109662306a36Sopenharmony_ci 109762306a36Sopenharmony_ci return 0; 109862306a36Sopenharmony_ci} 109962306a36Sopenharmony_ci 110062306a36Sopenharmony_cistatic unsigned int q6routing_reg_read(struct snd_soc_component *component, 110162306a36Sopenharmony_ci unsigned int reg) 110262306a36Sopenharmony_ci{ 110362306a36Sopenharmony_ci /* default value */ 110462306a36Sopenharmony_ci return 0; 110562306a36Sopenharmony_ci} 110662306a36Sopenharmony_ci 110762306a36Sopenharmony_cistatic int q6routing_reg_write(struct snd_soc_component *component, 110862306a36Sopenharmony_ci unsigned int reg, unsigned int val) 110962306a36Sopenharmony_ci{ 111062306a36Sopenharmony_ci /* dummy */ 111162306a36Sopenharmony_ci return 0; 111262306a36Sopenharmony_ci} 111362306a36Sopenharmony_ci 111462306a36Sopenharmony_cistatic const struct snd_soc_component_driver msm_soc_routing_component = { 111562306a36Sopenharmony_ci .probe = msm_routing_probe, 111662306a36Sopenharmony_ci .name = DRV_NAME, 111762306a36Sopenharmony_ci .hw_params = routing_hw_params, 111862306a36Sopenharmony_ci .dapm_widgets = msm_qdsp6_widgets, 111962306a36Sopenharmony_ci .num_dapm_widgets = ARRAY_SIZE(msm_qdsp6_widgets), 112062306a36Sopenharmony_ci .dapm_routes = intercon, 112162306a36Sopenharmony_ci .num_dapm_routes = ARRAY_SIZE(intercon), 112262306a36Sopenharmony_ci .read = q6routing_reg_read, 112362306a36Sopenharmony_ci .write = q6routing_reg_write, 112462306a36Sopenharmony_ci}; 112562306a36Sopenharmony_ci 112662306a36Sopenharmony_cistatic int q6pcm_routing_probe(struct platform_device *pdev) 112762306a36Sopenharmony_ci{ 112862306a36Sopenharmony_ci struct device *dev = &pdev->dev; 112962306a36Sopenharmony_ci 113062306a36Sopenharmony_ci routing_data = kzalloc(sizeof(*routing_data), GFP_KERNEL); 113162306a36Sopenharmony_ci if (!routing_data) 113262306a36Sopenharmony_ci return -ENOMEM; 113362306a36Sopenharmony_ci 113462306a36Sopenharmony_ci routing_data->dev = dev; 113562306a36Sopenharmony_ci 113662306a36Sopenharmony_ci mutex_init(&routing_data->lock); 113762306a36Sopenharmony_ci dev_set_drvdata(dev, routing_data); 113862306a36Sopenharmony_ci 113962306a36Sopenharmony_ci return devm_snd_soc_register_component(dev, &msm_soc_routing_component, 114062306a36Sopenharmony_ci NULL, 0); 114162306a36Sopenharmony_ci} 114262306a36Sopenharmony_ci 114362306a36Sopenharmony_cistatic void q6pcm_routing_remove(struct platform_device *pdev) 114462306a36Sopenharmony_ci{ 114562306a36Sopenharmony_ci kfree(routing_data); 114662306a36Sopenharmony_ci routing_data = NULL; 114762306a36Sopenharmony_ci} 114862306a36Sopenharmony_ci 114962306a36Sopenharmony_ci#ifdef CONFIG_OF 115062306a36Sopenharmony_cistatic const struct of_device_id q6pcm_routing_device_id[] = { 115162306a36Sopenharmony_ci { .compatible = "qcom,q6adm-routing" }, 115262306a36Sopenharmony_ci {}, 115362306a36Sopenharmony_ci}; 115462306a36Sopenharmony_ciMODULE_DEVICE_TABLE(of, q6pcm_routing_device_id); 115562306a36Sopenharmony_ci#endif 115662306a36Sopenharmony_ci 115762306a36Sopenharmony_cistatic struct platform_driver q6pcm_routing_platform_driver = { 115862306a36Sopenharmony_ci .driver = { 115962306a36Sopenharmony_ci .name = "q6routing", 116062306a36Sopenharmony_ci .of_match_table = of_match_ptr(q6pcm_routing_device_id), 116162306a36Sopenharmony_ci }, 116262306a36Sopenharmony_ci .probe = q6pcm_routing_probe, 116362306a36Sopenharmony_ci .remove_new = q6pcm_routing_remove, 116462306a36Sopenharmony_ci}; 116562306a36Sopenharmony_cimodule_platform_driver(q6pcm_routing_platform_driver); 116662306a36Sopenharmony_ci 116762306a36Sopenharmony_ciMODULE_DESCRIPTION("Q6 Routing platform"); 116862306a36Sopenharmony_ciMODULE_LICENSE("GPL v2"); 1169