audio-lnx: Add latest snapshot for audio drivers.
Propagate the changes based on latest snapshot for audio kernel source tree at below cutoff of kernel msm-4.9 - (aed56b2df75 - "drm/msm/sde: update te vsync enable sequence change") Change-Id: I7ed5102146986b81e5cb9ca55432360b3549b60c Signed-off-by: Laxminath Kasam <lkasam@codeaurora.org>
This commit is contained in:
parent
8c87858751
commit
38070be30b
26 changed files with 1192 additions and 177 deletions
|
@ -938,7 +938,7 @@ static int msm_sdw_vi_feed_mixer_get(struct snd_kcontrol *kcontrol,
|
|||
struct snd_ctl_elem_value *ucontrol)
|
||||
{
|
||||
struct snd_soc_dapm_widget *widget =
|
||||
snd_soc_dapm_kcontrol_widget(kcontrol);
|
||||
snd_soc_dapm_kcontrol_widget(kcontrol);
|
||||
struct snd_soc_codec *codec = snd_soc_dapm_to_codec(widget->dapm);
|
||||
struct msm_sdw_priv *msm_sdw_p = snd_soc_codec_get_drvdata(codec);
|
||||
|
||||
|
@ -951,7 +951,7 @@ static int msm_sdw_vi_feed_mixer_put(struct snd_kcontrol *kcontrol,
|
|||
struct snd_ctl_elem_value *ucontrol)
|
||||
{
|
||||
struct snd_soc_dapm_widget *widget =
|
||||
snd_soc_dapm_kcontrol_widget(kcontrol);
|
||||
snd_soc_dapm_kcontrol_widget(kcontrol);
|
||||
struct snd_soc_codec *codec = snd_soc_dapm_to_codec(widget->dapm);
|
||||
struct msm_sdw_priv *msm_sdw_p = snd_soc_codec_get_drvdata(codec);
|
||||
struct soc_multi_mixer_control *mixer =
|
||||
|
@ -1376,15 +1376,19 @@ int msm_sdw_codec_info_create_codec_entry(struct snd_info_entry *codec_root,
|
|||
struct snd_info_entry *version_entry;
|
||||
struct msm_sdw_priv *msm_sdw;
|
||||
struct snd_soc_card *card;
|
||||
char name[80];
|
||||
|
||||
if (!codec_root || !codec)
|
||||
return -EINVAL;
|
||||
|
||||
msm_sdw = snd_soc_codec_get_drvdata(codec);
|
||||
card = codec->component.card;
|
||||
|
||||
snprintf(name, sizeof(name), "%x.%s", (u32)msm_sdw->sdw_base_addr,
|
||||
"msm-sdw-codec");
|
||||
msm_sdw->entry = snd_info_create_subdir(codec_root->module,
|
||||
"152c1000.msm-sdw-codec",
|
||||
codec_root);
|
||||
(const char *)name,
|
||||
codec_root);
|
||||
if (!msm_sdw->entry) {
|
||||
dev_err(codec->dev, "%s: failed to create msm_sdw entry\n",
|
||||
__func__);
|
||||
|
|
|
@ -179,6 +179,8 @@ struct wcd9xxx_pdata {
|
|||
int irq_base;
|
||||
int num_irqs;
|
||||
int reset_gpio;
|
||||
bool has_buck_vsel_gpio;
|
||||
struct device_node *buck_vsel_ctl_np;
|
||||
struct device_node *wcd_rst_np;
|
||||
struct wcd9xxx_amic amic_settings;
|
||||
struct slim_device slimbus_slave_device;
|
||||
|
|
|
@ -417,22 +417,23 @@ static int wdsp_download_segments(struct wdsp_mgr_priv *wdsp,
|
|||
/* Go through the list of segments and download one by one */
|
||||
list_for_each_entry(seg, wdsp->seg_list, list) {
|
||||
ret = wdsp_load_each_segment(wdsp, seg);
|
||||
if (ret < 0) {
|
||||
wdsp_broadcast_event_downseq(wdsp,
|
||||
WDSP_EVENT_DLOAD_FAILED,
|
||||
NULL);
|
||||
if (ret)
|
||||
goto dload_error;
|
||||
}
|
||||
}
|
||||
|
||||
/* Flush the list before setting status and notifying components */
|
||||
wdsp_flush_segment_list(wdsp->seg_list);
|
||||
|
||||
WDSP_SET_STATUS(wdsp, status);
|
||||
|
||||
/* Notify all components that image is downloaded */
|
||||
wdsp_broadcast_event_downseq(wdsp, post, NULL);
|
||||
done:
|
||||
return ret;
|
||||
|
||||
dload_error:
|
||||
wdsp_flush_segment_list(wdsp->seg_list);
|
||||
done:
|
||||
wdsp_broadcast_event_downseq(wdsp, WDSP_EVENT_DLOAD_FAILED, NULL);
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
@ -486,10 +487,14 @@ static int wdsp_enable_dsp(struct wdsp_mgr_priv *wdsp)
|
|||
/* Make sure wdsp is in good state */
|
||||
if (!WDSP_STATUS_IS_SET(wdsp, WDSP_STATUS_CODE_DLOADED)) {
|
||||
WDSP_ERR(wdsp, "WDSP in invalid state 0x%x", wdsp->status);
|
||||
ret = -EINVAL;
|
||||
goto done;
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
/*
|
||||
* Acquire SSR mutex lock to make sure enablement of DSP
|
||||
* does not race with SSR handling.
|
||||
*/
|
||||
WDSP_MGR_MUTEX_LOCK(wdsp, wdsp->ssr_mutex);
|
||||
/* Download the read-write sections of image */
|
||||
ret = wdsp_download_segments(wdsp, WDSP_ELF_FLAG_WRITE);
|
||||
if (ret < 0) {
|
||||
|
@ -510,6 +515,7 @@ static int wdsp_enable_dsp(struct wdsp_mgr_priv *wdsp)
|
|||
wdsp_broadcast_event_downseq(wdsp, WDSP_EVENT_POST_BOOTUP, NULL);
|
||||
WDSP_SET_STATUS(wdsp, WDSP_STATUS_BOOTED);
|
||||
done:
|
||||
WDSP_MGR_MUTEX_UNLOCK(wdsp, wdsp->ssr_mutex);
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
|
|
@ -763,10 +763,6 @@ static int wcd_control_handler(struct device *dev, void *priv_data,
|
|||
case WDSP_EVENT_DLOAD_FAILED:
|
||||
case WDSP_EVENT_POST_SHUTDOWN:
|
||||
|
||||
if (event == WDSP_EVENT_POST_DLOAD_CODE)
|
||||
/* Mark DSP online since code download is complete */
|
||||
wcd_cntl_change_online_state(cntl, 1);
|
||||
|
||||
/* Disable CPAR */
|
||||
wcd_cntl_cpar_ctrl(cntl, false);
|
||||
/* Disable all the clocks */
|
||||
|
@ -775,6 +771,10 @@ static int wcd_control_handler(struct device *dev, void *priv_data,
|
|||
dev_err(codec->dev,
|
||||
"%s: Failed to disable clocks, err = %d\n",
|
||||
__func__, ret);
|
||||
|
||||
if (event == WDSP_EVENT_POST_DLOAD_CODE)
|
||||
/* Mark DSP online since code download is complete */
|
||||
wcd_cntl_change_online_state(cntl, 1);
|
||||
break;
|
||||
|
||||
case WDSP_EVENT_PRE_DLOAD_DATA:
|
||||
|
|
|
@ -1280,6 +1280,10 @@ static int wcd9xxx_slim_probe(struct slim_device *slim)
|
|||
ret = -EINVAL;
|
||||
goto err_codec;
|
||||
}
|
||||
|
||||
if (pdata->has_buck_vsel_gpio)
|
||||
msm_cdc_pinctrl_select_active_state(pdata->buck_vsel_ctl_np);
|
||||
|
||||
device_id = slim_get_device_id(slim);
|
||||
if (!device_id) {
|
||||
dev_err(&slim->dev, "%s: Error, no device id\n", __func__);
|
||||
|
|
|
@ -342,6 +342,19 @@ struct wcd9xxx_pdata *wcd9xxx_populate_dt_data(struct device *dev)
|
|||
goto err_parse_dt_prop;
|
||||
}
|
||||
|
||||
pdata->has_buck_vsel_gpio = of_property_read_bool(dev->of_node,
|
||||
"qcom,has-buck-vsel-gpio");
|
||||
if (pdata->has_buck_vsel_gpio) {
|
||||
pdata->buck_vsel_ctl_np = of_parse_phandle(dev->of_node,
|
||||
"qcom,buck-vsel-gpio-node", 0);
|
||||
if (!pdata->buck_vsel_ctl_np) {
|
||||
dev_err(dev, "%s No entry for %s property in node %s\n",
|
||||
__func__, "qcom,buck-vsel-gpio-node",
|
||||
dev->of_node->full_name);
|
||||
goto err_parse_dt_prop;
|
||||
}
|
||||
}
|
||||
|
||||
if (!(wcd9xxx_read_of_property_u32(dev, "qcom,cdc-mclk-clk-rate",
|
||||
&prop_val)))
|
||||
pdata->mclk_rate = prop_val;
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
/* Copyright (c) 2015-2016, The Linux Foundation. All rights reserved.
|
||||
/* Copyright (c) 2015-2017, The Linux Foundation. All rights reserved.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 and
|
||||
|
@ -20,9 +20,10 @@
|
|||
|
||||
#define WSA881X_MAX_SWR_PORTS 4
|
||||
|
||||
#if IS_ENABLED(CONFIG_SND_SOC_WSA881X)
|
||||
extern int wsa881x_set_channel_map(struct snd_soc_codec *codec, u8 *port,
|
||||
u8 num_port, unsigned int *ch_mask,
|
||||
unsigned int *ch_rate);
|
||||
u8 num_port, unsigned int *ch_mask,
|
||||
unsigned int *ch_rate);
|
||||
|
||||
extern const u8 wsa881x_reg_readable[WSA881X_CACHE_SIZE];
|
||||
extern struct regmap_config wsa881x_regmap_config;
|
||||
|
@ -31,4 +32,25 @@ extern int wsa881x_codec_info_create_codec_entry(
|
|||
struct snd_soc_codec *codec);
|
||||
void wsa881x_regmap_defaults(struct regmap *regmap, u8 version);
|
||||
|
||||
#else
|
||||
extern int wsa881x_set_channel_map(struct snd_soc_codec *codec, u8 *port,
|
||||
u8 num_port, unsigned int *ch_mask,
|
||||
unsigned int *ch_rate)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
extern int wsa881x_codec_info_create_codec_entry(
|
||||
struct snd_info_entry *codec_root,
|
||||
struct snd_soc_codec *codec)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
void wsa881x_regmap_defaults(struct regmap *regmap, u8 version)
|
||||
{
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
#endif /* _WSA881X_H */
|
||||
|
|
|
@ -154,7 +154,7 @@ int msm_audio_effects_virtualizer_handler(struct audio_client *ac,
|
|||
MAX_INBAND_PARAM_SZ,
|
||||
"VIRT ENABLE", rc);
|
||||
if (rc != 0)
|
||||
break;
|
||||
goto invalid_config;
|
||||
*updt_params++ =
|
||||
AUDPROC_MODULE_ID_VIRTUALIZER;
|
||||
*updt_params++ =
|
||||
|
@ -182,7 +182,7 @@ int msm_audio_effects_virtualizer_handler(struct audio_client *ac,
|
|||
MAX_INBAND_PARAM_SZ,
|
||||
"VIRT STRENGTH", rc);
|
||||
if (rc != 0)
|
||||
break;
|
||||
goto invalid_config;
|
||||
*updt_params++ =
|
||||
AUDPROC_MODULE_ID_VIRTUALIZER;
|
||||
*updt_params++ =
|
||||
|
@ -210,7 +210,7 @@ int msm_audio_effects_virtualizer_handler(struct audio_client *ac,
|
|||
MAX_INBAND_PARAM_SZ,
|
||||
"VIRT OUT_TYPE", rc);
|
||||
if (rc != 0)
|
||||
break;
|
||||
goto invalid_config;
|
||||
*updt_params++ =
|
||||
AUDPROC_MODULE_ID_VIRTUALIZER;
|
||||
*updt_params++ =
|
||||
|
@ -238,7 +238,7 @@ int msm_audio_effects_virtualizer_handler(struct audio_client *ac,
|
|||
MAX_INBAND_PARAM_SZ,
|
||||
"VIRT GAIN_ADJUST", rc);
|
||||
if (rc != 0)
|
||||
break;
|
||||
goto invalid_config;
|
||||
*updt_params++ =
|
||||
AUDPROC_MODULE_ID_VIRTUALIZER;
|
||||
*updt_params++ =
|
||||
|
@ -316,7 +316,7 @@ int msm_audio_effects_reverb_handler(struct audio_client *ac,
|
|||
MAX_INBAND_PARAM_SZ,
|
||||
"REVERB_ENABLE", rc);
|
||||
if (rc != 0)
|
||||
break;
|
||||
goto invalid_config;
|
||||
*updt_params++ =
|
||||
AUDPROC_MODULE_ID_REVERB;
|
||||
*updt_params++ =
|
||||
|
@ -344,7 +344,7 @@ int msm_audio_effects_reverb_handler(struct audio_client *ac,
|
|||
MAX_INBAND_PARAM_SZ,
|
||||
"REVERB_MODE", rc);
|
||||
if (rc != 0)
|
||||
break;
|
||||
goto invalid_config;
|
||||
*updt_params++ =
|
||||
AUDPROC_MODULE_ID_REVERB;
|
||||
*updt_params++ =
|
||||
|
@ -372,7 +372,7 @@ int msm_audio_effects_reverb_handler(struct audio_client *ac,
|
|||
MAX_INBAND_PARAM_SZ,
|
||||
"REVERB_PRESET", rc);
|
||||
if (rc != 0)
|
||||
break;
|
||||
goto invalid_config;
|
||||
*updt_params++ =
|
||||
AUDPROC_MODULE_ID_REVERB;
|
||||
*updt_params++ =
|
||||
|
@ -400,7 +400,7 @@ int msm_audio_effects_reverb_handler(struct audio_client *ac,
|
|||
MAX_INBAND_PARAM_SZ,
|
||||
"REVERB_WET_MIX", rc);
|
||||
if (rc != 0)
|
||||
break;
|
||||
goto invalid_config;
|
||||
*updt_params++ =
|
||||
AUDPROC_MODULE_ID_REVERB;
|
||||
*updt_params++ =
|
||||
|
@ -428,7 +428,7 @@ int msm_audio_effects_reverb_handler(struct audio_client *ac,
|
|||
MAX_INBAND_PARAM_SZ,
|
||||
"REVERB_GAIN_ADJUST", rc);
|
||||
if (rc != 0)
|
||||
break;
|
||||
goto invalid_config;
|
||||
*updt_params++ =
|
||||
AUDPROC_MODULE_ID_REVERB;
|
||||
*updt_params++ =
|
||||
|
@ -456,7 +456,7 @@ int msm_audio_effects_reverb_handler(struct audio_client *ac,
|
|||
MAX_INBAND_PARAM_SZ,
|
||||
"REVERB_ROOM_LEVEL", rc);
|
||||
if (rc != 0)
|
||||
break;
|
||||
goto invalid_config;
|
||||
*updt_params++ =
|
||||
AUDPROC_MODULE_ID_REVERB;
|
||||
*updt_params++ =
|
||||
|
@ -484,7 +484,7 @@ int msm_audio_effects_reverb_handler(struct audio_client *ac,
|
|||
MAX_INBAND_PARAM_SZ,
|
||||
"REVERB_ROOM_HF_LEVEL", rc);
|
||||
if (rc != 0)
|
||||
break;
|
||||
goto invalid_config;
|
||||
*updt_params++ =
|
||||
AUDPROC_MODULE_ID_REVERB;
|
||||
*updt_params++ =
|
||||
|
@ -512,7 +512,7 @@ int msm_audio_effects_reverb_handler(struct audio_client *ac,
|
|||
MAX_INBAND_PARAM_SZ,
|
||||
"REVERB_DECAY_TIME", rc);
|
||||
if (rc != 0)
|
||||
break;
|
||||
goto invalid_config;
|
||||
*updt_params++ =
|
||||
AUDPROC_MODULE_ID_REVERB;
|
||||
*updt_params++ =
|
||||
|
@ -540,7 +540,7 @@ int msm_audio_effects_reverb_handler(struct audio_client *ac,
|
|||
MAX_INBAND_PARAM_SZ,
|
||||
"REVERB_DECAY_HF_RATIO", rc);
|
||||
if (rc != 0)
|
||||
break;
|
||||
goto invalid_config;
|
||||
*updt_params++ =
|
||||
AUDPROC_MODULE_ID_REVERB;
|
||||
*updt_params++ =
|
||||
|
@ -568,7 +568,7 @@ int msm_audio_effects_reverb_handler(struct audio_client *ac,
|
|||
MAX_INBAND_PARAM_SZ,
|
||||
"REVERB_REFLECTIONS_LEVEL", rc);
|
||||
if (rc != 0)
|
||||
break;
|
||||
goto invalid_config;
|
||||
*updt_params++ =
|
||||
AUDPROC_MODULE_ID_REVERB;
|
||||
*updt_params++ =
|
||||
|
@ -596,7 +596,7 @@ int msm_audio_effects_reverb_handler(struct audio_client *ac,
|
|||
MAX_INBAND_PARAM_SZ,
|
||||
"REVERB_REFLECTIONS_DELAY", rc);
|
||||
if (rc != 0)
|
||||
break;
|
||||
goto invalid_config;
|
||||
*updt_params++ =
|
||||
AUDPROC_MODULE_ID_REVERB;
|
||||
*updt_params++ =
|
||||
|
@ -624,7 +624,7 @@ int msm_audio_effects_reverb_handler(struct audio_client *ac,
|
|||
MAX_INBAND_PARAM_SZ,
|
||||
"REVERB_LEVEL", rc);
|
||||
if (rc != 0)
|
||||
break;
|
||||
goto invalid_config;
|
||||
*updt_params++ =
|
||||
AUDPROC_MODULE_ID_REVERB;
|
||||
*updt_params++ =
|
||||
|
@ -652,7 +652,7 @@ int msm_audio_effects_reverb_handler(struct audio_client *ac,
|
|||
MAX_INBAND_PARAM_SZ,
|
||||
"REVERB_DELAY", rc);
|
||||
if (rc != 0)
|
||||
break;
|
||||
goto invalid_config;
|
||||
*updt_params++ =
|
||||
AUDPROC_MODULE_ID_REVERB;
|
||||
*updt_params++ =
|
||||
|
@ -680,7 +680,7 @@ int msm_audio_effects_reverb_handler(struct audio_client *ac,
|
|||
MAX_INBAND_PARAM_SZ,
|
||||
"REVERB_DIFFUSION", rc);
|
||||
if (rc != 0)
|
||||
break;
|
||||
goto invalid_config;
|
||||
*updt_params++ =
|
||||
AUDPROC_MODULE_ID_REVERB;
|
||||
*updt_params++ =
|
||||
|
@ -708,7 +708,7 @@ int msm_audio_effects_reverb_handler(struct audio_client *ac,
|
|||
MAX_INBAND_PARAM_SZ,
|
||||
"REVERB_DENSITY", rc);
|
||||
if (rc != 0)
|
||||
break;
|
||||
goto invalid_config;
|
||||
*updt_params++ =
|
||||
AUDPROC_MODULE_ID_REVERB;
|
||||
*updt_params++ =
|
||||
|
@ -787,7 +787,7 @@ int msm_audio_effects_bass_boost_handler(struct audio_client *ac,
|
|||
MAX_INBAND_PARAM_SZ,
|
||||
"BASS_BOOST_ENABLE", rc);
|
||||
if (rc != 0)
|
||||
break;
|
||||
goto invalid_config;
|
||||
*updt_params++ =
|
||||
AUDPROC_MODULE_ID_BASS_BOOST;
|
||||
*updt_params++ =
|
||||
|
@ -815,7 +815,7 @@ int msm_audio_effects_bass_boost_handler(struct audio_client *ac,
|
|||
MAX_INBAND_PARAM_SZ,
|
||||
"BASS_BOOST_MODE", rc);
|
||||
if (rc != 0)
|
||||
break;
|
||||
goto invalid_config;
|
||||
*updt_params++ =
|
||||
AUDPROC_MODULE_ID_BASS_BOOST;
|
||||
*updt_params++ =
|
||||
|
@ -843,7 +843,7 @@ int msm_audio_effects_bass_boost_handler(struct audio_client *ac,
|
|||
MAX_INBAND_PARAM_SZ,
|
||||
"BASS_BOOST_STRENGTH", rc);
|
||||
if (rc != 0)
|
||||
break;
|
||||
goto invalid_config;
|
||||
*updt_params++ =
|
||||
AUDPROC_MODULE_ID_BASS_BOOST;
|
||||
*updt_params++ =
|
||||
|
@ -920,7 +920,7 @@ int msm_audio_effects_pbe_handler(struct audio_client *ac,
|
|||
MAX_INBAND_PARAM_SZ,
|
||||
"PBE_ENABLE", rc);
|
||||
if (rc != 0)
|
||||
break;
|
||||
goto invalid_config;
|
||||
*updt_params++ =
|
||||
AUDPROC_MODULE_ID_PBE;
|
||||
*updt_params++ =
|
||||
|
@ -946,7 +946,7 @@ int msm_audio_effects_pbe_handler(struct audio_client *ac,
|
|||
MAX_INBAND_PARAM_SZ,
|
||||
"PBE_PARAM", rc);
|
||||
if (rc != 0)
|
||||
break;
|
||||
goto invalid_config;
|
||||
*updt_params++ =
|
||||
AUDPROC_MODULE_ID_PBE;
|
||||
*updt_params++ =
|
||||
|
@ -1031,7 +1031,7 @@ int msm_audio_effects_popless_eq_handler(struct audio_client *ac,
|
|||
MAX_INBAND_PARAM_SZ,
|
||||
"EQ_ENABLE", rc);
|
||||
if (rc != 0)
|
||||
break;
|
||||
goto invalid_config;
|
||||
*updt_params++ =
|
||||
AUDPROC_MODULE_ID_POPLESS_EQUALIZER;
|
||||
*updt_params++ =
|
||||
|
@ -1099,7 +1099,7 @@ int msm_audio_effects_popless_eq_handler(struct audio_client *ac,
|
|||
MAX_INBAND_PARAM_SZ,
|
||||
"EQ_CONFIG", rc);
|
||||
if (rc != 0)
|
||||
break;
|
||||
goto invalid_config;
|
||||
*updt_params++ =
|
||||
AUDPROC_MODULE_ID_POPLESS_EQUALIZER;
|
||||
*updt_params++ =
|
||||
|
@ -1150,7 +1150,7 @@ int msm_audio_effects_popless_eq_handler(struct audio_client *ac,
|
|||
MAX_INBAND_PARAM_SZ,
|
||||
"EQ_BAND_INDEX", rc);
|
||||
if (rc != 0)
|
||||
break;
|
||||
goto invalid_config;
|
||||
*updt_params++ =
|
||||
AUDPROC_MODULE_ID_POPLESS_EQUALIZER;
|
||||
*updt_params++ =
|
||||
|
@ -1182,7 +1182,7 @@ int msm_audio_effects_popless_eq_handler(struct audio_client *ac,
|
|||
MAX_INBAND_PARAM_SZ,
|
||||
"EQ_SINGLE_BAND_FREQ", rc);
|
||||
if (rc != 0)
|
||||
break;
|
||||
goto invalid_config;
|
||||
*updt_params++ =
|
||||
AUDPROC_MODULE_ID_POPLESS_EQUALIZER;
|
||||
*updt_params++ =
|
||||
|
@ -1271,7 +1271,7 @@ static int __msm_audio_effects_volume_handler(struct audio_client *ac,
|
|||
"VOLUME/VOLUME2_GAIN_2CH",
|
||||
rc);
|
||||
if (rc != 0)
|
||||
break;
|
||||
goto invalid_config;
|
||||
if (instance == SOFT_VOLUME_INSTANCE_2)
|
||||
*updt_params++ =
|
||||
ASM_MODULE_ID_VOL_CTRL2;
|
||||
|
@ -1320,7 +1320,7 @@ static int __msm_audio_effects_volume_handler(struct audio_client *ac,
|
|||
"VOLUME/VOLUME2_GAIN_MASTER",
|
||||
rc);
|
||||
if (rc != 0)
|
||||
break;
|
||||
goto invalid_config;
|
||||
if (instance == SOFT_VOLUME_INSTANCE_2)
|
||||
*updt_params++ =
|
||||
ASM_MODULE_ID_VOL_CTRL2;
|
||||
|
|
|
@ -2376,8 +2376,20 @@ static struct snd_soc_dai_driver msm_fe_dais[] = {
|
|||
.rate_min = 8000,
|
||||
.rate_max = 384000,
|
||||
},
|
||||
.capture = {
|
||||
.stream_name = "MultiMedia10 Capture",
|
||||
.aif_name = "MM_UL10",
|
||||
.rates = (SNDRV_PCM_RATE_8000_48000 |
|
||||
SNDRV_PCM_RATE_KNOT),
|
||||
.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 = 48000,
|
||||
},
|
||||
.ops = &msm_fe_Multimedia_dai_ops,
|
||||
.compress_new = snd_soc_new_compress,
|
||||
.name = "MultiMedia10",
|
||||
.probe = fe_dai_probe,
|
||||
},
|
||||
|
|
|
@ -1682,7 +1682,7 @@ static int msm_lsm_ioctl(struct snd_pcm_substream *substream,
|
|||
dev_err(rtd->dev,
|
||||
"%s REG_SND_MODEL failed err %d\n",
|
||||
__func__, err);
|
||||
return err;
|
||||
goto done;
|
||||
}
|
||||
break;
|
||||
case SNDRV_LSM_SET_PARAMS: {
|
||||
|
@ -1852,13 +1852,15 @@ static int msm_lsm_ioctl(struct snd_pcm_substream *substream,
|
|||
dev_err(rtd->dev,
|
||||
"%s: Invalid params event_status_v3\n",
|
||||
__func__);
|
||||
return -EINVAL;
|
||||
err = -EINVAL;
|
||||
goto done;
|
||||
}
|
||||
if (copy_from_user(&userarg, arg, sizeof(userarg))) {
|
||||
dev_err(rtd->dev,
|
||||
"%s: err copyuser event_status_v3\n",
|
||||
__func__);
|
||||
return -EFAULT;
|
||||
err = -EFAULT;
|
||||
goto done;
|
||||
}
|
||||
|
||||
if (userarg.payload_size >
|
||||
|
@ -1866,7 +1868,8 @@ static int msm_lsm_ioctl(struct snd_pcm_substream *substream,
|
|||
pr_err("%s: payload_size %d is invalid, max allowed = %d\n",
|
||||
__func__, userarg.payload_size,
|
||||
LISTEN_MAX_STATUS_PAYLOAD_SIZE);
|
||||
return -EINVAL;
|
||||
err = -EINVAL;
|
||||
goto done;
|
||||
}
|
||||
|
||||
size = sizeof(struct snd_lsm_event_status_v3) +
|
||||
|
@ -1876,7 +1879,8 @@ static int msm_lsm_ioctl(struct snd_pcm_substream *substream,
|
|||
dev_err(rtd->dev,
|
||||
"%s: Allocation failed event status size %d\n",
|
||||
__func__, size);
|
||||
return -EFAULT;
|
||||
err = -EFAULT;
|
||||
goto done;
|
||||
}
|
||||
user->payload_size = userarg.payload_size;
|
||||
err = msm_lsm_ioctl_shared(substream, cmd, user);
|
||||
|
|
|
@ -1093,7 +1093,7 @@ int msm_pcm_routing_reg_phy_compr_stream(int fe_id, int perf_mode,
|
|||
port_type = MSM_AFE_PORT_TYPE_RX;
|
||||
} else if (stream_type == SNDRV_PCM_STREAM_CAPTURE) {
|
||||
session_type = SESSION_TYPE_TX;
|
||||
if (passthr_mode != LEGACY_PCM)
|
||||
if ((passthr_mode != LEGACY_PCM) && (passthr_mode != LISTEN))
|
||||
path_type = ADM_PATH_COMPRESSED_TX;
|
||||
else
|
||||
path_type = ADM_PATH_LIVE_REC;
|
||||
|
@ -3645,6 +3645,11 @@ static const struct snd_kcontrol_new ext_ec_ref_mux_ul16 =
|
|||
msm_route_ec_ref_rx_enum[0],
|
||||
msm_routing_ec_ref_rx_get, msm_routing_ec_ref_rx_put);
|
||||
|
||||
static const struct snd_kcontrol_new ext_ec_ref_mux_ul10 =
|
||||
SOC_DAPM_ENUM_EXT("AUDIO_REF_EC_UL10 MUX Mux",
|
||||
msm_route_ec_ref_rx_enum[0],
|
||||
msm_routing_ec_ref_rx_get, msm_routing_ec_ref_rx_put);
|
||||
|
||||
static const struct snd_kcontrol_new ext_ec_ref_mux_ul17 =
|
||||
SOC_DAPM_ENUM_EXT("AUDIO_REF_EC_UL17 MUX Mux",
|
||||
msm_route_ec_ref_rx_enum[0],
|
||||
|
@ -7251,6 +7256,59 @@ static const struct snd_kcontrol_new mmul9_mixer_controls[] = {
|
|||
msm_routing_put_audio_mixer),
|
||||
};
|
||||
|
||||
static const struct snd_kcontrol_new mmul10_mixer_controls[] = {
|
||||
SOC_SINGLE_EXT("SLIM_0_TX", MSM_BACKEND_DAI_SLIMBUS_0_TX,
|
||||
MSM_FRONTEND_DAI_MULTIMEDIA10, 1, 0, msm_routing_get_audio_mixer,
|
||||
msm_routing_put_audio_mixer),
|
||||
SOC_SINGLE_EXT("PRI_MI2S_TX", MSM_BACKEND_DAI_PRI_MI2S_TX,
|
||||
MSM_FRONTEND_DAI_MULTIMEDIA10, 1, 0, msm_routing_get_audio_mixer,
|
||||
msm_routing_put_audio_mixer),
|
||||
SOC_SINGLE_EXT("INTERNAL_FM_TX", MSM_BACKEND_DAI_INT_FM_TX,
|
||||
MSM_FRONTEND_DAI_MULTIMEDIA10, 1, 0, msm_routing_get_audio_mixer,
|
||||
msm_routing_put_audio_mixer),
|
||||
SOC_SINGLE_EXT("INTERNAL_BT_SCO_TX", MSM_BACKEND_DAI_INT_BT_SCO_TX,
|
||||
MSM_FRONTEND_DAI_MULTIMEDIA10, 1, 0, msm_routing_get_audio_mixer,
|
||||
msm_routing_put_audio_mixer),
|
||||
SOC_SINGLE_EXT("AFE_PCM_TX", MSM_BACKEND_DAI_AFE_PCM_TX,
|
||||
MSM_FRONTEND_DAI_MULTIMEDIA10, 1, 0, msm_routing_get_audio_mixer,
|
||||
msm_routing_put_audio_mixer),
|
||||
SOC_SINGLE_EXT("VOC_REC_DL", MSM_BACKEND_DAI_INCALL_RECORD_RX,
|
||||
MSM_FRONTEND_DAI_MULTIMEDIA10, 1, 0, msm_routing_get_audio_mixer,
|
||||
msm_routing_put_audio_mixer),
|
||||
SOC_SINGLE_EXT("VOC_REC_UL", MSM_BACKEND_DAI_INCALL_RECORD_TX,
|
||||
MSM_FRONTEND_DAI_MULTIMEDIA10, 1, 0, msm_routing_get_audio_mixer,
|
||||
msm_routing_put_audio_mixer),
|
||||
SOC_SINGLE_EXT("SLIM_6_TX", MSM_BACKEND_DAI_SLIMBUS_6_TX,
|
||||
MSM_FRONTEND_DAI_MULTIMEDIA10, 1, 0, msm_routing_get_audio_mixer,
|
||||
msm_routing_put_audio_mixer),
|
||||
SOC_SINGLE_EXT("TERT_TDM_TX_0", MSM_BACKEND_DAI_TERT_TDM_TX_0,
|
||||
MSM_FRONTEND_DAI_MULTIMEDIA10, 1, 0, msm_routing_get_audio_mixer,
|
||||
msm_routing_put_audio_mixer),
|
||||
SOC_SINGLE_EXT("TERT_TDM_TX_1", MSM_BACKEND_DAI_TERT_TDM_TX_1,
|
||||
MSM_FRONTEND_DAI_MULTIMEDIA10, 1, 0, msm_routing_get_audio_mixer,
|
||||
msm_routing_put_audio_mixer),
|
||||
SOC_SINGLE_EXT("TERT_TDM_TX_2", MSM_BACKEND_DAI_TERT_TDM_TX_2,
|
||||
MSM_FRONTEND_DAI_MULTIMEDIA10, 1, 0, msm_routing_get_audio_mixer,
|
||||
msm_routing_put_audio_mixer),
|
||||
SOC_SINGLE_EXT("TERT_TDM_TX_3", MSM_BACKEND_DAI_TERT_TDM_TX_3,
|
||||
MSM_FRONTEND_DAI_MULTIMEDIA10, 1, 0, msm_routing_get_audio_mixer,
|
||||
msm_routing_put_audio_mixer),
|
||||
SOC_SINGLE_EXT("QUAT_TDM_TX_0", MSM_BACKEND_DAI_QUAT_TDM_TX_0,
|
||||
MSM_FRONTEND_DAI_MULTIMEDIA10, 1, 0, msm_routing_get_audio_mixer,
|
||||
msm_routing_put_audio_mixer),
|
||||
SOC_SINGLE_EXT("QUAT_TDM_TX_1", MSM_BACKEND_DAI_QUAT_TDM_TX_1,
|
||||
MSM_FRONTEND_DAI_MULTIMEDIA10, 1, 0, msm_routing_get_audio_mixer,
|
||||
msm_routing_put_audio_mixer),
|
||||
SOC_SINGLE_EXT("QUAT_TDM_TX_2", MSM_BACKEND_DAI_QUAT_TDM_TX_2,
|
||||
MSM_FRONTEND_DAI_MULTIMEDIA10, 1, 0, msm_routing_get_audio_mixer,
|
||||
msm_routing_put_audio_mixer),
|
||||
SOC_SINGLE_EXT("QUAT_TDM_TX_3", MSM_BACKEND_DAI_QUAT_TDM_TX_3,
|
||||
MSM_FRONTEND_DAI_MULTIMEDIA10, 1, 0, msm_routing_get_audio_mixer,
|
||||
msm_routing_put_audio_mixer),
|
||||
SOC_SINGLE_EXT("USB_AUDIO_TX", MSM_BACKEND_DAI_USB_TX,
|
||||
MSM_FRONTEND_DAI_MULTIMEDIA10, 1, 0, msm_routing_get_audio_mixer,
|
||||
msm_routing_put_audio_mixer),
|
||||
};
|
||||
static const struct snd_kcontrol_new mmul17_mixer_controls[] = {
|
||||
SOC_SINGLE_EXT("SLIM_0_TX", MSM_BACKEND_DAI_SLIMBUS_0_TX,
|
||||
MSM_FRONTEND_DAI_MULTIMEDIA17, 1, 0, msm_routing_get_audio_mixer,
|
||||
|
@ -11489,6 +11547,7 @@ static const struct snd_soc_dapm_widget msm_qdsp6_widgets[] = {
|
|||
SND_SOC_DAPM_AIF_OUT("MM_UL6", "MultiMedia6 Capture", 0, 0, 0, 0),
|
||||
SND_SOC_DAPM_AIF_OUT("MM_UL8", "MultiMedia8 Capture", 0, 0, 0, 0),
|
||||
SND_SOC_DAPM_AIF_OUT("MM_UL9", "MultiMedia9 Capture", 0, 0, 0, 0),
|
||||
SND_SOC_DAPM_AIF_OUT("MM_UL10", "MultiMedia10 Capture", 0, 0, 0, 0),
|
||||
SND_SOC_DAPM_AIF_OUT("MM_UL16", "MultiMedia16 Capture", 0, 0, 0, 0),
|
||||
SND_SOC_DAPM_AIF_OUT("MM_UL17", "MultiMedia17 Capture", 0, 0, 0, 0),
|
||||
SND_SOC_DAPM_AIF_OUT("MM_UL18", "MultiMedia18 Capture", 0, 0, 0, 0),
|
||||
|
@ -12225,6 +12284,8 @@ static const struct snd_soc_dapm_widget msm_qdsp6_widgets[] = {
|
|||
mmul8_mixer_controls, ARRAY_SIZE(mmul8_mixer_controls)),
|
||||
SND_SOC_DAPM_MIXER("MultiMedia9 Mixer", SND_SOC_NOPM, 0, 0,
|
||||
mmul9_mixer_controls, ARRAY_SIZE(mmul9_mixer_controls)),
|
||||
SND_SOC_DAPM_MIXER("MultiMedia10 Mixer", SND_SOC_NOPM, 0, 0,
|
||||
mmul10_mixer_controls, ARRAY_SIZE(mmul10_mixer_controls)),
|
||||
SND_SOC_DAPM_MIXER("MultiMedia16 Mixer", SND_SOC_NOPM, 0, 0,
|
||||
mmul16_mixer_controls, ARRAY_SIZE(mmul16_mixer_controls)),
|
||||
SND_SOC_DAPM_MIXER("MultiMedia17 Mixer", SND_SOC_NOPM, 0, 0,
|
||||
|
@ -12557,6 +12618,8 @@ static const struct snd_soc_dapm_widget msm_qdsp6_widgets[] = {
|
|||
&ext_ec_ref_mux_ul8),
|
||||
SND_SOC_DAPM_MUX("AUDIO_REF_EC_UL9 MUX", SND_SOC_NOPM, 0, 0,
|
||||
&ext_ec_ref_mux_ul9),
|
||||
SND_SOC_DAPM_MUX("AUDIO_REF_EC_UL10 MUX", SND_SOC_NOPM, 0, 0,
|
||||
&ext_ec_ref_mux_ul10),
|
||||
SND_SOC_DAPM_MUX("AUDIO_REF_EC_UL16 MUX", SND_SOC_NOPM, 0, 0,
|
||||
&ext_ec_ref_mux_ul16),
|
||||
SND_SOC_DAPM_MUX("AUDIO_REF_EC_UL17 MUX", SND_SOC_NOPM, 0, 0,
|
||||
|
@ -12810,9 +12873,11 @@ static const struct snd_soc_dapm_route intercon[] = {
|
|||
{"MultiMedia8 Mixer", "INT3_MI2S_TX", "INT3_MI2S_TX"},
|
||||
{"MultiMedia3 Mixer", "SLIM_0_TX", "SLIMBUS_0_TX"},
|
||||
{"MultiMedia5 Mixer", "SLIM_0_TX", "SLIMBUS_0_TX"},
|
||||
{"MultiMedia10 Mixer", "SLIM_0_TX", "SLIMBUS_0_TX"},
|
||||
{"MultiMedia16 Mixer", "SLIM_0_TX", "SLIMBUS_0_TX"},
|
||||
{"MultiMedia5 Mixer", "SLIM_7_TX", "SLIMBUS_7_TX"},
|
||||
{"MultiMedia5 Mixer", "SLIM_8_TX", "SLIMBUS_8_TX"},
|
||||
{"MultiMedia10 Mixer", "SLIM_7_TX", "SLIMBUS_7_TX"},
|
||||
{"MI2S_RX Audio Mixer", "MultiMedia1", "MM_DL1"},
|
||||
{"MI2S_RX Audio Mixer", "MultiMedia2", "MM_DL2"},
|
||||
{"MI2S_RX Audio Mixer", "MultiMedia3", "MM_DL3"},
|
||||
|
@ -13379,6 +13444,7 @@ static const struct snd_soc_dapm_route intercon[] = {
|
|||
{"MultiMedia2 Mixer", "MI2S_TX", "MI2S_TX"},
|
||||
{"MultiMedia3 Mixer", "MI2S_TX", "MI2S_TX"},
|
||||
{"MultiMedia5 Mixer", "MI2S_TX", "MI2S_TX"},
|
||||
{"MultiMedia10 Mixer", "MI2S_TX", "MI2S_TX"},
|
||||
{"MultiMedia16 Mixer", "MI2S_TX", "MI2S_TX"},
|
||||
{"MultiMedia1 Mixer", "QUAT_MI2S_TX", "QUAT_MI2S_TX"},
|
||||
{"MultiMedia2 Mixer", "QUAT_MI2S_TX", "QUAT_MI2S_TX"},
|
||||
|
@ -13395,17 +13461,21 @@ static const struct snd_soc_dapm_route intercon[] = {
|
|||
{"MultiMedia1 Mixer", "AUX_PCM_UL_TX", "AUX_PCM_TX"},
|
||||
{"MultiMedia3 Mixer", "AUX_PCM_TX", "AUX_PCM_TX"},
|
||||
{"MultiMedia5 Mixer", "AUX_PCM_UL_TX", "AUX_PCM_TX"},
|
||||
{"MultiMedia10 Mixer", "AUX_PCM_TX", "AUX_PCM_TX"},
|
||||
{"MultiMedia1 Mixer", "SEC_AUX_PCM_UL_TX", "SEC_AUX_PCM_TX"},
|
||||
{"MultiMedia3 Mixer", "SEC_AUX_PCM_TX", "SEC_AUX_PCM_TX"},
|
||||
{"MultiMedia5 Mixer", "SEC_AUX_PCM_TX", "SEC_AUX_PCM_TX"},
|
||||
{"MultiMedia10 Mixer", "SEC_AUX_PCM_TX", "SEC_AUX_PCM_TX"},
|
||||
{"MultiMedia16 Mixer", "AUX_PCM_TX", "AUX_PCM_TX"},
|
||||
{"MultiMedia16 Mixer", "SEC_AUX_PCM_TX", "SEC_AUX_PCM_TX"},
|
||||
{"MultiMedia1 Mixer", "TERT_AUXPCM_UL_TX", "TERT_AUX_PCM_TX"},
|
||||
{"MultiMedia3 Mixer", "TERT_AUX_PCM_TX", "TERT_AUX_PCM_TX"},
|
||||
{"MultiMedia5 Mixer", "TERT_AUX_PCM_TX", "TERT_AUX_PCM_TX"},
|
||||
{"MultiMedia10 Mixer", "TERT_AUX_PCM_TX", "TERT_AUX_PCM_TX"},
|
||||
{"MultiMedia1 Mixer", "QUAT_AUXPCM_UL_TX", "QUAT_AUX_PCM_TX"},
|
||||
{"MultiMedia3 Mixer", "QUAT_AUX_PCM_TX", "QUAT_AUX_PCM_TX"},
|
||||
{"MultiMedia5 Mixer", "QUAT_AUX_PCM_TX", "QUAT_AUX_PCM_TX"},
|
||||
{"MultiMedia10 Mixer", "QUAT_AUX_PCM_TX", "QUAT_AUX_PCM_TX"},
|
||||
{"MultiMedia16 Mixer", "QUAT_AUX_PCM_TX", "QUAT_AUX_PCM_TX"},
|
||||
{"MultiMedia2 Mixer", "SLIM_0_TX", "SLIMBUS_0_TX"},
|
||||
{"MultiMedia2 Mixer", "SLIM_6_TX", "SLIMBUS_6_TX"},
|
||||
|
@ -13418,13 +13488,16 @@ static const struct snd_soc_dapm_route intercon[] = {
|
|||
{"MultiMedia6 Mixer", "TERT_MI2S_TX", "TERT_MI2S_TX"},
|
||||
{"MultiMedia3 Mixer", "TERT_MI2S_TX", "TERT_MI2S_TX"},
|
||||
{"MultiMedia5 Mixer", "TERT_MI2S_TX", "TERT_MI2S_TX"},
|
||||
{"MultiMedia10 Mixer", "TERT_MI2S_TX", "TERT_MI2S_TX"},
|
||||
{"MultiMedia6 Mixer", "INT2_MI2S_TX", "INT2_MI2S_TX"},
|
||||
{"MultiMedia3 Mixer", "INT2_MI2S_TX", "INT2_MI2S_TX"},
|
||||
{"MultiMedia5 Mixer", "INT2_MI2S_TX", "INT2_MI2S_TX"},
|
||||
{"MultiMedia10 Mixer", "INT2_MI2S_TX", "INT2_MI2S_TX"},
|
||||
{"MultiMedia16 Mixer", "INT2_MI2S_TX", "INT2_MI2S_TX"},
|
||||
{"MultiMedia6 Mixer", "INT3_MI2S_TX", "INT3_MI2S_TX"},
|
||||
{"MultiMedia3 Mixer", "INT3_MI2S_TX", "INT3_MI2S_TX"},
|
||||
{"MultiMedia5 Mixer", "INT3_MI2S_TX", "INT3_MI2S_TX"},
|
||||
{"MultiMedia10 Mixer", "INT3_MI2S_TX", "INT3_MI2S_TX"},
|
||||
{"MultiMedia16 Mixer", "INT3_MI2S_TX", "INT3_MI2S_TX"},
|
||||
{"MultiMedia6 Mixer", "PRI_MI2S_TX", "PRI_MI2S_TX"},
|
||||
{"MultiMedia6 Mixer", "AUX_PCM_UL_TX", "AUX_PCM_TX"},
|
||||
|
@ -13559,6 +13632,14 @@ static const struct snd_soc_dapm_route intercon[] = {
|
|||
{"MultiMedia9 Mixer", "QUAT_TDM_TX_2", "QUAT_TDM_TX_2"},
|
||||
{"MultiMedia9 Mixer", "QUAT_TDM_TX_3", "QUAT_TDM_TX_3"},
|
||||
|
||||
{"MultiMedia10 Mixer", "TERT_TDM_TX_0", "TERT_TDM_TX_0"},
|
||||
{"MultiMedia10 Mixer", "TERT_TDM_TX_1", "TERT_TDM_TX_1"},
|
||||
{"MultiMedia10 Mixer", "TERT_TDM_TX_2", "TERT_TDM_TX_2"},
|
||||
{"MultiMedia10 Mixer", "TERT_TDM_TX_3", "TERT_TDM_TX_3"},
|
||||
{"MultiMedia10 Mixer", "QUAT_TDM_TX_0", "QUAT_TDM_TX_0"},
|
||||
{"MultiMedia10 Mixer", "QUAT_TDM_TX_1", "QUAT_TDM_TX_1"},
|
||||
{"MultiMedia10 Mixer", "QUAT_TDM_TX_2", "QUAT_TDM_TX_2"},
|
||||
{"MultiMedia10 Mixer", "QUAT_TDM_TX_3", "QUAT_TDM_TX_3"},
|
||||
{"MultiMedia20 Mixer", "PRI_MI2S_TX", "PRI_MI2S_TX"},
|
||||
{"MultiMedia20 Mixer", "SEC_MI2S_TX", "SEC_MI2S_TX"},
|
||||
{"MultiMedia20 Mixer", "TERT_MI2S_TX", "TERT_MI2S_TX"},
|
||||
|
@ -13586,6 +13667,7 @@ static const struct snd_soc_dapm_route intercon[] = {
|
|||
{"MultiMedia5 Mixer", "USB_AUDIO_TX", "USB_AUDIO_TX"},
|
||||
{"MultiMedia6 Mixer", "USB_AUDIO_TX", "USB_AUDIO_TX"},
|
||||
{"MultiMedia8 Mixer", "USB_AUDIO_TX", "USB_AUDIO_TX"},
|
||||
{"MultiMedia10 Mixer", "USB_AUDIO_TX", "USB_AUDIO_TX"},
|
||||
|
||||
{"MultiMedia16 Mixer", "PRI_TDM_TX_0", "PRI_TDM_TX_0"},
|
||||
{"MultiMedia16 Mixer", "PRI_TDM_TX_1", "PRI_TDM_TX_1"},
|
||||
|
@ -13682,6 +13764,7 @@ static const struct snd_soc_dapm_route intercon[] = {
|
|||
{"MultiMedia1 Mixer", "INTERNAL_BT_SCO_TX", "INT_BT_SCO_TX"},
|
||||
{"MultiMedia3 Mixer", "INTERNAL_BT_SCO_TX", "INT_BT_SCO_TX"},
|
||||
{"MultiMedia4 Mixer", "INTERNAL_BT_SCO_TX", "INT_BT_SCO_TX"},
|
||||
{"MultiMedia10 Mixer", "INTERNAL_BT_SCO_TX", "INT_BT_SCO_TX"},
|
||||
{"MultiMedia17 Mixer", "INTERNAL_BT_SCO_TX", "INT_BT_SCO_TX"},
|
||||
{"MultiMedia18 Mixer", "INTERNAL_BT_SCO_TX", "INT_BT_SCO_TX"},
|
||||
{"MultiMedia19 Mixer", "INTERNAL_BT_SCO_TX", "INT_BT_SCO_TX"},
|
||||
|
@ -13701,6 +13784,7 @@ static const struct snd_soc_dapm_route intercon[] = {
|
|||
{"MultiMedia1 Mixer", "AFE_PCM_TX", "PCM_TX"},
|
||||
{"MultiMedia3 Mixer", "AFE_PCM_TX", "PCM_TX"},
|
||||
{"MultiMedia4 Mixer", "AFE_PCM_TX", "PCM_TX"},
|
||||
{"MultiMedia10 Mixer", "AFE_PCM_TX", "PCM_TX"},
|
||||
{"MultiMedia17 Mixer", "AFE_PCM_TX", "PCM_TX"},
|
||||
{"MultiMedia18 Mixer", "AFE_PCM_TX", "PCM_TX"},
|
||||
{"MultiMedia19 Mixer", "AFE_PCM_TX", "PCM_TX"},
|
||||
|
@ -13716,6 +13800,7 @@ static const struct snd_soc_dapm_route intercon[] = {
|
|||
{"MM_UL6", NULL, "MultiMedia6 Mixer"},
|
||||
{"MM_UL8", NULL, "MultiMedia8 Mixer"},
|
||||
{"MM_UL9", NULL, "MultiMedia9 Mixer"},
|
||||
{"MM_UL10", NULL, "MultiMedia10 Mixer"},
|
||||
{"MM_UL16", NULL, "MultiMedia16 Mixer"},
|
||||
{"MM_UL17", NULL, "MultiMedia17 Mixer"},
|
||||
{"MM_UL18", NULL, "MultiMedia18 Mixer"},
|
||||
|
@ -14104,6 +14189,16 @@ static const struct snd_soc_dapm_route intercon[] = {
|
|||
{"AUDIO_REF_EC_UL9 MUX", "TERT_MI2S_TX", "TERT_MI2S_TX"},
|
||||
{"AUDIO_REF_EC_UL9 MUX", "QUAT_MI2S_TX", "QUAT_MI2S_TX"},
|
||||
|
||||
{"AUDIO_REF_EC_UL10 MUX", "PRI_MI2S_TX", "PRI_MI2S_TX"},
|
||||
{"AUDIO_REF_EC_UL10 MUX", "SEC_MI2S_TX", "SEC_MI2S_TX"},
|
||||
{"AUDIO_REF_EC_UL10 MUX", "TERT_MI2S_TX", "TERT_MI2S_TX"},
|
||||
{"AUDIO_REF_EC_UL10 MUX", "QUAT_MI2S_TX", "QUAT_MI2S_TX"},
|
||||
{"AUDIO_REF_EC_UL10 MUX", "SLIM_1_TX", "SLIMBUS_1_TX"},
|
||||
{"AUDIO_REF_EC_UL10 MUX", "QUAT_TDM_TX_1", "QUAT_TDM_TX_1"},
|
||||
{"AUDIO_REF_EC_UL10 MUX", "QUAT_TDM_RX_0", "QUAT_TDM_RX_0"},
|
||||
{"AUDIO_REF_EC_UL10 MUX", "QUAT_TDM_RX_1", "QUAT_TDM_RX_1"},
|
||||
{"AUDIO_REF_EC_UL10 MUX", "QUAT_TDM_RX_2", "QUAT_TDM_RX_2"},
|
||||
{"AUDIO_REF_EC_UL10 MUX", "TERT_TDM_TX_0", "TERT_TDM_TX_0"},
|
||||
{"AUDIO_REF_EC_UL17 MUX", "PRI_MI2S_TX", "PRI_MI2S_TX"},
|
||||
{"AUDIO_REF_EC_UL17 MUX", "SEC_MI2S_TX", "SEC_MI2S_TX"},
|
||||
{"AUDIO_REF_EC_UL17 MUX", "TERT_MI2S_TX", "TERT_MI2S_TX"},
|
||||
|
@ -14127,6 +14222,7 @@ static const struct snd_soc_dapm_route intercon[] = {
|
|||
{"MM_UL6", NULL, "AUDIO_REF_EC_UL6 MUX"},
|
||||
{"MM_UL8", NULL, "AUDIO_REF_EC_UL8 MUX"},
|
||||
{"MM_UL9", NULL, "AUDIO_REF_EC_UL9 MUX"},
|
||||
{"MM_UL10", NULL, "AUDIO_REF_EC_UL10 MUX"},
|
||||
{"MM_UL16", NULL, "AUDIO_REF_EC_UL16 MUX"},
|
||||
{"MM_UL17", NULL, "AUDIO_REF_EC_UL17 MUX"},
|
||||
{"MM_UL18", NULL, "AUDIO_REF_EC_UL18 MUX"},
|
||||
|
|
|
@ -5036,12 +5036,13 @@ static struct snd_soc_dai_link msm_common_dai_links[] = {
|
|||
.id = MSM_FRONTEND_DAI_MULTIMEDIA7,
|
||||
},
|
||||
{
|
||||
.name = MSM_DAILINK_NAME(Compress3),
|
||||
.stream_name = "Compress3",
|
||||
.name = MSM_DAILINK_NAME(MultiMedia10),
|
||||
.stream_name = "MultiMedia10",
|
||||
.cpu_dai_name = "MultiMedia10",
|
||||
.platform_name = "msm-compress-dsp",
|
||||
.platform_name = "msm-pcm-dsp.1",
|
||||
.dynamic = 1,
|
||||
.dpcm_playback = 1,
|
||||
.dpcm_capture = 1,
|
||||
.trigger = {SND_SOC_DPCM_TRIGGER_POST,
|
||||
SND_SOC_DPCM_TRIGGER_POST},
|
||||
.codec_dai_name = "snd-soc-dummy-dai",
|
||||
|
|
|
@ -44,6 +44,8 @@ enum {
|
|||
EXT_DISP_RX_IDX_MAX,
|
||||
};
|
||||
|
||||
bool codec_reg_done;
|
||||
|
||||
/* TDM default config */
|
||||
static struct dev_config tdm_rx_cfg[TDM_INTERFACE_MAX][TDM_PORT_MAX] = {
|
||||
{ /* PRI TDM */
|
||||
|
@ -2016,6 +2018,12 @@ int msm_common_snd_controls_size(void)
|
|||
}
|
||||
EXPORT_SYMBOL(msm_common_snd_controls_size);
|
||||
|
||||
void msm_set_codec_reg_done(bool done)
|
||||
{
|
||||
codec_reg_done = done;
|
||||
}
|
||||
EXPORT_SYMBOL(msm_set_codec_reg_done);
|
||||
|
||||
static inline int param_is_mask(int p)
|
||||
{
|
||||
return (p >= SNDRV_PCM_HW_PARAM_FIRST_MASK) &&
|
||||
|
@ -3027,6 +3035,12 @@ static const struct of_device_id sdm660_asoc_machine_of_match[] = {
|
|||
.data = "tasha_codec"},
|
||||
{ .compatible = "qcom,sdm660-asoc-snd-tavil",
|
||||
.data = "tavil_codec"},
|
||||
{ .compatible = "qcom,sdm670-asoc-snd",
|
||||
.data = "internal_codec"},
|
||||
{ .compatible = "qcom,sdm670-asoc-snd-tasha",
|
||||
.data = "tasha_codec"},
|
||||
{ .compatible = "qcom,sdm670-asoc-snd-tavil",
|
||||
.data = "tavil_codec"},
|
||||
{},
|
||||
};
|
||||
|
||||
|
@ -3044,6 +3058,7 @@ static int msm_asoc_machine_probe(struct platform_device *pdev)
|
|||
if (!pdata)
|
||||
return -ENOMEM;
|
||||
|
||||
msm_set_codec_reg_done(false);
|
||||
match = of_match_node(sdm660_asoc_machine_of_match,
|
||||
pdev->dev.of_node);
|
||||
if (!match)
|
||||
|
|
|
@ -122,4 +122,5 @@ void msm_aux_pcm_snd_shutdown(struct snd_pcm_substream *substream);
|
|||
int msm_mi2s_snd_startup(struct snd_pcm_substream *substream);
|
||||
void msm_mi2s_snd_shutdown(struct snd_pcm_substream *substream);
|
||||
int msm_common_snd_controls_size(void);
|
||||
void msm_set_codec_reg_done(bool done);
|
||||
#endif
|
||||
|
|
|
@ -29,8 +29,15 @@
|
|||
#define WCN_CDC_SLIM_RX_CH_MAX 2
|
||||
#define WCN_CDC_SLIM_TX_CH_MAX 3
|
||||
|
||||
static struct snd_soc_card snd_soc_card_msm_card_tavil;
|
||||
static struct snd_soc_card snd_soc_card_msm_card_tasha;
|
||||
static struct snd_soc_card snd_soc_card_msm_card_tavil = {
|
||||
.name = "sdm670-tavil-snd-card",
|
||||
.late_probe = msm_snd_card_tavil_late_probe,
|
||||
};
|
||||
|
||||
static struct snd_soc_card snd_soc_card_msm_card_tasha = {
|
||||
.name = "sdm670-tasha-snd-card",
|
||||
.late_probe = msm_snd_card_tasha_late_probe,
|
||||
};
|
||||
|
||||
static struct snd_soc_ops msm_ext_slimbus_be_ops = {
|
||||
.hw_params = msm_snd_hw_params,
|
||||
|
@ -990,13 +997,14 @@ static struct snd_soc_dai_link msm_ext_common_fe_dai[] = {
|
|||
.id = MSM_FRONTEND_DAI_MULTIMEDIA7,
|
||||
},
|
||||
{/* hw:x,16 */
|
||||
.name = MSM_DAILINK_NAME(Compress3),
|
||||
.stream_name = "Compress3",
|
||||
.name = MSM_DAILINK_NAME(MultiMedia10),
|
||||
.stream_name = "MultiMedia10",
|
||||
.cpu_dai_name = "MultiMedia10",
|
||||
.platform_name = "msm-compress-dsp",
|
||||
.platform_name = "msm-pcm-dsp.1",
|
||||
.dynamic = 1,
|
||||
.dpcm_capture = 1,
|
||||
.dpcm_playback = 1,
|
||||
.dpcm_capture = 1,
|
||||
.trigger = {SND_SOC_DPCM_TRIGGER_POST,
|
||||
SND_SOC_DPCM_TRIGGER_POST},
|
||||
.codec_dai_name = "snd-soc-dummy-dai",
|
||||
|
|
|
@ -56,7 +56,6 @@
|
|||
|
||||
static int msm_ext_spk_control = 1;
|
||||
static struct wcd_mbhc_config *wcd_mbhc_cfg_ptr;
|
||||
bool codec_reg_done;
|
||||
|
||||
struct msm_asoc_wcd93xx_codec {
|
||||
void* (*get_afe_config_fn)(struct snd_soc_codec *codec,
|
||||
|
@ -604,23 +603,23 @@ static int msm_vi_feed_tx_ch_put(struct snd_kcontrol *kcontrol,
|
|||
|
||||
static void *def_ext_mbhc_cal(void)
|
||||
{
|
||||
void *tavil_wcd_cal;
|
||||
void *wcd_mbhc_cal;
|
||||
struct wcd_mbhc_btn_detect_cfg *btn_cfg;
|
||||
u16 *btn_high;
|
||||
|
||||
tavil_wcd_cal = kzalloc(WCD_MBHC_CAL_SIZE(WCD_MBHC_DEF_BUTTONS,
|
||||
wcd_mbhc_cal = kzalloc(WCD_MBHC_CAL_SIZE(WCD_MBHC_DEF_BUTTONS,
|
||||
WCD9XXX_MBHC_DEF_RLOADS), GFP_KERNEL);
|
||||
if (!tavil_wcd_cal)
|
||||
if (!wcd_mbhc_cal)
|
||||
return NULL;
|
||||
|
||||
#define S(X, Y) ((WCD_MBHC_CAL_PLUG_TYPE_PTR(tavil_wcd_cal)->X) = (Y))
|
||||
#define S(X, Y) ((WCD_MBHC_CAL_PLUG_TYPE_PTR(wcd_mbhc_cal)->X) = (Y))
|
||||
S(v_hs_max, 1600);
|
||||
#undef S
|
||||
#define S(X, Y) ((WCD_MBHC_CAL_BTN_DET_PTR(tavil_wcd_cal)->X) = (Y))
|
||||
#define S(X, Y) ((WCD_MBHC_CAL_BTN_DET_PTR(wcd_mbhc_cal)->X) = (Y))
|
||||
S(num_btn, WCD_MBHC_DEF_BUTTONS);
|
||||
#undef S
|
||||
|
||||
btn_cfg = WCD_MBHC_CAL_BTN_DET_PTR(tavil_wcd_cal);
|
||||
btn_cfg = WCD_MBHC_CAL_BTN_DET_PTR(wcd_mbhc_cal);
|
||||
btn_high = ((void *)&btn_cfg->_v_btn_low) +
|
||||
(sizeof(btn_cfg->_v_btn_low[0]) * btn_cfg->num_btn);
|
||||
|
||||
|
@ -633,7 +632,7 @@ static void *def_ext_mbhc_cal(void)
|
|||
btn_high[6] = 500;
|
||||
btn_high[7] = 500;
|
||||
|
||||
return tavil_wcd_cal;
|
||||
return wcd_mbhc_cal;
|
||||
}
|
||||
|
||||
static inline int param_is_mask(int p)
|
||||
|
@ -1479,6 +1478,79 @@ static struct snd_soc_dapm_route wcd_audio_paths[] = {
|
|||
{"MIC BIAS4", NULL, "MCLK"},
|
||||
};
|
||||
|
||||
int msm_snd_card_tasha_late_probe(struct snd_soc_card *card)
|
||||
{
|
||||
const char *be_dl_name = LPASS_BE_SLIMBUS_0_RX;
|
||||
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;
|
||||
goto err_pcm_runtime;
|
||||
}
|
||||
|
||||
mbhc_calibration = def_ext_mbhc_cal();
|
||||
if (!mbhc_calibration) {
|
||||
ret = -ENOMEM;
|
||||
goto err_mbhc_cal;
|
||||
}
|
||||
wcd_mbhc_cfg_ptr->calibration = mbhc_calibration;
|
||||
ret = tasha_mbhc_hs_detect(rtd->codec, wcd_mbhc_cfg_ptr);
|
||||
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);
|
||||
err_mbhc_cal:
|
||||
err_pcm_runtime:
|
||||
return ret;
|
||||
}
|
||||
|
||||
int msm_snd_card_tavil_late_probe(struct snd_soc_card *card)
|
||||
{
|
||||
const char *be_dl_name = LPASS_BE_SLIMBUS_0_RX;
|
||||
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;
|
||||
goto err;
|
||||
}
|
||||
|
||||
mbhc_calibration = def_ext_mbhc_cal();
|
||||
if (!mbhc_calibration) {
|
||||
ret = -ENOMEM;
|
||||
goto err;
|
||||
}
|
||||
wcd_mbhc_cfg_ptr->calibration = mbhc_calibration;
|
||||
ret = tavil_mbhc_hs_detect(rtd->codec, wcd_mbhc_cfg_ptr);
|
||||
if (ret) {
|
||||
dev_err(card->dev, "%s: mbhc hs detect failed, err:%d\n",
|
||||
__func__, ret);
|
||||
goto err_free_mbhc_cal;
|
||||
}
|
||||
return 0;
|
||||
|
||||
err_free_mbhc_cal:
|
||||
kfree(mbhc_calibration);
|
||||
err:
|
||||
return ret;
|
||||
}
|
||||
|
||||
/**
|
||||
* msm_audrx_init - Audio init function of sound card instantiate.
|
||||
*
|
||||
|
@ -1699,7 +1771,6 @@ int msm_audrx_init(struct snd_soc_pcm_runtime *rtd)
|
|||
if (!entry) {
|
||||
pr_debug("%s: Cannot create codecs module entry\n",
|
||||
__func__);
|
||||
pdata->codec_root = NULL;
|
||||
goto done;
|
||||
}
|
||||
pdata->codec_root = entry;
|
||||
|
@ -1722,50 +1793,17 @@ int msm_audrx_init(struct snd_soc_pcm_runtime *rtd)
|
|||
if (!entry) {
|
||||
pr_debug("%s: Cannot create codecs module entry\n",
|
||||
__func__);
|
||||
ret = 0;
|
||||
goto err_snd_module;
|
||||
goto done;
|
||||
}
|
||||
pdata->codec_root = entry;
|
||||
tasha_codec_info_create_codec_entry(pdata->codec_root, codec);
|
||||
tasha_mbhc_zdet_gpio_ctrl(msm_config_hph_en0_gpio, rtd->codec);
|
||||
}
|
||||
|
||||
wcd_mbhc_cfg_ptr->calibration = def_ext_mbhc_cal();
|
||||
if (!strcmp(dev_name(codec_dai->dev), "tavil_codec")) {
|
||||
if (wcd_mbhc_cfg_ptr->calibration) {
|
||||
pdata->codec = codec;
|
||||
ret = tavil_mbhc_hs_detect(codec, wcd_mbhc_cfg_ptr);
|
||||
if (ret < 0)
|
||||
pr_err("%s: Failed to intialise mbhc %d\n",
|
||||
__func__, ret);
|
||||
} else {
|
||||
pr_err("%s: wcd_mbhc_cfg calibration is NULL\n",
|
||||
__func__);
|
||||
ret = -ENOMEM;
|
||||
goto err_mbhc_cal;
|
||||
}
|
||||
} else {
|
||||
if (wcd_mbhc_cfg_ptr->calibration) {
|
||||
pdata->codec = codec;
|
||||
ret = tasha_mbhc_hs_detect(codec, wcd_mbhc_cfg_ptr);
|
||||
if (ret < 0)
|
||||
pr_err("%s: Failed to intialise mbhc %d\n",
|
||||
__func__, ret);
|
||||
} else {
|
||||
pr_err("%s: wcd_mbhc_cfg calibration is NULL\n",
|
||||
__func__);
|
||||
ret = -ENOMEM;
|
||||
goto err_mbhc_cal;
|
||||
}
|
||||
|
||||
}
|
||||
codec_reg_done = true;
|
||||
done:
|
||||
msm_set_codec_reg_done(true);
|
||||
return 0;
|
||||
|
||||
err_snd_module:
|
||||
err_afe_cfg:
|
||||
err_mbhc_cal:
|
||||
return ret;
|
||||
}
|
||||
EXPORT_SYMBOL(msm_audrx_init);
|
||||
|
|
|
@ -30,6 +30,8 @@ struct snd_soc_card *populate_snd_card_dailinks(struct device *dev,
|
|||
int snd_card_val);
|
||||
int msm_ext_be_hw_params_fixup(struct snd_soc_pcm_runtime *rtd,
|
||||
struct snd_pcm_hw_params *params);
|
||||
int msm_snd_card_tavil_late_probe(struct snd_soc_card *card);
|
||||
int msm_snd_card_tasha_late_probe(struct snd_soc_card *card);
|
||||
#ifdef CONFIG_SND_SOC_EXT_CODEC
|
||||
int msm_ext_cdc_init(struct platform_device *, struct msm_asoc_mach_data *,
|
||||
struct snd_soc_card **, struct wcd_mbhc_config *);
|
||||
|
|
|
@ -1314,6 +1314,7 @@ static int msm_audrx_init(struct snd_soc_pcm_runtime *rtd)
|
|||
msm_dig_codec_info_create_codec_entry(codec_root, dig_cdc);
|
||||
msm_anlg_codec_info_create_codec_entry(codec_root, ana_cdc);
|
||||
done:
|
||||
msm_set_codec_reg_done(true);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -1914,13 +1915,14 @@ static struct snd_soc_dai_link msm_int_dai[] = {
|
|||
.id = MSM_FRONTEND_DAI_MULTIMEDIA7,
|
||||
},
|
||||
{/* hw:x,16 */
|
||||
.name = MSM_DAILINK_NAME(Compress3),
|
||||
.stream_name = "Compress3",
|
||||
.name = MSM_DAILINK_NAME(MultiMedia10),
|
||||
.stream_name = "MultiMedia10",
|
||||
.cpu_dai_name = "MultiMedia10",
|
||||
.platform_name = "msm-compress-dsp",
|
||||
.platform_name = "msm-pcm-dsp.1",
|
||||
.dynamic = 1,
|
||||
.dpcm_capture = 1,
|
||||
.dpcm_playback = 1,
|
||||
.dpcm_capture = 1,
|
||||
.trigger = {SND_SOC_DPCM_TRIGGER_POST,
|
||||
SND_SOC_DPCM_TRIGGER_POST},
|
||||
.codec_dai_name = "snd-soc-dummy-dai",
|
||||
|
|
|
@ -5126,12 +5126,13 @@ static struct snd_soc_dai_link msm_common_dai_links[] = {
|
|||
.id = MSM_FRONTEND_DAI_MULTIMEDIA7,
|
||||
},
|
||||
{
|
||||
.name = MSM_DAILINK_NAME(Compress3),
|
||||
.stream_name = "Compress3",
|
||||
.name = MSM_DAILINK_NAME(MultiMedia10),
|
||||
.stream_name = "MultiMedia10",
|
||||
.cpu_dai_name = "MultiMedia10",
|
||||
.platform_name = "msm-compress-dsp",
|
||||
.platform_name = "msm-pcm-dsp.1",
|
||||
.dynamic = 1,
|
||||
.dpcm_playback = 1,
|
||||
.dpcm_capture = 1,
|
||||
.trigger = {SND_SOC_DPCM_TRIGGER_POST,
|
||||
SND_SOC_DPCM_TRIGGER_POST},
|
||||
.codec_dai_name = "snd-soc-dummy-dai",
|
||||
|
@ -6696,16 +6697,18 @@ static int msm_init_wsa_dev(struct platform_device *pdev,
|
|||
ret = of_property_read_u32(pdev->dev.of_node,
|
||||
"qcom,wsa-max-devs", &wsa_max_devs);
|
||||
if (ret) {
|
||||
dev_dbg(&pdev->dev,
|
||||
dev_info(&pdev->dev,
|
||||
"%s: wsa-max-devs property missing in DT %s, ret = %d\n",
|
||||
__func__, pdev->dev.of_node->full_name, ret);
|
||||
goto err;
|
||||
card->num_aux_devs = 0;
|
||||
return 0;
|
||||
}
|
||||
if (wsa_max_devs == 0) {
|
||||
dev_warn(&pdev->dev,
|
||||
"%s: Max WSA devices is 0 for this target?\n",
|
||||
__func__);
|
||||
goto err;
|
||||
card->num_aux_devs = 0;
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* Get count of WSA device phandles for this platform */
|
||||
|
|
|
@ -30,7 +30,9 @@
|
|||
#ifdef CONFIG_USE_DEV_CTRL_VOLUME
|
||||
#include <linux/qdsp6v2/audio_dev_ctl.h>
|
||||
#endif /*CONFIG_USE_DEV_CTRL_VOLUME*/
|
||||
static DEFINE_MUTEX(lock);
|
||||
#ifdef CONFIG_DEBUG_FS
|
||||
|
||||
int audio_aio_debug_open(struct inode *inode, struct file *file)
|
||||
{
|
||||
file->private_data = inode->i_private;
|
||||
|
@ -43,29 +45,37 @@ ssize_t audio_aio_debug_read(struct file *file, char __user *buf,
|
|||
const int debug_bufmax = 4096;
|
||||
static char buffer[4096];
|
||||
int n = 0;
|
||||
struct q6audio_aio *audio = file->private_data;
|
||||
struct q6audio_aio *audio;
|
||||
|
||||
mutex_lock(&audio->lock);
|
||||
n = scnprintf(buffer, debug_bufmax, "opened %d\n", audio->opened);
|
||||
n += scnprintf(buffer + n, debug_bufmax - n,
|
||||
"enabled %d\n", audio->enabled);
|
||||
n += scnprintf(buffer + n, debug_bufmax - n,
|
||||
"stopped %d\n", audio->stopped);
|
||||
n += scnprintf(buffer + n, debug_bufmax - n,
|
||||
"feedback %d\n", audio->feedback);
|
||||
mutex_unlock(&audio->lock);
|
||||
/* Following variables are only useful for debugging when
|
||||
* when playback halts unexpectedly. Thus, no mutual exclusion
|
||||
* enforced
|
||||
*/
|
||||
n += scnprintf(buffer + n, debug_bufmax - n,
|
||||
"wflush %d\n", audio->wflush);
|
||||
n += scnprintf(buffer + n, debug_bufmax - n,
|
||||
"rflush %d\n", audio->rflush);
|
||||
n += scnprintf(buffer + n, debug_bufmax - n,
|
||||
"inqueue empty %d\n", list_empty(&audio->in_queue));
|
||||
n += scnprintf(buffer + n, debug_bufmax - n,
|
||||
"outqueue empty %d\n", list_empty(&audio->out_queue));
|
||||
mutex_lock(&lock);
|
||||
if (file->private_data != NULL) {
|
||||
audio = file->private_data;
|
||||
mutex_lock(&audio->lock);
|
||||
n = scnprintf(buffer, debug_bufmax, "opened %d\n",
|
||||
audio->opened);
|
||||
n += scnprintf(buffer + n, debug_bufmax - n,
|
||||
"enabled %d\n", audio->enabled);
|
||||
n += scnprintf(buffer + n, debug_bufmax - n,
|
||||
"stopped %d\n", audio->stopped);
|
||||
n += scnprintf(buffer + n, debug_bufmax - n,
|
||||
"feedback %d\n", audio->feedback);
|
||||
mutex_unlock(&audio->lock);
|
||||
/* Following variables are only useful for debugging when
|
||||
* when playback halts unexpectedly. Thus, no mutual exclusion
|
||||
* enforced
|
||||
*/
|
||||
n += scnprintf(buffer + n, debug_bufmax - n,
|
||||
"wflush %d\n", audio->wflush);
|
||||
n += scnprintf(buffer + n, debug_bufmax - n,
|
||||
"rflush %d\n", audio->rflush);
|
||||
n += scnprintf(buffer + n, debug_bufmax - n,
|
||||
"inqueue empty %d\n",
|
||||
list_empty(&audio->in_queue));
|
||||
n += scnprintf(buffer + n, debug_bufmax - n,
|
||||
"outqueue empty %d\n",
|
||||
list_empty(&audio->out_queue));
|
||||
}
|
||||
mutex_unlock(&lock);
|
||||
buffer[n] = 0;
|
||||
return simple_read_from_buffer(buf, count, ppos, buffer, n);
|
||||
}
|
||||
|
@ -580,6 +590,7 @@ int audio_aio_release(struct inode *inode, struct file *file)
|
|||
struct q6audio_aio *audio = file->private_data;
|
||||
|
||||
pr_debug("%s[%pK]\n", __func__, audio);
|
||||
mutex_lock(&lock);
|
||||
mutex_lock(&audio->lock);
|
||||
mutex_lock(&audio->read_lock);
|
||||
mutex_lock(&audio->write_lock);
|
||||
|
@ -622,6 +633,8 @@ int audio_aio_release(struct inode *inode, struct file *file)
|
|||
#endif
|
||||
kfree(audio->codec_cfg);
|
||||
kfree(audio);
|
||||
file->private_data = NULL;
|
||||
mutex_unlock(&lock);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
256
dsp/q6core.c
256
dsp/q6core.c
|
@ -20,7 +20,9 @@
|
|||
#include <linux/slab.h>
|
||||
#include <dsp/q6core.h>
|
||||
#include <dsp/audio_cal_utils.h>
|
||||
#include <dsp/apr_audio-v2.h>
|
||||
#include <ipc/apr.h>
|
||||
#include "adsp_err.h"
|
||||
|
||||
#define TIMEOUT_MS 1000
|
||||
/*
|
||||
|
@ -36,16 +38,30 @@ enum {
|
|||
CORE_MAX_CAL
|
||||
};
|
||||
|
||||
enum ver_query_status {
|
||||
VER_QUERY_UNATTEMPTED,
|
||||
VER_QUERY_UNSUPPORTED,
|
||||
VER_QUERY_SUPPORTED
|
||||
};
|
||||
|
||||
struct q6core_avcs_ver_info {
|
||||
enum ver_query_status status;
|
||||
struct avcs_fwk_ver_info ver_info;
|
||||
};
|
||||
|
||||
struct q6core_str {
|
||||
struct apr_svc *core_handle_q;
|
||||
wait_queue_head_t bus_bw_req_wait;
|
||||
wait_queue_head_t cmd_req_wait;
|
||||
wait_queue_head_t avcs_fwk_ver_req_wait;
|
||||
u32 bus_bw_resp_received;
|
||||
enum cmd_flags {
|
||||
FLAG_NONE,
|
||||
FLAG_CMDRSP_LICENSE_RESULT
|
||||
} cmd_resp_received_flag;
|
||||
u32 avcs_fwk_ver_resp_received;
|
||||
struct mutex cmd_lock;
|
||||
struct mutex ver_lock;
|
||||
union {
|
||||
struct avcs_cmdrsp_get_license_validation_result
|
||||
cmdrsp_license_result;
|
||||
|
@ -54,6 +70,7 @@ struct q6core_str {
|
|||
struct cal_type_data *cal_data[CORE_MAX_CAL];
|
||||
uint32_t mem_map_cal_handle;
|
||||
int32_t adsp_status;
|
||||
struct q6core_avcs_ver_info q6core_avcs_ver_info;
|
||||
};
|
||||
|
||||
static struct q6core_str q6core_lcl;
|
||||
|
@ -65,9 +82,61 @@ struct generic_get_data_ {
|
|||
};
|
||||
static struct generic_get_data_ *generic_get_data;
|
||||
|
||||
static int parse_fwk_version_info(uint32_t *payload)
|
||||
{
|
||||
size_t fwk_ver_size;
|
||||
size_t svc_size;
|
||||
int num_services;
|
||||
int ret = 0;
|
||||
|
||||
pr_debug("%s: Payload info num services %d\n",
|
||||
__func__, payload[4]);
|
||||
/*
|
||||
* payload1[4] is the number of services running on DSP
|
||||
* Based on this info, we copy the payload into core
|
||||
* avcs version info structure.
|
||||
*/
|
||||
num_services = payload[4];
|
||||
q6core_lcl.q6core_avcs_ver_info.ver_info.avcs_fwk_version.
|
||||
num_services = num_services;
|
||||
if (num_services > VSS_MAX_AVCS_NUM_SERVICES) {
|
||||
pr_err("%s: num_services: %d greater than max services: %d\n",
|
||||
__func__, num_services, VSS_MAX_AVCS_NUM_SERVICES);
|
||||
ret = -EINVAL;
|
||||
goto done;
|
||||
}
|
||||
fwk_ver_size = sizeof(struct avcs_get_fwk_version);
|
||||
svc_size = num_services * sizeof(struct avs_svc_api_info);
|
||||
/*
|
||||
* Dynamically allocate memory for all
|
||||
* the services based on num_services
|
||||
*/
|
||||
q6core_lcl.q6core_avcs_ver_info.ver_info.services = NULL;
|
||||
q6core_lcl.q6core_avcs_ver_info.ver_info.services =
|
||||
kzalloc(svc_size, GFP_ATOMIC);
|
||||
if (q6core_lcl.q6core_avcs_ver_info.ver_info.services == NULL) {
|
||||
ret = -ENOMEM;
|
||||
goto done;
|
||||
}
|
||||
/*
|
||||
* memcpy is done twice because the memory allocated for
|
||||
* q6core_lcl.q6core_avcs_ver_info.ver_info is not
|
||||
* contiguous.
|
||||
*/
|
||||
memcpy(&q6core_lcl.q6core_avcs_ver_info.ver_info,
|
||||
(uint8_t *)payload, fwk_ver_size);
|
||||
memcpy(q6core_lcl.q6core_avcs_ver_info.ver_info.services,
|
||||
(uint8_t *)&payload[sizeof(struct avcs_get_fwk_version)/
|
||||
sizeof(uint32_t)], svc_size);
|
||||
ret = 0;
|
||||
done:
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int32_t aprv2_core_fn_q(struct apr_client_data *data, void *priv)
|
||||
{
|
||||
uint32_t *payload1;
|
||||
int ret = 0;
|
||||
|
||||
if (data == NULL) {
|
||||
pr_err("%s: data argument is null\n", __func__);
|
||||
|
@ -118,6 +187,17 @@ static int32_t aprv2_core_fn_q(struct apr_client_data *data, void *priv)
|
|||
q6core_lcl.bus_bw_resp_received = 1;
|
||||
wake_up(&q6core_lcl.bus_bw_req_wait);
|
||||
break;
|
||||
case AVCS_CMD_GET_FWK_VERSION:
|
||||
pr_debug("%s: Cmd = AVCS_CMD_GET_FWK_VERSION status[%s]\n",
|
||||
__func__, adsp_err_get_err_str(payload1[1]));
|
||||
/* ADSP status to match Linux error standard */
|
||||
q6core_lcl.adsp_status = -payload1[1];
|
||||
if (payload1[1] == ADSP_EUNSUPPORTED)
|
||||
q6core_lcl.q6core_avcs_ver_info.status =
|
||||
VER_QUERY_UNSUPPORTED;
|
||||
q6core_lcl.avcs_fwk_ver_resp_received = 1;
|
||||
wake_up(&q6core_lcl.avcs_fwk_ver_req_wait);
|
||||
break;
|
||||
default:
|
||||
pr_err("%s: Invalid cmd rsp[0x%x][0x%x] opcode %d\n",
|
||||
__func__,
|
||||
|
@ -130,7 +210,7 @@ static int32_t aprv2_core_fn_q(struct apr_client_data *data, void *priv)
|
|||
case RESET_EVENTS:{
|
||||
pr_debug("%s: Reset event received in Core service\n",
|
||||
__func__);
|
||||
apr_reset(q6core_lcl.core_handle_q);
|
||||
/* no reset done as the data will not change after SSR*/
|
||||
q6core_lcl.core_handle_q = NULL;
|
||||
break;
|
||||
}
|
||||
|
@ -161,6 +241,18 @@ static int32_t aprv2_core_fn_q(struct apr_client_data *data, void *priv)
|
|||
q6core_lcl.cmd_resp_received_flag = FLAG_CMDRSP_LICENSE_RESULT;
|
||||
wake_up(&q6core_lcl.cmd_req_wait);
|
||||
break;
|
||||
case AVCS_CMDRSP_GET_FWK_VERSION:
|
||||
pr_debug("%s: Received AVCS_CMDRSP_GET_FWK_VERSION\n",
|
||||
__func__);
|
||||
payload1 = data->payload;
|
||||
q6core_lcl.q6core_avcs_ver_info.status = VER_QUERY_SUPPORTED;
|
||||
q6core_lcl.avcs_fwk_ver_resp_received = 1;
|
||||
ret = parse_fwk_version_info(payload1);
|
||||
if (ret < 0)
|
||||
pr_err("%s: Failed to parse payload:%d\n",
|
||||
__func__, ret);
|
||||
wake_up(&q6core_lcl.avcs_fwk_ver_req_wait);
|
||||
break;
|
||||
default:
|
||||
pr_err("%s: Message id from adsp core svc: 0x%x\n",
|
||||
__func__, data->opcode);
|
||||
|
@ -217,6 +309,157 @@ struct cal_block_data *cal_utils_get_cal_block_by_key(
|
|||
return NULL;
|
||||
}
|
||||
|
||||
static int q6core_send_get_avcs_fwk_ver_cmd(void)
|
||||
{
|
||||
struct apr_hdr avcs_ver_cmd;
|
||||
int ret;
|
||||
|
||||
avcs_ver_cmd.hdr_field =
|
||||
APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD, APR_HDR_LEN(APR_HDR_SIZE),
|
||||
APR_PKT_VER);
|
||||
avcs_ver_cmd.pkt_size = sizeof(struct apr_hdr);
|
||||
avcs_ver_cmd.src_port = 0;
|
||||
avcs_ver_cmd.dest_port = 0;
|
||||
avcs_ver_cmd.token = 0;
|
||||
avcs_ver_cmd.opcode = AVCS_CMD_GET_FWK_VERSION;
|
||||
|
||||
q6core_lcl.adsp_status = 0;
|
||||
q6core_lcl.avcs_fwk_ver_resp_received = 0;
|
||||
|
||||
ret = apr_send_pkt(q6core_lcl.core_handle_q,
|
||||
(uint32_t *) &avcs_ver_cmd);
|
||||
if (ret < 0) {
|
||||
pr_err("%s: failed to send apr packet, ret=%d\n", __func__,
|
||||
ret);
|
||||
goto done;
|
||||
}
|
||||
|
||||
ret = wait_event_timeout(q6core_lcl.avcs_fwk_ver_req_wait,
|
||||
(q6core_lcl.avcs_fwk_ver_resp_received == 1),
|
||||
msecs_to_jiffies(TIMEOUT_MS));
|
||||
if (!ret) {
|
||||
pr_err("%s: wait_event timeout for AVCS fwk version info\n",
|
||||
__func__);
|
||||
ret = -ETIMEDOUT;
|
||||
goto done;
|
||||
}
|
||||
|
||||
if (q6core_lcl.adsp_status < 0) {
|
||||
/*
|
||||
* adsp_err_get_err_str expects a positive value but we store
|
||||
* the DSP error as negative to match the Linux error standard.
|
||||
* Pass in the negated value so adsp_err_get_err_str returns
|
||||
* the correct string.
|
||||
*/
|
||||
pr_err("%s: DSP returned error[%s]\n", __func__,
|
||||
adsp_err_get_err_str(-q6core_lcl.adsp_status));
|
||||
ret = adsp_err_get_lnx_err_code(q6core_lcl.adsp_status);
|
||||
goto done;
|
||||
}
|
||||
|
||||
ret = 0;
|
||||
|
||||
done:
|
||||
return ret;
|
||||
}
|
||||
|
||||
int q6core_get_service_version(uint32_t service_id,
|
||||
struct avcs_fwk_ver_info *ver_info,
|
||||
size_t size)
|
||||
{
|
||||
int i;
|
||||
uint32_t num_services;
|
||||
size_t svc_size;
|
||||
|
||||
svc_size = q6core_get_avcs_service_size(service_id);
|
||||
if (svc_size != size) {
|
||||
pr_err("%s: Expected size: %ld, Provided size: %ld",
|
||||
__func__, svc_size, size);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
num_services =
|
||||
q6core_lcl.q6core_avcs_ver_info.ver_info.
|
||||
avcs_fwk_version.num_services;
|
||||
|
||||
if (ver_info == NULL) {
|
||||
pr_err("%s: NULL parameter ver_info\n", __func__);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
memcpy(ver_info, &q6core_lcl.q6core_avcs_ver_info.
|
||||
ver_info.avcs_fwk_version, sizeof(struct avcs_get_fwk_version));
|
||||
|
||||
if (service_id == AVCS_SERVICE_ID_ALL) {
|
||||
memcpy(&ver_info->services[0], &q6core_lcl.
|
||||
q6core_avcs_ver_info.ver_info.services[0],
|
||||
(num_services * sizeof(struct avs_svc_api_info)));
|
||||
} else {
|
||||
for (i = 0; i < num_services; i++) {
|
||||
if (q6core_lcl.q6core_avcs_ver_info.
|
||||
ver_info.services[i].service_id == service_id) {
|
||||
memcpy(&ver_info->services[0],
|
||||
&q6core_lcl.q6core_avcs_ver_info.
|
||||
ver_info.services[i], size);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL(q6core_get_service_version);
|
||||
|
||||
size_t q6core_get_avcs_service_size(uint32_t service_id)
|
||||
{
|
||||
int ret = 0;
|
||||
uint32_t num_services;
|
||||
|
||||
num_services =
|
||||
q6core_lcl.q6core_avcs_ver_info.ver_info.
|
||||
avcs_fwk_version.num_services;
|
||||
|
||||
mutex_lock(&(q6core_lcl.ver_lock));
|
||||
pr_debug("%s: q6core_avcs_ver_info.status(%d)\n", __func__,
|
||||
q6core_lcl.q6core_avcs_ver_info.status);
|
||||
|
||||
switch (q6core_lcl.q6core_avcs_ver_info.status) {
|
||||
case VER_QUERY_SUPPORTED:
|
||||
pr_debug("%s: AVCS FWK version query already attempted\n",
|
||||
__func__);
|
||||
ret = num_services * sizeof(struct avs_svc_api_info);
|
||||
break;
|
||||
case VER_QUERY_UNSUPPORTED:
|
||||
ret = -EOPNOTSUPP;
|
||||
break;
|
||||
case VER_QUERY_UNATTEMPTED:
|
||||
pr_debug("%s: Attempting AVCS FWK version query\n", __func__);
|
||||
if (q6core_is_adsp_ready()) {
|
||||
ret = q6core_send_get_avcs_fwk_ver_cmd();
|
||||
if (ret == 0)
|
||||
ret = num_services *
|
||||
sizeof(struct avs_svc_api_info);
|
||||
} else {
|
||||
pr_err("%s: ADSP is not ready to query version\n",
|
||||
__func__);
|
||||
ret = -ENODEV;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
pr_err("%s: Invalid version query status %d\n", __func__,
|
||||
q6core_lcl.q6core_avcs_ver_info.status);
|
||||
ret = -EINVAL;
|
||||
break;
|
||||
}
|
||||
mutex_unlock(&(q6core_lcl.ver_lock));
|
||||
|
||||
if (service_id != AVCS_SERVICE_ID_ALL)
|
||||
return sizeof(struct avs_svc_api_info);
|
||||
|
||||
return ret;
|
||||
}
|
||||
EXPORT_SYMBOL(q6core_get_avcs_service_size);
|
||||
|
||||
int32_t core_set_license(uint32_t key, uint32_t module_id)
|
||||
{
|
||||
struct avcs_cmd_set_license *cmd_setl = NULL;
|
||||
|
@ -827,18 +1070,16 @@ static int q6core_init_cal_data(void)
|
|||
|
||||
static int __init core_init(void)
|
||||
{
|
||||
memset(&q6core_lcl, 0, sizeof(struct q6core_str));
|
||||
init_waitqueue_head(&q6core_lcl.bus_bw_req_wait);
|
||||
q6core_lcl.bus_bw_resp_received = 0;
|
||||
|
||||
q6core_lcl.core_handle_q = NULL;
|
||||
|
||||
init_waitqueue_head(&q6core_lcl.cmd_req_wait);
|
||||
init_waitqueue_head(&q6core_lcl.avcs_fwk_ver_req_wait);
|
||||
q6core_lcl.cmd_resp_received_flag = FLAG_NONE;
|
||||
mutex_init(&q6core_lcl.cmd_lock);
|
||||
q6core_lcl.mem_map_cal_handle = 0;
|
||||
q6core_lcl.adsp_status = 0;
|
||||
mutex_init(&q6core_lcl.ver_lock);
|
||||
|
||||
q6core_init_cal_data();
|
||||
|
||||
return 0;
|
||||
}
|
||||
module_init(core_init);
|
||||
|
@ -846,6 +1087,7 @@ module_init(core_init);
|
|||
static void __exit core_exit(void)
|
||||
{
|
||||
mutex_destroy(&q6core_lcl.cmd_lock);
|
||||
mutex_destroy(&q6core_lcl.ver_lock);
|
||||
q6core_delete_cal_data();
|
||||
}
|
||||
module_exit(core_exit);
|
||||
|
|
353
dsp/q6voice.c
353
dsp/q6voice.c
|
@ -24,8 +24,9 @@
|
|||
#include <dsp/apr_audio-v2.h>
|
||||
#include <dsp/q6afe-v2.h>
|
||||
#include <dsp/audio_cal_utils.h>
|
||||
#include <ipc/apr_tal.h>
|
||||
#include <dsp/q6core.h>
|
||||
#include <dsp/q6voice.h>
|
||||
#include <ipc/apr_tal.h>
|
||||
#include "adsp_err.h"
|
||||
|
||||
#define TIMEOUT_MS 300
|
||||
|
@ -33,6 +34,9 @@
|
|||
|
||||
#define CMD_STATUS_SUCCESS 0
|
||||
#define CMD_STATUS_FAIL 1
|
||||
#define NUM_CHANNELS_MONO 1
|
||||
#define NUM_CHANNELS_STEREO 2
|
||||
#define CVP_VERSION_2 2
|
||||
|
||||
enum {
|
||||
VOC_TOKEN_NONE,
|
||||
|
@ -83,6 +87,11 @@ static int voice_send_cvp_device_channels_cmd(struct voice_data *v);
|
|||
static int voice_send_cvp_media_format_cmd(struct voice_data *v,
|
||||
uint32_t param_type);
|
||||
static int voice_send_cvp_topology_commit_cmd(struct voice_data *v);
|
||||
static int voice_send_cvp_channel_info_cmd(struct voice_data *v);
|
||||
static int voice_send_cvp_channel_info_v2(struct voice_data *v,
|
||||
uint32_t param_type);
|
||||
static int voice_get_avcs_version_per_service(uint32_t service_id);
|
||||
|
||||
|
||||
static int voice_cvs_stop_playback(struct voice_data *v);
|
||||
static int voice_cvs_start_playback(struct voice_data *v);
|
||||
|
@ -3793,6 +3802,295 @@ int voc_unmap_rtac_block(uint32_t *mem_map_handle)
|
|||
return result;
|
||||
}
|
||||
|
||||
static int voice_send_cvp_channel_info_v2(struct voice_data *v,
|
||||
uint32_t param_type)
|
||||
{
|
||||
int ret;
|
||||
struct cvp_set_channel_info_cmd_v2 cvp_set_channel_info_cmd;
|
||||
void *apr_cvp;
|
||||
u16 cvp_handle;
|
||||
struct vss_icommon_param_data_channel_info_v2_t
|
||||
*channel_info_param_data =
|
||||
&cvp_set_channel_info_cmd.
|
||||
cvp_set_ch_info_param_v2.param_data;
|
||||
struct vss_param_vocproc_dev_channel_info_t *channel_info =
|
||||
&channel_info_param_data->channel_info;
|
||||
|
||||
if (v == NULL) {
|
||||
pr_err("%s: v is NULL\n", __func__);
|
||||
ret = -EINVAL;
|
||||
goto done;
|
||||
}
|
||||
|
||||
apr_cvp = common.apr_q6_cvp;
|
||||
if (!apr_cvp) {
|
||||
pr_err("%s: apr_cvp is NULL\n", __func__);
|
||||
ret = -EINVAL;
|
||||
goto done;
|
||||
}
|
||||
|
||||
cvp_handle = voice_get_cvp_handle(v);
|
||||
memset(&cvp_set_channel_info_cmd, 0, sizeof(cvp_set_channel_info_cmd));
|
||||
|
||||
cvp_set_channel_info_cmd.hdr.hdr_field =
|
||||
APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD, APR_HDR_LEN(APR_HDR_SIZE),
|
||||
APR_PKT_VER);
|
||||
cvp_set_channel_info_cmd.hdr.pkt_size =
|
||||
APR_PKT_SIZE(APR_HDR_SIZE,
|
||||
sizeof(cvp_set_channel_info_cmd) - APR_HDR_SIZE);
|
||||
cvp_set_channel_info_cmd.hdr.src_svc = 0;
|
||||
cvp_set_channel_info_cmd.hdr.src_domain = APR_DOMAIN_APPS;
|
||||
cvp_set_channel_info_cmd.hdr.src_port =
|
||||
voice_get_idx_for_session(v->session_id);
|
||||
cvp_set_channel_info_cmd.hdr.dest_svc = 0;
|
||||
cvp_set_channel_info_cmd.hdr.dest_domain = APR_DOMAIN_ADSP;
|
||||
cvp_set_channel_info_cmd.hdr.dest_port = cvp_handle;
|
||||
cvp_set_channel_info_cmd.hdr.token = 0;
|
||||
cvp_set_channel_info_cmd.hdr.opcode = VSS_ICOMMON_CMD_SET_PARAM_V2;
|
||||
|
||||
cvp_set_channel_info_cmd.cvp_set_ch_info_param_v2.mem_size =
|
||||
sizeof(struct vss_icommon_param_data_channel_info_v2_t);
|
||||
|
||||
channel_info_param_data->module_id = VSS_MODULE_CVD_GENERIC;
|
||||
channel_info_param_data->param_size =
|
||||
sizeof(struct vss_param_vocproc_dev_channel_info_t);
|
||||
|
||||
/* Device specific data */
|
||||
switch (param_type) {
|
||||
case RX_PATH:
|
||||
channel_info_param_data->param_id =
|
||||
VSS_PARAM_VOCPROC_RX_CHANNEL_INFO;
|
||||
channel_info->num_channels = v->dev_rx.no_of_channels;
|
||||
channel_info->bits_per_sample = v->dev_rx.bits_per_sample;
|
||||
break;
|
||||
|
||||
case TX_PATH:
|
||||
channel_info_param_data->param_id =
|
||||
VSS_PARAM_VOCPROC_TX_CHANNEL_INFO;
|
||||
channel_info->num_channels = v->dev_tx.no_of_channels;
|
||||
channel_info->bits_per_sample = v->dev_tx.bits_per_sample;
|
||||
break;
|
||||
|
||||
case EC_REF_PATH:
|
||||
channel_info_param_data->param_id =
|
||||
VSS_PARAM_VOCPROC_EC_REF_CHANNEL_INFO;
|
||||
channel_info->num_channels = v->dev_rx.no_of_channels;
|
||||
channel_info->bits_per_sample = v->dev_rx.bits_per_sample;
|
||||
break;
|
||||
default:
|
||||
pr_err("%s: Invalid param type\n",
|
||||
__func__);
|
||||
ret = -EINVAL;
|
||||
goto done;
|
||||
}
|
||||
|
||||
if (channel_info->num_channels == NUM_CHANNELS_MONO) {
|
||||
channel_info->channel_mapping[0] = PCM_CHANNEL_FC;
|
||||
} else if (channel_info->num_channels == NUM_CHANNELS_STEREO) {
|
||||
channel_info->channel_mapping[0] = PCM_CHANNEL_FL;
|
||||
channel_info->channel_mapping[1] = PCM_CHANNEL_FR;
|
||||
} else {
|
||||
pr_err("%s: Unsupported num channels: %d\n",
|
||||
__func__, channel_info->num_channels);
|
||||
ret = -EINVAL;
|
||||
goto done;
|
||||
}
|
||||
|
||||
v->cvp_state = CMD_STATUS_FAIL;
|
||||
v->async_err = 0;
|
||||
ret = apr_send_pkt(apr_cvp, (uint32_t *) &cvp_set_channel_info_cmd);
|
||||
if (ret < 0) {
|
||||
pr_err("%s: Failed to send VSS_ICOMMON_CMD_SET_PARAM_V2\n",
|
||||
__func__);
|
||||
goto done;
|
||||
}
|
||||
|
||||
ret = wait_event_timeout(v->cvp_wait,
|
||||
(v->cvp_state == CMD_STATUS_SUCCESS),
|
||||
msecs_to_jiffies(TIMEOUT_MS));
|
||||
if (!ret) {
|
||||
pr_err("%s: wait_event timeout\n", __func__);
|
||||
ret = -ETIMEDOUT;
|
||||
goto done;
|
||||
}
|
||||
|
||||
if (v->async_err > 0) {
|
||||
pr_err("%s: DSP returned error[%s] handle = %d\n", __func__,
|
||||
adsp_err_get_err_str(v->async_err), cvp_handle);
|
||||
ret = adsp_err_get_lnx_err_code(v->async_err);
|
||||
goto done;
|
||||
}
|
||||
ret = 0;
|
||||
done:
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int voice_send_cvp_channel_info_cmd(struct voice_data *v)
|
||||
{
|
||||
int ret = 0;
|
||||
|
||||
ret = voice_send_cvp_channel_info_v2(v, RX_PATH);
|
||||
if (ret < 0) {
|
||||
pr_err("%s: Error in sending cvp_channel_info RX: %d\n",
|
||||
__func__, ret);
|
||||
goto done;
|
||||
}
|
||||
|
||||
ret = voice_send_cvp_channel_info_v2(v, TX_PATH);
|
||||
if (ret < 0) {
|
||||
pr_err("%s: Error in sending cvp_channel_info TX: %d\n",
|
||||
__func__, ret);
|
||||
goto done;
|
||||
}
|
||||
|
||||
ret = voice_send_cvp_channel_info_v2(v, EC_REF_PATH);
|
||||
if (ret < 0) {
|
||||
pr_err("%s: Error in sending cvp_channel_info EC Ref: %d\n",
|
||||
__func__, ret);
|
||||
goto done;
|
||||
}
|
||||
done:
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int voice_send_cvp_mfc_config_v2(struct voice_data *v)
|
||||
{
|
||||
int ret;
|
||||
struct cvp_set_mfc_config_cmd_v2 cvp_set_mfc_config_cmd;
|
||||
void *apr_cvp;
|
||||
u16 cvp_handle;
|
||||
struct vss_icommon_param_data_mfc_config_v2_t *cvp_config_param_data =
|
||||
&cvp_set_mfc_config_cmd.cvp_set_mfc_param_v2.param_data;
|
||||
struct vss_param_mfc_config_info_t *mfc_config_info =
|
||||
&cvp_config_param_data->mfc_config_info;
|
||||
|
||||
if (v == NULL) {
|
||||
pr_err("%s: v is NULL\n", __func__);
|
||||
ret = -EINVAL;
|
||||
goto done;
|
||||
}
|
||||
|
||||
apr_cvp = common.apr_q6_cvp;
|
||||
if (!apr_cvp) {
|
||||
pr_err("%s: apr_cvp is NULL\n", __func__);
|
||||
ret = -EINVAL;
|
||||
goto done;
|
||||
}
|
||||
|
||||
cvp_handle = voice_get_cvp_handle(v);
|
||||
memset(&cvp_set_mfc_config_cmd, 0, sizeof(cvp_set_mfc_config_cmd));
|
||||
|
||||
cvp_set_mfc_config_cmd.hdr.hdr_field =
|
||||
APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD, APR_HDR_LEN(APR_HDR_SIZE),
|
||||
APR_PKT_VER);
|
||||
cvp_set_mfc_config_cmd.hdr.pkt_size =
|
||||
APR_PKT_SIZE(APR_HDR_SIZE,
|
||||
sizeof(cvp_set_mfc_config_cmd) - APR_HDR_SIZE);
|
||||
cvp_set_mfc_config_cmd.hdr.src_svc = 0;
|
||||
cvp_set_mfc_config_cmd.hdr.src_domain = APR_DOMAIN_APPS;
|
||||
cvp_set_mfc_config_cmd.hdr.src_port =
|
||||
voice_get_idx_for_session(v->session_id);
|
||||
cvp_set_mfc_config_cmd.hdr.dest_svc = 0;
|
||||
cvp_set_mfc_config_cmd.hdr.dest_domain = APR_DOMAIN_ADSP;
|
||||
cvp_set_mfc_config_cmd.hdr.dest_port = cvp_handle;
|
||||
cvp_set_mfc_config_cmd.hdr.token = 0;
|
||||
cvp_set_mfc_config_cmd.hdr.opcode = VSS_ICOMMON_CMD_SET_PARAM_V2;
|
||||
cvp_set_mfc_config_cmd.cvp_set_mfc_param_v2.mem_size =
|
||||
sizeof(struct vss_icommon_param_data_mfc_config_v2_t);
|
||||
|
||||
cvp_config_param_data->module_id = AUDPROC_MODULE_ID_MFC;
|
||||
cvp_config_param_data->param_id =
|
||||
AUDPROC_PARAM_ID_MFC_OUTPUT_MEDIA_FORMAT;
|
||||
cvp_config_param_data->param_size =
|
||||
sizeof(struct vss_param_mfc_config_info_t);
|
||||
|
||||
mfc_config_info->num_channels = v->dev_rx.no_of_channels;
|
||||
mfc_config_info->bits_per_sample = 16;
|
||||
mfc_config_info->sample_rate = v->dev_rx.sample_rate;
|
||||
|
||||
if (mfc_config_info->num_channels == NUM_CHANNELS_MONO) {
|
||||
mfc_config_info->channel_type[0] = PCM_CHANNEL_FC;
|
||||
} else if (mfc_config_info->num_channels == NUM_CHANNELS_STEREO) {
|
||||
mfc_config_info->channel_type[0] = PCM_CHANNEL_FL;
|
||||
mfc_config_info->channel_type[1] = PCM_CHANNEL_FR;
|
||||
} else {
|
||||
pr_err("%s: Unsupported num channels: %d\n",
|
||||
__func__, mfc_config_info->num_channels);
|
||||
ret = -EINVAL;
|
||||
goto done;
|
||||
}
|
||||
|
||||
v->cvp_state = CMD_STATUS_FAIL;
|
||||
v->async_err = 0;
|
||||
ret = apr_send_pkt(apr_cvp, (uint32_t *)&cvp_set_mfc_config_cmd);
|
||||
if (ret < 0) {
|
||||
pr_err("%s: Failed to send VSS_ICOMMON_CMD_SET_PARAM_V2 %d\n",
|
||||
__func__, ret);
|
||||
goto done;
|
||||
}
|
||||
ret = wait_event_timeout(v->cvp_wait,
|
||||
(v->cvp_state == CMD_STATUS_SUCCESS),
|
||||
msecs_to_jiffies(TIMEOUT_MS));
|
||||
|
||||
if (!ret) {
|
||||
pr_err("%s: wait_event timeout\n", __func__);
|
||||
ret = -ETIMEDOUT;
|
||||
goto done;
|
||||
}
|
||||
|
||||
if (v->async_err > 0) {
|
||||
pr_err("%s: DSP returned error[%s] handle = %d\n", __func__,
|
||||
adsp_err_get_err_str(v->async_err), cvp_handle);
|
||||
ret = adsp_err_get_lnx_err_code(v->async_err);
|
||||
goto done;
|
||||
}
|
||||
ret = 0;
|
||||
done:
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int voice_send_cvp_mfc_config_cmd(struct voice_data *v)
|
||||
{
|
||||
int ret = 0;
|
||||
|
||||
if (common.cvp_version >= CVP_VERSION_2) {
|
||||
ret = voice_send_cvp_mfc_config_v2(v);
|
||||
} else {
|
||||
pr_warn("%s: CVP Version not supported\n", __func__);
|
||||
ret = -EINVAL;
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int voice_get_avcs_version_per_service(uint32_t service_id)
|
||||
{
|
||||
int ret = 0;
|
||||
size_t svc_size;
|
||||
struct avcs_fwk_ver_info ver_info = {{0}, NULL};
|
||||
|
||||
if (service_id == AVCS_SERVICE_ID_ALL) {
|
||||
pr_err("%s: Invalid service id: %d", __func__,
|
||||
AVCS_SERVICE_ID_ALL);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
svc_size = sizeof(struct avs_svc_api_info);
|
||||
ver_info.services = kzalloc(svc_size, GFP_KERNEL);
|
||||
if (ver_info.services == NULL)
|
||||
return -ENOMEM;
|
||||
|
||||
ret = q6core_get_service_version(service_id, &ver_info, svc_size);
|
||||
if (ret < 0)
|
||||
goto done;
|
||||
|
||||
ret = ver_info.services[0].api_version;
|
||||
common.is_avcs_version_queried = true;
|
||||
done:
|
||||
kfree(ver_info.services);
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int voice_setup_vocproc(struct voice_data *v)
|
||||
{
|
||||
int ret = 0;
|
||||
|
@ -3803,6 +4101,18 @@ static int voice_setup_vocproc(struct voice_data *v)
|
|||
goto fail;
|
||||
}
|
||||
|
||||
if (common.is_avcs_version_queried == false)
|
||||
common.cvp_version = voice_get_avcs_version_per_service(
|
||||
APRV2_IDS_SERVICE_ID_ADSP_CVP_V);
|
||||
|
||||
if (common.cvp_version < 0) {
|
||||
pr_err("%s: Invalid CVP version %d\n",
|
||||
__func__, common.cvp_version);
|
||||
ret = -EINVAL;
|
||||
goto fail;
|
||||
}
|
||||
pr_debug("%s: CVP Version %d\n", __func__, common.cvp_version);
|
||||
|
||||
ret = voice_send_cvp_media_fmt_info_cmd(v);
|
||||
if (ret < 0) {
|
||||
pr_err("%s: Set media format info failed err:%d\n", __func__,
|
||||
|
@ -3817,6 +4127,15 @@ static int voice_setup_vocproc(struct voice_data *v)
|
|||
goto fail;
|
||||
}
|
||||
|
||||
/* Send MFC config only when the no of channels are more than 1 */
|
||||
if (v->dev_rx.no_of_channels > NUM_CHANNELS_MONO) {
|
||||
ret = voice_send_cvp_mfc_config_cmd(v);
|
||||
if (ret < 0) {
|
||||
pr_warn("%s: Set mfc config failed err:%d\n",
|
||||
__func__, ret);
|
||||
}
|
||||
}
|
||||
|
||||
voice_send_cvs_register_cal_cmd(v);
|
||||
voice_send_cvp_register_dev_cfg_cmd(v);
|
||||
voice_send_cvp_register_cal_cmd(v);
|
||||
|
@ -3962,11 +4281,18 @@ static int voice_send_cvp_device_channels_cmd(struct voice_data *v)
|
|||
|
||||
static int voice_send_cvp_media_fmt_info_cmd(struct voice_data *v)
|
||||
{
|
||||
int ret;
|
||||
int ret = 0;
|
||||
|
||||
ret = voice_send_cvp_device_channels_cmd(v);
|
||||
if (ret < 0)
|
||||
if (common.cvp_version < CVP_VERSION_2)
|
||||
ret = voice_send_cvp_device_channels_cmd(v);
|
||||
else
|
||||
ret = voice_send_cvp_channel_info_cmd(v);
|
||||
|
||||
if (ret < 0) {
|
||||
pr_err("%s: Set channel info failed err: %d\n", __func__,
|
||||
ret);
|
||||
goto done;
|
||||
}
|
||||
|
||||
if (voice_get_cvd_int_version(common.cvd_version) >=
|
||||
CVD_INT_VERSION_2_3) {
|
||||
|
@ -3994,7 +4320,7 @@ static int voice_send_cvp_media_format_cmd(struct voice_data *v,
|
|||
void *apr_cvp;
|
||||
u16 cvp_handle;
|
||||
struct vss_icommon_param_data_t *media_fmt_param_data =
|
||||
&cvp_set_media_format_cmd.cvp_set_param_v2.param_data;
|
||||
&cvp_set_media_format_cmd.cvp_set_media_param_v2.param_data;
|
||||
struct vss_param_endpoint_media_format_info_t *media_fmt_info =
|
||||
&media_fmt_param_data->media_format_info;
|
||||
|
||||
|
@ -4032,7 +4358,7 @@ static int voice_send_cvp_media_format_cmd(struct voice_data *v,
|
|||
cvp_set_media_format_cmd.hdr.opcode = VSS_ICOMMON_CMD_SET_PARAM_V2;
|
||||
|
||||
/* Fill param data */
|
||||
cvp_set_media_format_cmd.cvp_set_param_v2.mem_size =
|
||||
cvp_set_media_format_cmd.cvp_set_media_param_v2.mem_size =
|
||||
sizeof(struct vss_icommon_param_data_t);
|
||||
media_fmt_param_data->module_id = VSS_MODULE_CVD_GENERIC;
|
||||
media_fmt_param_data->param_size =
|
||||
|
@ -6197,6 +6523,15 @@ int voc_enable_device(uint32_t session_id)
|
|||
goto done;
|
||||
}
|
||||
|
||||
/* Send MFC config only when the no of channels are > 1 */
|
||||
if (v->dev_rx.no_of_channels > NUM_CHANNELS_MONO) {
|
||||
ret = voice_send_cvp_mfc_config_cmd(v);
|
||||
if (ret < 0) {
|
||||
pr_warn("%s: Set mfc config failed err: %d\n",
|
||||
__func__, ret);
|
||||
}
|
||||
}
|
||||
|
||||
voice_send_cvp_register_dev_cfg_cmd(v);
|
||||
voice_send_cvp_register_cal_cmd(v);
|
||||
voice_send_cvp_register_vol_cal_cmd(v);
|
||||
|
@ -7054,7 +7389,8 @@ static int32_t qdsp_cvp_callback(struct apr_client_data *data, void *priv)
|
|||
case VSS_ICOMMON_CMD_SET_PARAM_V2:
|
||||
switch (data->token) {
|
||||
case VOC_SET_MEDIA_FORMAT_PARAM_TOKEN:
|
||||
pr_debug("%s: VSS_ICOMMON_CMD_SET_PARAM_V2 called by voice_send_cvp_media_format_cmd\n",
|
||||
case VOC_GENERIC_SET_PARAM_TOKEN:
|
||||
pr_debug("%s: VSS_ICOMMON_CMD_SET_PARAM_V2 called\n",
|
||||
__func__);
|
||||
v->cvp_state = CMD_STATUS_SUCCESS;
|
||||
v->async_err = ptr[1];
|
||||
|
@ -8566,7 +8902,8 @@ static int __init voice_init(void)
|
|||
common.default_vol_step_val = 0;
|
||||
common.default_vol_ramp_duration_ms = DEFAULT_VOLUME_RAMP_DURATION;
|
||||
common.default_mute_ramp_duration_ms = DEFAULT_MUTE_RAMP_DURATION;
|
||||
|
||||
common.cvp_version = 0;
|
||||
common.is_avcs_version_queried = false;
|
||||
/* Initialize EC Ref media format info */
|
||||
common.ec_ref_ext = false;
|
||||
common.ec_media_fmt_info.port_id = AFE_PORT_INVALID;
|
||||
|
|
|
@ -8537,6 +8537,8 @@ struct asm_eq_params {
|
|||
#define VSS_ICOMMON_CMD_GET_PARAM_V2 0x0001133E
|
||||
#define VSS_ICOMMON_RSP_GET_PARAM 0x00011008
|
||||
|
||||
#define VSS_MAX_AVCS_NUM_SERVICES 25
|
||||
|
||||
/* ID of the Bass Boost module.
|
||||
* This module supports the following parameter IDs:
|
||||
* - #AUDPROC_PARAM_ID_BASS_BOOST_ENABLE
|
||||
|
@ -9197,6 +9199,74 @@ struct asm_aptx_dec_fmt_blk_v2 {
|
|||
*/
|
||||
} __packed;
|
||||
|
||||
/* Q6Core Specific */
|
||||
#define AVCS_CMD_GET_FWK_VERSION (0x0001292C)
|
||||
#define AVCS_CMDRSP_GET_FWK_VERSION (0x0001292D)
|
||||
|
||||
#define AVCS_SERVICE_ID_ALL (0xFFFFFFFF)
|
||||
#define APRV2_IDS_SERVICE_ID_ADSP_CVP_V (0xB)
|
||||
|
||||
struct avcs_get_fwk_version {
|
||||
/*
|
||||
* Indicates the major version of the AVS build.
|
||||
* This value is incremented on chipset family boundaries.
|
||||
*/
|
||||
uint32_t build_major_version;
|
||||
|
||||
/*
|
||||
* Minor version of the AVS build.
|
||||
* This value represents the mainline to which the AVS build belongs.
|
||||
*/
|
||||
uint32_t build_minor_version;
|
||||
|
||||
/* Indicates the AVS branch version to which the image belongs. */
|
||||
uint32_t build_branch_version;
|
||||
|
||||
/* Indicates the AVS sub-branch or customer product line information. */
|
||||
uint32_t build_subbranch_version;
|
||||
|
||||
/* Number of supported AVS services in the current build. */
|
||||
uint32_t num_services;
|
||||
};
|
||||
|
||||
struct avs_svc_api_info {
|
||||
/*
|
||||
* APRV2 service IDs for the individual static services.
|
||||
*
|
||||
* @values
|
||||
* - APRV2_IDS_SERVICE_ID_ADSP_CORE_V
|
||||
* - APRV2_IDS_SERVICE_ID_ADSP_AFE_V
|
||||
* - APRV2_IDS_SERVICE_ID_ADSP_ASM_V
|
||||
* - APRV2_IDS_SERVICE_ID_ADSP_ADM_V
|
||||
* - APRV2_IDS_SERVICE_ID_ADSP_MVM_V
|
||||
* - APRV2_IDS_SERVICE_ID_ADSP_CVS_V
|
||||
* - APRV2_IDS_SERVICE_ID_ADSP_CVP_V
|
||||
* - APRV2_IDS_SERVICE_ID_ADSP_LSM_V
|
||||
*/
|
||||
uint32_t service_id;
|
||||
|
||||
/*
|
||||
* Indicates the API version of the service.
|
||||
*
|
||||
* Each new API update that warrants a change on the HLOS side triggers
|
||||
* an increment in the version.
|
||||
*/
|
||||
uint32_t api_version;
|
||||
|
||||
/*
|
||||
* Indicates the API increments on a sub-branch (not on the mainline).
|
||||
*
|
||||
* API branch version numbers can increment independently on different
|
||||
* sub-branches.
|
||||
*/
|
||||
uint32_t api_branch_version;
|
||||
};
|
||||
|
||||
struct avcs_fwk_ver_info {
|
||||
struct avcs_get_fwk_version avcs_fwk_version;
|
||||
struct avs_svc_api_info *services;
|
||||
} __packed;
|
||||
|
||||
/* LSM Specific */
|
||||
#define VW_FEAT_DIM (39)
|
||||
|
||||
|
|
|
@ -13,6 +13,7 @@
|
|||
#ifndef __Q6CORE_H__
|
||||
#define __Q6CORE_H__
|
||||
#include <ipc/apr.h>
|
||||
#include <dsp/apr_audio-v2.h>
|
||||
|
||||
|
||||
|
||||
|
@ -21,6 +22,11 @@
|
|||
|
||||
bool q6core_is_adsp_ready(void);
|
||||
|
||||
int q6core_get_service_version(uint32_t service_id,
|
||||
struct avcs_fwk_ver_info *ver_info,
|
||||
size_t size);
|
||||
size_t q6core_get_avcs_service_size(uint32_t service_id);
|
||||
|
||||
#define ADSP_CMD_SET_DTS_EAGLE_DATA_ID 0x00012919
|
||||
#define DTS_EAGLE_LICENSE_ID 0x00028346
|
||||
struct adsp_dts_eagle {
|
||||
|
|
|
@ -124,7 +124,7 @@ struct media_format_info {
|
|||
};
|
||||
|
||||
enum {
|
||||
VOC_NO_SET_PARAM_TOKEN = 0,
|
||||
VOC_GENERIC_SET_PARAM_TOKEN = 0,
|
||||
VOC_RTAC_SET_PARAM_TOKEN,
|
||||
VOC_SET_MEDIA_FORMAT_PARAM_TOKEN,
|
||||
VOC_SET_PARAM_TOKEN_MAX
|
||||
|
@ -239,6 +239,19 @@ struct vss_param_endpoint_media_format_info_t {
|
|||
uint8_t channel_mapping[VSS_NUM_CHANNELS_MAX];
|
||||
} __packed;
|
||||
|
||||
struct vss_param_vocproc_dev_channel_info_t {
|
||||
uint32_t num_channels;
|
||||
uint32_t bits_per_sample;
|
||||
uint8_t channel_mapping[VSS_NUM_CHANNELS_MAX];
|
||||
} __packed;
|
||||
|
||||
struct vss_param_mfc_config_info_t {
|
||||
uint32_t sample_rate;
|
||||
uint16_t bits_per_sample;
|
||||
uint16_t num_channels;
|
||||
uint16_t channel_type[VSS_NUM_CHANNELS_MAX];
|
||||
} __packed;
|
||||
|
||||
struct vss_icommon_param_data_t {
|
||||
/* Valid ID of the module. */
|
||||
uint32_t module_id;
|
||||
|
@ -260,6 +273,88 @@ struct vss_icommon_param_data_t {
|
|||
};
|
||||
} __packed;
|
||||
|
||||
struct vss_icommon_param_data_channel_info_v2_t {
|
||||
/* Valid ID of the module. */
|
||||
uint32_t module_id;
|
||||
/* Valid ID of the parameter. */
|
||||
uint32_t param_id;
|
||||
/*
|
||||
* Data size of the structure relating to the param_id/module_id
|
||||
* combination in uint8_t bytes.
|
||||
*/
|
||||
uint16_t param_size;
|
||||
/* This field must be set to zero. */
|
||||
uint16_t reserved;
|
||||
struct vss_param_vocproc_dev_channel_info_t channel_info;
|
||||
} __packed;
|
||||
|
||||
struct vss_icommon_cmd_set_param_channel_info_v2_t {
|
||||
/*
|
||||
* Pointer to the unique identifier for an address (physical/virtual).
|
||||
*
|
||||
* If the parameter data payload is within the message payload
|
||||
* (in-band), set this field to 0. The parameter data begins at the
|
||||
* specified data payload address.
|
||||
*
|
||||
* If the parameter data is out-of-band, this field is the handle to
|
||||
* the physical address in the shared memory that holds the parameter
|
||||
* data.
|
||||
*/
|
||||
uint32_t mem_handle;
|
||||
/*
|
||||
* Location of the parameter data payload.
|
||||
*
|
||||
* The payload is an array of vss_icommon_param_data_t. If the
|
||||
* mem_handle is 0, this field is ignored.
|
||||
*/
|
||||
uint64_t mem_address;
|
||||
/* Size of the parameter data payload in bytes. */
|
||||
uint32_t mem_size;
|
||||
struct vss_icommon_param_data_channel_info_v2_t param_data;
|
||||
} __packed;
|
||||
|
||||
struct vss_icommon_param_data_mfc_config_v2_t {
|
||||
/* Valid ID of the module. */
|
||||
uint32_t module_id;
|
||||
/* Valid ID of the parameter. */
|
||||
uint32_t param_id;
|
||||
/*
|
||||
* Data size of the structure relating to the param_id/module_id
|
||||
* combination in uint8_t bytes.
|
||||
*/
|
||||
uint16_t param_size;
|
||||
/* This field must be set to zero. */
|
||||
uint16_t reserved;
|
||||
struct vss_param_mfc_config_info_t mfc_config_info;
|
||||
} __packed;
|
||||
|
||||
struct vss_icommon_cmd_set_param_mfc_config_v2_t {
|
||||
/*
|
||||
* Pointer to the unique identifier for an address (physical/virtual).
|
||||
*
|
||||
* If the parameter data payload is within the message payload
|
||||
* (in-band), set this field to 0. The parameter data begins at the
|
||||
* specified data payload address.
|
||||
*
|
||||
* If the parameter data is out-of-band, this field is the handle to
|
||||
* the physical address in the shared memory that holds the parameter
|
||||
* data.
|
||||
*/
|
||||
|
||||
uint32_t mem_handle;
|
||||
/*
|
||||
* Location of the parameter data payload.
|
||||
*
|
||||
* The payload is an array of vss_icommon_param_data_t. If the
|
||||
* mem_handle is 0, this field is ignored.
|
||||
*/
|
||||
uint64_t mem_address;
|
||||
/* Size of the parameter data payload in bytes. */
|
||||
uint32_t mem_size;
|
||||
|
||||
struct vss_icommon_param_data_mfc_config_v2_t param_data;
|
||||
} __packed;
|
||||
|
||||
/* Payload structure for the VSS_ICOMMON_CMD_SET_PARAM_V2 command. */
|
||||
struct vss_icommon_cmd_set_param_v2_t {
|
||||
/*
|
||||
|
@ -674,6 +769,12 @@ struct vss_imemory_cmd_unmap_t {
|
|||
#define VSS_IRECORD_MODE_TX_RX_MIXING 0x00010F7B
|
||||
/* Select mixed Tx and Rx paths. */
|
||||
|
||||
#define VSS_PARAM_VOCPROC_TX_CHANNEL_INFO 0x0001328E
|
||||
|
||||
#define VSS_PARAM_VOCPROC_RX_CHANNEL_INFO 0x0001328F
|
||||
|
||||
#define VSS_PARAM_VOCPROC_EC_REF_CHANNEL_INFO 0x00013290
|
||||
|
||||
#define VSS_PARAM_TX_PORT_ENDPOINT_MEDIA_INFO 0x00013253
|
||||
|
||||
#define VSS_PARAM_RX_PORT_ENDPOINT_MEDIA_INFO 0x00013254
|
||||
|
@ -1485,7 +1586,18 @@ struct cvp_set_dev_channels_cmd {
|
|||
|
||||
struct cvp_set_media_format_cmd {
|
||||
struct apr_hdr hdr;
|
||||
struct vss_icommon_cmd_set_param_v2_t cvp_set_param_v2;
|
||||
struct vss_icommon_cmd_set_param_v2_t cvp_set_media_param_v2;
|
||||
} __packed;
|
||||
|
||||
struct cvp_set_channel_info_cmd_v2 {
|
||||
struct apr_hdr hdr;
|
||||
struct vss_icommon_cmd_set_param_channel_info_v2_t
|
||||
cvp_set_ch_info_param_v2;
|
||||
} __packed;
|
||||
|
||||
struct cvp_set_mfc_config_cmd_v2 {
|
||||
struct apr_hdr hdr;
|
||||
struct vss_icommon_cmd_set_param_mfc_config_v2_t cvp_set_mfc_param_v2;
|
||||
} __packed;
|
||||
|
||||
struct cvp_set_vp3_data_cmd {
|
||||
|
@ -1756,6 +1868,8 @@ struct common_data {
|
|||
bool srvcc_rec_flag;
|
||||
bool is_destroy_cvd;
|
||||
char cvd_version[CVD_VERSION_STRING_MAX_SIZE];
|
||||
int cvp_version;
|
||||
bool is_avcs_version_queried;
|
||||
bool is_per_vocoder_cal_enabled;
|
||||
bool is_sound_focus_resp_success;
|
||||
bool is_source_tracking_resp_success;
|
||||
|
|
|
@ -26,7 +26,7 @@
|
|||
#include "core.h"
|
||||
#include "pinctrl-utils.h"
|
||||
|
||||
#define LPI_ADDRESS_SIZE 0xC000
|
||||
#define LPI_ADDRESS_SIZE 0x20000
|
||||
|
||||
#define LPI_GPIO_REG_VAL_CTL 0x00
|
||||
#define LPI_GPIO_REG_DIR_CTL 0x04
|
||||
|
@ -109,35 +109,35 @@ static const u32 lpi_offset[] = {
|
|||
0x00000000,
|
||||
0x00001000,
|
||||
0x00002000,
|
||||
0x00002010,
|
||||
0x00003000,
|
||||
0x00003010,
|
||||
0x00004000,
|
||||
0x00004010,
|
||||
0x00005000,
|
||||
0x00005010,
|
||||
0x00005020,
|
||||
0x00005030,
|
||||
0x00006000,
|
||||
0x00006010,
|
||||
0x00007000,
|
||||
0x00007010,
|
||||
0x00005040,
|
||||
0x00005050,
|
||||
0x00008000,
|
||||
0x00008010,
|
||||
0x00008020,
|
||||
0x00008030,
|
||||
0x00008040,
|
||||
0x00008050,
|
||||
0x00008060,
|
||||
0x00008070,
|
||||
0x00009000,
|
||||
0x00009010,
|
||||
0x0000A000,
|
||||
0x0000A010,
|
||||
0x0000B000,
|
||||
0x0000B010,
|
||||
0x0000C000,
|
||||
0x0000D000,
|
||||
0x0000E000,
|
||||
0x0000F000,
|
||||
0x00010000,
|
||||
0x00011000,
|
||||
0x00012000,
|
||||
0x00013000,
|
||||
0x00014000,
|
||||
0x00015000,
|
||||
0x00016000,
|
||||
0x00017000,
|
||||
0x00018000,
|
||||
0x00019000,
|
||||
0x0001A000,
|
||||
0x0001B000,
|
||||
0x0001C000,
|
||||
0x0001D000,
|
||||
0x0001E000,
|
||||
0x0001F000,
|
||||
};
|
||||
|
||||
static const char *const lpi_gpio_functions[] = {
|
||||
|
|
Loading…
Add table
Reference in a new issue