diff --git a/asoc/Kbuild b/asoc/Kbuild index 9c47bbc880..5796bdc8bc 100644 --- a/asoc/Kbuild +++ b/asoc/Kbuild @@ -150,46 +150,14 @@ ifdef CONFIG_SND_SOC_SA8155 MACHINE_OBJS += sa8155.o endif -ifdef CONFIG_SND_SOC_CPE - CPE_LSM_OBJS += msm-cpe-lsm.o -endif - ifdef CONFIG_SND_SOC_QDSP6V2 - PLATFORM_OBJS += msm-audio-effects-q6-v2.o - PLATFORM_OBJS += msm-compress-q6-v2.o - PLATFORM_OBJS += msm-dai-fe.o PLATFORM_OBJS += msm-dai-q6-hdmi-v2.o PLATFORM_OBJS += msm-dai-q6-v2.o - PLATFORM_OBJS += msm-dai-stub-v2.o - PLATFORM_OBJS += msm-lsm-client.o - PLATFORM_OBJS += msm-pcm-afe-v2.o - PLATFORM_OBJS += msm-pcm-dtmf-v2.o - PLATFORM_OBJS += msm-pcm-hostless.o - PLATFORM_OBJS += msm-pcm-host-voice-v2.o - PLATFORM_OBJS += msm-pcm-loopback-v2.o - PLATFORM_OBJS += msm-pcm-q6-noirq.o - PLATFORM_OBJS += msm-pcm-q6-v2.o - PLATFORM_OBJS += msm-pcm-routing-v2.o - PLATFORM_OBJS += msm-pcm-voice-v2.o - PLATFORM_OBJS += msm-pcm-voip-v2.o - PLATFORM_OBJS += msm-transcode-loopback-q6-v2.o PLATFORM_OBJS += platform_init.o endif ifdef CONFIG_WCD9XXX_CODEC_CORE PLATFORM_OBJS += msm-dai-slim.o endif -ifdef CONFIG_DOLBY_DS2 - PLATFORM_OBJS += msm-ds2-dap-config.o -endif -ifdef CONFIG_DOLBY_LICENSE - PLATFORM_OBJS += msm-ds2-dap-config.o -endif -ifdef CONFIG_SND_HWDEP_ROUTING - PLATFORM_OBJS += msm-pcm-routing-devdep.o -endif -ifdef CONFIG_QTI_PP - PLATFORM_OBJS += msm-qti-pp-config.o -endif LINUX_INC += -Iinclude/linux @@ -263,8 +231,5 @@ machine_dlkm-y := $(MACHINE_OBJS) obj-$(CONFIG_SND_SOC_SA8155) += machine_dlkm.o machine_dlkm-y := $(MACHINE_OBJS) -obj-$(CONFIG_SND_SOC_CPE) += cpe_lsm_dlkm.o -cpe_lsm_dlkm-y := $(CPE_LSM_OBJS) - # inject some build related information DEFINES += -DBUILD_TIMESTAMP=\"$(shell date -u +'%Y-%m-%dT%H:%M:%SZ')\" diff --git a/asoc/codecs/audio-ext-clk-up.c b/asoc/codecs/audio-ext-clk-up.c index d724850053..60cc971fab 100644 --- a/asoc/codecs/audio-ext-clk-up.c +++ b/asoc/codecs/audio-ext-clk-up.c @@ -1,5 +1,5 @@ // SPDX-License-Identifier: GPL-2.0-only -/* Copyright (c) 2015-2019, The Linux Foundation. All rights reserved. +/* Copyright (c) 2015-2020, The Linux Foundation. All rights reserved. */ #include @@ -13,10 +13,13 @@ #include "../../../drivers/clk/qcom/common.h" #include #include +#include #include -#include +#ifdef CONFIG_AUDIO_PRM +#include +#else #include "audio-ext-clk-up.h" - +#endif enum { AUDIO_EXT_CLK_PMI, AUDIO_EXT_CLK_LNBB2, @@ -51,6 +54,9 @@ struct audio_ext_clk_priv { struct device *dev; int clk_src; struct afe_clk_set clk_cfg; +#ifdef CONFIG_AUDIO_PRM + struct clk_cfg prm_clk_cfg; +#endif struct audio_ext_clk audio_clk; const char *clk_name; uint32_t lpass_core_hwvote_client_handle; @@ -69,16 +75,19 @@ static int audio_ext_clk_prepare(struct clk_hw *hw) int ret; if ((clk_priv->clk_src >= AUDIO_EXT_CLK_LPASS) && - (clk_priv->clk_src < AUDIO_EXT_CLK_LPASS_MAX)) { - clk_priv->clk_cfg.enable = 1; - trace_printk("%s: vote for %d clock\n", - __func__, clk_priv->clk_src); + (clk_priv->clk_src < AUDIO_EXT_CLK_LPASS_MAX) && !clk_priv->clk_cfg.enable) { +#ifdef CONFIG_AUDIO_PRM + pr_debug("%s: clk_id %d ",__func__, clk_priv->prm_clk_cfg.clk_id); + ret = audio_prm_set_lpass_clk_cfg(&clk_priv->prm_clk_cfg,1); +#else ret = afe_set_lpass_clk_cfg(IDX_RSVD_3, &clk_priv->clk_cfg); +#endif if (ret < 0) { pr_err_ratelimited("%s afe_set_digital_codec_core_clock failed\n", __func__); return ret; } + clk_priv->clk_cfg.enable = 1; } if (pnctrl_info->pinctrl) { @@ -115,9 +124,13 @@ static void audio_ext_clk_unprepare(struct clk_hw *hw) if ((clk_priv->clk_src >= AUDIO_EXT_CLK_LPASS) && (clk_priv->clk_src < AUDIO_EXT_CLK_LPASS_MAX)) { clk_priv->clk_cfg.enable = 0; - trace_printk("%s: unvote for %d clock\n", - __func__, clk_priv->clk_src); +#ifdef CONFIG_AUDIO_PRM + pr_debug("%s: clk_id %d",__func__, + clk_priv->prm_clk_cfg.clk_id); + ret = audio_prm_set_lpass_clk_cfg(&clk_priv->prm_clk_cfg,0); +#else ret = afe_set_lpass_clk_cfg(IDX_RSVD_3, &clk_priv->clk_cfg); +#endif if (ret < 0) pr_err_ratelimited("%s: afe_set_lpass_clk_cfg failed, ret = %d\n", __func__, ret); @@ -147,6 +160,7 @@ static u8 audio_ext_clk_get_parent(struct clk_hw *hw) static int lpass_hw_vote_prepare(struct clk_hw *hw) { +#if 0 struct audio_ext_clk_priv *clk_priv = to_audio_clk(hw); int ret; @@ -175,12 +189,13 @@ static int lpass_hw_vote_prepare(struct clk_hw *hw) return ret; } } - +#endif return 0; } static void lpass_hw_vote_unprepare(struct clk_hw *hw) { +#if 0 struct audio_ext_clk_priv *clk_priv = to_audio_clk(hw); int ret = 0; @@ -207,6 +222,7 @@ static void lpass_hw_vote_unprepare(struct clk_hw *hw) __func__, ret); } } +#endif } static const struct clk_ops audio_ext_clk_ops = { @@ -542,19 +558,38 @@ static int audio_ref_clk_probe(struct platform_device *pdev) clk_priv->clk_cfg.clk_freq_in_hz = Q6AFE_LPASS_OSR_CLK_9_P600_MHZ; clk_priv->clk_cfg.clk_attri = Q6AFE_LPASS_CLK_ATTRIBUTE_COUPLE_NO; +#ifdef CONFIG_AUDIO_PRM + /* Init prm clk cfg default values */ + clk_priv->prm_clk_cfg.clk_id = Q6AFE_LPASS_CLK_ID_SPEAKER_I2S_OSR; + clk_priv->prm_clk_cfg.clk_freq_in_hz = Q6AFE_LPASS_OSR_CLK_9_P600_MHZ; + clk_priv->prm_clk_cfg.clk_attri = Q6AFE_LPASS_CLK_ATTRIBUTE_COUPLE_NO; + clk_priv->prm_clk_cfg.clk_root = 0; +#endif + ret = of_property_read_u32(pdev->dev.of_node, "qcom,codec-lpass-ext-clk-freq", &clk_freq); - if (!ret) + if (!ret) { clk_priv->clk_cfg.clk_freq_in_hz = clk_freq; +#ifdef CONFIG_AUDIO_PRM + clk_priv->prm_clk_cfg.clk_freq_in_hz = clk_freq; +#endif + } ret = of_property_read_u32(pdev->dev.of_node, "qcom,codec-lpass-clk-id", &clk_id); - if (!ret) + if (!ret) { clk_priv->clk_cfg.clk_id = clk_id; +#ifdef CONFIG_AUDIO_PRM + clk_priv->prm_clk_cfg.clk_id = clk_id; + dev_info(&pdev->dev, "%s: ext-clk freq: %d, lpass clk_id: %d, clk_src: %d\n", + __func__, clk_priv->prm_clk_cfg.clk_freq_in_hz, + clk_priv->prm_clk_cfg.clk_id, clk_priv->clk_src); +#endif + } - dev_dbg(&pdev->dev, "%s: ext-clk freq: %d, lpass clk_id: %d, clk_src: %d\n", + dev_info(&pdev->dev, "%s: ext-clk freq: %d, lpass clk_id: %d, clk_src: %d\n", __func__, clk_priv->clk_cfg.clk_freq_in_hz, clk_priv->clk_cfg.clk_id, clk_priv->clk_src); platform_set_drvdata(pdev, clk_priv); diff --git a/asoc/msm-audio-defs-v2.h b/asoc/msm-audio-defs-v2.h new file mode 100644 index 0000000000..ab1f6f5ed5 --- /dev/null +++ b/asoc/msm-audio-defs-v2.h @@ -0,0 +1,502 @@ +/* SPDX-License-Identifier: GPL-2.0-only */ +/* Copyright (c) 2012-2020, The Linux Foundation. All rights reserved. + */ +#ifndef _MSM_AUDIO_DEFS_V2_H +#define _MSM_AUDIO_DEFS_V2_H + +/* + * These names are used by HAL to specify the BE. If any changes are + * made to the string names or the max name length corresponding + * changes need to be made in the HAL to ensure they still match. + */ +#define LPASS_BE_NAME_MAX_LENGTH 24 +#define LPASS_BE_PRI_I2S_RX "PRIMARY_I2S_RX" +#define LPASS_BE_PRI_I2S_TX "PRIMARY_I2S_TX" +#define LPASS_BE_SLIMBUS_0_RX "SLIMBUS_0_RX" +#define LPASS_BE_SLIMBUS_0_TX "SLIMBUS_0_TX" +#define LPASS_BE_HDMI "HDMI" +#define LPASS_BE_DISPLAY_PORT "DISPLAY_PORT" +#define LPASS_BE_DISPLAY_PORT1 "DISPLAY_PORT1" +#define LPASS_BE_INT_BT_SCO_RX "INT_BT_SCO_RX" +#define LPASS_BE_INT_BT_SCO_TX "INT_BT_SCO_TX" +#define LPASS_BE_INT_BT_A2DP_RX "INT_BT_A2DP_RX" +#define LPASS_BE_INT_FM_RX "INT_FM_RX" +#define LPASS_BE_INT_FM_TX "INT_FM_TX" +#define LPASS_BE_AFE_PCM_RX "RT_PROXY_DAI_001_RX" +#define LPASS_BE_AFE_PCM_TX "RT_PROXY_DAI_002_TX" +#define LPASS_BE_AUXPCM_RX "AUX_PCM_RX" +#define LPASS_BE_AUXPCM_TX "AUX_PCM_TX" +#define LPASS_BE_SEC_AUXPCM_RX "SEC_AUX_PCM_RX" +#define LPASS_BE_SEC_AUXPCM_TX "SEC_AUX_PCM_TX" +#define LPASS_BE_TERT_AUXPCM_RX "TERT_AUX_PCM_RX" +#define LPASS_BE_TERT_AUXPCM_TX "TERT_AUX_PCM_TX" +#define LPASS_BE_QUAT_AUXPCM_RX "QUAT_AUX_PCM_RX" +#define LPASS_BE_QUAT_AUXPCM_TX "QUAT_AUX_PCM_TX" +#define LPASS_BE_QUIN_AUXPCM_RX "QUIN_AUX_PCM_RX" +#define LPASS_BE_QUIN_AUXPCM_TX "QUIN_AUX_PCM_TX" +#define LPASS_BE_SEN_AUXPCM_RX "SEN_AUX_PCM_RX" +#define LPASS_BE_SEN_AUXPCM_TX "SEN_AUX_PCM_TX" +#define LPASS_BE_VOICE_PLAYBACK_TX "VOICE_PLAYBACK_TX" +#define LPASS_BE_VOICE2_PLAYBACK_TX "VOICE2_PLAYBACK_TX" +#define LPASS_BE_INCALL_RECORD_RX "INCALL_RECORD_RX" +#define LPASS_BE_INCALL_RECORD_TX "INCALL_RECORD_TX" +#define LPASS_BE_SEC_I2S_RX "SECONDARY_I2S_RX" +#define LPASS_BE_PRI_SPDIF_RX "PRI_SPDIF_RX" +#define LPASS_BE_PRI_SPDIF_TX "PRI_SPDIF_TX" +#define LPASS_BE_SEC_SPDIF_RX "SEC_SPDIF_RX" +#define LPASS_BE_SEC_SPDIF_TX "SEC_SPDIF_TX" + +#define LPASS_BE_MI2S_RX "MI2S_RX" +#define LPASS_BE_MI2S_TX "MI2S_TX" +#define LPASS_BE_QUAT_MI2S_RX "QUAT_MI2S_RX" +#define LPASS_BE_QUAT_MI2S_TX "QUAT_MI2S_TX" +#define LPASS_BE_SEC_MI2S_RX "SEC_MI2S_RX" +#define LPASS_BE_SEC_MI2S_RX_SD1 "SEC_MI2S_RX_SD1" +#define LPASS_BE_SEC_MI2S_TX "SEC_MI2S_TX" +#define LPASS_BE_PRI_MI2S_RX "PRI_MI2S_RX" +#define LPASS_BE_PRI_MI2S_TX "PRI_MI2S_TX" +#define LPASS_BE_TERT_MI2S_RX "TERT_MI2S_RX" +#define LPASS_BE_TERT_MI2S_TX "TERT_MI2S_TX" +#define LPASS_BE_AUDIO_I2S_RX "AUDIO_I2S_RX" +#define LPASS_BE_STUB_RX "STUB_RX" +#define LPASS_BE_STUB_TX "STUB_TX" +#define LPASS_BE_SLIMBUS_1_RX "SLIMBUS_1_RX" +#define LPASS_BE_SLIMBUS_1_TX "SLIMBUS_1_TX" +#define LPASS_BE_STUB_1_TX "STUB_1_TX" +#define LPASS_BE_SLIMBUS_2_RX "SLIMBUS_2_RX" +#define LPASS_BE_SLIMBUS_2_TX "SLIMBUS_2_TX" +#define LPASS_BE_SLIMBUS_3_RX "SLIMBUS_3_RX" +#define LPASS_BE_SLIMBUS_3_TX "SLIMBUS_3_TX" +#define LPASS_BE_SLIMBUS_4_RX "SLIMBUS_4_RX" +#define LPASS_BE_SLIMBUS_4_TX "SLIMBUS_4_TX" +#define LPASS_BE_SLIMBUS_TX_VI "SLIMBUS_TX_VI" +#define LPASS_BE_SLIMBUS_5_RX "SLIMBUS_5_RX" +#define LPASS_BE_SLIMBUS_5_TX "SLIMBUS_5_TX" +#define LPASS_BE_SLIMBUS_6_RX "SLIMBUS_6_RX" +#define LPASS_BE_SLIMBUS_6_TX "SLIMBUS_6_TX" +#define LPASS_BE_QUIN_MI2S_RX "QUIN_MI2S_RX" +#define LPASS_BE_QUIN_MI2S_TX "QUIN_MI2S_TX" +#define LPASS_BE_SENARY_MI2S_TX "SENARY_MI2S_TX" +#define LPASS_BE_SENARY_MI2S_RX "SENARY_MI2S_RX" + +#define LPASS_BE_PRI_META_MI2S_RX "PRI_META_MI2S_RX" +#define LPASS_BE_SEC_META_MI2S_RX "SEC_META_MI2S_RX" + +#define LPASS_BE_PRI_TDM_RX_0 "PRI_TDM_RX_0" +#define LPASS_BE_PRI_TDM_TX_0 "PRI_TDM_TX_0" +#define LPASS_BE_PRI_TDM_RX_1 "PRI_TDM_RX_1" +#define LPASS_BE_PRI_TDM_TX_1 "PRI_TDM_TX_1" +#define LPASS_BE_PRI_TDM_RX_2 "PRI_TDM_RX_2" +#define LPASS_BE_PRI_TDM_TX_2 "PRI_TDM_TX_2" +#define LPASS_BE_PRI_TDM_RX_3 "PRI_TDM_RX_3" +#define LPASS_BE_PRI_TDM_TX_3 "PRI_TDM_TX_3" +#define LPASS_BE_PRI_TDM_RX_4 "PRI_TDM_RX_4" +#define LPASS_BE_PRI_TDM_TX_4 "PRI_TDM_TX_4" +#define LPASS_BE_PRI_TDM_RX_5 "PRI_TDM_RX_5" +#define LPASS_BE_PRI_TDM_TX_5 "PRI_TDM_TX_5" +#define LPASS_BE_PRI_TDM_RX_6 "PRI_TDM_RX_6" +#define LPASS_BE_PRI_TDM_TX_6 "PRI_TDM_TX_6" +#define LPASS_BE_PRI_TDM_RX_7 "PRI_TDM_RX_7" +#define LPASS_BE_PRI_TDM_TX_7 "PRI_TDM_TX_7" +#define LPASS_BE_SEC_TDM_RX_0 "SEC_TDM_RX_0" +#define LPASS_BE_SEC_TDM_TX_0 "SEC_TDM_TX_0" +#define LPASS_BE_SEC_TDM_RX_1 "SEC_TDM_RX_1" +#define LPASS_BE_SEC_TDM_TX_1 "SEC_TDM_TX_1" +#define LPASS_BE_SEC_TDM_RX_2 "SEC_TDM_RX_2" +#define LPASS_BE_SEC_TDM_TX_2 "SEC_TDM_TX_2" +#define LPASS_BE_SEC_TDM_RX_3 "SEC_TDM_RX_3" +#define LPASS_BE_SEC_TDM_TX_3 "SEC_TDM_TX_3" +#define LPASS_BE_SEC_TDM_RX_4 "SEC_TDM_RX_4" +#define LPASS_BE_SEC_TDM_TX_4 "SEC_TDM_TX_4" +#define LPASS_BE_SEC_TDM_RX_5 "SEC_TDM_RX_5" +#define LPASS_BE_SEC_TDM_TX_5 "SEC_TDM_TX_5" +#define LPASS_BE_SEC_TDM_RX_6 "SEC_TDM_RX_6" +#define LPASS_BE_SEC_TDM_TX_6 "SEC_TDM_TX_6" +#define LPASS_BE_SEC_TDM_RX_7 "SEC_TDM_RX_7" +#define LPASS_BE_SEC_TDM_TX_7 "SEC_TDM_TX_7" +#define LPASS_BE_TERT_TDM_RX_0 "TERT_TDM_RX_0" +#define LPASS_BE_TERT_TDM_TX_0 "TERT_TDM_TX_0" +#define LPASS_BE_TERT_TDM_RX_1 "TERT_TDM_RX_1" +#define LPASS_BE_TERT_TDM_TX_1 "TERT_TDM_TX_1" +#define LPASS_BE_TERT_TDM_RX_2 "TERT_TDM_RX_2" +#define LPASS_BE_TERT_TDM_TX_2 "TERT_TDM_TX_2" +#define LPASS_BE_TERT_TDM_RX_3 "TERT_TDM_RX_3" +#define LPASS_BE_TERT_TDM_TX_3 "TERT_TDM_TX_3" +#define LPASS_BE_TERT_TDM_RX_4 "TERT_TDM_RX_4" +#define LPASS_BE_TERT_TDM_TX_4 "TERT_TDM_TX_4" +#define LPASS_BE_TERT_TDM_RX_5 "TERT_TDM_RX_5" +#define LPASS_BE_TERT_TDM_TX_5 "TERT_TDM_TX_5" +#define LPASS_BE_TERT_TDM_RX_6 "TERT_TDM_RX_6" +#define LPASS_BE_TERT_TDM_TX_6 "TERT_TDM_TX_6" +#define LPASS_BE_TERT_TDM_RX_7 "TERT_TDM_RX_7" +#define LPASS_BE_TERT_TDM_TX_7 "TERT_TDM_TX_7" +#define LPASS_BE_QUAT_TDM_RX_0 "QUAT_TDM_RX_0" +#define LPASS_BE_QUAT_TDM_TX_0 "QUAT_TDM_TX_0" +#define LPASS_BE_QUAT_TDM_RX_1 "QUAT_TDM_RX_1" +#define LPASS_BE_QUAT_TDM_TX_1 "QUAT_TDM_TX_1" +#define LPASS_BE_QUAT_TDM_RX_2 "QUAT_TDM_RX_2" +#define LPASS_BE_QUAT_TDM_TX_2 "QUAT_TDM_TX_2" +#define LPASS_BE_QUAT_TDM_RX_3 "QUAT_TDM_RX_3" +#define LPASS_BE_QUAT_TDM_TX_3 "QUAT_TDM_TX_3" +#define LPASS_BE_QUAT_TDM_RX_4 "QUAT_TDM_RX_4" +#define LPASS_BE_QUAT_TDM_TX_4 "QUAT_TDM_TX_4" +#define LPASS_BE_QUAT_TDM_RX_5 "QUAT_TDM_RX_5" +#define LPASS_BE_QUAT_TDM_TX_5 "QUAT_TDM_TX_5" +#define LPASS_BE_QUAT_TDM_RX_6 "QUAT_TDM_RX_6" +#define LPASS_BE_QUAT_TDM_TX_6 "QUAT_TDM_TX_6" +#define LPASS_BE_QUAT_TDM_RX_7 "QUAT_TDM_RX_7" +#define LPASS_BE_QUAT_TDM_TX_7 "QUAT_TDM_TX_7" +#define LPASS_BE_AFE_LOOPBACK_TX "AFE_LOOPBACK_TX" +#define LPASS_BE_QUIN_TDM_RX_0 "QUIN_TDM_RX_0" +#define LPASS_BE_QUIN_TDM_TX_0 "QUIN_TDM_TX_0" +#define LPASS_BE_QUIN_TDM_RX_1 "QUIN_TDM_RX_1" +#define LPASS_BE_QUIN_TDM_TX_1 "QUIN_TDM_TX_1" +#define LPASS_BE_QUIN_TDM_RX_2 "QUIN_TDM_RX_2" +#define LPASS_BE_QUIN_TDM_TX_2 "QUIN_TDM_TX_2" +#define LPASS_BE_QUIN_TDM_RX_3 "QUIN_TDM_RX_3" +#define LPASS_BE_QUIN_TDM_TX_3 "QUIN_TDM_TX_3" +#define LPASS_BE_QUIN_TDM_RX_4 "QUIN_TDM_RX_4" +#define LPASS_BE_QUIN_TDM_TX_4 "QUIN_TDM_TX_4" +#define LPASS_BE_QUIN_TDM_RX_5 "QUIN_TDM_RX_5" +#define LPASS_BE_QUIN_TDM_TX_5 "QUIN_TDM_TX_5" +#define LPASS_BE_QUIN_TDM_RX_6 "QUIN_TDM_RX_6" +#define LPASS_BE_QUIN_TDM_TX_6 "QUIN_TDM_TX_6" +#define LPASS_BE_QUIN_TDM_RX_7 "QUIN_TDM_RX_7" +#define LPASS_BE_QUIN_TDM_TX_7 "QUIN_TDM_TX_7" +#define LPASS_BE_SEN_TDM_RX_0 "SEN_TDM_RX_0" +#define LPASS_BE_SEN_TDM_TX_0 "SEN_TDM_TX_0" +#define LPASS_BE_SEN_TDM_RX_1 "SEN_TDM_RX_1" +#define LPASS_BE_SEN_TDM_TX_1 "SEN_TDM_TX_1" +#define LPASS_BE_SEN_TDM_RX_2 "SEN_TDM_RX_2" +#define LPASS_BE_SEN_TDM_TX_2 "SEN_TDM_TX_2" +#define LPASS_BE_SEN_TDM_RX_3 "SEN_TDM_RX_3" +#define LPASS_BE_SEN_TDM_TX_3 "SEN_TDM_TX_3" +#define LPASS_BE_SEN_TDM_RX_4 "SEN_TDM_RX_4" +#define LPASS_BE_SEN_TDM_TX_4 "SEN_TDM_TX_4" +#define LPASS_BE_SEN_TDM_RX_5 "SEN_TDM_RX_5" +#define LPASS_BE_SEN_TDM_TX_5 "SEN_TDM_TX_5" +#define LPASS_BE_SEN_TDM_RX_6 "SEN_TDM_RX_6" +#define LPASS_BE_SEN_TDM_TX_6 "SEN_TDM_TX_6" +#define LPASS_BE_SEN_TDM_RX_7 "SEN_TDM_RX_7" +#define LPASS_BE_SEN_TDM_TX_7 "SEN_TDM_TX_7" + +#define LPASS_BE_SLIMBUS_7_RX "SLIMBUS_7_RX" +#define LPASS_BE_SLIMBUS_7_TX "SLIMBUS_7_TX" +#define LPASS_BE_SLIMBUS_8_RX "SLIMBUS_8_RX" +#define LPASS_BE_SLIMBUS_8_TX "SLIMBUS_8_TX" +#define LPASS_BE_SLIMBUS_9_RX "SLIMBUS_9_RX" +#define LPASS_BE_SLIMBUS_9_TX "SLIMBUS_9_TX" + +#define LPASS_BE_USB_AUDIO_RX "USB_AUDIO_RX" +#define LPASS_BE_USB_AUDIO_TX "USB_AUDIO_TX" + +#define LPASS_BE_INT0_MI2S_RX "INT0_MI2S_RX" +#define LPASS_BE_INT0_MI2S_TX "INT0_MI2S_TX" +#define LPASS_BE_INT1_MI2S_RX "INT1_MI2S_RX" +#define LPASS_BE_INT1_MI2S_TX "INT1_MI2S_TX" +#define LPASS_BE_INT2_MI2S_RX "INT2_MI2S_RX" +#define LPASS_BE_INT2_MI2S_TX "INT2_MI2S_TX" +#define LPASS_BE_INT3_MI2S_RX "INT3_MI2S_RX" +#define LPASS_BE_INT3_MI2S_TX "INT3_MI2S_TX" +#define LPASS_BE_INT4_MI2S_RX "INT4_MI2S_RX" +#define LPASS_BE_INT4_MI2S_TX "INT4_MI2S_TX" +#define LPASS_BE_INT5_MI2S_RX "INT5_MI2S_RX" +#define LPASS_BE_INT5_MI2S_TX "INT5_MI2S_TX" +#define LPASS_BE_INT6_MI2S_RX "INT6_MI2S_RX" +#define LPASS_BE_INT6_MI2S_TX "INT6_MI2S_TX" + +#define LPASS_BE_WSA_CDC_DMA_RX_0 "WSA_CDC_DMA_RX_0" +#define LPASS_BE_WSA_CDC_DMA_TX_0 "WSA_CDC_DMA_TX_0" +#define LPASS_BE_WSA_CDC_DMA_RX_1 "WSA_CDC_DMA_RX_1" +#define LPASS_BE_WSA_CDC_DMA_TX_1 "WSA_CDC_DMA_TX_1" +#define LPASS_BE_WSA_CDC_DMA_TX_2 "WSA_CDC_DMA_TX_2" +#define LPASS_BE_VA_CDC_DMA_TX_0 "VA_CDC_DMA_TX_0" +#define LPASS_BE_VA_CDC_DMA_TX_1 "VA_CDC_DMA_TX_1" +#define LPASS_BE_VA_CDC_DMA_TX_2 "VA_CDC_DMA_TX_2" + +#define LPASS_BE_RX_CDC_DMA_RX_0 "RX_CDC_DMA_RX_0" +#define LPASS_BE_RX_CDC_DMA_RX_1 "RX_CDC_DMA_RX_1" +#define LPASS_BE_RX_CDC_DMA_RX_2 "RX_CDC_DMA_RX_2" +#define LPASS_BE_RX_CDC_DMA_RX_3 "RX_CDC_DMA_RX_3" +#define LPASS_BE_RX_CDC_DMA_RX_4 "RX_CDC_DMA_RX_4" +#define LPASS_BE_RX_CDC_DMA_RX_5 "RX_CDC_DMA_RX_5" +#define LPASS_BE_RX_CDC_DMA_RX_6 "RX_CDC_DMA_RX_6" +#define LPASS_BE_RX_CDC_DMA_RX_7 "RX_CDC_DMA_RX_7" +#define LPASS_BE_TX_CDC_DMA_TX_0 "TX_CDC_DMA_TX_0" +#define LPASS_BE_TX_CDC_DMA_TX_1 "TX_CDC_DMA_TX_1" +#define LPASS_BE_TX_CDC_DMA_TX_2 "TX_CDC_DMA_TX_2" +#define LPASS_BE_TX_CDC_DMA_TX_3 "TX_CDC_DMA_TX_3" +#define LPASS_BE_TX_CDC_DMA_TX_4 "TX_CDC_DMA_TX_4" +#define LPASS_BE_TX_CDC_DMA_TX_5 "TX_CDC_DMA_TX_5" + +/* For multimedia front-ends, asm session is allocated dynamically. + * Hence, asm session/multimedia front-end mapping has to be maintained. + * Due to this reason, additional multimedia front-end must be placed before + * non-multimedia front-ends. + */ + +enum { + MSM_FRONTEND_DAI_MULTIMEDIA1 = 0, + MSM_FRONTEND_DAI_MULTIMEDIA2, + MSM_FRONTEND_DAI_MULTIMEDIA3, + MSM_FRONTEND_DAI_MULTIMEDIA4, + MSM_FRONTEND_DAI_MULTIMEDIA5, + MSM_FRONTEND_DAI_MULTIMEDIA6, + MSM_FRONTEND_DAI_MULTIMEDIA7, + MSM_FRONTEND_DAI_MULTIMEDIA8, + MSM_FRONTEND_DAI_MULTIMEDIA9, + MSM_FRONTEND_DAI_MULTIMEDIA10, + MSM_FRONTEND_DAI_MULTIMEDIA11, + MSM_FRONTEND_DAI_MULTIMEDIA12, + MSM_FRONTEND_DAI_MULTIMEDIA13, + MSM_FRONTEND_DAI_MULTIMEDIA14, + MSM_FRONTEND_DAI_MULTIMEDIA15, + MSM_FRONTEND_DAI_MULTIMEDIA16, + MSM_FRONTEND_DAI_MULTIMEDIA17, + MSM_FRONTEND_DAI_MULTIMEDIA18, + MSM_FRONTEND_DAI_MULTIMEDIA19, + MSM_FRONTEND_DAI_MULTIMEDIA20, + MSM_FRONTEND_DAI_MULTIMEDIA21, + MSM_FRONTEND_DAI_MULTIMEDIA22, + MSM_FRONTEND_DAI_MULTIMEDIA26, + MSM_FRONTEND_DAI_MULTIMEDIA27, + MSM_FRONTEND_DAI_MULTIMEDIA28, + MSM_FRONTEND_DAI_MULTIMEDIA29, + MSM_FRONTEND_DAI_MULTIMEDIA30, + MSM_FRONTEND_DAI_VOIP, + MSM_FRONTEND_DAI_AFE_RX, + MSM_FRONTEND_DAI_AFE_TX, + MSM_FRONTEND_DAI_VOICE_STUB, + MSM_FRONTEND_DAI_DTMF_RX, + MSM_FRONTEND_DAI_QCHAT, + MSM_FRONTEND_DAI_VOLTE_STUB, + MSM_FRONTEND_DAI_LSM1, + MSM_FRONTEND_DAI_LSM2, + MSM_FRONTEND_DAI_LSM3, + MSM_FRONTEND_DAI_LSM4, + MSM_FRONTEND_DAI_LSM5, + MSM_FRONTEND_DAI_LSM6, + MSM_FRONTEND_DAI_LSM7, + MSM_FRONTEND_DAI_LSM8, + MSM_FRONTEND_DAI_VOICE2_STUB, + MSM_FRONTEND_DAI_VOICEMMODE1, + MSM_FRONTEND_DAI_VOICEMMODE2, + MSM_FRONTEND_DAI_MAX, +}; + +#define MSM_FRONTEND_DAI_MM_SIZE (MSM_FRONTEND_DAI_MULTIMEDIA30 + 1) +#define MSM_FRONTEND_DAI_MM_MAX_ID MSM_FRONTEND_DAI_MULTIMEDIA30 + +enum { + MSM_BACKEND_DAI_PRI_I2S_RX = 0, + MSM_BACKEND_DAI_PRI_I2S_TX, + MSM_BACKEND_DAI_SLIMBUS_0_RX, + MSM_BACKEND_DAI_SLIMBUS_0_TX, + MSM_BACKEND_DAI_HDMI_RX, + MSM_BACKEND_DAI_INT_BT_SCO_RX, + MSM_BACKEND_DAI_INT_BT_SCO_TX, + MSM_BACKEND_DAI_INT_FM_RX, + MSM_BACKEND_DAI_INT_FM_TX, + MSM_BACKEND_DAI_AFE_PCM_RX, + MSM_BACKEND_DAI_AFE_PCM_TX, + MSM_BACKEND_DAI_AUXPCM_RX, + MSM_BACKEND_DAI_AUXPCM_TX, + MSM_BACKEND_DAI_VOICE_PLAYBACK_TX, + MSM_BACKEND_DAI_VOICE2_PLAYBACK_TX, + MSM_BACKEND_DAI_INCALL_RECORD_RX, + MSM_BACKEND_DAI_INCALL_RECORD_TX, + MSM_BACKEND_DAI_MI2S_RX, + MSM_BACKEND_DAI_MI2S_TX, + MSM_BACKEND_DAI_SEC_I2S_RX, + MSM_BACKEND_DAI_SLIMBUS_1_RX, + MSM_BACKEND_DAI_SLIMBUS_1_TX, + MSM_BACKEND_DAI_SLIMBUS_2_RX, + MSM_BACKEND_DAI_SLIMBUS_2_TX, + MSM_BACKEND_DAI_SLIMBUS_3_RX, + MSM_BACKEND_DAI_SLIMBUS_3_TX, + MSM_BACKEND_DAI_SLIMBUS_4_RX, + MSM_BACKEND_DAI_SLIMBUS_4_TX, + MSM_BACKEND_DAI_SLIMBUS_5_RX, + MSM_BACKEND_DAI_SLIMBUS_5_TX, + MSM_BACKEND_DAI_SLIMBUS_6_RX, + MSM_BACKEND_DAI_SLIMBUS_6_TX, + MSM_BACKEND_DAI_SLIMBUS_7_RX, + MSM_BACKEND_DAI_SLIMBUS_7_TX, + MSM_BACKEND_DAI_SLIMBUS_8_RX, + MSM_BACKEND_DAI_SLIMBUS_8_TX, + MSM_BACKEND_DAI_EXTPROC_RX, + MSM_BACKEND_DAI_EXTPROC_TX, + MSM_BACKEND_DAI_EXTPROC_EC_TX, + MSM_BACKEND_DAI_QUATERNARY_MI2S_RX, + MSM_BACKEND_DAI_QUATERNARY_MI2S_TX, + MSM_BACKEND_DAI_SECONDARY_MI2S_RX, + MSM_BACKEND_DAI_SECONDARY_MI2S_TX, + MSM_BACKEND_DAI_PRI_MI2S_RX, + MSM_BACKEND_DAI_PRI_MI2S_TX, + MSM_BACKEND_DAI_TERTIARY_MI2S_RX, + MSM_BACKEND_DAI_TERTIARY_MI2S_TX, + MSM_BACKEND_DAI_AUDIO_I2S_RX, + MSM_BACKEND_DAI_SEC_AUXPCM_RX, + MSM_BACKEND_DAI_SEC_AUXPCM_TX, + MSM_BACKEND_DAI_PRI_SPDIF_RX, + MSM_BACKEND_DAI_SECONDARY_MI2S_RX_SD1, + MSM_BACKEND_DAI_QUINARY_MI2S_RX, + MSM_BACKEND_DAI_QUINARY_MI2S_TX, + MSM_BACKEND_DAI_SENARY_MI2S_TX, + MSM_BACKEND_DAI_PRI_TDM_RX_0, + MSM_BACKEND_DAI_PRI_TDM_TX_0, + MSM_BACKEND_DAI_PRI_TDM_RX_1, + MSM_BACKEND_DAI_PRI_TDM_TX_1, + MSM_BACKEND_DAI_PRI_TDM_RX_2, + MSM_BACKEND_DAI_PRI_TDM_TX_2, + MSM_BACKEND_DAI_PRI_TDM_RX_3, + MSM_BACKEND_DAI_PRI_TDM_TX_3, + MSM_BACKEND_DAI_PRI_TDM_RX_4, + MSM_BACKEND_DAI_PRI_TDM_TX_4, + MSM_BACKEND_DAI_PRI_TDM_RX_5, + MSM_BACKEND_DAI_PRI_TDM_TX_5, + MSM_BACKEND_DAI_PRI_TDM_RX_6, + MSM_BACKEND_DAI_PRI_TDM_TX_6, + MSM_BACKEND_DAI_PRI_TDM_RX_7, + MSM_BACKEND_DAI_PRI_TDM_TX_7, + MSM_BACKEND_DAI_SEC_TDM_RX_0, + MSM_BACKEND_DAI_SEC_TDM_TX_0, + MSM_BACKEND_DAI_SEC_TDM_RX_1, + MSM_BACKEND_DAI_SEC_TDM_TX_1, + MSM_BACKEND_DAI_SEC_TDM_RX_2, + MSM_BACKEND_DAI_SEC_TDM_TX_2, + MSM_BACKEND_DAI_SEC_TDM_RX_3, + MSM_BACKEND_DAI_SEC_TDM_TX_3, + MSM_BACKEND_DAI_SEC_TDM_RX_4, + MSM_BACKEND_DAI_SEC_TDM_TX_4, + MSM_BACKEND_DAI_SEC_TDM_RX_5, + MSM_BACKEND_DAI_SEC_TDM_TX_5, + MSM_BACKEND_DAI_SEC_TDM_RX_6, + MSM_BACKEND_DAI_SEC_TDM_TX_6, + MSM_BACKEND_DAI_SEC_TDM_RX_7, + MSM_BACKEND_DAI_SEC_TDM_TX_7, + MSM_BACKEND_DAI_TERT_TDM_RX_0, + MSM_BACKEND_DAI_TERT_TDM_TX_0, + MSM_BACKEND_DAI_TERT_TDM_RX_1, + MSM_BACKEND_DAI_TERT_TDM_TX_1, + MSM_BACKEND_DAI_TERT_TDM_RX_2, + MSM_BACKEND_DAI_TERT_TDM_TX_2, + MSM_BACKEND_DAI_TERT_TDM_RX_3, + MSM_BACKEND_DAI_TERT_TDM_TX_3, + MSM_BACKEND_DAI_TERT_TDM_RX_4, + MSM_BACKEND_DAI_TERT_TDM_TX_4, + MSM_BACKEND_DAI_TERT_TDM_RX_5, + MSM_BACKEND_DAI_TERT_TDM_TX_5, + MSM_BACKEND_DAI_TERT_TDM_RX_6, + MSM_BACKEND_DAI_TERT_TDM_TX_6, + MSM_BACKEND_DAI_TERT_TDM_RX_7, + MSM_BACKEND_DAI_TERT_TDM_TX_7, + MSM_BACKEND_DAI_QUAT_TDM_RX_0, + MSM_BACKEND_DAI_QUAT_TDM_TX_0, + MSM_BACKEND_DAI_QUAT_TDM_RX_1, + MSM_BACKEND_DAI_QUAT_TDM_TX_1, + MSM_BACKEND_DAI_QUAT_TDM_RX_2, + MSM_BACKEND_DAI_QUAT_TDM_TX_2, + MSM_BACKEND_DAI_QUAT_TDM_RX_3, + MSM_BACKEND_DAI_QUAT_TDM_TX_3, + MSM_BACKEND_DAI_QUAT_TDM_RX_4, + MSM_BACKEND_DAI_QUAT_TDM_TX_4, + MSM_BACKEND_DAI_QUAT_TDM_RX_5, + MSM_BACKEND_DAI_QUAT_TDM_TX_5, + MSM_BACKEND_DAI_QUAT_TDM_RX_6, + MSM_BACKEND_DAI_QUAT_TDM_TX_6, + MSM_BACKEND_DAI_QUAT_TDM_RX_7, + MSM_BACKEND_DAI_QUAT_TDM_TX_7, + MSM_BACKEND_DAI_QUIN_TDM_RX_0, + MSM_BACKEND_DAI_QUIN_TDM_TX_0, + MSM_BACKEND_DAI_QUIN_TDM_RX_1, + MSM_BACKEND_DAI_QUIN_TDM_TX_1, + MSM_BACKEND_DAI_QUIN_TDM_RX_2, + MSM_BACKEND_DAI_QUIN_TDM_TX_2, + MSM_BACKEND_DAI_QUIN_TDM_RX_3, + MSM_BACKEND_DAI_QUIN_TDM_TX_3, + MSM_BACKEND_DAI_QUIN_TDM_RX_4, + MSM_BACKEND_DAI_QUIN_TDM_TX_4, + MSM_BACKEND_DAI_QUIN_TDM_RX_5, + MSM_BACKEND_DAI_QUIN_TDM_TX_5, + MSM_BACKEND_DAI_QUIN_TDM_RX_6, + MSM_BACKEND_DAI_QUIN_TDM_TX_6, + MSM_BACKEND_DAI_QUIN_TDM_RX_7, + MSM_BACKEND_DAI_QUIN_TDM_TX_7, + MSM_BACKEND_DAI_SEN_TDM_RX_0, + MSM_BACKEND_DAI_SEN_TDM_TX_0, + MSM_BACKEND_DAI_SEN_TDM_RX_1, + MSM_BACKEND_DAI_SEN_TDM_TX_1, + MSM_BACKEND_DAI_SEN_TDM_RX_2, + MSM_BACKEND_DAI_SEN_TDM_TX_2, + MSM_BACKEND_DAI_SEN_TDM_RX_3, + MSM_BACKEND_DAI_SEN_TDM_TX_3, + MSM_BACKEND_DAI_SEN_TDM_RX_4, + MSM_BACKEND_DAI_SEN_TDM_TX_4, + MSM_BACKEND_DAI_SEN_TDM_RX_5, + MSM_BACKEND_DAI_SEN_TDM_TX_5, + MSM_BACKEND_DAI_SEN_TDM_RX_6, + MSM_BACKEND_DAI_SEN_TDM_TX_6, + MSM_BACKEND_DAI_SEN_TDM_RX_7, + MSM_BACKEND_DAI_SEN_TDM_TX_7, + MSM_BACKEND_DAI_INT_BT_A2DP_RX, + MSM_BACKEND_DAI_USB_RX, + MSM_BACKEND_DAI_USB_TX, + MSM_BACKEND_DAI_DISPLAY_PORT_RX, + MSM_BACKEND_DAI_DISPLAY_PORT_RX_1, + MSM_BACKEND_DAI_TERT_AUXPCM_RX, + MSM_BACKEND_DAI_TERT_AUXPCM_TX, + MSM_BACKEND_DAI_QUAT_AUXPCM_RX, + MSM_BACKEND_DAI_QUAT_AUXPCM_TX, + MSM_BACKEND_DAI_QUIN_AUXPCM_RX, + MSM_BACKEND_DAI_QUIN_AUXPCM_TX, + MSM_BACKEND_DAI_INT0_MI2S_RX, + MSM_BACKEND_DAI_INT0_MI2S_TX, + MSM_BACKEND_DAI_INT1_MI2S_RX, + MSM_BACKEND_DAI_INT1_MI2S_TX, + MSM_BACKEND_DAI_INT2_MI2S_RX, + MSM_BACKEND_DAI_INT2_MI2S_TX, + MSM_BACKEND_DAI_INT3_MI2S_RX, + MSM_BACKEND_DAI_INT3_MI2S_TX, + MSM_BACKEND_DAI_INT4_MI2S_RX, + MSM_BACKEND_DAI_INT4_MI2S_TX, + MSM_BACKEND_DAI_INT5_MI2S_RX, + MSM_BACKEND_DAI_INT5_MI2S_TX, + MSM_BACKEND_DAI_INT6_MI2S_RX, + MSM_BACKEND_DAI_INT6_MI2S_TX, + MSM_BACKEND_DAI_SEN_AUXPCM_RX, + MSM_BACKEND_DAI_SEN_AUXPCM_TX, + MSM_BACKEND_DAI_SENARY_MI2S_RX, + MSM_BACKEND_DAI_WSA_CDC_DMA_RX_0, + MSM_BACKEND_DAI_WSA_CDC_DMA_TX_0, + MSM_BACKEND_DAI_WSA_CDC_DMA_RX_1, + MSM_BACKEND_DAI_WSA_CDC_DMA_TX_1, + MSM_BACKEND_DAI_WSA_CDC_DMA_TX_2, + MSM_BACKEND_DAI_VA_CDC_DMA_TX_0, + MSM_BACKEND_DAI_VA_CDC_DMA_TX_1, + MSM_BACKEND_DAI_VA_CDC_DMA_TX_2, + MSM_BACKEND_DAI_RX_CDC_DMA_RX_0, + MSM_BACKEND_DAI_TX_CDC_DMA_TX_0, + MSM_BACKEND_DAI_RX_CDC_DMA_RX_1, + MSM_BACKEND_DAI_TX_CDC_DMA_TX_1, + MSM_BACKEND_DAI_RX_CDC_DMA_RX_2, + MSM_BACKEND_DAI_TX_CDC_DMA_TX_2, + MSM_BACKEND_DAI_RX_CDC_DMA_RX_3, + MSM_BACKEND_DAI_TX_CDC_DMA_TX_3, + MSM_BACKEND_DAI_RX_CDC_DMA_RX_4, + MSM_BACKEND_DAI_TX_CDC_DMA_TX_4, + MSM_BACKEND_DAI_RX_CDC_DMA_RX_5, + MSM_BACKEND_DAI_TX_CDC_DMA_TX_5, + MSM_BACKEND_DAI_RX_CDC_DMA_RX_6, + MSM_BACKEND_DAI_RX_CDC_DMA_RX_7, + MSM_BACKEND_DAI_PRI_SPDIF_TX, + MSM_BACKEND_DAI_SEC_SPDIF_RX, + MSM_BACKEND_DAI_SEC_SPDIF_TX, + MSM_BACKEND_DAI_SLIMBUS_9_RX, + MSM_BACKEND_DAI_SLIMBUS_9_TX, + MSM_BACKEND_DAI_AFE_LOOPBACK_TX, + MSM_BACKEND_DAI_PRI_META_MI2S_RX, + MSM_BACKEND_DAI_SEC_META_MI2S_RX, + MSM_BACKEND_DAI_MAX, +}; +#endif /*_MSM_PCM_H*/ diff --git a/asoc/msm-dai-q6-hdmi-v2.c b/asoc/msm-dai-q6-hdmi-v2.c index 664169bd8b..7e99599c68 100644 --- a/asoc/msm-dai-q6-hdmi-v2.c +++ b/asoc/msm-dai-q6-hdmi-v2.c @@ -1,5 +1,5 @@ // SPDX-License-Identifier: GPL-2.0-only -/* Copyright (c) 2012-2019, The Linux Foundation. All rights reserved. +/* Copyright (c) 2012-2020, The Linux Foundation. All rights reserved. */ #include @@ -14,7 +14,6 @@ #include #include #include -#include #include "msm-dai-q6-v2.h" #define HDMI_RX_CA_MAX 0x32 @@ -51,6 +50,7 @@ struct msm_dai_q6_hdmi_dai_data { union afe_port_config port_config; }; +#if 0 static int get_port_id(int dai_id) { /* Currently, display devices share a common AFE port */ @@ -59,6 +59,7 @@ static int get_port_id(int dai_id) return dai_id; } +#endif static int msm_dai_q6_ext_disp_format_put(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) @@ -195,6 +196,7 @@ static int msm_dai_q6_ext_disp_drift_info(struct snd_kcontrol *kcontrol, static int msm_dai_q6_ext_disp_drift_get(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { + #if 0 int ret = -EINVAL; struct afe_param_id_dev_timing_stats timing_stats; struct snd_soc_dai *dai = kcontrol->private_data; @@ -220,6 +222,8 @@ static int msm_dai_q6_ext_disp_drift_get(struct snd_kcontrol *kcontrol, sizeof(struct afe_param_id_dev_timing_stats)); done: return ret; + #endif + return 0; } static const struct snd_kcontrol_new hdmi_config_controls[] = { @@ -348,17 +352,18 @@ static void msm_dai_q6_hdmi_shutdown(struct snd_pcm_substream *substream, struct snd_soc_dai *dai) { struct msm_dai_q6_hdmi_dai_data *dai_data = dev_get_drvdata(dai->dev); - int rc = 0; +// int rc = 0; if (!test_bit(STATUS_PORT_STARTED, dai_data->status_mask)) { pr_info("%s: afe port not started. dai_data->status_mask = %ld\n", __func__, *dai_data->status_mask); return; } - + #if 0 rc = afe_close(get_port_id(dai->id)); /* can block */ if (rc < 0) dev_err(dai->dev, "fail to close AFE port\n"); + #endif pr_debug("%s: dai_data->status_mask = %ld\n", __func__, *dai_data->status_mask); @@ -378,6 +383,7 @@ static int msm_dai_q6_hdmi_prepare(struct snd_pcm_substream *substream, dai_data->ca.ca; if (!test_bit(STATUS_PORT_STARTED, dai_data->status_mask)) { + #if 0 rc = afe_set_display_stream(get_port_id(dai->id), dai_data->stream_idx, dai_data->ctl_idx); if (rc < 0) { @@ -397,9 +403,10 @@ static int msm_dai_q6_hdmi_prepare(struct snd_pcm_substream *substream, else set_bit(STATUS_PORT_STARTED, dai_data->status_mask); + #endif } -err: +//err: return rc; } @@ -518,15 +525,17 @@ static int msm_dai_q6_hdmi_dai_probe(struct snd_soc_dai *dai) static int msm_dai_q6_hdmi_dai_remove(struct snd_soc_dai *dai) { struct msm_dai_q6_hdmi_dai_data *dai_data; - int rc; +// int rc; dai_data = dev_get_drvdata(dai->dev); /* If AFE port is still up, close it */ if (test_bit(STATUS_PORT_STARTED, dai_data->status_mask)) { + #if 0 rc = afe_close(get_port_id(dai->id)); /* can block */ if (rc < 0) dev_err(dai->dev, "fail to close AFE port\n"); + #endif clear_bit(STATUS_PORT_STARTED, dai_data->status_mask); } diff --git a/asoc/msm-dai-q6-v2.c b/asoc/msm-dai-q6-v2.c index dbedb55d2e..1ec644ec47 100644 --- a/asoc/msm-dai-q6-v2.c +++ b/asoc/msm-dai-q6-v2.c @@ -14,13 +14,15 @@ #include #include #include +#include #include -#include #include -#include #include "msm-dai-q6-v2.h" #include + +#define AFE_CLK_VERSION_V1 1 + #define MSM_DAI_PRI_AUXPCM_DT_DEV_ID 1 #define MSM_DAI_SEC_AUXPCM_DT_DEV_ID 2 #define MSM_DAI_TERT_AUXPCM_DT_DEV_ID 3 @@ -45,7 +47,7 @@ SNDRV_PCM_FMTBIT_S24_LE | \ SNDRV_PCM_FMTBIT_S32_LE) -static int msm_mi2s_get_port_id(u32 mi2s_id, int stream, u16 *port_id); +//static int msm_mi2s_get_port_id(u32 mi2s_id, int stream, u16 *port_id); enum { ENC_FMT_NONE, @@ -72,19 +74,19 @@ enum { static const struct afe_clk_set lpass_clk_set_default = { AFE_API_VERSION_CLOCK_SET, - Q6AFE_LPASS_CLK_ID_PRI_PCM_IBIT, - Q6AFE_LPASS_OSR_CLK_2_P048_MHZ, - Q6AFE_LPASS_CLK_ATTRIBUTE_COUPLE_NO, - Q6AFE_LPASS_CLK_ROOT_DEFAULT, + CLOCK_ID_PRI_PCM_IBIT, + OSR_CLOCK_2_P048_MHZ, + CLOCK_ATTRIBUTE_COUPLE_NO, + CLOCK_ROOT_DEFAULT, 0, }; static const struct afe_clk_cfg lpass_clk_cfg_default = { AFE_API_VERSION_I2S_CONFIG, - Q6AFE_LPASS_OSR_CLK_2_P048_MHZ, + OSR_CLOCK_2_P048_MHZ, 0, Q6AFE_LPASS_CLK_SRC_INTERNAL, - Q6AFE_LPASS_CLK_ROOT_DEFAULT, + CLOCK_ROOT_DEFAULT, Q6AFE_LPASS_MODE_CLK1_VALID, 0, }; @@ -234,23 +236,6 @@ struct msm_dai_q6_dai_data { struct afe_dec_config dec_config; union afe_port_config port_config; u16 vi_feed_mono; - u32 xt_logging_disable; -}; - -struct msm_dai_q6_spdif_dai_data { - DECLARE_BITMAP(status_mask, STATUS_MAX); - u32 rate; - u32 channels; - u32 bitwidth; - u16 port_id; - struct afe_spdif_port_config spdif_port; - struct afe_event_fmt_update fmt_event; - struct kobject *kobj; -}; - -struct msm_dai_q6_spdif_event_msg { - struct afe_port_mod_evt_rsp_hdr evt_hdr; - struct afe_event_fmt_update fmt_event; }; struct msm_dai_q6_mi2s_dai_config { @@ -282,7 +267,6 @@ struct msm_dai_q6_cdc_dma_dai_data { u32 channels; u32 bitwidth; u32 is_island_dai; - u32 xt_logging_disable; union afe_port_config port_config; u32 cdc_dma_data_align; }; @@ -293,10 +277,10 @@ struct msm_dai_q6_auxpcm_dai_data { struct mutex rlock; /* auxpcm dev resource lock */ u16 rx_pid; /* AUXPCM RX AFE port ID */ u16 tx_pid; /* AUXPCM TX AFE port ID */ - u16 afe_clk_ver; + u16 clk_ver; u32 is_island_dai; - struct afe_clk_cfg clk_cfg; /* hold LPASS clock configuration */ struct afe_clk_set clk_set; /* hold LPASS clock configuration */ + struct clk_cfg aux_clk_set; /* hold LPASS clock config. */ struct msm_dai_q6_dai_data bdai_data; /* incoporate base DAI data */ }; @@ -307,87 +291,12 @@ struct msm_dai_q6_tdm_dai_data { u32 bitwidth; u32 num_group_ports; u32 is_island_dai; - struct afe_clk_set clk_set; /* hold LPASS clock config. */ + struct clk_cfg clk_set; /* hold LPASS clock config. */ union afe_port_group_config group_cfg; /* hold tdm group config */ struct afe_tdm_port_config port_cfg; /* hold tdm config */ struct afe_param_id_tdm_lane_cfg lane_cfg; /* hold tdm lane config */ }; -/* MI2S format field for AFE_PORT_CMD_I2S_CONFIG command - * 0: linear PCM - * 1: non-linear PCM - * 2: PCM data in IEC 60968 container - * 3: compressed data in IEC 60958 container - * 9: DSD over PCM (DoP) with marker byte - */ -static const char *const mi2s_format[] = { - "LPCM", - "Compr", - "LPCM-60958", - "Compr-60958", - "NA4", - "NA5", - "NA6", - "NA7", - "NA8", - "DSD_DOP_W_MARKER" -}; - -static const char *const mi2s_vi_feed_mono[] = { - "Left", - "Right", -}; - -static const struct soc_enum mi2s_config_enum[] = { - SOC_ENUM_SINGLE_EXT(10, mi2s_format), - SOC_ENUM_SINGLE_EXT(2, mi2s_vi_feed_mono), -}; - -static const char *const cdc_dma_format[] = { - "UNPACKED", - "PACKED_16B", -}; - -static const struct soc_enum cdc_dma_config_enum[] = { - SOC_ENUM_SINGLE_EXT(2, cdc_dma_format), -}; - -static const char *const sb_format[] = { - "UNPACKED", - "PACKED_16B", - "DSD_DOP", -}; - -static const struct soc_enum sb_config_enum[] = { - SOC_ENUM_SINGLE_EXT(3, sb_format), -}; - -static const char * const xt_logging_disable_text[] = { - "FALSE", - "TRUE", -}; - -static const struct soc_enum xt_logging_disable_enum[] = { - SOC_ENUM_SINGLE_EXT(2, xt_logging_disable_text), -}; - -static const char *const tdm_data_format[] = { - "LPCM", - "Compr", - "Gen Compr" -}; - -static const char *const tdm_header_type[] = { - "Invalid", - "Default", - "Entertainment", -}; - -static const struct soc_enum tdm_config_enum[] = { - SOC_ENUM_SINGLE_EXT(ARRAY_SIZE(tdm_data_format), tdm_data_format), - SOC_ENUM_SINGLE_EXT(ARRAY_SIZE(tdm_header_type), tdm_header_type), -}; - static DEFINE_MUTEX(tdm_mutex); static atomic_t tdm_group_ref[IDX_GROUP_TDM_MAX]; @@ -420,13 +329,11 @@ static struct afe_param_id_group_device_tdm_cfg tdm_group_cfg = { static u32 num_tdm_group_ports; -static struct afe_clk_set tdm_clk_set = { - AFE_API_VERSION_CLOCK_SET, - Q6AFE_LPASS_CLK_ID_QUAD_TDM_EBIT, - Q6AFE_LPASS_IBIT_CLK_DISABLE, - Q6AFE_LPASS_CLK_ATTRIBUTE_INVERT_COUPLE_NO, - Q6AFE_LPASS_CLK_ROOT_DEFAULT, - 0, +static struct clk_cfg tdm_clk_set = { + CLOCK_ID_QUAD_TDM_EBIT, + IBIT_CLOCK_DISABLE, + CLOCK_ATTRIBUTE_INVERT_COUPLE_NO, + CLOCK_ROOT_DEFAULT, }; static int msm_dai_q6_get_tdm_clk_ref(u16 id) @@ -859,120 +766,10 @@ static int msm_dai_q6_auxpcm_hw_params( struct msm_dai_q6_auxpcm_dai_data *aux_dai_data = dev_get_drvdata(dai->dev); struct msm_dai_q6_dai_data *dai_data = &aux_dai_data->bdai_data; - struct msm_dai_auxpcm_pdata *auxpcm_pdata = - (struct msm_dai_auxpcm_pdata *) dai->dev->platform_data; - int rc = 0, slot_mapping_copy_len = 0; - - if (params_channels(params) != 1 || (params_rate(params) != 8000 && - params_rate(params) != 16000)) { - dev_err(dai->dev, "%s: invalid param chan %d rate %d\n", - __func__, params_channels(params), params_rate(params)); - return -EINVAL; - } - - mutex_lock(&aux_dai_data->rlock); - - if (test_bit(STATUS_TX_PORT, aux_dai_data->auxpcm_port_status) || - test_bit(STATUS_RX_PORT, aux_dai_data->auxpcm_port_status)) { - /* AUXPCM DAI in use */ - if (dai_data->rate != params_rate(params)) { - dev_err(dai->dev, "%s: rate mismatch of running DAI\n", - __func__); - rc = -EINVAL; - } - mutex_unlock(&aux_dai_data->rlock); - return rc; - } + int rc = 0; dai_data->channels = params_channels(params); dai_data->rate = params_rate(params); - - if (dai_data->rate == 8000) { - dai_data->port_config.pcm.pcm_cfg_minor_version = - AFE_API_VERSION_PCM_CONFIG; - dai_data->port_config.pcm.aux_mode = auxpcm_pdata->mode_8k.mode; - dai_data->port_config.pcm.sync_src = auxpcm_pdata->mode_8k.sync; - dai_data->port_config.pcm.frame_setting = - auxpcm_pdata->mode_8k.frame; - dai_data->port_config.pcm.quantype = - auxpcm_pdata->mode_8k.quant; - dai_data->port_config.pcm.ctrl_data_out_enable = - auxpcm_pdata->mode_8k.data; - dai_data->port_config.pcm.sample_rate = dai_data->rate; - dai_data->port_config.pcm.num_channels = dai_data->channels; - dai_data->port_config.pcm.bit_width = 16; - if (ARRAY_SIZE(dai_data->port_config.pcm.slot_number_mapping) <= - auxpcm_pdata->mode_8k.num_slots) - slot_mapping_copy_len = - ARRAY_SIZE( - dai_data->port_config.pcm.slot_number_mapping) - * sizeof(uint16_t); - else - slot_mapping_copy_len = auxpcm_pdata->mode_8k.num_slots - * sizeof(uint16_t); - - if (auxpcm_pdata->mode_8k.slot_mapping) { - memcpy(dai_data->port_config.pcm.slot_number_mapping, - auxpcm_pdata->mode_8k.slot_mapping, - slot_mapping_copy_len); - } else { - dev_err(dai->dev, "%s 8khz slot mapping is NULL\n", - __func__); - mutex_unlock(&aux_dai_data->rlock); - return -EINVAL; - } - } else { - dai_data->port_config.pcm.pcm_cfg_minor_version = - AFE_API_VERSION_PCM_CONFIG; - dai_data->port_config.pcm.aux_mode = - auxpcm_pdata->mode_16k.mode; - dai_data->port_config.pcm.sync_src = - auxpcm_pdata->mode_16k.sync; - dai_data->port_config.pcm.frame_setting = - auxpcm_pdata->mode_16k.frame; - dai_data->port_config.pcm.quantype = - auxpcm_pdata->mode_16k.quant; - dai_data->port_config.pcm.ctrl_data_out_enable = - auxpcm_pdata->mode_16k.data; - dai_data->port_config.pcm.sample_rate = dai_data->rate; - dai_data->port_config.pcm.num_channels = dai_data->channels; - dai_data->port_config.pcm.bit_width = 16; - if (ARRAY_SIZE(dai_data->port_config.pcm.slot_number_mapping) <= - auxpcm_pdata->mode_16k.num_slots) - slot_mapping_copy_len = - ARRAY_SIZE( - dai_data->port_config.pcm.slot_number_mapping) - * sizeof(uint16_t); - else - slot_mapping_copy_len = auxpcm_pdata->mode_16k.num_slots - * sizeof(uint16_t); - - if (auxpcm_pdata->mode_16k.slot_mapping) { - memcpy(dai_data->port_config.pcm.slot_number_mapping, - auxpcm_pdata->mode_16k.slot_mapping, - slot_mapping_copy_len); - } else { - dev_err(dai->dev, "%s 16khz slot mapping is NULL\n", - __func__); - mutex_unlock(&aux_dai_data->rlock); - return -EINVAL; - } - } - - dev_dbg(dai->dev, "%s: aux_mode 0x%x sync_src 0x%x frame_setting 0x%x\n", - __func__, dai_data->port_config.pcm.aux_mode, - dai_data->port_config.pcm.sync_src, - dai_data->port_config.pcm.frame_setting); - dev_dbg(dai->dev, "%s: qtype 0x%x dout 0x%x num_map[0] 0x%x\n" - "num_map[1] 0x%x num_map[2] 0x%x num_map[3] 0x%x\n", - __func__, dai_data->port_config.pcm.quantype, - dai_data->port_config.pcm.ctrl_data_out_enable, - dai_data->port_config.pcm.slot_number_mapping[0], - dai_data->port_config.pcm.slot_number_mapping[1], - dai_data->port_config.pcm.slot_number_mapping[2], - dai_data->port_config.pcm.slot_number_mapping[3]); - - mutex_unlock(&aux_dai_data->rlock); return rc; } @@ -982,18 +779,18 @@ static int msm_dai_q6_auxpcm_set_clk( { int rc; - pr_debug("%s: afe_clk_ver: %d, port_id: %d, enable: %d\n", __func__, - aux_dai_data->afe_clk_ver, port_id, enable); - if (aux_dai_data->afe_clk_ver == AFE_CLK_VERSION_V2) { - aux_dai_data->clk_set.enable = enable; - rc = afe_set_lpass_clock_v2(port_id, - &aux_dai_data->clk_set); - } else { - if (!enable) - aux_dai_data->clk_cfg.clk_val1 = 0; - rc = afe_set_lpass_clock(port_id, - &aux_dai_data->clk_cfg); - } + aux_dai_data->aux_clk_set.clk_id = aux_dai_data->clk_set.clk_id; + aux_dai_data->aux_clk_set.clk_freq_in_hz = aux_dai_data->clk_set.clk_freq_in_hz; + aux_dai_data->aux_clk_set.clk_attri = aux_dai_data->clk_set.clk_attri; + aux_dai_data->aux_clk_set.clk_root = aux_dai_data->clk_set.clk_root; + + pr_debug("%s: clk_ver: %d, port_id: %d, enable: %d freq:%d\n", __func__, + aux_dai_data->clk_ver, port_id, enable, aux_dai_data->aux_clk_set.clk_freq_in_hz); + aux_dai_data->clk_set.enable = enable; + rc = audio_prm_set_lpass_clk_cfg(&aux_dai_data->aux_clk_set, enable); + if (!enable) + rc = audio_prm_set_lpass_clk_cfg(&aux_dai_data->aux_clk_set, enable); + return rc; } @@ -1042,11 +839,9 @@ static void msm_dai_q6_auxpcm_shutdown(struct snd_pcm_substream *substream, dev_dbg(dai->dev, "%s: dai->id = %d closing PCM AFE ports\n", __func__, dai->id); - rc = afe_close(aux_dai_data->rx_pid); /* can block */ if (rc < 0) dev_err(dai->dev, "fail to close PCM_RX AFE port\n"); - rc = afe_close(aux_dai_data->tx_pid); if (rc < 0) dev_err(dai->dev, "fail to close AUX PCM TX port\n"); @@ -1064,7 +859,7 @@ static int msm_dai_q6_auxpcm_prepare(struct snd_pcm_substream *substream, struct msm_dai_q6_dai_data *dai_data = &aux_dai_data->bdai_data; struct msm_dai_auxpcm_pdata *auxpcm_pdata = NULL; int rc = 0; - u32 pcm_clk_rate; + u32 pcm_clk_rate = 0; auxpcm_pdata = dai->dev->platform_data; mutex_lock(&aux_dai_data->rlock); @@ -1093,102 +888,79 @@ static int msm_dai_q6_auxpcm_prepare(struct snd_pcm_substream *substream, dev_dbg(dai->dev, "%s: PCM ports already set\n", __func__); goto exit; } - - dev_dbg(dai->dev, "%s: dai->id:%d opening afe ports\n", - __func__, dai->id); - - rc = afe_q6_interface_prepare(); - if (rc < 0) { - dev_err(dai->dev, "fail to open AFE APR\n"); - goto fail; - } - - /* - * For AUX PCM Interface the below sequence of clk - * settings and afe_open is a strict requirement. - * - * Also using afe_open instead of afe_port_start_nowait - * to make sure the port is open before deasserting the - * clock line. This is required because pcm register is - * not written before clock deassert. Hence the hw does - * not get updated with new setting if the below clock - * assert/deasset and afe_open sequence is not followed. - */ - if (dai_data->rate == 8000) { pcm_clk_rate = auxpcm_pdata->mode_8k.pcm_clk_rate; } else if (dai_data->rate == 16000) { pcm_clk_rate = (auxpcm_pdata->mode_16k.pcm_clk_rate); + } else if (dai_data->rate == 32000) { + pcm_clk_rate = (auxpcm_pdata->mode_32k.pcm_clk_rate); + } else if (dai_data->rate == 48000) { + pcm_clk_rate = (auxpcm_pdata->mode_48k.pcm_clk_rate); } else { dev_err(dai->dev, "%s: Invalid AUX PCM rate %d\n", __func__, dai_data->rate); rc = -EINVAL; goto fail; } - if (aux_dai_data->afe_clk_ver == AFE_CLK_VERSION_V2) { - memcpy(&aux_dai_data->clk_set, &lpass_clk_set_default, + pcm_clk_rate = dai_data->rate*16*8; //sample_rate * bitwidth * number_of_slots + memcpy(&aux_dai_data->clk_set, &lpass_clk_set_default, sizeof(struct afe_clk_set)); - aux_dai_data->clk_set.clk_freq_in_hz = pcm_clk_rate; + aux_dai_data->clk_set.clk_freq_in_hz = pcm_clk_rate; switch (dai->id) { case MSM_DAI_PRI_AUXPCM_DT_DEV_ID: if (pcm_clk_rate) aux_dai_data->clk_set.clk_id = - Q6AFE_LPASS_CLK_ID_PRI_PCM_IBIT; + CLOCK_ID_PRI_PCM_IBIT; else aux_dai_data->clk_set.clk_id = - Q6AFE_LPASS_CLK_ID_PRI_PCM_EBIT; + CLOCK_ID_PRI_PCM_EBIT; break; case MSM_DAI_SEC_AUXPCM_DT_DEV_ID: if (pcm_clk_rate) aux_dai_data->clk_set.clk_id = - Q6AFE_LPASS_CLK_ID_SEC_PCM_IBIT; + CLOCK_ID_SEC_PCM_IBIT; else aux_dai_data->clk_set.clk_id = - Q6AFE_LPASS_CLK_ID_SEC_PCM_EBIT; + CLOCK_ID_SEC_PCM_EBIT; break; case MSM_DAI_TERT_AUXPCM_DT_DEV_ID: if (pcm_clk_rate) aux_dai_data->clk_set.clk_id = - Q6AFE_LPASS_CLK_ID_TER_PCM_IBIT; + CLOCK_ID_TER_PCM_IBIT; else aux_dai_data->clk_set.clk_id = - Q6AFE_LPASS_CLK_ID_TER_PCM_EBIT; + CLOCK_ID_TER_PCM_EBIT; break; case MSM_DAI_QUAT_AUXPCM_DT_DEV_ID: if (pcm_clk_rate) aux_dai_data->clk_set.clk_id = - Q6AFE_LPASS_CLK_ID_QUAD_PCM_IBIT; + CLOCK_ID_QUAD_PCM_IBIT; else aux_dai_data->clk_set.clk_id = - Q6AFE_LPASS_CLK_ID_QUAD_PCM_EBIT; + CLOCK_ID_QUAD_PCM_EBIT; break; case MSM_DAI_QUIN_AUXPCM_DT_DEV_ID: if (pcm_clk_rate) aux_dai_data->clk_set.clk_id = - Q6AFE_LPASS_CLK_ID_QUIN_PCM_IBIT; + CLOCK_ID_QUI_PCM_IBIT; else aux_dai_data->clk_set.clk_id = - Q6AFE_LPASS_CLK_ID_QUIN_PCM_EBIT; + CLOCK_ID_QUI_PCM_EBIT; break; case MSM_DAI_SEN_AUXPCM_DT_DEV_ID: if (pcm_clk_rate) aux_dai_data->clk_set.clk_id = - Q6AFE_LPASS_CLK_ID_SEN_PCM_IBIT; + CLOCK_ID_SEN_PCM_EBIT; else aux_dai_data->clk_set.clk_id = - Q6AFE_LPASS_CLK_ID_SEN_PCM_EBIT; + CLOCK_ID_SEN_PCM_EBIT; break; default: dev_err(dai->dev, "%s: AUXPCM id: %d not supported\n", __func__, dai->id); break; } - } else { - memcpy(&aux_dai_data->clk_cfg, &lpass_clk_cfg_default, - sizeof(struct afe_clk_cfg)); - aux_dai_data->clk_cfg.clk_val1 = pcm_clk_rate; - } rc = msm_dai_q6_auxpcm_set_clk(aux_dai_data, aux_dai_data->rx_pid, true); @@ -1208,10 +980,6 @@ static int msm_dai_q6_auxpcm_prepare(struct snd_pcm_substream *substream, goto fail; } - afe_open(aux_dai_data->rx_pid, &dai_data->port_config, dai_data->rate); - afe_open(aux_dai_data->tx_pid, &dai_data->port_config, dai_data->rate); - goto exit; - fail: if (substream->stream == SNDRV_PCM_STREAM_CAPTURE) clear_bit(STATUS_TX_PORT, aux_dai_data->auxpcm_port_status); @@ -1223,40 +991,9 @@ exit: return rc; } -static int msm_dai_q6_auxpcm_trigger(struct snd_pcm_substream *substream, - int cmd, struct snd_soc_dai *dai) -{ - int rc = 0; - - pr_debug("%s:port:%d cmd:%d\n", - __func__, dai->id, cmd); - - switch (cmd) { - - case SNDRV_PCM_TRIGGER_START: - case SNDRV_PCM_TRIGGER_RESUME: - case SNDRV_PCM_TRIGGER_PAUSE_RELEASE: - /* afe_open will be called from prepare */ - return 0; - - case SNDRV_PCM_TRIGGER_STOP: - case SNDRV_PCM_TRIGGER_SUSPEND: - case SNDRV_PCM_TRIGGER_PAUSE_PUSH: - return 0; - - default: - pr_err("%s: cmd %d\n", __func__, cmd); - rc = -EINVAL; - } - - return rc; - -} - static int msm_dai_q6_dai_auxpcm_remove(struct snd_soc_dai *dai) { struct msm_dai_q6_auxpcm_dai_data *aux_dai_data; - int rc; aux_dai_data = dev_get_drvdata(dai->dev); @@ -1265,12 +1002,6 @@ static int msm_dai_q6_dai_auxpcm_remove(struct snd_soc_dai *dai) if (test_bit(STATUS_TX_PORT, aux_dai_data->auxpcm_port_status) || test_bit(STATUS_RX_PORT, aux_dai_data->auxpcm_port_status)) { - rc = afe_close(aux_dai_data->rx_pid); /* can block */ - if (rc < 0) - dev_err(dai->dev, "fail to close AUXPCM RX AFE port\n"); - rc = afe_close(aux_dai_data->tx_pid); - if (rc < 0) - dev_err(dai->dev, "fail to close AUXPCM TX AFE port\n"); clear_bit(STATUS_TX_PORT, aux_dai_data->auxpcm_port_status); clear_bit(STATUS_RX_PORT, aux_dai_data->auxpcm_port_status); } @@ -1279,85 +1010,6 @@ static int msm_dai_q6_dai_auxpcm_remove(struct snd_soc_dai *dai) return 0; } -static int msm_dai_q6_island_mode_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int value = ucontrol->value.integer.value[0]; - u16 port_id = (u16)kcontrol->private_value; - - pr_debug("%s: island mode = %d\n", __func__, value); - trace_printk("%s: island mode = %d\n", __func__, value); - - afe_set_island_mode_cfg(port_id, value); - return 0; -} - -static int msm_dai_q6_island_mode_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int value; - u16 port_id = (u16)kcontrol->private_value; - - afe_get_island_mode_cfg(port_id, &value); - ucontrol->value.integer.value[0] = value; - return 0; -} - -static void island_mx_ctl_private_free(struct snd_kcontrol *kcontrol) -{ - struct snd_kcontrol_new *knew = snd_kcontrol_chip(kcontrol); - - kfree(knew); -} - -static int msm_dai_q6_add_island_mx_ctls(struct snd_card *card, - const char *dai_name, - int dai_id, void *dai_data) -{ - const char *mx_ctl_name = "TX island"; - char *mixer_str = NULL; - int dai_str_len = 0, ctl_len = 0; - int rc = 0; - struct snd_kcontrol_new *knew = NULL; - struct snd_kcontrol *kctl = NULL; - - dai_str_len = strlen(dai_name) + 1; - - /* Add island related mixer controls */ - ctl_len = dai_str_len + strlen(mx_ctl_name) + 1; - mixer_str = kzalloc(ctl_len, GFP_KERNEL); - if (!mixer_str) - return -ENOMEM; - - snprintf(mixer_str, ctl_len, "%s %s", dai_name, mx_ctl_name); - - knew = kzalloc(sizeof(struct snd_kcontrol_new), GFP_KERNEL); - if (!knew) { - kfree(mixer_str); - return -ENOMEM; - } - knew->iface = SNDRV_CTL_ELEM_IFACE_MIXER; - knew->info = snd_ctl_boolean_mono_info; - knew->get = msm_dai_q6_island_mode_get; - knew->put = msm_dai_q6_island_mode_put; - knew->name = mixer_str; - knew->private_value = dai_id; - kctl = snd_ctl_new1(knew, knew); - if (!kctl) { - kfree(knew); - kfree(mixer_str); - return -ENOMEM; - } - kctl->private_free = island_mx_ctl_private_free; - rc = snd_ctl_add(card, kctl); - if (rc < 0) - pr_err("%s: err add config ctl, DAI = %s\n", - __func__, dai_name); - kfree(mixer_str); - - return rc; -} - /* * For single CPU DAI registration, the dai id needs to be * set explicitly in the dai probe as ASoC does not read @@ -1399,19 +1051,12 @@ static int msm_dai_q6_aux_pcm_probe(struct snd_soc_dai *dai) msm_dai_q6_set_dai_id(dai); dai_data = dev_get_drvdata(dai->dev); - if (dai_data->is_island_dai) - rc = msm_dai_q6_add_island_mx_ctls( - dai->component->card->snd_card, - dai->name, dai_data->tx_pid, - (void *)dai_data); - rc = msm_dai_q6_dai_add_route(dai); return rc; } static struct snd_soc_dai_ops msm_dai_q6_auxpcm_ops = { .prepare = msm_dai_q6_auxpcm_prepare, - .trigger = msm_dai_q6_auxpcm_trigger, .hw_params = msm_dai_q6_auxpcm_hw_params, .shutdown = msm_dai_q6_auxpcm_shutdown, }; @@ -1426,21 +1071,23 @@ static struct snd_soc_dai_driver msm_dai_q6_aux_pcm_dai[] = { .playback = { .stream_name = "AUX PCM Playback", .aif_name = "AUX_PCM_RX", - .rates = (SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000), + .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 | + SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000, .formats = SNDRV_PCM_FMTBIT_S16_LE, .channels_min = 1, - .channels_max = 1, - .rate_max = 16000, + .channels_max = 2, + .rate_max = 48000, .rate_min = 8000, }, .capture = { .stream_name = "AUX PCM Capture", .aif_name = "AUX_PCM_TX", - .rates = (SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000), + .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 | + SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000, .formats = SNDRV_PCM_FMTBIT_S16_LE, .channels_min = 1, - .channels_max = 1, - .rate_max = 16000, + .channels_max = 2, + .rate_max = 48000, .rate_min = 8000, }, .id = MSM_DAI_PRI_AUXPCM_DT_DEV_ID, @@ -1585,772 +1232,6 @@ static struct snd_soc_dai_driver msm_dai_q6_aux_pcm_dai[] = { .remove = msm_dai_q6_dai_auxpcm_remove, }, }; - -static int msm_dai_q6_spdif_format_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - - struct msm_dai_q6_spdif_dai_data *dai_data = kcontrol->private_data; - int value = ucontrol->value.integer.value[0]; - - dai_data->spdif_port.cfg.data_format = value; - pr_debug("%s: value = %d\n", __func__, value); - return 0; -} - -static int msm_dai_q6_spdif_format_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - - struct msm_dai_q6_spdif_dai_data *dai_data = kcontrol->private_data; - - ucontrol->value.integer.value[0] = - dai_data->spdif_port.cfg.data_format; - return 0; -} - -static int msm_dai_q6_spdif_source_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - - struct msm_dai_q6_spdif_dai_data *dai_data = kcontrol->private_data; - int value = ucontrol->value.integer.value[0]; - - dai_data->spdif_port.cfg.src_sel = value; - pr_debug("%s: value = %d\n", __func__, value); - return 0; -} - -static int msm_dai_q6_spdif_source_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - - struct msm_dai_q6_spdif_dai_data *dai_data = kcontrol->private_data; - - ucontrol->value.integer.value[0] = - dai_data->spdif_port.cfg.src_sel; - return 0; -} - -static const char * const spdif_format[] = { - "LPCM", - "Compr" -}; - -static const char * const spdif_source[] = { - "Optical", "EXT-ARC", "Coaxial", "VT-ARC" -}; - -static const struct soc_enum spdif_rx_config_enum[] = { - SOC_ENUM_SINGLE_EXT(ARRAY_SIZE(spdif_format), spdif_format), -}; - -static const struct soc_enum spdif_tx_config_enum[] = { - SOC_ENUM_SINGLE_EXT(ARRAY_SIZE(spdif_source), spdif_source), - SOC_ENUM_SINGLE_EXT(ARRAY_SIZE(spdif_format), spdif_format), -}; - -static int msm_dai_q6_spdif_chstatus_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct msm_dai_q6_spdif_dai_data *dai_data = kcontrol->private_data; - int ret = 0; - - dai_data->spdif_port.ch_status.status_type = - AFE_API_VERSION_SPDIF_CH_STATUS_CONFIG; - memset(dai_data->spdif_port.ch_status.status_mask, - CHANNEL_STATUS_MASK_INIT, CHANNEL_STATUS_SIZE); - dai_data->spdif_port.ch_status.status_mask[0] = - CHANNEL_STATUS_MASK; - - memcpy(dai_data->spdif_port.ch_status.status_bits, - ucontrol->value.iec958.status, CHANNEL_STATUS_SIZE); - - if (test_bit(STATUS_PORT_STARTED, dai_data->status_mask)) { - pr_debug("%s: Port already started. Dynamic update\n", - __func__); - ret = afe_send_spdif_ch_status_cfg( - &dai_data->spdif_port.ch_status, - dai_data->port_id); - } - return ret; -} - -static int msm_dai_q6_spdif_chstatus_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - - struct msm_dai_q6_spdif_dai_data *dai_data = kcontrol->private_data; - - memcpy(ucontrol->value.iec958.status, - dai_data->spdif_port.ch_status.status_bits, - CHANNEL_STATUS_SIZE); - return 0; -} - -static int msm_dai_q6_spdif_chstatus_info(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_info *uinfo) -{ - uinfo->type = SNDRV_CTL_ELEM_TYPE_IEC958; - uinfo->count = 1; - return 0; -} - -static const struct snd_kcontrol_new spdif_rx_config_controls[] = { - /* Primary SPDIF output */ - { - .access = (SNDRV_CTL_ELEM_ACCESS_READWRITE | - SNDRV_CTL_ELEM_ACCESS_INACTIVE), - .iface = SNDRV_CTL_ELEM_IFACE_PCM, - .name = SNDRV_CTL_NAME_IEC958("", PLAYBACK, PCM_STREAM), - .info = msm_dai_q6_spdif_chstatus_info, - .get = msm_dai_q6_spdif_chstatus_get, - .put = msm_dai_q6_spdif_chstatus_put, - }, - SOC_ENUM_EXT("PRI SPDIF RX Format", spdif_rx_config_enum[0], - msm_dai_q6_spdif_format_get, - msm_dai_q6_spdif_format_put), - /* Secondary SPDIF output */ - { - .access = (SNDRV_CTL_ELEM_ACCESS_READWRITE | - SNDRV_CTL_ELEM_ACCESS_INACTIVE), - .iface = SNDRV_CTL_ELEM_IFACE_PCM, - .name = SNDRV_CTL_NAME_IEC958("SEC", PLAYBACK, PCM_STREAM), - .info = msm_dai_q6_spdif_chstatus_info, - .get = msm_dai_q6_spdif_chstatus_get, - .put = msm_dai_q6_spdif_chstatus_put, - }, - SOC_ENUM_EXT("SEC SPDIF RX Format", spdif_rx_config_enum[0], - msm_dai_q6_spdif_format_get, - msm_dai_q6_spdif_format_put) -}; - -static const struct snd_kcontrol_new spdif_tx_config_controls[] = { - SOC_ENUM_EXT("PRI SPDIF TX Source", spdif_tx_config_enum[0], - msm_dai_q6_spdif_source_get, - msm_dai_q6_spdif_source_put), - SOC_ENUM_EXT("PRI SPDIF TX Format", spdif_tx_config_enum[1], - msm_dai_q6_spdif_format_get, - msm_dai_q6_spdif_format_put), - SOC_ENUM_EXT("SEC SPDIF TX Source", spdif_tx_config_enum[0], - msm_dai_q6_spdif_source_get, - msm_dai_q6_spdif_source_put), - SOC_ENUM_EXT("SEC SPDIF TX Format", spdif_tx_config_enum[1], - msm_dai_q6_spdif_format_get, - msm_dai_q6_spdif_format_put) -}; - -static void msm_dai_q6_spdif_process_event(uint32_t opcode, uint32_t token, - uint32_t *payload, void *private_data) -{ - struct msm_dai_q6_spdif_event_msg *evt; - struct msm_dai_q6_spdif_dai_data *dai_data; - int preemph_old = 0; - int preemph_new = 0; - - evt = (struct msm_dai_q6_spdif_event_msg *)payload; - dai_data = (struct msm_dai_q6_spdif_dai_data *)private_data; - - preemph_old = GET_PREEMPH(dai_data->fmt_event.channel_status[0]); - preemph_new = GET_PREEMPH(evt->fmt_event.channel_status[0]); - - pr_debug("%s: old state %d, fmt %d, rate %d, preemph %d\n", - __func__, dai_data->fmt_event.status, - dai_data->fmt_event.data_format, - dai_data->fmt_event.sample_rate, - preemph_old); - pr_debug("%s: new state %d, fmt %d, rate %d, preemph %d\n", - __func__, evt->fmt_event.status, - evt->fmt_event.data_format, - evt->fmt_event.sample_rate, - preemph_new); - - dai_data->fmt_event.status = evt->fmt_event.status; - dai_data->fmt_event.data_format = evt->fmt_event.data_format; - dai_data->fmt_event.sample_rate = evt->fmt_event.sample_rate; - dai_data->fmt_event.channel_status[0] = - evt->fmt_event.channel_status[0]; - dai_data->fmt_event.channel_status[1] = - evt->fmt_event.channel_status[1]; - dai_data->fmt_event.channel_status[2] = - evt->fmt_event.channel_status[2]; - dai_data->fmt_event.channel_status[3] = - evt->fmt_event.channel_status[3]; - dai_data->fmt_event.channel_status[4] = - evt->fmt_event.channel_status[4]; - dai_data->fmt_event.channel_status[5] = - evt->fmt_event.channel_status[5]; -} - -static int msm_dai_q6_spdif_hw_params(struct snd_pcm_substream *substream, - struct snd_pcm_hw_params *params, - struct snd_soc_dai *dai) -{ - struct msm_dai_q6_spdif_dai_data *dai_data = dev_get_drvdata(dai->dev); - - dai_data->channels = params_channels(params); - dai_data->spdif_port.cfg.num_channels = dai_data->channels; - switch (params_format(params)) { - case SNDRV_PCM_FORMAT_S16_LE: - dai_data->spdif_port.cfg.bit_width = 16; - break; - case SNDRV_PCM_FORMAT_S24_LE: - case SNDRV_PCM_FORMAT_S24_3LE: - dai_data->spdif_port.cfg.bit_width = 24; - break; - default: - pr_err("%s: format %d\n", - __func__, params_format(params)); - return -EINVAL; - } - - dai_data->rate = params_rate(params); - dai_data->bitwidth = dai_data->spdif_port.cfg.bit_width; - dai_data->spdif_port.cfg.sample_rate = dai_data->rate; - dai_data->spdif_port.cfg.spdif_cfg_minor_version = - AFE_API_VERSION_SPDIF_CONFIG_V2; - dev_dbg(dai->dev, " channel %d sample rate %d bit width %d\n", - dai_data->channels, dai_data->rate, - dai_data->spdif_port.cfg.bit_width); - dai_data->spdif_port.cfg.reserved = 0; - return 0; -} - -static void msm_dai_q6_spdif_shutdown(struct snd_pcm_substream *substream, - struct snd_soc_dai *dai) -{ - struct msm_dai_q6_spdif_dai_data *dai_data = dev_get_drvdata(dai->dev); - int rc = 0; - - if (!test_bit(STATUS_PORT_STARTED, dai_data->status_mask)) { - pr_info("%s: afe port not started. dai_data->status_mask = %ld\n", - __func__, *dai_data->status_mask); - return; - } - - rc = afe_close(dai->id); - if (rc < 0) - dev_err(dai->dev, "fail to close AFE port\n"); - - dai_data->fmt_event.status = 0; /* report invalid line state */ - - pr_debug("%s: dai_data->status_mask = %ld\n", __func__, - *dai_data->status_mask); - - clear_bit(STATUS_PORT_STARTED, dai_data->status_mask); -} - -static int msm_dai_q6_spdif_prepare(struct snd_pcm_substream *substream, - struct snd_soc_dai *dai) -{ - struct msm_dai_q6_spdif_dai_data *dai_data = dev_get_drvdata(dai->dev); - int rc = 0; - - if (!test_bit(STATUS_PORT_STARTED, dai_data->status_mask)) { - rc = afe_spdif_reg_event_cfg(dai->id, - AFE_MODULE_REGISTER_EVENT_FLAG, - msm_dai_q6_spdif_process_event, - dai_data); - if (rc < 0) - dev_err(dai->dev, - "fail to register event for port 0x%x\n", - dai->id); - - rc = afe_spdif_port_start(dai->id, &dai_data->spdif_port, - dai_data->rate); - if (rc < 0) - dev_err(dai->dev, "fail to open AFE port 0x%x\n", - dai->id); - else - set_bit(STATUS_PORT_STARTED, - dai_data->status_mask); - } - - return rc; -} - -static ssize_t msm_dai_q6_spdif_sysfs_rda_audio_state(struct device *dev, - struct device_attribute *attr, char *buf) -{ - ssize_t ret; - struct msm_dai_q6_spdif_dai_data *dai_data = dev_get_drvdata(dev); - - if (!dai_data) { - pr_err("%s: invalid input\n", __func__); - return -EINVAL; - } - - ret = snprintf(buf, MSM_DAI_SYSFS_ENTRY_MAX_LEN, "%d\n", - dai_data->fmt_event.status); - pr_debug("%s: '%d'\n", __func__, dai_data->fmt_event.status); - - return ret; -} - -static ssize_t msm_dai_q6_spdif_sysfs_rda_audio_format(struct device *dev, - struct device_attribute *attr, char *buf) -{ - ssize_t ret; - struct msm_dai_q6_spdif_dai_data *dai_data = dev_get_drvdata(dev); - - if (!dai_data) { - pr_err("%s: invalid input\n", __func__); - return -EINVAL; - } - - ret = snprintf(buf, MSM_DAI_SYSFS_ENTRY_MAX_LEN, "%d\n", - dai_data->fmt_event.data_format); - pr_debug("%s: '%d'\n", __func__, dai_data->fmt_event.data_format); - - return ret; -} - -static ssize_t msm_dai_q6_spdif_sysfs_rda_audio_rate(struct device *dev, - struct device_attribute *attr, char *buf) -{ - ssize_t ret; - struct msm_dai_q6_spdif_dai_data *dai_data = dev_get_drvdata(dev); - - if (!dai_data) { - pr_err("%s: invalid input\n", __func__); - return -EINVAL; - } - - ret = snprintf(buf, MSM_DAI_SYSFS_ENTRY_MAX_LEN, "%d\n", - dai_data->fmt_event.sample_rate); - pr_debug("%s: '%d'\n", __func__, dai_data->fmt_event.sample_rate); - - return ret; -} - -static ssize_t msm_dai_q6_spdif_sysfs_rda_audio_preemph(struct device *dev, - struct device_attribute *attr, char *buf) -{ - ssize_t ret; - struct msm_dai_q6_spdif_dai_data *dai_data = dev_get_drvdata(dev); - int preemph = 0; - - if (!dai_data) { - pr_err("%s: invalid input\n", __func__); - return -EINVAL; - } - - preemph = GET_PREEMPH(dai_data->fmt_event.channel_status[0]); - - ret = snprintf(buf, MSM_DAI_SYSFS_ENTRY_MAX_LEN, "%d\n", preemph); - pr_debug("%s: '%d'\n", __func__, preemph); - - return ret; -} - -static DEVICE_ATTR(audio_state, 0444, msm_dai_q6_spdif_sysfs_rda_audio_state, - NULL); -static DEVICE_ATTR(audio_format, 0444, msm_dai_q6_spdif_sysfs_rda_audio_format, - NULL); -static DEVICE_ATTR(audio_rate, 0444, msm_dai_q6_spdif_sysfs_rda_audio_rate, - NULL); -static DEVICE_ATTR(audio_preemph, 0444, - msm_dai_q6_spdif_sysfs_rda_audio_preemph, NULL); - -static struct attribute *msm_dai_q6_spdif_fs_attrs[] = { - &dev_attr_audio_state.attr, - &dev_attr_audio_format.attr, - &dev_attr_audio_rate.attr, - &dev_attr_audio_preemph.attr, - NULL, -}; -static struct attribute_group msm_dai_q6_spdif_fs_attrs_group = { - .attrs = msm_dai_q6_spdif_fs_attrs, -}; - -static int msm_dai_q6_spdif_sysfs_create(struct snd_soc_dai *dai, - struct msm_dai_q6_spdif_dai_data *dai_data) -{ - int rc; - - rc = sysfs_create_group(&dai->dev->kobj, - &msm_dai_q6_spdif_fs_attrs_group); - if (rc) { - pr_err("%s: failed, rc=%d\n", __func__, rc); - return rc; - } - dai_data->kobj = &dai->dev->kobj; - - return 0; -} - -static void msm_dai_q6_spdif_sysfs_remove(struct snd_soc_dai *dai, - struct msm_dai_q6_spdif_dai_data *dai_data) -{ - if (dai_data->kobj) - sysfs_remove_group(dai_data->kobj, - &msm_dai_q6_spdif_fs_attrs_group); - dai_data->kobj = NULL; -} - -static int msm_dai_q6_spdif_dai_probe(struct snd_soc_dai *dai) -{ - struct msm_dai_q6_spdif_dai_data *dai_data; - int rc = 0; - struct snd_soc_dapm_route intercon; - struct snd_soc_dapm_context *dapm; - - if (!dai) { - pr_err("%s: dai not found!!\n", __func__); - return -EINVAL; - } - if (!dai->dev) { - pr_err("%s: Invalid params dai dev\n", __func__); - return -EINVAL; - } - - dai_data = kzalloc(sizeof(struct msm_dai_q6_spdif_dai_data), - GFP_KERNEL); - - if (!dai_data) - return -ENOMEM; - else - dev_set_drvdata(dai->dev, dai_data); - - msm_dai_q6_set_dai_id(dai); - dai_data->port_id = dai->id; - - switch (dai->id) { - case AFE_PORT_ID_PRIMARY_SPDIF_RX: - rc = snd_ctl_add(dai->component->card->snd_card, - snd_ctl_new1(&spdif_rx_config_controls[1], - dai_data)); - break; - case AFE_PORT_ID_SECONDARY_SPDIF_RX: - rc = snd_ctl_add(dai->component->card->snd_card, - snd_ctl_new1(&spdif_rx_config_controls[3], - dai_data)); - break; - case AFE_PORT_ID_PRIMARY_SPDIF_TX: - rc = msm_dai_q6_spdif_sysfs_create(dai, dai_data); - - rc = snd_ctl_add(dai->component->card->snd_card, - snd_ctl_new1(&spdif_tx_config_controls[0], - dai_data)); - rc = snd_ctl_add(dai->component->card->snd_card, - snd_ctl_new1(&spdif_tx_config_controls[1], - dai_data)); - break; - case AFE_PORT_ID_SECONDARY_SPDIF_TX: - rc = msm_dai_q6_spdif_sysfs_create(dai, dai_data); - - rc = snd_ctl_add(dai->component->card->snd_card, - snd_ctl_new1(&spdif_tx_config_controls[2], - dai_data)); - rc = snd_ctl_add(dai->component->card->snd_card, - snd_ctl_new1(&spdif_tx_config_controls[3], - dai_data)); - break; - } - if (rc < 0) - dev_err(dai->dev, - "%s: err add config ctl, DAI = %s\n", - __func__, dai->name); - - dapm = snd_soc_component_get_dapm(dai->component); - - memset(&intercon, 0, sizeof(intercon)); - if (!rc && dai && dai->driver) { - if (dai->driver->playback.stream_name && - dai->driver->playback.aif_name) { - dev_dbg(dai->dev, "%s: add route for widget %s", - __func__, dai->driver->playback.stream_name); - intercon.source = dai->driver->playback.aif_name; - intercon.sink = dai->driver->playback.stream_name; - dev_dbg(dai->dev, "%s: src %s sink %s\n", - __func__, intercon.source, intercon.sink); - snd_soc_dapm_add_routes(dapm, &intercon, 1); - } - if (dai->driver->capture.stream_name && - dai->driver->capture.aif_name) { - dev_dbg(dai->dev, "%s: add route for widget %s", - __func__, dai->driver->capture.stream_name); - intercon.sink = dai->driver->capture.aif_name; - intercon.source = dai->driver->capture.stream_name; - dev_dbg(dai->dev, "%s: src %s sink %s\n", - __func__, intercon.source, intercon.sink); - snd_soc_dapm_add_routes(dapm, &intercon, 1); - } - } - return rc; -} - -static int msm_dai_q6_spdif_dai_remove(struct snd_soc_dai *dai) -{ - struct msm_dai_q6_spdif_dai_data *dai_data; - int rc; - - dai_data = dev_get_drvdata(dai->dev); - - /* If AFE port is still up, close it */ - if (test_bit(STATUS_PORT_STARTED, dai_data->status_mask)) { - rc = afe_spdif_reg_event_cfg(dai->id, - AFE_MODULE_DEREGISTER_EVENT_FLAG, - NULL, - dai_data); - if (rc < 0) - dev_err(dai->dev, - "fail to deregister event for port 0x%x\n", - dai->id); - - rc = afe_close(dai->id); /* can block */ - if (rc < 0) - dev_err(dai->dev, "fail to close AFE port\n"); - - clear_bit(STATUS_PORT_STARTED, dai_data->status_mask); - } - - msm_dai_q6_spdif_sysfs_remove(dai, dai_data); - - kfree(dai_data); - - return 0; -} - - -static struct snd_soc_dai_ops msm_dai_q6_spdif_ops = { - .prepare = msm_dai_q6_spdif_prepare, - .hw_params = msm_dai_q6_spdif_hw_params, - .shutdown = msm_dai_q6_spdif_shutdown, -}; - -static struct snd_soc_dai_driver msm_dai_q6_spdif_spdif_rx_dai[] = { - { - .playback = { - .stream_name = "Primary SPDIF Playback", - .aif_name = "PRI_SPDIF_RX", - .rates = SNDRV_PCM_RATE_32000 | - SNDRV_PCM_RATE_44100 | - SNDRV_PCM_RATE_48000 | - SNDRV_PCM_RATE_88200 | - SNDRV_PCM_RATE_96000 | - SNDRV_PCM_RATE_176400 | - SNDRV_PCM_RATE_192000, - .formats = SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE, - .channels_min = 1, - .channels_max = 2, - .rate_min = 32000, - .rate_max = 192000, - }, - .name = "PRI_SPDIF_RX", - .ops = &msm_dai_q6_spdif_ops, - .id = AFE_PORT_ID_PRIMARY_SPDIF_RX, - .probe = msm_dai_q6_spdif_dai_probe, - .remove = msm_dai_q6_spdif_dai_remove, - }, - { - .playback = { - .stream_name = "Secondary SPDIF Playback", - .aif_name = "SEC_SPDIF_RX", - .rates = SNDRV_PCM_RATE_32000 | - SNDRV_PCM_RATE_44100 | - SNDRV_PCM_RATE_48000 | - SNDRV_PCM_RATE_88200 | - SNDRV_PCM_RATE_96000 | - SNDRV_PCM_RATE_176400 | - SNDRV_PCM_RATE_192000, - .formats = SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE, - .channels_min = 1, - .channels_max = 2, - .rate_min = 32000, - .rate_max = 192000, - }, - .name = "SEC_SPDIF_RX", - .ops = &msm_dai_q6_spdif_ops, - .id = AFE_PORT_ID_SECONDARY_SPDIF_RX, - .probe = msm_dai_q6_spdif_dai_probe, - .remove = msm_dai_q6_spdif_dai_remove, - }, -}; - -static struct snd_soc_dai_driver msm_dai_q6_spdif_spdif_tx_dai[] = { - { - .capture = { - .stream_name = "Primary SPDIF Capture", - .aif_name = "PRI_SPDIF_TX", - .rates = SNDRV_PCM_RATE_32000 | - SNDRV_PCM_RATE_44100 | - SNDRV_PCM_RATE_48000 | - SNDRV_PCM_RATE_88200 | - SNDRV_PCM_RATE_96000 | - SNDRV_PCM_RATE_176400 | - SNDRV_PCM_RATE_192000, - .formats = SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE, - .channels_min = 1, - .channels_max = 2, - .rate_min = 32000, - .rate_max = 192000, - }, - .name = "PRI_SPDIF_TX", - .ops = &msm_dai_q6_spdif_ops, - .id = AFE_PORT_ID_PRIMARY_SPDIF_TX, - .probe = msm_dai_q6_spdif_dai_probe, - .remove = msm_dai_q6_spdif_dai_remove, - }, - { - .capture = { - .stream_name = "Secondary SPDIF Capture", - .aif_name = "SEC_SPDIF_TX", - .rates = SNDRV_PCM_RATE_32000 | - SNDRV_PCM_RATE_44100 | - SNDRV_PCM_RATE_48000 | - SNDRV_PCM_RATE_88200 | - SNDRV_PCM_RATE_96000 | - SNDRV_PCM_RATE_176400 | - SNDRV_PCM_RATE_192000, - .formats = SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE, - .channels_min = 1, - .channels_max = 2, - .rate_min = 32000, - .rate_max = 192000, - }, - .name = "SEC_SPDIF_TX", - .ops = &msm_dai_q6_spdif_ops, - .id = AFE_PORT_ID_SECONDARY_SPDIF_TX, - .probe = msm_dai_q6_spdif_dai_probe, - .remove = msm_dai_q6_spdif_dai_remove, - }, -}; - -static const struct snd_soc_component_driver msm_dai_spdif_q6_component = { - .name = "msm-dai-q6-spdif", -}; - -static int msm_dai_q6_prepare(struct snd_pcm_substream *substream, - struct snd_soc_dai *dai) -{ - struct msm_dai_q6_dai_data *dai_data = dev_get_drvdata(dai->dev); - int rc = 0; - - if (!test_bit(STATUS_PORT_STARTED, dai_data->status_mask)) { - if (dai_data->enc_config.format != ENC_FMT_NONE) { - int bitwidth = 0; - - switch (dai_data->afe_rx_in_bitformat) { - case SNDRV_PCM_FORMAT_S32_LE: - bitwidth = 32; - break; - case SNDRV_PCM_FORMAT_S24_LE: - bitwidth = 24; - break; - case SNDRV_PCM_FORMAT_S16_LE: - default: - bitwidth = 16; - break; - } - pr_debug("%s: calling AFE_PORT_START_V2 with enc_format: %d\n", - __func__, dai_data->enc_config.format); - rc = afe_port_start_v2(dai->id, &dai_data->port_config, - dai_data->rate, - dai_data->afe_rx_in_channels, - bitwidth, - &dai_data->enc_config, NULL); - if (rc < 0) - pr_err("%s: afe_port_start_v2 failed error: %d\n", - __func__, rc); - } else if (dai_data->dec_config.format != DEC_FMT_NONE) { - int bitwidth = 0; - - /* - * If bitwidth is not configured set default value to - * zero, so that decoder port config uses slim device - * bit width value in afe decoder config. - */ - switch (dai_data->afe_tx_out_bitformat) { - case SNDRV_PCM_FORMAT_S32_LE: - bitwidth = 32; - break; - case SNDRV_PCM_FORMAT_S24_LE: - bitwidth = 24; - break; - case SNDRV_PCM_FORMAT_S16_LE: - bitwidth = 16; - break; - default: - bitwidth = 0; - break; - } - pr_debug("%s: calling AFE_PORT_START_V2 with dec format: %d\n", - __func__, dai_data->dec_config.format); - rc = afe_port_start_v2(dai->id, &dai_data->port_config, - dai_data->rate, - dai_data->afe_tx_out_channels, - bitwidth, - NULL, &dai_data->dec_config); - if (rc < 0) { - pr_err("%s: fail to open AFE port 0x%x\n", - __func__, dai->id); - } - } else { - rc = afe_port_start(dai->id, &dai_data->port_config, - dai_data->rate); - } - if (rc < 0) - dev_err(dai->dev, "fail to open AFE port 0x%x\n", - dai->id); - else - set_bit(STATUS_PORT_STARTED, - dai_data->status_mask); - } - return rc; -} - -static int msm_dai_q6_cdc_hw_params(struct snd_pcm_hw_params *params, - struct snd_soc_dai *dai, int stream) -{ - struct msm_dai_q6_dai_data *dai_data = dev_get_drvdata(dai->dev); - - dai_data->channels = params_channels(params); - switch (dai_data->channels) { - case 2: - dai_data->port_config.i2s.mono_stereo = MSM_AFE_STEREO; - break; - case 1: - dai_data->port_config.i2s.mono_stereo = MSM_AFE_MONO; - break; - default: - return -EINVAL; - pr_err("%s: err channels %d\n", - __func__, dai_data->channels); - break; - } - - switch (params_format(params)) { - case SNDRV_PCM_FORMAT_S16_LE: - case SNDRV_PCM_FORMAT_SPECIAL: - dai_data->port_config.i2s.bit_width = 16; - break; - case SNDRV_PCM_FORMAT_S24_LE: - case SNDRV_PCM_FORMAT_S24_3LE: - dai_data->port_config.i2s.bit_width = 24; - break; - default: - pr_err("%s: format %d\n", - __func__, params_format(params)); - return -EINVAL; - } - - dai_data->rate = params_rate(params); - dai_data->port_config.i2s.sample_rate = dai_data->rate; - dai_data->port_config.i2s.i2s_cfg_minor_version = - AFE_API_VERSION_I2S_CONFIG; - dai_data->port_config.i2s.data_format = AFE_LINEAR_PCM_DATA; - dev_dbg(dai->dev, " channel %d sample rate %d entered\n", - dai_data->channels, dai_data->rate); - - dai_data->port_config.i2s.channel_mode = 1; - return 0; -} - static u16 num_of_bits_set(u16 sd_line_mask) { u8 num_bits_set = 0; @@ -2362,1996 +1243,6 @@ static u16 num_of_bits_set(u16 sd_line_mask) return num_bits_set; } -static int msm_dai_q6_i2s_hw_params(struct snd_pcm_hw_params *params, - struct snd_soc_dai *dai, int stream) -{ - struct msm_dai_q6_dai_data *dai_data = dev_get_drvdata(dai->dev); - struct msm_i2s_data *i2s_pdata = - (struct msm_i2s_data *) dai->dev->platform_data; - - dai_data->channels = params_channels(params); - if (num_of_bits_set(i2s_pdata->sd_lines) == 1) { - switch (dai_data->channels) { - case 2: - dai_data->port_config.i2s.mono_stereo = MSM_AFE_STEREO; - break; - case 1: - dai_data->port_config.i2s.mono_stereo = MSM_AFE_MONO; - break; - default: - pr_warn("%s: greater than stereo has not been validated %d", - __func__, dai_data->channels); - break; - } - } - dai_data->rate = params_rate(params); - dai_data->port_config.i2s.sample_rate = dai_data->rate; - dai_data->port_config.i2s.i2s_cfg_minor_version = - AFE_API_VERSION_I2S_CONFIG; - dai_data->port_config.i2s.data_format = AFE_LINEAR_PCM_DATA; - /* Q6 only supports 16 as now */ - dai_data->port_config.i2s.bit_width = 16; - dai_data->port_config.i2s.channel_mode = 1; - - return 0; -} - -static int msm_dai_q6_slim_bus_hw_params(struct snd_pcm_hw_params *params, - struct snd_soc_dai *dai, int stream) -{ - struct msm_dai_q6_dai_data *dai_data = dev_get_drvdata(dai->dev); - - dai_data->channels = params_channels(params); - dai_data->rate = params_rate(params); - - switch (params_format(params)) { - case SNDRV_PCM_FORMAT_S16_LE: - case SNDRV_PCM_FORMAT_SPECIAL: - dai_data->port_config.slim_sch.bit_width = 16; - break; - case SNDRV_PCM_FORMAT_S24_LE: - case SNDRV_PCM_FORMAT_S24_3LE: - dai_data->port_config.slim_sch.bit_width = 24; - break; - case SNDRV_PCM_FORMAT_S32_LE: - dai_data->port_config.slim_sch.bit_width = 32; - break; - default: - pr_err("%s: format %d\n", - __func__, params_format(params)); - return -EINVAL; - } - - dai_data->port_config.slim_sch.sb_cfg_minor_version = - AFE_API_VERSION_SLIMBUS_CONFIG; - dai_data->port_config.slim_sch.sample_rate = dai_data->rate; - dai_data->port_config.slim_sch.num_channels = dai_data->channels; - - dev_dbg(dai->dev, "%s:slimbus_dev_id[%hu] bit_wd[%hu] format[%hu]\n" - "num_channel %hu shared_ch_mapping[0] %hu\n" - "slave_port_mapping[1] %hu slave_port_mapping[2] %hu\n" - "sample_rate %d\n", __func__, - dai_data->port_config.slim_sch.slimbus_dev_id, - dai_data->port_config.slim_sch.bit_width, - dai_data->port_config.slim_sch.data_format, - dai_data->port_config.slim_sch.num_channels, - dai_data->port_config.slim_sch.shared_ch_mapping[0], - dai_data->port_config.slim_sch.shared_ch_mapping[1], - dai_data->port_config.slim_sch.shared_ch_mapping[2], - dai_data->rate); - - return 0; -} - -static int msm_dai_q6_usb_audio_hw_params(struct snd_pcm_hw_params *params, - struct snd_soc_dai *dai, int stream) -{ - struct msm_dai_q6_dai_data *dai_data = dev_get_drvdata(dai->dev); - - dai_data->channels = params_channels(params); - dai_data->rate = params_rate(params); - - switch (params_format(params)) { - case SNDRV_PCM_FORMAT_S16_LE: - case SNDRV_PCM_FORMAT_SPECIAL: - dai_data->port_config.usb_audio.bit_width = 16; - break; - case SNDRV_PCM_FORMAT_S24_LE: - case SNDRV_PCM_FORMAT_S24_3LE: - dai_data->port_config.usb_audio.bit_width = 24; - break; - case SNDRV_PCM_FORMAT_S32_LE: - dai_data->port_config.usb_audio.bit_width = 32; - break; - - default: - dev_err(dai->dev, "%s: invalid format %d\n", - __func__, params_format(params)); - return -EINVAL; - } - dai_data->port_config.usb_audio.cfg_minor_version = - AFE_API_MINOR_VERSION_USB_AUDIO_CONFIG; - dai_data->port_config.usb_audio.num_channels = dai_data->channels; - dai_data->port_config.usb_audio.sample_rate = dai_data->rate; - - dev_dbg(dai->dev, "%s: dev_id[0x%x] bit_wd[%hu] format[%hu]\n" - "num_channel %hu sample_rate %d\n", __func__, - dai_data->port_config.usb_audio.dev_token, - dai_data->port_config.usb_audio.bit_width, - dai_data->port_config.usb_audio.data_format, - dai_data->port_config.usb_audio.num_channels, - dai_data->port_config.usb_audio.sample_rate); - - return 0; -} - -static int msm_dai_q6_bt_fm_hw_params(struct snd_pcm_hw_params *params, - struct snd_soc_dai *dai, int stream) -{ - struct msm_dai_q6_dai_data *dai_data = dev_get_drvdata(dai->dev); - - dai_data->channels = params_channels(params); - dai_data->rate = params_rate(params); - - dev_dbg(dai->dev, "channels %d sample rate %d entered\n", - dai_data->channels, dai_data->rate); - - memset(&dai_data->port_config, 0, sizeof(dai_data->port_config)); - - pr_debug("%s: setting bt_fm parameters\n", __func__); - - dai_data->port_config.int_bt_fm.bt_fm_cfg_minor_version = - AFE_API_VERSION_INTERNAL_BT_FM_CONFIG; - dai_data->port_config.int_bt_fm.num_channels = dai_data->channels; - dai_data->port_config.int_bt_fm.sample_rate = dai_data->rate; - dai_data->port_config.int_bt_fm.bit_width = 16; - - return 0; -} - -static int msm_dai_q6_afe_rtproxy_hw_params(struct snd_pcm_hw_params *params, - struct snd_soc_dai *dai) -{ - struct msm_dai_q6_dai_data *dai_data = dev_get_drvdata(dai->dev); - - dai_data->rate = params_rate(params); - dai_data->port_config.rtproxy.num_channels = params_channels(params); - dai_data->port_config.rtproxy.sample_rate = params_rate(params); - - pr_debug("channel %d entered,dai_id: %d,rate: %d\n", - dai_data->port_config.rtproxy.num_channels, dai->id, dai_data->rate); - - dai_data->port_config.rtproxy.rt_proxy_cfg_minor_version = - AFE_API_VERSION_RT_PROXY_CONFIG; - dai_data->port_config.rtproxy.bit_width = 16; /* Q6 only supports 16 */ - dai_data->port_config.rtproxy.interleaved = 1; - dai_data->port_config.rtproxy.frame_size = params_period_bytes(params); - dai_data->port_config.rtproxy.jitter_allowance = - dai_data->port_config.rtproxy.frame_size/2; - dai_data->port_config.rtproxy.low_water_mark = 0; - dai_data->port_config.rtproxy.high_water_mark = 0; - - return 0; -} - -static int msm_dai_q6_pseudo_port_hw_params(struct snd_pcm_hw_params *params, - struct snd_soc_dai *dai, int stream) -{ - struct msm_dai_q6_dai_data *dai_data = dev_get_drvdata(dai->dev); - - dai_data->channels = params_channels(params); - dai_data->rate = params_rate(params); - - /* Q6 only supports 16 as now */ - dai_data->port_config.pseudo_port.pseud_port_cfg_minor_version = - AFE_API_VERSION_PSEUDO_PORT_CONFIG; - dai_data->port_config.pseudo_port.num_channels = - params_channels(params); - dai_data->port_config.pseudo_port.bit_width = 16; - dai_data->port_config.pseudo_port.data_format = 0; - dai_data->port_config.pseudo_port.timing_mode = - AFE_PSEUDOPORT_TIMING_MODE_TIMER; - dai_data->port_config.pseudo_port.sample_rate = params_rate(params); - - dev_dbg(dai->dev, "%s: bit_wd[%hu] num_channels [%hu] format[%hu]\n" - "timing Mode %hu sample_rate %d\n", __func__, - dai_data->port_config.pseudo_port.bit_width, - dai_data->port_config.pseudo_port.num_channels, - dai_data->port_config.pseudo_port.data_format, - dai_data->port_config.pseudo_port.timing_mode, - dai_data->port_config.pseudo_port.sample_rate); - - return 0; -} - -/* Current implementation assumes hw_param is called once - * This may not be the case but what to do when ADM and AFE - * port are already opened and parameter changes - */ -static int msm_dai_q6_hw_params(struct snd_pcm_substream *substream, - struct snd_pcm_hw_params *params, - struct snd_soc_dai *dai) -{ - int rc = 0; - - switch (dai->id) { - case PRIMARY_I2S_TX: - case PRIMARY_I2S_RX: - case SECONDARY_I2S_RX: - rc = msm_dai_q6_cdc_hw_params(params, dai, substream->stream); - break; - case MI2S_RX: - rc = msm_dai_q6_i2s_hw_params(params, dai, substream->stream); - break; - case SLIMBUS_0_RX: - case SLIMBUS_1_RX: - case SLIMBUS_2_RX: - case SLIMBUS_3_RX: - case SLIMBUS_4_RX: - case SLIMBUS_5_RX: - case SLIMBUS_6_RX: - case SLIMBUS_7_RX: - case SLIMBUS_8_RX: - case SLIMBUS_9_RX: - case SLIMBUS_0_TX: - case SLIMBUS_1_TX: - case SLIMBUS_2_TX: - case SLIMBUS_3_TX: - case SLIMBUS_4_TX: - case SLIMBUS_5_TX: - case SLIMBUS_6_TX: - case SLIMBUS_7_TX: - case SLIMBUS_8_TX: - case SLIMBUS_9_TX: - rc = msm_dai_q6_slim_bus_hw_params(params, dai, - substream->stream); - break; - case INT_BT_SCO_RX: - case INT_BT_SCO_TX: - case INT_BT_A2DP_RX: - case INT_FM_RX: - case INT_FM_TX: - rc = msm_dai_q6_bt_fm_hw_params(params, dai, substream->stream); - break; - case AFE_PORT_ID_USB_RX: - case AFE_PORT_ID_USB_TX: - rc = msm_dai_q6_usb_audio_hw_params(params, dai, - substream->stream); - break; - case RT_PROXY_DAI_001_TX: - case RT_PROXY_DAI_001_RX: - case RT_PROXY_DAI_002_TX: - case RT_PROXY_DAI_002_RX: - case RT_PROXY_DAI_003_TX: - case RT_PROXY_PORT_002_TX: - case RT_PROXY_PORT_002_RX: - rc = msm_dai_q6_afe_rtproxy_hw_params(params, dai); - break; - case VOICE_PLAYBACK_TX: - case VOICE2_PLAYBACK_TX: - case VOICE_RECORD_RX: - case VOICE_RECORD_TX: - rc = msm_dai_q6_pseudo_port_hw_params(params, - dai, substream->stream); - break; - default: - dev_err(dai->dev, "invalid AFE port ID 0x%x\n", dai->id); - rc = -EINVAL; - break; - } - - return rc; -} - -static void msm_dai_q6_shutdown(struct snd_pcm_substream *substream, - struct snd_soc_dai *dai) -{ - struct msm_dai_q6_dai_data *dai_data = dev_get_drvdata(dai->dev); - int rc = 0; - - if (test_bit(STATUS_PORT_STARTED, dai_data->status_mask)) { - pr_debug("%s: stop pseudo port:%d\n", __func__, dai->id); - rc = afe_close(dai->id); /* can block */ - if (rc < 0) - dev_err(dai->dev, "fail to close AFE port\n"); - pr_debug("%s: dai_data->status_mask = %ld\n", __func__, - *dai_data->status_mask); - clear_bit(STATUS_PORT_STARTED, dai_data->status_mask); - } -} - -static int msm_dai_q6_cdc_set_fmt(struct snd_soc_dai *dai, unsigned int fmt) -{ - struct msm_dai_q6_dai_data *dai_data = dev_get_drvdata(dai->dev); - - switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) { - case SND_SOC_DAIFMT_CBS_CFS: - dai_data->port_config.i2s.ws_src = 1; /* CPU is master */ - break; - case SND_SOC_DAIFMT_CBM_CFM: - dai_data->port_config.i2s.ws_src = 0; /* CPU is slave */ - break; - default: - pr_err("%s: fmt 0x%x\n", - __func__, fmt & SND_SOC_DAIFMT_MASTER_MASK); - return -EINVAL; - } - - return 0; -} - -static int msm_dai_q6_set_fmt(struct snd_soc_dai *dai, unsigned int fmt) -{ - int rc = 0; - - dev_dbg(dai->dev, "%s: id = %d fmt[%d]\n", __func__, - dai->id, fmt); - switch (dai->id) { - case PRIMARY_I2S_TX: - case PRIMARY_I2S_RX: - case MI2S_RX: - case SECONDARY_I2S_RX: - rc = msm_dai_q6_cdc_set_fmt(dai, fmt); - break; - default: - dev_err(dai->dev, "invalid cpu_dai id 0x%x\n", dai->id); - rc = -EINVAL; - break; - } - - return rc; -} - -static int msm_dai_q6_set_channel_map(struct snd_soc_dai *dai, - unsigned int tx_num, unsigned int *tx_slot, - unsigned int rx_num, unsigned int *rx_slot) - -{ - int rc = 0; - struct msm_dai_q6_dai_data *dai_data = dev_get_drvdata(dai->dev); - unsigned int i = 0; - - dev_dbg(dai->dev, "%s: id = %d\n", __func__, dai->id); - switch (dai->id) { - case SLIMBUS_0_RX: - case SLIMBUS_1_RX: - case SLIMBUS_2_RX: - case SLIMBUS_3_RX: - case SLIMBUS_4_RX: - case SLIMBUS_5_RX: - case SLIMBUS_6_RX: - case SLIMBUS_7_RX: - case SLIMBUS_8_RX: - case SLIMBUS_9_RX: - /* - * channel number to be between 128 and 255. - * For RX port use channel numbers - * from 138 to 144 for pre-Taiko - * from 144 to 159 for Taiko - */ - if (!rx_slot) { - pr_err("%s: rx slot not found\n", __func__); - return -EINVAL; - } - if (rx_num > AFE_PORT_MAX_AUDIO_CHAN_CNT) { - pr_err("%s: invalid rx num %d\n", __func__, rx_num); - return -EINVAL; - } - - for (i = 0; i < rx_num; i++) { - dai_data->port_config.slim_sch.shared_ch_mapping[i] = - rx_slot[i]; - pr_debug("%s: find number of channels[%d] ch[%d]\n", - __func__, i, rx_slot[i]); - } - dai_data->port_config.slim_sch.num_channels = rx_num; - pr_debug("%s: SLIMBUS_%d_RX cnt[%d] ch[%d %d]\n", __func__, - (dai->id - SLIMBUS_0_RX) / 2, rx_num, - dai_data->port_config.slim_sch.shared_ch_mapping[0], - dai_data->port_config.slim_sch.shared_ch_mapping[1]); - - break; - case SLIMBUS_0_TX: - case SLIMBUS_1_TX: - case SLIMBUS_2_TX: - case SLIMBUS_3_TX: - case SLIMBUS_4_TX: - case SLIMBUS_5_TX: - case SLIMBUS_6_TX: - case SLIMBUS_7_TX: - case SLIMBUS_8_TX: - case SLIMBUS_9_TX: - /* - * channel number to be between 128 and 255. - * For TX port use channel numbers - * from 128 to 137 for pre-Taiko - * from 128 to 143 for Taiko - */ - if (!tx_slot) { - pr_err("%s: tx slot not found\n", __func__); - return -EINVAL; - } - if (tx_num > AFE_PORT_MAX_AUDIO_CHAN_CNT) { - pr_err("%s: invalid tx num %d\n", __func__, tx_num); - return -EINVAL; - } - - for (i = 0; i < tx_num; i++) { - dai_data->port_config.slim_sch.shared_ch_mapping[i] = - tx_slot[i]; - pr_debug("%s: find number of channels[%d] ch[%d]\n", - __func__, i, tx_slot[i]); - } - dai_data->port_config.slim_sch.num_channels = tx_num; - pr_debug("%s:SLIMBUS_%d_TX cnt[%d] ch[%d %d]\n", __func__, - (dai->id - SLIMBUS_0_TX) / 2, tx_num, - dai_data->port_config.slim_sch.shared_ch_mapping[0], - dai_data->port_config.slim_sch.shared_ch_mapping[1]); - break; - default: - dev_err(dai->dev, "invalid cpu_dai id 0x%x\n", dai->id); - rc = -EINVAL; - break; - } - return rc; -} - -/* all ports with excursion logging requirement can use this digital_mute api */ -static int msm_dai_q6_spk_digital_mute(struct snd_soc_dai *dai, - int mute) -{ - int port_id = dai->id; - struct msm_dai_q6_dai_data *dai_data = dev_get_drvdata(dai->dev); - - if (mute && !dai_data->xt_logging_disable) - afe_get_sp_xt_logging_data(port_id); - - return 0; -} - -static struct snd_soc_dai_ops msm_dai_q6_ops = { - .prepare = msm_dai_q6_prepare, - .hw_params = msm_dai_q6_hw_params, - .shutdown = msm_dai_q6_shutdown, - .set_fmt = msm_dai_q6_set_fmt, - .set_channel_map = msm_dai_q6_set_channel_map, -}; - -static struct snd_soc_dai_ops msm_dai_slimbus_0_rx_ops = { - .prepare = msm_dai_q6_prepare, - .hw_params = msm_dai_q6_hw_params, - .shutdown = msm_dai_q6_shutdown, - .set_fmt = msm_dai_q6_set_fmt, - .set_channel_map = msm_dai_q6_set_channel_map, - .digital_mute = msm_dai_q6_spk_digital_mute, -}; - -static int msm_dai_q6_cal_info_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct msm_dai_q6_dai_data *dai_data = kcontrol->private_data; - u16 port_id = ((struct soc_enum *) - kcontrol->private_value)->reg; - - dai_data->cal_mode = ucontrol->value.integer.value[0]; - pr_debug("%s: setting cal_mode to %d\n", - __func__, dai_data->cal_mode); - afe_set_cal_mode(port_id, dai_data->cal_mode); - - return 0; -} - -static int msm_dai_q6_cal_info_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct msm_dai_q6_dai_data *dai_data = kcontrol->private_data; - - ucontrol->value.integer.value[0] = dai_data->cal_mode; - return 0; -} - -static int msm_dai_q6_cdc_dma_xt_logging_disable_put( - struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct msm_dai_q6_cdc_dma_dai_data *dai_data = kcontrol->private_data; - - if (dai_data) { - dai_data->xt_logging_disable = ucontrol->value.integer.value[0]; - pr_debug("%s: setting xt logging disable to %d\n", - __func__, dai_data->xt_logging_disable); - } - - return 0; -} - -static int msm_dai_q6_cdc_dma_xt_logging_disable_get( - struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct msm_dai_q6_cdc_dma_dai_data *dai_data = kcontrol->private_data; - - if (dai_data) - ucontrol->value.integer.value[0] = dai_data->xt_logging_disable; - return 0; -} - -static int msm_dai_q6_sb_xt_logging_disable_put( - struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct msm_dai_q6_dai_data *dai_data = kcontrol->private_data; - - if (dai_data) { - dai_data->xt_logging_disable = ucontrol->value.integer.value[0]; - pr_debug("%s: setting xt logging disable to %d\n", - __func__, dai_data->xt_logging_disable); - } - - return 0; -} - -static int msm_dai_q6_sb_xt_logging_disable_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct msm_dai_q6_dai_data *dai_data = kcontrol->private_data; - - if (dai_data) - ucontrol->value.integer.value[0] = dai_data->xt_logging_disable; - return 0; -} - -static int msm_dai_q6_sb_format_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct msm_dai_q6_dai_data *dai_data = kcontrol->private_data; - int value = ucontrol->value.integer.value[0]; - - if (dai_data) { - dai_data->port_config.slim_sch.data_format = value; - pr_debug("%s: format = %d\n", __func__, value); - } - - return 0; -} - -static int msm_dai_q6_sb_format_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct msm_dai_q6_dai_data *dai_data = kcontrol->private_data; - - if (dai_data) - ucontrol->value.integer.value[0] = - dai_data->port_config.slim_sch.data_format; - - return 0; -} - -static int msm_dai_q6_usb_audio_cfg_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct msm_dai_q6_dai_data *dai_data = kcontrol->private_data; - u32 val = ucontrol->value.integer.value[0]; - - if (dai_data) { - dai_data->port_config.usb_audio.dev_token = val; - pr_debug("%s: dev_token = 0x%x\n", __func__, - dai_data->port_config.usb_audio.dev_token); - } else { - pr_err("%s: dai_data is NULL\n", __func__); - } - - return 0; -} - -static int msm_dai_q6_usb_audio_cfg_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct msm_dai_q6_dai_data *dai_data = kcontrol->private_data; - - if (dai_data) { - ucontrol->value.integer.value[0] = - dai_data->port_config.usb_audio.dev_token; - pr_debug("%s: dev_token = 0x%x\n", __func__, - dai_data->port_config.usb_audio.dev_token); - } else { - pr_err("%s: dai_data is NULL\n", __func__); - } - - return 0; -} - -static int msm_dai_q6_usb_audio_endian_cfg_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct msm_dai_q6_dai_data *dai_data = kcontrol->private_data; - u32 val = ucontrol->value.integer.value[0]; - - if (dai_data) { - dai_data->port_config.usb_audio.endian = val; - pr_debug("%s: endian = 0x%x\n", __func__, - dai_data->port_config.usb_audio.endian); - } else { - pr_err("%s: dai_data is NULL\n", __func__); - return -EINVAL; - } - - return 0; -} - -static int msm_dai_q6_usb_audio_endian_cfg_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct msm_dai_q6_dai_data *dai_data = kcontrol->private_data; - - if (dai_data) { - ucontrol->value.integer.value[0] = - dai_data->port_config.usb_audio.endian; - pr_debug("%s: endian = 0x%x\n", __func__, - dai_data->port_config.usb_audio.endian); - } else { - pr_err("%s: dai_data is NULL\n", __func__); - return -EINVAL; - } - - return 0; -} - -static int msm_dai_q6_usb_audio_svc_interval_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct msm_dai_q6_dai_data *dai_data = kcontrol->private_data; - u32 val = ucontrol->value.integer.value[0]; - - if (!dai_data) { - pr_err("%s: dai_data is NULL\n", __func__); - return -EINVAL; - } - dai_data->port_config.usb_audio.service_interval = val; - pr_debug("%s: new service interval = %u\n", __func__, - dai_data->port_config.usb_audio.service_interval); - return 0; -} - -static int msm_dai_q6_usb_audio_svc_interval_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct msm_dai_q6_dai_data *dai_data = kcontrol->private_data; - - if (!dai_data) { - pr_err("%s: dai_data is NULL\n", __func__); - return -EINVAL; - } - ucontrol->value.integer.value[0] = - dai_data->port_config.usb_audio.service_interval; - pr_debug("%s: service interval = %d\n", __func__, - dai_data->port_config.usb_audio.service_interval); - return 0; -} - -static int msm_dai_q6_afe_enc_cfg_info(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_info *uinfo) -{ - uinfo->type = SNDRV_CTL_ELEM_TYPE_BYTES; - uinfo->count = sizeof(struct afe_enc_config); - - return 0; -} - -static int msm_dai_q6_afe_enc_cfg_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int ret = 0; - struct msm_dai_q6_dai_data *dai_data = kcontrol->private_data; - - if (dai_data) { - int format_size = sizeof(dai_data->enc_config.format); - - pr_debug("%s: encoder config for %d format\n", - __func__, dai_data->enc_config.format); - memcpy(ucontrol->value.bytes.data, - &dai_data->enc_config.format, - format_size); - switch (dai_data->enc_config.format) { - case ENC_FMT_SBC: - memcpy(ucontrol->value.bytes.data + format_size, - &dai_data->enc_config.data, - sizeof(struct asm_sbc_enc_cfg_t)); - break; - case ENC_FMT_AAC_V2: - memcpy(ucontrol->value.bytes.data + format_size, - &dai_data->enc_config.data, - sizeof(struct asm_aac_enc_cfg_t)); - break; - case ENC_FMT_APTX: - memcpy(ucontrol->value.bytes.data + format_size, - &dai_data->enc_config.data, - sizeof(struct asm_aptx_enc_cfg_t)); - break; - case ENC_FMT_APTX_HD: - memcpy(ucontrol->value.bytes.data + format_size, - &dai_data->enc_config.data, - sizeof(struct asm_custom_enc_cfg_t)); - break; - case ENC_FMT_CELT: - memcpy(ucontrol->value.bytes.data + format_size, - &dai_data->enc_config.data, - sizeof(struct asm_celt_enc_cfg_t)); - break; - case ENC_FMT_LDAC: - memcpy(ucontrol->value.bytes.data + format_size, - &dai_data->enc_config.data, - sizeof(struct asm_ldac_enc_cfg_t)); - break; - case ENC_FMT_APTX_ADAPTIVE: - memcpy(ucontrol->value.bytes.data + format_size, - &dai_data->enc_config.data, - sizeof(struct asm_aptx_ad_enc_cfg_t)); - break; - case ENC_FMT_APTX_AD_SPEECH: - memcpy(ucontrol->value.bytes.data + format_size, - &dai_data->enc_config.data, - sizeof(struct asm_aptx_ad_speech_enc_cfg_t)); - break; - - default: - pr_debug("%s: unknown format = %d\n", - __func__, dai_data->enc_config.format); - ret = -EINVAL; - break; - } - } - - return ret; -} - -static int msm_dai_q6_afe_enc_cfg_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int ret = 0; - struct msm_dai_q6_dai_data *dai_data = kcontrol->private_data; - - if (dai_data) { - int format_size = sizeof(dai_data->enc_config.format); - - memset(&dai_data->enc_config, 0x0, - sizeof(struct afe_enc_config)); - memcpy(&dai_data->enc_config.format, - ucontrol->value.bytes.data, - format_size); - pr_debug("%s: Received encoder config for %d format\n", - __func__, dai_data->enc_config.format); - switch (dai_data->enc_config.format) { - case ENC_FMT_SBC: - memcpy(&dai_data->enc_config.data, - ucontrol->value.bytes.data + format_size, - sizeof(struct asm_sbc_enc_cfg_t)); - break; - case ENC_FMT_AAC_V2: - memcpy(&dai_data->enc_config.data, - ucontrol->value.bytes.data + format_size, - sizeof(struct asm_aac_enc_cfg_t)); - break; - case ENC_FMT_APTX: - memcpy(&dai_data->enc_config.data, - ucontrol->value.bytes.data + format_size, - sizeof(struct asm_aptx_enc_cfg_t)); - break; - case ENC_FMT_APTX_HD: - memcpy(&dai_data->enc_config.data, - ucontrol->value.bytes.data + format_size, - sizeof(struct asm_custom_enc_cfg_t)); - break; - case ENC_FMT_CELT: - memcpy(&dai_data->enc_config.data, - ucontrol->value.bytes.data + format_size, - sizeof(struct asm_celt_enc_cfg_t)); - break; - case ENC_FMT_LDAC: - memcpy(&dai_data->enc_config.data, - ucontrol->value.bytes.data + format_size, - sizeof(struct asm_ldac_enc_cfg_t)); - break; - case ENC_FMT_APTX_ADAPTIVE: - memcpy(&dai_data->enc_config.data, - ucontrol->value.bytes.data + format_size, - sizeof(struct asm_aptx_ad_enc_cfg_t)); - break; - case ENC_FMT_APTX_AD_SPEECH: - memcpy(&dai_data->enc_config.data, - ucontrol->value.bytes.data + format_size, - sizeof(struct asm_aptx_ad_speech_enc_cfg_t)); - break; - - default: - pr_debug("%s: Ignore enc config for unknown format = %d\n", - __func__, dai_data->enc_config.format); - ret = -EINVAL; - break; - } - } else - ret = -EINVAL; - - return ret; -} - -static const char *const afe_chs_text[] = {"Zero", "One", "Two"}; - -static const struct soc_enum afe_chs_enum[] = { - SOC_ENUM_SINGLE_EXT(3, afe_chs_text), -}; - -static const char *const afe_bit_format_text[] = {"S16_LE", "S24_LE", - "S32_LE"}; - -static const struct soc_enum afe_bit_format_enum[] = { - SOC_ENUM_SINGLE_EXT(3, afe_bit_format_text), -}; - -static const char *const tws_chs_mode_text[] = {"Zero", "One", "Two"}; - -static const struct soc_enum tws_chs_mode_enum[] = { - SOC_ENUM_SINGLE_EXT(ARRAY_SIZE(tws_chs_mode_text), tws_chs_mode_text), -}; - -static int msm_dai_q6_afe_input_channel_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct msm_dai_q6_dai_data *dai_data = kcontrol->private_data; - - if (dai_data) { - ucontrol->value.integer.value[0] = dai_data->afe_rx_in_channels; - pr_debug("%s:afe input channel = %d\n", - __func__, dai_data->afe_rx_in_channels); - } - - return 0; -} - -static int msm_dai_q6_afe_input_channel_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct msm_dai_q6_dai_data *dai_data = kcontrol->private_data; - - if (dai_data) { - dai_data->afe_rx_in_channels = ucontrol->value.integer.value[0]; - pr_debug("%s: updating afe input channel : %d\n", - __func__, dai_data->afe_rx_in_channels); - } - - return 0; -} - -static int msm_dai_q6_tws_channel_mode_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_dai *dai = kcontrol->private_data; - struct msm_dai_q6_dai_data *dai_data = NULL; - - if (dai) - dai_data = dev_get_drvdata(dai->dev); - - if (dai_data) { - ucontrol->value.integer.value[0] = - dai_data->enc_config.mono_mode; - pr_debug("%s:tws channel mode = %d\n", - __func__, dai_data->enc_config.mono_mode); - } - - return 0; -} - -static int msm_dai_q6_tws_channel_mode_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_dai *dai = kcontrol->private_data; - struct msm_dai_q6_dai_data *dai_data = NULL; - int ret = 0; - u32 format = 0; - - if (dai) - dai_data = dev_get_drvdata(dai->dev); - - if (dai_data) - format = dai_data->enc_config.format; - else - goto exit; - - if (format == ENC_FMT_APTX || format == ENC_FMT_APTX_ADAPTIVE) { - if (test_bit(STATUS_PORT_STARTED, dai_data->status_mask)) { - ret = afe_set_tws_channel_mode(format, - dai->id, ucontrol->value.integer.value[0]); - if (ret < 0) { - pr_err("%s: channel mode setting failed for TWS\n", - __func__); - goto exit; - } else { - pr_debug("%s: updating tws channel mode : %d\n", - __func__, dai_data->enc_config.mono_mode); - } - } - if (ucontrol->value.integer.value[0] == - MSM_DAI_TWS_CHANNEL_MODE_ONE || - ucontrol->value.integer.value[0] == - MSM_DAI_TWS_CHANNEL_MODE_TWO) - dai_data->enc_config.mono_mode = - ucontrol->value.integer.value[0]; - else - return -EINVAL; - } -exit: - return ret; -} - -static int msm_dai_q6_afe_input_bit_format_get( - struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct msm_dai_q6_dai_data *dai_data = kcontrol->private_data; - - if (!dai_data) { - pr_err("%s: Invalid dai data\n", __func__); - return -EINVAL; - } - - switch (dai_data->afe_rx_in_bitformat) { - case SNDRV_PCM_FORMAT_S32_LE: - ucontrol->value.integer.value[0] = 2; - break; - case SNDRV_PCM_FORMAT_S24_LE: - ucontrol->value.integer.value[0] = 1; - break; - case SNDRV_PCM_FORMAT_S16_LE: - default: - ucontrol->value.integer.value[0] = 0; - break; - } - pr_debug("%s: afe input bit format : %ld\n", - __func__, ucontrol->value.integer.value[0]); - - return 0; -} - -static int msm_dai_q6_afe_input_bit_format_put( - struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct msm_dai_q6_dai_data *dai_data = kcontrol->private_data; - - if (!dai_data) { - pr_err("%s: Invalid dai data\n", __func__); - return -EINVAL; - } - switch (ucontrol->value.integer.value[0]) { - case 2: - dai_data->afe_rx_in_bitformat = SNDRV_PCM_FORMAT_S32_LE; - break; - case 1: - dai_data->afe_rx_in_bitformat = SNDRV_PCM_FORMAT_S24_LE; - break; - case 0: - default: - dai_data->afe_rx_in_bitformat = SNDRV_PCM_FORMAT_S16_LE; - break; - } - pr_debug("%s: updating afe input bit format : %d\n", - __func__, dai_data->afe_rx_in_bitformat); - - return 0; -} - -static int msm_dai_q6_afe_output_bit_format_get( - struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct msm_dai_q6_dai_data *dai_data = kcontrol->private_data; - - if (!dai_data) { - pr_err("%s: Invalid dai data\n", __func__); - return -EINVAL; - } - - switch (dai_data->afe_tx_out_bitformat) { - case SNDRV_PCM_FORMAT_S32_LE: - ucontrol->value.integer.value[0] = 2; - break; - case SNDRV_PCM_FORMAT_S24_LE: - ucontrol->value.integer.value[0] = 1; - break; - case SNDRV_PCM_FORMAT_S16_LE: - default: - ucontrol->value.integer.value[0] = 0; - break; - } - pr_debug("%s: afe output bit format : %ld\n", - __func__, ucontrol->value.integer.value[0]); - - return 0; -} - -static int msm_dai_q6_afe_output_bit_format_put( - struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct msm_dai_q6_dai_data *dai_data = kcontrol->private_data; - - if (!dai_data) { - pr_err("%s: Invalid dai data\n", __func__); - return -EINVAL; - } - switch (ucontrol->value.integer.value[0]) { - case 2: - dai_data->afe_tx_out_bitformat = SNDRV_PCM_FORMAT_S32_LE; - break; - case 1: - dai_data->afe_tx_out_bitformat = SNDRV_PCM_FORMAT_S24_LE; - break; - case 0: - default: - dai_data->afe_tx_out_bitformat = SNDRV_PCM_FORMAT_S16_LE; - break; - } - pr_debug("%s: updating afe output bit format : %d\n", - __func__, dai_data->afe_tx_out_bitformat); - - return 0; -} - -static int msm_dai_q6_afe_output_channel_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct msm_dai_q6_dai_data *dai_data = kcontrol->private_data; - - if (dai_data) { - ucontrol->value.integer.value[0] = - dai_data->afe_tx_out_channels; - pr_debug("%s:afe output channel = %d\n", - __func__, dai_data->afe_tx_out_channels); - } - return 0; -} - -static int msm_dai_q6_afe_output_channel_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct msm_dai_q6_dai_data *dai_data = kcontrol->private_data; - - if (dai_data) { - dai_data->afe_tx_out_channels = - ucontrol->value.integer.value[0]; - pr_debug("%s: updating afe output channel : %d\n", - __func__, dai_data->afe_tx_out_channels); - } - return 0; -} - -static int msm_dai_q6_afe_scrambler_mode_get( - struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct msm_dai_q6_dai_data *dai_data = kcontrol->private_data; - - if (!dai_data) { - pr_err("%s: Invalid dai data\n", __func__); - return -EINVAL; - } - ucontrol->value.integer.value[0] = dai_data->enc_config.scrambler_mode; - - return 0; -} - -static int msm_dai_q6_afe_scrambler_mode_put( - struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct msm_dai_q6_dai_data *dai_data = kcontrol->private_data; - - if (!dai_data) { - pr_err("%s: Invalid dai data\n", __func__); - return -EINVAL; - } - dai_data->enc_config.scrambler_mode = ucontrol->value.integer.value[0]; - pr_debug("%s: afe scrambler mode : %d\n", - __func__, dai_data->enc_config.scrambler_mode); - return 0; -} - -static const struct snd_kcontrol_new afe_enc_config_controls[] = { - { - .access = (SNDRV_CTL_ELEM_ACCESS_READWRITE | - SNDRV_CTL_ELEM_ACCESS_INACTIVE), - .iface = SNDRV_CTL_ELEM_IFACE_PCM, - .name = "SLIM_7_RX Encoder Config", - .info = msm_dai_q6_afe_enc_cfg_info, - .get = msm_dai_q6_afe_enc_cfg_get, - .put = msm_dai_q6_afe_enc_cfg_put, - }, - SOC_ENUM_EXT("AFE Input Channels", afe_chs_enum[0], - msm_dai_q6_afe_input_channel_get, - msm_dai_q6_afe_input_channel_put), - SOC_ENUM_EXT("AFE Input Bit Format", afe_bit_format_enum[0], - msm_dai_q6_afe_input_bit_format_get, - msm_dai_q6_afe_input_bit_format_put), - SOC_SINGLE_EXT("AFE Scrambler Mode", - 0, 0, 1, 0, - msm_dai_q6_afe_scrambler_mode_get, - msm_dai_q6_afe_scrambler_mode_put), - SOC_ENUM_EXT("TWS Channel Mode", tws_chs_mode_enum[0], - msm_dai_q6_tws_channel_mode_get, - msm_dai_q6_tws_channel_mode_put), - { - .access = (SNDRV_CTL_ELEM_ACCESS_READWRITE | - SNDRV_CTL_ELEM_ACCESS_INACTIVE), - .iface = SNDRV_CTL_ELEM_IFACE_PCM, - .name = "SLIM_7_RX APTX_AD Enc Cfg", - .info = msm_dai_q6_afe_enc_cfg_info, - .get = msm_dai_q6_afe_enc_cfg_get, - .put = msm_dai_q6_afe_enc_cfg_put, - } -}; - -static int msm_dai_q6_afe_dec_cfg_info(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_info *uinfo) -{ - uinfo->type = SNDRV_CTL_ELEM_TYPE_BYTES; - uinfo->count = sizeof(struct afe_dec_config); - - return 0; -} - -static int msm_dai_q6_afe_feedback_dec_cfg_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct msm_dai_q6_dai_data *dai_data = kcontrol->private_data; - u32 format_size = 0; - u32 abr_size = 0; - - if (!dai_data) { - pr_err("%s: Invalid dai data\n", __func__); - return -EINVAL; - } - - format_size = sizeof(dai_data->dec_config.format); - memcpy(ucontrol->value.bytes.data, - &dai_data->dec_config.format, - format_size); - - pr_debug("%s: abr_dec_cfg for %d format\n", - __func__, dai_data->dec_config.format); - abr_size = sizeof(dai_data->dec_config.abr_dec_cfg.imc_info); - memcpy(ucontrol->value.bytes.data + format_size, - &dai_data->dec_config.abr_dec_cfg, - sizeof(struct afe_imc_dec_enc_info)); - - switch (dai_data->dec_config.format) { - case DEC_FMT_APTX_AD_SPEECH: - pr_debug("%s: afe_dec_cfg for %d format\n", - __func__, dai_data->dec_config.format); - memcpy(ucontrol->value.bytes.data + format_size + abr_size, - &dai_data->dec_config.data, - sizeof(struct asm_aptx_ad_speech_dec_cfg_t)); - break; - default: - pr_debug("%s: no afe_dec_cfg for format %d\n", - __func__, dai_data->dec_config.format); - break; - } - - return 0; -} - -static int msm_dai_q6_afe_feedback_dec_cfg_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct msm_dai_q6_dai_data *dai_data = kcontrol->private_data; - u32 format_size = 0; - u32 abr_size = 0; - - if (!dai_data) { - pr_err("%s: Invalid dai data\n", __func__); - return -EINVAL; - } - - memset(&dai_data->dec_config, 0x0, - sizeof(struct afe_dec_config)); - format_size = sizeof(dai_data->dec_config.format); - memcpy(&dai_data->dec_config.format, - ucontrol->value.bytes.data, - format_size); - - pr_debug("%s: abr_dec_cfg for %d format\n", - __func__, dai_data->dec_config.format); - abr_size = sizeof(dai_data->dec_config.abr_dec_cfg.imc_info); - memcpy(&dai_data->dec_config.abr_dec_cfg, - ucontrol->value.bytes.data + format_size, - sizeof(struct afe_imc_dec_enc_info)); - dai_data->dec_config.abr_dec_cfg.is_abr_enabled = true; - - switch (dai_data->dec_config.format) { - case DEC_FMT_APTX_AD_SPEECH: - pr_debug("%s: afe_dec_cfg for %d format\n", - __func__, dai_data->dec_config.format); - memcpy(&dai_data->dec_config.data, - ucontrol->value.bytes.data + format_size + abr_size, - sizeof(struct asm_aptx_ad_speech_dec_cfg_t)); - break; - default: - pr_debug("%s: no afe_dec_cfg for format %d\n", - __func__, dai_data->dec_config.format); - break; - } - return 0; -} - -static int msm_dai_q6_afe_dec_cfg_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct msm_dai_q6_dai_data *dai_data = kcontrol->private_data; - u32 format_size = 0; - int ret = 0; - - if (!dai_data) { - pr_err("%s: Invalid dai data\n", __func__); - return -EINVAL; - } - - format_size = sizeof(dai_data->dec_config.format); - memcpy(ucontrol->value.bytes.data, - &dai_data->dec_config.format, - format_size); - switch (dai_data->dec_config.format) { - case DEC_FMT_AAC_V2: - memcpy(ucontrol->value.bytes.data + format_size, - &dai_data->dec_config.data, - sizeof(struct asm_aac_dec_cfg_v2_t)); - break; - case DEC_FMT_APTX_ADAPTIVE: - memcpy(ucontrol->value.bytes.data + format_size, - &dai_data->dec_config.data, - sizeof(struct asm_aptx_ad_dec_cfg_t)); - break; - case DEC_FMT_SBC: - case DEC_FMT_MP3: - /* No decoder specific data available */ - break; - default: - pr_err("%s: Invalid format %d\n", - __func__, dai_data->dec_config.format); - ret = -EINVAL; - break; - } - - return ret; -} - -static int msm_dai_q6_afe_dec_cfg_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct msm_dai_q6_dai_data *dai_data = kcontrol->private_data; - u32 format_size = 0; - int ret = 0; - - if (!dai_data) { - pr_err("%s: Invalid dai data\n", __func__); - return -EINVAL; - } - - memset(&dai_data->dec_config, 0x0, - sizeof(struct afe_dec_config)); - format_size = sizeof(dai_data->dec_config.format); - memcpy(&dai_data->dec_config.format, - ucontrol->value.bytes.data, - format_size); - pr_debug("%s: Received decoder config for %d format\n", - __func__, dai_data->dec_config.format); - switch (dai_data->dec_config.format) { - case DEC_FMT_AAC_V2: - memcpy(&dai_data->dec_config.data, - ucontrol->value.bytes.data + format_size, - sizeof(struct asm_aac_dec_cfg_v2_t)); - break; - case DEC_FMT_SBC: - memcpy(&dai_data->dec_config.data, - ucontrol->value.bytes.data + format_size, - sizeof(struct asm_sbc_dec_cfg_t)); - break; - case DEC_FMT_APTX_ADAPTIVE: - memcpy(&dai_data->dec_config.data, - ucontrol->value.bytes.data + format_size, - sizeof(struct asm_aptx_ad_dec_cfg_t)); - break; - default: - pr_err("%s: Invalid format %d\n", - __func__, dai_data->dec_config.format); - ret = -EINVAL; - break; - } - - return ret; -} - -static const struct snd_kcontrol_new afe_dec_config_controls[] = { - { - .access = (SNDRV_CTL_ELEM_ACCESS_READWRITE | - SNDRV_CTL_ELEM_ACCESS_INACTIVE), - .iface = SNDRV_CTL_ELEM_IFACE_PCM, - .name = "SLIM_7_TX Decoder Config", - .info = msm_dai_q6_afe_dec_cfg_info, - .get = msm_dai_q6_afe_feedback_dec_cfg_get, - .put = msm_dai_q6_afe_feedback_dec_cfg_put, - }, - { - .access = (SNDRV_CTL_ELEM_ACCESS_READWRITE | - SNDRV_CTL_ELEM_ACCESS_INACTIVE), - .iface = SNDRV_CTL_ELEM_IFACE_PCM, - .name = "SLIM_9_TX Decoder Config", - .info = msm_dai_q6_afe_dec_cfg_info, - .get = msm_dai_q6_afe_dec_cfg_get, - .put = msm_dai_q6_afe_dec_cfg_put, - }, - SOC_ENUM_EXT("AFE Output Channels", afe_chs_enum[0], - msm_dai_q6_afe_output_channel_get, - msm_dai_q6_afe_output_channel_put), - SOC_ENUM_EXT("AFE Output Bit Format", afe_bit_format_enum[0], - msm_dai_q6_afe_output_bit_format_get, - msm_dai_q6_afe_output_bit_format_put), -}; - -static int msm_dai_q6_slim_rx_drift_info(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_info *uinfo) -{ - uinfo->type = SNDRV_CTL_ELEM_TYPE_BYTES; - uinfo->count = sizeof(struct afe_param_id_dev_timing_stats); - - return 0; -} - -static int msm_dai_q6_slim_rx_drift_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int ret = -EINVAL; - struct afe_param_id_dev_timing_stats timing_stats; - struct snd_soc_dai *dai = kcontrol->private_data; - struct msm_dai_q6_dai_data *dai_data = dev_get_drvdata(dai->dev); - - if (!test_bit(STATUS_PORT_STARTED, dai_data->status_mask)) { - pr_debug("%s: afe port not started. dai_data->status_mask = %ld\n", - __func__, *dai_data->status_mask); - goto done; - } - - memset(&timing_stats, 0, sizeof(struct afe_param_id_dev_timing_stats)); - ret = afe_get_av_dev_drift(&timing_stats, dai->id); - if (ret) { - pr_err("%s: Error getting AFE Drift for port %d, err=%d\n", - __func__, dai->id, ret); - - goto done; - } - - memcpy(ucontrol->value.bytes.data, (void *)&timing_stats, - sizeof(struct afe_param_id_dev_timing_stats)); -done: - return ret; -} - -static const char * const afe_cal_mode_text[] = { - "CAL_MODE_DEFAULT", "CAL_MODE_NONE" -}; - -static const struct soc_enum slim_2_rx_enum = - SOC_ENUM_SINGLE(SLIMBUS_2_RX, 0, ARRAY_SIZE(afe_cal_mode_text), - afe_cal_mode_text); - -static const struct soc_enum rt_proxy_1_rx_enum = - SOC_ENUM_SINGLE(RT_PROXY_PORT_001_RX, 0, ARRAY_SIZE(afe_cal_mode_text), - afe_cal_mode_text); - -static const struct soc_enum rt_proxy_1_tx_enum = - SOC_ENUM_SINGLE(RT_PROXY_PORT_001_TX, 0, ARRAY_SIZE(afe_cal_mode_text), - afe_cal_mode_text); - -static const struct snd_kcontrol_new sb_config_controls[] = { - SOC_ENUM_EXT("SLIM_4_TX Format", sb_config_enum[0], - msm_dai_q6_sb_format_get, - msm_dai_q6_sb_format_put), - SOC_ENUM_EXT("SLIM_2_RX SetCalMode", slim_2_rx_enum, - msm_dai_q6_cal_info_get, - msm_dai_q6_cal_info_put), - SOC_ENUM_EXT("SLIM_2_RX Format", sb_config_enum[0], - msm_dai_q6_sb_format_get, - msm_dai_q6_sb_format_put), - SOC_ENUM_EXT("SLIM_0_RX XTLoggingDisable", xt_logging_disable_enum[0], - msm_dai_q6_sb_xt_logging_disable_get, - msm_dai_q6_sb_xt_logging_disable_put), -}; - -static const struct snd_kcontrol_new rt_proxy_config_controls[] = { - SOC_ENUM_EXT("RT_PROXY_1_RX SetCalMode", rt_proxy_1_rx_enum, - msm_dai_q6_cal_info_get, - msm_dai_q6_cal_info_put), - SOC_ENUM_EXT("RT_PROXY_1_TX SetCalMode", rt_proxy_1_tx_enum, - msm_dai_q6_cal_info_get, - msm_dai_q6_cal_info_put), -}; - -static const struct snd_kcontrol_new usb_audio_cfg_controls[] = { - SOC_SINGLE_EXT("USB_AUDIO_RX dev_token", 0, 0, UINT_MAX, 0, - msm_dai_q6_usb_audio_cfg_get, - msm_dai_q6_usb_audio_cfg_put), - SOC_SINGLE_EXT("USB_AUDIO_RX endian", 0, 0, 1, 0, - msm_dai_q6_usb_audio_endian_cfg_get, - msm_dai_q6_usb_audio_endian_cfg_put), - SOC_SINGLE_EXT("USB_AUDIO_TX dev_token", 0, 0, UINT_MAX, 0, - msm_dai_q6_usb_audio_cfg_get, - msm_dai_q6_usb_audio_cfg_put), - SOC_SINGLE_EXT("USB_AUDIO_TX endian", 0, 0, 1, 0, - msm_dai_q6_usb_audio_endian_cfg_get, - msm_dai_q6_usb_audio_endian_cfg_put), - SOC_SINGLE_EXT("USB_AUDIO_RX service_interval", SND_SOC_NOPM, 0, - UINT_MAX, 0, - msm_dai_q6_usb_audio_svc_interval_get, - msm_dai_q6_usb_audio_svc_interval_put), -}; - -static const struct snd_kcontrol_new avd_drift_config_controls[] = { - { - .access = SNDRV_CTL_ELEM_ACCESS_READ, - .iface = SNDRV_CTL_ELEM_IFACE_PCM, - .name = "SLIMBUS_0_RX DRIFT", - .info = msm_dai_q6_slim_rx_drift_info, - .get = msm_dai_q6_slim_rx_drift_get, - }, - { - .access = SNDRV_CTL_ELEM_ACCESS_READ, - .iface = SNDRV_CTL_ELEM_IFACE_PCM, - .name = "SLIMBUS_6_RX DRIFT", - .info = msm_dai_q6_slim_rx_drift_info, - .get = msm_dai_q6_slim_rx_drift_get, - }, - { - .access = SNDRV_CTL_ELEM_ACCESS_READ, - .iface = SNDRV_CTL_ELEM_IFACE_PCM, - .name = "SLIMBUS_7_RX DRIFT", - .info = msm_dai_q6_slim_rx_drift_info, - .get = msm_dai_q6_slim_rx_drift_get, - }, -}; - -static inline void msm_dai_q6_set_slim_dev_id(struct snd_soc_dai *dai) -{ - int rc = 0; - int slim_dev_id = 0; - const char *q6_slim_dev_id = "qcom,msm-dai-q6-slim-dev-id"; - struct msm_dai_q6_dai_data *dai_data = dev_get_drvdata(dai->dev); - - dai_data->port_config.slim_sch.slimbus_dev_id = AFE_SLIMBUS_DEVICE_1; - - rc = of_property_read_u32(dai->dev->of_node, q6_slim_dev_id, - &slim_dev_id); - if (rc) { - dev_dbg(dai->dev, - "%s: missing %s in dt node\n", __func__, q6_slim_dev_id); - return; - } - - dev_dbg(dai->dev, "%s: slim_dev_id = %d\n", __func__, slim_dev_id); - - if (slim_dev_id >= AFE_SLIMBUS_DEVICE_1 && - slim_dev_id <= AFE_SLIMBUS_DEVICE_2) - dai_data->port_config.slim_sch.slimbus_dev_id = slim_dev_id; -} - -static int msm_dai_q6_dai_probe(struct snd_soc_dai *dai) -{ - struct msm_dai_q6_dai_data *dai_data; - int rc = 0; - - if (!dai) { - pr_err("%s: Invalid params dai\n", __func__); - return -EINVAL; - } - if (!dai->dev) { - pr_err("%s: Invalid params dai dev\n", __func__); - return -EINVAL; - } - - dai_data = kzalloc(sizeof(struct msm_dai_q6_dai_data), GFP_KERNEL); - - if (!dai_data) - return -ENOMEM; - else - dev_set_drvdata(dai->dev, dai_data); - - msm_dai_q6_set_dai_id(dai); - - if ((dai->id >= SLIMBUS_0_RX) && (dai->id <= SLIMBUS_9_TX)) - msm_dai_q6_set_slim_dev_id(dai); - - switch (dai->id) { - case SLIMBUS_4_TX: - rc = snd_ctl_add(dai->component->card->snd_card, - snd_ctl_new1(&sb_config_controls[0], - dai_data)); - break; - case SLIMBUS_2_RX: - rc = snd_ctl_add(dai->component->card->snd_card, - snd_ctl_new1(&sb_config_controls[1], - dai_data)); - rc = snd_ctl_add(dai->component->card->snd_card, - snd_ctl_new1(&sb_config_controls[2], - dai_data)); - break; - case SLIMBUS_7_RX: - rc = snd_ctl_add(dai->component->card->snd_card, - snd_ctl_new1(&afe_enc_config_controls[0], - dai_data)); - rc = snd_ctl_add(dai->component->card->snd_card, - snd_ctl_new1(&afe_enc_config_controls[1], - dai_data)); - rc = snd_ctl_add(dai->component->card->snd_card, - snd_ctl_new1(&afe_enc_config_controls[2], - dai_data)); - rc = snd_ctl_add(dai->component->card->snd_card, - snd_ctl_new1(&afe_enc_config_controls[3], - dai_data)); - rc = snd_ctl_add(dai->component->card->snd_card, - snd_ctl_new1(&afe_enc_config_controls[4], - dai)); - rc = snd_ctl_add(dai->component->card->snd_card, - snd_ctl_new1(&afe_enc_config_controls[5], - dai_data)); - rc = snd_ctl_add(dai->component->card->snd_card, - snd_ctl_new1(&avd_drift_config_controls[2], - dai)); - break; - case SLIMBUS_7_TX: - rc = snd_ctl_add(dai->component->card->snd_card, - snd_ctl_new1(&afe_dec_config_controls[0], - dai_data)); - break; - case SLIMBUS_9_TX: - rc = snd_ctl_add(dai->component->card->snd_card, - snd_ctl_new1(&afe_dec_config_controls[1], - dai_data)); - rc = snd_ctl_add(dai->component->card->snd_card, - snd_ctl_new1(&afe_dec_config_controls[2], - dai_data)); - rc = snd_ctl_add(dai->component->card->snd_card, - snd_ctl_new1(&afe_dec_config_controls[3], - dai_data)); - break; - case RT_PROXY_DAI_001_RX: - rc = snd_ctl_add(dai->component->card->snd_card, - snd_ctl_new1(&rt_proxy_config_controls[0], - dai_data)); - break; - case RT_PROXY_DAI_001_TX: - rc = snd_ctl_add(dai->component->card->snd_card, - snd_ctl_new1(&rt_proxy_config_controls[1], - dai_data)); - break; - case AFE_PORT_ID_USB_RX: - rc = snd_ctl_add(dai->component->card->snd_card, - snd_ctl_new1(&usb_audio_cfg_controls[0], - dai_data)); - rc = snd_ctl_add(dai->component->card->snd_card, - snd_ctl_new1(&usb_audio_cfg_controls[1], - dai_data)); - rc = snd_ctl_add(dai->component->card->snd_card, - snd_ctl_new1(&usb_audio_cfg_controls[4], - dai_data)); - break; - case AFE_PORT_ID_USB_TX: - rc = snd_ctl_add(dai->component->card->snd_card, - snd_ctl_new1(&usb_audio_cfg_controls[2], - dai_data)); - rc = snd_ctl_add(dai->component->card->snd_card, - snd_ctl_new1(&usb_audio_cfg_controls[3], - dai_data)); - break; - case SLIMBUS_0_RX: - rc = snd_ctl_add(dai->component->card->snd_card, - snd_ctl_new1(&avd_drift_config_controls[0], - dai)); - rc = snd_ctl_add(dai->component->card->snd_card, - snd_ctl_new1(&sb_config_controls[3], - dai_data)); - break; - case SLIMBUS_6_RX: - rc = snd_ctl_add(dai->component->card->snd_card, - snd_ctl_new1(&avd_drift_config_controls[1], - dai)); - break; - } - if (rc < 0) - dev_err(dai->dev, "%s: err add config ctl, DAI = %s\n", - __func__, dai->name); - - rc = msm_dai_q6_dai_add_route(dai); - return rc; -} - -static int msm_dai_q6_dai_remove(struct snd_soc_dai *dai) -{ - struct msm_dai_q6_dai_data *dai_data; - int rc; - - dai_data = dev_get_drvdata(dai->dev); - - /* If AFE port is still up, close it */ - if (test_bit(STATUS_PORT_STARTED, dai_data->status_mask)) { - pr_debug("%s: stop pseudo port:%d\n", __func__, dai->id); - rc = afe_close(dai->id); /* can block */ - if (rc < 0) - dev_err(dai->dev, "fail to close AFE port\n"); - clear_bit(STATUS_PORT_STARTED, dai_data->status_mask); - } - kfree(dai_data); - - return 0; -} - -static struct snd_soc_dai_driver msm_dai_q6_afe_rx_dai[] = { - { - .playback = { - .stream_name = "AFE Playback", - .aif_name = "PCM_RX", - .rates = SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_8000 | - SNDRV_PCM_RATE_16000, - .formats = SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE, - .channels_min = 1, - .channels_max = 2, - .rate_min = 8000, - .rate_max = 48000, - }, - .ops = &msm_dai_q6_ops, - .id = RT_PROXY_DAI_001_RX, - .probe = msm_dai_q6_dai_probe, - .remove = msm_dai_q6_dai_remove, - }, - { - .playback = { - .stream_name = "AFE-PROXY RX", - .rates = SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_8000 | - SNDRV_PCM_RATE_16000, - .formats = SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE, - .channels_min = 1, - .channels_max = 2, - .rate_min = 8000, - .rate_max = 48000, - }, - .ops = &msm_dai_q6_ops, - .id = RT_PROXY_DAI_002_RX, - .probe = msm_dai_q6_dai_probe, - .remove = msm_dai_q6_dai_remove, - }, -}; - -static struct snd_soc_dai_driver msm_dai_q6_afe_lb_tx_dai[] = { - { - .capture = { - .stream_name = "AFE Loopback Capture", - .aif_name = "AFE_LOOPBACK_TX", - .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_11025 | - SNDRV_PCM_RATE_16000 | SNDRV_PCM_RATE_22050 | - SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_44100 | - SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_96000 | - SNDRV_PCM_RATE_192000, - .formats = (SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | SNDRV_PCM_FMTBIT_S24_3LE | - SNDRV_PCM_FMTBIT_S32_LE ), - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 192000, - }, - .id = AFE_LOOPBACK_TX, - .probe = msm_dai_q6_dai_probe, - .remove = msm_dai_q6_dai_remove, - }, -}; - -static struct snd_soc_dai_driver msm_dai_q6_afe_tx_dai[] = { - { - .capture = { - .stream_name = "AFE Capture", - .aif_name = "PCM_TX", - .rates = SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_8000 | - SNDRV_PCM_RATE_16000, - .formats = SNDRV_PCM_FMTBIT_S16_LE, - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 48000, - }, - .ops = &msm_dai_q6_ops, - .id = RT_PROXY_DAI_002_TX, - .probe = msm_dai_q6_dai_probe, - .remove = msm_dai_q6_dai_remove, - }, - { - .capture = { - .stream_name = "AFE-PROXY TX", - .rates = SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_8000 | - SNDRV_PCM_RATE_16000, - .formats = SNDRV_PCM_FMTBIT_S16_LE, - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 48000, - }, - .ops = &msm_dai_q6_ops, - .id = RT_PROXY_DAI_001_TX, - .probe = msm_dai_q6_dai_probe, - .remove = msm_dai_q6_dai_remove, - }, -}; - -static struct snd_soc_dai_driver msm_dai_q6_afe_cap_dai = { - .capture = { - .stream_name = "AFE-PROXY TX1", - .rates = SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_8000 | - SNDRV_PCM_RATE_16000, - .formats = SNDRV_PCM_FMTBIT_S16_LE, - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 48000, - }, - .ops = &msm_dai_q6_ops, - .id = RT_PROXY_DAI_003_TX, - .probe = msm_dai_q6_dai_probe, - .remove = msm_dai_q6_dai_remove, -}; - -static struct snd_soc_dai_driver msm_dai_q6_bt_sco_rx_dai = { - .playback = { - .stream_name = "Internal BT-SCO Playback", - .aif_name = "INT_BT_SCO_RX", - .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000, - .formats = SNDRV_PCM_FMTBIT_S16_LE, - .channels_min = 1, - .channels_max = 1, - .rate_max = 16000, - .rate_min = 8000, - }, - .ops = &msm_dai_q6_ops, - .id = INT_BT_SCO_RX, - .probe = msm_dai_q6_dai_probe, - .remove = msm_dai_q6_dai_remove, -}; - -static struct snd_soc_dai_driver msm_dai_q6_bt_a2dp_rx_dai = { - .playback = { - .stream_name = "Internal BT-A2DP Playback", - .aif_name = "INT_BT_A2DP_RX", - .rates = SNDRV_PCM_RATE_48000, - .formats = SNDRV_PCM_FMTBIT_S16_LE, - .channels_min = 1, - .channels_max = 2, - .rate_max = 48000, - .rate_min = 48000, - }, - .ops = &msm_dai_q6_ops, - .id = INT_BT_A2DP_RX, - .probe = msm_dai_q6_dai_probe, - .remove = msm_dai_q6_dai_remove, -}; - -static struct snd_soc_dai_driver msm_dai_q6_bt_sco_tx_dai = { - .capture = { - .stream_name = "Internal BT-SCO Capture", - .aif_name = "INT_BT_SCO_TX", - .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000, - .formats = SNDRV_PCM_FMTBIT_S16_LE, - .channels_min = 1, - .channels_max = 1, - .rate_max = 16000, - .rate_min = 8000, - }, - .ops = &msm_dai_q6_ops, - .id = INT_BT_SCO_TX, - .probe = msm_dai_q6_dai_probe, - .remove = msm_dai_q6_dai_remove, -}; - -static struct snd_soc_dai_driver msm_dai_q6_fm_rx_dai = { - .playback = { - .stream_name = "Internal FM Playback", - .aif_name = "INT_FM_RX", - .rates = SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_8000 | - SNDRV_PCM_RATE_16000, - .formats = SNDRV_PCM_FMTBIT_S16_LE, - .channels_min = 2, - .channels_max = 2, - .rate_max = 48000, - .rate_min = 8000, - }, - .ops = &msm_dai_q6_ops, - .id = INT_FM_RX, - .probe = msm_dai_q6_dai_probe, - .remove = msm_dai_q6_dai_remove, -}; - -static struct snd_soc_dai_driver msm_dai_q6_fm_tx_dai = { - .capture = { - .stream_name = "Internal FM Capture", - .aif_name = "INT_FM_TX", - .rates = SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_8000 | - SNDRV_PCM_RATE_16000, - .formats = SNDRV_PCM_FMTBIT_S16_LE, - .channels_min = 2, - .channels_max = 2, - .rate_max = 48000, - .rate_min = 8000, - }, - .ops = &msm_dai_q6_ops, - .id = INT_FM_TX, - .probe = msm_dai_q6_dai_probe, - .remove = msm_dai_q6_dai_remove, -}; - -static struct snd_soc_dai_driver msm_dai_q6_voc_playback_dai[] = { - { - .playback = { - .stream_name = "Voice Farend Playback", - .aif_name = "VOICE_PLAYBACK_TX", - .rates = SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_8000 | - SNDRV_PCM_RATE_16000, - .formats = SNDRV_PCM_FMTBIT_S16_LE, - .channels_min = 1, - .channels_max = 2, - .rate_min = 8000, - .rate_max = 48000, - }, - .ops = &msm_dai_q6_ops, - .id = VOICE_PLAYBACK_TX, - .probe = msm_dai_q6_dai_probe, - .remove = msm_dai_q6_dai_remove, - }, - { - .playback = { - .stream_name = "Voice2 Farend Playback", - .aif_name = "VOICE2_PLAYBACK_TX", - .rates = SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_8000 | - SNDRV_PCM_RATE_16000, - .formats = SNDRV_PCM_FMTBIT_S16_LE, - .channels_min = 1, - .channels_max = 2, - .rate_min = 8000, - .rate_max = 48000, - }, - .ops = &msm_dai_q6_ops, - .id = VOICE2_PLAYBACK_TX, - .probe = msm_dai_q6_dai_probe, - .remove = msm_dai_q6_dai_remove, - }, -}; - -static struct snd_soc_dai_driver msm_dai_q6_incall_record_dai[] = { - { - .capture = { - .stream_name = "Voice Uplink Capture", - .aif_name = "INCALL_RECORD_TX", - .rates = SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_8000 | - SNDRV_PCM_RATE_16000, - .formats = SNDRV_PCM_FMTBIT_S16_LE, - .channels_min = 1, - .channels_max = 2, - .rate_min = 8000, - .rate_max = 48000, - }, - .ops = &msm_dai_q6_ops, - .id = VOICE_RECORD_TX, - .probe = msm_dai_q6_dai_probe, - .remove = msm_dai_q6_dai_remove, - }, - { - .capture = { - .stream_name = "Voice Downlink Capture", - .aif_name = "INCALL_RECORD_RX", - .rates = SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_8000 | - SNDRV_PCM_RATE_16000, - .formats = SNDRV_PCM_FMTBIT_S16_LE, - .channels_min = 1, - .channels_max = 2, - .rate_min = 8000, - .rate_max = 48000, - }, - .ops = &msm_dai_q6_ops, - .id = VOICE_RECORD_RX, - .probe = msm_dai_q6_dai_probe, - .remove = msm_dai_q6_dai_remove, - }, -}; - -static struct snd_soc_dai_driver msm_dai_q6_proxy_tx_dai = { - .capture = { - .stream_name = "Proxy Capture", - .aif_name = "PROXY_TX", - .rates = SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_8000 | - SNDRV_PCM_RATE_16000, - .formats = SNDRV_PCM_FMTBIT_S16_LE, - .channels_min = 1, - .channels_max = 2, - .rate_min = 8000, - .rate_max = 48000, - }, - .ops = &msm_dai_q6_ops, - .id = RT_PROXY_PORT_002_TX, - .probe = msm_dai_q6_dai_probe, - .remove = msm_dai_q6_dai_remove, -}; - -static struct snd_soc_dai_driver msm_dai_q6_proxy_rx_dai = { - .playback = { - .stream_name = "Proxy Playback", - .aif_name = "PROXY_RX", - .rates = SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_8000 | - SNDRV_PCM_RATE_16000, - .formats = SNDRV_PCM_FMTBIT_S16_LE, - .channels_min = 1, - .channels_max = 2, - .rate_min = 8000, - .rate_max = 48000, - }, - .ops = &msm_dai_q6_ops, - .id = RT_PROXY_PORT_002_RX, - .probe = msm_dai_q6_dai_probe, - .remove = msm_dai_q6_dai_remove, -}; - -static struct snd_soc_dai_driver msm_dai_q6_usb_rx_dai = { - .playback = { - .stream_name = "USB Audio Playback", - .aif_name = "USB_AUDIO_RX", - .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_11025 | - SNDRV_PCM_RATE_16000 | SNDRV_PCM_RATE_22050 | - SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_44100 | - SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_88200 | - SNDRV_PCM_RATE_96000 | SNDRV_PCM_RATE_176400 | - SNDRV_PCM_RATE_192000 | SNDRV_PCM_RATE_352800 | - SNDRV_PCM_RATE_384000, - .formats = SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S24_3LE | SNDRV_PCM_FMTBIT_S32_LE, - .channels_min = 1, - .channels_max = 8, - .rate_max = 384000, - .rate_min = 8000, - }, - .ops = &msm_dai_q6_ops, - .id = AFE_PORT_ID_USB_RX, - .probe = msm_dai_q6_dai_probe, - .remove = msm_dai_q6_dai_remove, -}; - -static struct snd_soc_dai_driver msm_dai_q6_usb_tx_dai = { - .capture = { - .stream_name = "USB Audio Capture", - .aif_name = "USB_AUDIO_TX", - .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_11025 | - SNDRV_PCM_RATE_16000 | SNDRV_PCM_RATE_22050 | - SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_44100 | - SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_88200 | - SNDRV_PCM_RATE_96000 | SNDRV_PCM_RATE_176400 | - SNDRV_PCM_RATE_192000 | SNDRV_PCM_RATE_352800 | - SNDRV_PCM_RATE_384000, - .formats = SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S24_3LE | SNDRV_PCM_FMTBIT_S32_LE, - .channels_min = 1, - .channels_max = 8, - .rate_max = 384000, - .rate_min = 8000, - }, - .ops = &msm_dai_q6_ops, - .id = AFE_PORT_ID_USB_TX, - .probe = msm_dai_q6_dai_probe, - .remove = msm_dai_q6_dai_remove, -}; - static int msm_auxpcm_dev_probe(struct platform_device *pdev) { struct msm_dai_q6_auxpcm_dai_data *dai_data; @@ -4583,9 +1474,9 @@ static int msm_auxpcm_dev_probe(struct platform_device *pdev) rc = of_property_read_u32(pdev->dev.of_node, "qcom,msm-cpudai-afe-clk-ver", &val); if (rc) - dai_data->afe_clk_ver = AFE_CLK_VERSION_V1; + dai_data->clk_ver = AFE_CLK_VERSION_V1; else - dai_data->afe_clk_ver = val; + dai_data->clk_ver = val; mutex_init(&dai_data->rlock); dev_dbg(&pdev->dev, "dev name %s\n", dev_name(&pdev->dev)); @@ -4650,6 +1541,7 @@ static struct platform_driver msm_auxpcm_dev_driver = { }, }; +/* Channel min and max are initialized base on platform data */ static struct snd_soc_dai_driver msm_dai_q6_slimbus_rx_dai[] = { { .playback = { @@ -4662,74 +1554,7 @@ static struct snd_soc_dai_driver msm_dai_q6_slimbus_rx_dai[] = { .rate_min = 8000, .rate_max = 384000, }, - .ops = &msm_dai_slimbus_0_rx_ops, .id = SLIMBUS_0_RX, - .probe = msm_dai_q6_dai_probe, - .remove = msm_dai_q6_dai_remove, - }, - { - .playback = { - .stream_name = "Slimbus1 Playback", - .aif_name = "SLIMBUS_1_RX", - .rates = SNDRV_PCM_RATE_8000_384000, - .formats = DAI_FORMATS_S16_S24_S32_LE, - .channels_min = 1, - .channels_max = 2, - .rate_min = 8000, - .rate_max = 384000, - }, - .ops = &msm_dai_q6_ops, - .id = SLIMBUS_1_RX, - .probe = msm_dai_q6_dai_probe, - .remove = msm_dai_q6_dai_remove, - }, - { - .playback = { - .stream_name = "Slimbus2 Playback", - .aif_name = "SLIMBUS_2_RX", - .rates = SNDRV_PCM_RATE_8000_384000, - .formats = DAI_FORMATS_S16_S24_S32_LE, - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 384000, - }, - .ops = &msm_dai_q6_ops, - .id = SLIMBUS_2_RX, - .probe = msm_dai_q6_dai_probe, - .remove = msm_dai_q6_dai_remove, - }, - { - .playback = { - .stream_name = "Slimbus3 Playback", - .aif_name = "SLIMBUS_3_RX", - .rates = SNDRV_PCM_RATE_8000_384000, - .formats = DAI_FORMATS_S16_S24_S32_LE, - .channels_min = 1, - .channels_max = 2, - .rate_min = 8000, - .rate_max = 384000, - }, - .ops = &msm_dai_q6_ops, - .id = SLIMBUS_3_RX, - .probe = msm_dai_q6_dai_probe, - .remove = msm_dai_q6_dai_remove, - }, - { - .playback = { - .stream_name = "Slimbus4 Playback", - .aif_name = "SLIMBUS_4_RX", - .rates = SNDRV_PCM_RATE_8000_384000, - .formats = DAI_FORMATS_S16_S24_S32_LE, - .channels_min = 1, - .channels_max = 2, - .rate_min = 8000, - .rate_max = 384000, - }, - .ops = &msm_dai_q6_ops, - .id = SLIMBUS_4_RX, - .probe = msm_dai_q6_dai_probe, - .remove = msm_dai_q6_dai_remove, }, { .playback = { @@ -4742,74 +1567,7 @@ static struct snd_soc_dai_driver msm_dai_q6_slimbus_rx_dai[] = { .rate_min = 8000, .rate_max = 384000, }, - .ops = &msm_dai_q6_ops, .id = SLIMBUS_6_RX, - .probe = msm_dai_q6_dai_probe, - .remove = msm_dai_q6_dai_remove, - }, - { - .playback = { - .stream_name = "Slimbus5 Playback", - .aif_name = "SLIMBUS_5_RX", - .rates = SNDRV_PCM_RATE_8000_384000, - .formats = DAI_FORMATS_S16_S24_S32_LE, - .channels_min = 1, - .channels_max = 2, - .rate_min = 8000, - .rate_max = 384000, - }, - .ops = &msm_dai_q6_ops, - .id = SLIMBUS_5_RX, - .probe = msm_dai_q6_dai_probe, - .remove = msm_dai_q6_dai_remove, - }, - { - .playback = { - .stream_name = "Slimbus7 Playback", - .aif_name = "SLIMBUS_7_RX", - .rates = SNDRV_PCM_RATE_8000_384000, - .formats = DAI_FORMATS_S16_S24_S32_LE, - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 384000, - }, - .ops = &msm_dai_q6_ops, - .id = SLIMBUS_7_RX, - .probe = msm_dai_q6_dai_probe, - .remove = msm_dai_q6_dai_remove, - }, - { - .playback = { - .stream_name = "Slimbus8 Playback", - .aif_name = "SLIMBUS_8_RX", - .rates = SNDRV_PCM_RATE_8000_384000, - .formats = DAI_FORMATS_S16_S24_S32_LE, - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 384000, - }, - .ops = &msm_dai_q6_ops, - .id = SLIMBUS_8_RX, - .probe = msm_dai_q6_dai_probe, - .remove = msm_dai_q6_dai_remove, - }, - { - .playback = { - .stream_name = "Slimbus9 Playback", - .aif_name = "SLIMBUS_9_RX", - .rates = SNDRV_PCM_RATE_8000_384000, - .formats = DAI_FORMATS_S16_S24_S32_LE, - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 384000, - }, - .ops = &msm_dai_q6_ops, - .id = SLIMBUS_9_RX, - .probe = msm_dai_q6_dai_probe, - .remove = msm_dai_q6_dai_remove, }, }; @@ -4829,891 +1587,8 @@ static struct snd_soc_dai_driver msm_dai_q6_slimbus_tx_dai[] = { .rate_min = 8000, .rate_max = 192000, }, - .ops = &msm_dai_q6_ops, .id = SLIMBUS_0_TX, - .probe = msm_dai_q6_dai_probe, - .remove = msm_dai_q6_dai_remove, }, - { - .capture = { - .stream_name = "Slimbus1 Capture", - .aif_name = "SLIMBUS_1_TX", - .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 | - SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_96000 | - SNDRV_PCM_RATE_192000, - .formats = SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S24_3LE, - .channels_min = 1, - .channels_max = 2, - .rate_min = 8000, - .rate_max = 192000, - }, - .ops = &msm_dai_q6_ops, - .id = SLIMBUS_1_TX, - .probe = msm_dai_q6_dai_probe, - .remove = msm_dai_q6_dai_remove, - }, - { - .capture = { - .stream_name = "Slimbus2 Capture", - .aif_name = "SLIMBUS_2_TX", - .rates = SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_8000 | - SNDRV_PCM_RATE_16000 | SNDRV_PCM_RATE_96000 | - SNDRV_PCM_RATE_192000, - .formats = SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE, - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 192000, - }, - .ops = &msm_dai_q6_ops, - .id = SLIMBUS_2_TX, - .probe = msm_dai_q6_dai_probe, - .remove = msm_dai_q6_dai_remove, - }, - { - .capture = { - .stream_name = "Slimbus3 Capture", - .aif_name = "SLIMBUS_3_TX", - .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 | - SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_96000 | - SNDRV_PCM_RATE_192000, - .formats = SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE, - .channels_min = 2, - .channels_max = 4, - .rate_min = 8000, - .rate_max = 192000, - }, - .ops = &msm_dai_q6_ops, - .id = SLIMBUS_3_TX, - .probe = msm_dai_q6_dai_probe, - .remove = msm_dai_q6_dai_remove, - }, - { - .capture = { - .stream_name = "Slimbus4 Capture", - .aif_name = "SLIMBUS_4_TX", - .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 | - SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_96000 | - SNDRV_PCM_RATE_192000, - .formats = SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S32_LE, - .channels_min = 2, - .channels_max = 4, - .rate_min = 8000, - .rate_max = 192000, - }, - .ops = &msm_dai_q6_ops, - .id = SLIMBUS_4_TX, - .probe = msm_dai_q6_dai_probe, - .remove = msm_dai_q6_dai_remove, - }, - { - .capture = { - .stream_name = "Slimbus5 Capture", - .aif_name = "SLIMBUS_5_TX", - .rates = SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_8000 | - SNDRV_PCM_RATE_16000 | SNDRV_PCM_RATE_96000 | - SNDRV_PCM_RATE_192000, - .formats = SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE, - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 192000, - }, - .ops = &msm_dai_q6_ops, - .id = SLIMBUS_5_TX, - .probe = msm_dai_q6_dai_probe, - .remove = msm_dai_q6_dai_remove, - }, - { - .capture = { - .stream_name = "Slimbus6 Capture", - .aif_name = "SLIMBUS_6_TX", - .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 | - SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_96000 | - SNDRV_PCM_RATE_192000, - .formats = SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE, - .channels_min = 1, - .channels_max = 2, - .rate_min = 8000, - .rate_max = 192000, - }, - .ops = &msm_dai_q6_ops, - .id = SLIMBUS_6_TX, - .probe = msm_dai_q6_dai_probe, - .remove = msm_dai_q6_dai_remove, - }, - { - .capture = { - .stream_name = "Slimbus7 Capture", - .aif_name = "SLIMBUS_7_TX", - .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 | - SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_96000 | - SNDRV_PCM_RATE_192000, - .formats = SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S32_LE, - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 192000, - }, - .ops = &msm_dai_q6_ops, - .id = SLIMBUS_7_TX, - .probe = msm_dai_q6_dai_probe, - .remove = msm_dai_q6_dai_remove, - }, - { - .capture = { - .stream_name = "Slimbus8 Capture", - .aif_name = "SLIMBUS_8_TX", - .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 | - SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_96000 | - SNDRV_PCM_RATE_192000, - .formats = SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S32_LE, - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 192000, - }, - .ops = &msm_dai_q6_ops, - .id = SLIMBUS_8_TX, - .probe = msm_dai_q6_dai_probe, - .remove = msm_dai_q6_dai_remove, - }, - { - .capture = { - .stream_name = "Slimbus9 Capture", - .aif_name = "SLIMBUS_9_TX", - .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 | - SNDRV_PCM_RATE_44100 | SNDRV_PCM_RATE_48000 | - SNDRV_PCM_RATE_88200 | SNDRV_PCM_RATE_96000 | - SNDRV_PCM_RATE_192000, - .formats = SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S32_LE, - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 192000, - }, - .ops = &msm_dai_q6_ops, - .id = SLIMBUS_9_TX, - .probe = msm_dai_q6_dai_probe, - .remove = msm_dai_q6_dai_remove, - }, -}; - -static int msm_dai_q6_mi2s_format_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct msm_dai_q6_dai_data *dai_data = kcontrol->private_data; - int value = ucontrol->value.integer.value[0]; - - dai_data->port_config.i2s.data_format = value; - pr_debug("%s: value = %d, channel = %d, line = %d\n", - __func__, value, dai_data->port_config.i2s.mono_stereo, - dai_data->port_config.i2s.channel_mode); - return 0; -} - -static int msm_dai_q6_mi2s_format_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct msm_dai_q6_dai_data *dai_data = kcontrol->private_data; - - ucontrol->value.integer.value[0] = - dai_data->port_config.i2s.data_format; - return 0; -} - -static int msm_dai_q6_mi2s_vi_feed_mono_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct msm_dai_q6_dai_data *dai_data = kcontrol->private_data; - int value = ucontrol->value.integer.value[0]; - - dai_data->vi_feed_mono = value; - pr_debug("%s: value = %d\n", __func__, value); - return 0; -} - -static int msm_dai_q6_mi2s_vi_feed_mono_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct msm_dai_q6_dai_data *dai_data = kcontrol->private_data; - - ucontrol->value.integer.value[0] = dai_data->vi_feed_mono; - return 0; -} - -static const struct snd_kcontrol_new mi2s_config_controls[] = { - SOC_ENUM_EXT("PRI MI2S RX Format", mi2s_config_enum[0], - msm_dai_q6_mi2s_format_get, - msm_dai_q6_mi2s_format_put), - SOC_ENUM_EXT("SEC MI2S RX Format", mi2s_config_enum[0], - msm_dai_q6_mi2s_format_get, - msm_dai_q6_mi2s_format_put), - SOC_ENUM_EXT("TERT MI2S RX Format", mi2s_config_enum[0], - msm_dai_q6_mi2s_format_get, - msm_dai_q6_mi2s_format_put), - SOC_ENUM_EXT("QUAT MI2S RX Format", mi2s_config_enum[0], - msm_dai_q6_mi2s_format_get, - msm_dai_q6_mi2s_format_put), - SOC_ENUM_EXT("QUIN MI2S RX Format", mi2s_config_enum[0], - msm_dai_q6_mi2s_format_get, - msm_dai_q6_mi2s_format_put), - SOC_ENUM_EXT("SENARY MI2S RX Format", mi2s_config_enum[0], - msm_dai_q6_mi2s_format_get, - msm_dai_q6_mi2s_format_put), - SOC_ENUM_EXT("PRI MI2S TX Format", mi2s_config_enum[0], - msm_dai_q6_mi2s_format_get, - msm_dai_q6_mi2s_format_put), - SOC_ENUM_EXT("SEC MI2S TX Format", mi2s_config_enum[0], - msm_dai_q6_mi2s_format_get, - msm_dai_q6_mi2s_format_put), - SOC_ENUM_EXT("TERT MI2S TX Format", mi2s_config_enum[0], - msm_dai_q6_mi2s_format_get, - msm_dai_q6_mi2s_format_put), - SOC_ENUM_EXT("QUAT MI2S TX Format", mi2s_config_enum[0], - msm_dai_q6_mi2s_format_get, - msm_dai_q6_mi2s_format_put), - SOC_ENUM_EXT("QUIN MI2S TX Format", mi2s_config_enum[0], - msm_dai_q6_mi2s_format_get, - msm_dai_q6_mi2s_format_put), - SOC_ENUM_EXT("SENARY MI2S TX Format", mi2s_config_enum[0], - msm_dai_q6_mi2s_format_get, - msm_dai_q6_mi2s_format_put), - SOC_ENUM_EXT("INT5 MI2S TX Format", mi2s_config_enum[0], - msm_dai_q6_mi2s_format_get, - msm_dai_q6_mi2s_format_put), -}; - -static const struct snd_kcontrol_new mi2s_vi_feed_controls[] = { - SOC_ENUM_EXT("INT5 MI2S VI MONO", mi2s_config_enum[1], - msm_dai_q6_mi2s_vi_feed_mono_get, - msm_dai_q6_mi2s_vi_feed_mono_put), -}; - -static int msm_dai_q6_dai_mi2s_probe(struct snd_soc_dai *dai) -{ - struct msm_dai_q6_mi2s_dai_data *mi2s_dai_data = - dev_get_drvdata(dai->dev); - struct msm_mi2s_pdata *mi2s_pdata = - (struct msm_mi2s_pdata *) dai->dev->platform_data; - struct snd_kcontrol *kcontrol = NULL; - int rc = 0; - const struct snd_kcontrol_new *ctrl = NULL; - const struct snd_kcontrol_new *vi_feed_ctrl = NULL; - u16 dai_id = 0; - - dai->id = mi2s_pdata->intf_id; - - if (mi2s_dai_data->rx_dai.mi2s_dai_data.port_config.i2s.channel_mode) { - if (dai->id == MSM_PRIM_MI2S) - ctrl = &mi2s_config_controls[0]; - if (dai->id == MSM_SEC_MI2S) - ctrl = &mi2s_config_controls[1]; - if (dai->id == MSM_TERT_MI2S) - ctrl = &mi2s_config_controls[2]; - if (dai->id == MSM_QUAT_MI2S) - ctrl = &mi2s_config_controls[3]; - if (dai->id == MSM_QUIN_MI2S) - ctrl = &mi2s_config_controls[4]; - if (dai->id == MSM_SENARY_MI2S) - ctrl = &mi2s_config_controls[5]; - } - - if (ctrl) { - kcontrol = snd_ctl_new1(ctrl, - &mi2s_dai_data->rx_dai.mi2s_dai_data); - rc = snd_ctl_add(dai->component->card->snd_card, kcontrol); - if (rc < 0) { - dev_err(dai->dev, "%s: err add RX fmt ctl DAI = %s\n", - __func__, dai->name); - goto rtn; - } - } - - ctrl = NULL; - if (mi2s_dai_data->tx_dai.mi2s_dai_data.port_config.i2s.channel_mode) { - if (dai->id == MSM_PRIM_MI2S) - ctrl = &mi2s_config_controls[6]; - if (dai->id == MSM_SEC_MI2S) - ctrl = &mi2s_config_controls[7]; - if (dai->id == MSM_TERT_MI2S) - ctrl = &mi2s_config_controls[8]; - if (dai->id == MSM_QUAT_MI2S) - ctrl = &mi2s_config_controls[9]; - if (dai->id == MSM_QUIN_MI2S) - ctrl = &mi2s_config_controls[10]; - if (dai->id == MSM_SENARY_MI2S) - ctrl = &mi2s_config_controls[11]; - if (dai->id == MSM_INT5_MI2S) - ctrl = &mi2s_config_controls[12]; - } - - if (ctrl) { - rc = snd_ctl_add(dai->component->card->snd_card, - snd_ctl_new1(ctrl, - &mi2s_dai_data->tx_dai.mi2s_dai_data)); - if (rc < 0) { - if (kcontrol) - snd_ctl_remove(dai->component->card->snd_card, - kcontrol); - dev_err(dai->dev, "%s: err add TX fmt ctl DAI = %s\n", - __func__, dai->name); - } - } - - if (dai->id == MSM_INT5_MI2S) - vi_feed_ctrl = &mi2s_vi_feed_controls[0]; - - if (vi_feed_ctrl) { - rc = snd_ctl_add(dai->component->card->snd_card, - snd_ctl_new1(vi_feed_ctrl, - &mi2s_dai_data->tx_dai.mi2s_dai_data)); - - if (rc < 0) { - dev_err(dai->dev, "%s: err add TX vi feed channel ctl DAI = %s\n", - __func__, dai->name); - } - } - - if (mi2s_dai_data->is_island_dai) { - msm_mi2s_get_port_id(dai->id, SNDRV_PCM_STREAM_CAPTURE, - &dai_id); - rc = msm_dai_q6_add_island_mx_ctls( - dai->component->card->snd_card, - dai->name, dai_id, - (void *)mi2s_dai_data); - } - - rc = msm_dai_q6_dai_add_route(dai); -rtn: - return rc; -} - - -static int msm_dai_q6_dai_mi2s_remove(struct snd_soc_dai *dai) -{ - struct msm_dai_q6_mi2s_dai_data *mi2s_dai_data = - dev_get_drvdata(dai->dev); - int rc; - - /* If AFE port is still up, close it */ - if (test_bit(STATUS_PORT_STARTED, - mi2s_dai_data->rx_dai.mi2s_dai_data.status_mask)) { - rc = afe_close(MI2S_RX); /* can block */ - if (rc < 0) - dev_err(dai->dev, "fail to close MI2S_RX port\n"); - clear_bit(STATUS_PORT_STARTED, - mi2s_dai_data->rx_dai.mi2s_dai_data.status_mask); - } - if (test_bit(STATUS_PORT_STARTED, - mi2s_dai_data->tx_dai.mi2s_dai_data.status_mask)) { - rc = afe_close(MI2S_TX); /* can block */ - if (rc < 0) - dev_err(dai->dev, "fail to close MI2S_TX port\n"); - clear_bit(STATUS_PORT_STARTED, - mi2s_dai_data->tx_dai.mi2s_dai_data.status_mask); - } - return 0; -} - -static int msm_dai_q6_mi2s_startup(struct snd_pcm_substream *substream, - struct snd_soc_dai *dai) -{ - - return 0; -} - -static int msm_mi2s_get_port_id(u32 mi2s_id, int stream, u16 *port_id) -{ - int ret = 0; - - switch (stream) { - case SNDRV_PCM_STREAM_PLAYBACK: - switch (mi2s_id) { - case MSM_PRIM_MI2S: - *port_id = AFE_PORT_ID_PRIMARY_MI2S_RX; - break; - case MSM_SEC_MI2S: - *port_id = AFE_PORT_ID_SECONDARY_MI2S_RX; - break; - case MSM_TERT_MI2S: - *port_id = AFE_PORT_ID_TERTIARY_MI2S_RX; - break; - case MSM_QUAT_MI2S: - *port_id = AFE_PORT_ID_QUATERNARY_MI2S_RX; - break; - case MSM_SEC_MI2S_SD1: - *port_id = AFE_PORT_ID_SECONDARY_MI2S_RX_SD1; - break; - case MSM_QUIN_MI2S: - *port_id = AFE_PORT_ID_QUINARY_MI2S_RX; - break; - case MSM_SENARY_MI2S: - *port_id = AFE_PORT_ID_SENARY_MI2S_RX; - break; - case MSM_INT0_MI2S: - *port_id = AFE_PORT_ID_INT0_MI2S_RX; - break; - case MSM_INT1_MI2S: - *port_id = AFE_PORT_ID_INT1_MI2S_RX; - break; - case MSM_INT2_MI2S: - *port_id = AFE_PORT_ID_INT2_MI2S_RX; - break; - case MSM_INT3_MI2S: - *port_id = AFE_PORT_ID_INT3_MI2S_RX; - break; - case MSM_INT4_MI2S: - *port_id = AFE_PORT_ID_INT4_MI2S_RX; - break; - case MSM_INT5_MI2S: - *port_id = AFE_PORT_ID_INT5_MI2S_RX; - break; - case MSM_INT6_MI2S: - *port_id = AFE_PORT_ID_INT6_MI2S_RX; - break; - default: - pr_err("%s: playback err id 0x%x\n", - __func__, mi2s_id); - ret = -1; - break; - } - break; - case SNDRV_PCM_STREAM_CAPTURE: - switch (mi2s_id) { - case MSM_PRIM_MI2S: - *port_id = AFE_PORT_ID_PRIMARY_MI2S_TX; - break; - case MSM_SEC_MI2S: - *port_id = AFE_PORT_ID_SECONDARY_MI2S_TX; - break; - case MSM_TERT_MI2S: - *port_id = AFE_PORT_ID_TERTIARY_MI2S_TX; - break; - case MSM_QUAT_MI2S: - *port_id = AFE_PORT_ID_QUATERNARY_MI2S_TX; - break; - case MSM_QUIN_MI2S: - *port_id = AFE_PORT_ID_QUINARY_MI2S_TX; - break; - case MSM_SENARY_MI2S: - *port_id = AFE_PORT_ID_SENARY_MI2S_TX; - break; - case MSM_INT0_MI2S: - *port_id = AFE_PORT_ID_INT0_MI2S_TX; - break; - case MSM_INT1_MI2S: - *port_id = AFE_PORT_ID_INT1_MI2S_TX; - break; - case MSM_INT2_MI2S: - *port_id = AFE_PORT_ID_INT2_MI2S_TX; - break; - case MSM_INT3_MI2S: - *port_id = AFE_PORT_ID_INT3_MI2S_TX; - break; - case MSM_INT4_MI2S: - *port_id = AFE_PORT_ID_INT4_MI2S_TX; - break; - case MSM_INT5_MI2S: - *port_id = AFE_PORT_ID_INT5_MI2S_TX; - break; - case MSM_INT6_MI2S: - *port_id = AFE_PORT_ID_INT6_MI2S_TX; - break; - default: - pr_err("%s: capture err id 0x%x\n", __func__, mi2s_id); - ret = -1; - break; - } - break; - default: - pr_err("%s: default err %d\n", __func__, stream); - ret = -1; - break; - } - pr_debug("%s: port_id = 0x%x\n", __func__, *port_id); - return ret; -} - -static int msm_dai_q6_mi2s_prepare(struct snd_pcm_substream *substream, - struct snd_soc_dai *dai) -{ - struct msm_dai_q6_mi2s_dai_data *mi2s_dai_data = - dev_get_drvdata(dai->dev); - struct msm_dai_q6_dai_data *dai_data = - (substream->stream == SNDRV_PCM_STREAM_PLAYBACK ? - &mi2s_dai_data->rx_dai.mi2s_dai_data : - &mi2s_dai_data->tx_dai.mi2s_dai_data); - u16 port_id = 0; - int rc = 0; - - if (msm_mi2s_get_port_id(dai->id, substream->stream, - &port_id) != 0) { - dev_err(dai->dev, "%s: Invalid Port ID 0x%x\n", - __func__, port_id); - return -EINVAL; - } - - dev_dbg(dai->dev, "%s: dai id %d, afe port id = 0x%x\n" - "dai_data->channels = %u sample_rate = %u\n", __func__, - dai->id, port_id, dai_data->channels, dai_data->rate); - - if (!test_bit(STATUS_PORT_STARTED, dai_data->status_mask)) { - /* PORT START should be set if prepare called - * in active state. - */ - rc = afe_port_start(port_id, &dai_data->port_config, - dai_data->rate); - if (rc < 0) - dev_err(dai->dev, "fail to open AFE port 0x%x\n", - dai->id); - else - set_bit(STATUS_PORT_STARTED, - dai_data->status_mask); - } - if (!test_bit(STATUS_PORT_STARTED, dai_data->hwfree_status)) { - set_bit(STATUS_PORT_STARTED, dai_data->hwfree_status); - dev_dbg(dai->dev, "%s: set hwfree_status to started\n", - __func__); - } - return rc; -} - -static int msm_dai_q6_mi2s_hw_params(struct snd_pcm_substream *substream, - struct snd_pcm_hw_params *params, - struct snd_soc_dai *dai) -{ - struct msm_dai_q6_mi2s_dai_data *mi2s_dai_data = - dev_get_drvdata(dai->dev); - struct msm_dai_q6_mi2s_dai_config *mi2s_dai_config = - (substream->stream == SNDRV_PCM_STREAM_PLAYBACK ? - &mi2s_dai_data->rx_dai : &mi2s_dai_data->tx_dai); - struct msm_dai_q6_dai_data *dai_data = &mi2s_dai_config->mi2s_dai_data; - struct afe_param_id_i2s_cfg *i2s = &dai_data->port_config.i2s; - - dai_data->channels = params_channels(params); - switch (dai_data->channels) { - case 15: - case 16: - switch (mi2s_dai_config->pdata_mi2s_lines) { - case AFE_PORT_I2S_16CHS: - dai_data->port_config.i2s.channel_mode - = AFE_PORT_I2S_16CHS; - break; - default: - goto error_invalid_data; - }; - break; - case 13: - case 14: - switch (mi2s_dai_config->pdata_mi2s_lines) { - case AFE_PORT_I2S_14CHS: - case AFE_PORT_I2S_16CHS: - dai_data->port_config.i2s.channel_mode - = AFE_PORT_I2S_14CHS; - break; - default: - goto error_invalid_data; - }; - break; - case 11: - case 12: - switch (mi2s_dai_config->pdata_mi2s_lines) { - case AFE_PORT_I2S_12CHS: - case AFE_PORT_I2S_14CHS: - case AFE_PORT_I2S_16CHS: - dai_data->port_config.i2s.channel_mode - = AFE_PORT_I2S_12CHS; - break; - default: - goto error_invalid_data; - }; - break; - case 9: - case 10: - switch (mi2s_dai_config->pdata_mi2s_lines) { - case AFE_PORT_I2S_10CHS: - case AFE_PORT_I2S_12CHS: - case AFE_PORT_I2S_14CHS: - case AFE_PORT_I2S_16CHS: - dai_data->port_config.i2s.channel_mode - = AFE_PORT_I2S_10CHS; - break; - default: - goto error_invalid_data; - }; - break; - case 8: - case 7: - if (mi2s_dai_config->pdata_mi2s_lines < AFE_PORT_I2S_8CHS) - goto error_invalid_data; - else - if (mi2s_dai_config->pdata_mi2s_lines - == AFE_PORT_I2S_8CHS_2) - dai_data->port_config.i2s.channel_mode = - AFE_PORT_I2S_8CHS_2; - else - dai_data->port_config.i2s.channel_mode = - AFE_PORT_I2S_8CHS; - break; - case 6: - case 5: - if (mi2s_dai_config->pdata_mi2s_lines < AFE_PORT_I2S_6CHS) - goto error_invalid_data; - dai_data->port_config.i2s.channel_mode = AFE_PORT_I2S_6CHS; - break; - case 4: - case 3: - switch (mi2s_dai_config->pdata_mi2s_lines) { - case AFE_PORT_I2S_SD0: - case AFE_PORT_I2S_SD1: - case AFE_PORT_I2S_SD2: - case AFE_PORT_I2S_SD3: - case AFE_PORT_I2S_SD4: - case AFE_PORT_I2S_SD5: - case AFE_PORT_I2S_SD6: - case AFE_PORT_I2S_SD7: - goto error_invalid_data; - break; - case AFE_PORT_I2S_QUAD01: - case AFE_PORT_I2S_QUAD23: - case AFE_PORT_I2S_QUAD45: - case AFE_PORT_I2S_QUAD67: - dai_data->port_config.i2s.channel_mode = - mi2s_dai_config->pdata_mi2s_lines; - break; - case AFE_PORT_I2S_8CHS_2: - dai_data->port_config.i2s.channel_mode = - AFE_PORT_I2S_QUAD45; - break; - default: - dai_data->port_config.i2s.channel_mode = - AFE_PORT_I2S_QUAD01; - break; - }; - break; - case 2: - case 1: - if (mi2s_dai_config->pdata_mi2s_lines < AFE_PORT_I2S_SD0) - goto error_invalid_data; - switch (mi2s_dai_config->pdata_mi2s_lines) { - case AFE_PORT_I2S_SD0: - case AFE_PORT_I2S_SD1: - case AFE_PORT_I2S_SD2: - case AFE_PORT_I2S_SD3: - case AFE_PORT_I2S_SD4: - case AFE_PORT_I2S_SD5: - case AFE_PORT_I2S_SD6: - case AFE_PORT_I2S_SD7: - dai_data->port_config.i2s.channel_mode = - mi2s_dai_config->pdata_mi2s_lines; - break; - case AFE_PORT_I2S_QUAD01: - case AFE_PORT_I2S_6CHS: - case AFE_PORT_I2S_8CHS: - case AFE_PORT_I2S_10CHS: - case AFE_PORT_I2S_12CHS: - case AFE_PORT_I2S_14CHS: - case AFE_PORT_I2S_16CHS: - if (dai_data->vi_feed_mono == SPKR_1) - dai_data->port_config.i2s.channel_mode = - AFE_PORT_I2S_SD0; - else - dai_data->port_config.i2s.channel_mode = - AFE_PORT_I2S_SD1; - break; - case AFE_PORT_I2S_QUAD23: - dai_data->port_config.i2s.channel_mode = - AFE_PORT_I2S_SD2; - break; - case AFE_PORT_I2S_QUAD45: - dai_data->port_config.i2s.channel_mode = - AFE_PORT_I2S_SD4; - break; - case AFE_PORT_I2S_QUAD67: - dai_data->port_config.i2s.channel_mode = - AFE_PORT_I2S_SD6; - break; - } - if (dai_data->channels == 2) - dai_data->port_config.i2s.mono_stereo = - MSM_AFE_CH_STEREO; - else - dai_data->port_config.i2s.mono_stereo = MSM_AFE_MONO; - break; - default: - pr_err("%s: default err channels %d\n", - __func__, dai_data->channels); - goto error_invalid_data; - } - dai_data->rate = params_rate(params); - - switch (params_format(params)) { - case SNDRV_PCM_FORMAT_S16_LE: - case SNDRV_PCM_FORMAT_SPECIAL: - dai_data->port_config.i2s.bit_width = 16; - dai_data->bitwidth = 16; - break; - case SNDRV_PCM_FORMAT_S24_LE: - case SNDRV_PCM_FORMAT_S24_3LE: - dai_data->port_config.i2s.bit_width = 24; - dai_data->bitwidth = 24; - break; - case SNDRV_PCM_FORMAT_S32_LE: - dai_data->port_config.i2s.bit_width = 32; - dai_data->bitwidth = 32; - break; - default: - pr_err("%s: format %d\n", - __func__, params_format(params)); - return -EINVAL; - } - - dai_data->port_config.i2s.i2s_cfg_minor_version = - AFE_API_VERSION_I2S_CONFIG; - dai_data->port_config.i2s.sample_rate = dai_data->rate; - if ((test_bit(STATUS_PORT_STARTED, - mi2s_dai_data->rx_dai.mi2s_dai_data.status_mask) && - test_bit(STATUS_PORT_STARTED, - mi2s_dai_data->rx_dai.mi2s_dai_data.hwfree_status)) || - (test_bit(STATUS_PORT_STARTED, - mi2s_dai_data->tx_dai.mi2s_dai_data.status_mask) && - test_bit(STATUS_PORT_STARTED, - mi2s_dai_data->tx_dai.mi2s_dai_data.hwfree_status))) { - if ((mi2s_dai_data->tx_dai.mi2s_dai_data.rate != - mi2s_dai_data->rx_dai.mi2s_dai_data.rate) || - (mi2s_dai_data->rx_dai.mi2s_dai_data.bitwidth != - mi2s_dai_data->tx_dai.mi2s_dai_data.bitwidth)) { - dev_err(dai->dev, "%s: Error mismatch in HW params\n" - "Tx sample_rate = %u bit_width = %hu\n" - "Rx sample_rate = %u bit_width = %hu\n" - , __func__, - mi2s_dai_data->tx_dai.mi2s_dai_data.rate, - mi2s_dai_data->tx_dai.mi2s_dai_data.bitwidth, - mi2s_dai_data->rx_dai.mi2s_dai_data.rate, - mi2s_dai_data->rx_dai.mi2s_dai_data.bitwidth); - return -EINVAL; - } - } - dev_dbg(dai->dev, "%s: dai id %d dai_data->channels = %d\n" - "sample_rate = %u i2s_cfg_minor_version = 0x%x\n" - "bit_width = %hu channel_mode = 0x%x mono_stereo = %#x\n" - "ws_src = 0x%x sample_rate = %u data_format = 0x%x\n" - "reserved = %u\n", __func__, dai->id, dai_data->channels, - dai_data->rate, i2s->i2s_cfg_minor_version, i2s->bit_width, - i2s->channel_mode, i2s->mono_stereo, i2s->ws_src, - i2s->sample_rate, i2s->data_format, i2s->reserved); - - return 0; - -error_invalid_data: - pr_err("%s: dai_data->channels = %d channel_mode = %d\n", __func__, - dai_data->channels, dai_data->port_config.i2s.channel_mode); - return -EINVAL; -} - - -static int msm_dai_q6_mi2s_set_fmt(struct snd_soc_dai *dai, unsigned int fmt) -{ - struct msm_dai_q6_mi2s_dai_data *mi2s_dai_data = - dev_get_drvdata(dai->dev); - - if (test_bit(STATUS_PORT_STARTED, - mi2s_dai_data->rx_dai.mi2s_dai_data.status_mask) || - test_bit(STATUS_PORT_STARTED, - mi2s_dai_data->tx_dai.mi2s_dai_data.status_mask)) { - dev_err(dai->dev, "%s: err chg i2s mode while dai running", - __func__); - return -EPERM; - } - - switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) { - case SND_SOC_DAIFMT_CBS_CFS: - mi2s_dai_data->rx_dai.mi2s_dai_data.port_config.i2s.ws_src = 1; - mi2s_dai_data->tx_dai.mi2s_dai_data.port_config.i2s.ws_src = 1; - break; - case SND_SOC_DAIFMT_CBM_CFM: - mi2s_dai_data->rx_dai.mi2s_dai_data.port_config.i2s.ws_src = 0; - mi2s_dai_data->tx_dai.mi2s_dai_data.port_config.i2s.ws_src = 0; - break; - default: - pr_err("%s: fmt %d\n", - __func__, fmt & SND_SOC_DAIFMT_MASTER_MASK); - return -EINVAL; - } - - return 0; -} - -static int msm_dai_q6_mi2s_hw_free(struct snd_pcm_substream *substream, - struct snd_soc_dai *dai) -{ - struct msm_dai_q6_mi2s_dai_data *mi2s_dai_data = - dev_get_drvdata(dai->dev); - struct msm_dai_q6_dai_data *dai_data = - (substream->stream == SNDRV_PCM_STREAM_PLAYBACK ? - &mi2s_dai_data->rx_dai.mi2s_dai_data : - &mi2s_dai_data->tx_dai.mi2s_dai_data); - - if (test_bit(STATUS_PORT_STARTED, dai_data->hwfree_status)) { - clear_bit(STATUS_PORT_STARTED, dai_data->hwfree_status); - dev_dbg(dai->dev, "%s: clear hwfree_status\n", __func__); - } - return 0; -} - -static void msm_dai_q6_mi2s_shutdown(struct snd_pcm_substream *substream, - struct snd_soc_dai *dai) -{ - struct msm_dai_q6_mi2s_dai_data *mi2s_dai_data = - dev_get_drvdata(dai->dev); - struct msm_dai_q6_dai_data *dai_data = - (substream->stream == SNDRV_PCM_STREAM_PLAYBACK ? - &mi2s_dai_data->rx_dai.mi2s_dai_data : - &mi2s_dai_data->tx_dai.mi2s_dai_data); - u16 port_id = 0; - int rc = 0; - - if (msm_mi2s_get_port_id(dai->id, substream->stream, - &port_id) != 0) { - dev_err(dai->dev, "%s: Invalid Port ID 0x%x\n", - __func__, port_id); - } - - dev_dbg(dai->dev, "%s: closing afe port id = 0x%x\n", - __func__, port_id); - - if (test_bit(STATUS_PORT_STARTED, dai_data->status_mask)) { - rc = afe_close(port_id); - if (rc < 0) - dev_err(dai->dev, "fail to close AFE port\n"); - clear_bit(STATUS_PORT_STARTED, dai_data->status_mask); - } - if (test_bit(STATUS_PORT_STARTED, dai_data->hwfree_status)) - clear_bit(STATUS_PORT_STARTED, dai_data->hwfree_status); -} - -static struct snd_soc_dai_ops msm_dai_q6_mi2s_ops = { - .startup = msm_dai_q6_mi2s_startup, - .prepare = msm_dai_q6_mi2s_prepare, - .hw_params = msm_dai_q6_mi2s_hw_params, - .hw_free = msm_dai_q6_mi2s_hw_free, - .set_fmt = msm_dai_q6_mi2s_set_fmt, - .shutdown = msm_dai_q6_mi2s_shutdown, }; /* Channel min and max are initialized base on platform data */ @@ -5747,12 +1622,10 @@ static struct snd_soc_dai_driver msm_dai_q6_mi2s_dai[] = { .rate_min = 8000, .rate_max = 192000, }, - .ops = &msm_dai_q6_mi2s_ops, .name = "Primary MI2S", .id = MSM_PRIM_MI2S, - .probe = msm_dai_q6_dai_mi2s_probe, - .remove = msm_dai_q6_dai_mi2s_remove, }, + { .playback = { .stream_name = "Secondary MI2S Playback", @@ -5778,11 +1651,8 @@ static struct snd_soc_dai_driver msm_dai_q6_mi2s_dai[] = { .rate_min = 8000, .rate_max = 192000, }, - .ops = &msm_dai_q6_mi2s_ops, .name = "Secondary MI2S", .id = MSM_SEC_MI2S, - .probe = msm_dai_q6_dai_mi2s_probe, - .remove = msm_dai_q6_dai_mi2s_remove, }, { .playback = { @@ -5809,11 +1679,8 @@ static struct snd_soc_dai_driver msm_dai_q6_mi2s_dai[] = { .rate_min = 8000, .rate_max = 192000, }, - .ops = &msm_dai_q6_mi2s_ops, .name = "Tertiary MI2S", .id = MSM_TERT_MI2S, - .probe = msm_dai_q6_dai_mi2s_probe, - .remove = msm_dai_q6_dai_mi2s_remove, }, { .playback = { @@ -5840,11 +1707,8 @@ static struct snd_soc_dai_driver msm_dai_q6_mi2s_dai[] = { .rate_min = 8000, .rate_max = 192000, }, - .ops = &msm_dai_q6_mi2s_ops, .name = "Quaternary MI2S", .id = MSM_QUAT_MI2S, - .probe = msm_dai_q6_dai_mi2s_probe, - .remove = msm_dai_q6_dai_mi2s_remove, }, { .playback = { @@ -5866,11 +1730,8 @@ static struct snd_soc_dai_driver msm_dai_q6_mi2s_dai[] = { .rate_min = 8000, .rate_max = 48000, }, - .ops = &msm_dai_q6_mi2s_ops, .name = "Quinary MI2S", .id = MSM_QUIN_MI2S, - .probe = msm_dai_q6_dai_mi2s_probe, - .remove = msm_dai_q6_dai_mi2s_remove, }, { .playback = { @@ -5891,11 +1752,8 @@ static struct snd_soc_dai_driver msm_dai_q6_mi2s_dai[] = { .rate_min = 8000, .rate_max = 48000, }, - .ops = &msm_dai_q6_mi2s_ops, .name = "Senary MI2S", .id = MSM_SENARY_MI2S, - .probe = msm_dai_q6_dai_mi2s_probe, - .remove = msm_dai_q6_dai_mi2s_remove, }, { .playback = { @@ -5931,11 +1789,8 @@ static struct snd_soc_dai_driver msm_dai_q6_mi2s_dai[] = { .rate_min = 8000, .rate_max = 48000, }, - .ops = &msm_dai_q6_mi2s_ops, .name = "INT0 MI2S", .id = MSM_INT0_MI2S, - .probe = msm_dai_q6_dai_mi2s_probe, - .remove = msm_dai_q6_dai_mi2s_remove, }, { .playback = { @@ -5958,11 +1813,8 @@ static struct snd_soc_dai_driver msm_dai_q6_mi2s_dai[] = { .rate_min = 8000, .rate_max = 48000, }, - .ops = &msm_dai_q6_mi2s_ops, .name = "INT1 MI2S", .id = MSM_INT1_MI2S, - .probe = msm_dai_q6_dai_mi2s_probe, - .remove = msm_dai_q6_dai_mi2s_remove, }, { .playback = { @@ -5985,11 +1837,8 @@ static struct snd_soc_dai_driver msm_dai_q6_mi2s_dai[] = { .rate_min = 8000, .rate_max = 48000, }, - .ops = &msm_dai_q6_mi2s_ops, .name = "INT2 MI2S", .id = MSM_INT2_MI2S, - .probe = msm_dai_q6_dai_mi2s_probe, - .remove = msm_dai_q6_dai_mi2s_remove, }, { .playback = { @@ -6012,11 +1861,8 @@ static struct snd_soc_dai_driver msm_dai_q6_mi2s_dai[] = { .rate_min = 8000, .rate_max = 48000, }, - .ops = &msm_dai_q6_mi2s_ops, .name = "INT3 MI2S", .id = MSM_INT3_MI2S, - .probe = msm_dai_q6_dai_mi2s_probe, - .remove = msm_dai_q6_dai_mi2s_remove, }, { .playback = { @@ -6040,11 +1886,8 @@ static struct snd_soc_dai_driver msm_dai_q6_mi2s_dai[] = { .rate_min = 8000, .rate_max = 48000, }, - .ops = &msm_dai_q6_mi2s_ops, .name = "INT4 MI2S", .id = MSM_INT4_MI2S, - .probe = msm_dai_q6_dai_mi2s_probe, - .remove = msm_dai_q6_dai_mi2s_remove, }, { .playback = { @@ -6067,11 +1910,8 @@ static struct snd_soc_dai_driver msm_dai_q6_mi2s_dai[] = { .rate_min = 8000, .rate_max = 48000, }, - .ops = &msm_dai_q6_mi2s_ops, .name = "INT5 MI2S", .id = MSM_INT5_MI2S, - .probe = msm_dai_q6_dai_mi2s_probe, - .remove = msm_dai_q6_dai_mi2s_remove, }, { .playback = { @@ -6094,15 +1934,11 @@ static struct snd_soc_dai_driver msm_dai_q6_mi2s_dai[] = { .rate_min = 8000, .rate_max = 48000, }, - .ops = &msm_dai_q6_mi2s_ops, .name = "INT6 MI2S", .id = MSM_INT6_MI2S, - .probe = msm_dai_q6_dai_mi2s_probe, - .remove = msm_dai_q6_dai_mi2s_remove, }, }; - static int msm_dai_q6_mi2s_get_lineconfig(u16 sd_lines, u16 *config_ptr, unsigned int *ch_cnt) { @@ -6250,6 +2086,7 @@ error_invalid_data: return -EINVAL; } +#if 0 static u16 msm_dai_q6_mi2s_get_num_channels(u16 config) { switch (config) { @@ -6285,6 +2122,7 @@ static u16 msm_dai_q6_mi2s_get_num_channels(u16 config) return 0; } } +#endif static int msm_dai_q6_mi2s_platform_data_validation( struct platform_device *pdev, struct snd_soc_dai_driver *dai_driver) @@ -6451,6 +2289,7 @@ static int msm_dai_q6_mi2s_dev_remove(struct platform_device *pdev) return 0; } +#if 0 static int msm_dai_q6_dai_meta_mi2s_probe(struct snd_soc_dai *dai) { struct msm_meta_mi2s_pdata *meta_mi2s_pdata = @@ -7101,7 +2940,7 @@ static int msm_dai_q6_meta_mi2s_dev_remove(struct platform_device *pdev) snd_soc_unregister_component(&pdev->dev); return 0; } - +#endif static const struct snd_soc_component_driver msm_dai_q6_component = { .name = "msm-dai-q6-dev", }; @@ -7128,33 +2967,9 @@ static int msm_dai_q6_dev_probe(struct platform_device *pdev) case SLIMBUS_0_RX: strlcpy(stream_name, "Slimbus Playback", 80); goto register_slim_playback; - case SLIMBUS_2_RX: - strlcpy(stream_name, "Slimbus2 Playback", 80); - goto register_slim_playback; - case SLIMBUS_1_RX: - strlcpy(stream_name, "Slimbus1 Playback", 80); - goto register_slim_playback; - case SLIMBUS_3_RX: - strlcpy(stream_name, "Slimbus3 Playback", 80); - goto register_slim_playback; - case SLIMBUS_4_RX: - strlcpy(stream_name, "Slimbus4 Playback", 80); - goto register_slim_playback; - case SLIMBUS_5_RX: - strlcpy(stream_name, "Slimbus5 Playback", 80); - goto register_slim_playback; case SLIMBUS_6_RX: strlcpy(stream_name, "Slimbus6 Playback", 80); goto register_slim_playback; - case SLIMBUS_7_RX: - strlcpy(stream_name, "Slimbus7 Playback", sizeof(stream_name)); - goto register_slim_playback; - case SLIMBUS_8_RX: - strlcpy(stream_name, "Slimbus8 Playback", sizeof(stream_name)); - goto register_slim_playback; - case SLIMBUS_9_RX: - strlcpy(stream_name, "Slimbus9 Playback", sizeof(stream_name)); - goto register_slim_playback; register_slim_playback: rc = -ENODEV; len = strnlen(stream_name, 80); @@ -7176,33 +2991,6 @@ register_slim_playback: case SLIMBUS_0_TX: strlcpy(stream_name, "Slimbus Capture", 80); goto register_slim_capture; - case SLIMBUS_1_TX: - strlcpy(stream_name, "Slimbus1 Capture", 80); - goto register_slim_capture; - case SLIMBUS_2_TX: - strlcpy(stream_name, "Slimbus2 Capture", 80); - goto register_slim_capture; - case SLIMBUS_3_TX: - strlcpy(stream_name, "Slimbus3 Capture", 80); - goto register_slim_capture; - case SLIMBUS_4_TX: - strlcpy(stream_name, "Slimbus4 Capture", 80); - goto register_slim_capture; - case SLIMBUS_5_TX: - strlcpy(stream_name, "Slimbus5 Capture", 80); - goto register_slim_capture; - case SLIMBUS_6_TX: - strlcpy(stream_name, "Slimbus6 Capture", 80); - goto register_slim_capture; - case SLIMBUS_7_TX: - strlcpy(stream_name, "Slimbus7 Capture", sizeof(stream_name)); - goto register_slim_capture; - case SLIMBUS_8_TX: - strlcpy(stream_name, "Slimbus8 Capture", sizeof(stream_name)); - goto register_slim_capture; - case SLIMBUS_9_TX: - strlcpy(stream_name, "Slimbus9 Capture", sizeof(stream_name)); - goto register_slim_capture; register_slim_capture: rc = -ENODEV; len = strnlen(stream_name, 80); @@ -7221,141 +3009,6 @@ register_slim_capture: pr_err("%s: Device not found stream name %s\n", __func__, stream_name); break; - case AFE_LOOPBACK_TX: - rc = snd_soc_register_component(&pdev->dev, - &msm_dai_q6_component, - &msm_dai_q6_afe_lb_tx_dai[0], - 1); - break; - case INT_BT_SCO_RX: - rc = snd_soc_register_component(&pdev->dev, - &msm_dai_q6_component, &msm_dai_q6_bt_sco_rx_dai, 1); - break; - case INT_BT_SCO_TX: - rc = snd_soc_register_component(&pdev->dev, - &msm_dai_q6_component, &msm_dai_q6_bt_sco_tx_dai, 1); - break; - case INT_BT_A2DP_RX: - rc = snd_soc_register_component(&pdev->dev, - &msm_dai_q6_component, &msm_dai_q6_bt_a2dp_rx_dai, 1); - break; - case INT_FM_RX: - rc = snd_soc_register_component(&pdev->dev, - &msm_dai_q6_component, &msm_dai_q6_fm_rx_dai, 1); - break; - case INT_FM_TX: - rc = snd_soc_register_component(&pdev->dev, - &msm_dai_q6_component, &msm_dai_q6_fm_tx_dai, 1); - break; - case AFE_PORT_ID_USB_RX: - rc = snd_soc_register_component(&pdev->dev, - &msm_dai_q6_component, &msm_dai_q6_usb_rx_dai, 1); - break; - case AFE_PORT_ID_USB_TX: - rc = snd_soc_register_component(&pdev->dev, - &msm_dai_q6_component, &msm_dai_q6_usb_tx_dai, 1); - break; - case RT_PROXY_DAI_001_RX: - strlcpy(stream_name, "AFE Playback", 80); - goto register_afe_playback; - case RT_PROXY_DAI_002_RX: - strlcpy(stream_name, "AFE-PROXY RX", 80); -register_afe_playback: - rc = -ENODEV; - len = strnlen(stream_name, 80); - for (i = 0; i < ARRAY_SIZE(msm_dai_q6_afe_rx_dai); i++) { - if (msm_dai_q6_afe_rx_dai[i].playback.stream_name && - !strcmp(stream_name, - msm_dai_q6_afe_rx_dai[i].playback.stream_name)) { - rc = snd_soc_register_component(&pdev->dev, - &msm_dai_q6_component, - &msm_dai_q6_afe_rx_dai[i], 1); - break; - } - } - if (rc) - pr_err("%s: Device not found stream name %s\n", - __func__, stream_name); - break; - case RT_PROXY_DAI_001_TX: - strlcpy(stream_name, "AFE-PROXY TX", 80); - goto register_afe_capture; - case RT_PROXY_DAI_002_TX: - strlcpy(stream_name, "AFE Capture", 80); -register_afe_capture: - rc = -ENODEV; - len = strnlen(stream_name, 80); - for (i = 0; i < ARRAY_SIZE(msm_dai_q6_afe_tx_dai); i++) { - if (msm_dai_q6_afe_tx_dai[i].capture.stream_name && - !strcmp(stream_name, - msm_dai_q6_afe_tx_dai[i].capture.stream_name)) { - rc = snd_soc_register_component(&pdev->dev, - &msm_dai_q6_component, - &msm_dai_q6_afe_tx_dai[i], 1); - break; - } - } - if (rc) - pr_err("%s: Device not found stream name %s\n", - __func__, stream_name); - break; - case RT_PROXY_DAI_003_TX: - rc = snd_soc_register_component(&pdev->dev, - &msm_dai_q6_component, &msm_dai_q6_afe_cap_dai, 1); - break; - case VOICE_PLAYBACK_TX: - strlcpy(stream_name, "Voice Farend Playback", 80); - goto register_voice_playback; - case VOICE2_PLAYBACK_TX: - strlcpy(stream_name, "Voice2 Farend Playback", 80); -register_voice_playback: - rc = -ENODEV; - len = strnlen(stream_name, 80); - for (i = 0; i < ARRAY_SIZE(msm_dai_q6_voc_playback_dai); i++) { - if (msm_dai_q6_voc_playback_dai[i].playback.stream_name - && !strcmp(stream_name, - msm_dai_q6_voc_playback_dai[i].playback.stream_name)) { - rc = snd_soc_register_component(&pdev->dev, - &msm_dai_q6_component, - &msm_dai_q6_voc_playback_dai[i], 1); - break; - } - } - if (rc) - pr_err("%s Device not found stream name %s\n", - __func__, stream_name); - break; - case VOICE_RECORD_RX: - strlcpy(stream_name, "Voice Downlink Capture", 80); - goto register_uplink_capture; - case VOICE_RECORD_TX: - strlcpy(stream_name, "Voice Uplink Capture", 80); -register_uplink_capture: - rc = -ENODEV; - len = strnlen(stream_name, 80); - for (i = 0; i < ARRAY_SIZE(msm_dai_q6_incall_record_dai); i++) { - if (msm_dai_q6_incall_record_dai[i].capture.stream_name - && !strcmp(stream_name, - msm_dai_q6_incall_record_dai[i]. - capture.stream_name)) { - rc = snd_soc_register_component(&pdev->dev, - &msm_dai_q6_component, - &msm_dai_q6_incall_record_dai[i], 1); - break; - } - } - if (rc) - pr_err("%s: Device not found stream name %s\n", - __func__, stream_name); - break; - case RT_PROXY_PORT_002_RX: - rc = snd_soc_register_component(&pdev->dev, - &msm_dai_q6_component, &msm_dai_q6_proxy_rx_dai, 1); - break; - case RT_PROXY_PORT_002_TX: - rc = snd_soc_register_component(&pdev->dev, - &msm_dai_q6_component, &msm_dai_q6_proxy_tx_dai, 1); - break; default: rc = -ENODEV; break; @@ -7479,6 +3132,7 @@ static struct platform_driver msm_dai_q6_mi2s_driver = { }, }; +#if 0 static const struct of_device_id msm_dai_q6_meta_mi2s_dev_dt_match[] = { { .compatible = "qcom,msm-dai-q6-meta-mi2s", }, { } @@ -7496,122 +3150,46 @@ static struct platform_driver msm_dai_q6_meta_mi2s_driver = { .suppress_bind_attrs = true, }, }; - -static int msm_dai_q6_spdif_dev_probe(struct platform_device *pdev) -{ - int rc, id; - const char *q6_dev_id = "qcom,msm-dai-q6-dev-id"; - - rc = of_property_read_u32(pdev->dev.of_node, q6_dev_id, &id); - if (rc) { - dev_err(&pdev->dev, - "%s: missing %s in dt node\n", __func__, q6_dev_id); - return rc; - } - - pdev->id = id; - - pr_debug("%s: dev name %s, id:%d\n", __func__, - dev_name(&pdev->dev), pdev->id); - - switch (pdev->id) { - case AFE_PORT_ID_PRIMARY_SPDIF_RX: - rc = snd_soc_register_component(&pdev->dev, - &msm_dai_spdif_q6_component, - &msm_dai_q6_spdif_spdif_rx_dai[0], 1); - break; - case AFE_PORT_ID_SECONDARY_SPDIF_RX: - rc = snd_soc_register_component(&pdev->dev, - &msm_dai_spdif_q6_component, - &msm_dai_q6_spdif_spdif_rx_dai[1], 1); - break; - case AFE_PORT_ID_PRIMARY_SPDIF_TX: - rc = snd_soc_register_component(&pdev->dev, - &msm_dai_spdif_q6_component, - &msm_dai_q6_spdif_spdif_tx_dai[0], 1); - break; - case AFE_PORT_ID_SECONDARY_SPDIF_TX: - rc = snd_soc_register_component(&pdev->dev, - &msm_dai_spdif_q6_component, - &msm_dai_q6_spdif_spdif_tx_dai[1], 1); - break; - default: - dev_err(&pdev->dev, "invalid device ID %d\n", pdev->id); - rc = -ENODEV; - break; - } - - return rc; -} - -static int msm_dai_q6_spdif_dev_remove(struct platform_device *pdev) -{ - snd_soc_unregister_component(&pdev->dev); - return 0; -} - -static const struct of_device_id msm_dai_q6_spdif_dt_match[] = { - {.compatible = "qcom,msm-dai-q6-spdif"}, - {} -}; -MODULE_DEVICE_TABLE(of, msm_dai_q6_spdif_dt_match); - -static struct platform_driver msm_dai_q6_spdif_driver = { - .probe = msm_dai_q6_spdif_dev_probe, - .remove = msm_dai_q6_spdif_dev_remove, - .driver = { - .name = "msm-dai-q6-spdif", - .owner = THIS_MODULE, - .of_match_table = msm_dai_q6_spdif_dt_match, - .suppress_bind_attrs = true, - }, -}; +#endif static int msm_dai_q6_tdm_set_clk_param(u32 group_id, - struct afe_clk_set *clk_set, u32 mode) + struct clk_cfg *clk_set, u32 mode) { switch (group_id) { case AFE_GROUP_DEVICE_ID_PRIMARY_TDM_RX: case AFE_GROUP_DEVICE_ID_PRIMARY_TDM_TX: if (mode) - clk_set->clk_id = Q6AFE_LPASS_CLK_ID_PRI_TDM_IBIT; + clk_set->clk_id = CLOCK_ID_PRI_TDM_IBIT; else - clk_set->clk_id = Q6AFE_LPASS_CLK_ID_PRI_TDM_EBIT; + clk_set->clk_id = CLOCK_ID_PRI_TDM_EBIT; break; case AFE_GROUP_DEVICE_ID_SECONDARY_TDM_RX: case AFE_GROUP_DEVICE_ID_SECONDARY_TDM_TX: if (mode) - clk_set->clk_id = Q6AFE_LPASS_CLK_ID_SEC_TDM_IBIT; + clk_set->clk_id = CLOCK_ID_SEC_TDM_IBIT; else - clk_set->clk_id = Q6AFE_LPASS_CLK_ID_SEC_TDM_EBIT; + clk_set->clk_id = CLOCK_ID_SEC_TDM_EBIT; break; case AFE_GROUP_DEVICE_ID_TERTIARY_TDM_RX: case AFE_GROUP_DEVICE_ID_TERTIARY_TDM_TX: if (mode) - clk_set->clk_id = Q6AFE_LPASS_CLK_ID_TER_TDM_IBIT; + clk_set->clk_id = CLOCK_ID_TER_TDM_IBIT; else - clk_set->clk_id = Q6AFE_LPASS_CLK_ID_TER_TDM_EBIT; + clk_set->clk_id = CLOCK_ID_TER_TDM_EBIT; break; case AFE_GROUP_DEVICE_ID_QUATERNARY_TDM_RX: case AFE_GROUP_DEVICE_ID_QUATERNARY_TDM_TX: if (mode) - clk_set->clk_id = Q6AFE_LPASS_CLK_ID_QUAD_TDM_IBIT; + clk_set->clk_id = CLOCK_ID_QUAD_TDM_IBIT; else - clk_set->clk_id = Q6AFE_LPASS_CLK_ID_QUAD_TDM_EBIT; + clk_set->clk_id = CLOCK_ID_QUAD_TDM_EBIT; break; case AFE_GROUP_DEVICE_ID_QUINARY_TDM_RX: case AFE_GROUP_DEVICE_ID_QUINARY_TDM_TX: if (mode) - clk_set->clk_id = Q6AFE_LPASS_CLK_ID_QUIN_TDM_IBIT; + clk_set->clk_id = CLOCK_ID_QUI_TDM_IBIT; else - clk_set->clk_id = Q6AFE_LPASS_CLK_ID_QUIN_TDM_EBIT; - break; - case AFE_GROUP_DEVICE_ID_SENARY_TDM_RX: - case AFE_GROUP_DEVICE_ID_SENARY_TDM_TX: - if (mode) - clk_set->clk_id = Q6AFE_LPASS_CLK_ID_SEN_TDM_IBIT; - else - clk_set->clk_id = Q6AFE_LPASS_CLK_ID_SEN_TDM_EBIT; + clk_set->clk_id = CLOCK_ID_QUI_TDM_EBIT; break; default: return -EINVAL; @@ -7695,14 +3273,14 @@ static int msm_dai_tdm_q6_probe(struct platform_device *pdev) } dev_dbg(&pdev->dev, "%s: Clk Rate from DT file %d\n", __func__, tdm_clk_set.clk_freq_in_hz); - + tdm_clk_set.clk_freq_in_hz = 48000*8*32; /* initialize static tdm clk attribute to default value */ - tdm_clk_set.clk_attri = Q6AFE_LPASS_CLK_ATTRIBUTE_INVERT_COUPLE_NO; + tdm_clk_set.clk_attri = CLOCK_ATTRIBUTE_COUPLE_NO; /* extract tdm clk attribute into static */ if (of_find_property(pdev->dev.of_node, "qcom,msm-cpudai-tdm-clk-attribute", NULL)) { - rc = of_property_read_u16(pdev->dev.of_node, + rc = of_property_read_u32(pdev->dev.of_node, "qcom,msm-cpudai-tdm-clk-attribute", &tdm_clk_set.clk_attri); if (rc) { @@ -7799,1385 +3377,16 @@ static struct platform_driver msm_dai_tdm_q6 = { }, }; -static int msm_dai_q6_tdm_data_format_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct msm_dai_q6_tdm_dai_data *dai_data = kcontrol->private_data; - int value = ucontrol->value.integer.value[0]; - - switch (value) { - case 0: - dai_data->port_cfg.tdm.data_format = AFE_LINEAR_PCM_DATA; - break; - case 1: - dai_data->port_cfg.tdm.data_format = AFE_NON_LINEAR_DATA; - break; - case 2: - dai_data->port_cfg.tdm.data_format = AFE_GENERIC_COMPRESSED; - break; - default: - pr_err("%s: data_format invalid\n", __func__); - break; - } - pr_debug("%s: data_format = %d\n", - __func__, dai_data->port_cfg.tdm.data_format); - return 0; -} - -static int msm_dai_q6_tdm_data_format_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct msm_dai_q6_tdm_dai_data *dai_data = kcontrol->private_data; - - ucontrol->value.integer.value[0] = - dai_data->port_cfg.tdm.data_format; - pr_debug("%s: data_format = %d\n", - __func__, dai_data->port_cfg.tdm.data_format); - return 0; -} - -static int msm_dai_q6_tdm_header_type_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct msm_dai_q6_tdm_dai_data *dai_data = kcontrol->private_data; - int value = ucontrol->value.integer.value[0]; - - dai_data->port_cfg.custom_tdm_header.header_type = value; - pr_debug("%s: header_type = %d\n", - __func__, - dai_data->port_cfg.custom_tdm_header.header_type); - return 0; -} - -static int msm_dai_q6_tdm_header_type_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct msm_dai_q6_tdm_dai_data *dai_data = kcontrol->private_data; - - ucontrol->value.integer.value[0] = - dai_data->port_cfg.custom_tdm_header.header_type; - pr_debug("%s: header_type = %d\n", - __func__, - dai_data->port_cfg.custom_tdm_header.header_type); - return 0; -} - -static int msm_dai_q6_tdm_header_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct msm_dai_q6_tdm_dai_data *dai_data = kcontrol->private_data; - int i = 0; - - for (i = 0; i < AFE_CUSTOM_TDM_HEADER_MAX_CNT; i++) { - dai_data->port_cfg.custom_tdm_header.header[i] = - (u16)ucontrol->value.integer.value[i]; - pr_debug("%s: header #%d = 0x%x\n", - __func__, i, - dai_data->port_cfg.custom_tdm_header.header[i]); - } - return 0; -} - -static int msm_dai_q6_tdm_header_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct msm_dai_q6_tdm_dai_data *dai_data = kcontrol->private_data; - int i = 0; - - for (i = 0; i < AFE_CUSTOM_TDM_HEADER_MAX_CNT; i++) { - ucontrol->value.integer.value[i] = - dai_data->port_cfg.custom_tdm_header.header[i]; - pr_debug("%s: header #%d = 0x%x\n", - __func__, i, - dai_data->port_cfg.custom_tdm_header.header[i]); - } - return 0; -} - -static const struct snd_kcontrol_new tdm_config_controls_data_format[] = { - SOC_ENUM_EXT("PRI_TDM_RX_0 Data Format", tdm_config_enum[0], - msm_dai_q6_tdm_data_format_get, - msm_dai_q6_tdm_data_format_put), - SOC_ENUM_EXT("PRI_TDM_RX_1 Data Format", tdm_config_enum[0], - msm_dai_q6_tdm_data_format_get, - msm_dai_q6_tdm_data_format_put), - SOC_ENUM_EXT("PRI_TDM_RX_2 Data Format", tdm_config_enum[0], - msm_dai_q6_tdm_data_format_get, - msm_dai_q6_tdm_data_format_put), - SOC_ENUM_EXT("PRI_TDM_RX_3 Data Format", tdm_config_enum[0], - msm_dai_q6_tdm_data_format_get, - msm_dai_q6_tdm_data_format_put), - SOC_ENUM_EXT("PRI_TDM_RX_4 Data Format", tdm_config_enum[0], - msm_dai_q6_tdm_data_format_get, - msm_dai_q6_tdm_data_format_put), - SOC_ENUM_EXT("PRI_TDM_RX_5 Data Format", tdm_config_enum[0], - msm_dai_q6_tdm_data_format_get, - msm_dai_q6_tdm_data_format_put), - SOC_ENUM_EXT("PRI_TDM_RX_6 Data Format", tdm_config_enum[0], - msm_dai_q6_tdm_data_format_get, - msm_dai_q6_tdm_data_format_put), - SOC_ENUM_EXT("PRI_TDM_RX_7 Data Format", tdm_config_enum[0], - msm_dai_q6_tdm_data_format_get, - msm_dai_q6_tdm_data_format_put), - SOC_ENUM_EXT("PRI_TDM_TX_0 Data Format", tdm_config_enum[0], - msm_dai_q6_tdm_data_format_get, - msm_dai_q6_tdm_data_format_put), - SOC_ENUM_EXT("PRI_TDM_TX_1 Data Format", tdm_config_enum[0], - msm_dai_q6_tdm_data_format_get, - msm_dai_q6_tdm_data_format_put), - SOC_ENUM_EXT("PRI_TDM_TX_2 Data Format", tdm_config_enum[0], - msm_dai_q6_tdm_data_format_get, - msm_dai_q6_tdm_data_format_put), - SOC_ENUM_EXT("PRI_TDM_TX_3 Data Format", tdm_config_enum[0], - msm_dai_q6_tdm_data_format_get, - msm_dai_q6_tdm_data_format_put), - SOC_ENUM_EXT("PRI_TDM_TX_4 Data Format", tdm_config_enum[0], - msm_dai_q6_tdm_data_format_get, - msm_dai_q6_tdm_data_format_put), - SOC_ENUM_EXT("PRI_TDM_TX_5 Data Format", tdm_config_enum[0], - msm_dai_q6_tdm_data_format_get, - msm_dai_q6_tdm_data_format_put), - SOC_ENUM_EXT("PRI_TDM_TX_6 Data Format", tdm_config_enum[0], - msm_dai_q6_tdm_data_format_get, - msm_dai_q6_tdm_data_format_put), - SOC_ENUM_EXT("PRI_TDM_TX_7 Data Format", tdm_config_enum[0], - msm_dai_q6_tdm_data_format_get, - msm_dai_q6_tdm_data_format_put), - SOC_ENUM_EXT("SEC_TDM_RX_0 Data Format", tdm_config_enum[0], - msm_dai_q6_tdm_data_format_get, - msm_dai_q6_tdm_data_format_put), - SOC_ENUM_EXT("SEC_TDM_RX_1 Data Format", tdm_config_enum[0], - msm_dai_q6_tdm_data_format_get, - msm_dai_q6_tdm_data_format_put), - SOC_ENUM_EXT("SEC_TDM_RX_2 Data Format", tdm_config_enum[0], - msm_dai_q6_tdm_data_format_get, - msm_dai_q6_tdm_data_format_put), - SOC_ENUM_EXT("SEC_TDM_RX_3 Data Format", tdm_config_enum[0], - msm_dai_q6_tdm_data_format_get, - msm_dai_q6_tdm_data_format_put), - SOC_ENUM_EXT("SEC_TDM_RX_4 Data Format", tdm_config_enum[0], - msm_dai_q6_tdm_data_format_get, - msm_dai_q6_tdm_data_format_put), - SOC_ENUM_EXT("SEC_TDM_RX_5 Data Format", tdm_config_enum[0], - msm_dai_q6_tdm_data_format_get, - msm_dai_q6_tdm_data_format_put), - SOC_ENUM_EXT("SEC_TDM_RX_6 Data Format", tdm_config_enum[0], - msm_dai_q6_tdm_data_format_get, - msm_dai_q6_tdm_data_format_put), - SOC_ENUM_EXT("SEC_TDM_RX_7 Data Format", tdm_config_enum[0], - msm_dai_q6_tdm_data_format_get, - msm_dai_q6_tdm_data_format_put), - SOC_ENUM_EXT("SEC_TDM_TX_0 Data Format", tdm_config_enum[0], - msm_dai_q6_tdm_data_format_get, - msm_dai_q6_tdm_data_format_put), - SOC_ENUM_EXT("SEC_TDM_TX_1 Data Format", tdm_config_enum[0], - msm_dai_q6_tdm_data_format_get, - msm_dai_q6_tdm_data_format_put), - SOC_ENUM_EXT("SEC_TDM_TX_2 Data Format", tdm_config_enum[0], - msm_dai_q6_tdm_data_format_get, - msm_dai_q6_tdm_data_format_put), - SOC_ENUM_EXT("SEC_TDM_TX_3 Data Format", tdm_config_enum[0], - msm_dai_q6_tdm_data_format_get, - msm_dai_q6_tdm_data_format_put), - SOC_ENUM_EXT("SEC_TDM_TX_4 Data Format", tdm_config_enum[0], - msm_dai_q6_tdm_data_format_get, - msm_dai_q6_tdm_data_format_put), - SOC_ENUM_EXT("SEC_TDM_TX_5 Data Format", tdm_config_enum[0], - msm_dai_q6_tdm_data_format_get, - msm_dai_q6_tdm_data_format_put), - SOC_ENUM_EXT("SEC_TDM_TX_6 Data Format", tdm_config_enum[0], - msm_dai_q6_tdm_data_format_get, - msm_dai_q6_tdm_data_format_put), - SOC_ENUM_EXT("SEC_TDM_TX_7 Data Format", tdm_config_enum[0], - msm_dai_q6_tdm_data_format_get, - msm_dai_q6_tdm_data_format_put), - SOC_ENUM_EXT("TERT_TDM_RX_0 Data Format", tdm_config_enum[0], - msm_dai_q6_tdm_data_format_get, - msm_dai_q6_tdm_data_format_put), - SOC_ENUM_EXT("TERT_TDM_RX_1 Data Format", tdm_config_enum[0], - msm_dai_q6_tdm_data_format_get, - msm_dai_q6_tdm_data_format_put), - SOC_ENUM_EXT("TERT_TDM_RX_2 Data Format", tdm_config_enum[0], - msm_dai_q6_tdm_data_format_get, - msm_dai_q6_tdm_data_format_put), - SOC_ENUM_EXT("TERT_TDM_RX_3 Data Format", tdm_config_enum[0], - msm_dai_q6_tdm_data_format_get, - msm_dai_q6_tdm_data_format_put), - SOC_ENUM_EXT("TERT_TDM_RX_4 Data Format", tdm_config_enum[0], - msm_dai_q6_tdm_data_format_get, - msm_dai_q6_tdm_data_format_put), - SOC_ENUM_EXT("TERT_TDM_RX_5 Data Format", tdm_config_enum[0], - msm_dai_q6_tdm_data_format_get, - msm_dai_q6_tdm_data_format_put), - SOC_ENUM_EXT("TERT_TDM_RX_6 Data Format", tdm_config_enum[0], - msm_dai_q6_tdm_data_format_get, - msm_dai_q6_tdm_data_format_put), - SOC_ENUM_EXT("TERT_TDM_RX_7 Data Format", tdm_config_enum[0], - msm_dai_q6_tdm_data_format_get, - msm_dai_q6_tdm_data_format_put), - SOC_ENUM_EXT("TERT_TDM_TX_0 Data Format", tdm_config_enum[0], - msm_dai_q6_tdm_data_format_get, - msm_dai_q6_tdm_data_format_put), - SOC_ENUM_EXT("TERT_TDM_TX_1 Data Format", tdm_config_enum[0], - msm_dai_q6_tdm_data_format_get, - msm_dai_q6_tdm_data_format_put), - SOC_ENUM_EXT("TERT_TDM_TX_2 Data Format", tdm_config_enum[0], - msm_dai_q6_tdm_data_format_get, - msm_dai_q6_tdm_data_format_put), - SOC_ENUM_EXT("TERT_TDM_TX_3 Data Format", tdm_config_enum[0], - msm_dai_q6_tdm_data_format_get, - msm_dai_q6_tdm_data_format_put), - SOC_ENUM_EXT("TERT_TDM_TX_4 Data Format", tdm_config_enum[0], - msm_dai_q6_tdm_data_format_get, - msm_dai_q6_tdm_data_format_put), - SOC_ENUM_EXT("TERT_TDM_TX_5 Data Format", tdm_config_enum[0], - msm_dai_q6_tdm_data_format_get, - msm_dai_q6_tdm_data_format_put), - SOC_ENUM_EXT("TERT_TDM_TX_6 Data Format", tdm_config_enum[0], - msm_dai_q6_tdm_data_format_get, - msm_dai_q6_tdm_data_format_put), - SOC_ENUM_EXT("TERT_TDM_TX_7 Data Format", tdm_config_enum[0], - msm_dai_q6_tdm_data_format_get, - msm_dai_q6_tdm_data_format_put), - SOC_ENUM_EXT("QUAT_TDM_RX_0 Data Format", tdm_config_enum[0], - msm_dai_q6_tdm_data_format_get, - msm_dai_q6_tdm_data_format_put), - SOC_ENUM_EXT("QUAT_TDM_RX_1 Data Format", tdm_config_enum[0], - msm_dai_q6_tdm_data_format_get, - msm_dai_q6_tdm_data_format_put), - SOC_ENUM_EXT("QUAT_TDM_RX_2 Data Format", tdm_config_enum[0], - msm_dai_q6_tdm_data_format_get, - msm_dai_q6_tdm_data_format_put), - SOC_ENUM_EXT("QUAT_TDM_RX_3 Data Format", tdm_config_enum[0], - msm_dai_q6_tdm_data_format_get, - msm_dai_q6_tdm_data_format_put), - SOC_ENUM_EXT("QUAT_TDM_RX_4 Data Format", tdm_config_enum[0], - msm_dai_q6_tdm_data_format_get, - msm_dai_q6_tdm_data_format_put), - SOC_ENUM_EXT("QUAT_TDM_RX_5 Data Format", tdm_config_enum[0], - msm_dai_q6_tdm_data_format_get, - msm_dai_q6_tdm_data_format_put), - SOC_ENUM_EXT("QUAT_TDM_RX_6 Data Format", tdm_config_enum[0], - msm_dai_q6_tdm_data_format_get, - msm_dai_q6_tdm_data_format_put), - SOC_ENUM_EXT("QUAT_TDM_RX_7 Data Format", tdm_config_enum[0], - msm_dai_q6_tdm_data_format_get, - msm_dai_q6_tdm_data_format_put), - SOC_ENUM_EXT("QUAT_TDM_TX_0 Data Format", tdm_config_enum[0], - msm_dai_q6_tdm_data_format_get, - msm_dai_q6_tdm_data_format_put), - SOC_ENUM_EXT("QUAT_TDM_TX_1 Data Format", tdm_config_enum[0], - msm_dai_q6_tdm_data_format_get, - msm_dai_q6_tdm_data_format_put), - SOC_ENUM_EXT("QUAT_TDM_TX_2 Data Format", tdm_config_enum[0], - msm_dai_q6_tdm_data_format_get, - msm_dai_q6_tdm_data_format_put), - SOC_ENUM_EXT("QUAT_TDM_TX_3 Data Format", tdm_config_enum[0], - msm_dai_q6_tdm_data_format_get, - msm_dai_q6_tdm_data_format_put), - SOC_ENUM_EXT("QUAT_TDM_TX_4 Data Format", tdm_config_enum[0], - msm_dai_q6_tdm_data_format_get, - msm_dai_q6_tdm_data_format_put), - SOC_ENUM_EXT("QUAT_TDM_TX_5 Data Format", tdm_config_enum[0], - msm_dai_q6_tdm_data_format_get, - msm_dai_q6_tdm_data_format_put), - SOC_ENUM_EXT("QUAT_TDM_TX_6 Data Format", tdm_config_enum[0], - msm_dai_q6_tdm_data_format_get, - msm_dai_q6_tdm_data_format_put), - SOC_ENUM_EXT("QUAT_TDM_TX_7 Data Format", tdm_config_enum[0], - msm_dai_q6_tdm_data_format_get, - msm_dai_q6_tdm_data_format_put), - SOC_ENUM_EXT("QUIN_TDM_RX_0 Data Format", tdm_config_enum[0], - msm_dai_q6_tdm_data_format_get, - msm_dai_q6_tdm_data_format_put), - SOC_ENUM_EXT("QUIN_TDM_RX_1 Data Format", tdm_config_enum[0], - msm_dai_q6_tdm_data_format_get, - msm_dai_q6_tdm_data_format_put), - SOC_ENUM_EXT("QUIN_TDM_RX_2 Data Format", tdm_config_enum[0], - msm_dai_q6_tdm_data_format_get, - msm_dai_q6_tdm_data_format_put), - SOC_ENUM_EXT("QUIN_TDM_RX_3 Data Format", tdm_config_enum[0], - msm_dai_q6_tdm_data_format_get, - msm_dai_q6_tdm_data_format_put), - SOC_ENUM_EXT("QUIN_TDM_RX_4 Data Format", tdm_config_enum[0], - msm_dai_q6_tdm_data_format_get, - msm_dai_q6_tdm_data_format_put), - SOC_ENUM_EXT("QUIN_TDM_RX_5 Data Format", tdm_config_enum[0], - msm_dai_q6_tdm_data_format_get, - msm_dai_q6_tdm_data_format_put), - SOC_ENUM_EXT("QUIN_TDM_RX_6 Data Format", tdm_config_enum[0], - msm_dai_q6_tdm_data_format_get, - msm_dai_q6_tdm_data_format_put), - SOC_ENUM_EXT("QUIN_TDM_RX_7 Data Format", tdm_config_enum[0], - msm_dai_q6_tdm_data_format_get, - msm_dai_q6_tdm_data_format_put), - SOC_ENUM_EXT("QUIN_TDM_TX_0 Data Format", tdm_config_enum[0], - msm_dai_q6_tdm_data_format_get, - msm_dai_q6_tdm_data_format_put), - SOC_ENUM_EXT("QUIN_TDM_TX_1 Data Format", tdm_config_enum[0], - msm_dai_q6_tdm_data_format_get, - msm_dai_q6_tdm_data_format_put), - SOC_ENUM_EXT("QUIN_TDM_TX_2 Data Format", tdm_config_enum[0], - msm_dai_q6_tdm_data_format_get, - msm_dai_q6_tdm_data_format_put), - SOC_ENUM_EXT("QUIN_TDM_TX_3 Data Format", tdm_config_enum[0], - msm_dai_q6_tdm_data_format_get, - msm_dai_q6_tdm_data_format_put), - SOC_ENUM_EXT("QUIN_TDM_TX_4 Data Format", tdm_config_enum[0], - msm_dai_q6_tdm_data_format_get, - msm_dai_q6_tdm_data_format_put), - SOC_ENUM_EXT("QUIN_TDM_TX_5 Data Format", tdm_config_enum[0], - msm_dai_q6_tdm_data_format_get, - msm_dai_q6_tdm_data_format_put), - SOC_ENUM_EXT("QUIN_TDM_TX_6 Data Format", tdm_config_enum[0], - msm_dai_q6_tdm_data_format_get, - msm_dai_q6_tdm_data_format_put), - SOC_ENUM_EXT("QUIN_TDM_TX_7 Data Format", tdm_config_enum[0], - msm_dai_q6_tdm_data_format_get, - msm_dai_q6_tdm_data_format_put), - SOC_ENUM_EXT("SEN_TDM_RX_0 Data Format", tdm_config_enum[0], - msm_dai_q6_tdm_data_format_get, - msm_dai_q6_tdm_data_format_put), - SOC_ENUM_EXT("SEN_TDM_RX_1 Data Format", tdm_config_enum[0], - msm_dai_q6_tdm_data_format_get, - msm_dai_q6_tdm_data_format_put), - SOC_ENUM_EXT("SEN_TDM_RX_2 Data Format", tdm_config_enum[0], - msm_dai_q6_tdm_data_format_get, - msm_dai_q6_tdm_data_format_put), - SOC_ENUM_EXT("SEN_TDM_RX_3 Data Format", tdm_config_enum[0], - msm_dai_q6_tdm_data_format_get, - msm_dai_q6_tdm_data_format_put), - SOC_ENUM_EXT("SEN_TDM_RX_4 Data Format", tdm_config_enum[0], - msm_dai_q6_tdm_data_format_get, - msm_dai_q6_tdm_data_format_put), - SOC_ENUM_EXT("SEN_TDM_RX_5 Data Format", tdm_config_enum[0], - msm_dai_q6_tdm_data_format_get, - msm_dai_q6_tdm_data_format_put), - SOC_ENUM_EXT("SEN_TDM_RX_6 Data Format", tdm_config_enum[0], - msm_dai_q6_tdm_data_format_get, - msm_dai_q6_tdm_data_format_put), - SOC_ENUM_EXT("SEN_TDM_RX_7 Data Format", tdm_config_enum[0], - msm_dai_q6_tdm_data_format_get, - msm_dai_q6_tdm_data_format_put), - SOC_ENUM_EXT("SEN_TDM_TX_0 Data Format", tdm_config_enum[0], - msm_dai_q6_tdm_data_format_get, - msm_dai_q6_tdm_data_format_put), - SOC_ENUM_EXT("SEN_TDM_TX_1 Data Format", tdm_config_enum[0], - msm_dai_q6_tdm_data_format_get, - msm_dai_q6_tdm_data_format_put), - SOC_ENUM_EXT("SEN_TDM_TX_2 Data Format", tdm_config_enum[0], - msm_dai_q6_tdm_data_format_get, - msm_dai_q6_tdm_data_format_put), - SOC_ENUM_EXT("SEN_TDM_TX_3 Data Format", tdm_config_enum[0], - msm_dai_q6_tdm_data_format_get, - msm_dai_q6_tdm_data_format_put), - SOC_ENUM_EXT("SEN_TDM_TX_4 Data Format", tdm_config_enum[0], - msm_dai_q6_tdm_data_format_get, - msm_dai_q6_tdm_data_format_put), - SOC_ENUM_EXT("SEN_TDM_TX_5 Data Format", tdm_config_enum[0], - msm_dai_q6_tdm_data_format_get, - msm_dai_q6_tdm_data_format_put), - SOC_ENUM_EXT("SEN_TDM_TX_6 Data Format", tdm_config_enum[0], - msm_dai_q6_tdm_data_format_get, - msm_dai_q6_tdm_data_format_put), - SOC_ENUM_EXT("SEN_TDM_TX_7 Data Format", tdm_config_enum[0], - msm_dai_q6_tdm_data_format_get, - msm_dai_q6_tdm_data_format_put), -}; - -static const struct snd_kcontrol_new tdm_config_controls_header_type[] = { - SOC_ENUM_EXT("PRI_TDM_RX_0 Header Type", tdm_config_enum[1], - msm_dai_q6_tdm_header_type_get, - msm_dai_q6_tdm_header_type_put), - SOC_ENUM_EXT("PRI_TDM_RX_1 Header Type", tdm_config_enum[1], - msm_dai_q6_tdm_header_type_get, - msm_dai_q6_tdm_header_type_put), - SOC_ENUM_EXT("PRI_TDM_RX_2 Header Type", tdm_config_enum[1], - msm_dai_q6_tdm_header_type_get, - msm_dai_q6_tdm_header_type_put), - SOC_ENUM_EXT("PRI_TDM_RX_3 Header Type", tdm_config_enum[1], - msm_dai_q6_tdm_header_type_get, - msm_dai_q6_tdm_header_type_put), - SOC_ENUM_EXT("PRI_TDM_RX_4 Header Type", tdm_config_enum[1], - msm_dai_q6_tdm_header_type_get, - msm_dai_q6_tdm_header_type_put), - SOC_ENUM_EXT("PRI_TDM_RX_5 Header Type", tdm_config_enum[1], - msm_dai_q6_tdm_header_type_get, - msm_dai_q6_tdm_header_type_put), - SOC_ENUM_EXT("PRI_TDM_RX_6 Header Type", tdm_config_enum[1], - msm_dai_q6_tdm_header_type_get, - msm_dai_q6_tdm_header_type_put), - SOC_ENUM_EXT("PRI_TDM_RX_7 Header Type", tdm_config_enum[1], - msm_dai_q6_tdm_header_type_get, - msm_dai_q6_tdm_header_type_put), - SOC_ENUM_EXT("PRI_TDM_TX_0 Header Type", tdm_config_enum[1], - msm_dai_q6_tdm_header_type_get, - msm_dai_q6_tdm_header_type_put), - SOC_ENUM_EXT("PRI_TDM_TX_1 Header Type", tdm_config_enum[1], - msm_dai_q6_tdm_header_type_get, - msm_dai_q6_tdm_header_type_put), - SOC_ENUM_EXT("PRI_TDM_TX_2 Header Type", tdm_config_enum[1], - msm_dai_q6_tdm_header_type_get, - msm_dai_q6_tdm_header_type_put), - SOC_ENUM_EXT("PRI_TDM_TX_3 Header Type", tdm_config_enum[1], - msm_dai_q6_tdm_header_type_get, - msm_dai_q6_tdm_header_type_put), - SOC_ENUM_EXT("PRI_TDM_TX_4 Header Type", tdm_config_enum[1], - msm_dai_q6_tdm_header_type_get, - msm_dai_q6_tdm_header_type_put), - SOC_ENUM_EXT("PRI_TDM_TX_5 Header Type", tdm_config_enum[1], - msm_dai_q6_tdm_header_type_get, - msm_dai_q6_tdm_header_type_put), - SOC_ENUM_EXT("PRI_TDM_TX_6 Header Type", tdm_config_enum[1], - msm_dai_q6_tdm_header_type_get, - msm_dai_q6_tdm_header_type_put), - SOC_ENUM_EXT("PRI_TDM_TX_7 Header Type", tdm_config_enum[1], - msm_dai_q6_tdm_header_type_get, - msm_dai_q6_tdm_header_type_put), - SOC_ENUM_EXT("SEC_TDM_RX_0 Header Type", tdm_config_enum[1], - msm_dai_q6_tdm_header_type_get, - msm_dai_q6_tdm_header_type_put), - SOC_ENUM_EXT("SEC_TDM_RX_1 Header Type", tdm_config_enum[1], - msm_dai_q6_tdm_header_type_get, - msm_dai_q6_tdm_header_type_put), - SOC_ENUM_EXT("SEC_TDM_RX_2 Header Type", tdm_config_enum[1], - msm_dai_q6_tdm_header_type_get, - msm_dai_q6_tdm_header_type_put), - SOC_ENUM_EXT("SEC_TDM_RX_3 Header Type", tdm_config_enum[1], - msm_dai_q6_tdm_header_type_get, - msm_dai_q6_tdm_header_type_put), - SOC_ENUM_EXT("SEC_TDM_RX_4 Header Type", tdm_config_enum[1], - msm_dai_q6_tdm_header_type_get, - msm_dai_q6_tdm_header_type_put), - SOC_ENUM_EXT("SEC_TDM_RX_5 Header Type", tdm_config_enum[1], - msm_dai_q6_tdm_header_type_get, - msm_dai_q6_tdm_header_type_put), - SOC_ENUM_EXT("SEC_TDM_RX_6 Header Type", tdm_config_enum[1], - msm_dai_q6_tdm_header_type_get, - msm_dai_q6_tdm_header_type_put), - SOC_ENUM_EXT("SEC_TDM_RX_7 Header Type", tdm_config_enum[1], - msm_dai_q6_tdm_header_type_get, - msm_dai_q6_tdm_header_type_put), - SOC_ENUM_EXT("SEC_TDM_TX_0 Header Type", tdm_config_enum[1], - msm_dai_q6_tdm_header_type_get, - msm_dai_q6_tdm_header_type_put), - SOC_ENUM_EXT("SEC_TDM_TX_1 Header Type", tdm_config_enum[1], - msm_dai_q6_tdm_header_type_get, - msm_dai_q6_tdm_header_type_put), - SOC_ENUM_EXT("SEC_TDM_TX_2 Header Type", tdm_config_enum[1], - msm_dai_q6_tdm_header_type_get, - msm_dai_q6_tdm_header_type_put), - SOC_ENUM_EXT("SEC_TDM_TX_3 Header Type", tdm_config_enum[1], - msm_dai_q6_tdm_header_type_get, - msm_dai_q6_tdm_header_type_put), - SOC_ENUM_EXT("SEC_TDM_TX_4 Header Type", tdm_config_enum[1], - msm_dai_q6_tdm_header_type_get, - msm_dai_q6_tdm_header_type_put), - SOC_ENUM_EXT("SEC_TDM_TX_5 Header Type", tdm_config_enum[1], - msm_dai_q6_tdm_header_type_get, - msm_dai_q6_tdm_header_type_put), - SOC_ENUM_EXT("SEC_TDM_TX_6 Header Type", tdm_config_enum[1], - msm_dai_q6_tdm_header_type_get, - msm_dai_q6_tdm_header_type_put), - SOC_ENUM_EXT("SEC_TDM_TX_7 Header Type", tdm_config_enum[1], - msm_dai_q6_tdm_header_type_get, - msm_dai_q6_tdm_header_type_put), - SOC_ENUM_EXT("TERT_TDM_RX_0 Header Type", tdm_config_enum[1], - msm_dai_q6_tdm_header_type_get, - msm_dai_q6_tdm_header_type_put), - SOC_ENUM_EXT("TERT_TDM_RX_1 Header Type", tdm_config_enum[1], - msm_dai_q6_tdm_header_type_get, - msm_dai_q6_tdm_header_type_put), - SOC_ENUM_EXT("TERT_TDM_RX_2 Header Type", tdm_config_enum[1], - msm_dai_q6_tdm_header_type_get, - msm_dai_q6_tdm_header_type_put), - SOC_ENUM_EXT("TERT_TDM_RX_3 Header Type", tdm_config_enum[1], - msm_dai_q6_tdm_header_type_get, - msm_dai_q6_tdm_header_type_put), - SOC_ENUM_EXT("TERT_TDM_RX_4 Header Type", tdm_config_enum[1], - msm_dai_q6_tdm_header_type_get, - msm_dai_q6_tdm_header_type_put), - SOC_ENUM_EXT("TERT_TDM_RX_5 Header Type", tdm_config_enum[1], - msm_dai_q6_tdm_header_type_get, - msm_dai_q6_tdm_header_type_put), - SOC_ENUM_EXT("TERT_TDM_RX_6 Header Type", tdm_config_enum[1], - msm_dai_q6_tdm_header_type_get, - msm_dai_q6_tdm_header_type_put), - SOC_ENUM_EXT("TERT_TDM_RX_7 Header Type", tdm_config_enum[1], - msm_dai_q6_tdm_header_type_get, - msm_dai_q6_tdm_header_type_put), - SOC_ENUM_EXT("TERT_TDM_TX_0 Header Type", tdm_config_enum[1], - msm_dai_q6_tdm_header_type_get, - msm_dai_q6_tdm_header_type_put), - SOC_ENUM_EXT("TERT_TDM_TX_1 Header Type", tdm_config_enum[1], - msm_dai_q6_tdm_header_type_get, - msm_dai_q6_tdm_header_type_put), - SOC_ENUM_EXT("TERT_TDM_TX_2 Header Type", tdm_config_enum[1], - msm_dai_q6_tdm_header_type_get, - msm_dai_q6_tdm_header_type_put), - SOC_ENUM_EXT("TERT_TDM_TX_3 Header Type", tdm_config_enum[1], - msm_dai_q6_tdm_header_type_get, - msm_dai_q6_tdm_header_type_put), - SOC_ENUM_EXT("TERT_TDM_TX_4 Header Type", tdm_config_enum[1], - msm_dai_q6_tdm_header_type_get, - msm_dai_q6_tdm_header_type_put), - SOC_ENUM_EXT("TERT_TDM_TX_5 Header Type", tdm_config_enum[1], - msm_dai_q6_tdm_header_type_get, - msm_dai_q6_tdm_header_type_put), - SOC_ENUM_EXT("TERT_TDM_TX_6 Header Type", tdm_config_enum[1], - msm_dai_q6_tdm_header_type_get, - msm_dai_q6_tdm_header_type_put), - SOC_ENUM_EXT("TERT_TDM_TX_7 Header Type", tdm_config_enum[1], - msm_dai_q6_tdm_header_type_get, - msm_dai_q6_tdm_header_type_put), - SOC_ENUM_EXT("QUAT_TDM_RX_0 Header Type", tdm_config_enum[1], - msm_dai_q6_tdm_header_type_get, - msm_dai_q6_tdm_header_type_put), - SOC_ENUM_EXT("QUAT_TDM_RX_1 Header Type", tdm_config_enum[1], - msm_dai_q6_tdm_header_type_get, - msm_dai_q6_tdm_header_type_put), - SOC_ENUM_EXT("QUAT_TDM_RX_2 Header Type", tdm_config_enum[1], - msm_dai_q6_tdm_header_type_get, - msm_dai_q6_tdm_header_type_put), - SOC_ENUM_EXT("QUAT_TDM_RX_3 Header Type", tdm_config_enum[1], - msm_dai_q6_tdm_header_type_get, - msm_dai_q6_tdm_header_type_put), - SOC_ENUM_EXT("QUAT_TDM_RX_4 Header Type", tdm_config_enum[1], - msm_dai_q6_tdm_header_type_get, - msm_dai_q6_tdm_header_type_put), - SOC_ENUM_EXT("QUAT_TDM_RX_5 Header Type", tdm_config_enum[1], - msm_dai_q6_tdm_header_type_get, - msm_dai_q6_tdm_header_type_put), - SOC_ENUM_EXT("QUAT_TDM_RX_6 Header Type", tdm_config_enum[1], - msm_dai_q6_tdm_header_type_get, - msm_dai_q6_tdm_header_type_put), - SOC_ENUM_EXT("QUAT_TDM_RX_7 Header Type", tdm_config_enum[1], - msm_dai_q6_tdm_header_type_get, - msm_dai_q6_tdm_header_type_put), - SOC_ENUM_EXT("QUAT_TDM_TX_0 Header Type", tdm_config_enum[1], - msm_dai_q6_tdm_header_type_get, - msm_dai_q6_tdm_header_type_put), - SOC_ENUM_EXT("QUAT_TDM_TX_1 Header Type", tdm_config_enum[1], - msm_dai_q6_tdm_header_type_get, - msm_dai_q6_tdm_header_type_put), - SOC_ENUM_EXT("QUAT_TDM_TX_2 Header Type", tdm_config_enum[1], - msm_dai_q6_tdm_header_type_get, - msm_dai_q6_tdm_header_type_put), - SOC_ENUM_EXT("QUAT_TDM_TX_3 Header Type", tdm_config_enum[1], - msm_dai_q6_tdm_header_type_get, - msm_dai_q6_tdm_header_type_put), - SOC_ENUM_EXT("QUAT_TDM_TX_4 Header Type", tdm_config_enum[1], - msm_dai_q6_tdm_header_type_get, - msm_dai_q6_tdm_header_type_put), - SOC_ENUM_EXT("QUAT_TDM_TX_5 Header Type", tdm_config_enum[1], - msm_dai_q6_tdm_header_type_get, - msm_dai_q6_tdm_header_type_put), - SOC_ENUM_EXT("QUAT_TDM_TX_6 Header Type", tdm_config_enum[1], - msm_dai_q6_tdm_header_type_get, - msm_dai_q6_tdm_header_type_put), - SOC_ENUM_EXT("QUAT_TDM_TX_7 Header Type", tdm_config_enum[1], - msm_dai_q6_tdm_header_type_get, - msm_dai_q6_tdm_header_type_put), - SOC_ENUM_EXT("QUIN_TDM_RX_0 Header Type", tdm_config_enum[1], - msm_dai_q6_tdm_header_type_get, - msm_dai_q6_tdm_header_type_put), - SOC_ENUM_EXT("QUIN_TDM_RX_1 Header Type", tdm_config_enum[1], - msm_dai_q6_tdm_header_type_get, - msm_dai_q6_tdm_header_type_put), - SOC_ENUM_EXT("QUIN_TDM_RX_2 Header Type", tdm_config_enum[1], - msm_dai_q6_tdm_header_type_get, - msm_dai_q6_tdm_header_type_put), - SOC_ENUM_EXT("QUIN_TDM_RX_3 Header Type", tdm_config_enum[1], - msm_dai_q6_tdm_header_type_get, - msm_dai_q6_tdm_header_type_put), - SOC_ENUM_EXT("QUIN_TDM_RX_4 Header Type", tdm_config_enum[1], - msm_dai_q6_tdm_header_type_get, - msm_dai_q6_tdm_header_type_put), - SOC_ENUM_EXT("QUIN_TDM_RX_5 Header Type", tdm_config_enum[1], - msm_dai_q6_tdm_header_type_get, - msm_dai_q6_tdm_header_type_put), - SOC_ENUM_EXT("QUIN_TDM_RX_6 Header Type", tdm_config_enum[1], - msm_dai_q6_tdm_header_type_get, - msm_dai_q6_tdm_header_type_put), - SOC_ENUM_EXT("QUIN_TDM_RX_7 Header Type", tdm_config_enum[1], - msm_dai_q6_tdm_header_type_get, - msm_dai_q6_tdm_header_type_put), - SOC_ENUM_EXT("QUIN_TDM_TX_0 Header Type", tdm_config_enum[1], - msm_dai_q6_tdm_header_type_get, - msm_dai_q6_tdm_header_type_put), - SOC_ENUM_EXT("QUIN_TDM_TX_1 Header Type", tdm_config_enum[1], - msm_dai_q6_tdm_header_type_get, - msm_dai_q6_tdm_header_type_put), - SOC_ENUM_EXT("QUIN_TDM_TX_2 Header Type", tdm_config_enum[1], - msm_dai_q6_tdm_header_type_get, - msm_dai_q6_tdm_header_type_put), - SOC_ENUM_EXT("QUIN_TDM_TX_3 Header Type", tdm_config_enum[1], - msm_dai_q6_tdm_header_type_get, - msm_dai_q6_tdm_header_type_put), - SOC_ENUM_EXT("QUIN_TDM_TX_4 Header Type", tdm_config_enum[1], - msm_dai_q6_tdm_header_type_get, - msm_dai_q6_tdm_header_type_put), - SOC_ENUM_EXT("QUIN_TDM_TX_5 Header Type", tdm_config_enum[1], - msm_dai_q6_tdm_header_type_get, - msm_dai_q6_tdm_header_type_put), - SOC_ENUM_EXT("QUIN_TDM_TX_6 Header Type", tdm_config_enum[1], - msm_dai_q6_tdm_header_type_get, - msm_dai_q6_tdm_header_type_put), - SOC_ENUM_EXT("QUIN_TDM_TX_7 Header Type", tdm_config_enum[1], - msm_dai_q6_tdm_header_type_get, - msm_dai_q6_tdm_header_type_put), - SOC_ENUM_EXT("SEN_TDM_RX_0 Header Type", tdm_config_enum[1], - msm_dai_q6_tdm_header_type_get, - msm_dai_q6_tdm_header_type_put), - SOC_ENUM_EXT("SEN_TDM_RX_1 Header Type", tdm_config_enum[1], - msm_dai_q6_tdm_header_type_get, - msm_dai_q6_tdm_header_type_put), - SOC_ENUM_EXT("SEN_TDM_RX_2 Header Type", tdm_config_enum[1], - msm_dai_q6_tdm_header_type_get, - msm_dai_q6_tdm_header_type_put), - SOC_ENUM_EXT("SEN_TDM_RX_3 Header Type", tdm_config_enum[1], - msm_dai_q6_tdm_header_type_get, - msm_dai_q6_tdm_header_type_put), - SOC_ENUM_EXT("SEN_TDM_RX_4 Header Type", tdm_config_enum[1], - msm_dai_q6_tdm_header_type_get, - msm_dai_q6_tdm_header_type_put), - SOC_ENUM_EXT("SEN_TDM_RX_5 Header Type", tdm_config_enum[1], - msm_dai_q6_tdm_header_type_get, - msm_dai_q6_tdm_header_type_put), - SOC_ENUM_EXT("SEN_TDM_RX_6 Header Type", tdm_config_enum[1], - msm_dai_q6_tdm_header_type_get, - msm_dai_q6_tdm_header_type_put), - SOC_ENUM_EXT("SEN_TDM_RX_7 Header Type", tdm_config_enum[1], - msm_dai_q6_tdm_header_type_get, - msm_dai_q6_tdm_header_type_put), - SOC_ENUM_EXT("SEN_TDM_TX_0 Header Type", tdm_config_enum[1], - msm_dai_q6_tdm_header_type_get, - msm_dai_q6_tdm_header_type_put), - SOC_ENUM_EXT("SEN_TDM_TX_1 Header Type", tdm_config_enum[1], - msm_dai_q6_tdm_header_type_get, - msm_dai_q6_tdm_header_type_put), - SOC_ENUM_EXT("SEN_TDM_TX_2 Header Type", tdm_config_enum[1], - msm_dai_q6_tdm_header_type_get, - msm_dai_q6_tdm_header_type_put), - SOC_ENUM_EXT("SEN_TDM_TX_3 Header Type", tdm_config_enum[1], - msm_dai_q6_tdm_header_type_get, - msm_dai_q6_tdm_header_type_put), - SOC_ENUM_EXT("SEN_TDM_TX_4 Header Type", tdm_config_enum[1], - msm_dai_q6_tdm_header_type_get, - msm_dai_q6_tdm_header_type_put), - SOC_ENUM_EXT("SEN_TDM_TX_5 Header Type", tdm_config_enum[1], - msm_dai_q6_tdm_header_type_get, - msm_dai_q6_tdm_header_type_put), - SOC_ENUM_EXT("SEN_TDM_TX_6 Header Type", tdm_config_enum[1], - msm_dai_q6_tdm_header_type_get, - msm_dai_q6_tdm_header_type_put), - SOC_ENUM_EXT("SEN_TDM_TX_7 Header Type", tdm_config_enum[1], - msm_dai_q6_tdm_header_type_get, - msm_dai_q6_tdm_header_type_put), -}; - -static const struct snd_kcontrol_new tdm_config_controls_header[] = { - SOC_SINGLE_MULTI_EXT("PRI_TDM_RX_0 Header", - SND_SOC_NOPM, 0, 0xFFFFFFFF, 0, 8, - msm_dai_q6_tdm_header_get, - msm_dai_q6_tdm_header_put), - SOC_SINGLE_MULTI_EXT("PRI_TDM_RX_1 Header", - SND_SOC_NOPM, 0, 0xFFFFFFFF, 0, 8, - msm_dai_q6_tdm_header_get, - msm_dai_q6_tdm_header_put), - SOC_SINGLE_MULTI_EXT("PRI_TDM_RX_2 Header", - SND_SOC_NOPM, 0, 0xFFFFFFFF, 0, 8, - msm_dai_q6_tdm_header_get, - msm_dai_q6_tdm_header_put), - SOC_SINGLE_MULTI_EXT("PRI_TDM_RX_3 Header", - SND_SOC_NOPM, 0, 0xFFFFFFFF, 0, 8, - msm_dai_q6_tdm_header_get, - msm_dai_q6_tdm_header_put), - SOC_SINGLE_MULTI_EXT("PRI_TDM_RX_4 Header", - SND_SOC_NOPM, 0, 0xFFFFFFFF, 0, 8, - msm_dai_q6_tdm_header_get, - msm_dai_q6_tdm_header_put), - SOC_SINGLE_MULTI_EXT("PRI_TDM_RX_5 Header", - SND_SOC_NOPM, 0, 0xFFFFFFFF, 0, 8, - msm_dai_q6_tdm_header_get, - msm_dai_q6_tdm_header_put), - SOC_SINGLE_MULTI_EXT("PRI_TDM_RX_6 Header", - SND_SOC_NOPM, 0, 0xFFFFFFFF, 0, 8, - msm_dai_q6_tdm_header_get, - msm_dai_q6_tdm_header_put), - SOC_SINGLE_MULTI_EXT("PRI_TDM_RX_7 Header", - SND_SOC_NOPM, 0, 0xFFFFFFFF, 0, 8, - msm_dai_q6_tdm_header_get, - msm_dai_q6_tdm_header_put), - SOC_SINGLE_MULTI_EXT("PRI_TDM_TX_0 Header", - SND_SOC_NOPM, 0, 0xFFFFFFFF, 0, 8, - msm_dai_q6_tdm_header_get, - msm_dai_q6_tdm_header_put), - SOC_SINGLE_MULTI_EXT("PRI_TDM_TX_1 Header", - SND_SOC_NOPM, 0, 0xFFFFFFFF, 0, 8, - msm_dai_q6_tdm_header_get, - msm_dai_q6_tdm_header_put), - SOC_SINGLE_MULTI_EXT("PRI_TDM_TX_2 Header", - SND_SOC_NOPM, 0, 0xFFFFFFFF, 0, 8, - msm_dai_q6_tdm_header_get, - msm_dai_q6_tdm_header_put), - SOC_SINGLE_MULTI_EXT("PRI_TDM_TX_3 Header", - SND_SOC_NOPM, 0, 0xFFFFFFFF, 0, 8, - msm_dai_q6_tdm_header_get, - msm_dai_q6_tdm_header_put), - SOC_SINGLE_MULTI_EXT("PRI_TDM_TX_4 Header", - SND_SOC_NOPM, 0, 0xFFFFFFFF, 0, 8, - msm_dai_q6_tdm_header_get, - msm_dai_q6_tdm_header_put), - SOC_SINGLE_MULTI_EXT("PRI_TDM_TX_5 Header", - SND_SOC_NOPM, 0, 0xFFFFFFFF, 0, 8, - msm_dai_q6_tdm_header_get, - msm_dai_q6_tdm_header_put), - SOC_SINGLE_MULTI_EXT("PRI_TDM_TX_6 Header", - SND_SOC_NOPM, 0, 0xFFFFFFFF, 0, 8, - msm_dai_q6_tdm_header_get, - msm_dai_q6_tdm_header_put), - SOC_SINGLE_MULTI_EXT("PRI_TDM_TX_7 Header", - SND_SOC_NOPM, 0, 0xFFFFFFFF, 0, 8, - msm_dai_q6_tdm_header_get, - msm_dai_q6_tdm_header_put), - SOC_SINGLE_MULTI_EXT("SEC_TDM_RX_0 Header", - SND_SOC_NOPM, 0, 0xFFFFFFFF, 0, 8, - msm_dai_q6_tdm_header_get, - msm_dai_q6_tdm_header_put), - SOC_SINGLE_MULTI_EXT("SEC_TDM_RX_1 Header", - SND_SOC_NOPM, 0, 0xFFFFFFFF, 0, 8, - msm_dai_q6_tdm_header_get, - msm_dai_q6_tdm_header_put), - SOC_SINGLE_MULTI_EXT("SEC_TDM_RX_2 Header", - SND_SOC_NOPM, 0, 0xFFFFFFFF, 0, 8, - msm_dai_q6_tdm_header_get, - msm_dai_q6_tdm_header_put), - SOC_SINGLE_MULTI_EXT("SEC_TDM_RX_3 Header", - SND_SOC_NOPM, 0, 0xFFFFFFFF, 0, 8, - msm_dai_q6_tdm_header_get, - msm_dai_q6_tdm_header_put), - SOC_SINGLE_MULTI_EXT("SEC_TDM_RX_4 Header", - SND_SOC_NOPM, 0, 0xFFFFFFFF, 0, 8, - msm_dai_q6_tdm_header_get, - msm_dai_q6_tdm_header_put), - SOC_SINGLE_MULTI_EXT("SEC_TDM_RX_5 Header", - SND_SOC_NOPM, 0, 0xFFFFFFFF, 0, 8, - msm_dai_q6_tdm_header_get, - msm_dai_q6_tdm_header_put), - SOC_SINGLE_MULTI_EXT("SEC_TDM_RX_6 Header", - SND_SOC_NOPM, 0, 0xFFFFFFFF, 0, 8, - msm_dai_q6_tdm_header_get, - msm_dai_q6_tdm_header_put), - SOC_SINGLE_MULTI_EXT("SEC_TDM_RX_7 Header", - SND_SOC_NOPM, 0, 0xFFFFFFFF, 0, 8, - msm_dai_q6_tdm_header_get, - msm_dai_q6_tdm_header_put), - SOC_SINGLE_MULTI_EXT("SEC_TDM_TX_0 Header", - SND_SOC_NOPM, 0, 0xFFFFFFFF, 0, 8, - msm_dai_q6_tdm_header_get, - msm_dai_q6_tdm_header_put), - SOC_SINGLE_MULTI_EXT("SEC_TDM_TX_1 Header", - SND_SOC_NOPM, 0, 0xFFFFFFFF, 0, 8, - msm_dai_q6_tdm_header_get, - msm_dai_q6_tdm_header_put), - SOC_SINGLE_MULTI_EXT("SEC_TDM_TX_2 Header", - SND_SOC_NOPM, 0, 0xFFFFFFFF, 0, 8, - msm_dai_q6_tdm_header_get, - msm_dai_q6_tdm_header_put), - SOC_SINGLE_MULTI_EXT("SEC_TDM_TX_3 Header", - SND_SOC_NOPM, 0, 0xFFFFFFFF, 0, 8, - msm_dai_q6_tdm_header_get, - msm_dai_q6_tdm_header_put), - SOC_SINGLE_MULTI_EXT("SEC_TDM_TX_4 Header", - SND_SOC_NOPM, 0, 0xFFFFFFFF, 0, 8, - msm_dai_q6_tdm_header_get, - msm_dai_q6_tdm_header_put), - SOC_SINGLE_MULTI_EXT("SEC_TDM_TX_5 Header", - SND_SOC_NOPM, 0, 0xFFFFFFFF, 0, 8, - msm_dai_q6_tdm_header_get, - msm_dai_q6_tdm_header_put), - SOC_SINGLE_MULTI_EXT("SEC_TDM_TX_6 Header", - SND_SOC_NOPM, 0, 0xFFFFFFFF, 0, 8, - msm_dai_q6_tdm_header_get, - msm_dai_q6_tdm_header_put), - SOC_SINGLE_MULTI_EXT("SEC_TDM_TX_7 Header", - SND_SOC_NOPM, 0, 0xFFFFFFFF, 0, 8, - msm_dai_q6_tdm_header_get, - msm_dai_q6_tdm_header_put), - SOC_SINGLE_MULTI_EXT("TERT_TDM_RX_0 Header", - SND_SOC_NOPM, 0, 0xFFFFFFFF, 0, 8, - msm_dai_q6_tdm_header_get, - msm_dai_q6_tdm_header_put), - SOC_SINGLE_MULTI_EXT("TERT_TDM_RX_1 Header", - SND_SOC_NOPM, 0, 0xFFFFFFFF, 0, 8, - msm_dai_q6_tdm_header_get, - msm_dai_q6_tdm_header_put), - SOC_SINGLE_MULTI_EXT("TERT_TDM_RX_2 Header", - SND_SOC_NOPM, 0, 0xFFFFFFFF, 0, 8, - msm_dai_q6_tdm_header_get, - msm_dai_q6_tdm_header_put), - SOC_SINGLE_MULTI_EXT("TERT_TDM_RX_3 Header", - SND_SOC_NOPM, 0, 0xFFFFFFFF, 0, 8, - msm_dai_q6_tdm_header_get, - msm_dai_q6_tdm_header_put), - SOC_SINGLE_MULTI_EXT("TERT_TDM_RX_4 Header", - SND_SOC_NOPM, 0, 0xFFFFFFFF, 0, 8, - msm_dai_q6_tdm_header_get, - msm_dai_q6_tdm_header_put), - SOC_SINGLE_MULTI_EXT("TERT_TDM_RX_5 Header", - SND_SOC_NOPM, 0, 0xFFFFFFFF, 0, 8, - msm_dai_q6_tdm_header_get, - msm_dai_q6_tdm_header_put), - SOC_SINGLE_MULTI_EXT("TERT_TDM_RX_6 Header", - SND_SOC_NOPM, 0, 0xFFFFFFFF, 0, 8, - msm_dai_q6_tdm_header_get, - msm_dai_q6_tdm_header_put), - SOC_SINGLE_MULTI_EXT("TERT_TDM_RX_7 Header", - SND_SOC_NOPM, 0, 0xFFFFFFFF, 0, 8, - msm_dai_q6_tdm_header_get, - msm_dai_q6_tdm_header_put), - SOC_SINGLE_MULTI_EXT("TERT_TDM_TX_0 Header", - SND_SOC_NOPM, 0, 0xFFFFFFFF, 0, 8, - msm_dai_q6_tdm_header_get, - msm_dai_q6_tdm_header_put), - SOC_SINGLE_MULTI_EXT("TERT_TDM_TX_1 Header", - SND_SOC_NOPM, 0, 0xFFFFFFFF, 0, 8, - msm_dai_q6_tdm_header_get, - msm_dai_q6_tdm_header_put), - SOC_SINGLE_MULTI_EXT("TERT_TDM_TX_2 Header", - SND_SOC_NOPM, 0, 0xFFFFFFFF, 0, 8, - msm_dai_q6_tdm_header_get, - msm_dai_q6_tdm_header_put), - SOC_SINGLE_MULTI_EXT("TERT_TDM_TX_3 Header", - SND_SOC_NOPM, 0, 0xFFFFFFFF, 0, 8, - msm_dai_q6_tdm_header_get, - msm_dai_q6_tdm_header_put), - SOC_SINGLE_MULTI_EXT("TERT_TDM_TX_4 Header", - SND_SOC_NOPM, 0, 0xFFFFFFFF, 0, 8, - msm_dai_q6_tdm_header_get, - msm_dai_q6_tdm_header_put), - SOC_SINGLE_MULTI_EXT("TERT_TDM_TX_5 Header", - SND_SOC_NOPM, 0, 0xFFFFFFFF, 0, 8, - msm_dai_q6_tdm_header_get, - msm_dai_q6_tdm_header_put), - SOC_SINGLE_MULTI_EXT("TERT_TDM_TX_6 Header", - SND_SOC_NOPM, 0, 0xFFFFFFFF, 0, 8, - msm_dai_q6_tdm_header_get, - msm_dai_q6_tdm_header_put), - SOC_SINGLE_MULTI_EXT("TERT_TDM_TX_7 Header", - SND_SOC_NOPM, 0, 0xFFFFFFFF, 0, 8, - msm_dai_q6_tdm_header_get, - msm_dai_q6_tdm_header_put), - SOC_SINGLE_MULTI_EXT("QUAT_TDM_RX_0 Header", - SND_SOC_NOPM, 0, 0xFFFFFFFF, 0, 8, - msm_dai_q6_tdm_header_get, - msm_dai_q6_tdm_header_put), - SOC_SINGLE_MULTI_EXT("QUAT_TDM_RX_1 Header", - SND_SOC_NOPM, 0, 0xFFFFFFFF, 0, 8, - msm_dai_q6_tdm_header_get, - msm_dai_q6_tdm_header_put), - SOC_SINGLE_MULTI_EXT("QUAT_TDM_RX_2 Header", - SND_SOC_NOPM, 0, 0xFFFFFFFF, 0, 8, - msm_dai_q6_tdm_header_get, - msm_dai_q6_tdm_header_put), - SOC_SINGLE_MULTI_EXT("QUAT_TDM_RX_3 Header", - SND_SOC_NOPM, 0, 0xFFFFFFFF, 0, 8, - msm_dai_q6_tdm_header_get, - msm_dai_q6_tdm_header_put), - SOC_SINGLE_MULTI_EXT("QUAT_TDM_RX_4 Header", - SND_SOC_NOPM, 0, 0xFFFFFFFF, 0, 8, - msm_dai_q6_tdm_header_get, - msm_dai_q6_tdm_header_put), - SOC_SINGLE_MULTI_EXT("QUAT_TDM_RX_5 Header", - SND_SOC_NOPM, 0, 0xFFFFFFFF, 0, 8, - msm_dai_q6_tdm_header_get, - msm_dai_q6_tdm_header_put), - SOC_SINGLE_MULTI_EXT("QUAT_TDM_RX_6 Header", - SND_SOC_NOPM, 0, 0xFFFFFFFF, 0, 8, - msm_dai_q6_tdm_header_get, - msm_dai_q6_tdm_header_put), - SOC_SINGLE_MULTI_EXT("QUAT_TDM_RX_7 Header", - SND_SOC_NOPM, 0, 0xFFFFFFFF, 0, 8, - msm_dai_q6_tdm_header_get, - msm_dai_q6_tdm_header_put), - SOC_SINGLE_MULTI_EXT("QUAT_TDM_TX_0 Header", - SND_SOC_NOPM, 0, 0xFFFFFFFF, 0, 8, - msm_dai_q6_tdm_header_get, - msm_dai_q6_tdm_header_put), - SOC_SINGLE_MULTI_EXT("QUAT_TDM_TX_1 Header", - SND_SOC_NOPM, 0, 0xFFFFFFFF, 0, 8, - msm_dai_q6_tdm_header_get, - msm_dai_q6_tdm_header_put), - SOC_SINGLE_MULTI_EXT("QUAT_TDM_TX_2 Header", - SND_SOC_NOPM, 0, 0xFFFFFFFF, 0, 8, - msm_dai_q6_tdm_header_get, - msm_dai_q6_tdm_header_put), - SOC_SINGLE_MULTI_EXT("QUAT_TDM_TX_3 Header", - SND_SOC_NOPM, 0, 0xFFFFFFFF, 0, 8, - msm_dai_q6_tdm_header_get, - msm_dai_q6_tdm_header_put), - SOC_SINGLE_MULTI_EXT("QUAT_TDM_TX_4 Header", - SND_SOC_NOPM, 0, 0xFFFFFFFF, 0, 8, - msm_dai_q6_tdm_header_get, - msm_dai_q6_tdm_header_put), - SOC_SINGLE_MULTI_EXT("QUAT_TDM_TX_5 Header", - SND_SOC_NOPM, 0, 0xFFFFFFFF, 0, 8, - msm_dai_q6_tdm_header_get, - msm_dai_q6_tdm_header_put), - SOC_SINGLE_MULTI_EXT("QUAT_TDM_TX_6 Header", - SND_SOC_NOPM, 0, 0xFFFFFFFF, 0, 8, - msm_dai_q6_tdm_header_get, - msm_dai_q6_tdm_header_put), - SOC_SINGLE_MULTI_EXT("QUAT_TDM_TX_7 Header", - SND_SOC_NOPM, 0, 0xFFFFFFFF, 0, 8, - msm_dai_q6_tdm_header_get, - msm_dai_q6_tdm_header_put), - SOC_SINGLE_MULTI_EXT("QUIN_TDM_RX_0 Header", - SND_SOC_NOPM, 0, 0xFFFFFFFF, 0, 8, - msm_dai_q6_tdm_header_get, - msm_dai_q6_tdm_header_put), - SOC_SINGLE_MULTI_EXT("QUIN_TDM_RX_1 Header", - SND_SOC_NOPM, 0, 0xFFFFFFFF, 0, 8, - msm_dai_q6_tdm_header_get, - msm_dai_q6_tdm_header_put), - SOC_SINGLE_MULTI_EXT("QUIN_TDM_RX_2 Header", - SND_SOC_NOPM, 0, 0xFFFFFFFF, 0, 8, - msm_dai_q6_tdm_header_get, - msm_dai_q6_tdm_header_put), - SOC_SINGLE_MULTI_EXT("QUIN_TDM_RX_3 Header", - SND_SOC_NOPM, 0, 0xFFFFFFFF, 0, 8, - msm_dai_q6_tdm_header_get, - msm_dai_q6_tdm_header_put), - SOC_SINGLE_MULTI_EXT("QUIN_TDM_RX_4 Header", - SND_SOC_NOPM, 0, 0xFFFFFFFF, 0, 8, - msm_dai_q6_tdm_header_get, - msm_dai_q6_tdm_header_put), - SOC_SINGLE_MULTI_EXT("QUIN_TDM_RX_5 Header", - SND_SOC_NOPM, 0, 0xFFFFFFFF, 0, 8, - msm_dai_q6_tdm_header_get, - msm_dai_q6_tdm_header_put), - SOC_SINGLE_MULTI_EXT("QUIN_TDM_RX_6 Header", - SND_SOC_NOPM, 0, 0xFFFFFFFF, 0, 8, - msm_dai_q6_tdm_header_get, - msm_dai_q6_tdm_header_put), - SOC_SINGLE_MULTI_EXT("QUIN_TDM_RX_7 Header", - SND_SOC_NOPM, 0, 0xFFFFFFFF, 0, 8, - msm_dai_q6_tdm_header_get, - msm_dai_q6_tdm_header_put), - SOC_SINGLE_MULTI_EXT("QUIN_TDM_TX_0 Header", - SND_SOC_NOPM, 0, 0xFFFFFFFF, 0, 8, - msm_dai_q6_tdm_header_get, - msm_dai_q6_tdm_header_put), - SOC_SINGLE_MULTI_EXT("QUIN_TDM_TX_1 Header", - SND_SOC_NOPM, 0, 0xFFFFFFFF, 0, 8, - msm_dai_q6_tdm_header_get, - msm_dai_q6_tdm_header_put), - SOC_SINGLE_MULTI_EXT("QUIN_TDM_TX_2 Header", - SND_SOC_NOPM, 0, 0xFFFFFFFF, 0, 8, - msm_dai_q6_tdm_header_get, - msm_dai_q6_tdm_header_put), - SOC_SINGLE_MULTI_EXT("QUIN_TDM_TX_3 Header", - SND_SOC_NOPM, 0, 0xFFFFFFFF, 0, 8, - msm_dai_q6_tdm_header_get, - msm_dai_q6_tdm_header_put), - SOC_SINGLE_MULTI_EXT("QUIN_TDM_TX_4 Header", - SND_SOC_NOPM, 0, 0xFFFFFFFF, 0, 8, - msm_dai_q6_tdm_header_get, - msm_dai_q6_tdm_header_put), - SOC_SINGLE_MULTI_EXT("QUIN_TDM_TX_5 Header", - SND_SOC_NOPM, 0, 0xFFFFFFFF, 0, 8, - msm_dai_q6_tdm_header_get, - msm_dai_q6_tdm_header_put), - SOC_SINGLE_MULTI_EXT("QUIN_TDM_TX_6 Header", - SND_SOC_NOPM, 0, 0xFFFFFFFF, 0, 8, - msm_dai_q6_tdm_header_get, - msm_dai_q6_tdm_header_put), - SOC_SINGLE_MULTI_EXT("QUIN_TDM_TX_7 Header", - SND_SOC_NOPM, 0, 0xFFFFFFFF, 0, 8, - msm_dai_q6_tdm_header_get, - msm_dai_q6_tdm_header_put), - SOC_SINGLE_MULTI_EXT("SEN_TDM_RX_0 Header", - SND_SOC_NOPM, 0, 0xFFFFFFFF, 0, 8, - msm_dai_q6_tdm_header_get, - msm_dai_q6_tdm_header_put), - SOC_SINGLE_MULTI_EXT("SEN_TDM_RX_1 Header", - SND_SOC_NOPM, 0, 0xFFFFFFFF, 0, 8, - msm_dai_q6_tdm_header_get, - msm_dai_q6_tdm_header_put), - SOC_SINGLE_MULTI_EXT("SEN_TDM_RX_2 Header", - SND_SOC_NOPM, 0, 0xFFFFFFFF, 0, 8, - msm_dai_q6_tdm_header_get, - msm_dai_q6_tdm_header_put), - SOC_SINGLE_MULTI_EXT("SEN_TDM_RX_3 Header", - SND_SOC_NOPM, 0, 0xFFFFFFFF, 0, 8, - msm_dai_q6_tdm_header_get, - msm_dai_q6_tdm_header_put), - SOC_SINGLE_MULTI_EXT("SEN_TDM_RX_4 Header", - SND_SOC_NOPM, 0, 0xFFFFFFFF, 0, 8, - msm_dai_q6_tdm_header_get, - msm_dai_q6_tdm_header_put), - SOC_SINGLE_MULTI_EXT("SEN_TDM_RX_5 Header", - SND_SOC_NOPM, 0, 0xFFFFFFFF, 0, 8, - msm_dai_q6_tdm_header_get, - msm_dai_q6_tdm_header_put), - SOC_SINGLE_MULTI_EXT("SEN_TDM_RX_6 Header", - SND_SOC_NOPM, 0, 0xFFFFFFFF, 0, 8, - msm_dai_q6_tdm_header_get, - msm_dai_q6_tdm_header_put), - SOC_SINGLE_MULTI_EXT("SEN_TDM_RX_7 Header", - SND_SOC_NOPM, 0, 0xFFFFFFFF, 0, 8, - msm_dai_q6_tdm_header_get, - msm_dai_q6_tdm_header_put), - SOC_SINGLE_MULTI_EXT("SEN_TDM_TX_0 Header", - SND_SOC_NOPM, 0, 0xFFFFFFFF, 0, 8, - msm_dai_q6_tdm_header_get, - msm_dai_q6_tdm_header_put), - SOC_SINGLE_MULTI_EXT("SEN_TDM_TX_1 Header", - SND_SOC_NOPM, 0, 0xFFFFFFFF, 0, 8, - msm_dai_q6_tdm_header_get, - msm_dai_q6_tdm_header_put), - SOC_SINGLE_MULTI_EXT("SEN_TDM_TX_2 Header", - SND_SOC_NOPM, 0, 0xFFFFFFFF, 0, 8, - msm_dai_q6_tdm_header_get, - msm_dai_q6_tdm_header_put), - SOC_SINGLE_MULTI_EXT("SEN_TDM_TX_3 Header", - SND_SOC_NOPM, 0, 0xFFFFFFFF, 0, 8, - msm_dai_q6_tdm_header_get, - msm_dai_q6_tdm_header_put), - SOC_SINGLE_MULTI_EXT("SEN_TDM_TX_4 Header", - SND_SOC_NOPM, 0, 0xFFFFFFFF, 0, 8, - msm_dai_q6_tdm_header_get, - msm_dai_q6_tdm_header_put), - SOC_SINGLE_MULTI_EXT("SEN_TDM_TX_5 Header", - SND_SOC_NOPM, 0, 0xFFFFFFFF, 0, 8, - msm_dai_q6_tdm_header_get, - msm_dai_q6_tdm_header_put), - SOC_SINGLE_MULTI_EXT("SEN_TDM_TX_6 Header", - SND_SOC_NOPM, 0, 0xFFFFFFFF, 0, 8, - msm_dai_q6_tdm_header_get, - msm_dai_q6_tdm_header_put), - SOC_SINGLE_MULTI_EXT("SEN_TDM_TX_7 Header", - SND_SOC_NOPM, 0, 0xFFFFFFFF, 0, 8, - msm_dai_q6_tdm_header_get, - msm_dai_q6_tdm_header_put), -}; - static int msm_dai_q6_tdm_set_clk( struct msm_dai_q6_tdm_dai_data *dai_data, u16 port_id, bool enable) { int rc = 0; - dai_data->clk_set.enable = enable; - - rc = afe_set_lpass_clock_v2(port_id, - &dai_data->clk_set); + rc = audio_prm_set_lpass_clk_cfg(&dai_data->clk_set, enable); if (rc < 0) - pr_err("%s: afe lpass clock failed, err:%d\n", - __func__, rc); - - return rc; -} - -static int msm_dai_q6_dai_tdm_probe(struct snd_soc_dai *dai) -{ - int rc = 0; - struct msm_dai_q6_tdm_dai_data *tdm_dai_data = NULL; - struct snd_kcontrol *data_format_kcontrol = NULL; - struct snd_kcontrol *header_type_kcontrol = NULL; - struct snd_kcontrol *header_kcontrol = NULL; - int port_idx = 0; - const struct snd_kcontrol_new *data_format_ctrl = NULL; - const struct snd_kcontrol_new *header_type_ctrl = NULL; - const struct snd_kcontrol_new *header_ctrl = NULL; - - tdm_dai_data = dev_get_drvdata(dai->dev); - - msm_dai_q6_set_dai_id(dai); - - port_idx = msm_dai_q6_get_port_idx(dai->id); - if (port_idx < 0) { - dev_err(dai->dev, "%s port id 0x%x not supported\n", - __func__, dai->id); - rc = -EINVAL; - goto rtn; - } - - data_format_ctrl = - &tdm_config_controls_data_format[port_idx]; - header_type_ctrl = - &tdm_config_controls_header_type[port_idx]; - header_ctrl = - &tdm_config_controls_header[port_idx]; - - if (data_format_ctrl) { - data_format_kcontrol = snd_ctl_new1(data_format_ctrl, - tdm_dai_data); - rc = snd_ctl_add(dai->component->card->snd_card, - data_format_kcontrol); - if (rc < 0) { - dev_err(dai->dev, "%s: err add data format ctrl DAI = %s\n", - __func__, dai->name); - goto rtn; - } - } - - if (header_type_ctrl) { - header_type_kcontrol = snd_ctl_new1(header_type_ctrl, - tdm_dai_data); - rc = snd_ctl_add(dai->component->card->snd_card, - header_type_kcontrol); - if (rc < 0) { - if (data_format_kcontrol) - snd_ctl_remove(dai->component->card->snd_card, - data_format_kcontrol); - dev_err(dai->dev, "%s: err add header type ctrl DAI = %s\n", - __func__, dai->name); - goto rtn; - } - } - - if (header_ctrl) { - header_kcontrol = snd_ctl_new1(header_ctrl, - tdm_dai_data); - rc = snd_ctl_add(dai->component->card->snd_card, - header_kcontrol); - if (rc < 0) { - if (header_type_kcontrol) - snd_ctl_remove(dai->component->card->snd_card, - header_type_kcontrol); - if (data_format_kcontrol) - snd_ctl_remove(dai->component->card->snd_card, - data_format_kcontrol); - dev_err(dai->dev, "%s: err add header ctrl DAI = %s\n", - __func__, dai->name); - goto rtn; - } - } - - if (tdm_dai_data->is_island_dai) - rc = msm_dai_q6_add_island_mx_ctls( - dai->component->card->snd_card, - dai->name, - dai->id, (void *)tdm_dai_data); - - rc = msm_dai_q6_dai_add_route(dai); - -rtn: - return rc; -} - - -static int msm_dai_q6_dai_tdm_remove(struct snd_soc_dai *dai) -{ - int rc = 0; - struct msm_dai_q6_tdm_dai_data *tdm_dai_data = - dev_get_drvdata(dai->dev); - u16 group_id = tdm_dai_data->group_cfg.tdm_cfg.group_id; - int group_idx = 0; - atomic_t *group_ref = NULL; - - group_idx = msm_dai_q6_get_group_idx(dai->id); - if (group_idx < 0) { - dev_err(dai->dev, "%s port id 0x%x not supported\n", - __func__, dai->id); - return -EINVAL; - } - - group_ref = &tdm_group_ref[group_idx]; - - /* If AFE port is still up, close it */ - if (test_bit(STATUS_PORT_STARTED, tdm_dai_data->status_mask)) { - rc = afe_close(dai->id); /* can block */ - if (rc < 0) { - dev_err(dai->dev, "%s: fail to close AFE port 0x%x\n", - __func__, dai->id); - } - atomic_dec(group_ref); - clear_bit(STATUS_PORT_STARTED, - tdm_dai_data->status_mask); - - if (atomic_read(group_ref) == 0) { - rc = afe_port_group_enable(group_id, - NULL, false, NULL); - if (rc < 0) { - dev_err(dai->dev, "fail to disable AFE group 0x%x\n", - group_id); - } - } - - if (msm_dai_q6_get_tdm_clk_ref(group_idx) == 0) { - rc = msm_dai_q6_tdm_set_clk(tdm_dai_data, - dai->id, false); - if (rc < 0) { - dev_err(dai->dev, "%s: fail to disable AFE clk 0x%x\n", - __func__, dai->id); - } - } - } - - return 0; -} - -static int msm_dai_q6_tdm_set_tdm_slot(struct snd_soc_dai *dai, - unsigned int tx_mask, - unsigned int rx_mask, - int slots, int slot_width) -{ - int rc = 0; - struct msm_dai_q6_tdm_dai_data *dai_data = - dev_get_drvdata(dai->dev); - struct afe_param_id_group_device_tdm_cfg *tdm_group = - &dai_data->group_cfg.tdm_cfg; - unsigned int cap_mask; - - dev_dbg(dai->dev, "%s: dai id = 0x%x\n", __func__, dai->id); - - /* HW only supports 16 and 32 bit slot width configuration */ - if ((slot_width != 16) && (slot_width != 32)) { - dev_err(dai->dev, "%s: invalid slot_width %d\n", - __func__, slot_width); - return -EINVAL; - } - - /* HW supports 1-32 slots configuration. Typical: 1, 2, 4, 8, 16, 32 */ - switch (slots) { - case 1: - cap_mask = 0x01; - break; - case 2: - cap_mask = 0x03; - break; - case 4: - cap_mask = 0x0F; - break; - case 8: - cap_mask = 0xFF; - break; - case 16: - cap_mask = 0xFFFF; - break; - case 32: - cap_mask = 0xFFFFFFFF; - break; - default: - dev_err(dai->dev, "%s: invalid slots %d\n", - __func__, slots); - return -EINVAL; - } - - switch (dai->id) { - case AFE_PORT_ID_PRIMARY_TDM_RX: - case AFE_PORT_ID_PRIMARY_TDM_RX_1: - case AFE_PORT_ID_PRIMARY_TDM_RX_2: - case AFE_PORT_ID_PRIMARY_TDM_RX_3: - case AFE_PORT_ID_PRIMARY_TDM_RX_4: - case AFE_PORT_ID_PRIMARY_TDM_RX_5: - case AFE_PORT_ID_PRIMARY_TDM_RX_6: - case AFE_PORT_ID_PRIMARY_TDM_RX_7: - case AFE_PORT_ID_SECONDARY_TDM_RX: - case AFE_PORT_ID_SECONDARY_TDM_RX_1: - case AFE_PORT_ID_SECONDARY_TDM_RX_2: - case AFE_PORT_ID_SECONDARY_TDM_RX_3: - case AFE_PORT_ID_SECONDARY_TDM_RX_4: - case AFE_PORT_ID_SECONDARY_TDM_RX_5: - case AFE_PORT_ID_SECONDARY_TDM_RX_6: - case AFE_PORT_ID_SECONDARY_TDM_RX_7: - case AFE_PORT_ID_TERTIARY_TDM_RX: - case AFE_PORT_ID_TERTIARY_TDM_RX_1: - case AFE_PORT_ID_TERTIARY_TDM_RX_2: - case AFE_PORT_ID_TERTIARY_TDM_RX_3: - case AFE_PORT_ID_TERTIARY_TDM_RX_4: - case AFE_PORT_ID_TERTIARY_TDM_RX_5: - case AFE_PORT_ID_TERTIARY_TDM_RX_6: - case AFE_PORT_ID_TERTIARY_TDM_RX_7: - case AFE_PORT_ID_QUATERNARY_TDM_RX: - case AFE_PORT_ID_QUATERNARY_TDM_RX_1: - case AFE_PORT_ID_QUATERNARY_TDM_RX_2: - case AFE_PORT_ID_QUATERNARY_TDM_RX_3: - case AFE_PORT_ID_QUATERNARY_TDM_RX_4: - case AFE_PORT_ID_QUATERNARY_TDM_RX_5: - case AFE_PORT_ID_QUATERNARY_TDM_RX_6: - case AFE_PORT_ID_QUATERNARY_TDM_RX_7: - case AFE_PORT_ID_QUINARY_TDM_RX: - case AFE_PORT_ID_QUINARY_TDM_RX_1: - case AFE_PORT_ID_QUINARY_TDM_RX_2: - case AFE_PORT_ID_QUINARY_TDM_RX_3: - case AFE_PORT_ID_QUINARY_TDM_RX_4: - case AFE_PORT_ID_QUINARY_TDM_RX_5: - case AFE_PORT_ID_QUINARY_TDM_RX_6: - case AFE_PORT_ID_QUINARY_TDM_RX_7: - case AFE_PORT_ID_SENARY_TDM_RX: - case AFE_PORT_ID_SENARY_TDM_RX_1: - case AFE_PORT_ID_SENARY_TDM_RX_2: - case AFE_PORT_ID_SENARY_TDM_RX_3: - case AFE_PORT_ID_SENARY_TDM_RX_4: - case AFE_PORT_ID_SENARY_TDM_RX_5: - case AFE_PORT_ID_SENARY_TDM_RX_6: - case AFE_PORT_ID_SENARY_TDM_RX_7: - tdm_group->nslots_per_frame = slots; - tdm_group->slot_width = slot_width; - tdm_group->slot_mask = rx_mask & cap_mask; - break; - case AFE_PORT_ID_PRIMARY_TDM_TX: - case AFE_PORT_ID_PRIMARY_TDM_TX_1: - case AFE_PORT_ID_PRIMARY_TDM_TX_2: - case AFE_PORT_ID_PRIMARY_TDM_TX_3: - case AFE_PORT_ID_PRIMARY_TDM_TX_4: - case AFE_PORT_ID_PRIMARY_TDM_TX_5: - case AFE_PORT_ID_PRIMARY_TDM_TX_6: - case AFE_PORT_ID_PRIMARY_TDM_TX_7: - case AFE_PORT_ID_SECONDARY_TDM_TX: - case AFE_PORT_ID_SECONDARY_TDM_TX_1: - case AFE_PORT_ID_SECONDARY_TDM_TX_2: - case AFE_PORT_ID_SECONDARY_TDM_TX_3: - case AFE_PORT_ID_SECONDARY_TDM_TX_4: - case AFE_PORT_ID_SECONDARY_TDM_TX_5: - case AFE_PORT_ID_SECONDARY_TDM_TX_6: - case AFE_PORT_ID_SECONDARY_TDM_TX_7: - case AFE_PORT_ID_TERTIARY_TDM_TX: - case AFE_PORT_ID_TERTIARY_TDM_TX_1: - case AFE_PORT_ID_TERTIARY_TDM_TX_2: - case AFE_PORT_ID_TERTIARY_TDM_TX_3: - case AFE_PORT_ID_TERTIARY_TDM_TX_4: - case AFE_PORT_ID_TERTIARY_TDM_TX_5: - case AFE_PORT_ID_TERTIARY_TDM_TX_6: - case AFE_PORT_ID_TERTIARY_TDM_TX_7: - case AFE_PORT_ID_QUATERNARY_TDM_TX: - case AFE_PORT_ID_QUATERNARY_TDM_TX_1: - case AFE_PORT_ID_QUATERNARY_TDM_TX_2: - case AFE_PORT_ID_QUATERNARY_TDM_TX_3: - case AFE_PORT_ID_QUATERNARY_TDM_TX_4: - case AFE_PORT_ID_QUATERNARY_TDM_TX_5: - case AFE_PORT_ID_QUATERNARY_TDM_TX_6: - case AFE_PORT_ID_QUATERNARY_TDM_TX_7: - case AFE_PORT_ID_QUINARY_TDM_TX: - case AFE_PORT_ID_QUINARY_TDM_TX_1: - case AFE_PORT_ID_QUINARY_TDM_TX_2: - case AFE_PORT_ID_QUINARY_TDM_TX_3: - case AFE_PORT_ID_QUINARY_TDM_TX_4: - case AFE_PORT_ID_QUINARY_TDM_TX_5: - case AFE_PORT_ID_QUINARY_TDM_TX_6: - case AFE_PORT_ID_QUINARY_TDM_TX_7: - case AFE_PORT_ID_SENARY_TDM_TX: - case AFE_PORT_ID_SENARY_TDM_TX_1: - case AFE_PORT_ID_SENARY_TDM_TX_2: - case AFE_PORT_ID_SENARY_TDM_TX_3: - case AFE_PORT_ID_SENARY_TDM_TX_4: - case AFE_PORT_ID_SENARY_TDM_TX_5: - case AFE_PORT_ID_SENARY_TDM_TX_6: - case AFE_PORT_ID_SENARY_TDM_TX_7: - tdm_group->nslots_per_frame = slots; - tdm_group->slot_width = slot_width; - tdm_group->slot_mask = tx_mask & cap_mask; - break; - default: - dev_err(dai->dev, "%s: invalid dai id 0x%x\n", - __func__, dai->id); - return -EINVAL; - } - + pr_err("%s: afe lpass clock failed, err:%d port_id:%d freq:%d clk_id:%d\n", + __func__, rc, port_id, dai_data->clk_set.clk_freq_in_hz, dai_data->clk_set.clk_id); return rc; } @@ -9201,251 +3410,6 @@ static int msm_dai_q6_tdm_set_sysclk(struct snd_soc_dai *dai, return 0; } -static int msm_dai_q6_tdm_set_channel_map(struct snd_soc_dai *dai, - unsigned int tx_num, unsigned int *tx_slot, - unsigned int rx_num, unsigned int *rx_slot) -{ - int rc = 0; - struct msm_dai_q6_tdm_dai_data *dai_data = - dev_get_drvdata(dai->dev); - struct afe_param_id_slot_mapping_cfg *slot_mapping = - &dai_data->port_cfg.slot_mapping; - struct afe_param_id_slot_mapping_cfg_v2 *slot_mapping_v2 = - &dai_data->port_cfg.slot_mapping_v2; - int i = 0; - - dev_dbg(dai->dev, "%s: dai id = 0x%x\n", __func__, dai->id); - - switch (dai->id) { - case AFE_PORT_ID_PRIMARY_TDM_RX: - case AFE_PORT_ID_PRIMARY_TDM_RX_1: - case AFE_PORT_ID_PRIMARY_TDM_RX_2: - case AFE_PORT_ID_PRIMARY_TDM_RX_3: - case AFE_PORT_ID_PRIMARY_TDM_RX_4: - case AFE_PORT_ID_PRIMARY_TDM_RX_5: - case AFE_PORT_ID_PRIMARY_TDM_RX_6: - case AFE_PORT_ID_PRIMARY_TDM_RX_7: - case AFE_PORT_ID_SECONDARY_TDM_RX: - case AFE_PORT_ID_SECONDARY_TDM_RX_1: - case AFE_PORT_ID_SECONDARY_TDM_RX_2: - case AFE_PORT_ID_SECONDARY_TDM_RX_3: - case AFE_PORT_ID_SECONDARY_TDM_RX_4: - case AFE_PORT_ID_SECONDARY_TDM_RX_5: - case AFE_PORT_ID_SECONDARY_TDM_RX_6: - case AFE_PORT_ID_SECONDARY_TDM_RX_7: - case AFE_PORT_ID_TERTIARY_TDM_RX: - case AFE_PORT_ID_TERTIARY_TDM_RX_1: - case AFE_PORT_ID_TERTIARY_TDM_RX_2: - case AFE_PORT_ID_TERTIARY_TDM_RX_3: - case AFE_PORT_ID_TERTIARY_TDM_RX_4: - case AFE_PORT_ID_TERTIARY_TDM_RX_5: - case AFE_PORT_ID_TERTIARY_TDM_RX_6: - case AFE_PORT_ID_TERTIARY_TDM_RX_7: - case AFE_PORT_ID_QUATERNARY_TDM_RX: - case AFE_PORT_ID_QUATERNARY_TDM_RX_1: - case AFE_PORT_ID_QUATERNARY_TDM_RX_2: - case AFE_PORT_ID_QUATERNARY_TDM_RX_3: - case AFE_PORT_ID_QUATERNARY_TDM_RX_4: - case AFE_PORT_ID_QUATERNARY_TDM_RX_5: - case AFE_PORT_ID_QUATERNARY_TDM_RX_6: - case AFE_PORT_ID_QUATERNARY_TDM_RX_7: - case AFE_PORT_ID_QUINARY_TDM_RX: - case AFE_PORT_ID_QUINARY_TDM_RX_1: - case AFE_PORT_ID_QUINARY_TDM_RX_2: - case AFE_PORT_ID_QUINARY_TDM_RX_3: - case AFE_PORT_ID_QUINARY_TDM_RX_4: - case AFE_PORT_ID_QUINARY_TDM_RX_5: - case AFE_PORT_ID_QUINARY_TDM_RX_6: - case AFE_PORT_ID_QUINARY_TDM_RX_7: - case AFE_PORT_ID_SENARY_TDM_RX: - case AFE_PORT_ID_SENARY_TDM_RX_1: - case AFE_PORT_ID_SENARY_TDM_RX_2: - case AFE_PORT_ID_SENARY_TDM_RX_3: - case AFE_PORT_ID_SENARY_TDM_RX_4: - case AFE_PORT_ID_SENARY_TDM_RX_5: - case AFE_PORT_ID_SENARY_TDM_RX_6: - case AFE_PORT_ID_SENARY_TDM_RX_7: - if (q6core_get_avcs_api_version_per_service( - APRV2_IDS_SERVICE_ID_ADSP_AFE_V) >= AFE_API_VERSION_V3) { - if (!rx_slot) { - dev_err(dai->dev, "%s: rx slot not found\n", - __func__); - return -EINVAL; - } - if (rx_num > AFE_PORT_MAX_AUDIO_CHAN_CNT_V2) { - dev_err(dai->dev, "%s: invalid rx num %d\n", - __func__, - rx_num); - return -EINVAL; - } - - for (i = 0; i < rx_num; i++) - slot_mapping_v2->offset[i] = rx_slot[i]; - for (i = rx_num; i < AFE_PORT_MAX_AUDIO_CHAN_CNT_V2; - i++) - slot_mapping_v2->offset[i] = - AFE_SLOT_MAPPING_OFFSET_INVALID; - - slot_mapping_v2->num_channel = rx_num; - } else { - if (!rx_slot) { - dev_err(dai->dev, "%s: rx slot not found\n", - __func__); - return -EINVAL; - } - if (rx_num > AFE_PORT_MAX_AUDIO_CHAN_CNT) { - dev_err(dai->dev, "%s: invalid rx num %d\n", - __func__, - rx_num); - return -EINVAL; - } - - for (i = 0; i < rx_num; i++) - slot_mapping->offset[i] = rx_slot[i]; - for (i = rx_num; i < AFE_PORT_MAX_AUDIO_CHAN_CNT; i++) - slot_mapping->offset[i] = - AFE_SLOT_MAPPING_OFFSET_INVALID; - - slot_mapping->num_channel = rx_num; - } - break; - case AFE_PORT_ID_PRIMARY_TDM_TX: - case AFE_PORT_ID_PRIMARY_TDM_TX_1: - case AFE_PORT_ID_PRIMARY_TDM_TX_2: - case AFE_PORT_ID_PRIMARY_TDM_TX_3: - case AFE_PORT_ID_PRIMARY_TDM_TX_4: - case AFE_PORT_ID_PRIMARY_TDM_TX_5: - case AFE_PORT_ID_PRIMARY_TDM_TX_6: - case AFE_PORT_ID_PRIMARY_TDM_TX_7: - case AFE_PORT_ID_SECONDARY_TDM_TX: - case AFE_PORT_ID_SECONDARY_TDM_TX_1: - case AFE_PORT_ID_SECONDARY_TDM_TX_2: - case AFE_PORT_ID_SECONDARY_TDM_TX_3: - case AFE_PORT_ID_SECONDARY_TDM_TX_4: - case AFE_PORT_ID_SECONDARY_TDM_TX_5: - case AFE_PORT_ID_SECONDARY_TDM_TX_6: - case AFE_PORT_ID_SECONDARY_TDM_TX_7: - case AFE_PORT_ID_TERTIARY_TDM_TX: - case AFE_PORT_ID_TERTIARY_TDM_TX_1: - case AFE_PORT_ID_TERTIARY_TDM_TX_2: - case AFE_PORT_ID_TERTIARY_TDM_TX_3: - case AFE_PORT_ID_TERTIARY_TDM_TX_4: - case AFE_PORT_ID_TERTIARY_TDM_TX_5: - case AFE_PORT_ID_TERTIARY_TDM_TX_6: - case AFE_PORT_ID_TERTIARY_TDM_TX_7: - case AFE_PORT_ID_QUATERNARY_TDM_TX: - case AFE_PORT_ID_QUATERNARY_TDM_TX_1: - case AFE_PORT_ID_QUATERNARY_TDM_TX_2: - case AFE_PORT_ID_QUATERNARY_TDM_TX_3: - case AFE_PORT_ID_QUATERNARY_TDM_TX_4: - case AFE_PORT_ID_QUATERNARY_TDM_TX_5: - case AFE_PORT_ID_QUATERNARY_TDM_TX_6: - case AFE_PORT_ID_QUATERNARY_TDM_TX_7: - case AFE_PORT_ID_QUINARY_TDM_TX: - case AFE_PORT_ID_QUINARY_TDM_TX_1: - case AFE_PORT_ID_QUINARY_TDM_TX_2: - case AFE_PORT_ID_QUINARY_TDM_TX_3: - case AFE_PORT_ID_QUINARY_TDM_TX_4: - case AFE_PORT_ID_QUINARY_TDM_TX_5: - case AFE_PORT_ID_QUINARY_TDM_TX_6: - case AFE_PORT_ID_QUINARY_TDM_TX_7: - case AFE_PORT_ID_SENARY_TDM_TX: - case AFE_PORT_ID_SENARY_TDM_TX_1: - case AFE_PORT_ID_SENARY_TDM_TX_2: - case AFE_PORT_ID_SENARY_TDM_TX_3: - case AFE_PORT_ID_SENARY_TDM_TX_4: - case AFE_PORT_ID_SENARY_TDM_TX_5: - case AFE_PORT_ID_SENARY_TDM_TX_6: - case AFE_PORT_ID_SENARY_TDM_TX_7: - if (q6core_get_avcs_api_version_per_service( - APRV2_IDS_SERVICE_ID_ADSP_AFE_V) >= AFE_API_VERSION_V3) { - if (!tx_slot) { - dev_err(dai->dev, "%s: tx slot not found\n", - __func__); - return -EINVAL; - } - if (tx_num > AFE_PORT_MAX_AUDIO_CHAN_CNT_V2) { - dev_err(dai->dev, "%s: invalid tx num %d\n", - __func__, - tx_num); - return -EINVAL; - } - - for (i = 0; i < tx_num; i++) - slot_mapping_v2->offset[i] = tx_slot[i]; - for (i = tx_num; i < AFE_PORT_MAX_AUDIO_CHAN_CNT_V2; - i++) - slot_mapping_v2->offset[i] = - AFE_SLOT_MAPPING_OFFSET_INVALID; - - slot_mapping_v2->num_channel = tx_num; - } else { - if (!tx_slot) { - dev_err(dai->dev, "%s: tx slot not found\n", - __func__); - return -EINVAL; - } - if (tx_num > AFE_PORT_MAX_AUDIO_CHAN_CNT) { - dev_err(dai->dev, "%s: invalid tx num %d\n", - __func__, - tx_num); - return -EINVAL; - } - - for (i = 0; i < tx_num; i++) - slot_mapping->offset[i] = tx_slot[i]; - for (i = tx_num; i < AFE_PORT_MAX_AUDIO_CHAN_CNT; i++) - slot_mapping->offset[i] = - AFE_SLOT_MAPPING_OFFSET_INVALID; - - slot_mapping->num_channel = tx_num; - } - break; - default: - dev_err(dai->dev, "%s: invalid dai id 0x%x\n", - __func__, dai->id); - return -EINVAL; - } - - return rc; -} - -static unsigned int tdm_param_set_slot_mask(u16 *slot_offset, int slot_width, - int slots_per_frame) -{ - unsigned int i = 0; - unsigned int slot_index = 0; - unsigned long slot_mask = 0; - unsigned int slot_width_bytes = slot_width / 8; - unsigned int channel_count = AFE_PORT_MAX_AUDIO_CHAN_CNT; - - if (q6core_get_avcs_api_version_per_service( - APRV2_IDS_SERVICE_ID_ADSP_AFE_V) >= AFE_API_VERSION_V3) - channel_count = AFE_PORT_MAX_AUDIO_CHAN_CNT_V2; - - if (slot_width_bytes == 0) { - pr_err("%s: slot width is zero\n", __func__); - return slot_mask; - } - - for (i = 0; i < channel_count; i++) { - if (slot_offset[i] != AFE_SLOT_MAPPING_OFFSET_INVALID) { - slot_index = slot_offset[i] / slot_width_bytes; - if (slot_index < slots_per_frame) - set_bit(slot_index, &slot_mask); - else { - pr_err("%s: invalid slot map setting\n", - __func__); - return 0; - } - } else { - break; - } - } - - return slot_mask; -} - static int msm_dai_q6_tdm_hw_params(struct snd_pcm_substream *substream, struct snd_pcm_hw_params *params, struct snd_soc_dai *dai) @@ -9459,8 +3423,8 @@ static int msm_dai_q6_tdm_hw_params(struct snd_pcm_substream *substream, &dai_data->port_cfg.tdm; struct afe_param_id_slot_mapping_cfg *slot_mapping = &dai_data->port_cfg.slot_mapping; - struct afe_param_id_slot_mapping_cfg_v2 *slot_mapping_v2 = - &dai_data->port_cfg.slot_mapping_v2; +// struct afe_param_id_slot_mapping_cfg_v2 *slot_mapping_v2 = +// &dai_data->port_cfg.slot_mapping_v2; struct afe_param_id_custom_tdm_header_cfg *custom_tdm_header = &dai_data->port_cfg.custom_tdm_header; @@ -9491,6 +3455,7 @@ static int msm_dai_q6_tdm_hw_params(struct snd_pcm_substream *substream, } dai_data->channels = params_channels(params); dai_data->rate = params_rate(params); + dai_data->bitwidth = 16; /* * update tdm group config param @@ -9550,6 +3515,7 @@ static int msm_dai_q6_tdm_hw_params(struct snd_pcm_substream *substream, */ tdm->nslots_per_frame = tdm_group->nslots_per_frame; tdm->slot_width = tdm_group->slot_width; + #if 0 if (q6core_get_avcs_api_version_per_service( APRV2_IDS_SERVICE_ID_ADSP_AFE_V) >= AFE_API_VERSION_V3) tdm->slot_mask = tdm_param_set_slot_mask( @@ -9557,9 +3523,8 @@ static int msm_dai_q6_tdm_hw_params(struct snd_pcm_substream *substream, tdm_group->slot_width, tdm_group->nslots_per_frame); else - tdm->slot_mask = tdm_param_set_slot_mask(slot_mapping->offset, - tdm_group->slot_width, - tdm_group->nslots_per_frame); + #endif + tdm->slot_mask = tdm_group->slot_mask; pr_debug("%s: TDM:\n" "num_channels=%d sample_rate=%d bit_width=%d\n" @@ -9579,6 +3544,7 @@ static int msm_dai_q6_tdm_hw_params(struct snd_pcm_substream *substream, tdm->ctrl_data_out_enable, tdm->ctrl_invert_sync_pulse, tdm->ctrl_sync_data_delay); + #if 0 if (q6core_get_avcs_api_version_per_service( APRV2_IDS_SERVICE_ID_ADSP_AFE_V) >= AFE_API_VERSION_V3) { /* @@ -9636,6 +3602,7 @@ static int msm_dai_q6_tdm_hw_params(struct snd_pcm_substream *substream, slot_mapping_v2->offset[30], slot_mapping_v2->offset[31]); } else { + #endif /* * update slot mapping config param * NOTE: channels/rate/bitwidth are per stream property @@ -9660,7 +3627,7 @@ static int msm_dai_q6_tdm_hw_params(struct snd_pcm_substream *substream, slot_mapping->offset[5], slot_mapping->offset[6], slot_mapping->offset[7]); - } +// } /* * update custom header config param * NOTE: channels/rate/bitwidth are per playback stream property. @@ -9734,50 +3701,9 @@ static int msm_dai_q6_tdm_prepare(struct snd_pcm_substream *substream, goto rtn; } } - - /* PORT START should be set if prepare called - * in active state. - */ - if (atomic_read(group_ref) == 0) { - /* - * if only one port, don't do group enable as there - * is no group need for only one port - */ - if (dai_data->num_group_ports > 1) { - rc = afe_port_group_enable(group_id, - &dai_data->group_cfg, true, - &dai_data->lane_cfg); - if (rc < 0) { - dev_err(dai->dev, - "%s: fail to enable AFE group 0x%x\n", - __func__, group_id); - goto rtn; - } - } - } - - rc = afe_tdm_port_start(dai->id, &dai_data->port_cfg, - dai_data->rate, dai_data->num_group_ports); - if (rc < 0) { - if (atomic_read(group_ref) == 0) { - afe_port_group_enable(group_id, - NULL, false, NULL); - } - if (msm_dai_q6_get_tdm_clk_ref(group_idx) == 0) { - msm_dai_q6_tdm_set_clk(dai_data, - dai->id, false); - } - dev_err(dai->dev, "%s: fail to open AFE port 0x%x\n", - __func__, dai->id); - } else { - set_bit(STATUS_PORT_STARTED, - dai_data->status_mask); - atomic_inc(group_ref); - } - - /* TODO: need to monitor PCM/MI2S/TDM HW status */ - /* NOTE: AFE should error out if HW resource contention */ - + set_bit(STATUS_PORT_STARTED, + dai_data->status_mask); + atomic_inc(group_ref); } rtn: @@ -9791,7 +3717,6 @@ static void msm_dai_q6_tdm_shutdown(struct snd_pcm_substream *substream, int rc = 0; struct msm_dai_q6_tdm_dai_data *dai_data = dev_get_drvdata(dai->dev); - u16 group_id = dai_data->group_cfg.tdm_cfg.group_id; int group_idx = 0; atomic_t *group_ref = NULL; @@ -9807,24 +3732,10 @@ static void msm_dai_q6_tdm_shutdown(struct snd_pcm_substream *substream, group_ref = &tdm_group_ref[group_idx]; if (test_bit(STATUS_PORT_STARTED, dai_data->status_mask)) { - rc = afe_close(dai->id); - if (rc < 0) { - dev_err(dai->dev, "%s: fail to close AFE port 0x%x\n", - __func__, dai->id); - } atomic_dec(group_ref); clear_bit(STATUS_PORT_STARTED, dai_data->status_mask); - if (atomic_read(group_ref) == 0) { - rc = afe_port_group_enable(group_id, - NULL, false, NULL); - if (rc < 0) { - dev_err(dai->dev, "%s: fail to disable AFE group 0x%x\n", - __func__, group_id); - } - } - if (msm_dai_q6_get_tdm_clk_ref(group_idx) == 0) { rc = msm_dai_q6_tdm_set_clk(dai_data, dai->id, false); @@ -9845,8 +3756,6 @@ static void msm_dai_q6_tdm_shutdown(struct snd_pcm_substream *substream, static struct snd_soc_dai_ops msm_dai_q6_tdm_ops = { .prepare = msm_dai_q6_tdm_prepare, .hw_params = msm_dai_q6_tdm_hw_params, - .set_tdm_slot = msm_dai_q6_tdm_set_tdm_slot, - .set_channel_map = msm_dai_q6_tdm_set_channel_map, .set_sysclk = msm_dai_q6_tdm_set_sysclk, .shutdown = msm_dai_q6_tdm_shutdown, }; @@ -9870,8 +3779,6 @@ static struct snd_soc_dai_driver msm_dai_q6_tdm_dai[] = { .name = "PRI_TDM_RX_0", .ops = &msm_dai_q6_tdm_ops, .id = AFE_PORT_ID_PRIMARY_TDM_RX, - .probe = msm_dai_q6_dai_tdm_probe, - .remove = msm_dai_q6_dai_tdm_remove, }, { .playback = { @@ -9891,8 +3798,6 @@ static struct snd_soc_dai_driver msm_dai_q6_tdm_dai[] = { .name = "PRI_TDM_RX_1", .ops = &msm_dai_q6_tdm_ops, .id = AFE_PORT_ID_PRIMARY_TDM_RX_1, - .probe = msm_dai_q6_dai_tdm_probe, - .remove = msm_dai_q6_dai_tdm_remove, }, { .playback = { @@ -9912,8 +3817,6 @@ static struct snd_soc_dai_driver msm_dai_q6_tdm_dai[] = { .name = "PRI_TDM_RX_2", .ops = &msm_dai_q6_tdm_ops, .id = AFE_PORT_ID_PRIMARY_TDM_RX_2, - .probe = msm_dai_q6_dai_tdm_probe, - .remove = msm_dai_q6_dai_tdm_remove, }, { .playback = { @@ -9933,8 +3836,6 @@ static struct snd_soc_dai_driver msm_dai_q6_tdm_dai[] = { .name = "PRI_TDM_RX_3", .ops = &msm_dai_q6_tdm_ops, .id = AFE_PORT_ID_PRIMARY_TDM_RX_3, - .probe = msm_dai_q6_dai_tdm_probe, - .remove = msm_dai_q6_dai_tdm_remove, }, { .playback = { @@ -9954,8 +3855,6 @@ static struct snd_soc_dai_driver msm_dai_q6_tdm_dai[] = { .name = "PRI_TDM_RX_4", .ops = &msm_dai_q6_tdm_ops, .id = AFE_PORT_ID_PRIMARY_TDM_RX_4, - .probe = msm_dai_q6_dai_tdm_probe, - .remove = msm_dai_q6_dai_tdm_remove, }, { .playback = { @@ -9975,8 +3874,6 @@ static struct snd_soc_dai_driver msm_dai_q6_tdm_dai[] = { .name = "PRI_TDM_RX_5", .ops = &msm_dai_q6_tdm_ops, .id = AFE_PORT_ID_PRIMARY_TDM_RX_5, - .probe = msm_dai_q6_dai_tdm_probe, - .remove = msm_dai_q6_dai_tdm_remove, }, { .playback = { @@ -9996,8 +3893,6 @@ static struct snd_soc_dai_driver msm_dai_q6_tdm_dai[] = { .name = "PRI_TDM_RX_6", .ops = &msm_dai_q6_tdm_ops, .id = AFE_PORT_ID_PRIMARY_TDM_RX_6, - .probe = msm_dai_q6_dai_tdm_probe, - .remove = msm_dai_q6_dai_tdm_remove, }, { .playback = { @@ -10017,8 +3912,6 @@ static struct snd_soc_dai_driver msm_dai_q6_tdm_dai[] = { .name = "PRI_TDM_RX_7", .ops = &msm_dai_q6_tdm_ops, .id = AFE_PORT_ID_PRIMARY_TDM_RX_7, - .probe = msm_dai_q6_dai_tdm_probe, - .remove = msm_dai_q6_dai_tdm_remove, }, { .capture = { @@ -10038,8 +3931,6 @@ static struct snd_soc_dai_driver msm_dai_q6_tdm_dai[] = { .name = "PRI_TDM_TX_0", .ops = &msm_dai_q6_tdm_ops, .id = AFE_PORT_ID_PRIMARY_TDM_TX, - .probe = msm_dai_q6_dai_tdm_probe, - .remove = msm_dai_q6_dai_tdm_remove, }, { .capture = { @@ -10059,8 +3950,6 @@ static struct snd_soc_dai_driver msm_dai_q6_tdm_dai[] = { .name = "PRI_TDM_TX_1", .ops = &msm_dai_q6_tdm_ops, .id = AFE_PORT_ID_PRIMARY_TDM_TX_1, - .probe = msm_dai_q6_dai_tdm_probe, - .remove = msm_dai_q6_dai_tdm_remove, }, { .capture = { @@ -10080,8 +3969,6 @@ static struct snd_soc_dai_driver msm_dai_q6_tdm_dai[] = { .name = "PRI_TDM_TX_2", .ops = &msm_dai_q6_tdm_ops, .id = AFE_PORT_ID_PRIMARY_TDM_TX_2, - .probe = msm_dai_q6_dai_tdm_probe, - .remove = msm_dai_q6_dai_tdm_remove, }, { .capture = { @@ -10101,8 +3988,6 @@ static struct snd_soc_dai_driver msm_dai_q6_tdm_dai[] = { .name = "PRI_TDM_TX_3", .ops = &msm_dai_q6_tdm_ops, .id = AFE_PORT_ID_PRIMARY_TDM_TX_3, - .probe = msm_dai_q6_dai_tdm_probe, - .remove = msm_dai_q6_dai_tdm_remove, }, { .capture = { @@ -10122,8 +4007,6 @@ static struct snd_soc_dai_driver msm_dai_q6_tdm_dai[] = { .name = "PRI_TDM_TX_4", .ops = &msm_dai_q6_tdm_ops, .id = AFE_PORT_ID_PRIMARY_TDM_TX_4, - .probe = msm_dai_q6_dai_tdm_probe, - .remove = msm_dai_q6_dai_tdm_remove, }, { .capture = { @@ -10143,8 +4026,6 @@ static struct snd_soc_dai_driver msm_dai_q6_tdm_dai[] = { .name = "PRI_TDM_TX_5", .ops = &msm_dai_q6_tdm_ops, .id = AFE_PORT_ID_PRIMARY_TDM_TX_5, - .probe = msm_dai_q6_dai_tdm_probe, - .remove = msm_dai_q6_dai_tdm_remove, }, { .capture = { @@ -10164,8 +4045,6 @@ static struct snd_soc_dai_driver msm_dai_q6_tdm_dai[] = { .name = "PRI_TDM_TX_6", .ops = &msm_dai_q6_tdm_ops, .id = AFE_PORT_ID_PRIMARY_TDM_TX_6, - .probe = msm_dai_q6_dai_tdm_probe, - .remove = msm_dai_q6_dai_tdm_remove, }, { .capture = { @@ -10185,8 +4064,6 @@ static struct snd_soc_dai_driver msm_dai_q6_tdm_dai[] = { .name = "PRI_TDM_TX_7", .ops = &msm_dai_q6_tdm_ops, .id = AFE_PORT_ID_PRIMARY_TDM_TX_7, - .probe = msm_dai_q6_dai_tdm_probe, - .remove = msm_dai_q6_dai_tdm_remove, }, { .playback = { @@ -10206,8 +4083,6 @@ static struct snd_soc_dai_driver msm_dai_q6_tdm_dai[] = { .name = "SEC_TDM_RX_0", .ops = &msm_dai_q6_tdm_ops, .id = AFE_PORT_ID_SECONDARY_TDM_RX, - .probe = msm_dai_q6_dai_tdm_probe, - .remove = msm_dai_q6_dai_tdm_remove, }, { .playback = { @@ -10227,8 +4102,6 @@ static struct snd_soc_dai_driver msm_dai_q6_tdm_dai[] = { .name = "SEC_TDM_RX_1", .ops = &msm_dai_q6_tdm_ops, .id = AFE_PORT_ID_SECONDARY_TDM_RX_1, - .probe = msm_dai_q6_dai_tdm_probe, - .remove = msm_dai_q6_dai_tdm_remove, }, { .playback = { @@ -10248,8 +4121,6 @@ static struct snd_soc_dai_driver msm_dai_q6_tdm_dai[] = { .name = "SEC_TDM_RX_2", .ops = &msm_dai_q6_tdm_ops, .id = AFE_PORT_ID_SECONDARY_TDM_RX_2, - .probe = msm_dai_q6_dai_tdm_probe, - .remove = msm_dai_q6_dai_tdm_remove, }, { .playback = { @@ -10269,8 +4140,6 @@ static struct snd_soc_dai_driver msm_dai_q6_tdm_dai[] = { .name = "SEC_TDM_RX_3", .ops = &msm_dai_q6_tdm_ops, .id = AFE_PORT_ID_SECONDARY_TDM_RX_3, - .probe = msm_dai_q6_dai_tdm_probe, - .remove = msm_dai_q6_dai_tdm_remove, }, { .playback = { @@ -10290,8 +4159,6 @@ static struct snd_soc_dai_driver msm_dai_q6_tdm_dai[] = { .name = "SEC_TDM_RX_4", .ops = &msm_dai_q6_tdm_ops, .id = AFE_PORT_ID_SECONDARY_TDM_RX_4, - .probe = msm_dai_q6_dai_tdm_probe, - .remove = msm_dai_q6_dai_tdm_remove, }, { .playback = { @@ -10311,8 +4178,6 @@ static struct snd_soc_dai_driver msm_dai_q6_tdm_dai[] = { .name = "SEC_TDM_RX_5", .ops = &msm_dai_q6_tdm_ops, .id = AFE_PORT_ID_SECONDARY_TDM_RX_5, - .probe = msm_dai_q6_dai_tdm_probe, - .remove = msm_dai_q6_dai_tdm_remove, }, { .playback = { @@ -10332,8 +4197,6 @@ static struct snd_soc_dai_driver msm_dai_q6_tdm_dai[] = { .name = "SEC_TDM_RX_6", .ops = &msm_dai_q6_tdm_ops, .id = AFE_PORT_ID_SECONDARY_TDM_RX_6, - .probe = msm_dai_q6_dai_tdm_probe, - .remove = msm_dai_q6_dai_tdm_remove, }, { .playback = { @@ -10353,8 +4216,6 @@ static struct snd_soc_dai_driver msm_dai_q6_tdm_dai[] = { .name = "SEC_TDM_RX_7", .ops = &msm_dai_q6_tdm_ops, .id = AFE_PORT_ID_SECONDARY_TDM_RX_7, - .probe = msm_dai_q6_dai_tdm_probe, - .remove = msm_dai_q6_dai_tdm_remove, }, { .capture = { @@ -10374,8 +4235,6 @@ static struct snd_soc_dai_driver msm_dai_q6_tdm_dai[] = { .name = "SEC_TDM_TX_0", .ops = &msm_dai_q6_tdm_ops, .id = AFE_PORT_ID_SECONDARY_TDM_TX, - .probe = msm_dai_q6_dai_tdm_probe, - .remove = msm_dai_q6_dai_tdm_remove, }, { .capture = { @@ -10395,8 +4254,6 @@ static struct snd_soc_dai_driver msm_dai_q6_tdm_dai[] = { .name = "SEC_TDM_TX_1", .ops = &msm_dai_q6_tdm_ops, .id = AFE_PORT_ID_SECONDARY_TDM_TX_1, - .probe = msm_dai_q6_dai_tdm_probe, - .remove = msm_dai_q6_dai_tdm_remove, }, { .capture = { @@ -10416,8 +4273,6 @@ static struct snd_soc_dai_driver msm_dai_q6_tdm_dai[] = { .name = "SEC_TDM_TX_2", .ops = &msm_dai_q6_tdm_ops, .id = AFE_PORT_ID_SECONDARY_TDM_TX_2, - .probe = msm_dai_q6_dai_tdm_probe, - .remove = msm_dai_q6_dai_tdm_remove, }, { .capture = { @@ -10437,8 +4292,6 @@ static struct snd_soc_dai_driver msm_dai_q6_tdm_dai[] = { .name = "SEC_TDM_TX_3", .ops = &msm_dai_q6_tdm_ops, .id = AFE_PORT_ID_SECONDARY_TDM_TX_3, - .probe = msm_dai_q6_dai_tdm_probe, - .remove = msm_dai_q6_dai_tdm_remove, }, { .capture = { @@ -10458,8 +4311,6 @@ static struct snd_soc_dai_driver msm_dai_q6_tdm_dai[] = { .name = "SEC_TDM_TX_4", .ops = &msm_dai_q6_tdm_ops, .id = AFE_PORT_ID_SECONDARY_TDM_TX_4, - .probe = msm_dai_q6_dai_tdm_probe, - .remove = msm_dai_q6_dai_tdm_remove, }, { .capture = { @@ -10479,8 +4330,6 @@ static struct snd_soc_dai_driver msm_dai_q6_tdm_dai[] = { .name = "SEC_TDM_TX_5", .ops = &msm_dai_q6_tdm_ops, .id = AFE_PORT_ID_SECONDARY_TDM_TX_5, - .probe = msm_dai_q6_dai_tdm_probe, - .remove = msm_dai_q6_dai_tdm_remove, }, { .capture = { @@ -10500,8 +4349,6 @@ static struct snd_soc_dai_driver msm_dai_q6_tdm_dai[] = { .name = "SEC_TDM_TX_6", .ops = &msm_dai_q6_tdm_ops, .id = AFE_PORT_ID_SECONDARY_TDM_TX_6, - .probe = msm_dai_q6_dai_tdm_probe, - .remove = msm_dai_q6_dai_tdm_remove, }, { .capture = { @@ -10521,8 +4368,6 @@ static struct snd_soc_dai_driver msm_dai_q6_tdm_dai[] = { .name = "SEC_TDM_TX_7", .ops = &msm_dai_q6_tdm_ops, .id = AFE_PORT_ID_SECONDARY_TDM_TX_7, - .probe = msm_dai_q6_dai_tdm_probe, - .remove = msm_dai_q6_dai_tdm_remove, }, { .playback = { @@ -10542,8 +4387,6 @@ static struct snd_soc_dai_driver msm_dai_q6_tdm_dai[] = { .name = "TERT_TDM_RX_0", .ops = &msm_dai_q6_tdm_ops, .id = AFE_PORT_ID_TERTIARY_TDM_RX, - .probe = msm_dai_q6_dai_tdm_probe, - .remove = msm_dai_q6_dai_tdm_remove, }, { .playback = { @@ -10563,8 +4406,6 @@ static struct snd_soc_dai_driver msm_dai_q6_tdm_dai[] = { .name = "TERT_TDM_RX_1", .ops = &msm_dai_q6_tdm_ops, .id = AFE_PORT_ID_TERTIARY_TDM_RX_1, - .probe = msm_dai_q6_dai_tdm_probe, - .remove = msm_dai_q6_dai_tdm_remove, }, { .playback = { @@ -10584,8 +4425,6 @@ static struct snd_soc_dai_driver msm_dai_q6_tdm_dai[] = { .name = "TERT_TDM_RX_2", .ops = &msm_dai_q6_tdm_ops, .id = AFE_PORT_ID_TERTIARY_TDM_RX_2, - .probe = msm_dai_q6_dai_tdm_probe, - .remove = msm_dai_q6_dai_tdm_remove, }, { .playback = { @@ -10605,8 +4444,6 @@ static struct snd_soc_dai_driver msm_dai_q6_tdm_dai[] = { .name = "TERT_TDM_RX_3", .ops = &msm_dai_q6_tdm_ops, .id = AFE_PORT_ID_TERTIARY_TDM_RX_3, - .probe = msm_dai_q6_dai_tdm_probe, - .remove = msm_dai_q6_dai_tdm_remove, }, { .playback = { @@ -10626,8 +4463,6 @@ static struct snd_soc_dai_driver msm_dai_q6_tdm_dai[] = { .name = "TERT_TDM_RX_4", .ops = &msm_dai_q6_tdm_ops, .id = AFE_PORT_ID_TERTIARY_TDM_RX_4, - .probe = msm_dai_q6_dai_tdm_probe, - .remove = msm_dai_q6_dai_tdm_remove, }, { .playback = { @@ -10647,8 +4482,6 @@ static struct snd_soc_dai_driver msm_dai_q6_tdm_dai[] = { .name = "TERT_TDM_RX_5", .ops = &msm_dai_q6_tdm_ops, .id = AFE_PORT_ID_TERTIARY_TDM_RX_5, - .probe = msm_dai_q6_dai_tdm_probe, - .remove = msm_dai_q6_dai_tdm_remove, }, { .playback = { @@ -10668,8 +4501,6 @@ static struct snd_soc_dai_driver msm_dai_q6_tdm_dai[] = { .name = "TERT_TDM_RX_6", .ops = &msm_dai_q6_tdm_ops, .id = AFE_PORT_ID_TERTIARY_TDM_RX_6, - .probe = msm_dai_q6_dai_tdm_probe, - .remove = msm_dai_q6_dai_tdm_remove, }, { .playback = { @@ -10689,8 +4520,6 @@ static struct snd_soc_dai_driver msm_dai_q6_tdm_dai[] = { .name = "TERT_TDM_RX_7", .ops = &msm_dai_q6_tdm_ops, .id = AFE_PORT_ID_TERTIARY_TDM_RX_7, - .probe = msm_dai_q6_dai_tdm_probe, - .remove = msm_dai_q6_dai_tdm_remove, }, { .capture = { @@ -10710,8 +4539,6 @@ static struct snd_soc_dai_driver msm_dai_q6_tdm_dai[] = { .name = "TERT_TDM_TX_0", .ops = &msm_dai_q6_tdm_ops, .id = AFE_PORT_ID_TERTIARY_TDM_TX, - .probe = msm_dai_q6_dai_tdm_probe, - .remove = msm_dai_q6_dai_tdm_remove, }, { .capture = { @@ -10731,8 +4558,6 @@ static struct snd_soc_dai_driver msm_dai_q6_tdm_dai[] = { .name = "TERT_TDM_TX_1", .ops = &msm_dai_q6_tdm_ops, .id = AFE_PORT_ID_TERTIARY_TDM_TX_1, - .probe = msm_dai_q6_dai_tdm_probe, - .remove = msm_dai_q6_dai_tdm_remove, }, { .capture = { @@ -10752,8 +4577,6 @@ static struct snd_soc_dai_driver msm_dai_q6_tdm_dai[] = { .name = "TERT_TDM_TX_2", .ops = &msm_dai_q6_tdm_ops, .id = AFE_PORT_ID_TERTIARY_TDM_TX_2, - .probe = msm_dai_q6_dai_tdm_probe, - .remove = msm_dai_q6_dai_tdm_remove, }, { .capture = { @@ -10773,8 +4596,6 @@ static struct snd_soc_dai_driver msm_dai_q6_tdm_dai[] = { .name = "TERT_TDM_TX_3", .ops = &msm_dai_q6_tdm_ops, .id = AFE_PORT_ID_TERTIARY_TDM_TX_3, - .probe = msm_dai_q6_dai_tdm_probe, - .remove = msm_dai_q6_dai_tdm_remove, }, { .capture = { @@ -10794,8 +4615,6 @@ static struct snd_soc_dai_driver msm_dai_q6_tdm_dai[] = { .name = "TERT_TDM_TX_4", .ops = &msm_dai_q6_tdm_ops, .id = AFE_PORT_ID_TERTIARY_TDM_TX_4, - .probe = msm_dai_q6_dai_tdm_probe, - .remove = msm_dai_q6_dai_tdm_remove, }, { .capture = { @@ -10815,8 +4634,6 @@ static struct snd_soc_dai_driver msm_dai_q6_tdm_dai[] = { .name = "TERT_TDM_TX_5", .ops = &msm_dai_q6_tdm_ops, .id = AFE_PORT_ID_TERTIARY_TDM_TX_5, - .probe = msm_dai_q6_dai_tdm_probe, - .remove = msm_dai_q6_dai_tdm_remove, }, { .capture = { @@ -10836,8 +4653,6 @@ static struct snd_soc_dai_driver msm_dai_q6_tdm_dai[] = { .name = "TERT_TDM_TX_6", .ops = &msm_dai_q6_tdm_ops, .id = AFE_PORT_ID_TERTIARY_TDM_TX_6, - .probe = msm_dai_q6_dai_tdm_probe, - .remove = msm_dai_q6_dai_tdm_remove, }, { .capture = { @@ -10857,8 +4672,6 @@ static struct snd_soc_dai_driver msm_dai_q6_tdm_dai[] = { .name = "TERT_TDM_TX_7", .ops = &msm_dai_q6_tdm_ops, .id = AFE_PORT_ID_TERTIARY_TDM_TX_7, - .probe = msm_dai_q6_dai_tdm_probe, - .remove = msm_dai_q6_dai_tdm_remove, }, { .playback = { @@ -10878,8 +4691,6 @@ static struct snd_soc_dai_driver msm_dai_q6_tdm_dai[] = { .name = "QUAT_TDM_RX_0", .ops = &msm_dai_q6_tdm_ops, .id = AFE_PORT_ID_QUATERNARY_TDM_RX, - .probe = msm_dai_q6_dai_tdm_probe, - .remove = msm_dai_q6_dai_tdm_remove, }, { .playback = { @@ -10899,8 +4710,6 @@ static struct snd_soc_dai_driver msm_dai_q6_tdm_dai[] = { .name = "QUAT_TDM_RX_1", .ops = &msm_dai_q6_tdm_ops, .id = AFE_PORT_ID_QUATERNARY_TDM_RX_1, - .probe = msm_dai_q6_dai_tdm_probe, - .remove = msm_dai_q6_dai_tdm_remove, }, { .playback = { @@ -10920,8 +4729,6 @@ static struct snd_soc_dai_driver msm_dai_q6_tdm_dai[] = { .name = "QUAT_TDM_RX_2", .ops = &msm_dai_q6_tdm_ops, .id = AFE_PORT_ID_QUATERNARY_TDM_RX_2, - .probe = msm_dai_q6_dai_tdm_probe, - .remove = msm_dai_q6_dai_tdm_remove, }, { .playback = { @@ -10941,8 +4748,6 @@ static struct snd_soc_dai_driver msm_dai_q6_tdm_dai[] = { .name = "QUAT_TDM_RX_3", .ops = &msm_dai_q6_tdm_ops, .id = AFE_PORT_ID_QUATERNARY_TDM_RX_3, - .probe = msm_dai_q6_dai_tdm_probe, - .remove = msm_dai_q6_dai_tdm_remove, }, { .playback = { @@ -10962,8 +4767,6 @@ static struct snd_soc_dai_driver msm_dai_q6_tdm_dai[] = { .name = "QUAT_TDM_RX_4", .ops = &msm_dai_q6_tdm_ops, .id = AFE_PORT_ID_QUATERNARY_TDM_RX_4, - .probe = msm_dai_q6_dai_tdm_probe, - .remove = msm_dai_q6_dai_tdm_remove, }, { .playback = { @@ -10983,8 +4786,6 @@ static struct snd_soc_dai_driver msm_dai_q6_tdm_dai[] = { .name = "QUAT_TDM_RX_5", .ops = &msm_dai_q6_tdm_ops, .id = AFE_PORT_ID_QUATERNARY_TDM_RX_5, - .probe = msm_dai_q6_dai_tdm_probe, - .remove = msm_dai_q6_dai_tdm_remove, }, { .playback = { @@ -11004,8 +4805,6 @@ static struct snd_soc_dai_driver msm_dai_q6_tdm_dai[] = { .name = "QUAT_TDM_RX_6", .ops = &msm_dai_q6_tdm_ops, .id = AFE_PORT_ID_QUATERNARY_TDM_RX_6, - .probe = msm_dai_q6_dai_tdm_probe, - .remove = msm_dai_q6_dai_tdm_remove, }, { .playback = { @@ -11025,8 +4824,6 @@ static struct snd_soc_dai_driver msm_dai_q6_tdm_dai[] = { .name = "QUAT_TDM_RX_7", .ops = &msm_dai_q6_tdm_ops, .id = AFE_PORT_ID_QUATERNARY_TDM_RX_7, - .probe = msm_dai_q6_dai_tdm_probe, - .remove = msm_dai_q6_dai_tdm_remove, }, { .capture = { @@ -11046,8 +4843,6 @@ static struct snd_soc_dai_driver msm_dai_q6_tdm_dai[] = { .name = "QUAT_TDM_TX_0", .ops = &msm_dai_q6_tdm_ops, .id = AFE_PORT_ID_QUATERNARY_TDM_TX, - .probe = msm_dai_q6_dai_tdm_probe, - .remove = msm_dai_q6_dai_tdm_remove, }, { .capture = { @@ -11067,8 +4862,6 @@ static struct snd_soc_dai_driver msm_dai_q6_tdm_dai[] = { .name = "QUAT_TDM_TX_1", .ops = &msm_dai_q6_tdm_ops, .id = AFE_PORT_ID_QUATERNARY_TDM_TX_1, - .probe = msm_dai_q6_dai_tdm_probe, - .remove = msm_dai_q6_dai_tdm_remove, }, { .capture = { @@ -11088,8 +4881,6 @@ static struct snd_soc_dai_driver msm_dai_q6_tdm_dai[] = { .name = "QUAT_TDM_TX_2", .ops = &msm_dai_q6_tdm_ops, .id = AFE_PORT_ID_QUATERNARY_TDM_TX_2, - .probe = msm_dai_q6_dai_tdm_probe, - .remove = msm_dai_q6_dai_tdm_remove, }, { .capture = { @@ -11109,8 +4900,6 @@ static struct snd_soc_dai_driver msm_dai_q6_tdm_dai[] = { .name = "QUAT_TDM_TX_3", .ops = &msm_dai_q6_tdm_ops, .id = AFE_PORT_ID_QUATERNARY_TDM_TX_3, - .probe = msm_dai_q6_dai_tdm_probe, - .remove = msm_dai_q6_dai_tdm_remove, }, { .capture = { @@ -11130,8 +4919,6 @@ static struct snd_soc_dai_driver msm_dai_q6_tdm_dai[] = { .name = "QUAT_TDM_TX_4", .ops = &msm_dai_q6_tdm_ops, .id = AFE_PORT_ID_QUATERNARY_TDM_TX_4, - .probe = msm_dai_q6_dai_tdm_probe, - .remove = msm_dai_q6_dai_tdm_remove, }, { .capture = { @@ -11151,8 +4938,6 @@ static struct snd_soc_dai_driver msm_dai_q6_tdm_dai[] = { .name = "QUAT_TDM_TX_5", .ops = &msm_dai_q6_tdm_ops, .id = AFE_PORT_ID_QUATERNARY_TDM_TX_5, - .probe = msm_dai_q6_dai_tdm_probe, - .remove = msm_dai_q6_dai_tdm_remove, }, { .capture = { @@ -11172,8 +4957,6 @@ static struct snd_soc_dai_driver msm_dai_q6_tdm_dai[] = { .name = "QUAT_TDM_TX_6", .ops = &msm_dai_q6_tdm_ops, .id = AFE_PORT_ID_QUATERNARY_TDM_TX_6, - .probe = msm_dai_q6_dai_tdm_probe, - .remove = msm_dai_q6_dai_tdm_remove, }, { .capture = { @@ -11193,8 +4976,6 @@ static struct snd_soc_dai_driver msm_dai_q6_tdm_dai[] = { .name = "QUAT_TDM_TX_7", .ops = &msm_dai_q6_tdm_ops, .id = AFE_PORT_ID_QUATERNARY_TDM_TX_7, - .probe = msm_dai_q6_dai_tdm_probe, - .remove = msm_dai_q6_dai_tdm_remove, }, { .playback = { @@ -11214,8 +4995,6 @@ static struct snd_soc_dai_driver msm_dai_q6_tdm_dai[] = { .name = "QUIN_TDM_RX_0", .ops = &msm_dai_q6_tdm_ops, .id = AFE_PORT_ID_QUINARY_TDM_RX, - .probe = msm_dai_q6_dai_tdm_probe, - .remove = msm_dai_q6_dai_tdm_remove, }, { .playback = { @@ -11235,8 +5014,6 @@ static struct snd_soc_dai_driver msm_dai_q6_tdm_dai[] = { .name = "QUIN_TDM_RX_1", .ops = &msm_dai_q6_tdm_ops, .id = AFE_PORT_ID_QUINARY_TDM_RX_1, - .probe = msm_dai_q6_dai_tdm_probe, - .remove = msm_dai_q6_dai_tdm_remove, }, { .playback = { @@ -11256,8 +5033,6 @@ static struct snd_soc_dai_driver msm_dai_q6_tdm_dai[] = { .name = "QUIN_TDM_RX_2", .ops = &msm_dai_q6_tdm_ops, .id = AFE_PORT_ID_QUINARY_TDM_RX_2, - .probe = msm_dai_q6_dai_tdm_probe, - .remove = msm_dai_q6_dai_tdm_remove, }, { .playback = { @@ -11277,8 +5052,6 @@ static struct snd_soc_dai_driver msm_dai_q6_tdm_dai[] = { .name = "QUIN_TDM_RX_3", .ops = &msm_dai_q6_tdm_ops, .id = AFE_PORT_ID_QUINARY_TDM_RX_3, - .probe = msm_dai_q6_dai_tdm_probe, - .remove = msm_dai_q6_dai_tdm_remove, }, { .playback = { @@ -11298,8 +5071,6 @@ static struct snd_soc_dai_driver msm_dai_q6_tdm_dai[] = { .name = "QUIN_TDM_RX_4", .ops = &msm_dai_q6_tdm_ops, .id = AFE_PORT_ID_QUINARY_TDM_RX_4, - .probe = msm_dai_q6_dai_tdm_probe, - .remove = msm_dai_q6_dai_tdm_remove, }, { .playback = { @@ -11319,8 +5090,6 @@ static struct snd_soc_dai_driver msm_dai_q6_tdm_dai[] = { .name = "QUIN_TDM_RX_5", .ops = &msm_dai_q6_tdm_ops, .id = AFE_PORT_ID_QUINARY_TDM_RX_5, - .probe = msm_dai_q6_dai_tdm_probe, - .remove = msm_dai_q6_dai_tdm_remove, }, { .playback = { @@ -11340,8 +5109,6 @@ static struct snd_soc_dai_driver msm_dai_q6_tdm_dai[] = { .name = "QUIN_TDM_RX_6", .ops = &msm_dai_q6_tdm_ops, .id = AFE_PORT_ID_QUINARY_TDM_RX_6, - .probe = msm_dai_q6_dai_tdm_probe, - .remove = msm_dai_q6_dai_tdm_remove, }, { .playback = { @@ -11361,8 +5128,6 @@ static struct snd_soc_dai_driver msm_dai_q6_tdm_dai[] = { .name = "QUIN_TDM_RX_7", .ops = &msm_dai_q6_tdm_ops, .id = AFE_PORT_ID_QUINARY_TDM_RX_7, - .probe = msm_dai_q6_dai_tdm_probe, - .remove = msm_dai_q6_dai_tdm_remove, }, { .capture = { @@ -11382,8 +5147,6 @@ static struct snd_soc_dai_driver msm_dai_q6_tdm_dai[] = { .name = "QUIN_TDM_TX_0", .ops = &msm_dai_q6_tdm_ops, .id = AFE_PORT_ID_QUINARY_TDM_TX, - .probe = msm_dai_q6_dai_tdm_probe, - .remove = msm_dai_q6_dai_tdm_remove, }, { .capture = { @@ -11403,8 +5166,6 @@ static struct snd_soc_dai_driver msm_dai_q6_tdm_dai[] = { .name = "QUIN_TDM_TX_1", .ops = &msm_dai_q6_tdm_ops, .id = AFE_PORT_ID_QUINARY_TDM_TX_1, - .probe = msm_dai_q6_dai_tdm_probe, - .remove = msm_dai_q6_dai_tdm_remove, }, { .capture = { @@ -11424,8 +5185,6 @@ static struct snd_soc_dai_driver msm_dai_q6_tdm_dai[] = { .name = "QUIN_TDM_TX_2", .ops = &msm_dai_q6_tdm_ops, .id = AFE_PORT_ID_QUINARY_TDM_TX_2, - .probe = msm_dai_q6_dai_tdm_probe, - .remove = msm_dai_q6_dai_tdm_remove, }, { .capture = { @@ -11445,8 +5204,6 @@ static struct snd_soc_dai_driver msm_dai_q6_tdm_dai[] = { .name = "QUIN_TDM_TX_3", .ops = &msm_dai_q6_tdm_ops, .id = AFE_PORT_ID_QUINARY_TDM_TX_3, - .probe = msm_dai_q6_dai_tdm_probe, - .remove = msm_dai_q6_dai_tdm_remove, }, { .capture = { @@ -11466,8 +5223,6 @@ static struct snd_soc_dai_driver msm_dai_q6_tdm_dai[] = { .name = "QUIN_TDM_TX_4", .ops = &msm_dai_q6_tdm_ops, .id = AFE_PORT_ID_QUINARY_TDM_TX_4, - .probe = msm_dai_q6_dai_tdm_probe, - .remove = msm_dai_q6_dai_tdm_remove, }, { .capture = { @@ -11487,8 +5242,6 @@ static struct snd_soc_dai_driver msm_dai_q6_tdm_dai[] = { .name = "QUIN_TDM_TX_5", .ops = &msm_dai_q6_tdm_ops, .id = AFE_PORT_ID_QUINARY_TDM_TX_5, - .probe = msm_dai_q6_dai_tdm_probe, - .remove = msm_dai_q6_dai_tdm_remove, }, { .capture = { @@ -11508,8 +5261,6 @@ static struct snd_soc_dai_driver msm_dai_q6_tdm_dai[] = { .name = "QUIN_TDM_TX_6", .ops = &msm_dai_q6_tdm_ops, .id = AFE_PORT_ID_QUINARY_TDM_TX_6, - .probe = msm_dai_q6_dai_tdm_probe, - .remove = msm_dai_q6_dai_tdm_remove, }, { .capture = { @@ -11529,8 +5280,6 @@ static struct snd_soc_dai_driver msm_dai_q6_tdm_dai[] = { .name = "QUIN_TDM_TX_7", .ops = &msm_dai_q6_tdm_ops, .id = AFE_PORT_ID_QUINARY_TDM_TX_7, - .probe = msm_dai_q6_dai_tdm_probe, - .remove = msm_dai_q6_dai_tdm_remove, }, { .playback = { @@ -11550,8 +5299,6 @@ static struct snd_soc_dai_driver msm_dai_q6_tdm_dai[] = { .name = "SEN_TDM_RX_0", .ops = &msm_dai_q6_tdm_ops, .id = AFE_PORT_ID_SENARY_TDM_RX, - .probe = msm_dai_q6_dai_tdm_probe, - .remove = msm_dai_q6_dai_tdm_remove, }, { .playback = { @@ -11571,8 +5318,6 @@ static struct snd_soc_dai_driver msm_dai_q6_tdm_dai[] = { .name = "SEN_TDM_RX_1", .ops = &msm_dai_q6_tdm_ops, .id = AFE_PORT_ID_SENARY_TDM_RX_1, - .probe = msm_dai_q6_dai_tdm_probe, - .remove = msm_dai_q6_dai_tdm_remove, }, { .playback = { @@ -11592,8 +5337,6 @@ static struct snd_soc_dai_driver msm_dai_q6_tdm_dai[] = { .name = "SEN_TDM_RX_2", .ops = &msm_dai_q6_tdm_ops, .id = AFE_PORT_ID_SENARY_TDM_RX_2, - .probe = msm_dai_q6_dai_tdm_probe, - .remove = msm_dai_q6_dai_tdm_remove, }, { .playback = { @@ -11613,8 +5356,6 @@ static struct snd_soc_dai_driver msm_dai_q6_tdm_dai[] = { .name = "SEN_TDM_RX_3", .ops = &msm_dai_q6_tdm_ops, .id = AFE_PORT_ID_SENARY_TDM_RX_3, - .probe = msm_dai_q6_dai_tdm_probe, - .remove = msm_dai_q6_dai_tdm_remove, }, { .playback = { @@ -11634,8 +5375,6 @@ static struct snd_soc_dai_driver msm_dai_q6_tdm_dai[] = { .name = "SEN_TDM_RX_4", .ops = &msm_dai_q6_tdm_ops, .id = AFE_PORT_ID_SENARY_TDM_RX_4, - .probe = msm_dai_q6_dai_tdm_probe, - .remove = msm_dai_q6_dai_tdm_remove, }, { .playback = { @@ -11655,8 +5394,6 @@ static struct snd_soc_dai_driver msm_dai_q6_tdm_dai[] = { .name = "SEN_TDM_RX_5", .ops = &msm_dai_q6_tdm_ops, .id = AFE_PORT_ID_SENARY_TDM_RX_5, - .probe = msm_dai_q6_dai_tdm_probe, - .remove = msm_dai_q6_dai_tdm_remove, }, { .playback = { @@ -11676,8 +5413,6 @@ static struct snd_soc_dai_driver msm_dai_q6_tdm_dai[] = { .name = "SEN_TDM_RX_6", .ops = &msm_dai_q6_tdm_ops, .id = AFE_PORT_ID_SENARY_TDM_RX_6, - .probe = msm_dai_q6_dai_tdm_probe, - .remove = msm_dai_q6_dai_tdm_remove, }, { .playback = { @@ -11697,8 +5432,6 @@ static struct snd_soc_dai_driver msm_dai_q6_tdm_dai[] = { .name = "SEN_TDM_RX_7", .ops = &msm_dai_q6_tdm_ops, .id = AFE_PORT_ID_SENARY_TDM_RX_7, - .probe = msm_dai_q6_dai_tdm_probe, - .remove = msm_dai_q6_dai_tdm_remove, }, { .capture = { @@ -11718,8 +5451,6 @@ static struct snd_soc_dai_driver msm_dai_q6_tdm_dai[] = { .name = "SEN_TDM_TX_0", .ops = &msm_dai_q6_tdm_ops, .id = AFE_PORT_ID_SENARY_TDM_TX, - .probe = msm_dai_q6_dai_tdm_probe, - .remove = msm_dai_q6_dai_tdm_remove, }, { .capture = { @@ -11739,8 +5470,6 @@ static struct snd_soc_dai_driver msm_dai_q6_tdm_dai[] = { .name = "SEN_TDM_TX_1", .ops = &msm_dai_q6_tdm_ops, .id = AFE_PORT_ID_SENARY_TDM_TX_1, - .probe = msm_dai_q6_dai_tdm_probe, - .remove = msm_dai_q6_dai_tdm_remove, }, { .capture = { @@ -11760,8 +5489,6 @@ static struct snd_soc_dai_driver msm_dai_q6_tdm_dai[] = { .name = "SEN_TDM_TX_2", .ops = &msm_dai_q6_tdm_ops, .id = AFE_PORT_ID_SENARY_TDM_TX_2, - .probe = msm_dai_q6_dai_tdm_probe, - .remove = msm_dai_q6_dai_tdm_remove, }, { .capture = { @@ -11781,8 +5508,6 @@ static struct snd_soc_dai_driver msm_dai_q6_tdm_dai[] = { .name = "SEN_TDM_TX_3", .ops = &msm_dai_q6_tdm_ops, .id = AFE_PORT_ID_SENARY_TDM_TX_3, - .probe = msm_dai_q6_dai_tdm_probe, - .remove = msm_dai_q6_dai_tdm_remove, }, { .capture = { @@ -11802,8 +5527,6 @@ static struct snd_soc_dai_driver msm_dai_q6_tdm_dai[] = { .name = "SEN_TDM_TX_4", .ops = &msm_dai_q6_tdm_ops, .id = AFE_PORT_ID_SENARY_TDM_TX_4, - .probe = msm_dai_q6_dai_tdm_probe, - .remove = msm_dai_q6_dai_tdm_remove, }, { .capture = { @@ -11823,8 +5546,6 @@ static struct snd_soc_dai_driver msm_dai_q6_tdm_dai[] = { .name = "SEN_TDM_TX_5", .ops = &msm_dai_q6_tdm_ops, .id = AFE_PORT_ID_SENARY_TDM_TX_5, - .probe = msm_dai_q6_dai_tdm_probe, - .remove = msm_dai_q6_dai_tdm_remove, }, { .capture = { @@ -11844,8 +5565,6 @@ static struct snd_soc_dai_driver msm_dai_q6_tdm_dai[] = { .name = "SEN_TDM_TX_6", .ops = &msm_dai_q6_tdm_ops, .id = AFE_PORT_ID_SENARY_TDM_TX_6, - .probe = msm_dai_q6_dai_tdm_probe, - .remove = msm_dai_q6_dai_tdm_remove, }, { .capture = { @@ -11865,8 +5584,6 @@ static struct snd_soc_dai_driver msm_dai_q6_tdm_dai[] = { .name = "SEN_TDM_TX_7", .ops = &msm_dai_q6_tdm_ops, .id = AFE_PORT_ID_SENARY_TDM_TX_7, - .probe = msm_dai_q6_dai_tdm_probe, - .remove = msm_dai_q6_dai_tdm_remove, }, }; @@ -12122,282 +5839,6 @@ static struct platform_driver msm_dai_q6_tdm_driver = { }, }; -static int msm_dai_q6_cdc_dma_format_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct msm_dai_q6_cdc_dma_dai_data *dai_data = kcontrol->private_data; - int value = ucontrol->value.integer.value[0]; - - dai_data->port_config.cdc_dma.data_format = value; - pr_debug("%s: format = %d\n", __func__, value); - return 0; -} - -static int msm_dai_q6_cdc_dma_format_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct msm_dai_q6_cdc_dma_dai_data *dai_data = kcontrol->private_data; - - ucontrol->value.integer.value[0] = - dai_data->port_config.cdc_dma.data_format; - return 0; -} - -static const struct snd_kcontrol_new cdc_dma_config_controls[] = { - SOC_ENUM_EXT("WSA_CDC_DMA_0 TX Format", cdc_dma_config_enum[0], - msm_dai_q6_cdc_dma_format_get, - msm_dai_q6_cdc_dma_format_put), - SOC_ENUM_EXT("WSA_CDC_DMA_0 RX XTLoggingDisable", - xt_logging_disable_enum[0], - msm_dai_q6_cdc_dma_xt_logging_disable_get, - msm_dai_q6_cdc_dma_xt_logging_disable_put), -}; - -/* SOC probe for codec DMA interface */ -static int msm_dai_q6_dai_cdc_dma_probe(struct snd_soc_dai *dai) -{ - struct msm_dai_q6_cdc_dma_dai_data *dai_data = NULL; - int rc = 0; - - if (!dai) { - pr_err("%s: Invalid params dai\n", __func__); - return -EINVAL; - } - if (!dai->dev) { - pr_err("%s: Invalid params dai dev\n", __func__); - return -EINVAL; - } - - msm_dai_q6_set_dai_id(dai); - dai_data = dev_get_drvdata(dai->dev); - - switch (dai->id) { - case AFE_PORT_ID_WSA_CODEC_DMA_TX_0: - rc = snd_ctl_add(dai->component->card->snd_card, - snd_ctl_new1(&cdc_dma_config_controls[0], - dai_data)); - break; - case AFE_PORT_ID_WSA_CODEC_DMA_RX_0: - rc = snd_ctl_add(dai->component->card->snd_card, - snd_ctl_new1(&cdc_dma_config_controls[1], - dai_data)); - break; - default: - break; - } - - if (rc < 0) - dev_err(dai->dev, "%s: err add config ctl, DAI = %s\n", - __func__, dai->name); - - if (dai_data->is_island_dai) - rc = msm_dai_q6_add_island_mx_ctls( - dai->component->card->snd_card, - dai->name, dai->id, - (void *)dai_data); - - rc = msm_dai_q6_dai_add_route(dai); - return rc; -} - -static int msm_dai_q6_dai_cdc_dma_remove(struct snd_soc_dai *dai) -{ - struct msm_dai_q6_cdc_dma_dai_data *dai_data = - dev_get_drvdata(dai->dev); - int rc = 0; - - /* If AFE port is still up, close it */ - if (test_bit(STATUS_PORT_STARTED, dai_data->status_mask)) { - dev_dbg(dai->dev, "%s: stop codec dma port:%d\n", __func__, - dai->id); - rc = afe_close(dai->id); /* can block */ - if (rc < 0) - dev_err(dai->dev, "fail to close AFE port\n"); - clear_bit(STATUS_PORT_STARTED, dai_data->status_mask); - } - return rc; -} - -static int msm_dai_q6_cdc_dma_set_channel_map(struct snd_soc_dai *dai, - unsigned int tx_num_ch, unsigned int *tx_ch_mask, - unsigned int rx_num_ch, unsigned int *rx_ch_mask) - -{ - int rc = 0; - struct msm_dai_q6_cdc_dma_dai_data *dai_data = - dev_get_drvdata(dai->dev); - unsigned int ch_mask = 0, ch_num = 0; - - dev_dbg(dai->dev, "%s: id = %d\n", __func__, dai->id); - switch (dai->id) { - case AFE_PORT_ID_WSA_CODEC_DMA_RX_0: - case AFE_PORT_ID_WSA_CODEC_DMA_RX_1: - case AFE_PORT_ID_RX_CODEC_DMA_RX_0: - case AFE_PORT_ID_RX_CODEC_DMA_RX_1: - case AFE_PORT_ID_RX_CODEC_DMA_RX_2: - case AFE_PORT_ID_RX_CODEC_DMA_RX_3: - case AFE_PORT_ID_RX_CODEC_DMA_RX_4: - case AFE_PORT_ID_RX_CODEC_DMA_RX_5: - case AFE_PORT_ID_RX_CODEC_DMA_RX_6: - case AFE_PORT_ID_RX_CODEC_DMA_RX_7: - if (!rx_ch_mask) { - dev_err(dai->dev, "%s: invalid rx ch mask\n", __func__); - return -EINVAL; - } - if (rx_num_ch > AFE_PORT_MAX_AUDIO_CHAN_CNT) { - dev_err(dai->dev, "%s: invalid rx_num_ch %d\n", - __func__, rx_num_ch); - return -EINVAL; - } - ch_mask = *rx_ch_mask; - ch_num = rx_num_ch; - break; - case AFE_PORT_ID_WSA_CODEC_DMA_TX_0: - case AFE_PORT_ID_WSA_CODEC_DMA_TX_1: - case AFE_PORT_ID_WSA_CODEC_DMA_TX_2: - case AFE_PORT_ID_VA_CODEC_DMA_TX_0: - case AFE_PORT_ID_VA_CODEC_DMA_TX_1: - case AFE_PORT_ID_TX_CODEC_DMA_TX_0: - case AFE_PORT_ID_TX_CODEC_DMA_TX_1: - case AFE_PORT_ID_TX_CODEC_DMA_TX_2: - case AFE_PORT_ID_TX_CODEC_DMA_TX_3: - case AFE_PORT_ID_TX_CODEC_DMA_TX_4: - case AFE_PORT_ID_TX_CODEC_DMA_TX_5: - if (!tx_ch_mask) { - dev_err(dai->dev, "%s: invalid tx ch mask\n", __func__); - return -EINVAL; - } - if (tx_num_ch > AFE_PORT_MAX_AUDIO_CHAN_CNT) { - dev_err(dai->dev, "%s: invalid tx_num_ch %d\n", - __func__, tx_num_ch); - return -EINVAL; - } - ch_mask = *tx_ch_mask; - ch_num = tx_num_ch; - break; - default: - dev_err(dai->dev, "%s: invalid dai id %d\n", __func__, dai->id); - return -EINVAL; - } - - dai_data->port_config.cdc_dma.active_channels_mask = ch_mask; - dev_dbg(dai->dev, "%s: CDC_DMA_%d_ch cnt[%d] ch mask[0x%x]\n", __func__, - dai->id, ch_num, ch_mask); - return rc; -} - -static int msm_dai_q6_cdc_dma_hw_params( - struct snd_pcm_substream *substream, - struct snd_pcm_hw_params *params, - struct snd_soc_dai *dai) -{ - struct msm_dai_q6_cdc_dma_dai_data *dai_data = - dev_get_drvdata(dai->dev); - - switch (params_format(params)) { - case SNDRV_PCM_FORMAT_S16_LE: - case SNDRV_PCM_FORMAT_SPECIAL: - dai_data->port_config.cdc_dma.bit_width = 16; - break; - case SNDRV_PCM_FORMAT_S24_LE: - case SNDRV_PCM_FORMAT_S24_3LE: - dai_data->port_config.cdc_dma.bit_width = 24; - break; - case SNDRV_PCM_FORMAT_S32_LE: - dai_data->port_config.cdc_dma.bit_width = 32; - break; - default: - dev_err(dai->dev, "%s: format %d\n", - __func__, params_format(params)); - return -EINVAL; - } - - dai_data->rate = params_rate(params); - dai_data->channels = params_channels(params); - - dai_data->port_config.cdc_dma.cdc_dma_cfg_minor_version = - AFE_API_VERSION_CODEC_DMA_CONFIG; - dai_data->port_config.cdc_dma.sample_rate = dai_data->rate; - dai_data->port_config.cdc_dma.num_channels = dai_data->channels; - dev_dbg(dai->dev, "%s: bit_wd[%hu] format[%hu]\n" - "num_channel %hu sample_rate %d\n", __func__, - dai_data->port_config.cdc_dma.bit_width, - dai_data->port_config.cdc_dma.data_format, - dai_data->port_config.cdc_dma.num_channels, - dai_data->rate); - - return 0; -} - -static int msm_dai_q6_cdc_dma_prepare(struct snd_pcm_substream *substream, - struct snd_soc_dai *dai) -{ - struct msm_dai_q6_cdc_dma_dai_data *dai_data = - dev_get_drvdata(dai->dev); - int rc = 0; - - if (!test_bit(STATUS_PORT_STARTED, dai_data->status_mask)) { - if ((dai->id == AFE_PORT_ID_WSA_CODEC_DMA_TX_0) && - (dai_data->port_config.cdc_dma.data_format == 1)) - dai_data->port_config.cdc_dma.data_format = - AFE_LINEAR_PCM_DATA_PACKED_16BIT; - - rc = afe_send_cdc_dma_data_align(dai->id, - dai_data->cdc_dma_data_align); - if (rc) - pr_debug("%s: afe send data alignment failed %d\n", - __func__, rc); - - rc = afe_port_start(dai->id, &dai_data->port_config, - dai_data->rate); - if (rc < 0) - dev_err(dai->dev, "fail to open AFE port 0x%x\n", - dai->id); - else - set_bit(STATUS_PORT_STARTED, - dai_data->status_mask); - } - return rc; -} - - -static void msm_dai_q6_cdc_dma_shutdown(struct snd_pcm_substream *substream, - struct snd_soc_dai *dai) -{ - struct msm_dai_q6_dai_data *dai_data = dev_get_drvdata(dai->dev); - int rc = 0; - - if (test_bit(STATUS_PORT_STARTED, dai_data->status_mask)) { - dev_dbg(dai->dev, "%s: stop AFE port:%d\n", __func__, - dai->id); - rc = afe_close(dai->id); /* can block */ - if (rc < 0) - dev_err(dai->dev, "fail to close AFE port\n"); - - dev_dbg(dai->dev, "%s: dai_data->status_mask = %ld\n", __func__, - *dai_data->status_mask); - clear_bit(STATUS_PORT_STARTED, dai_data->status_mask); - } - - if (test_bit(STATUS_PORT_STARTED, dai_data->hwfree_status)) - clear_bit(STATUS_PORT_STARTED, dai_data->hwfree_status); -} - -static struct snd_soc_dai_ops msm_dai_q6_cdc_dma_ops = { - .prepare = msm_dai_q6_cdc_dma_prepare, - .hw_params = msm_dai_q6_cdc_dma_hw_params, - .shutdown = msm_dai_q6_cdc_dma_shutdown, - .set_channel_map = msm_dai_q6_cdc_dma_set_channel_map, -}; - -static struct snd_soc_dai_ops msm_dai_q6_cdc_wsa_dma_ops = { - .prepare = msm_dai_q6_cdc_dma_prepare, - .hw_params = msm_dai_q6_cdc_dma_hw_params, - .shutdown = msm_dai_q6_cdc_dma_shutdown, - .set_channel_map = msm_dai_q6_cdc_dma_set_channel_map, - .digital_mute = msm_dai_q6_spk_digital_mute, -}; - static struct snd_soc_dai_driver msm_dai_q6_cdc_dma_dai[] = { { .playback = { @@ -12420,10 +5861,7 @@ static struct snd_soc_dai_driver msm_dai_q6_cdc_dma_dai[] = { .rate_max = 384000, }, .name = "WSA_CDC_DMA_RX_0", - .ops = &msm_dai_q6_cdc_wsa_dma_ops, .id = AFE_PORT_ID_WSA_CODEC_DMA_RX_0, - .probe = msm_dai_q6_dai_cdc_dma_probe, - .remove = msm_dai_q6_dai_cdc_dma_remove, }, { .capture = { @@ -12446,11 +5884,8 @@ static struct snd_soc_dai_driver msm_dai_q6_cdc_dma_dai[] = { .rate_max = 384000, }, .name = "WSA_CDC_DMA_TX_0", - .ops = &msm_dai_q6_cdc_dma_ops, .id = AFE_PORT_ID_WSA_CODEC_DMA_TX_0, - .probe = msm_dai_q6_dai_cdc_dma_probe, - .remove = msm_dai_q6_dai_cdc_dma_remove, - }, + }, { .playback = { .stream_name = "WSA CDC DMA1 Playback", @@ -12472,10 +5907,7 @@ static struct snd_soc_dai_driver msm_dai_q6_cdc_dma_dai[] = { .rate_max = 384000, }, .name = "WSA_CDC_DMA_RX_1", - .ops = &msm_dai_q6_cdc_wsa_dma_ops, .id = AFE_PORT_ID_WSA_CODEC_DMA_RX_1, - .probe = msm_dai_q6_dai_cdc_dma_probe, - .remove = msm_dai_q6_dai_cdc_dma_remove, }, { .capture = { @@ -12498,10 +5930,7 @@ static struct snd_soc_dai_driver msm_dai_q6_cdc_dma_dai[] = { .rate_max = 384000, }, .name = "WSA_CDC_DMA_TX_1", - .ops = &msm_dai_q6_cdc_dma_ops, .id = AFE_PORT_ID_WSA_CODEC_DMA_TX_1, - .probe = msm_dai_q6_dai_cdc_dma_probe, - .remove = msm_dai_q6_dai_cdc_dma_remove, }, { .capture = { @@ -12524,10 +5953,7 @@ static struct snd_soc_dai_driver msm_dai_q6_cdc_dma_dai[] = { .rate_max = 384000, }, .name = "WSA_CDC_DMA_TX_2", - .ops = &msm_dai_q6_cdc_dma_ops, .id = AFE_PORT_ID_WSA_CODEC_DMA_TX_2, - .probe = msm_dai_q6_dai_cdc_dma_probe, - .remove = msm_dai_q6_dai_cdc_dma_remove, }, { .capture = { @@ -12549,10 +5975,7 @@ static struct snd_soc_dai_driver msm_dai_q6_cdc_dma_dai[] = { .rate_max = 384000, }, .name = "VA_CDC_DMA_TX_0", - .ops = &msm_dai_q6_cdc_dma_ops, .id = AFE_PORT_ID_VA_CODEC_DMA_TX_0, - .probe = msm_dai_q6_dai_cdc_dma_probe, - .remove = msm_dai_q6_dai_cdc_dma_remove, }, { .capture = { @@ -12574,10 +5997,7 @@ static struct snd_soc_dai_driver msm_dai_q6_cdc_dma_dai[] = { .rate_max = 384000, }, .name = "VA_CDC_DMA_TX_1", - .ops = &msm_dai_q6_cdc_dma_ops, .id = AFE_PORT_ID_VA_CODEC_DMA_TX_1, - .probe = msm_dai_q6_dai_cdc_dma_probe, - .remove = msm_dai_q6_dai_cdc_dma_remove, }, { .capture = { @@ -12599,10 +6019,7 @@ static struct snd_soc_dai_driver msm_dai_q6_cdc_dma_dai[] = { .rate_max = 384000, }, .name = "VA_CDC_DMA_TX_2", - .ops = &msm_dai_q6_cdc_dma_ops, .id = AFE_PORT_ID_VA_CODEC_DMA_TX_2, - .probe = msm_dai_q6_dai_cdc_dma_probe, - .remove = msm_dai_q6_dai_cdc_dma_remove, }, { .playback = { @@ -12624,10 +6041,8 @@ static struct snd_soc_dai_driver msm_dai_q6_cdc_dma_dai[] = { .rate_min = 8000, .rate_max = 384000, }, - .ops = &msm_dai_q6_cdc_dma_ops, + .name = "RX_CDC_DMA_RX_0", .id = AFE_PORT_ID_RX_CODEC_DMA_RX_0, - .probe = msm_dai_q6_dai_cdc_dma_probe, - .remove = msm_dai_q6_dai_cdc_dma_remove, }, { .capture = { @@ -12649,10 +6064,8 @@ static struct snd_soc_dai_driver msm_dai_q6_cdc_dma_dai[] = { .rate_min = 8000, .rate_max = 384000, }, - .ops = &msm_dai_q6_cdc_dma_ops, + .name = "TX_CDC_DMA_TX_0", .id = AFE_PORT_ID_TX_CODEC_DMA_TX_0, - .probe = msm_dai_q6_dai_cdc_dma_probe, - .remove = msm_dai_q6_dai_cdc_dma_remove, }, { .playback = { @@ -12674,10 +6087,8 @@ static struct snd_soc_dai_driver msm_dai_q6_cdc_dma_dai[] = { .rate_min = 8000, .rate_max = 384000, }, - .ops = &msm_dai_q6_cdc_dma_ops, .id = AFE_PORT_ID_RX_CODEC_DMA_RX_1, - .probe = msm_dai_q6_dai_cdc_dma_probe, - .remove = msm_dai_q6_dai_cdc_dma_remove, + .name = "RX_CDC_DMA_RX_1", }, { .capture = { @@ -12699,10 +6110,8 @@ static struct snd_soc_dai_driver msm_dai_q6_cdc_dma_dai[] = { .rate_min = 8000, .rate_max = 384000, }, - .ops = &msm_dai_q6_cdc_dma_ops, .id = AFE_PORT_ID_TX_CODEC_DMA_TX_1, - .probe = msm_dai_q6_dai_cdc_dma_probe, - .remove = msm_dai_q6_dai_cdc_dma_remove, + .name = "TX_CDC_DMA_TX_1", }, { .playback = { @@ -12724,10 +6133,8 @@ static struct snd_soc_dai_driver msm_dai_q6_cdc_dma_dai[] = { .rate_min = 8000, .rate_max = 384000, }, - .ops = &msm_dai_q6_cdc_dma_ops, .id = AFE_PORT_ID_RX_CODEC_DMA_RX_2, - .probe = msm_dai_q6_dai_cdc_dma_probe, - .remove = msm_dai_q6_dai_cdc_dma_remove, + .name = "RX_CDC_DMA_RX_2", }, { .capture = { @@ -12749,11 +6156,10 @@ static struct snd_soc_dai_driver msm_dai_q6_cdc_dma_dai[] = { .rate_min = 8000, .rate_max = 384000, }, - .ops = &msm_dai_q6_cdc_dma_ops, .id = AFE_PORT_ID_TX_CODEC_DMA_TX_2, - .probe = msm_dai_q6_dai_cdc_dma_probe, - .remove = msm_dai_q6_dai_cdc_dma_remove, - }, { + .name = "TX_CDC_DMA_TX_2", + }, + { .playback = { .stream_name = "RX CDC DMA3 Playback", .aif_name = "RX_CDC_DMA_RX_3", @@ -12773,10 +6179,8 @@ static struct snd_soc_dai_driver msm_dai_q6_cdc_dma_dai[] = { .rate_min = 8000, .rate_max = 384000, }, - .ops = &msm_dai_q6_cdc_dma_ops, .id = AFE_PORT_ID_RX_CODEC_DMA_RX_3, - .probe = msm_dai_q6_dai_cdc_dma_probe, - .remove = msm_dai_q6_dai_cdc_dma_remove, + .name = "RX_CDC_DMA_RX_3", }, { .capture = { @@ -12798,10 +6202,8 @@ static struct snd_soc_dai_driver msm_dai_q6_cdc_dma_dai[] = { .rate_min = 8000, .rate_max = 384000, }, - .ops = &msm_dai_q6_cdc_dma_ops, .id = AFE_PORT_ID_TX_CODEC_DMA_TX_3, - .probe = msm_dai_q6_dai_cdc_dma_probe, - .remove = msm_dai_q6_dai_cdc_dma_remove, + .name = "TX_CDC_DMA_TX_3", }, { .playback = { @@ -12823,10 +6225,8 @@ static struct snd_soc_dai_driver msm_dai_q6_cdc_dma_dai[] = { .rate_min = 8000, .rate_max = 384000, }, - .ops = &msm_dai_q6_cdc_dma_ops, .id = AFE_PORT_ID_RX_CODEC_DMA_RX_4, - .probe = msm_dai_q6_dai_cdc_dma_probe, - .remove = msm_dai_q6_dai_cdc_dma_remove, + .name = "RX_CDC_DMA_RX_4", }, { .capture = { @@ -12848,10 +6248,8 @@ static struct snd_soc_dai_driver msm_dai_q6_cdc_dma_dai[] = { .rate_min = 8000, .rate_max = 384000, }, - .ops = &msm_dai_q6_cdc_dma_ops, .id = AFE_PORT_ID_TX_CODEC_DMA_TX_4, - .probe = msm_dai_q6_dai_cdc_dma_probe, - .remove = msm_dai_q6_dai_cdc_dma_remove, + .name = "TX_CDC_DMA_TX_4", }, { .playback = { @@ -12873,10 +6271,8 @@ static struct snd_soc_dai_driver msm_dai_q6_cdc_dma_dai[] = { .rate_min = 8000, .rate_max = 384000, }, - .ops = &msm_dai_q6_cdc_dma_ops, .id = AFE_PORT_ID_RX_CODEC_DMA_RX_5, - .probe = msm_dai_q6_dai_cdc_dma_probe, - .remove = msm_dai_q6_dai_cdc_dma_remove, + .name = "RX_CDC_DMA_RX_5", }, { .capture = { @@ -12898,10 +6294,8 @@ static struct snd_soc_dai_driver msm_dai_q6_cdc_dma_dai[] = { .rate_min = 8000, .rate_max = 384000, }, - .ops = &msm_dai_q6_cdc_dma_ops, .id = AFE_PORT_ID_TX_CODEC_DMA_TX_5, - .probe = msm_dai_q6_dai_cdc_dma_probe, - .remove = msm_dai_q6_dai_cdc_dma_remove, + .name = "TX_CDC_DMA_TX_5", }, { .playback = { @@ -12923,10 +6317,8 @@ static struct snd_soc_dai_driver msm_dai_q6_cdc_dma_dai[] = { .rate_min = 8000, .rate_max = 384000, }, - .ops = &msm_dai_q6_cdc_dma_ops, .id = AFE_PORT_ID_RX_CODEC_DMA_RX_6, - .probe = msm_dai_q6_dai_cdc_dma_probe, - .remove = msm_dai_q6_dai_cdc_dma_remove, + .name = "RX_CDC_DMA_RX_6", }, { .playback = { @@ -12948,10 +6340,8 @@ static struct snd_soc_dai_driver msm_dai_q6_cdc_dma_dai[] = { .rate_min = 8000, .rate_max = 384000, }, - .ops = &msm_dai_q6_cdc_dma_ops, .id = AFE_PORT_ID_RX_CODEC_DMA_RX_7, - .probe = msm_dai_q6_dai_cdc_dma_probe, - .remove = msm_dai_q6_dai_cdc_dma_remove, + .name = "RX_CDC_DMA_RX_7", }, }; @@ -13101,26 +6491,20 @@ int __init msm_dai_q6_init(void) pr_err("%s: fail to register dai MI2S dev drv\n", __func__); goto dai_q6_mi2s_drv_fail; } - +#if 0 rc = platform_driver_register(&msm_dai_q6_meta_mi2s_driver); if (rc) { pr_err("%s: fail to register dai META MI2S dev drv\n", __func__); goto dai_q6_meta_mi2s_drv_fail; } - +#endif rc = platform_driver_register(&msm_dai_mi2s_q6); if (rc) { pr_err("%s: fail to register dai MI2S\n", __func__); goto dai_mi2s_q6_fail; } - rc = platform_driver_register(&msm_dai_q6_spdif_driver); - if (rc) { - pr_err("%s: fail to register dai SPDIF\n", __func__); - goto dai_spdif_q6_fail; - } - rc = platform_driver_register(&msm_dai_q6_tdm_driver); if (rc) { pr_err("%s: fail to register dai TDM dev drv\n", __func__); @@ -13139,7 +6523,6 @@ int __init msm_dai_q6_init(void) goto dai_cdc_dma_q6_dev_fail; } - rc = platform_driver_register(&msm_dai_cdc_dma_q6); if (rc) { pr_err("%s: fail to register dai CDC DMA\n", __func__); @@ -13147,6 +6530,26 @@ int __init msm_dai_q6_init(void) } return rc; +#if 0 + rc = platform_driver_register(&msm_dai_q6_spdif_driver); + if (rc) { + pr_err("%s: fail to register dai SPDIF\n", __func__); + goto dai_spdif_q6_fail; + } + + + +dai_cdc_dma_q6_fail: + platform_driver_unregister(&msm_dai_q6_cdc_dma_driver); +dai_cdc_dma_q6_dev_fail: + platform_driver_unregister(&msm_dai_tdm_q6); +dai_q6_tdm_drv_fail: + platform_driver_unregister(&msm_dai_q6_spdif_driver); +dai_spdif_q6_fail: + platform_driver_unregister(&msm_auxpcm_dev_driver); +fail: +#endif + dai_cdc_dma_q6_fail: platform_driver_unregister(&msm_dai_q6_cdc_dma_driver); dai_cdc_dma_q6_dev_fail: @@ -13154,21 +6557,17 @@ dai_cdc_dma_q6_dev_fail: dai_tdm_q6_fail: platform_driver_unregister(&msm_dai_q6_tdm_driver); dai_q6_tdm_drv_fail: - platform_driver_unregister(&msm_dai_q6_spdif_driver); -dai_spdif_q6_fail: platform_driver_unregister(&msm_dai_mi2s_q6); dai_mi2s_q6_fail: - platform_driver_unregister(&msm_dai_q6_meta_mi2s_driver); -dai_q6_meta_mi2s_drv_fail: platform_driver_unregister(&msm_dai_q6_mi2s_driver); dai_q6_mi2s_drv_fail: - platform_driver_unregister(&msm_dai_q6_dev); + platform_driver_unregister(&msm_dai_q6_dev); dai_q6_dev_fail: - platform_driver_unregister(&msm_dai_q6); + platform_driver_unregister(&msm_dai_q6); dai_q6_fail: - platform_driver_unregister(&msm_auxpcm_dev_driver); + platform_driver_unregister(&msm_auxpcm_dev_driver); fail: - return rc; + return 0; } void msm_dai_q6_exit(void) @@ -13177,12 +6576,10 @@ void msm_dai_q6_exit(void) platform_driver_unregister(&msm_dai_q6_cdc_dma_driver); platform_driver_unregister(&msm_dai_tdm_q6); platform_driver_unregister(&msm_dai_q6_tdm_driver); - platform_driver_unregister(&msm_dai_q6_spdif_driver); platform_driver_unregister(&msm_dai_mi2s_q6); - platform_driver_unregister(&msm_dai_q6_meta_mi2s_driver); +// platform_driver_unregister(&msm_dai_q6_meta_mi2s_driver); platform_driver_unregister(&msm_dai_q6_mi2s_driver); platform_driver_unregister(&msm_dai_q6_dev); - platform_driver_unregister(&msm_dai_q6); platform_driver_unregister(&msm_auxpcm_dev_driver); } diff --git a/asoc/msm-dai-q6-v2.h b/asoc/msm-dai-q6-v2.h index 3ad049d961..39af9736a4 100644 --- a/asoc/msm-dai-q6-v2.h +++ b/asoc/msm-dai-q6-v2.h @@ -43,6 +43,8 @@ #define MSM_META_MI2S_MIN MSM_PRIM_META_MI2S #define MSM_META_MI2S_MAX MSM_SEC_META_MI2S +#define MAX_NUM_I2S_META_PORT_MEMBER_PORTS 4 + struct msm_dai_auxpcm_config { u16 mode; u16 sync; @@ -57,6 +59,8 @@ struct msm_dai_auxpcm_config { struct msm_dai_auxpcm_pdata { struct msm_dai_auxpcm_config mode_8k; struct msm_dai_auxpcm_config mode_16k; + struct msm_dai_auxpcm_config mode_32k; + struct msm_dai_auxpcm_config mode_48k; }; struct msm_mi2s_pdata { diff --git a/asoc/platform_init.c b/asoc/platform_init.c index e9ff68fc30..2283cdd92f 100644 --- a/asoc/platform_init.c +++ b/asoc/platform_init.c @@ -1,6 +1,6 @@ // SPDX-License-Identifier: GPL-2.0-only /* - * Copyright (c) 2017 The Linux Foundation. All rights reserved. + * Copyright (c) 2017, 2020 The Linux Foundation. All rights reserved. */ #include @@ -9,48 +9,18 @@ static int __init audio_platform_init(void) { - msm_compress_dsp_init(); - msm_fe_dai_init(); msm_dai_q6_hdmi_init(); msm_dai_q6_init(); msm_dai_slim_init(); - msm_dai_stub_init(); - msm_lsm_client_init(); - msm_pcm_afe_init(); - msm_pcm_dtmf_init(); - msm_pcm_hostless_init(); - msm_voice_host_init(); - msm_pcm_loopback_init(); - msm_pcm_noirq_init(); - msm_pcm_dsp_init(); - msm_soc_routing_platform_init(); - msm_pcm_voice_init(); - msm_pcm_voip_init(); - msm_transcode_loopback_init(); return 0; } static void audio_platform_exit(void) { - msm_transcode_loopback_exit(); - msm_pcm_voip_exit(); - msm_pcm_voice_exit(); - msm_soc_routing_platform_exit(); - msm_pcm_dsp_exit(); - msm_pcm_noirq_exit(); - msm_pcm_loopback_exit(); - msm_voice_host_exit(); - msm_pcm_hostless_exit(); - msm_pcm_dtmf_exit(); - msm_pcm_afe_exit(); - msm_lsm_client_exit(); - msm_dai_stub_exit(); msm_dai_slim_exit(); msm_dai_q6_exit(); msm_dai_q6_hdmi_exit(); - msm_fe_dai_exit(); - msm_compress_dsp_exit(); } module_init(audio_platform_init); diff --git a/asoc/platform_init.h b/asoc/platform_init.h index caa54042cf..b67b644704 100644 --- a/asoc/platform_init.h +++ b/asoc/platform_init.h @@ -1,47 +1,15 @@ /* SPDX-License-Identifier: GPL-2.0-only */ /* - * Copyright (c) 2017-2018, The Linux Foundation. All rights reserved. + * Copyright (c) 2017-2018, 2020 The Linux Foundation. All rights reserved. */ #ifndef __PLATFORM_INIT_H__ #define __PLATFORM_INIT_H__ -int msm_compress_dsp_init(void); -int msm_fe_dai_init(void); int msm_dai_q6_hdmi_init(void); int msm_dai_q6_init(void); -int msm_dai_stub_init(void); -int msm_lsm_client_init(void); -int msm_pcm_afe_init(void); -int msm_pcm_dtmf_init(void); -int msm_pcm_hostless_init(void); -int msm_voice_host_init(void); -int msm_pcm_loopback_init(void); -int msm_pcm_noirq_init(void); -int msm_pcm_dsp_init(void); -int msm_soc_routing_platform_init(void); -int msm_pcm_voice_init(void); -int msm_pcm_voip_init(void); -int msm_transcode_loopback_init(void); -int msm_cpe_lsm_init(void); -void msm_cpe_lsm_exit(void); -void msm_transcode_loopback_exit(void); -void msm_pcm_voip_exit(void); -void msm_pcm_voice_exit(void); -void msm_soc_routing_platform_exit(void); -void msm_pcm_dsp_exit(void); -void msm_pcm_noirq_exit(void); -void msm_pcm_loopback_exit(void); -void msm_voice_host_exit(void); -void msm_pcm_hostless_exit(void); -void msm_pcm_dtmf_exit(void); -void msm_pcm_afe_exit(void); -void msm_lsm_client_exit(void); -void msm_dai_stub_exit(void); void msm_dai_q6_exit(void); void msm_dai_q6_hdmi_exit(void); -void msm_fe_dai_exit(void); -void msm_compress_dsp_exit(void); #if IS_ENABLED(CONFIG_WCD9XXX_CODEC_CORE) int msm_dai_slim_init(void);