mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-24 21:54:34 -04:00
Merge 3fc201fdf1 on remote branch
Change-Id: I0fcf8e623d7cf4abf10a0956d317e3d384391563
This commit is contained in:
commit
96b18afdd7
29 changed files with 34117 additions and 142 deletions
|
|
@ -26,6 +26,7 @@ obj-m += asoc/
|
|||
obj-m += asoc/codecs/
|
||||
ifeq ($(TARGET_SUPPORT), $(filter $(TARGET_SUPPORT), sdmsteppe))
|
||||
obj-m += asoc/codecs/wcd934x/
|
||||
KBUILD_CFLAGS += -Wno-error
|
||||
endif
|
||||
ifeq ($(TARGET_SUPPORT), $(filter $(TARGET_SUPPORT), qcs40x))
|
||||
obj-m += asoc/codecs/bolero/
|
||||
|
|
|
|||
16
asoc/Kbuild
16
asoc/Kbuild
|
|
@ -210,11 +210,19 @@ ifdef CONFIG_SND_SOC_QDSP6V2
|
|||
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
|
||||
ifeq (y,$(findstring y,$(CONFIG_QTI_QUIN_GVM) $(CONFIG_PLATFORM_AUTO)))
|
||||
PLATFORM_OBJS += msm-pcm-routing-auto.o
|
||||
else
|
||||
PLATFORM_OBJS += msm-pcm-routing-v2.o
|
||||
PLATFORM_OBJS += msm-pcm-voice-v2.o
|
||||
PLATFORM_OBJS += msm-pcm-voip-v2.o
|
||||
endif
|
||||
PLATFORM_OBJS += msm-transcode-loopback-q6-v2.o
|
||||
PLATFORM_OBJS += platform_init.o
|
||||
ifeq (y,$(findstring y,$(CONFIG_QTI_QUIN_GVM) $(CONFIG_PLATFORM_AUTO)))
|
||||
PLATFORM_OBJS += platform_init_auto.o
|
||||
else
|
||||
PLATFORM_OBJS += platform_init.o
|
||||
endif
|
||||
endif
|
||||
ifdef CONFIG_WCD9XXX_CODEC_CORE
|
||||
PLATFORM_OBJS += msm-dai-slim.o
|
||||
|
|
|
|||
11
asoc/bengal.c
Normal file → Executable file
11
asoc/bengal.c
Normal file → Executable file
|
|
@ -4983,6 +4983,17 @@ static struct snd_soc_dai_link msm_common_misc_fe_dai_links[] = {
|
|||
.ops = &msm_cdc_dma_be_ops,
|
||||
SND_SOC_DAILINK_REG(tx_cdcdma5_tx),
|
||||
},
|
||||
{/* hw:x,39 */
|
||||
.name = "TX4_CDC_DMA Hostless",
|
||||
.stream_name = "TX4_CDC_DMA Hostless",
|
||||
.dynamic = 1,
|
||||
.dpcm_capture = 1,
|
||||
.trigger = {SND_SOC_DPCM_TRIGGER_POST,
|
||||
SND_SOC_DPCM_TRIGGER_POST},
|
||||
.no_host_mode = SND_SOC_DAI_LINK_NO_HOST,
|
||||
.ignore_suspend = 1,
|
||||
SND_SOC_DAILINK_REG(tx4_cdcdma_hostless),
|
||||
},
|
||||
};
|
||||
|
||||
static struct snd_soc_dai_link msm_common_be_dai_links[] = {
|
||||
|
|
|
|||
|
|
@ -1,13 +1,14 @@
|
|||
// SPDX-License-Identifier: GPL-2.0-only
|
||||
/*
|
||||
* Copyright (c) 2015-2018, 2020, The Linux Foundation. All rights reserved.
|
||||
* Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved.
|
||||
*/
|
||||
|
||||
#include <linux/regmap.h>
|
||||
#include <linux/device.h>
|
||||
#include <asoc/core.h>
|
||||
#include <asoc/wcd9xxx-regmap.h>
|
||||
#include <wcd9335_registers.h>
|
||||
#include "wcd9335_registers.h"
|
||||
|
||||
static const struct reg_sequence wcd9335_1_x_defaults[] = {
|
||||
{ WCD9335_CODEC_RPM_CLK_GATE, 0x03, 0x00 },
|
||||
|
|
|
|||
|
|
@ -209,7 +209,7 @@ static int wcd937x_init_reg(struct snd_soc_component *component)
|
|||
snd_soc_component_update_bits(component,
|
||||
WCD937X_BIAS_VBG_FINE_ADJ, 0xF0, 0xB0);
|
||||
snd_soc_component_update_bits(component,
|
||||
WCD937X_RX_BIAS_HPH_LOWPOWER, 0xF0, 0x90);
|
||||
WCD937X_HPH_NEW_INT_RDAC_GAIN_CTL , 0xF0, 0x50);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
|
@ -503,6 +503,12 @@ static int wcd937x_codec_hphl_dac_event(struct snd_soc_dapm_widget *w,
|
|||
set_bit(HPH_COMP_DELAY, &wcd937x->status_mask);
|
||||
break;
|
||||
case SND_SOC_DAPM_POST_PMU:
|
||||
if ((snd_soc_component_read32(component,
|
||||
WCD937X_DIGITAL_EFUSE_REG_16) == 0x02) &&
|
||||
((snd_soc_component_read32(component,
|
||||
WCD937X_ANA_HPH) & 0x0C) == 0x0C))
|
||||
snd_soc_component_update_bits(component,
|
||||
WCD937X_RX_BIAS_HPH_LOWPOWER, 0xF0, 0x90);
|
||||
if (hph_mode == CLS_AB_HIFI || hph_mode == CLS_H_HIFI)
|
||||
snd_soc_component_update_bits(component,
|
||||
WCD937X_HPH_NEW_INT_RDAC_HD2_CTL_L,
|
||||
|
|
@ -544,6 +550,12 @@ static int wcd937x_codec_hphl_dac_event(struct snd_soc_dapm_widget *w,
|
|||
WCD937X_HPH_NEW_INT_HPH_TIMER1, 0x02, 0x00);
|
||||
break;
|
||||
case SND_SOC_DAPM_POST_PMD:
|
||||
if ((snd_soc_component_read32(component,
|
||||
WCD937X_DIGITAL_EFUSE_REG_16) == 0x02) &&
|
||||
((snd_soc_component_read32(component,
|
||||
WCD937X_ANA_HPH) & 0x0C) == 0x0C))
|
||||
snd_soc_component_update_bits(component,
|
||||
WCD937X_RX_BIAS_HPH_LOWPOWER, 0xF0, 0x80);
|
||||
snd_soc_component_update_bits(component,
|
||||
WCD937X_HPH_NEW_INT_RDAC_HD2_CTL_L,
|
||||
0x0F, 0x01);
|
||||
|
|
@ -577,6 +589,12 @@ static int wcd937x_codec_hphr_dac_event(struct snd_soc_dapm_widget *w,
|
|||
set_bit(HPH_COMP_DELAY, &wcd937x->status_mask);
|
||||
break;
|
||||
case SND_SOC_DAPM_POST_PMU:
|
||||
if ((snd_soc_component_read32(component,
|
||||
WCD937X_DIGITAL_EFUSE_REG_16) == 0x02) &&
|
||||
((snd_soc_component_read32(component,
|
||||
WCD937X_ANA_HPH) & 0x0C) == 0x0C))
|
||||
snd_soc_component_update_bits(component,
|
||||
WCD937X_RX_BIAS_HPH_LOWPOWER, 0xF0, 0x90);
|
||||
if (hph_mode == CLS_AB_HIFI || hph_mode == CLS_H_HIFI)
|
||||
snd_soc_component_update_bits(component,
|
||||
WCD937X_HPH_NEW_INT_RDAC_HD2_CTL_R,
|
||||
|
|
@ -618,6 +636,12 @@ static int wcd937x_codec_hphr_dac_event(struct snd_soc_dapm_widget *w,
|
|||
WCD937X_HPH_NEW_INT_HPH_TIMER1, 0x02, 0x00);
|
||||
break;
|
||||
case SND_SOC_DAPM_POST_PMD:
|
||||
if ((snd_soc_component_read32(component,
|
||||
WCD937X_DIGITAL_EFUSE_REG_16) == 0x02) &&
|
||||
((snd_soc_component_read32(component,
|
||||
WCD937X_ANA_HPH) & 0x0C) == 0x0C))
|
||||
snd_soc_component_update_bits(component,
|
||||
WCD937X_RX_BIAS_HPH_LOWPOWER, 0xF0, 0x80);
|
||||
snd_soc_component_update_bits(component,
|
||||
WCD937X_HPH_NEW_INT_RDAC_HD2_CTL_R,
|
||||
0x0F, 0x01);
|
||||
|
|
|
|||
47
asoc/codecs/wsa881x-analog.c
Normal file → Executable file
47
asoc/codecs/wsa881x-analog.c
Normal file → Executable file
|
|
@ -1,6 +1,7 @@
|
|||
// SPDX-License-Identifier: GPL-2.0-only
|
||||
/*
|
||||
* Copyright (c) 2015-2016, 2018-2021, The Linux Foundation. All rights reserved.
|
||||
* Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved.
|
||||
*/
|
||||
|
||||
#include <linux/clk.h>
|
||||
|
|
@ -273,7 +274,8 @@ static int wsa881x_i2c_read_device(struct wsa881x_pdata *wsa881x,
|
|||
}
|
||||
pr_debug("read success reg = %x val = %x\n",
|
||||
reg, val);
|
||||
} else {
|
||||
} else if (wsa881x->client[wsa881x_index]) {
|
||||
|
||||
reg_addr = (u8)reg;
|
||||
msg = &wsa881x->xfer_msg[0];
|
||||
msg->addr = wsa881x->client[wsa881x_index]->addr;
|
||||
|
|
@ -301,6 +303,9 @@ static int wsa881x_i2c_read_device(struct wsa881x_pdata *wsa881x,
|
|||
}
|
||||
}
|
||||
val = dest[0];
|
||||
} else {
|
||||
pr_err("failed for i2c client is not initilized\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
return val;
|
||||
}
|
||||
|
|
@ -805,7 +810,40 @@ static int wsa881x_set_visense(struct snd_kcontrol *kcontrol,
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int wsa881x_get_t0_init(struct snd_kcontrol *kcontrol,
|
||||
struct snd_ctl_elem_value *ucontrol)
|
||||
{
|
||||
struct snd_soc_component *component =
|
||||
snd_soc_kcontrol_component(kcontrol);
|
||||
struct wsa881x_pdata *wsa881x =
|
||||
snd_soc_component_get_drvdata(component);
|
||||
struct wsa881x_tz_priv *pdata = &wsa881x->tz_pdata;
|
||||
|
||||
ucontrol->value.integer.value[0] = pdata->t0_init;
|
||||
dev_dbg(component->dev, "%s: t0 init %d\n", __func__, pdata->t0_init);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int wsa881x_set_t0_init(struct snd_kcontrol *kcontrol,
|
||||
struct snd_ctl_elem_value *ucontrol)
|
||||
{
|
||||
struct snd_soc_component *component =
|
||||
snd_soc_kcontrol_component(kcontrol);
|
||||
struct wsa881x_pdata *wsa881x =
|
||||
snd_soc_component_get_drvdata(component);
|
||||
struct wsa881x_tz_priv *pdata = &wsa881x->tz_pdata;
|
||||
|
||||
pdata->t0_init = ucontrol->value.integer.value[0];
|
||||
dev_dbg(component->dev, "%s: t0 init %d\n", __func__, pdata->t0_init);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static const struct snd_kcontrol_new wsa881x_snd_controls[] = {
|
||||
SOC_SINGLE_EXT("WSA T0 Init", SND_SOC_NOPM, 0, 1, 0,
|
||||
wsa881x_get_t0_init, wsa881x_set_t0_init),
|
||||
|
||||
SOC_SINGLE_EXT("BOOST Switch", SND_SOC_NOPM, 0, 1, 0,
|
||||
wsa881x_get_boost, wsa881x_set_boost),
|
||||
|
||||
|
|
@ -1168,15 +1206,16 @@ static int wsa881x_probe(struct snd_soc_component *component)
|
|||
wsa881x_temp_reg_read;
|
||||
snd_soc_component_set_drvdata(component, &wsa_pdata[wsa881x_index]);
|
||||
while (retry) {
|
||||
if (wsa_pdata[wsa881x_index].regmap[WSA881X_ANALOG_SLAVE]
|
||||
!= NULL)
|
||||
if (wsa_pdata[wsa881x_index].regmap_flag)
|
||||
break;
|
||||
msleep(100);
|
||||
retry--;
|
||||
}
|
||||
if (!retry)
|
||||
if (!retry) {
|
||||
dev_err(&client->dev, "%s: max retry expired and regmap of\n"
|
||||
"analog slave not initilized\n", __func__);
|
||||
return -EPROBE_DEFER;
|
||||
}
|
||||
wsa881x_init_thermal(&wsa_pdata[wsa881x_index].tz_pdata);
|
||||
INIT_DELAYED_WORK(&wsa_pdata[wsa881x_index].ocp_ctl_work,
|
||||
wsa881x_ocp_ctl_work);
|
||||
|
|
|
|||
24
asoc/msm-dai-fe.c
Normal file → Executable file
24
asoc/msm-dai-fe.c
Normal file → Executable file
|
|
@ -1,5 +1,6 @@
|
|||
// SPDX-License-Identifier: GPL-2.0-only
|
||||
/* Copyright (c) 2012-2021, The Linux Foundation. All rights reserved.
|
||||
* Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved.
|
||||
*/
|
||||
|
||||
|
||||
|
|
@ -592,6 +593,29 @@ static struct snd_soc_dai_driver msm_fe_dais[] = {
|
|||
.name = "TX3_CDC_DMA_HOSTLESS",
|
||||
.probe = fe_dai_probe,
|
||||
},
|
||||
{
|
||||
.capture = {
|
||||
.stream_name = "TX4_CDC_DMA_HOSTLESS Capture",
|
||||
.aif_name = "TX4_CDC_DMA_UL_HL",
|
||||
.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,
|
||||
.channels_min = 1,
|
||||
.channels_max = 8,
|
||||
.rate_min = 8000,
|
||||
.rate_max = 384000,
|
||||
},
|
||||
.ops = &msm_fe_dai_ops,
|
||||
.name = "TX4_CDC_DMA_HOSTLESS",
|
||||
.probe = fe_dai_probe,
|
||||
},
|
||||
{
|
||||
.playback = {
|
||||
.stream_name = "INT_FM_HOSTLESS Playback",
|
||||
|
|
|
|||
|
|
@ -481,6 +481,8 @@ static bool afe_port_logging_item[IDX_TDM_MAX];
|
|||
|
||||
static int afe_port_loggging_control_added;
|
||||
|
||||
static int afe_port_limiter_control_added;
|
||||
|
||||
static int afe_dyn_mclk_control_added;
|
||||
|
||||
static DEFINE_MUTEX(tdm_mutex);
|
||||
|
|
@ -10572,6 +10574,78 @@ int jitter_cleaner_afe_enable_mclk_and_get_info_cb_func(void *private_data,
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int msm_pcm_afe_limiter_param_ctl_info(struct snd_kcontrol *kcontrol,
|
||||
struct snd_ctl_elem_info* ucontrol)
|
||||
{
|
||||
ucontrol->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
|
||||
/* two int values: port_id and enable/disable */
|
||||
ucontrol->count = 2;
|
||||
/* Valid range is all positive values to support above controls */
|
||||
ucontrol->value.integer.min = 0;
|
||||
ucontrol->value.integer.max = INT_MAX;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int msm_pcm_afe_limiter_param_ctl_get(struct snd_kcontrol *kcontrol,
|
||||
struct snd_ctl_elem_value *ucontrol)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int msm_pcm_afe_limiter_param_ctl_put(struct snd_kcontrol *kcontrol,
|
||||
struct snd_ctl_elem_value *ucontrol)
|
||||
{
|
||||
u16 port_id;
|
||||
struct afe_param_id_port_afe_limiter_disable_t afe_limiter_disable;
|
||||
struct param_hdr_v3 param_hdr;
|
||||
int ret = -EINVAL;
|
||||
|
||||
pr_debug("%s: enter\n", __func__);
|
||||
memset(¶m_hdr, 0, sizeof(param_hdr));
|
||||
|
||||
port_id = ucontrol->value.integer.value[0];
|
||||
afe_limiter_disable.disable_afe_limiter = ucontrol->value.integer.value[1];
|
||||
|
||||
ret = afe_port_send_afe_limiter_param(port_id, &afe_limiter_disable);
|
||||
if (ret)
|
||||
pr_err("%s: AFE port logging setting for port 0x%x failed %d\n",
|
||||
__func__, port_id, ret);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int msm_pcm_add_afe_port_limiter_control(struct snd_soc_dai *dai)
|
||||
{
|
||||
const char* afe_port_limiter_ctl_name = "AFE_port_limiter_disable";
|
||||
int rc = 0;
|
||||
struct snd_kcontrol_new *knew = NULL;
|
||||
struct snd_kcontrol* kctl = NULL;
|
||||
|
||||
/* Add AFE port logging controls */
|
||||
knew = kzalloc(sizeof(struct snd_kcontrol_new), GFP_KERNEL);
|
||||
if (!knew) {
|
||||
return -ENOMEM;
|
||||
}
|
||||
knew->iface = SNDRV_CTL_ELEM_IFACE_MIXER;
|
||||
knew->info = msm_pcm_afe_limiter_param_ctl_info;
|
||||
knew->get = msm_pcm_afe_limiter_param_ctl_get;
|
||||
knew->put = msm_pcm_afe_limiter_param_ctl_put;
|
||||
knew->name = afe_port_limiter_ctl_name;
|
||||
knew->private_value = dai->id;
|
||||
kctl = snd_ctl_new1(knew, knew);
|
||||
if (!kctl) {
|
||||
kfree(knew);
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
rc = snd_ctl_add(dai->component->card->snd_card, kctl);
|
||||
if (rc < 0)
|
||||
pr_err("%s: err add AFE port limiter disable control, DAI = %s\n",
|
||||
__func__, dai->name);
|
||||
|
||||
return rc;
|
||||
}
|
||||
|
||||
static int msm_dai_q6_dai_tdm_probe(struct snd_soc_dai *dai)
|
||||
{
|
||||
int rc = 0;
|
||||
|
|
@ -10680,6 +10754,17 @@ static int msm_dai_q6_dai_tdm_probe(struct snd_soc_dai *dai)
|
|||
}
|
||||
}
|
||||
|
||||
if (!afe_port_limiter_control_added) {
|
||||
rc = msm_pcm_add_afe_port_limiter_control(dai);
|
||||
if (rc < 0) {
|
||||
dev_err(dai->dev, "%s: add AFE port logging control failed DAI: %s\n",
|
||||
__func__, dai->name);
|
||||
goto rtn;
|
||||
}
|
||||
|
||||
afe_port_limiter_control_added = 1;
|
||||
}
|
||||
|
||||
if (tdm_dai_data->is_island_dai)
|
||||
rc = msm_dai_q6_add_island_mx_ctls(
|
||||
dai->component->card->snd_card,
|
||||
|
|
@ -11263,7 +11348,7 @@ static int msm_dai_q6_tdm_set_channel_map(struct snd_soc_dai *dai,
|
|||
}
|
||||
|
||||
static unsigned int tdm_param_set_slot_mask(u16 *slot_offset, int slot_width,
|
||||
int slots_per_frame)
|
||||
int slots_per_frame, int num_channels)
|
||||
{
|
||||
unsigned int i = 0;
|
||||
unsigned int slot_index = 0;
|
||||
|
|
@ -11280,6 +11365,11 @@ static unsigned int tdm_param_set_slot_mask(u16 *slot_offset, int slot_width,
|
|||
return slot_mask;
|
||||
}
|
||||
|
||||
if (num_channels != slots_per_frame) {
|
||||
pr_debug("%s: multi lane is enabled, use the slot mask of tdm group\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;
|
||||
|
|
@ -11407,11 +11497,13 @@ static int msm_dai_q6_tdm_hw_params(struct snd_pcm_substream *substream,
|
|||
tdm->slot_mask = tdm_param_set_slot_mask(
|
||||
slot_mapping_v2->offset,
|
||||
tdm_group->slot_width,
|
||||
tdm_group->nslots_per_frame);
|
||||
tdm_group->nslots_per_frame,
|
||||
tdm_group->num_channels);
|
||||
else
|
||||
tdm->slot_mask = tdm_param_set_slot_mask(slot_mapping->offset,
|
||||
tdm_group->slot_width,
|
||||
tdm_group->nslots_per_frame);
|
||||
tdm_group->nslots_per_frame,
|
||||
tdm_group->num_channels);
|
||||
|
||||
pr_debug("%s: TDM:\n"
|
||||
"num_channels=%d sample_rate=%d bit_width=%d\n"
|
||||
|
|
|
|||
33356
asoc/msm-pcm-routing-auto.c
Executable file
33356
asoc/msm-pcm-routing-auto.c
Executable file
File diff suppressed because it is too large
Load diff
275
asoc/msm-pcm-routing-v2.c
Normal file → Executable file
275
asoc/msm-pcm-routing-v2.c
Normal file → Executable file
|
|
@ -105,8 +105,7 @@ static struct msm_ec_ref_port_cfg ec_ref_port_cfg;
|
|||
static struct msm_pcm_channel_mixer channel_mixer[MSM_FRONTEND_DAI_MM_SIZE];
|
||||
|
||||
/* all the FES which can support channel mixer for bidirection */
|
||||
static struct msm_pcm_channel_mixer
|
||||
channel_mixer_v2[MSM_FRONTEND_DAI_MM_SIZE][2];
|
||||
static struct msm_pcm_channel_mixer_v2 channel_mixer_v2[MT_MX_MAX_PORTS];
|
||||
|
||||
/* input BE for each FE */
|
||||
static int channel_input[MSM_FRONTEND_DAI_MM_SIZE][ADM_MAX_CHANNELS];
|
||||
|
|
@ -1383,6 +1382,38 @@ static int get_copp_perf_mode(int fe_id, int sess_type, int port)
|
|||
return rc;
|
||||
}
|
||||
|
||||
static int get_available_chmixer_index(int fe_id, int sess_type, int be_id)
|
||||
{
|
||||
int index = 0;
|
||||
bool need_research = true;
|
||||
|
||||
/*
|
||||
* If there is a item that have the same fe_id sess_type and be_id
|
||||
* with input, use the index of this item and update it.
|
||||
*/
|
||||
for (index = 0; index < MT_MX_MAX_PORTS; index++) {
|
||||
if ((channel_mixer_v2[index].fedai_id == fe_id) &&
|
||||
(channel_mixer_v2[index].session_type == sess_type) &&
|
||||
(channel_mixer_v2[index].be_id == be_id)) {
|
||||
need_research = false;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* If the item with fe_id sess_type and be_id is not exist,
|
||||
* find an new unused item
|
||||
*/
|
||||
if (need_research) {
|
||||
for (index = 0; index < MT_MX_MAX_PORTS; index++) {
|
||||
if (!channel_mixer_v2[index].is_used)
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return index;
|
||||
}
|
||||
|
||||
/*
|
||||
* msm_pcm_routing_send_chmix_cfg:
|
||||
* send the channel mixer command to mix the input channels
|
||||
|
|
@ -1460,31 +1491,46 @@ int msm_pcm_routing_set_channel_mixer_cfg(
|
|||
int fe_id, int type,
|
||||
struct msm_pcm_channel_mixer *params)
|
||||
{
|
||||
int i, j = 0;
|
||||
int i, j, index = 0;
|
||||
int be_id = params->port_idx - 1;
|
||||
|
||||
channel_mixer_v2[fe_id][type].enable = params->enable;
|
||||
channel_mixer_v2[fe_id][type].rule = params->rule;
|
||||
channel_mixer_v2[fe_id][type].input_channel =
|
||||
index = get_available_chmixer_index(fe_id, type, be_id);
|
||||
if (index >= MT_MX_MAX_PORTS) {
|
||||
pr_err("%s: Set channel mixer configure Fail!\n", __func__);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
memset(&channel_mixer_v2[index], 0,
|
||||
sizeof(struct msm_pcm_channel_mixer_v2));
|
||||
channel_mixer_v2[index].is_used = true;
|
||||
channel_mixer_v2[index].fedai_id = fe_id;
|
||||
channel_mixer_v2[index].session_type = type;
|
||||
channel_mixer_v2[index].be_id = be_id;
|
||||
channel_mixer_v2[index].mixer_cfg.port_idx = params->port_idx;
|
||||
channel_mixer_v2[index].mixer_cfg.enable = params->enable;
|
||||
channel_mixer_v2[index].mixer_cfg.rule = params->rule;
|
||||
channel_mixer_v2[index].mixer_cfg.input_channel =
|
||||
params->input_channel;
|
||||
channel_mixer_v2[fe_id][type].output_channel =
|
||||
channel_mixer_v2[index].mixer_cfg.output_channel =
|
||||
params->output_channel;
|
||||
channel_mixer_v2[fe_id][type].port_idx = params->port_idx;
|
||||
channel_mixer_v2[index].mixer_cfg.input_channels[0] =
|
||||
params->input_channel;
|
||||
|
||||
for (i = 0; i < ADM_MAX_CHANNELS; i++)
|
||||
channel_mixer_v2[fe_id][type].in_ch_map[i] =
|
||||
channel_mixer_v2[index].mixer_cfg.in_ch_map[i] =
|
||||
params->in_ch_map[i];
|
||||
for (i = 0; i < ADM_MAX_CHANNELS; i++)
|
||||
channel_mixer_v2[fe_id][type].out_ch_map[i] =
|
||||
channel_mixer_v2[index].mixer_cfg.out_ch_map[i] =
|
||||
params->out_ch_map[i];
|
||||
|
||||
for (i = 0; i < ADM_MAX_CHANNELS; i++)
|
||||
for (j = 0; j < ADM_MAX_CHANNELS; j++)
|
||||
channel_mixer_v2[fe_id][type].channel_weight[i][j] =
|
||||
channel_mixer_v2[index].mixer_cfg.channel_weight[i][j] =
|
||||
params->channel_weight[i][j];
|
||||
|
||||
channel_mixer_v2[fe_id][type].override_in_ch_map =
|
||||
channel_mixer_v2[index].mixer_cfg.override_in_ch_map =
|
||||
params->override_in_ch_map;
|
||||
channel_mixer_v2[fe_id][type].override_out_ch_map =
|
||||
channel_mixer_v2[index].mixer_cfg.override_out_ch_map =
|
||||
params->override_out_ch_map;
|
||||
|
||||
return 0;
|
||||
|
|
@ -1675,10 +1721,13 @@ done:
|
|||
EXPORT_SYMBOL(msm_pcm_routing_get_stream_app_type_cfg);
|
||||
|
||||
static struct cal_block_data *msm_routing_find_topology_by_path(int path,
|
||||
int cal_index)
|
||||
int cal_index,
|
||||
int app_type,
|
||||
int acdb_id)
|
||||
{
|
||||
struct list_head *ptr, *next;
|
||||
struct cal_block_data *cal_block = NULL;
|
||||
struct audio_cal_info_adm_top *cal_info;
|
||||
pr_debug("%s\n", __func__);
|
||||
|
||||
list_for_each_safe(ptr, next,
|
||||
|
|
@ -1689,9 +1738,11 @@ static struct cal_block_data *msm_routing_find_topology_by_path(int path,
|
|||
|
||||
if (cal_utils_is_cal_stale(cal_block))
|
||||
continue;
|
||||
|
||||
if (((struct audio_cal_info_adm_top *)cal_block
|
||||
->cal_info)->path == path) {
|
||||
cal_info = (struct audio_cal_info_adm_top *)
|
||||
cal_block->cal_info;
|
||||
if ((cal_info->path == path) &&
|
||||
(cal_info->app_type == app_type) &&
|
||||
(cal_info->acdb_id == acdb_id)) {
|
||||
return cal_block;
|
||||
}
|
||||
}
|
||||
|
|
@ -1732,7 +1783,9 @@ static struct cal_block_data *msm_routing_find_topology(int path,
|
|||
"acdb_id %d %s\n", __func__, path, app_type, acdb_id,
|
||||
exact ? "fail" : "defaulting to search by path");
|
||||
return exact ? NULL : msm_routing_find_topology_by_path(path,
|
||||
cal_index);
|
||||
cal_index,
|
||||
app_type,
|
||||
acdb_id);
|
||||
}
|
||||
|
||||
static struct cal_block_data *msm_routing_find_topology_by_buf_number(int usecase, int path,
|
||||
|
|
@ -2209,9 +2262,10 @@ static u32 msm_pcm_routing_get_voc_sessionid(u16 val)
|
|||
static int msm_pcm_routing_channel_mixer_v2(int fe_id, bool perf_mode,
|
||||
int dspst_id, int stream_type)
|
||||
{
|
||||
struct msm_pcm_channel_mixer *mixer_config;
|
||||
int copp_idx = 0;
|
||||
int sess_type = 0;
|
||||
int j = 0, be_id = 0;
|
||||
int i = 0, j = 0, be_id = 0;
|
||||
int ret = 0;
|
||||
|
||||
if (fe_id >= MSM_FRONTEND_DAI_MM_SIZE) {
|
||||
|
|
@ -2224,44 +2278,45 @@ static int msm_pcm_routing_channel_mixer_v2(int fe_id, bool perf_mode,
|
|||
else
|
||||
sess_type = SESSION_TYPE_TX;
|
||||
|
||||
if (!(channel_mixer_v2[fe_id][sess_type].enable)) {
|
||||
pr_debug("%s: channel mixer not enabled for FE %d direction %d\n",
|
||||
__func__, fe_id, sess_type);
|
||||
return 0;
|
||||
}
|
||||
|
||||
be_id = channel_mixer_v2[fe_id][sess_type].port_idx - 1;
|
||||
if (be_id < 0 || be_id >= MSM_BACKEND_DAI_MAX) {
|
||||
pr_err("%s: Received out of bounds be_id %d\n",
|
||||
__func__, be_id);
|
||||
return -EINVAL;
|
||||
}
|
||||
channel_mixer_v2[fe_id][sess_type].input_channels[0] =
|
||||
channel_mixer_v2[fe_id][sess_type].input_channel;
|
||||
|
||||
pr_debug("%s sess type %d,fe_id %d,override in:%d out:%d,be active %d\n",
|
||||
__func__, sess_type, fe_id,
|
||||
channel_mixer_v2[fe_id][sess_type].override_in_ch_map,
|
||||
channel_mixer_v2[fe_id][sess_type].override_out_ch_map,
|
||||
msm_bedais[be_id].active);
|
||||
|
||||
if ((msm_bedais[be_id].active) &&
|
||||
test_bit(fe_id, &msm_bedais[be_id].fe_sessions[0])) {
|
||||
unsigned long copp =
|
||||
session_copp_map[fe_id][sess_type][be_id];
|
||||
for (j = 0; j < MAX_COPPS_PER_PORT; j++) {
|
||||
if (test_bit(j, &copp)) {
|
||||
copp_idx = j;
|
||||
break;
|
||||
for (i = 0; i < MT_MX_MAX_PORTS; i++) {
|
||||
if ((channel_mixer_v2[i].fedai_id == fe_id) &&
|
||||
(channel_mixer_v2[i].session_type == sess_type)) {
|
||||
if ((!channel_mixer_v2[i].mixer_cfg.enable) ||
|
||||
!(channel_mixer_v2[i].is_used)) {
|
||||
pr_debug("%s: channel mixer not enabled for FE %d direction %d\n",
|
||||
__func__, fe_id, sess_type);
|
||||
continue;
|
||||
}
|
||||
be_id = channel_mixer_v2[i].be_id;
|
||||
if (be_id < 0 || be_id >= MSM_BACKEND_DAI_MAX) {
|
||||
pr_err("%s: Received out of bounds be_id %d\n",
|
||||
__func__, be_id);
|
||||
return -EINVAL;
|
||||
}
|
||||
mixer_config = &channel_mixer_v2[i].mixer_cfg;
|
||||
pr_debug("%s sess type %d,fe_id %d,override in:%d out:%d,be active %d\n",
|
||||
__func__, sess_type, fe_id,
|
||||
mixer_config->override_in_ch_map,
|
||||
mixer_config->override_out_ch_map,
|
||||
msm_bedais[be_id].active);
|
||||
if ((msm_bedais[be_id].active) &&
|
||||
test_bit(fe_id, &msm_bedais[be_id].fe_sessions[0])) {
|
||||
unsigned long copp =
|
||||
session_copp_map[fe_id][sess_type][be_id];
|
||||
for (j = 0; j < MAX_COPPS_PER_PORT; j++) {
|
||||
if (test_bit(j, &copp)) {
|
||||
copp_idx = j;
|
||||
break;
|
||||
}
|
||||
}
|
||||
ret = adm_programable_channel_mixer(
|
||||
msm_bedais[be_id].port_id,
|
||||
copp_idx, dspst_id, sess_type,
|
||||
mixer_config, 0);
|
||||
channel_mixer_v2[i].is_used = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
ret = adm_programable_channel_mixer(
|
||||
msm_bedais[be_id].port_id,
|
||||
copp_idx, dspst_id, sess_type,
|
||||
&channel_mixer_v2[fe_id][sess_type], 0);
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
|
@ -14345,6 +14400,7 @@ static const struct snd_kcontrol_new sep_tdm_rx_7_mixer_controls[] = {
|
|||
msm_routing_put_audio_mixer),
|
||||
};
|
||||
|
||||
#ifndef CONFIG_HSIF_DISABLE
|
||||
static const struct snd_kcontrol_new hsif0_tdm_rx_0_mixer_controls[] = {
|
||||
SOC_DOUBLE_EXT("MultiMedia1", SND_SOC_NOPM,
|
||||
MSM_BACKEND_DAI_HSIF0_TDM_RX_0,
|
||||
|
|
@ -16144,6 +16200,7 @@ static const struct snd_kcontrol_new hsif2_tdm_rx_7_mixer_controls[] = {
|
|||
MSM_FRONTEND_DAI_MULTIMEDIA21, 1, 0, msm_routing_get_audio_mixer,
|
||||
msm_routing_put_audio_mixer),
|
||||
};
|
||||
#endif
|
||||
|
||||
static const struct snd_kcontrol_new quat_tdm_rx_2_voice_mixer_controls[] = {
|
||||
SOC_DOUBLE_EXT("VoiceMMode1", SND_SOC_NOPM,
|
||||
|
|
@ -20384,6 +20441,7 @@ static const struct snd_kcontrol_new sep_tdm_rx_7_port_mixer_controls[] = {
|
|||
msm_routing_put_port_mixer),
|
||||
};
|
||||
|
||||
#ifndef CONFIG_HSIF_DISABLE
|
||||
static const struct snd_kcontrol_new hsif0_tdm_rx_0_port_mixer_controls[] = {
|
||||
#ifndef CONFIG_MI2S_DISABLE
|
||||
SOC_DOUBLE_EXT("PRI_MI2S_TX", SND_SOC_NOPM,
|
||||
|
|
@ -23311,6 +23369,7 @@ static const struct snd_kcontrol_new hsif2_tdm_rx_7_port_mixer_controls[] = {
|
|||
msm_routing_get_port_mixer,
|
||||
msm_routing_put_port_mixer),
|
||||
};
|
||||
#endif
|
||||
|
||||
static const struct snd_kcontrol_new quin_tdm_rx_7_port_mixer_controls[] = {
|
||||
SOC_DOUBLE_EXT("TERT_TDM_TX_7", SND_SOC_NOPM,
|
||||
|
|
@ -23563,6 +23622,7 @@ static const struct snd_kcontrol_new mmul1_mixer_controls[] = {
|
|||
MSM_BACKEND_DAI_SEP_TDM_TX_7,
|
||||
MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer,
|
||||
msm_routing_put_audio_mixer),
|
||||
#ifndef CONFIG_HSIF_DISABLE
|
||||
SOC_DOUBLE_EXT("HSIF0_TDM_TX_0", SND_SOC_NOPM,
|
||||
MSM_BACKEND_DAI_HSIF0_TDM_TX_0,
|
||||
MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer,
|
||||
|
|
@ -23659,6 +23719,7 @@ static const struct snd_kcontrol_new mmul1_mixer_controls[] = {
|
|||
MSM_BACKEND_DAI_HSIF2_TDM_TX_7,
|
||||
MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer,
|
||||
msm_routing_put_audio_mixer),
|
||||
#endif
|
||||
#endif
|
||||
SOC_DOUBLE_EXT("SLIM_7_TX", SND_SOC_NOPM,
|
||||
MSM_BACKEND_DAI_SLIMBUS_7_TX,
|
||||
|
|
@ -23922,6 +23983,7 @@ static const struct snd_kcontrol_new mmul2_mixer_controls[] = {
|
|||
MSM_BACKEND_DAI_SEP_TDM_TX_7,
|
||||
MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer,
|
||||
msm_routing_put_audio_mixer),
|
||||
#ifndef CONFIG_HSIF_DISABLE
|
||||
SOC_DOUBLE_EXT("HSIF0_TDM_TX_0", SND_SOC_NOPM,
|
||||
MSM_BACKEND_DAI_HSIF0_TDM_TX_0,
|
||||
MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer,
|
||||
|
|
@ -24018,6 +24080,7 @@ static const struct snd_kcontrol_new mmul2_mixer_controls[] = {
|
|||
MSM_BACKEND_DAI_HSIF2_TDM_TX_7,
|
||||
MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer,
|
||||
msm_routing_put_audio_mixer),
|
||||
#endif
|
||||
#endif
|
||||
SOC_DOUBLE_EXT("SLIM_8_TX", SND_SOC_NOPM,
|
||||
MSM_BACKEND_DAI_SLIMBUS_8_TX,
|
||||
|
|
@ -24297,6 +24360,7 @@ static const struct snd_kcontrol_new mmul3_mixer_controls[] = {
|
|||
MSM_BACKEND_DAI_SEP_TDM_TX_7,
|
||||
MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer,
|
||||
msm_routing_put_audio_mixer),
|
||||
#ifndef CONFIG_HSIF_DISABLE
|
||||
SOC_DOUBLE_EXT("HSIF0_TDM_TX_0", SND_SOC_NOPM,
|
||||
MSM_BACKEND_DAI_HSIF0_TDM_TX_0,
|
||||
MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer,
|
||||
|
|
@ -24393,6 +24457,7 @@ static const struct snd_kcontrol_new mmul3_mixer_controls[] = {
|
|||
MSM_BACKEND_DAI_HSIF2_TDM_TX_7,
|
||||
MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer,
|
||||
msm_routing_put_audio_mixer),
|
||||
#endif
|
||||
#endif
|
||||
SOC_DOUBLE_EXT("WSA_CDC_DMA_TX_0", SND_SOC_NOPM,
|
||||
MSM_BACKEND_DAI_WSA_CDC_DMA_TX_0,
|
||||
|
|
@ -24614,6 +24679,7 @@ static const struct snd_kcontrol_new mmul4_mixer_controls[] = {
|
|||
MSM_BACKEND_DAI_SEP_TDM_TX_7,
|
||||
MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer,
|
||||
msm_routing_put_audio_mixer),
|
||||
#ifndef CONFIG_HSIF_DISABLE
|
||||
SOC_DOUBLE_EXT("HSIF0_TDM_TX_0", SND_SOC_NOPM,
|
||||
MSM_BACKEND_DAI_HSIF0_TDM_TX_0,
|
||||
MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer,
|
||||
|
|
@ -24711,6 +24777,7 @@ static const struct snd_kcontrol_new mmul4_mixer_controls[] = {
|
|||
MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer,
|
||||
msm_routing_put_audio_mixer),
|
||||
#endif
|
||||
#endif
|
||||
#ifndef CONFIG_MI2S_DISABLE
|
||||
SOC_DOUBLE_EXT("PRI_MI2S_TX", SND_SOC_NOPM,
|
||||
MSM_BACKEND_DAI_PRI_MI2S_TX,
|
||||
|
|
@ -25009,6 +25076,7 @@ static const struct snd_kcontrol_new mmul5_mixer_controls[] = {
|
|||
MSM_BACKEND_DAI_SEP_TDM_TX_7,
|
||||
MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer,
|
||||
msm_routing_put_audio_mixer),
|
||||
#ifndef CONFIG_HSIF_DISABLE
|
||||
SOC_DOUBLE_EXT("HSIF0_TDM_TX_0", SND_SOC_NOPM,
|
||||
MSM_BACKEND_DAI_HSIF0_TDM_TX_0,
|
||||
MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer,
|
||||
|
|
@ -25105,6 +25173,7 @@ static const struct snd_kcontrol_new mmul5_mixer_controls[] = {
|
|||
MSM_BACKEND_DAI_HSIF2_TDM_TX_7,
|
||||
MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer,
|
||||
msm_routing_put_audio_mixer),
|
||||
#endif
|
||||
#endif
|
||||
SOC_DOUBLE_EXT("SLIM_7_TX", SND_SOC_NOPM,
|
||||
MSM_BACKEND_DAI_SLIMBUS_7_TX,
|
||||
|
|
@ -25601,6 +25670,7 @@ static const struct snd_kcontrol_new mmul8_mixer_controls[] = {
|
|||
MSM_BACKEND_DAI_SEP_TDM_TX_7,
|
||||
MSM_FRONTEND_DAI_MULTIMEDIA8, 1, 0, msm_routing_get_audio_mixer,
|
||||
msm_routing_put_audio_mixer),
|
||||
#ifndef CONFIG_HSIF_DISABLE
|
||||
SOC_DOUBLE_EXT("HSIF0_TDM_TX_0", SND_SOC_NOPM,
|
||||
MSM_BACKEND_DAI_HSIF0_TDM_TX_0,
|
||||
MSM_FRONTEND_DAI_MULTIMEDIA8, 1, 0, msm_routing_get_audio_mixer,
|
||||
|
|
@ -25697,6 +25767,7 @@ static const struct snd_kcontrol_new mmul8_mixer_controls[] = {
|
|||
MSM_BACKEND_DAI_HSIF2_TDM_TX_7,
|
||||
MSM_FRONTEND_DAI_MULTIMEDIA8, 1, 0, msm_routing_get_audio_mixer,
|
||||
msm_routing_put_audio_mixer),
|
||||
#endif
|
||||
#endif
|
||||
SOC_DOUBLE_EXT("SLIM_7_TX", SND_SOC_NOPM,
|
||||
MSM_BACKEND_DAI_SLIMBUS_7_TX,
|
||||
|
|
@ -26129,6 +26200,7 @@ static const struct snd_kcontrol_new mmul9_mixer_controls[] = {
|
|||
MSM_BACKEND_DAI_SEP_TDM_TX_7,
|
||||
MSM_FRONTEND_DAI_MULTIMEDIA9, 1, 0, msm_routing_get_audio_mixer,
|
||||
msm_routing_put_audio_mixer),
|
||||
#ifndef CONFIG_HSIF_DISABLE
|
||||
SOC_DOUBLE_EXT("HSIF0_TDM_TX_0", SND_SOC_NOPM,
|
||||
MSM_BACKEND_DAI_HSIF0_TDM_TX_0,
|
||||
MSM_FRONTEND_DAI_MULTIMEDIA9, 1, 0, msm_routing_get_audio_mixer,
|
||||
|
|
@ -26225,6 +26297,7 @@ static const struct snd_kcontrol_new mmul9_mixer_controls[] = {
|
|||
MSM_BACKEND_DAI_HSIF2_TDM_TX_7,
|
||||
MSM_FRONTEND_DAI_MULTIMEDIA9, 1, 0, msm_routing_get_audio_mixer,
|
||||
msm_routing_put_audio_mixer),
|
||||
#endif
|
||||
#endif
|
||||
SOC_DOUBLE_EXT("WSA_CDC_DMA_TX_0", SND_SOC_NOPM,
|
||||
MSM_BACKEND_DAI_WSA_CDC_DMA_TX_0,
|
||||
|
|
@ -27063,6 +27136,7 @@ static const struct snd_kcontrol_new mmul20_mixer_controls[] = {
|
|||
MSM_BACKEND_DAI_SEP_TDM_TX_7,
|
||||
MSM_FRONTEND_DAI_MULTIMEDIA20, 1, 0, msm_routing_get_audio_mixer,
|
||||
msm_routing_put_audio_mixer),
|
||||
#ifndef CONFIG_HSIF_DISABLE
|
||||
SOC_DOUBLE_EXT("HSIF0_TDM_TX_0", SND_SOC_NOPM,
|
||||
MSM_BACKEND_DAI_HSIF0_TDM_TX_0,
|
||||
MSM_FRONTEND_DAI_MULTIMEDIA20, 1, 0, msm_routing_get_audio_mixer,
|
||||
|
|
@ -27159,6 +27233,7 @@ static const struct snd_kcontrol_new mmul20_mixer_controls[] = {
|
|||
MSM_BACKEND_DAI_HSIF2_TDM_TX_7,
|
||||
MSM_FRONTEND_DAI_MULTIMEDIA20, 1, 0, msm_routing_get_audio_mixer,
|
||||
msm_routing_put_audio_mixer),
|
||||
#endif
|
||||
#endif
|
||||
SOC_DOUBLE_EXT("WSA_CDC_DMA_TX_0", SND_SOC_NOPM,
|
||||
MSM_BACKEND_DAI_WSA_CDC_DMA_TX_0,
|
||||
|
|
@ -27366,6 +27441,7 @@ static const struct snd_kcontrol_new mmul21_mixer_controls[] = {
|
|||
MSM_BACKEND_DAI_SEP_TDM_TX_7,
|
||||
MSM_FRONTEND_DAI_MULTIMEDIA21, 1, 0, msm_routing_get_audio_mixer,
|
||||
msm_routing_put_audio_mixer),
|
||||
#ifndef CONFIG_HSIF_DISABLE
|
||||
SOC_DOUBLE_EXT("HSIF0_TDM_TX_0", SND_SOC_NOPM,
|
||||
MSM_BACKEND_DAI_HSIF0_TDM_TX_0,
|
||||
MSM_FRONTEND_DAI_MULTIMEDIA21, 1, 0, msm_routing_get_audio_mixer,
|
||||
|
|
@ -27462,6 +27538,7 @@ static const struct snd_kcontrol_new mmul21_mixer_controls[] = {
|
|||
MSM_BACKEND_DAI_HSIF2_TDM_TX_7,
|
||||
MSM_FRONTEND_DAI_MULTIMEDIA21, 1, 0, msm_routing_get_audio_mixer,
|
||||
msm_routing_put_audio_mixer),
|
||||
#endif
|
||||
#endif
|
||||
SOC_DOUBLE_EXT("WSA_CDC_DMA_TX_0", SND_SOC_NOPM,
|
||||
MSM_BACKEND_DAI_WSA_CDC_DMA_TX_0,
|
||||
|
|
@ -32661,6 +32738,15 @@ static int spkr_prot_get_vi_rch_port(struct snd_kcontrol *kcontrol,
|
|||
return 0;
|
||||
}
|
||||
|
||||
static const char * const cdc_dma_rx_0_vi_fb_tx_mux_text[] = {
|
||||
"ZERO", "TX_CDC_DMA_TX_3", "TX_CDC_DMA_TX_4","TX_CDC_DMA_TX_5"
|
||||
|
||||
};
|
||||
|
||||
static const char * const cdc_dma_rx_1_vi_fb_tx_mux_text[] = {
|
||||
"ZERO", "TX_CDC_DMA_TX_3", "TX_CDC_DMA_TX_4","TX_CDC_DMA_TX_5"
|
||||
};
|
||||
|
||||
static const char * const slim0_rx_vi_fb_tx_lch_mux_text[] = {
|
||||
"ZERO", "SLIM4_TX"
|
||||
};
|
||||
|
|
@ -32689,6 +32775,14 @@ static const char * const int4_mi2s_rx_vi_fb_tx_stereo_mux_text[] = {
|
|||
"ZERO", "INT5_MI2S_TX"
|
||||
};
|
||||
|
||||
static const int cdc_dma_rx_0_vi_fb_tx_value[] = {
|
||||
MSM_BACKEND_DAI_MAX, MSM_BACKEND_DAI_TX_CDC_DMA_TX_3, MSM_BACKEND_DAI_TX_CDC_DMA_TX_4
|
||||
};
|
||||
|
||||
static const int cdc_dma_rx_1_vi_fb_tx_value[] = {
|
||||
MSM_BACKEND_DAI_MAX, MSM_BACKEND_DAI_TX_CDC_DMA_TX_3, MSM_BACKEND_DAI_TX_CDC_DMA_TX_4
|
||||
};
|
||||
|
||||
static const int slim0_rx_vi_fb_tx_lch_value[] = {
|
||||
MSM_BACKEND_DAI_MAX, MSM_BACKEND_DAI_SLIMBUS_4_TX
|
||||
};
|
||||
|
|
@ -32718,6 +32812,16 @@ static const int int4_mi2s_rx_vi_fb_tx_stereo_ch_value[] = {
|
|||
MSM_BACKEND_DAI_MAX, MSM_BACKEND_DAI_INT5_MI2S_TX
|
||||
};
|
||||
|
||||
static const struct soc_enum cdc_dma_rx_0_vi_fb_mux_enum =
|
||||
SOC_VALUE_ENUM_DOUBLE(0, MSM_BACKEND_DAI_RX_CDC_DMA_RX_0, 0, 0,
|
||||
ARRAY_SIZE(cdc_dma_rx_0_vi_fb_tx_mux_text),
|
||||
cdc_dma_rx_0_vi_fb_tx_mux_text, cdc_dma_rx_0_vi_fb_tx_value);
|
||||
|
||||
static const struct soc_enum cdc_dma_rx_1_vi_fb_mux_enum =
|
||||
SOC_VALUE_ENUM_DOUBLE(0, MSM_BACKEND_DAI_RX_CDC_DMA_RX_1, 0, 0,
|
||||
ARRAY_SIZE(cdc_dma_rx_1_vi_fb_tx_mux_text),
|
||||
cdc_dma_rx_1_vi_fb_tx_mux_text, cdc_dma_rx_1_vi_fb_tx_value);
|
||||
|
||||
static const struct soc_enum slim0_rx_vi_fb_lch_mux_enum =
|
||||
SOC_VALUE_ENUM_DOUBLE(0, MSM_BACKEND_DAI_SLIMBUS_0_RX, 0, 0,
|
||||
ARRAY_SIZE(slim0_rx_vi_fb_tx_lch_mux_text),
|
||||
|
|
@ -32755,6 +32859,16 @@ static const struct soc_enum int4_mi2s_rx_vi_fb_stereo_ch_mux_enum =
|
|||
int4_mi2s_rx_vi_fb_tx_stereo_mux_text,
|
||||
int4_mi2s_rx_vi_fb_tx_stereo_ch_value);
|
||||
|
||||
static const struct snd_kcontrol_new cdc_dma_rx_0_vi_fb_mux =
|
||||
SOC_DAPM_ENUM_EXT("CDC_DMA_RX_0_VI_FB_MUX",
|
||||
cdc_dma_rx_0_vi_fb_mux_enum, spkr_prot_get_vi_lch_port,
|
||||
spkr_prot_put_vi_lch_port);
|
||||
|
||||
static const struct snd_kcontrol_new cdc_dma_rx_1_vi_fb_mux =
|
||||
SOC_DAPM_ENUM_EXT("CDC_DMA_RX_1_VI_FB_MUX",
|
||||
cdc_dma_rx_1_vi_fb_mux_enum, spkr_prot_get_vi_lch_port,
|
||||
spkr_prot_put_vi_lch_port);
|
||||
|
||||
static const struct snd_kcontrol_new slim0_rx_vi_fb_lch_mux =
|
||||
SOC_DAPM_ENUM_EXT("SLIM0_RX_VI_FB_LCH_MUX",
|
||||
slim0_rx_vi_fb_lch_mux_enum, spkr_prot_get_vi_lch_port,
|
||||
|
|
@ -32869,6 +32983,8 @@ static const struct snd_soc_dapm_widget msm_qdsp6_widgets[] = {
|
|||
0, 0, 0, 0),
|
||||
SND_SOC_DAPM_AIF_OUT("TX3_CDC_DMA_UL_HL",
|
||||
"TX3_CDC_DMA_HOSTLESS Capture", 0, 0, 0, 0),
|
||||
SND_SOC_DAPM_AIF_OUT("TX4_CDC_DMA_UL_HL",
|
||||
"TX4_CDC_DMA_HOSTLESS Capture", 0, 0, 0, 0),
|
||||
SND_SOC_DAPM_AIF_OUT("CPE_LSM_UL_HL", "CPE LSM capture",
|
||||
0, 0, 0, 0),
|
||||
SND_SOC_DAPM_AIF_IN("SLIM1_DL_HL", "SLIMBUS1_HOSTLESS Playback",
|
||||
|
|
@ -33370,6 +33486,12 @@ static const struct snd_soc_dapm_widget msm_qdsp6_widgets[] = {
|
|||
SND_SOC_DAPM_OUTPUT("BE_OUT"),
|
||||
SND_SOC_DAPM_INPUT("BE_IN"),
|
||||
|
||||
SND_SOC_DAPM_MUX("CDC_DMA_RX_0_VI_FB_MUX", SND_SOC_NOPM, 0, 0,
|
||||
&cdc_dma_rx_0_vi_fb_mux),
|
||||
|
||||
SND_SOC_DAPM_MUX("CDC_DMA_RX_1_VI_FB_MUX", SND_SOC_NOPM, 0, 0,
|
||||
&cdc_dma_rx_1_vi_fb_mux),
|
||||
|
||||
SND_SOC_DAPM_MUX("SLIM0_RX_VI_FB_LCH_MUX", SND_SOC_NOPM, 0, 0,
|
||||
&slim0_rx_vi_fb_lch_mux),
|
||||
SND_SOC_DAPM_MUX("SLIM0_RX_VI_FB_RCH_MUX", SND_SOC_NOPM, 0, 0,
|
||||
|
|
@ -34122,6 +34244,7 @@ static const struct snd_soc_dapm_widget msm_qdsp6_widgets_tdm[] = {
|
|||
SND_SOC_DAPM_AIF_OUT("SEP_TDM_TX_7_UL_HL",
|
||||
"Septenary TDM7 Hostless Capture",
|
||||
0, 0, 0, 0),
|
||||
#ifndef CONFIG_HSIF_DISABLE
|
||||
SND_SOC_DAPM_AIF_IN("HSIF0_TDM_RX_0_DL_HL",
|
||||
"Hsif0 TDM0 Hostless Playback",
|
||||
0, 0, 0, 0),
|
||||
|
|
@ -34266,6 +34389,7 @@ static const struct snd_soc_dapm_widget msm_qdsp6_widgets_tdm[] = {
|
|||
SND_SOC_DAPM_AIF_OUT("HSIF2_TDM_TX_7_UL_HL",
|
||||
"Hsif2 TDM7 Hostless Capture",
|
||||
0, 0, 0, 0),
|
||||
#endif
|
||||
|
||||
/* Backend AIF */
|
||||
/* Stream name equals to backend dai link stream name */
|
||||
|
|
@ -34494,6 +34618,7 @@ static const struct snd_soc_dapm_widget msm_qdsp6_widgets_tdm[] = {
|
|||
SND_SOC_DAPM_AIF_IN("SEP_TDM_TX_7", "Septenary TDM7 Capture",
|
||||
0, 0, 0, 0),
|
||||
|
||||
#ifndef CONFIG_HSIF_DISABLE
|
||||
SND_SOC_DAPM_AIF_OUT("HSIF0_TDM_RX_0", "Hsif0 TDM0 Playback",
|
||||
0, 0, 0, 0),
|
||||
SND_SOC_DAPM_AIF_IN("HSIF0_TDM_TX_0", "Hsif0 TDM0 Capture",
|
||||
|
|
@ -34590,6 +34715,7 @@ static const struct snd_soc_dapm_widget msm_qdsp6_widgets_tdm[] = {
|
|||
0, 0, 0, 0),
|
||||
SND_SOC_DAPM_AIF_IN("HSIF2_TDM_TX_7", "Hsif2 TDM7 Capture",
|
||||
0, 0, 0, 0),
|
||||
#endif
|
||||
SND_SOC_DAPM_MIXER("PRI_TDM_RX_0 Audio Mixer", SND_SOC_NOPM, 0, 0,
|
||||
pri_tdm_rx_0_mixer_controls,
|
||||
ARRAY_SIZE(pri_tdm_rx_0_mixer_controls)),
|
||||
|
|
@ -34689,6 +34815,7 @@ static const struct snd_soc_dapm_widget msm_qdsp6_widgets_tdm[] = {
|
|||
SND_SOC_DAPM_MIXER("SEP_TDM_RX_7 Audio Mixer", SND_SOC_NOPM, 0, 0,
|
||||
sep_tdm_rx_7_mixer_controls,
|
||||
ARRAY_SIZE(sep_tdm_rx_7_mixer_controls)),
|
||||
#ifndef CONFIG_HSIF_DISABLE
|
||||
SND_SOC_DAPM_MIXER("HSIF0_TDM_RX_0 Audio Mixer", SND_SOC_NOPM, 0, 0,
|
||||
hsif0_tdm_rx_0_mixer_controls,
|
||||
ARRAY_SIZE(hsif0_tdm_rx_0_mixer_controls)),
|
||||
|
|
@ -34761,6 +34888,7 @@ static const struct snd_soc_dapm_widget msm_qdsp6_widgets_tdm[] = {
|
|||
SND_SOC_DAPM_MIXER("HSIF2_TDM_RX_7 Audio Mixer", SND_SOC_NOPM, 0, 0,
|
||||
hsif2_tdm_rx_7_mixer_controls,
|
||||
ARRAY_SIZE(hsif2_tdm_rx_7_mixer_controls)),
|
||||
#endif
|
||||
/* incall */
|
||||
SND_SOC_DAPM_MIXER("PRI_TDM_RX_0_Voice Mixer",
|
||||
SND_SOC_NOPM, 0, 0,
|
||||
|
|
@ -34891,6 +35019,7 @@ static const struct snd_soc_dapm_widget msm_qdsp6_widgets_tdm[] = {
|
|||
SND_SOC_DAPM_MIXER("SEP_TDM_RX_7 Port Mixer", SND_SOC_NOPM, 0, 0,
|
||||
sep_tdm_rx_7_port_mixer_controls,
|
||||
ARRAY_SIZE(sep_tdm_rx_7_port_mixer_controls)),
|
||||
#ifndef CONFIG_HSIF_DISABLE
|
||||
SND_SOC_DAPM_MIXER("HSIF0_TDM_RX_0 Port Mixer", SND_SOC_NOPM, 0, 0,
|
||||
hsif0_tdm_rx_0_port_mixer_controls,
|
||||
ARRAY_SIZE(hsif0_tdm_rx_0_port_mixer_controls)),
|
||||
|
|
@ -34963,6 +35092,7 @@ static const struct snd_soc_dapm_widget msm_qdsp6_widgets_tdm[] = {
|
|||
SND_SOC_DAPM_MIXER("HSIF2_TDM_RX_7 Port Mixer", SND_SOC_NOPM, 0, 0,
|
||||
hsif2_tdm_rx_7_port_mixer_controls,
|
||||
ARRAY_SIZE(hsif2_tdm_rx_7_port_mixer_controls)),
|
||||
#endif
|
||||
};
|
||||
#endif
|
||||
|
||||
|
|
@ -36198,6 +36328,7 @@ static const struct snd_soc_dapm_route intercon[] = {
|
|||
{"RX_CDC_DMA_RX_1_DL_HL", "Switch", "CDC_DMA_DL_HL"},
|
||||
{"RX_CDC_DMA_RX_1", NULL, "RX_CDC_DMA_RX_1_DL_HL"},
|
||||
{"TX3_CDC_DMA_UL_HL", NULL, "TX_CDC_DMA_TX_3"},
|
||||
{"TX4_CDC_DMA_UL_HL", NULL, "TX_CDC_DMA_TX_4"},
|
||||
{"LSM1 Mixer", "SLIMBUS_0_TX", "SLIMBUS_0_TX"},
|
||||
{"LSM1 Mixer", "SLIMBUS_1_TX", "SLIMBUS_1_TX"},
|
||||
{"LSM1 Mixer", "SLIMBUS_3_TX", "SLIMBUS_3_TX"},
|
||||
|
|
@ -36507,10 +36638,16 @@ static const struct snd_soc_dapm_route intercon[] = {
|
|||
#endif
|
||||
{"INCALL_RECORD_TX", NULL, "BE_IN"},
|
||||
{"INCALL_RECORD_RX", NULL, "BE_IN"},
|
||||
{"CDC_DMA_RX_0_VI_FB_MUX", "TX_CDC_DMA_TX_3", "TX_CDC_DMA_TX_3"},
|
||||
{"CDC_DMA_RX_0_VI_FB_MUX", "TX_CDC_DMA_TX_4", "TX_CDC_DMA_TX_4"},
|
||||
{"CDC_DMA_RX_1_VI_FB_MUX", "TX_CDC_DMA_TX_3", "TX_CDC_DMA_TX_3"},
|
||||
{"CDC_DMA_RX_1_VI_FB_MUX", "TX_CDC_DMA_TX_4", "TX_CDC_DMA_TX_4"},
|
||||
{"SLIM0_RX_VI_FB_LCH_MUX", "SLIM4_TX", "SLIMBUS_4_TX"},
|
||||
{"SLIM0_RX_VI_FB_RCH_MUX", "SLIM4_TX", "SLIMBUS_4_TX"},
|
||||
{"WSA_RX_0_VI_FB_LCH_MUX", "WSA_CDC_DMA_TX_0", "WSA_CDC_DMA_TX_0"},
|
||||
{"WSA_RX_0_VI_FB_RCH_MUX", "WSA_CDC_DMA_TX_0", "WSA_CDC_DMA_TX_0"},
|
||||
{"RX_CDC_DMA_RX_0", NULL, "CDC_DMA_RX_0_VI_FB_MUX"},
|
||||
{"RX_CDC_DMA_RX_1", NULL, "CDC_DMA_RX_1_VI_FB_MUX"},
|
||||
{"SLIMBUS_0_RX", NULL, "SLIM0_RX_VI_FB_LCH_MUX"},
|
||||
{"SLIMBUS_0_RX", NULL, "SLIM0_RX_VI_FB_RCH_MUX"},
|
||||
{"WSA_CDC_DMA_RX_0", NULL, "WSA_RX_0_VI_FB_LCH_MUX"},
|
||||
|
|
@ -37647,6 +37784,7 @@ static const struct snd_soc_dapm_route intercon_tdm[] = {
|
|||
{"SEP_TDM_RX_7 Audio Mixer", "MultiMedia21", "MM_DL21"},
|
||||
{"SEP_TDM_RX_7", NULL, "SEP_TDM_RX_7 Audio Mixer"},
|
||||
|
||||
#ifndef CONFIG_HSIF_DISABLE
|
||||
{"HSIF0_TDM_RX_0 Audio Mixer", "MultiMedia1", "MM_DL1"},
|
||||
{"HSIF0_TDM_RX_0 Audio Mixer", "MultiMedia2", "MM_DL2"},
|
||||
{"HSIF0_TDM_RX_0 Audio Mixer", "MultiMedia3", "MM_DL3"},
|
||||
|
|
@ -38103,6 +38241,7 @@ static const struct snd_soc_dapm_route intercon_tdm[] = {
|
|||
{"HSIF2_TDM_RX_7 Audio Mixer", "MultiMedia20", "MM_DL20"},
|
||||
{"HSIF2_TDM_RX_7 Audio Mixer", "MultiMedia21", "MM_DL21"},
|
||||
{"HSIF2_TDM_RX_7", NULL, "HSIF2_TDM_RX_7 Audio Mixer"},
|
||||
#endif
|
||||
{"MultiMedia1 Mixer", "PRI_TDM_TX_0", "PRI_TDM_TX_0"},
|
||||
{"MultiMedia1 Mixer", "PRI_TDM_TX_1", "PRI_TDM_TX_1"},
|
||||
{"MultiMedia1 Mixer", "PRI_TDM_TX_2", "PRI_TDM_TX_2"},
|
||||
|
|
@ -38136,6 +38275,7 @@ static const struct snd_soc_dapm_route intercon_tdm[] = {
|
|||
{"MultiMedia1 Mixer", "SEP_TDM_TX_5", "SEP_TDM_TX_5"},
|
||||
{"MultiMedia1 Mixer", "SEP_TDM_TX_6", "SEP_TDM_TX_6"},
|
||||
{"MultiMedia1 Mixer", "SEP_TDM_TX_7", "SEP_TDM_TX_7"},
|
||||
#ifndef CONFIG_HSIF_DISABLE
|
||||
{"MultiMedia1 Mixer", "HSIF0_TDM_TX_0", "HSIF0_TDM_TX_0"},
|
||||
{"MultiMedia1 Mixer", "HSIF0_TDM_TX_1", "HSIF0_TDM_TX_1"},
|
||||
{"MultiMedia1 Mixer", "HSIF0_TDM_TX_2", "HSIF0_TDM_TX_2"},
|
||||
|
|
@ -38160,6 +38300,7 @@ static const struct snd_soc_dapm_route intercon_tdm[] = {
|
|||
{"MultiMedia1 Mixer", "HSIF2_TDM_TX_5", "HSIF2_TDM_TX_5"},
|
||||
{"MultiMedia1 Mixer", "HSIF2_TDM_TX_6", "HSIF2_TDM_TX_6"},
|
||||
{"MultiMedia1 Mixer", "HSIF2_TDM_TX_7", "HSIF2_TDM_TX_7"},
|
||||
#endif
|
||||
|
||||
{"MultiMedia2 Mixer", "PRI_TDM_TX_0", "PRI_TDM_TX_0"},
|
||||
{"MultiMedia2 Mixer", "PRI_TDM_TX_1", "PRI_TDM_TX_1"},
|
||||
|
|
@ -38193,6 +38334,7 @@ static const struct snd_soc_dapm_route intercon_tdm[] = {
|
|||
{"MultiMedia2 Mixer", "SEP_TDM_TX_5", "SEP_TDM_TX_5"},
|
||||
{"MultiMedia2 Mixer", "SEP_TDM_TX_6", "SEP_TDM_TX_6"},
|
||||
{"MultiMedia2 Mixer", "SEP_TDM_TX_7", "SEP_TDM_TX_7"},
|
||||
#ifndef CONFIG_HSIF_DISABLE
|
||||
{"MultiMedia2 Mixer", "HSIF0_TDM_TX_0", "HSIF0_TDM_TX_0"},
|
||||
{"MultiMedia2 Mixer", "HSIF0_TDM_TX_1", "HSIF0_TDM_TX_1"},
|
||||
{"MultiMedia2 Mixer", "HSIF0_TDM_TX_2", "HSIF0_TDM_TX_2"},
|
||||
|
|
@ -38217,6 +38359,7 @@ static const struct snd_soc_dapm_route intercon_tdm[] = {
|
|||
{"MultiMedia2 Mixer", "HSIF2_TDM_TX_5", "HSIF2_TDM_TX_5"},
|
||||
{"MultiMedia2 Mixer", "HSIF2_TDM_TX_6", "HSIF2_TDM_TX_6"},
|
||||
{"MultiMedia2 Mixer", "HSIF2_TDM_TX_7", "HSIF2_TDM_TX_7"},
|
||||
#endif
|
||||
|
||||
{"MultiMedia3 Mixer", "PRI_TDM_TX_0", "PRI_TDM_TX_0"},
|
||||
{"MultiMedia3 Mixer", "PRI_TDM_TX_1", "PRI_TDM_TX_1"},
|
||||
|
|
@ -38250,6 +38393,7 @@ static const struct snd_soc_dapm_route intercon_tdm[] = {
|
|||
{"MultiMedia3 Mixer", "SEP_TDM_TX_5", "SEP_TDM_TX_5"},
|
||||
{"MultiMedia3 Mixer", "SEP_TDM_TX_6", "SEP_TDM_TX_6"},
|
||||
{"MultiMedia3 Mixer", "SEP_TDM_TX_7", "SEP_TDM_TX_7"},
|
||||
#ifndef CONFIG_HSIF_DISABLE
|
||||
{"MultiMedia3 Mixer", "HSIF0_TDM_TX_0", "HSIF0_TDM_TX_0"},
|
||||
{"MultiMedia3 Mixer", "HSIF0_TDM_TX_1", "HSIF0_TDM_TX_1"},
|
||||
{"MultiMedia3 Mixer", "HSIF0_TDM_TX_2", "HSIF0_TDM_TX_2"},
|
||||
|
|
@ -38274,6 +38418,7 @@ static const struct snd_soc_dapm_route intercon_tdm[] = {
|
|||
{"MultiMedia3 Mixer", "HSIF2_TDM_TX_5", "HSIF2_TDM_TX_5"},
|
||||
{"MultiMedia3 Mixer", "HSIF2_TDM_TX_6", "HSIF2_TDM_TX_6"},
|
||||
{"MultiMedia3 Mixer", "HSIF2_TDM_TX_7", "HSIF2_TDM_TX_7"},
|
||||
#endif
|
||||
|
||||
{"MultiMedia4 Mixer", "PRI_TDM_TX_0", "PRI_TDM_TX_0"},
|
||||
{"MultiMedia4 Mixer", "PRI_TDM_TX_1", "PRI_TDM_TX_1"},
|
||||
|
|
@ -38307,6 +38452,7 @@ static const struct snd_soc_dapm_route intercon_tdm[] = {
|
|||
{"MultiMedia4 Mixer", "SEP_TDM_TX_5", "SEP_TDM_TX_5"},
|
||||
{"MultiMedia4 Mixer", "SEP_TDM_TX_6", "SEP_TDM_TX_6"},
|
||||
{"MultiMedia4 Mixer", "SEP_TDM_TX_7", "SEP_TDM_TX_7"},
|
||||
#ifndef CONFIG_HSIF_DISABLE
|
||||
{"MultiMedia4 Mixer", "HSIF0_TDM_TX_0", "HSIF0_TDM_TX_0"},
|
||||
{"MultiMedia4 Mixer", "HSIF0_TDM_TX_1", "HSIF0_TDM_TX_1"},
|
||||
{"MultiMedia4 Mixer", "HSIF0_TDM_TX_2", "HSIF0_TDM_TX_2"},
|
||||
|
|
@ -38331,6 +38477,7 @@ static const struct snd_soc_dapm_route intercon_tdm[] = {
|
|||
{"MultiMedia4 Mixer", "HSIF2_TDM_TX_5", "HSIF2_TDM_TX_5"},
|
||||
{"MultiMedia4 Mixer", "HSIF2_TDM_TX_6", "HSIF2_TDM_TX_6"},
|
||||
{"MultiMedia4 Mixer", "HSIF2_TDM_TX_7", "HSIF2_TDM_TX_7"},
|
||||
#endif
|
||||
|
||||
{"MultiMedia5 Mixer", "PRI_TDM_TX_0", "PRI_TDM_TX_0"},
|
||||
{"MultiMedia5 Mixer", "PRI_TDM_TX_1", "PRI_TDM_TX_1"},
|
||||
|
|
@ -38364,6 +38511,7 @@ static const struct snd_soc_dapm_route intercon_tdm[] = {
|
|||
{"MultiMedia5 Mixer", "SEP_TDM_TX_5", "SEP_TDM_TX_5"},
|
||||
{"MultiMedia5 Mixer", "SEP_TDM_TX_6", "SEP_TDM_TX_6"},
|
||||
{"MultiMedia5 Mixer", "SEP_TDM_TX_7", "SEP_TDM_TX_7"},
|
||||
#ifndef CONFIG_HSIF_DISABLE
|
||||
{"MultiMedia5 Mixer", "HSIF0_TDM_TX_0", "HSIF0_TDM_TX_0"},
|
||||
{"MultiMedia5 Mixer", "HSIF0_TDM_TX_1", "HSIF0_TDM_TX_1"},
|
||||
{"MultiMedia5 Mixer", "HSIF0_TDM_TX_2", "HSIF0_TDM_TX_2"},
|
||||
|
|
@ -38388,6 +38536,7 @@ static const struct snd_soc_dapm_route intercon_tdm[] = {
|
|||
{"MultiMedia5 Mixer", "HSIF2_TDM_TX_5", "HSIF2_TDM_TX_5"},
|
||||
{"MultiMedia5 Mixer", "HSIF2_TDM_TX_6", "HSIF2_TDM_TX_6"},
|
||||
{"MultiMedia5 Mixer", "HSIF2_TDM_TX_7", "HSIF2_TDM_TX_7"},
|
||||
#endif
|
||||
|
||||
{"MultiMedia8 Mixer", "PRI_TDM_TX_0", "PRI_TDM_TX_0"},
|
||||
{"MultiMedia8 Mixer", "PRI_TDM_TX_1", "PRI_TDM_TX_1"},
|
||||
|
|
@ -38421,6 +38570,7 @@ static const struct snd_soc_dapm_route intercon_tdm[] = {
|
|||
{"MultiMedia8 Mixer", "SEP_TDM_TX_5", "SEP_TDM_TX_5"},
|
||||
{"MultiMedia8 Mixer", "SEP_TDM_TX_6", "SEP_TDM_TX_6"},
|
||||
{"MultiMedia8 Mixer", "SEP_TDM_TX_7", "SEP_TDM_TX_7"},
|
||||
#ifndef CONFIG_HSIF_DISABLE
|
||||
{"MultiMedia8 Mixer", "HSIF0_TDM_TX_0", "HSIF0_TDM_TX_0"},
|
||||
{"MultiMedia8 Mixer", "HSIF0_TDM_TX_1", "HSIF0_TDM_TX_1"},
|
||||
{"MultiMedia8 Mixer", "HSIF0_TDM_TX_2", "HSIF0_TDM_TX_2"},
|
||||
|
|
@ -38445,6 +38595,7 @@ static const struct snd_soc_dapm_route intercon_tdm[] = {
|
|||
{"MultiMedia8 Mixer", "HSIF2_TDM_TX_5", "HSIF2_TDM_TX_5"},
|
||||
{"MultiMedia8 Mixer", "HSIF2_TDM_TX_6", "HSIF2_TDM_TX_6"},
|
||||
{"MultiMedia8 Mixer", "HSIF2_TDM_TX_7", "HSIF2_TDM_TX_7"},
|
||||
#endif
|
||||
|
||||
{"MultiMedia9 Mixer", "TERT_TDM_TX_0", "TERT_TDM_TX_0"},
|
||||
{"MultiMedia9 Mixer", "TERT_TDM_TX_1", "TERT_TDM_TX_1"},
|
||||
|
|
@ -38470,6 +38621,7 @@ static const struct snd_soc_dapm_route intercon_tdm[] = {
|
|||
{"MultiMedia9 Mixer", "SEP_TDM_TX_5", "SEP_TDM_TX_5"},
|
||||
{"MultiMedia9 Mixer", "SEP_TDM_TX_6", "SEP_TDM_TX_6"},
|
||||
{"MultiMedia9 Mixer", "SEP_TDM_TX_7", "SEP_TDM_TX_7"},
|
||||
#ifndef CONFIG_HSIF_DISABLE
|
||||
{"MultiMedia9 Mixer", "HSIF0_TDM_TX_0", "HSIF0_TDM_TX_0"},
|
||||
{"MultiMedia9 Mixer", "HSIF0_TDM_TX_1", "HSIF0_TDM_TX_1"},
|
||||
{"MultiMedia9 Mixer", "HSIF0_TDM_TX_2", "HSIF0_TDM_TX_2"},
|
||||
|
|
@ -38494,6 +38646,7 @@ static const struct snd_soc_dapm_route intercon_tdm[] = {
|
|||
{"MultiMedia9 Mixer", "HSIF2_TDM_TX_5", "HSIF2_TDM_TX_5"},
|
||||
{"MultiMedia9 Mixer", "HSIF2_TDM_TX_6", "HSIF2_TDM_TX_6"},
|
||||
{"MultiMedia9 Mixer", "HSIF2_TDM_TX_7", "HSIF2_TDM_TX_7"},
|
||||
#endif
|
||||
|
||||
{"MultiMedia10 Mixer", "TERT_TDM_TX_0", "TERT_TDM_TX_0"},
|
||||
{"MultiMedia10 Mixer", "TERT_TDM_TX_1", "TERT_TDM_TX_1"},
|
||||
|
|
@ -38538,6 +38691,7 @@ static const struct snd_soc_dapm_route intercon_tdm[] = {
|
|||
{"MultiMedia20 Mixer", "SEP_TDM_TX_5", "SEP_TDM_TX_5"},
|
||||
{"MultiMedia20 Mixer", "SEP_TDM_TX_6", "SEP_TDM_TX_6"},
|
||||
{"MultiMedia20 Mixer", "SEP_TDM_TX_7", "SEP_TDM_TX_7"},
|
||||
#ifndef CONFIG_HSIF_DISABLE
|
||||
{"MultiMedia20 Mixer", "HSIF0_TDM_TX_0", "HSIF0_TDM_TX_0"},
|
||||
{"MultiMedia20 Mixer", "HSIF0_TDM_TX_1", "HSIF0_TDM_TX_1"},
|
||||
{"MultiMedia20 Mixer", "HSIF0_TDM_TX_2", "HSIF0_TDM_TX_2"},
|
||||
|
|
@ -38562,6 +38716,7 @@ static const struct snd_soc_dapm_route intercon_tdm[] = {
|
|||
{"MultiMedia20 Mixer", "HSIF2_TDM_TX_5", "HSIF2_TDM_TX_5"},
|
||||
{"MultiMedia20 Mixer", "HSIF2_TDM_TX_6", "HSIF2_TDM_TX_6"},
|
||||
{"MultiMedia20 Mixer", "HSIF2_TDM_TX_7", "HSIF2_TDM_TX_7"},
|
||||
#endif
|
||||
|
||||
{"MultiMedia21 Mixer", "PRI_TDM_TX_0", "PRI_TDM_TX_0"},
|
||||
{"MultiMedia21 Mixer", "PRI_TDM_TX_1", "PRI_TDM_TX_1"},
|
||||
|
|
@ -38595,6 +38750,7 @@ static const struct snd_soc_dapm_route intercon_tdm[] = {
|
|||
{"MultiMedia21 Mixer", "SEP_TDM_TX_5", "SEP_TDM_TX_5"},
|
||||
{"MultiMedia21 Mixer", "SEP_TDM_TX_6", "SEP_TDM_TX_6"},
|
||||
{"MultiMedia21 Mixer", "SEP_TDM_TX_7", "SEP_TDM_TX_7"},
|
||||
#ifndef CONFIG_HSIF_DISABLE
|
||||
{"MultiMedia21 Mixer", "HSIF0_TDM_TX_0", "HSIF0_TDM_TX_0"},
|
||||
{"MultiMedia21 Mixer", "HSIF0_TDM_TX_1", "HSIF0_TDM_TX_1"},
|
||||
{"MultiMedia21 Mixer", "HSIF0_TDM_TX_2", "HSIF0_TDM_TX_2"},
|
||||
|
|
@ -38619,6 +38775,7 @@ static const struct snd_soc_dapm_route intercon_tdm[] = {
|
|||
{"MultiMedia21 Mixer", "HSIF2_TDM_TX_5", "HSIF2_TDM_TX_5"},
|
||||
{"MultiMedia21 Mixer", "HSIF2_TDM_TX_6", "HSIF2_TDM_TX_6"},
|
||||
{"MultiMedia21 Mixer", "HSIF2_TDM_TX_7", "HSIF2_TDM_TX_7"},
|
||||
#endif
|
||||
|
||||
{"MultiMedia22 Mixer", "PRI_TDM_TX_0", "PRI_TDM_TX_0"},
|
||||
{"MultiMedia22 Mixer", "PRI_TDM_TX_1", "PRI_TDM_TX_1"},
|
||||
|
|
@ -38912,6 +39069,7 @@ static const struct snd_soc_dapm_route intercon_tdm[] = {
|
|||
{"SEP_TDM_RX_5", NULL, "SEP_TDM_RX_5_DL_HL"},
|
||||
{"SEP_TDM_RX_6", NULL, "SEP_TDM_RX_6_DL_HL"},
|
||||
{"SEP_TDM_RX_7", NULL, "SEP_TDM_RX_7_DL_HL"},
|
||||
#ifndef CONFIG_HSIF_DISABLE
|
||||
{"HSIF0_TDM_TX_0_UL_HL", NULL, "HSIF0_TDM_TX_0"},
|
||||
{"HSIF0_TDM_TX_1_UL_HL", NULL, "HSIF0_TDM_TX_1"},
|
||||
{"HSIF0_TDM_TX_2_UL_HL", NULL, "HSIF0_TDM_TX_2"},
|
||||
|
|
@ -38960,6 +39118,7 @@ static const struct snd_soc_dapm_route intercon_tdm[] = {
|
|||
{"HSIF2_TDM_RX_5", NULL, "HSIF2_TDM_RX_5_DL_HL"},
|
||||
{"HSIF2_TDM_RX_6", NULL, "HSIF2_TDM_RX_6_DL_HL"},
|
||||
{"HSIF2_TDM_RX_7", NULL, "HSIF2_TDM_RX_7_DL_HL"},
|
||||
#endif
|
||||
#ifndef CONFIG_MI2S_DISABLE
|
||||
{"PRI_TDM_RX_0 Port Mixer", "PRI_MI2S_TX", "PRI_MI2S_TX"},
|
||||
{"PRI_TDM_RX_0 Port Mixer", "SEC_MI2S_TX", "SEC_MI2S_TX"},
|
||||
|
|
@ -39884,6 +40043,7 @@ static const struct snd_soc_dapm_route intercon_tdm[] = {
|
|||
{"SEP_TDM_RX_7 Port Mixer", "SEP_TDM_TX_3", "SEP_TDM_TX_3"},
|
||||
{"SEP_TDM_RX_7", NULL, "SEP_TDM_RX_7 Port Mixer"},
|
||||
|
||||
#ifndef CONFIG_HSIF_DISABLE
|
||||
#ifndef CONFIG_MI2S_DISABLE
|
||||
{"HSIF0_TDM_RX_0 Port Mixer", "PRI_MI2S_TX", "PRI_MI2S_TX"},
|
||||
{"HSIF0_TDM_RX_0 Port Mixer", "SEC_MI2S_TX", "SEC_MI2S_TX"},
|
||||
|
|
@ -40460,6 +40620,7 @@ static const struct snd_soc_dapm_route intercon_tdm[] = {
|
|||
{"HSIF2_TDM_RX_7 Port Mixer", "HSIF2_TDM_TX_2", "HSIF2_TDM_TX_2"},
|
||||
{"HSIF2_TDM_RX_7 Port Mixer", "HSIF2_TDM_TX_3", "HSIF2_TDM_TX_3"},
|
||||
{"HSIF2_TDM_RX_7", NULL, "HSIF2_TDM_RX_7 Port Mixer"},
|
||||
#endif
|
||||
{"AUDIO_REF_EC_UL1 MUX", "QUAT_TDM_TX_1", "QUAT_TDM_TX_1"},
|
||||
{"AUDIO_REF_EC_UL1 MUX", "QUAT_TDM_RX_0", "QUAT_TDM_RX_0"},
|
||||
{"AUDIO_REF_EC_UL1 MUX", "QUAT_TDM_RX_1", "QUAT_TDM_RX_1"},
|
||||
|
|
@ -40544,6 +40705,7 @@ static const struct snd_soc_dapm_route intercon_tdm[] = {
|
|||
{"BE_OUT", NULL, "SEP_TDM_RX_5"},
|
||||
{"BE_OUT", NULL, "SEP_TDM_RX_6"},
|
||||
{"BE_OUT", NULL, "SEP_TDM_RX_7"},
|
||||
#ifndef CONFIG_HSIF_DISABLE
|
||||
{"BE_OUT", NULL, "HSIF0_TDM_RX_0"},
|
||||
{"BE_OUT", NULL, "HSIF0_TDM_RX_1"},
|
||||
{"BE_OUT", NULL, "HSIF0_TDM_RX_2"},
|
||||
|
|
@ -40568,6 +40730,7 @@ static const struct snd_soc_dapm_route intercon_tdm[] = {
|
|||
{"BE_OUT", NULL, "HSIF2_TDM_RX_5"},
|
||||
{"BE_OUT", NULL, "HSIF2_TDM_RX_6"},
|
||||
{"BE_OUT", NULL, "HSIF2_TDM_RX_7"},
|
||||
#endif
|
||||
|
||||
{"PRI_TDM_TX_0", NULL, "BE_IN"},
|
||||
{"PRI_TDM_TX_1", NULL, "BE_IN"},
|
||||
|
|
@ -40604,6 +40767,7 @@ static const struct snd_soc_dapm_route intercon_tdm[] = {
|
|||
{"SEP_TDM_TX_5", NULL, "BE_IN"},
|
||||
{"SEP_TDM_TX_6", NULL, "BE_IN"},
|
||||
{"SEP_TDM_TX_7", NULL, "BE_IN"},
|
||||
#ifndef CONFIG_HSIF_DISABLE
|
||||
{"HSIF0_TDM_TX_0", NULL, "BE_IN"},
|
||||
{"HSIF0_TDM_TX_1", NULL, "BE_IN"},
|
||||
{"HSIF0_TDM_TX_2", NULL, "BE_IN"},
|
||||
|
|
@ -40628,6 +40792,7 @@ static const struct snd_soc_dapm_route intercon_tdm[] = {
|
|||
{"HSIF2_TDM_TX_5", NULL, "BE_IN"},
|
||||
{"HSIF2_TDM_TX_6", NULL, "BE_IN"},
|
||||
{"HSIF2_TDM_TX_7", NULL, "BE_IN"},
|
||||
#endif
|
||||
};
|
||||
#endif
|
||||
|
||||
|
|
|
|||
|
|
@ -688,6 +688,7 @@ enum {
|
|||
|
||||
#define STREAM_TYPE_ASM 0
|
||||
#define STREAM_TYPE_LSM 1
|
||||
#define MT_MX_MAX_PORTS 64
|
||||
|
||||
#define PP_PERF_MODE_FLAG_MASK 0x10000
|
||||
#define PP_PERF_MODE_VALUE_MASK 0xF
|
||||
|
|
@ -749,6 +750,13 @@ struct msm_pcm_stream_app_type_cfg {
|
|||
int copp_perf_mode;
|
||||
};
|
||||
|
||||
struct msm_pcm_channel_mixer_v2 {
|
||||
struct msm_pcm_channel_mixer mixer_cfg;
|
||||
int fedai_id;
|
||||
int session_type;
|
||||
int be_id;
|
||||
bool is_used;
|
||||
};
|
||||
/* dai_id: front-end ID,
|
||||
* dspst_id: DSP audio stream ID
|
||||
* stream_type: playback or capture
|
||||
|
|
|
|||
6
asoc/msm_bengal_dailink.h
Normal file → Executable file
6
asoc/msm_bengal_dailink.h
Normal file → Executable file
|
|
@ -1,6 +1,7 @@
|
|||
/* SPDX-License-Identifier: GPL-2.0-only */
|
||||
/*
|
||||
* Copyright (c) 2020-2021, The Linux Foundation. All rights reserved.
|
||||
* Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved.
|
||||
*/
|
||||
|
||||
#include <sound/soc.h>
|
||||
|
|
@ -166,6 +167,11 @@ SND_SOC_DAILINK_DEFS(tx3_cdcdma_hostless,
|
|||
DAILINK_COMP_ARRAY(COMP_CODEC("snd-soc-dummy", "snd-soc-dummy-dai")),
|
||||
DAILINK_COMP_ARRAY(COMP_PLATFORM("msm-pcm-hostless")));
|
||||
|
||||
SND_SOC_DAILINK_DEFS(tx4_cdcdma_hostless,
|
||||
DAILINK_COMP_ARRAY(COMP_CPU("TX4_CDC_DMA_HOSTLESS")),
|
||||
DAILINK_COMP_ARRAY(COMP_CODEC("snd-soc-dummy", "snd-soc-dummy-dai")),
|
||||
DAILINK_COMP_ARRAY(COMP_PLATFORM("msm-pcm-hostless")));
|
||||
|
||||
SND_SOC_DAILINK_DEFS(tert_mi2s_tx_hostless,
|
||||
DAILINK_COMP_ARRAY(COMP_CPU("TERT_MI2S_TX_HOSTLESS")),
|
||||
DAILINK_COMP_ARRAY(COMP_CODEC("snd-soc-dummy", "snd-soc-dummy-dai")),
|
||||
|
|
|
|||
16
asoc/msm_dailink.h
Executable file → Normal file
16
asoc/msm_dailink.h
Executable file → Normal file
|
|
@ -1,6 +1,7 @@
|
|||
/* SPDX-License-Identifier: GPL-2.0-only */
|
||||
/*
|
||||
* Copyright (c) 2020-2021, The Linux Foundation. All rights reserved.
|
||||
* Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved.
|
||||
*/
|
||||
|
||||
#include <sound/soc.h>
|
||||
|
|
@ -1414,3 +1415,18 @@ SND_SOC_DAILINK_DEFS(hs_if2_tdm_tx_0_dummy,
|
|||
DAILINK_COMP_ARRAY(COMP_CPU("snd-soc-dummy-dai")),
|
||||
DAILINK_COMP_ARRAY(COMP_CODEC("msm-stub-codec.1", "msm-stub-tx")),
|
||||
DAILINK_COMP_ARRAY(COMP_PLATFORM("snd-soc-dummy")));
|
||||
|
||||
SND_SOC_DAILINK_DEFS(voicemmode1_hostless,
|
||||
DAILINK_COMP_ARRAY(COMP_CPU("VoiceMMode1")),
|
||||
DAILINK_COMP_ARRAY(COMP_CODEC("snd-soc-dummy", "snd-soc-dummy-dai")),
|
||||
DAILINK_COMP_ARRAY(COMP_PLATFORM("msm-pcm-hostless")));
|
||||
|
||||
SND_SOC_DAILINK_DEFS(msmvoip_hostless,
|
||||
DAILINK_COMP_ARRAY(COMP_CPU("VoIP")),
|
||||
DAILINK_COMP_ARRAY(COMP_CODEC("snd-soc-dummy", "snd-soc-dummy-dai")),
|
||||
DAILINK_COMP_ARRAY(COMP_PLATFORM("msm-pcm-hostless")));
|
||||
|
||||
SND_SOC_DAILINK_DEFS(voicemmode2_hostless,
|
||||
DAILINK_COMP_ARRAY(COMP_CPU("VoiceMMode2")),
|
||||
DAILINK_COMP_ARRAY(COMP_CODEC("snd-soc-dummy", "snd-soc-dummy-dai")),
|
||||
DAILINK_COMP_ARRAY(COMP_PLATFORM("msm-pcm-hostless")));
|
||||
|
|
|
|||
|
|
@ -1181,21 +1181,27 @@ SND_SOC_DAILINK_DEFS(wsa_dma_rx0,
|
|||
DAILINK_COMP_ARRAY(COMP_CPU("msm-dai-cdc-dma-dev.45056")),
|
||||
DAILINK_COMP_ARRAY(COMP_CODEC("bolero_codec", "wsa_macro_rx1"),
|
||||
COMP_CODEC("wsa-codec1", "wsa_rx1"),
|
||||
COMP_CODEC("wsa-codec2", "wsa_rx2")),
|
||||
COMP_CODEC("wsa-codec2", "wsa_rx2"),
|
||||
COMP_CODEC("wsa-codec.3", "wsa_rx3"),
|
||||
COMP_CODEC("wsa-codec.4", "wsa_rx4")),
|
||||
DAILINK_COMP_ARRAY(COMP_PLATFORM("msm-pcm-routing")));
|
||||
|
||||
SND_SOC_DAILINK_DEFS(wsa_dma_rx1,
|
||||
DAILINK_COMP_ARRAY(COMP_CPU("msm-dai-cdc-dma-dev.45058")),
|
||||
DAILINK_COMP_ARRAY(COMP_CODEC("bolero_codec", "wsa_macro_rx_mix"),
|
||||
COMP_CODEC("wsa-codec1", "wsa_rx1"),
|
||||
COMP_CODEC("wsa-codec2", "wsa_rx2")),
|
||||
COMP_CODEC("wsa-codec2", "wsa_rx2"),
|
||||
COMP_CODEC("wsa-codec.3", "wsa_rx3"),
|
||||
COMP_CODEC("wsa-codec.4", "wsa_rx4")),
|
||||
DAILINK_COMP_ARRAY(COMP_PLATFORM("msm-pcm-routing")));
|
||||
|
||||
SND_SOC_DAILINK_DEFS(wsa_dma_tx1,
|
||||
DAILINK_COMP_ARRAY(COMP_CPU("msm-dai-cdc-dma-dev.45059")),
|
||||
DAILINK_COMP_ARRAY(COMP_CODEC("bolero_codec", "wsa_macro_echo"),
|
||||
COMP_CODEC("wsa-codec1", "wsa_rx1"),
|
||||
COMP_CODEC("wsa-codec2", "wsa_rx2")),
|
||||
COMP_CODEC("wsa-codec2", "wsa_rx2"),
|
||||
COMP_CODEC("wsa-codec.3", "wsa_rx3"),
|
||||
COMP_CODEC("wsa-codec.4", "wsa_rx4")),
|
||||
DAILINK_COMP_ARRAY(COMP_PLATFORM("msm-pcm-routing")));
|
||||
|
||||
SND_SOC_DAILINK_DEFS(rx_dma_rx0,
|
||||
|
|
|
|||
57
asoc/platform_init_auto.c
Normal file
57
asoc/platform_init_auto.c
Normal file
|
|
@ -0,0 +1,57 @@
|
|||
// SPDX-License-Identifier: GPL-2.0-only
|
||||
/*
|
||||
* Copyright (c) 2017 The Linux Foundation. All rights reserved.
|
||||
* Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved.
|
||||
*/
|
||||
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/module.h>
|
||||
#include "platform_init.h"
|
||||
|
||||
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_transcode_loopback_init();
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void audio_platform_exit(void)
|
||||
{
|
||||
msm_transcode_loopback_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);
|
||||
module_exit(audio_platform_exit);
|
||||
|
||||
MODULE_DESCRIPTION("Audio Platform driver");
|
||||
MODULE_LICENSE("GPL v2");
|
||||
6
asoc/sa6155.c
Executable file → Normal file
6
asoc/sa6155.c
Executable file → Normal file
|
|
@ -5168,7 +5168,7 @@ static struct snd_soc_dai_link msm_common_dai_links[] = {
|
|||
.ignore_suspend = 1,
|
||||
.ignore_pmdown_time = 1,
|
||||
.id = MSM_FRONTEND_DAI_VOICEMMODE1,
|
||||
SND_SOC_DAILINK_REG(voicemmode1),
|
||||
SND_SOC_DAILINK_REG(voicemmode1_hostless),
|
||||
},
|
||||
{
|
||||
.name = "MSM VoIP",
|
||||
|
|
@ -5182,7 +5182,7 @@ static struct snd_soc_dai_link msm_common_dai_links[] = {
|
|||
/* this dainlink has playback support */
|
||||
.ignore_pmdown_time = 1,
|
||||
.id = MSM_FRONTEND_DAI_VOIP,
|
||||
SND_SOC_DAILINK_REG(msmvoip),
|
||||
SND_SOC_DAILINK_REG(msmvoip_hostless),
|
||||
},
|
||||
{
|
||||
.name = MSM_DAILINK_NAME(ULL),
|
||||
|
|
@ -5350,7 +5350,7 @@ static struct snd_soc_dai_link msm_common_dai_links[] = {
|
|||
.ignore_suspend = 1,
|
||||
.ignore_pmdown_time = 1,
|
||||
.id = MSM_FRONTEND_DAI_VOICEMMODE2,
|
||||
SND_SOC_DAILINK_REG(voicemmode2),
|
||||
SND_SOC_DAILINK_REG(voicemmode2_hostless),
|
||||
},
|
||||
/* LSM FE */
|
||||
{
|
||||
|
|
|
|||
|
|
@ -7558,7 +7558,7 @@ static struct snd_soc_dai_link msm_common_dai_links[] = {
|
|||
.ignore_suspend = 1,
|
||||
.ignore_pmdown_time = 1,
|
||||
.id = MSM_FRONTEND_DAI_VOICEMMODE1,
|
||||
SND_SOC_DAILINK_REG(voicemmode1),
|
||||
SND_SOC_DAILINK_REG(voicemmode1_hostless),
|
||||
},
|
||||
{
|
||||
.name = "MSM VoIP",
|
||||
|
|
@ -7572,7 +7572,7 @@ static struct snd_soc_dai_link msm_common_dai_links[] = {
|
|||
/* this dainlink has playback support */
|
||||
.ignore_pmdown_time = 1,
|
||||
.id = MSM_FRONTEND_DAI_VOIP,
|
||||
SND_SOC_DAILINK_REG(msmvoip),
|
||||
SND_SOC_DAILINK_REG(msmvoip_hostless),
|
||||
},
|
||||
{
|
||||
.name = MSM_DAILINK_NAME(ULL),
|
||||
|
|
@ -7740,7 +7740,7 @@ static struct snd_soc_dai_link msm_common_dai_links[] = {
|
|||
.ignore_suspend = 1,
|
||||
.ignore_pmdown_time = 1,
|
||||
.id = MSM_FRONTEND_DAI_VOICEMMODE2,
|
||||
SND_SOC_DAILINK_REG(voicemmode2),
|
||||
SND_SOC_DAILINK_REG(voicemmode2_hostless),
|
||||
},
|
||||
/* LSM FE */
|
||||
{
|
||||
|
|
|
|||
136
asoc/sm6150.c
136
asoc/sm6150.c
|
|
@ -31,6 +31,7 @@
|
|||
#include <asoc/msm-cdc-pinctrl.h>
|
||||
#include "codecs/wcd934x/wcd934x.h"
|
||||
#include "codecs/wcd9335.h"
|
||||
#include "asoc/wcd-mbhc-v2.h"
|
||||
#include "codecs/wcd934x/wcd934x-mbhc.h"
|
||||
#include "codecs/wcd937x/wcd937x-mbhc.h"
|
||||
#include "codecs/wsa881x.h"
|
||||
|
|
@ -40,6 +41,7 @@
|
|||
#include "codecs/wcd937x/wcd937x.h"
|
||||
#include "msm_talos_dailink.h"
|
||||
#include "talos-port-config.h"
|
||||
#include <soc/soundwire.h>
|
||||
|
||||
#define DRV_NAME "sm6150-asoc-snd"
|
||||
|
||||
|
|
@ -629,7 +631,9 @@ static int dmic_2_3_gpio_cnt;
|
|||
static void *def_wcd_mbhc_cal(void);
|
||||
static int msm_snd_enable_codec_ext_clk(struct snd_soc_component *component,
|
||||
int enable, bool dapm);
|
||||
static int msm_rx_tx_codec_init(struct snd_soc_pcm_runtime*);
|
||||
static int msm_wsa881x_init(struct snd_soc_pcm_runtime *rtd);
|
||||
static int msm_wcd937x_wsa881x_init(struct snd_soc_pcm_runtime *rtd);
|
||||
|
||||
/*
|
||||
* Need to report LINEIN
|
||||
|
|
@ -5137,15 +5141,23 @@ static int msm_rx_tx_codec_init(struct snd_soc_pcm_runtime *rtd)
|
|||
|
||||
snd_soc_dapm_sync(dapm);
|
||||
|
||||
snd_soc_dapm_ignore_suspend(dapm, "EAR");
|
||||
snd_soc_dapm_ignore_suspend(dapm, "AUX");
|
||||
snd_soc_dapm_ignore_suspend(dapm, "HPHL");
|
||||
snd_soc_dapm_ignore_suspend(dapm, "HPHR");
|
||||
snd_soc_dapm_ignore_suspend(dapm, "AMIC1");
|
||||
snd_soc_dapm_ignore_suspend(dapm, "AMIC2");
|
||||
snd_soc_dapm_ignore_suspend(dapm, "AMIC3");
|
||||
snd_soc_dapm_ignore_suspend(dapm, "AMIC4");
|
||||
snd_soc_dapm_sync(dapm);
|
||||
|
||||
/*
|
||||
* Send speaker configuration only for WSA8810.
|
||||
* Default configuration is for WSA8815.
|
||||
*/
|
||||
|
||||
wsa_macro_set_spkr_mode(component,
|
||||
WSA_MACRO_SPKR_MODE_1);
|
||||
wsa_macro_set_spkr_gain_offset(component,
|
||||
WSA_MACRO_GAIN_OFFSET_M1P5_DB);
|
||||
WSA_MACRO_SPKR_MODE_DEFAULT);
|
||||
|
||||
card = rtd->card->snd_card;
|
||||
if (!pdata->codec_root) {
|
||||
|
|
@ -5170,7 +5182,7 @@ static int msm_rx_tx_codec_init(struct snd_soc_pcm_runtime *rtd)
|
|||
bolero_register_wake_irq(component, false);
|
||||
|
||||
bolero_set_port_map(bolero_component,
|
||||
ARRAY_SIZE(sm_port_map), sm_port_map);
|
||||
ARRAY_SIZE(sm_port_map_wcd937x), sm_port_map_wcd937x);
|
||||
|
||||
codec_reg_done = true;
|
||||
return 0;
|
||||
|
|
@ -7196,7 +7208,7 @@ static struct snd_soc_dai_link msm_tasha_be_dai_links[] = {
|
|||
|
||||
static struct snd_soc_dai_link msm_wcn_be_dai_links[] = {
|
||||
{
|
||||
.name = LPASS_BE_SLIMBUS_TX_VI,
|
||||
.name = LPASS_BE_SLIMBUS_7_RX,
|
||||
.stream_name = "Slimbus7 Playback",
|
||||
/* BT codec driver determines capabilities based on
|
||||
* dai name, bt codecdai name should always contains
|
||||
|
|
@ -7492,7 +7504,7 @@ static struct snd_soc_dai_link msm_wsa_cdc_dma_be_dai_links[] = {
|
|||
.stream_name = "WSA CDC DMA0 Playback",
|
||||
.no_pcm = 1,
|
||||
.dpcm_playback = 1,
|
||||
.init = &msm_wsa881x_init,
|
||||
.init = &msm_wcd937x_wsa881x_init,
|
||||
.id = MSM_BACKEND_DAI_WSA_CDC_DMA_RX_0,
|
||||
.be_hw_params_fixup = msm_be_hw_params_fixup,
|
||||
.ignore_pmdown_time = 1,
|
||||
|
|
@ -7720,6 +7732,46 @@ err_pcm_runtime:
|
|||
return ret;
|
||||
}
|
||||
|
||||
static int msm_snd_card_late_probe(struct snd_soc_card *card)
|
||||
{
|
||||
struct snd_soc_component *component = NULL;
|
||||
const char *be_dl_name = LPASS_BE_RX_CDC_DMA_RX_0;
|
||||
struct snd_soc_pcm_runtime *rtd;
|
||||
int ret = 0;
|
||||
void *mbhc_calibration;
|
||||
|
||||
rtd = snd_soc_get_pcm_runtime(card, be_dl_name);
|
||||
if (!rtd) {
|
||||
dev_err(card->dev,
|
||||
"%s: snd_soc_get_pcm_runtime for %s failed!\n",
|
||||
__func__, be_dl_name);
|
||||
ret = -EINVAL;
|
||||
}
|
||||
|
||||
component = snd_soc_rtdcom_lookup(rtd, WCD937X_DRV_NAME);
|
||||
if (!component) {
|
||||
pr_err("%s: component is NULL\n", __func__);
|
||||
ret = -EINVAL;
|
||||
}
|
||||
|
||||
mbhc_calibration = def_wcd_mbhc_cal();
|
||||
if (!mbhc_calibration) {
|
||||
ret = -ENOMEM;
|
||||
}
|
||||
wcd_mbhc_cfg.calibration = mbhc_calibration;
|
||||
ret = wcd937x_mbhc_hs_detect(component, &wcd_mbhc_cfg);
|
||||
if (ret) {
|
||||
dev_err(card->dev, "%s: mbhc hs detect failed, err:%d\n",
|
||||
__func__, ret);
|
||||
goto err_hs_detect;
|
||||
}
|
||||
return 0;
|
||||
|
||||
err_hs_detect:
|
||||
kfree(mbhc_calibration);
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int msm_populate_dai_link_component_of_node(
|
||||
struct snd_soc_card *card)
|
||||
{
|
||||
|
|
@ -8045,6 +8097,8 @@ static struct snd_soc_card *populate_snd_card_dailinks(struct device *dev)
|
|||
total_links +=
|
||||
ARRAY_SIZE(msm_tasha_fe_dai_links);
|
||||
} else {
|
||||
card->late_probe =
|
||||
msm_snd_card_late_probe;
|
||||
memcpy(msm_sm6150_dai_links + total_links,
|
||||
msm_bolero_fe_dai_links,
|
||||
sizeof(msm_bolero_fe_dai_links));
|
||||
|
|
@ -8186,7 +8240,8 @@ static int msm_wsa881x_init(struct snd_soc_pcm_runtime *rtd)
|
|||
SPKR_L_BOOST, SPKR_L_VI};
|
||||
u8 spkright_port_types[WSA881X_MAX_SWR_PORTS] = {SPKR_R, SPKR_R_COMP,
|
||||
SPKR_R_BOOST, SPKR_R_VI};
|
||||
unsigned int ch_rate[WSA881X_MAX_SWR_PORTS] = {2400, 600, 300, 1200};
|
||||
unsigned int ch_rate[WSA881X_MAX_SWR_PORTS] = {SWR_CLK_RATE_2P4MHZ, SWR_CLK_RATE_0P6MHZ,
|
||||
SWR_CLK_RATE_0P3MHZ, SWR_CLK_RATE_1P2MHZ};
|
||||
unsigned int ch_mask[WSA881X_MAX_SWR_PORTS] = {0x1, 0xF, 0x3, 0x3};
|
||||
struct snd_soc_component *component = NULL;
|
||||
struct msm_asoc_mach_data *pdata =
|
||||
|
|
@ -8237,6 +8292,69 @@ static int msm_wsa881x_init(struct snd_soc_pcm_runtime *rtd)
|
|||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int msm_wcd937x_wsa881x_init(struct snd_soc_pcm_runtime *rtd)
|
||||
{
|
||||
u8 spkleft_ports[WSA881X_MAX_SWR_PORTS] = {0, 1, 2, 3};
|
||||
u8 spkright_ports[WSA881X_MAX_SWR_PORTS] = {0, 1, 2, 3};
|
||||
u8 spkleft_port_types[WSA881X_MAX_SWR_PORTS] = {SPKR_L, SPKR_L_COMP,
|
||||
SPKR_L_BOOST, SPKR_L_VI};
|
||||
u8 spkright_port_types[WSA881X_MAX_SWR_PORTS] = {SPKR_R, SPKR_R_COMP,
|
||||
SPKR_R_BOOST, SPKR_R_VI};
|
||||
unsigned int ch_rate[WSA881X_MAX_SWR_PORTS] = {SWR_CLK_RATE_2P4MHZ, SWR_CLK_RATE_0P6MHZ,
|
||||
SWR_CLK_RATE_0P3MHZ, SWR_CLK_RATE_1P2MHZ};
|
||||
unsigned int ch_mask[WSA881X_MAX_SWR_PORTS] = {0x1, 0xF, 0x3, 0x3};
|
||||
struct snd_soc_component *component = NULL;
|
||||
struct msm_asoc_mach_data *pdata =
|
||||
snd_soc_card_get_drvdata(rtd->card);
|
||||
struct snd_soc_dapm_context *dapm = NULL;
|
||||
|
||||
|
||||
if (pdata->wsa_max_devs > 0) {
|
||||
component = snd_soc_rtdcom_lookup(rtd, "wsa-codec.3");
|
||||
if (!component) {
|
||||
pr_err("%s: wsa-codec.3 component is NULL\n", __func__);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
dapm = snd_soc_component_get_dapm(component);
|
||||
|
||||
wsa881x_set_channel_map(component, &spkleft_ports[0],
|
||||
WSA881X_MAX_SWR_PORTS, &ch_mask[0],
|
||||
&ch_rate[0], &spkleft_port_types[0]);
|
||||
if (dapm->component) {
|
||||
snd_soc_dapm_ignore_suspend(dapm, "SpkrLeft IN");
|
||||
snd_soc_dapm_ignore_suspend(dapm, "SpkrLeft SPKR");
|
||||
}
|
||||
wsa881x_codec_info_create_codec_entry(pdata->codec_root,
|
||||
component);
|
||||
}
|
||||
|
||||
/* If current platform has more than one WSA */
|
||||
if (pdata->wsa_max_devs > 1) {
|
||||
component = snd_soc_rtdcom_lookup(rtd, "wsa-codec.4");
|
||||
if (!component) {
|
||||
pr_err("%s: wsa-codec.4 component is NULL\n", __func__);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
dapm = snd_soc_component_get_dapm(component);
|
||||
|
||||
wsa881x_set_channel_map(component, &spkright_ports[0],
|
||||
WSA881X_MAX_SWR_PORTS, &ch_mask[0],
|
||||
&ch_rate[0], &spkright_port_types[0]);
|
||||
if (dapm->component) {
|
||||
snd_soc_dapm_ignore_suspend(dapm, "SpkrRight IN");
|
||||
snd_soc_dapm_ignore_suspend(dapm, "SpkrRight SPKR");
|
||||
}
|
||||
wsa881x_codec_info_create_codec_entry(pdata->codec_root,
|
||||
component);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
static void msm_i2s_auxpcm_init(struct platform_device *pdev)
|
||||
{
|
||||
int count;
|
||||
|
|
@ -8477,8 +8595,8 @@ static int msm_asoc_machine_probe(struct platform_device *pdev)
|
|||
}
|
||||
|
||||
/* Get maximum WSA device count for this platform */
|
||||
ret = of_property_read_u32(pdev->dev.of_node,
|
||||
"qcom,wsa-max-devs", &pdata->wsa_max_devs);
|
||||
ret = of_property_read_u32(pdev->dev.of_node,
|
||||
"qcom,wsa-max-devs", &pdata->wsa_max_devs);
|
||||
if (ret) {
|
||||
dev_info(&pdev->dev,
|
||||
"%s: wsa-max-devs property missing in DT %s, ret = %d\n",
|
||||
|
|
|
|||
|
|
@ -87,6 +87,12 @@ static struct port_params tx_frame_params_0p6MHz[SWR_MSTR_PORT_LEN] = {
|
|||
{1, 1, 0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0, 0x00, 0x00}, /* TX3 */
|
||||
};
|
||||
|
||||
static struct port_params tx_frame_params_wcd937x[SWR_MSTR_PORT_LEN] = {
|
||||
{3, 0, 0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 1, 0x00, 0x00}, /* TX1 */
|
||||
{3, 1, 0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0, 0x00, 0x00}, /* TX2 */
|
||||
{3, 2, 0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0, 0x00, 0x00}, /* TX3 */
|
||||
};
|
||||
|
||||
static struct swr_mstr_port_map sm_port_map[] = {
|
||||
{TX_MACRO, SWR_UC0, tx_frame_params_default},
|
||||
{TX_MACRO, SWR_UC1, tx_frame_params_4p8MHz},
|
||||
|
|
@ -95,7 +101,7 @@ static struct swr_mstr_port_map sm_port_map[] = {
|
|||
{RX_MACRO, SWR_UC1, rx_frame_params_dsd},
|
||||
{RX_MACRO, SWR_UC2, rx_frame_params_44p1KHz},
|
||||
{WSA_MACRO, SWR_UC0, wsa_frame_params_default},
|
||||
{WSA_MACRO, SWR_UC1, wsa_frame_params_default},
|
||||
{WSA_MACRO, SWR_UC1, wsa_frame_params_receiver},
|
||||
};
|
||||
|
||||
static struct swr_mstr_port_map sm_port_map_tavil[] = {
|
||||
|
|
@ -106,7 +112,7 @@ static struct swr_mstr_port_map sm_port_map_tavil[] = {
|
|||
{RX_MACRO, SWR_UC1, rx_frame_params_dsd},
|
||||
{RX_MACRO, SWR_UC2, rx_frame_params_44p1KHz},
|
||||
{WSA_MACRO, SWR_UC0, wsa_frame_params_default},
|
||||
{WSA_MACRO, SWR_UC1, wsa_frame_params_default},
|
||||
{WSA_MACRO, SWR_UC1, wsa_frame_params_receiver},
|
||||
};
|
||||
|
||||
static struct swr_mstr_port_map sm_port_map_tasha[] = {
|
||||
|
|
@ -117,11 +123,23 @@ static struct swr_mstr_port_map sm_port_map_tasha[] = {
|
|||
{RX_MACRO, SWR_UC1, rx_frame_params_dsd},
|
||||
{RX_MACRO, SWR_UC2, rx_frame_params_44p1KHz},
|
||||
{WSA_MACRO, SWR_UC0, wsa_frame_params_default},
|
||||
{WSA_MACRO, SWR_UC1, wsa_frame_params_default},
|
||||
{WSA_MACRO, SWR_UC1, wsa_frame_params_receiver},
|
||||
};
|
||||
|
||||
static struct swr_mstr_port_map sm_port_map_tavil_wsa[] = {
|
||||
{WSA_MACRO, SWR_UC0, wsa_frame_params_default},
|
||||
{WSA_MACRO, SWR_UC1, wsa_frame_params_receiver},
|
||||
};
|
||||
|
||||
static struct swr_mstr_port_map sm_port_map_wcd937x[] = {
|
||||
{TX_MACRO, SWR_UC0, tx_frame_params_wcd937x},
|
||||
{TX_MACRO, SWR_UC1, tx_frame_params_wcd937x},
|
||||
{TX_MACRO, SWR_UC2, tx_frame_params_wcd937x},
|
||||
{RX_MACRO, SWR_UC0, rx_frame_params_default},
|
||||
{RX_MACRO, SWR_UC1, rx_frame_params_dsd},
|
||||
{RX_MACRO, SWR_UC2, rx_frame_params_44p1KHz},
|
||||
{WSA_MACRO, SWR_UC0, wsa_frame_params_default},
|
||||
{WSA_MACRO, SWR_UC1, wsa_frame_params_receiver},
|
||||
};
|
||||
|
||||
#endif /* _TALOS_PORT_CONFIG */
|
||||
|
|
|
|||
|
|
@ -3,7 +3,6 @@ CONFIG_AUDIO_EXT_CLK=m
|
|||
CONFIG_SND_SOC_WCD9XXX_V2=m
|
||||
CONFIG_SND_SOC_WCD_MBHC=m
|
||||
CONFIG_SND_SOC_WSA881X_ANALOG=m
|
||||
CONFIG_WSA881X_TEMP_SENSOR_DISABLE=m
|
||||
CONFIG_WCD9XXX_CODEC_CORE_V2=m
|
||||
CONFIG_MSM_CDC_PINCTRL=m
|
||||
CONFIG_MSM_QDSP6V2_CODECS=m
|
||||
|
|
|
|||
|
|
@ -1,39 +1,5 @@
|
|||
/* SPDX-License-Identifier: GPL-2.0-only */
|
||||
/* Copyright (c) 2019-2021, The Linux Foundation. All rights reserved.
|
||||
*
|
||||
* Changes from Qualcomm Innovation Center are provided under the following license:
|
||||
* Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted (subject to the limitations in the
|
||||
* disclaimer below) provided that the following conditions are met:
|
||||
*
|
||||
* * Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
*
|
||||
* * Redistributions in binary form must reproduce the above
|
||||
* copyright notice, this list of conditions and the following
|
||||
* disclaimer in the documentation and/or other materials provided
|
||||
* with the distribution.
|
||||
*
|
||||
* * Neither the name of Qualcomm Innovation Center, Inc. nor the
|
||||
* names of its contributors may be used to endorse or promote
|
||||
* products derived from this software without specific prior
|
||||
* written permission.
|
||||
*
|
||||
* NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
|
||||
* GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT
|
||||
* HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
|
||||
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
||||
* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
|
||||
* ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
|
||||
* GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
|
||||
* IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
|
||||
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
|
||||
* IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
/* Copyright (c) 2019-2020, The Linux Foundation. All rights reserved.
|
||||
*/
|
||||
|
||||
#define CONFIG_PINCTRL_LPI 1
|
||||
|
|
@ -41,7 +7,6 @@
|
|||
#define CONFIG_SND_SOC_WCD9XXX_V2 1
|
||||
#define CONFIG_SND_SOC_WCD_MBHC 1
|
||||
#define CONFIG_SND_SOC_WSA881X_ANALOG 1
|
||||
#define CONFIG_WSA881X_TEMP_SENSOR_DISABLE 1
|
||||
#define CONFIG_WCD9XXX_CODEC_CORE_V2 1
|
||||
#define CONFIG_MSM_CDC_PINCTRL 1
|
||||
#define CONFIG_MSM_QDSP6V2_CODECS 1
|
||||
|
|
|
|||
|
|
@ -46,3 +46,4 @@ export CONFIG_SND_SOC_WCD_IRQ=m
|
|||
export CONFIG_SND_SOC_WCD937X=m
|
||||
export CONFIG_SND_SOC_WCD937X_SLAVE=m
|
||||
export CONFIG_SND_EVENT=m
|
||||
export CONFIG_HSIF_DISABLE=m
|
||||
|
|
|
|||
|
|
@ -51,3 +51,4 @@
|
|||
#define CONFIG_SND_SOC_WCD937X 1
|
||||
#define CONFIG_SND_SOC_WCD937X_SLAVE 1
|
||||
#define CONFIG_SND_EVENT 1
|
||||
#define CONFIG_HSIF_DISABLE 1
|
||||
|
|
|
|||
8
dsp/q6adm.c
Executable file → Normal file
8
dsp/q6adm.c
Executable file → Normal file
|
|
@ -1,6 +1,7 @@
|
|||
// SPDX-License-Identifier: GPL-2.0-only
|
||||
/*
|
||||
* Copyright (c) 2012-2021, The Linux Foundation. All rights reserved.
|
||||
* Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved.
|
||||
*/
|
||||
#include <linux/module.h>
|
||||
#include <linux/slab.h>
|
||||
|
|
@ -2720,9 +2721,8 @@ static int adm_arrange_mch_map_v8(
|
|||
goto non_mch_path;
|
||||
};
|
||||
|
||||
if ((ep_payload->dev_num_channel > 2) &&
|
||||
(port_channel_map[port_idx].set_channel_map ||
|
||||
multi_ch_maps[idx].set_channel_map)) {
|
||||
if (port_channel_map[port_idx].set_channel_map ||
|
||||
multi_ch_maps[idx].set_channel_map) {
|
||||
if (port_channel_map[port_idx].set_channel_map)
|
||||
memcpy(ep_payload->dev_channel_mapping,
|
||||
port_channel_map[port_idx].channel_mapping,
|
||||
|
|
@ -3290,6 +3290,8 @@ int adm_open_v2(int port_id, int path, int rate, int channel_mode, int topology,
|
|||
(topology == DS2_ADM_COPP_TOPOLOGY_ID) ||
|
||||
(topology == SRS_TRUMEDIA_TOPOLOGY_ID))
|
||||
topology = DEFAULT_COPP_TOPOLOGY;
|
||||
} else if (perf_mode == LOW_LATENCY_PCM_NOPROC_MODE) {
|
||||
flags = ADM_LOW_LATENCY_NPROC_DEVICE_SESSION;
|
||||
} else {
|
||||
if ((path == ADM_PATH_COMPRESSED_RX) ||
|
||||
(path == ADM_PATH_COMPRESSED_TX))
|
||||
|
|
|
|||
32
dsp/q6afe.c
32
dsp/q6afe.c
|
|
@ -2144,12 +2144,15 @@ static int afe_send_cal_block(u16 port_id, struct cal_block_data *cal_block)
|
|||
result = -EINVAL;
|
||||
goto done;
|
||||
}
|
||||
if (cal_block->cal_data.size <= 0) {
|
||||
if (cal_block->cal_data.size < 0) {
|
||||
pr_debug("%s: AFE cal has invalid size!\n", __func__);
|
||||
result = -EINVAL;
|
||||
goto done;
|
||||
}
|
||||
|
||||
if (cal_block->cal_data.size == 0) {
|
||||
pr_debug("%s: AFE cal size is zero!\n", __func__);
|
||||
goto done;
|
||||
}
|
||||
payload_size = cal_block->cal_data.size;
|
||||
mem_hdr.data_payload_addr_lsw =
|
||||
lower_32_bits(cal_block->cal_data.paddr);
|
||||
|
|
@ -4876,6 +4879,31 @@ int afe_port_send_logging_cfg(u16 port_id,
|
|||
}
|
||||
EXPORT_SYMBOL(afe_port_send_logging_cfg);
|
||||
|
||||
int afe_port_send_afe_limiter_param(u16 port_id,
|
||||
struct afe_param_id_port_afe_limiter_disable_t *disable_limiter)
|
||||
{
|
||||
struct param_hdr_v3 param_hdr;
|
||||
int ret = -EINVAL;
|
||||
|
||||
pr_debug("%s: enter, port: 0x%x logging flag: %x\n", __func__, port_id,
|
||||
disable_limiter->disable_afe_limiter);
|
||||
memset(¶m_hdr, 0, sizeof(param_hdr));
|
||||
|
||||
param_hdr.module_id = AFE_MODULE_LIMITER;
|
||||
param_hdr.instance_id = INSTANCE_ID_0;
|
||||
param_hdr.param_id = AFE_PARAM_ID_ENABLE;
|
||||
param_hdr.param_size = sizeof(struct afe_param_id_port_afe_limiter_disable_t);
|
||||
|
||||
ret = q6afe_pack_and_set_param_in_band(port_id,
|
||||
q6audio_get_port_index(port_id), param_hdr, (u8*)disable_limiter);
|
||||
if (ret)
|
||||
pr_err("%s: AFE port logging setting for port 0x%x failed %d\n",
|
||||
__func__, port_id, ret);
|
||||
|
||||
return ret;
|
||||
}
|
||||
EXPORT_SYMBOL(afe_port_send_afe_limiter_param);
|
||||
|
||||
int afe_port_send_usb_dev_param(u16 port_id, union afe_port_config *afe_config)
|
||||
{
|
||||
struct afe_param_id_usb_audio_dev_params usb_dev;
|
||||
|
|
|
|||
32
dsp/q6asm.c
32
dsp/q6asm.c
|
|
@ -12,6 +12,7 @@
|
|||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* Copyright (c) 2022, Qualcomm Innovation Center, Inc. All rights reserved.
|
||||
*/
|
||||
#include <linux/fs.h>
|
||||
#include <linux/mutex.h>
|
||||
|
|
@ -2191,8 +2192,12 @@ static int32_t q6asm_callback(struct apr_client_data *data, void *priv)
|
|||
payload[0], payload[1],
|
||||
data->src_port, data->dest_port);
|
||||
if (payload[1] != 0) {
|
||||
pr_err("%s: cmd = 0x%x returned error = 0x%x\n",
|
||||
__func__, payload[0], payload[1]);
|
||||
if (adsp_err_get_lnx_err_code(payload[1]) != -EALREADY)
|
||||
pr_err("%s: cmd = 0x%x returned error = 0x%x\n",
|
||||
__func__, payload[0], payload[1]);
|
||||
else
|
||||
pr_debug("%s: cmd = 0x%x returned error = 0x%x\n",
|
||||
__func__, payload[0], payload[1]);
|
||||
if (wakeup_flag) {
|
||||
if ((is_adsp_reg_event(payload[0]) >=
|
||||
0) ||
|
||||
|
|
@ -3431,11 +3436,12 @@ static int __q6asm_open_read(struct audio_client *ac,
|
|||
goto fail_cmd;
|
||||
}
|
||||
if (atomic_read(&ac->cmd_state) > 0) {
|
||||
pr_err("%s: DSP returned error[%s]\n",
|
||||
__func__, adsp_err_get_err_str(
|
||||
atomic_read(&ac->cmd_state)));
|
||||
rc = adsp_err_get_lnx_err_code(
|
||||
atomic_read(&ac->cmd_state));
|
||||
if (rc != -EALREADY)
|
||||
pr_err("%s: DSP returned error[%s]\n",
|
||||
__func__, adsp_err_get_err_str(
|
||||
atomic_read(&ac->cmd_state)));
|
||||
goto fail_cmd;
|
||||
}
|
||||
|
||||
|
|
@ -3734,6 +3740,8 @@ static int __q6asm_open_write(struct audio_client *ac, uint32_t format,
|
|||
open.mode_flags |= ASM_ULTRA_LOW_LATENCY_STREAM_SESSION;
|
||||
else if (ac->perf_mode == LOW_LATENCY_PCM_MODE)
|
||||
open.mode_flags |= ASM_LOW_LATENCY_STREAM_SESSION;
|
||||
else if (ac->perf_mode == LOW_LATENCY_PCM_NOPROC_MODE)
|
||||
open.mode_flags |= ASM_ULTRA_LOW_LATENCY_NPROC_STREAM_SESSION;
|
||||
else {
|
||||
open.mode_flags |= ASM_LEGACY_STREAM_SESSION;
|
||||
if (is_gapless_mode)
|
||||
|
|
@ -3840,11 +3848,12 @@ static int __q6asm_open_write(struct audio_client *ac, uint32_t format,
|
|||
goto fail_cmd;
|
||||
}
|
||||
if (atomic_read(&ac->cmd_state) > 0) {
|
||||
pr_err("%s: DSP returned error[%s]\n",
|
||||
__func__, adsp_err_get_err_str(
|
||||
atomic_read(&ac->cmd_state)));
|
||||
rc = adsp_err_get_lnx_err_code(
|
||||
atomic_read(&ac->cmd_state));
|
||||
if (rc != -EALREADY)
|
||||
pr_err("%s: DSP returned error[%s]\n",
|
||||
__func__, adsp_err_get_err_str(
|
||||
atomic_read(&ac->cmd_state)));
|
||||
goto fail_cmd;
|
||||
}
|
||||
ac->io_mode |= TUN_WRITE_IO_MODE;
|
||||
|
|
@ -4190,11 +4199,12 @@ static int __q6asm_open_read_write(struct audio_client *ac, uint32_t rd_format,
|
|||
goto fail_cmd;
|
||||
}
|
||||
if (atomic_read(&ac->cmd_state) > 0) {
|
||||
pr_err("%s: DSP returned error[%s]\n",
|
||||
__func__, adsp_err_get_err_str(
|
||||
atomic_read(&ac->cmd_state)));
|
||||
rc = adsp_err_get_lnx_err_code(
|
||||
atomic_read(&ac->cmd_state));
|
||||
if (rc != -EALREADY)
|
||||
pr_err("%s: DSP returned error[%s]\n",
|
||||
__func__, adsp_err_get_err_str(
|
||||
atomic_read(&ac->cmd_state)));
|
||||
goto fail_cmd;
|
||||
}
|
||||
|
||||
|
|
|
|||
16
include/dsp/apr_audio-v2.h
Normal file → Executable file
16
include/dsp/apr_audio-v2.h
Normal file → Executable file
|
|
@ -223,6 +223,8 @@ struct adm_cmd_matrix_map_routings_v5 {
|
|||
/* Definition for a low latency stream session. */
|
||||
#define ADM_LOW_LATENCY_DEVICE_SESSION 0x2000
|
||||
|
||||
#define ADM_LOW_LATENCY_NPROC_DEVICE_SESSION 0x6000
|
||||
|
||||
/* Definition for a ultra low latency stream session. */
|
||||
#define ADM_ULTRA_LOW_LATENCY_DEVICE_SESSION 0x4000
|
||||
|
||||
|
|
@ -8100,6 +8102,8 @@ struct asm_session_cmdrsp_get_path_delay_v2 {
|
|||
|
||||
#define ASM_ULTRA_LOW_LATENCY_STREAM_SESSION 0x20000000
|
||||
|
||||
#define ASM_ULTRA_LOW_LATENCY_NPROC_STREAM_SESSION 0x30000000
|
||||
|
||||
#define ASM_ULL_POST_PROCESSING_STREAM_SESSION 0x40000000
|
||||
|
||||
#define ASM_LEGACY_STREAM_SESSION 0
|
||||
|
|
@ -13635,4 +13639,16 @@ struct afe_param_id_port_data_log_disable_t
|
|||
*/
|
||||
} __packed;
|
||||
|
||||
#define AFE_MODULE_LIMITER 0x000102A8
|
||||
#define AFE_PARAM_ID_ENABLE 0x00010203
|
||||
struct afe_param_id_port_afe_limiter_disable_t
|
||||
{
|
||||
uint16_t disable_afe_limiter;
|
||||
/** Flag for enabling or disabling data logging.
|
||||
* @values
|
||||
* - AFE_PORT_DATA_LOGGING_ENABLE - enable data logging.
|
||||
* - AFE_PORT_DATA_LOGGING_DISABLE - disable data logging.
|
||||
*/
|
||||
uint16_t reserved;
|
||||
} __packed;
|
||||
#endif /*_APR_AUDIO_V2_H_ */
|
||||
|
|
|
|||
|
|
@ -591,6 +591,8 @@ int afe_tdm_port_start(u16 port_id, struct afe_tdm_port_config *tdm_port,
|
|||
void afe_set_routing_callback(routing_cb cb);
|
||||
int afe_port_send_logging_cfg(u16 port_id,
|
||||
struct afe_param_id_port_data_log_disable_t *log_disable);
|
||||
int afe_port_send_afe_limiter_param(u16 port_id,
|
||||
struct afe_param_id_port_afe_limiter_disable_t *disable_limiter);
|
||||
int afe_get_av_dev_drift(struct afe_param_id_dev_timing_stats *timing_stats,
|
||||
u16 port);
|
||||
int afe_set_lpass_clk_cfg_ext_mclk_v2(int index,
|
||||
|
|
|
|||
|
|
@ -12,6 +12,7 @@ enum {
|
|||
LEGACY_PCM_MODE = 0,
|
||||
LOW_LATENCY_PCM_MODE,
|
||||
ULTRA_LOW_LATENCY_PCM_MODE,
|
||||
LOW_LATENCY_PCM_NOPROC_MODE,
|
||||
ULL_POST_PROCESSING_PCM_MODE,
|
||||
};
|
||||
|
||||
|
|
|
|||
Loading…
Reference in a new issue