Merge 3fc201fdf1 on remote branch

Change-Id: I0fcf8e623d7cf4abf10a0956d317e3d384391563
This commit is contained in:
Linux Build Service Account 2022-04-14 02:09:07 -07:00
commit 96b18afdd7
29 changed files with 34117 additions and 142 deletions

View file

@ -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/

View file

@ -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
View 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[] = {

View file

@ -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 },

View file

@ -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
View 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
View 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",

View file

@ -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(&param_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

File diff suppressed because it is too large Load diff

275
asoc/msm-pcm-routing-v2.c Normal file → Executable file
View 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

View file

@ -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
View 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
View 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")));

View file

@ -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
View 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
View 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 */
{

View file

@ -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 */
{

View file

@ -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",

View file

@ -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 */

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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
View 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))

View file

@ -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(&param_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;

View file

@ -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
View 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_ */

View file

@ -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,

View file

@ -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,
};