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:

committed by
Gerrit - the friendly Code Review server

parent
8c87858751
commit
38070be30b
@@ -938,7 +938,7 @@ static int msm_sdw_vi_feed_mixer_get(struct snd_kcontrol *kcontrol,
|
|||||||
struct snd_ctl_elem_value *ucontrol)
|
struct snd_ctl_elem_value *ucontrol)
|
||||||
{
|
{
|
||||||
struct snd_soc_dapm_widget *widget =
|
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 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 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_ctl_elem_value *ucontrol)
|
||||||
{
|
{
|
||||||
struct snd_soc_dapm_widget *widget =
|
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 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 msm_sdw_priv *msm_sdw_p = snd_soc_codec_get_drvdata(codec);
|
||||||
struct soc_multi_mixer_control *mixer =
|
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 snd_info_entry *version_entry;
|
||||||
struct msm_sdw_priv *msm_sdw;
|
struct msm_sdw_priv *msm_sdw;
|
||||||
struct snd_soc_card *card;
|
struct snd_soc_card *card;
|
||||||
|
char name[80];
|
||||||
|
|
||||||
if (!codec_root || !codec)
|
if (!codec_root || !codec)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
msm_sdw = snd_soc_codec_get_drvdata(codec);
|
msm_sdw = snd_soc_codec_get_drvdata(codec);
|
||||||
card = codec->component.card;
|
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,
|
msm_sdw->entry = snd_info_create_subdir(codec_root->module,
|
||||||
"152c1000.msm-sdw-codec",
|
(const char *)name,
|
||||||
codec_root);
|
codec_root);
|
||||||
if (!msm_sdw->entry) {
|
if (!msm_sdw->entry) {
|
||||||
dev_err(codec->dev, "%s: failed to create msm_sdw entry\n",
|
dev_err(codec->dev, "%s: failed to create msm_sdw entry\n",
|
||||||
__func__);
|
__func__);
|
||||||
|
@@ -179,6 +179,8 @@ struct wcd9xxx_pdata {
|
|||||||
int irq_base;
|
int irq_base;
|
||||||
int num_irqs;
|
int num_irqs;
|
||||||
int reset_gpio;
|
int reset_gpio;
|
||||||
|
bool has_buck_vsel_gpio;
|
||||||
|
struct device_node *buck_vsel_ctl_np;
|
||||||
struct device_node *wcd_rst_np;
|
struct device_node *wcd_rst_np;
|
||||||
struct wcd9xxx_amic amic_settings;
|
struct wcd9xxx_amic amic_settings;
|
||||||
struct slim_device slimbus_slave_device;
|
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 */
|
/* Go through the list of segments and download one by one */
|
||||||
list_for_each_entry(seg, wdsp->seg_list, list) {
|
list_for_each_entry(seg, wdsp->seg_list, list) {
|
||||||
ret = wdsp_load_each_segment(wdsp, seg);
|
ret = wdsp_load_each_segment(wdsp, seg);
|
||||||
if (ret < 0) {
|
if (ret)
|
||||||
wdsp_broadcast_event_downseq(wdsp,
|
|
||||||
WDSP_EVENT_DLOAD_FAILED,
|
|
||||||
NULL);
|
|
||||||
goto dload_error;
|
goto dload_error;
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Flush the list before setting status and notifying components */
|
||||||
|
wdsp_flush_segment_list(wdsp->seg_list);
|
||||||
|
|
||||||
WDSP_SET_STATUS(wdsp, status);
|
WDSP_SET_STATUS(wdsp, status);
|
||||||
|
|
||||||
/* Notify all components that image is downloaded */
|
/* Notify all components that image is downloaded */
|
||||||
wdsp_broadcast_event_downseq(wdsp, post, NULL);
|
wdsp_broadcast_event_downseq(wdsp, post, NULL);
|
||||||
|
done:
|
||||||
|
return ret;
|
||||||
|
|
||||||
dload_error:
|
dload_error:
|
||||||
wdsp_flush_segment_list(wdsp->seg_list);
|
wdsp_flush_segment_list(wdsp->seg_list);
|
||||||
done:
|
wdsp_broadcast_event_downseq(wdsp, WDSP_EVENT_DLOAD_FAILED, NULL);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -486,10 +487,14 @@ static int wdsp_enable_dsp(struct wdsp_mgr_priv *wdsp)
|
|||||||
/* Make sure wdsp is in good state */
|
/* Make sure wdsp is in good state */
|
||||||
if (!WDSP_STATUS_IS_SET(wdsp, WDSP_STATUS_CODE_DLOADED)) {
|
if (!WDSP_STATUS_IS_SET(wdsp, WDSP_STATUS_CODE_DLOADED)) {
|
||||||
WDSP_ERR(wdsp, "WDSP in invalid state 0x%x", wdsp->status);
|
WDSP_ERR(wdsp, "WDSP in invalid state 0x%x", wdsp->status);
|
||||||
ret = -EINVAL;
|
return -EINVAL;
|
||||||
goto done;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* 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 */
|
/* Download the read-write sections of image */
|
||||||
ret = wdsp_download_segments(wdsp, WDSP_ELF_FLAG_WRITE);
|
ret = wdsp_download_segments(wdsp, WDSP_ELF_FLAG_WRITE);
|
||||||
if (ret < 0) {
|
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_broadcast_event_downseq(wdsp, WDSP_EVENT_POST_BOOTUP, NULL);
|
||||||
WDSP_SET_STATUS(wdsp, WDSP_STATUS_BOOTED);
|
WDSP_SET_STATUS(wdsp, WDSP_STATUS_BOOTED);
|
||||||
done:
|
done:
|
||||||
|
WDSP_MGR_MUTEX_UNLOCK(wdsp, wdsp->ssr_mutex);
|
||||||
return ret;
|
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_DLOAD_FAILED:
|
||||||
case WDSP_EVENT_POST_SHUTDOWN:
|
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 */
|
/* Disable CPAR */
|
||||||
wcd_cntl_cpar_ctrl(cntl, false);
|
wcd_cntl_cpar_ctrl(cntl, false);
|
||||||
/* Disable all the clocks */
|
/* Disable all the clocks */
|
||||||
@@ -775,6 +771,10 @@ static int wcd_control_handler(struct device *dev, void *priv_data,
|
|||||||
dev_err(codec->dev,
|
dev_err(codec->dev,
|
||||||
"%s: Failed to disable clocks, err = %d\n",
|
"%s: Failed to disable clocks, err = %d\n",
|
||||||
__func__, ret);
|
__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;
|
break;
|
||||||
|
|
||||||
case WDSP_EVENT_PRE_DLOAD_DATA:
|
case WDSP_EVENT_PRE_DLOAD_DATA:
|
||||||
|
@@ -1280,6 +1280,10 @@ static int wcd9xxx_slim_probe(struct slim_device *slim)
|
|||||||
ret = -EINVAL;
|
ret = -EINVAL;
|
||||||
goto err_codec;
|
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);
|
device_id = slim_get_device_id(slim);
|
||||||
if (!device_id) {
|
if (!device_id) {
|
||||||
dev_err(&slim->dev, "%s: Error, no device id\n", __func__);
|
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;
|
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",
|
if (!(wcd9xxx_read_of_property_u32(dev, "qcom,cdc-mclk-clk-rate",
|
||||||
&prop_val)))
|
&prop_val)))
|
||||||
pdata->mclk_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
|
* 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
|
* it under the terms of the GNU General Public License version 2 and
|
||||||
@@ -20,9 +20,10 @@
|
|||||||
|
|
||||||
#define WSA881X_MAX_SWR_PORTS 4
|
#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,
|
extern int wsa881x_set_channel_map(struct snd_soc_codec *codec, u8 *port,
|
||||||
u8 num_port, unsigned int *ch_mask,
|
u8 num_port, unsigned int *ch_mask,
|
||||||
unsigned int *ch_rate);
|
unsigned int *ch_rate);
|
||||||
|
|
||||||
extern const u8 wsa881x_reg_readable[WSA881X_CACHE_SIZE];
|
extern const u8 wsa881x_reg_readable[WSA881X_CACHE_SIZE];
|
||||||
extern struct regmap_config wsa881x_regmap_config;
|
extern struct regmap_config wsa881x_regmap_config;
|
||||||
@@ -31,4 +32,25 @@ extern int wsa881x_codec_info_create_codec_entry(
|
|||||||
struct snd_soc_codec *codec);
|
struct snd_soc_codec *codec);
|
||||||
void wsa881x_regmap_defaults(struct regmap *regmap, u8 version);
|
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 */
|
#endif /* _WSA881X_H */
|
||||||
|
@@ -154,7 +154,7 @@ int msm_audio_effects_virtualizer_handler(struct audio_client *ac,
|
|||||||
MAX_INBAND_PARAM_SZ,
|
MAX_INBAND_PARAM_SZ,
|
||||||
"VIRT ENABLE", rc);
|
"VIRT ENABLE", rc);
|
||||||
if (rc != 0)
|
if (rc != 0)
|
||||||
break;
|
goto invalid_config;
|
||||||
*updt_params++ =
|
*updt_params++ =
|
||||||
AUDPROC_MODULE_ID_VIRTUALIZER;
|
AUDPROC_MODULE_ID_VIRTUALIZER;
|
||||||
*updt_params++ =
|
*updt_params++ =
|
||||||
@@ -182,7 +182,7 @@ int msm_audio_effects_virtualizer_handler(struct audio_client *ac,
|
|||||||
MAX_INBAND_PARAM_SZ,
|
MAX_INBAND_PARAM_SZ,
|
||||||
"VIRT STRENGTH", rc);
|
"VIRT STRENGTH", rc);
|
||||||
if (rc != 0)
|
if (rc != 0)
|
||||||
break;
|
goto invalid_config;
|
||||||
*updt_params++ =
|
*updt_params++ =
|
||||||
AUDPROC_MODULE_ID_VIRTUALIZER;
|
AUDPROC_MODULE_ID_VIRTUALIZER;
|
||||||
*updt_params++ =
|
*updt_params++ =
|
||||||
@@ -210,7 +210,7 @@ int msm_audio_effects_virtualizer_handler(struct audio_client *ac,
|
|||||||
MAX_INBAND_PARAM_SZ,
|
MAX_INBAND_PARAM_SZ,
|
||||||
"VIRT OUT_TYPE", rc);
|
"VIRT OUT_TYPE", rc);
|
||||||
if (rc != 0)
|
if (rc != 0)
|
||||||
break;
|
goto invalid_config;
|
||||||
*updt_params++ =
|
*updt_params++ =
|
||||||
AUDPROC_MODULE_ID_VIRTUALIZER;
|
AUDPROC_MODULE_ID_VIRTUALIZER;
|
||||||
*updt_params++ =
|
*updt_params++ =
|
||||||
@@ -238,7 +238,7 @@ int msm_audio_effects_virtualizer_handler(struct audio_client *ac,
|
|||||||
MAX_INBAND_PARAM_SZ,
|
MAX_INBAND_PARAM_SZ,
|
||||||
"VIRT GAIN_ADJUST", rc);
|
"VIRT GAIN_ADJUST", rc);
|
||||||
if (rc != 0)
|
if (rc != 0)
|
||||||
break;
|
goto invalid_config;
|
||||||
*updt_params++ =
|
*updt_params++ =
|
||||||
AUDPROC_MODULE_ID_VIRTUALIZER;
|
AUDPROC_MODULE_ID_VIRTUALIZER;
|
||||||
*updt_params++ =
|
*updt_params++ =
|
||||||
@@ -316,7 +316,7 @@ int msm_audio_effects_reverb_handler(struct audio_client *ac,
|
|||||||
MAX_INBAND_PARAM_SZ,
|
MAX_INBAND_PARAM_SZ,
|
||||||
"REVERB_ENABLE", rc);
|
"REVERB_ENABLE", rc);
|
||||||
if (rc != 0)
|
if (rc != 0)
|
||||||
break;
|
goto invalid_config;
|
||||||
*updt_params++ =
|
*updt_params++ =
|
||||||
AUDPROC_MODULE_ID_REVERB;
|
AUDPROC_MODULE_ID_REVERB;
|
||||||
*updt_params++ =
|
*updt_params++ =
|
||||||
@@ -344,7 +344,7 @@ int msm_audio_effects_reverb_handler(struct audio_client *ac,
|
|||||||
MAX_INBAND_PARAM_SZ,
|
MAX_INBAND_PARAM_SZ,
|
||||||
"REVERB_MODE", rc);
|
"REVERB_MODE", rc);
|
||||||
if (rc != 0)
|
if (rc != 0)
|
||||||
break;
|
goto invalid_config;
|
||||||
*updt_params++ =
|
*updt_params++ =
|
||||||
AUDPROC_MODULE_ID_REVERB;
|
AUDPROC_MODULE_ID_REVERB;
|
||||||
*updt_params++ =
|
*updt_params++ =
|
||||||
@@ -372,7 +372,7 @@ int msm_audio_effects_reverb_handler(struct audio_client *ac,
|
|||||||
MAX_INBAND_PARAM_SZ,
|
MAX_INBAND_PARAM_SZ,
|
||||||
"REVERB_PRESET", rc);
|
"REVERB_PRESET", rc);
|
||||||
if (rc != 0)
|
if (rc != 0)
|
||||||
break;
|
goto invalid_config;
|
||||||
*updt_params++ =
|
*updt_params++ =
|
||||||
AUDPROC_MODULE_ID_REVERB;
|
AUDPROC_MODULE_ID_REVERB;
|
||||||
*updt_params++ =
|
*updt_params++ =
|
||||||
@@ -400,7 +400,7 @@ int msm_audio_effects_reverb_handler(struct audio_client *ac,
|
|||||||
MAX_INBAND_PARAM_SZ,
|
MAX_INBAND_PARAM_SZ,
|
||||||
"REVERB_WET_MIX", rc);
|
"REVERB_WET_MIX", rc);
|
||||||
if (rc != 0)
|
if (rc != 0)
|
||||||
break;
|
goto invalid_config;
|
||||||
*updt_params++ =
|
*updt_params++ =
|
||||||
AUDPROC_MODULE_ID_REVERB;
|
AUDPROC_MODULE_ID_REVERB;
|
||||||
*updt_params++ =
|
*updt_params++ =
|
||||||
@@ -428,7 +428,7 @@ int msm_audio_effects_reverb_handler(struct audio_client *ac,
|
|||||||
MAX_INBAND_PARAM_SZ,
|
MAX_INBAND_PARAM_SZ,
|
||||||
"REVERB_GAIN_ADJUST", rc);
|
"REVERB_GAIN_ADJUST", rc);
|
||||||
if (rc != 0)
|
if (rc != 0)
|
||||||
break;
|
goto invalid_config;
|
||||||
*updt_params++ =
|
*updt_params++ =
|
||||||
AUDPROC_MODULE_ID_REVERB;
|
AUDPROC_MODULE_ID_REVERB;
|
||||||
*updt_params++ =
|
*updt_params++ =
|
||||||
@@ -456,7 +456,7 @@ int msm_audio_effects_reverb_handler(struct audio_client *ac,
|
|||||||
MAX_INBAND_PARAM_SZ,
|
MAX_INBAND_PARAM_SZ,
|
||||||
"REVERB_ROOM_LEVEL", rc);
|
"REVERB_ROOM_LEVEL", rc);
|
||||||
if (rc != 0)
|
if (rc != 0)
|
||||||
break;
|
goto invalid_config;
|
||||||
*updt_params++ =
|
*updt_params++ =
|
||||||
AUDPROC_MODULE_ID_REVERB;
|
AUDPROC_MODULE_ID_REVERB;
|
||||||
*updt_params++ =
|
*updt_params++ =
|
||||||
@@ -484,7 +484,7 @@ int msm_audio_effects_reverb_handler(struct audio_client *ac,
|
|||||||
MAX_INBAND_PARAM_SZ,
|
MAX_INBAND_PARAM_SZ,
|
||||||
"REVERB_ROOM_HF_LEVEL", rc);
|
"REVERB_ROOM_HF_LEVEL", rc);
|
||||||
if (rc != 0)
|
if (rc != 0)
|
||||||
break;
|
goto invalid_config;
|
||||||
*updt_params++ =
|
*updt_params++ =
|
||||||
AUDPROC_MODULE_ID_REVERB;
|
AUDPROC_MODULE_ID_REVERB;
|
||||||
*updt_params++ =
|
*updt_params++ =
|
||||||
@@ -512,7 +512,7 @@ int msm_audio_effects_reverb_handler(struct audio_client *ac,
|
|||||||
MAX_INBAND_PARAM_SZ,
|
MAX_INBAND_PARAM_SZ,
|
||||||
"REVERB_DECAY_TIME", rc);
|
"REVERB_DECAY_TIME", rc);
|
||||||
if (rc != 0)
|
if (rc != 0)
|
||||||
break;
|
goto invalid_config;
|
||||||
*updt_params++ =
|
*updt_params++ =
|
||||||
AUDPROC_MODULE_ID_REVERB;
|
AUDPROC_MODULE_ID_REVERB;
|
||||||
*updt_params++ =
|
*updt_params++ =
|
||||||
@@ -540,7 +540,7 @@ int msm_audio_effects_reverb_handler(struct audio_client *ac,
|
|||||||
MAX_INBAND_PARAM_SZ,
|
MAX_INBAND_PARAM_SZ,
|
||||||
"REVERB_DECAY_HF_RATIO", rc);
|
"REVERB_DECAY_HF_RATIO", rc);
|
||||||
if (rc != 0)
|
if (rc != 0)
|
||||||
break;
|
goto invalid_config;
|
||||||
*updt_params++ =
|
*updt_params++ =
|
||||||
AUDPROC_MODULE_ID_REVERB;
|
AUDPROC_MODULE_ID_REVERB;
|
||||||
*updt_params++ =
|
*updt_params++ =
|
||||||
@@ -568,7 +568,7 @@ int msm_audio_effects_reverb_handler(struct audio_client *ac,
|
|||||||
MAX_INBAND_PARAM_SZ,
|
MAX_INBAND_PARAM_SZ,
|
||||||
"REVERB_REFLECTIONS_LEVEL", rc);
|
"REVERB_REFLECTIONS_LEVEL", rc);
|
||||||
if (rc != 0)
|
if (rc != 0)
|
||||||
break;
|
goto invalid_config;
|
||||||
*updt_params++ =
|
*updt_params++ =
|
||||||
AUDPROC_MODULE_ID_REVERB;
|
AUDPROC_MODULE_ID_REVERB;
|
||||||
*updt_params++ =
|
*updt_params++ =
|
||||||
@@ -596,7 +596,7 @@ int msm_audio_effects_reverb_handler(struct audio_client *ac,
|
|||||||
MAX_INBAND_PARAM_SZ,
|
MAX_INBAND_PARAM_SZ,
|
||||||
"REVERB_REFLECTIONS_DELAY", rc);
|
"REVERB_REFLECTIONS_DELAY", rc);
|
||||||
if (rc != 0)
|
if (rc != 0)
|
||||||
break;
|
goto invalid_config;
|
||||||
*updt_params++ =
|
*updt_params++ =
|
||||||
AUDPROC_MODULE_ID_REVERB;
|
AUDPROC_MODULE_ID_REVERB;
|
||||||
*updt_params++ =
|
*updt_params++ =
|
||||||
@@ -624,7 +624,7 @@ int msm_audio_effects_reverb_handler(struct audio_client *ac,
|
|||||||
MAX_INBAND_PARAM_SZ,
|
MAX_INBAND_PARAM_SZ,
|
||||||
"REVERB_LEVEL", rc);
|
"REVERB_LEVEL", rc);
|
||||||
if (rc != 0)
|
if (rc != 0)
|
||||||
break;
|
goto invalid_config;
|
||||||
*updt_params++ =
|
*updt_params++ =
|
||||||
AUDPROC_MODULE_ID_REVERB;
|
AUDPROC_MODULE_ID_REVERB;
|
||||||
*updt_params++ =
|
*updt_params++ =
|
||||||
@@ -652,7 +652,7 @@ int msm_audio_effects_reverb_handler(struct audio_client *ac,
|
|||||||
MAX_INBAND_PARAM_SZ,
|
MAX_INBAND_PARAM_SZ,
|
||||||
"REVERB_DELAY", rc);
|
"REVERB_DELAY", rc);
|
||||||
if (rc != 0)
|
if (rc != 0)
|
||||||
break;
|
goto invalid_config;
|
||||||
*updt_params++ =
|
*updt_params++ =
|
||||||
AUDPROC_MODULE_ID_REVERB;
|
AUDPROC_MODULE_ID_REVERB;
|
||||||
*updt_params++ =
|
*updt_params++ =
|
||||||
@@ -680,7 +680,7 @@ int msm_audio_effects_reverb_handler(struct audio_client *ac,
|
|||||||
MAX_INBAND_PARAM_SZ,
|
MAX_INBAND_PARAM_SZ,
|
||||||
"REVERB_DIFFUSION", rc);
|
"REVERB_DIFFUSION", rc);
|
||||||
if (rc != 0)
|
if (rc != 0)
|
||||||
break;
|
goto invalid_config;
|
||||||
*updt_params++ =
|
*updt_params++ =
|
||||||
AUDPROC_MODULE_ID_REVERB;
|
AUDPROC_MODULE_ID_REVERB;
|
||||||
*updt_params++ =
|
*updt_params++ =
|
||||||
@@ -708,7 +708,7 @@ int msm_audio_effects_reverb_handler(struct audio_client *ac,
|
|||||||
MAX_INBAND_PARAM_SZ,
|
MAX_INBAND_PARAM_SZ,
|
||||||
"REVERB_DENSITY", rc);
|
"REVERB_DENSITY", rc);
|
||||||
if (rc != 0)
|
if (rc != 0)
|
||||||
break;
|
goto invalid_config;
|
||||||
*updt_params++ =
|
*updt_params++ =
|
||||||
AUDPROC_MODULE_ID_REVERB;
|
AUDPROC_MODULE_ID_REVERB;
|
||||||
*updt_params++ =
|
*updt_params++ =
|
||||||
@@ -787,7 +787,7 @@ int msm_audio_effects_bass_boost_handler(struct audio_client *ac,
|
|||||||
MAX_INBAND_PARAM_SZ,
|
MAX_INBAND_PARAM_SZ,
|
||||||
"BASS_BOOST_ENABLE", rc);
|
"BASS_BOOST_ENABLE", rc);
|
||||||
if (rc != 0)
|
if (rc != 0)
|
||||||
break;
|
goto invalid_config;
|
||||||
*updt_params++ =
|
*updt_params++ =
|
||||||
AUDPROC_MODULE_ID_BASS_BOOST;
|
AUDPROC_MODULE_ID_BASS_BOOST;
|
||||||
*updt_params++ =
|
*updt_params++ =
|
||||||
@@ -815,7 +815,7 @@ int msm_audio_effects_bass_boost_handler(struct audio_client *ac,
|
|||||||
MAX_INBAND_PARAM_SZ,
|
MAX_INBAND_PARAM_SZ,
|
||||||
"BASS_BOOST_MODE", rc);
|
"BASS_BOOST_MODE", rc);
|
||||||
if (rc != 0)
|
if (rc != 0)
|
||||||
break;
|
goto invalid_config;
|
||||||
*updt_params++ =
|
*updt_params++ =
|
||||||
AUDPROC_MODULE_ID_BASS_BOOST;
|
AUDPROC_MODULE_ID_BASS_BOOST;
|
||||||
*updt_params++ =
|
*updt_params++ =
|
||||||
@@ -843,7 +843,7 @@ int msm_audio_effects_bass_boost_handler(struct audio_client *ac,
|
|||||||
MAX_INBAND_PARAM_SZ,
|
MAX_INBAND_PARAM_SZ,
|
||||||
"BASS_BOOST_STRENGTH", rc);
|
"BASS_BOOST_STRENGTH", rc);
|
||||||
if (rc != 0)
|
if (rc != 0)
|
||||||
break;
|
goto invalid_config;
|
||||||
*updt_params++ =
|
*updt_params++ =
|
||||||
AUDPROC_MODULE_ID_BASS_BOOST;
|
AUDPROC_MODULE_ID_BASS_BOOST;
|
||||||
*updt_params++ =
|
*updt_params++ =
|
||||||
@@ -920,7 +920,7 @@ int msm_audio_effects_pbe_handler(struct audio_client *ac,
|
|||||||
MAX_INBAND_PARAM_SZ,
|
MAX_INBAND_PARAM_SZ,
|
||||||
"PBE_ENABLE", rc);
|
"PBE_ENABLE", rc);
|
||||||
if (rc != 0)
|
if (rc != 0)
|
||||||
break;
|
goto invalid_config;
|
||||||
*updt_params++ =
|
*updt_params++ =
|
||||||
AUDPROC_MODULE_ID_PBE;
|
AUDPROC_MODULE_ID_PBE;
|
||||||
*updt_params++ =
|
*updt_params++ =
|
||||||
@@ -946,7 +946,7 @@ int msm_audio_effects_pbe_handler(struct audio_client *ac,
|
|||||||
MAX_INBAND_PARAM_SZ,
|
MAX_INBAND_PARAM_SZ,
|
||||||
"PBE_PARAM", rc);
|
"PBE_PARAM", rc);
|
||||||
if (rc != 0)
|
if (rc != 0)
|
||||||
break;
|
goto invalid_config;
|
||||||
*updt_params++ =
|
*updt_params++ =
|
||||||
AUDPROC_MODULE_ID_PBE;
|
AUDPROC_MODULE_ID_PBE;
|
||||||
*updt_params++ =
|
*updt_params++ =
|
||||||
@@ -1031,7 +1031,7 @@ int msm_audio_effects_popless_eq_handler(struct audio_client *ac,
|
|||||||
MAX_INBAND_PARAM_SZ,
|
MAX_INBAND_PARAM_SZ,
|
||||||
"EQ_ENABLE", rc);
|
"EQ_ENABLE", rc);
|
||||||
if (rc != 0)
|
if (rc != 0)
|
||||||
break;
|
goto invalid_config;
|
||||||
*updt_params++ =
|
*updt_params++ =
|
||||||
AUDPROC_MODULE_ID_POPLESS_EQUALIZER;
|
AUDPROC_MODULE_ID_POPLESS_EQUALIZER;
|
||||||
*updt_params++ =
|
*updt_params++ =
|
||||||
@@ -1099,7 +1099,7 @@ int msm_audio_effects_popless_eq_handler(struct audio_client *ac,
|
|||||||
MAX_INBAND_PARAM_SZ,
|
MAX_INBAND_PARAM_SZ,
|
||||||
"EQ_CONFIG", rc);
|
"EQ_CONFIG", rc);
|
||||||
if (rc != 0)
|
if (rc != 0)
|
||||||
break;
|
goto invalid_config;
|
||||||
*updt_params++ =
|
*updt_params++ =
|
||||||
AUDPROC_MODULE_ID_POPLESS_EQUALIZER;
|
AUDPROC_MODULE_ID_POPLESS_EQUALIZER;
|
||||||
*updt_params++ =
|
*updt_params++ =
|
||||||
@@ -1150,7 +1150,7 @@ int msm_audio_effects_popless_eq_handler(struct audio_client *ac,
|
|||||||
MAX_INBAND_PARAM_SZ,
|
MAX_INBAND_PARAM_SZ,
|
||||||
"EQ_BAND_INDEX", rc);
|
"EQ_BAND_INDEX", rc);
|
||||||
if (rc != 0)
|
if (rc != 0)
|
||||||
break;
|
goto invalid_config;
|
||||||
*updt_params++ =
|
*updt_params++ =
|
||||||
AUDPROC_MODULE_ID_POPLESS_EQUALIZER;
|
AUDPROC_MODULE_ID_POPLESS_EQUALIZER;
|
||||||
*updt_params++ =
|
*updt_params++ =
|
||||||
@@ -1182,7 +1182,7 @@ int msm_audio_effects_popless_eq_handler(struct audio_client *ac,
|
|||||||
MAX_INBAND_PARAM_SZ,
|
MAX_INBAND_PARAM_SZ,
|
||||||
"EQ_SINGLE_BAND_FREQ", rc);
|
"EQ_SINGLE_BAND_FREQ", rc);
|
||||||
if (rc != 0)
|
if (rc != 0)
|
||||||
break;
|
goto invalid_config;
|
||||||
*updt_params++ =
|
*updt_params++ =
|
||||||
AUDPROC_MODULE_ID_POPLESS_EQUALIZER;
|
AUDPROC_MODULE_ID_POPLESS_EQUALIZER;
|
||||||
*updt_params++ =
|
*updt_params++ =
|
||||||
@@ -1271,7 +1271,7 @@ static int __msm_audio_effects_volume_handler(struct audio_client *ac,
|
|||||||
"VOLUME/VOLUME2_GAIN_2CH",
|
"VOLUME/VOLUME2_GAIN_2CH",
|
||||||
rc);
|
rc);
|
||||||
if (rc != 0)
|
if (rc != 0)
|
||||||
break;
|
goto invalid_config;
|
||||||
if (instance == SOFT_VOLUME_INSTANCE_2)
|
if (instance == SOFT_VOLUME_INSTANCE_2)
|
||||||
*updt_params++ =
|
*updt_params++ =
|
||||||
ASM_MODULE_ID_VOL_CTRL2;
|
ASM_MODULE_ID_VOL_CTRL2;
|
||||||
@@ -1320,7 +1320,7 @@ static int __msm_audio_effects_volume_handler(struct audio_client *ac,
|
|||||||
"VOLUME/VOLUME2_GAIN_MASTER",
|
"VOLUME/VOLUME2_GAIN_MASTER",
|
||||||
rc);
|
rc);
|
||||||
if (rc != 0)
|
if (rc != 0)
|
||||||
break;
|
goto invalid_config;
|
||||||
if (instance == SOFT_VOLUME_INSTANCE_2)
|
if (instance == SOFT_VOLUME_INSTANCE_2)
|
||||||
*updt_params++ =
|
*updt_params++ =
|
||||||
ASM_MODULE_ID_VOL_CTRL2;
|
ASM_MODULE_ID_VOL_CTRL2;
|
||||||
|
@@ -2376,8 +2376,20 @@ static struct snd_soc_dai_driver msm_fe_dais[] = {
|
|||||||
.rate_min = 8000,
|
.rate_min = 8000,
|
||||||
.rate_max = 384000,
|
.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,
|
.ops = &msm_fe_Multimedia_dai_ops,
|
||||||
.compress_new = snd_soc_new_compress,
|
|
||||||
.name = "MultiMedia10",
|
.name = "MultiMedia10",
|
||||||
.probe = fe_dai_probe,
|
.probe = fe_dai_probe,
|
||||||
},
|
},
|
||||||
|
@@ -1682,7 +1682,7 @@ static int msm_lsm_ioctl(struct snd_pcm_substream *substream,
|
|||||||
dev_err(rtd->dev,
|
dev_err(rtd->dev,
|
||||||
"%s REG_SND_MODEL failed err %d\n",
|
"%s REG_SND_MODEL failed err %d\n",
|
||||||
__func__, err);
|
__func__, err);
|
||||||
return err;
|
goto done;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case SNDRV_LSM_SET_PARAMS: {
|
case SNDRV_LSM_SET_PARAMS: {
|
||||||
@@ -1852,13 +1852,15 @@ static int msm_lsm_ioctl(struct snd_pcm_substream *substream,
|
|||||||
dev_err(rtd->dev,
|
dev_err(rtd->dev,
|
||||||
"%s: Invalid params event_status_v3\n",
|
"%s: Invalid params event_status_v3\n",
|
||||||
__func__);
|
__func__);
|
||||||
return -EINVAL;
|
err = -EINVAL;
|
||||||
|
goto done;
|
||||||
}
|
}
|
||||||
if (copy_from_user(&userarg, arg, sizeof(userarg))) {
|
if (copy_from_user(&userarg, arg, sizeof(userarg))) {
|
||||||
dev_err(rtd->dev,
|
dev_err(rtd->dev,
|
||||||
"%s: err copyuser event_status_v3\n",
|
"%s: err copyuser event_status_v3\n",
|
||||||
__func__);
|
__func__);
|
||||||
return -EFAULT;
|
err = -EFAULT;
|
||||||
|
goto done;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (userarg.payload_size >
|
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",
|
pr_err("%s: payload_size %d is invalid, max allowed = %d\n",
|
||||||
__func__, userarg.payload_size,
|
__func__, userarg.payload_size,
|
||||||
LISTEN_MAX_STATUS_PAYLOAD_SIZE);
|
LISTEN_MAX_STATUS_PAYLOAD_SIZE);
|
||||||
return -EINVAL;
|
err = -EINVAL;
|
||||||
|
goto done;
|
||||||
}
|
}
|
||||||
|
|
||||||
size = sizeof(struct snd_lsm_event_status_v3) +
|
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,
|
dev_err(rtd->dev,
|
||||||
"%s: Allocation failed event status size %d\n",
|
"%s: Allocation failed event status size %d\n",
|
||||||
__func__, size);
|
__func__, size);
|
||||||
return -EFAULT;
|
err = -EFAULT;
|
||||||
|
goto done;
|
||||||
}
|
}
|
||||||
user->payload_size = userarg.payload_size;
|
user->payload_size = userarg.payload_size;
|
||||||
err = msm_lsm_ioctl_shared(substream, cmd, user);
|
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;
|
port_type = MSM_AFE_PORT_TYPE_RX;
|
||||||
} else if (stream_type == SNDRV_PCM_STREAM_CAPTURE) {
|
} else if (stream_type == SNDRV_PCM_STREAM_CAPTURE) {
|
||||||
session_type = SESSION_TYPE_TX;
|
session_type = SESSION_TYPE_TX;
|
||||||
if (passthr_mode != LEGACY_PCM)
|
if ((passthr_mode != LEGACY_PCM) && (passthr_mode != LISTEN))
|
||||||
path_type = ADM_PATH_COMPRESSED_TX;
|
path_type = ADM_PATH_COMPRESSED_TX;
|
||||||
else
|
else
|
||||||
path_type = ADM_PATH_LIVE_REC;
|
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_route_ec_ref_rx_enum[0],
|
||||||
msm_routing_ec_ref_rx_get, msm_routing_ec_ref_rx_put);
|
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 =
|
static const struct snd_kcontrol_new ext_ec_ref_mux_ul17 =
|
||||||
SOC_DAPM_ENUM_EXT("AUDIO_REF_EC_UL17 MUX Mux",
|
SOC_DAPM_ENUM_EXT("AUDIO_REF_EC_UL17 MUX Mux",
|
||||||
msm_route_ec_ref_rx_enum[0],
|
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),
|
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[] = {
|
static const struct snd_kcontrol_new mmul17_mixer_controls[] = {
|
||||||
SOC_SINGLE_EXT("SLIM_0_TX", MSM_BACKEND_DAI_SLIMBUS_0_TX,
|
SOC_SINGLE_EXT("SLIM_0_TX", MSM_BACKEND_DAI_SLIMBUS_0_TX,
|
||||||
MSM_FRONTEND_DAI_MULTIMEDIA17, 1, 0, msm_routing_get_audio_mixer,
|
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_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_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_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_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_UL17", "MultiMedia17 Capture", 0, 0, 0, 0),
|
||||||
SND_SOC_DAPM_AIF_OUT("MM_UL18", "MultiMedia18 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)),
|
mmul8_mixer_controls, ARRAY_SIZE(mmul8_mixer_controls)),
|
||||||
SND_SOC_DAPM_MIXER("MultiMedia9 Mixer", SND_SOC_NOPM, 0, 0,
|
SND_SOC_DAPM_MIXER("MultiMedia9 Mixer", SND_SOC_NOPM, 0, 0,
|
||||||
mmul9_mixer_controls, ARRAY_SIZE(mmul9_mixer_controls)),
|
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,
|
SND_SOC_DAPM_MIXER("MultiMedia16 Mixer", SND_SOC_NOPM, 0, 0,
|
||||||
mmul16_mixer_controls, ARRAY_SIZE(mmul16_mixer_controls)),
|
mmul16_mixer_controls, ARRAY_SIZE(mmul16_mixer_controls)),
|
||||||
SND_SOC_DAPM_MIXER("MultiMedia17 Mixer", SND_SOC_NOPM, 0, 0,
|
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),
|
&ext_ec_ref_mux_ul8),
|
||||||
SND_SOC_DAPM_MUX("AUDIO_REF_EC_UL9 MUX", SND_SOC_NOPM, 0, 0,
|
SND_SOC_DAPM_MUX("AUDIO_REF_EC_UL9 MUX", SND_SOC_NOPM, 0, 0,
|
||||||
&ext_ec_ref_mux_ul9),
|
&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,
|
SND_SOC_DAPM_MUX("AUDIO_REF_EC_UL16 MUX", SND_SOC_NOPM, 0, 0,
|
||||||
&ext_ec_ref_mux_ul16),
|
&ext_ec_ref_mux_ul16),
|
||||||
SND_SOC_DAPM_MUX("AUDIO_REF_EC_UL17 MUX", SND_SOC_NOPM, 0, 0,
|
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"},
|
{"MultiMedia8 Mixer", "INT3_MI2S_TX", "INT3_MI2S_TX"},
|
||||||
{"MultiMedia3 Mixer", "SLIM_0_TX", "SLIMBUS_0_TX"},
|
{"MultiMedia3 Mixer", "SLIM_0_TX", "SLIMBUS_0_TX"},
|
||||||
{"MultiMedia5 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"},
|
{"MultiMedia16 Mixer", "SLIM_0_TX", "SLIMBUS_0_TX"},
|
||||||
{"MultiMedia5 Mixer", "SLIM_7_TX", "SLIMBUS_7_TX"},
|
{"MultiMedia5 Mixer", "SLIM_7_TX", "SLIMBUS_7_TX"},
|
||||||
{"MultiMedia5 Mixer", "SLIM_8_TX", "SLIMBUS_8_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", "MultiMedia1", "MM_DL1"},
|
||||||
{"MI2S_RX Audio Mixer", "MultiMedia2", "MM_DL2"},
|
{"MI2S_RX Audio Mixer", "MultiMedia2", "MM_DL2"},
|
||||||
{"MI2S_RX Audio Mixer", "MultiMedia3", "MM_DL3"},
|
{"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"},
|
{"MultiMedia2 Mixer", "MI2S_TX", "MI2S_TX"},
|
||||||
{"MultiMedia3 Mixer", "MI2S_TX", "MI2S_TX"},
|
{"MultiMedia3 Mixer", "MI2S_TX", "MI2S_TX"},
|
||||||
{"MultiMedia5 Mixer", "MI2S_TX", "MI2S_TX"},
|
{"MultiMedia5 Mixer", "MI2S_TX", "MI2S_TX"},
|
||||||
|
{"MultiMedia10 Mixer", "MI2S_TX", "MI2S_TX"},
|
||||||
{"MultiMedia16 Mixer", "MI2S_TX", "MI2S_TX"},
|
{"MultiMedia16 Mixer", "MI2S_TX", "MI2S_TX"},
|
||||||
{"MultiMedia1 Mixer", "QUAT_MI2S_TX", "QUAT_MI2S_TX"},
|
{"MultiMedia1 Mixer", "QUAT_MI2S_TX", "QUAT_MI2S_TX"},
|
||||||
{"MultiMedia2 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"},
|
{"MultiMedia1 Mixer", "AUX_PCM_UL_TX", "AUX_PCM_TX"},
|
||||||
{"MultiMedia3 Mixer", "AUX_PCM_TX", "AUX_PCM_TX"},
|
{"MultiMedia3 Mixer", "AUX_PCM_TX", "AUX_PCM_TX"},
|
||||||
{"MultiMedia5 Mixer", "AUX_PCM_UL_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"},
|
{"MultiMedia1 Mixer", "SEC_AUX_PCM_UL_TX", "SEC_AUX_PCM_TX"},
|
||||||
{"MultiMedia3 Mixer", "SEC_AUX_PCM_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"},
|
{"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", "AUX_PCM_TX", "AUX_PCM_TX"},
|
||||||
{"MultiMedia16 Mixer", "SEC_AUX_PCM_TX", "SEC_AUX_PCM_TX"},
|
{"MultiMedia16 Mixer", "SEC_AUX_PCM_TX", "SEC_AUX_PCM_TX"},
|
||||||
{"MultiMedia1 Mixer", "TERT_AUXPCM_UL_TX", "TERT_AUX_PCM_TX"},
|
{"MultiMedia1 Mixer", "TERT_AUXPCM_UL_TX", "TERT_AUX_PCM_TX"},
|
||||||
{"MultiMedia3 Mixer", "TERT_AUX_PCM_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"},
|
{"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"},
|
{"MultiMedia1 Mixer", "QUAT_AUXPCM_UL_TX", "QUAT_AUX_PCM_TX"},
|
||||||
{"MultiMedia3 Mixer", "QUAT_AUX_PCM_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"},
|
{"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"},
|
{"MultiMedia16 Mixer", "QUAT_AUX_PCM_TX", "QUAT_AUX_PCM_TX"},
|
||||||
{"MultiMedia2 Mixer", "SLIM_0_TX", "SLIMBUS_0_TX"},
|
{"MultiMedia2 Mixer", "SLIM_0_TX", "SLIMBUS_0_TX"},
|
||||||
{"MultiMedia2 Mixer", "SLIM_6_TX", "SLIMBUS_6_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"},
|
{"MultiMedia6 Mixer", "TERT_MI2S_TX", "TERT_MI2S_TX"},
|
||||||
{"MultiMedia3 Mixer", "TERT_MI2S_TX", "TERT_MI2S_TX"},
|
{"MultiMedia3 Mixer", "TERT_MI2S_TX", "TERT_MI2S_TX"},
|
||||||
{"MultiMedia5 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"},
|
{"MultiMedia6 Mixer", "INT2_MI2S_TX", "INT2_MI2S_TX"},
|
||||||
{"MultiMedia3 Mixer", "INT2_MI2S_TX", "INT2_MI2S_TX"},
|
{"MultiMedia3 Mixer", "INT2_MI2S_TX", "INT2_MI2S_TX"},
|
||||||
{"MultiMedia5 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"},
|
{"MultiMedia16 Mixer", "INT2_MI2S_TX", "INT2_MI2S_TX"},
|
||||||
{"MultiMedia6 Mixer", "INT3_MI2S_TX", "INT3_MI2S_TX"},
|
{"MultiMedia6 Mixer", "INT3_MI2S_TX", "INT3_MI2S_TX"},
|
||||||
{"MultiMedia3 Mixer", "INT3_MI2S_TX", "INT3_MI2S_TX"},
|
{"MultiMedia3 Mixer", "INT3_MI2S_TX", "INT3_MI2S_TX"},
|
||||||
{"MultiMedia5 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"},
|
{"MultiMedia16 Mixer", "INT3_MI2S_TX", "INT3_MI2S_TX"},
|
||||||
{"MultiMedia6 Mixer", "PRI_MI2S_TX", "PRI_MI2S_TX"},
|
{"MultiMedia6 Mixer", "PRI_MI2S_TX", "PRI_MI2S_TX"},
|
||||||
{"MultiMedia6 Mixer", "AUX_PCM_UL_TX", "AUX_PCM_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_2", "QUAT_TDM_TX_2"},
|
||||||
{"MultiMedia9 Mixer", "QUAT_TDM_TX_3", "QUAT_TDM_TX_3"},
|
{"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", "PRI_MI2S_TX", "PRI_MI2S_TX"},
|
||||||
{"MultiMedia20 Mixer", "SEC_MI2S_TX", "SEC_MI2S_TX"},
|
{"MultiMedia20 Mixer", "SEC_MI2S_TX", "SEC_MI2S_TX"},
|
||||||
{"MultiMedia20 Mixer", "TERT_MI2S_TX", "TERT_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"},
|
{"MultiMedia5 Mixer", "USB_AUDIO_TX", "USB_AUDIO_TX"},
|
||||||
{"MultiMedia6 Mixer", "USB_AUDIO_TX", "USB_AUDIO_TX"},
|
{"MultiMedia6 Mixer", "USB_AUDIO_TX", "USB_AUDIO_TX"},
|
||||||
{"MultiMedia8 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_0", "PRI_TDM_TX_0"},
|
||||||
{"MultiMedia16 Mixer", "PRI_TDM_TX_1", "PRI_TDM_TX_1"},
|
{"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"},
|
{"MultiMedia1 Mixer", "INTERNAL_BT_SCO_TX", "INT_BT_SCO_TX"},
|
||||||
{"MultiMedia3 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"},
|
{"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"},
|
{"MultiMedia17 Mixer", "INTERNAL_BT_SCO_TX", "INT_BT_SCO_TX"},
|
||||||
{"MultiMedia18 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"},
|
{"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"},
|
{"MultiMedia1 Mixer", "AFE_PCM_TX", "PCM_TX"},
|
||||||
{"MultiMedia3 Mixer", "AFE_PCM_TX", "PCM_TX"},
|
{"MultiMedia3 Mixer", "AFE_PCM_TX", "PCM_TX"},
|
||||||
{"MultiMedia4 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"},
|
{"MultiMedia17 Mixer", "AFE_PCM_TX", "PCM_TX"},
|
||||||
{"MultiMedia18 Mixer", "AFE_PCM_TX", "PCM_TX"},
|
{"MultiMedia18 Mixer", "AFE_PCM_TX", "PCM_TX"},
|
||||||
{"MultiMedia19 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_UL6", NULL, "MultiMedia6 Mixer"},
|
||||||
{"MM_UL8", NULL, "MultiMedia8 Mixer"},
|
{"MM_UL8", NULL, "MultiMedia8 Mixer"},
|
||||||
{"MM_UL9", NULL, "MultiMedia9 Mixer"},
|
{"MM_UL9", NULL, "MultiMedia9 Mixer"},
|
||||||
|
{"MM_UL10", NULL, "MultiMedia10 Mixer"},
|
||||||
{"MM_UL16", NULL, "MultiMedia16 Mixer"},
|
{"MM_UL16", NULL, "MultiMedia16 Mixer"},
|
||||||
{"MM_UL17", NULL, "MultiMedia17 Mixer"},
|
{"MM_UL17", NULL, "MultiMedia17 Mixer"},
|
||||||
{"MM_UL18", NULL, "MultiMedia18 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", "TERT_MI2S_TX", "TERT_MI2S_TX"},
|
||||||
{"AUDIO_REF_EC_UL9 MUX", "QUAT_MI2S_TX", "QUAT_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", "PRI_MI2S_TX", "PRI_MI2S_TX"},
|
||||||
{"AUDIO_REF_EC_UL17 MUX", "SEC_MI2S_TX", "SEC_MI2S_TX"},
|
{"AUDIO_REF_EC_UL17 MUX", "SEC_MI2S_TX", "SEC_MI2S_TX"},
|
||||||
{"AUDIO_REF_EC_UL17 MUX", "TERT_MI2S_TX", "TERT_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_UL6", NULL, "AUDIO_REF_EC_UL6 MUX"},
|
||||||
{"MM_UL8", NULL, "AUDIO_REF_EC_UL8 MUX"},
|
{"MM_UL8", NULL, "AUDIO_REF_EC_UL8 MUX"},
|
||||||
{"MM_UL9", NULL, "AUDIO_REF_EC_UL9 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_UL16", NULL, "AUDIO_REF_EC_UL16 MUX"},
|
||||||
{"MM_UL17", NULL, "AUDIO_REF_EC_UL17 MUX"},
|
{"MM_UL17", NULL, "AUDIO_REF_EC_UL17 MUX"},
|
||||||
{"MM_UL18", NULL, "AUDIO_REF_EC_UL18 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,
|
.id = MSM_FRONTEND_DAI_MULTIMEDIA7,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
.name = MSM_DAILINK_NAME(Compress3),
|
.name = MSM_DAILINK_NAME(MultiMedia10),
|
||||||
.stream_name = "Compress3",
|
.stream_name = "MultiMedia10",
|
||||||
.cpu_dai_name = "MultiMedia10",
|
.cpu_dai_name = "MultiMedia10",
|
||||||
.platform_name = "msm-compress-dsp",
|
.platform_name = "msm-pcm-dsp.1",
|
||||||
.dynamic = 1,
|
.dynamic = 1,
|
||||||
.dpcm_playback = 1,
|
.dpcm_playback = 1,
|
||||||
|
.dpcm_capture = 1,
|
||||||
.trigger = {SND_SOC_DPCM_TRIGGER_POST,
|
.trigger = {SND_SOC_DPCM_TRIGGER_POST,
|
||||||
SND_SOC_DPCM_TRIGGER_POST},
|
SND_SOC_DPCM_TRIGGER_POST},
|
||||||
.codec_dai_name = "snd-soc-dummy-dai",
|
.codec_dai_name = "snd-soc-dummy-dai",
|
||||||
|
@@ -44,6 +44,8 @@ enum {
|
|||||||
EXT_DISP_RX_IDX_MAX,
|
EXT_DISP_RX_IDX_MAX,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
bool codec_reg_done;
|
||||||
|
|
||||||
/* TDM default config */
|
/* TDM default config */
|
||||||
static struct dev_config tdm_rx_cfg[TDM_INTERFACE_MAX][TDM_PORT_MAX] = {
|
static struct dev_config tdm_rx_cfg[TDM_INTERFACE_MAX][TDM_PORT_MAX] = {
|
||||||
{ /* PRI TDM */
|
{ /* PRI TDM */
|
||||||
@@ -2016,6 +2018,12 @@ int msm_common_snd_controls_size(void)
|
|||||||
}
|
}
|
||||||
EXPORT_SYMBOL(msm_common_snd_controls_size);
|
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)
|
static inline int param_is_mask(int p)
|
||||||
{
|
{
|
||||||
return (p >= SNDRV_PCM_HW_PARAM_FIRST_MASK) &&
|
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"},
|
.data = "tasha_codec"},
|
||||||
{ .compatible = "qcom,sdm660-asoc-snd-tavil",
|
{ .compatible = "qcom,sdm660-asoc-snd-tavil",
|
||||||
.data = "tavil_codec"},
|
.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)
|
if (!pdata)
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
|
|
||||||
|
msm_set_codec_reg_done(false);
|
||||||
match = of_match_node(sdm660_asoc_machine_of_match,
|
match = of_match_node(sdm660_asoc_machine_of_match,
|
||||||
pdev->dev.of_node);
|
pdev->dev.of_node);
|
||||||
if (!match)
|
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);
|
int msm_mi2s_snd_startup(struct snd_pcm_substream *substream);
|
||||||
void msm_mi2s_snd_shutdown(struct snd_pcm_substream *substream);
|
void msm_mi2s_snd_shutdown(struct snd_pcm_substream *substream);
|
||||||
int msm_common_snd_controls_size(void);
|
int msm_common_snd_controls_size(void);
|
||||||
|
void msm_set_codec_reg_done(bool done);
|
||||||
#endif
|
#endif
|
||||||
|
@@ -29,8 +29,15 @@
|
|||||||
#define WCN_CDC_SLIM_RX_CH_MAX 2
|
#define WCN_CDC_SLIM_RX_CH_MAX 2
|
||||||
#define WCN_CDC_SLIM_TX_CH_MAX 3
|
#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_tavil = {
|
||||||
static struct snd_soc_card snd_soc_card_msm_card_tasha;
|
.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 = {
|
static struct snd_soc_ops msm_ext_slimbus_be_ops = {
|
||||||
.hw_params = msm_snd_hw_params,
|
.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,
|
.id = MSM_FRONTEND_DAI_MULTIMEDIA7,
|
||||||
},
|
},
|
||||||
{/* hw:x,16 */
|
{/* hw:x,16 */
|
||||||
.name = MSM_DAILINK_NAME(Compress3),
|
.name = MSM_DAILINK_NAME(MultiMedia10),
|
||||||
.stream_name = "Compress3",
|
.stream_name = "MultiMedia10",
|
||||||
.cpu_dai_name = "MultiMedia10",
|
.cpu_dai_name = "MultiMedia10",
|
||||||
.platform_name = "msm-compress-dsp",
|
.platform_name = "msm-pcm-dsp.1",
|
||||||
.dynamic = 1,
|
.dynamic = 1,
|
||||||
.dpcm_capture = 1,
|
.dpcm_capture = 1,
|
||||||
.dpcm_playback = 1,
|
.dpcm_playback = 1,
|
||||||
|
.dpcm_capture = 1,
|
||||||
.trigger = {SND_SOC_DPCM_TRIGGER_POST,
|
.trigger = {SND_SOC_DPCM_TRIGGER_POST,
|
||||||
SND_SOC_DPCM_TRIGGER_POST},
|
SND_SOC_DPCM_TRIGGER_POST},
|
||||||
.codec_dai_name = "snd-soc-dummy-dai",
|
.codec_dai_name = "snd-soc-dummy-dai",
|
||||||
|
@@ -56,7 +56,6 @@
|
|||||||
|
|
||||||
static int msm_ext_spk_control = 1;
|
static int msm_ext_spk_control = 1;
|
||||||
static struct wcd_mbhc_config *wcd_mbhc_cfg_ptr;
|
static struct wcd_mbhc_config *wcd_mbhc_cfg_ptr;
|
||||||
bool codec_reg_done;
|
|
||||||
|
|
||||||
struct msm_asoc_wcd93xx_codec {
|
struct msm_asoc_wcd93xx_codec {
|
||||||
void* (*get_afe_config_fn)(struct snd_soc_codec *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)
|
static void *def_ext_mbhc_cal(void)
|
||||||
{
|
{
|
||||||
void *tavil_wcd_cal;
|
void *wcd_mbhc_cal;
|
||||||
struct wcd_mbhc_btn_detect_cfg *btn_cfg;
|
struct wcd_mbhc_btn_detect_cfg *btn_cfg;
|
||||||
u16 *btn_high;
|
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);
|
WCD9XXX_MBHC_DEF_RLOADS), GFP_KERNEL);
|
||||||
if (!tavil_wcd_cal)
|
if (!wcd_mbhc_cal)
|
||||||
return NULL;
|
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);
|
S(v_hs_max, 1600);
|
||||||
#undef S
|
#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);
|
S(num_btn, WCD_MBHC_DEF_BUTTONS);
|
||||||
#undef S
|
#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) +
|
btn_high = ((void *)&btn_cfg->_v_btn_low) +
|
||||||
(sizeof(btn_cfg->_v_btn_low[0]) * btn_cfg->num_btn);
|
(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[6] = 500;
|
||||||
btn_high[7] = 500;
|
btn_high[7] = 500;
|
||||||
|
|
||||||
return tavil_wcd_cal;
|
return wcd_mbhc_cal;
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline int param_is_mask(int p)
|
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"},
|
{"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.
|
* 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) {
|
if (!entry) {
|
||||||
pr_debug("%s: Cannot create codecs module entry\n",
|
pr_debug("%s: Cannot create codecs module entry\n",
|
||||||
__func__);
|
__func__);
|
||||||
pdata->codec_root = NULL;
|
|
||||||
goto done;
|
goto done;
|
||||||
}
|
}
|
||||||
pdata->codec_root = entry;
|
pdata->codec_root = entry;
|
||||||
@@ -1722,50 +1793,17 @@ int msm_audrx_init(struct snd_soc_pcm_runtime *rtd)
|
|||||||
if (!entry) {
|
if (!entry) {
|
||||||
pr_debug("%s: Cannot create codecs module entry\n",
|
pr_debug("%s: Cannot create codecs module entry\n",
|
||||||
__func__);
|
__func__);
|
||||||
ret = 0;
|
goto done;
|
||||||
goto err_snd_module;
|
|
||||||
}
|
}
|
||||||
pdata->codec_root = entry;
|
pdata->codec_root = entry;
|
||||||
tasha_codec_info_create_codec_entry(pdata->codec_root, codec);
|
tasha_codec_info_create_codec_entry(pdata->codec_root, codec);
|
||||||
tasha_mbhc_zdet_gpio_ctrl(msm_config_hph_en0_gpio, rtd->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:
|
done:
|
||||||
|
msm_set_codec_reg_done(true);
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
err_snd_module:
|
|
||||||
err_afe_cfg:
|
err_afe_cfg:
|
||||||
err_mbhc_cal:
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL(msm_audrx_init);
|
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 snd_card_val);
|
||||||
int msm_ext_be_hw_params_fixup(struct snd_soc_pcm_runtime *rtd,
|
int msm_ext_be_hw_params_fixup(struct snd_soc_pcm_runtime *rtd,
|
||||||
struct snd_pcm_hw_params *params);
|
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
|
#ifdef CONFIG_SND_SOC_EXT_CODEC
|
||||||
int msm_ext_cdc_init(struct platform_device *, struct msm_asoc_mach_data *,
|
int msm_ext_cdc_init(struct platform_device *, struct msm_asoc_mach_data *,
|
||||||
struct snd_soc_card **, struct wcd_mbhc_config *);
|
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_dig_codec_info_create_codec_entry(codec_root, dig_cdc);
|
||||||
msm_anlg_codec_info_create_codec_entry(codec_root, ana_cdc);
|
msm_anlg_codec_info_create_codec_entry(codec_root, ana_cdc);
|
||||||
done:
|
done:
|
||||||
|
msm_set_codec_reg_done(true);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1914,13 +1915,14 @@ static struct snd_soc_dai_link msm_int_dai[] = {
|
|||||||
.id = MSM_FRONTEND_DAI_MULTIMEDIA7,
|
.id = MSM_FRONTEND_DAI_MULTIMEDIA7,
|
||||||
},
|
},
|
||||||
{/* hw:x,16 */
|
{/* hw:x,16 */
|
||||||
.name = MSM_DAILINK_NAME(Compress3),
|
.name = MSM_DAILINK_NAME(MultiMedia10),
|
||||||
.stream_name = "Compress3",
|
.stream_name = "MultiMedia10",
|
||||||
.cpu_dai_name = "MultiMedia10",
|
.cpu_dai_name = "MultiMedia10",
|
||||||
.platform_name = "msm-compress-dsp",
|
.platform_name = "msm-pcm-dsp.1",
|
||||||
.dynamic = 1,
|
.dynamic = 1,
|
||||||
.dpcm_capture = 1,
|
.dpcm_capture = 1,
|
||||||
.dpcm_playback = 1,
|
.dpcm_playback = 1,
|
||||||
|
.dpcm_capture = 1,
|
||||||
.trigger = {SND_SOC_DPCM_TRIGGER_POST,
|
.trigger = {SND_SOC_DPCM_TRIGGER_POST,
|
||||||
SND_SOC_DPCM_TRIGGER_POST},
|
SND_SOC_DPCM_TRIGGER_POST},
|
||||||
.codec_dai_name = "snd-soc-dummy-dai",
|
.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,
|
.id = MSM_FRONTEND_DAI_MULTIMEDIA7,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
.name = MSM_DAILINK_NAME(Compress3),
|
.name = MSM_DAILINK_NAME(MultiMedia10),
|
||||||
.stream_name = "Compress3",
|
.stream_name = "MultiMedia10",
|
||||||
.cpu_dai_name = "MultiMedia10",
|
.cpu_dai_name = "MultiMedia10",
|
||||||
.platform_name = "msm-compress-dsp",
|
.platform_name = "msm-pcm-dsp.1",
|
||||||
.dynamic = 1,
|
.dynamic = 1,
|
||||||
.dpcm_playback = 1,
|
.dpcm_playback = 1,
|
||||||
|
.dpcm_capture = 1,
|
||||||
.trigger = {SND_SOC_DPCM_TRIGGER_POST,
|
.trigger = {SND_SOC_DPCM_TRIGGER_POST,
|
||||||
SND_SOC_DPCM_TRIGGER_POST},
|
SND_SOC_DPCM_TRIGGER_POST},
|
||||||
.codec_dai_name = "snd-soc-dummy-dai",
|
.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,
|
ret = of_property_read_u32(pdev->dev.of_node,
|
||||||
"qcom,wsa-max-devs", &wsa_max_devs);
|
"qcom,wsa-max-devs", &wsa_max_devs);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
dev_dbg(&pdev->dev,
|
dev_info(&pdev->dev,
|
||||||
"%s: wsa-max-devs property missing in DT %s, ret = %d\n",
|
"%s: wsa-max-devs property missing in DT %s, ret = %d\n",
|
||||||
__func__, pdev->dev.of_node->full_name, ret);
|
__func__, pdev->dev.of_node->full_name, ret);
|
||||||
goto err;
|
card->num_aux_devs = 0;
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
if (wsa_max_devs == 0) {
|
if (wsa_max_devs == 0) {
|
||||||
dev_warn(&pdev->dev,
|
dev_warn(&pdev->dev,
|
||||||
"%s: Max WSA devices is 0 for this target?\n",
|
"%s: Max WSA devices is 0 for this target?\n",
|
||||||
__func__);
|
__func__);
|
||||||
goto err;
|
card->num_aux_devs = 0;
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Get count of WSA device phandles for this platform */
|
/* Get count of WSA device phandles for this platform */
|
||||||
|
@@ -30,7 +30,9 @@
|
|||||||
#ifdef CONFIG_USE_DEV_CTRL_VOLUME
|
#ifdef CONFIG_USE_DEV_CTRL_VOLUME
|
||||||
#include <linux/qdsp6v2/audio_dev_ctl.h>
|
#include <linux/qdsp6v2/audio_dev_ctl.h>
|
||||||
#endif /*CONFIG_USE_DEV_CTRL_VOLUME*/
|
#endif /*CONFIG_USE_DEV_CTRL_VOLUME*/
|
||||||
|
static DEFINE_MUTEX(lock);
|
||||||
#ifdef CONFIG_DEBUG_FS
|
#ifdef CONFIG_DEBUG_FS
|
||||||
|
|
||||||
int audio_aio_debug_open(struct inode *inode, struct file *file)
|
int audio_aio_debug_open(struct inode *inode, struct file *file)
|
||||||
{
|
{
|
||||||
file->private_data = inode->i_private;
|
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;
|
const int debug_bufmax = 4096;
|
||||||
static char buffer[4096];
|
static char buffer[4096];
|
||||||
int n = 0;
|
int n = 0;
|
||||||
struct q6audio_aio *audio = file->private_data;
|
struct q6audio_aio *audio;
|
||||||
|
|
||||||
mutex_lock(&audio->lock);
|
mutex_lock(&lock);
|
||||||
n = scnprintf(buffer, debug_bufmax, "opened %d\n", audio->opened);
|
if (file->private_data != NULL) {
|
||||||
n += scnprintf(buffer + n, debug_bufmax - n,
|
audio = file->private_data;
|
||||||
"enabled %d\n", audio->enabled);
|
mutex_lock(&audio->lock);
|
||||||
n += scnprintf(buffer + n, debug_bufmax - n,
|
n = scnprintf(buffer, debug_bufmax, "opened %d\n",
|
||||||
"stopped %d\n", audio->stopped);
|
audio->opened);
|
||||||
n += scnprintf(buffer + n, debug_bufmax - n,
|
n += scnprintf(buffer + n, debug_bufmax - n,
|
||||||
"feedback %d\n", audio->feedback);
|
"enabled %d\n", audio->enabled);
|
||||||
mutex_unlock(&audio->lock);
|
n += scnprintf(buffer + n, debug_bufmax - n,
|
||||||
/* Following variables are only useful for debugging when
|
"stopped %d\n", audio->stopped);
|
||||||
* when playback halts unexpectedly. Thus, no mutual exclusion
|
n += scnprintf(buffer + n, debug_bufmax - n,
|
||||||
* enforced
|
"feedback %d\n", audio->feedback);
|
||||||
*/
|
mutex_unlock(&audio->lock);
|
||||||
n += scnprintf(buffer + n, debug_bufmax - n,
|
/* Following variables are only useful for debugging when
|
||||||
"wflush %d\n", audio->wflush);
|
* when playback halts unexpectedly. Thus, no mutual exclusion
|
||||||
n += scnprintf(buffer + n, debug_bufmax - n,
|
* enforced
|
||||||
"rflush %d\n", audio->rflush);
|
*/
|
||||||
n += scnprintf(buffer + n, debug_bufmax - n,
|
n += scnprintf(buffer + n, debug_bufmax - n,
|
||||||
"inqueue empty %d\n", list_empty(&audio->in_queue));
|
"wflush %d\n", audio->wflush);
|
||||||
n += scnprintf(buffer + n, debug_bufmax - n,
|
n += scnprintf(buffer + n, debug_bufmax - n,
|
||||||
"outqueue empty %d\n", list_empty(&audio->out_queue));
|
"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;
|
buffer[n] = 0;
|
||||||
return simple_read_from_buffer(buf, count, ppos, buffer, n);
|
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;
|
struct q6audio_aio *audio = file->private_data;
|
||||||
|
|
||||||
pr_debug("%s[%pK]\n", __func__, audio);
|
pr_debug("%s[%pK]\n", __func__, audio);
|
||||||
|
mutex_lock(&lock);
|
||||||
mutex_lock(&audio->lock);
|
mutex_lock(&audio->lock);
|
||||||
mutex_lock(&audio->read_lock);
|
mutex_lock(&audio->read_lock);
|
||||||
mutex_lock(&audio->write_lock);
|
mutex_lock(&audio->write_lock);
|
||||||
@@ -622,6 +633,8 @@ int audio_aio_release(struct inode *inode, struct file *file)
|
|||||||
#endif
|
#endif
|
||||||
kfree(audio->codec_cfg);
|
kfree(audio->codec_cfg);
|
||||||
kfree(audio);
|
kfree(audio);
|
||||||
|
file->private_data = NULL;
|
||||||
|
mutex_unlock(&lock);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
256
dsp/q6core.c
256
dsp/q6core.c
@@ -20,7 +20,9 @@
|
|||||||
#include <linux/slab.h>
|
#include <linux/slab.h>
|
||||||
#include <dsp/q6core.h>
|
#include <dsp/q6core.h>
|
||||||
#include <dsp/audio_cal_utils.h>
|
#include <dsp/audio_cal_utils.h>
|
||||||
|
#include <dsp/apr_audio-v2.h>
|
||||||
#include <ipc/apr.h>
|
#include <ipc/apr.h>
|
||||||
|
#include "adsp_err.h"
|
||||||
|
|
||||||
#define TIMEOUT_MS 1000
|
#define TIMEOUT_MS 1000
|
||||||
/*
|
/*
|
||||||
@@ -36,16 +38,30 @@ enum {
|
|||||||
CORE_MAX_CAL
|
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 q6core_str {
|
||||||
struct apr_svc *core_handle_q;
|
struct apr_svc *core_handle_q;
|
||||||
wait_queue_head_t bus_bw_req_wait;
|
wait_queue_head_t bus_bw_req_wait;
|
||||||
wait_queue_head_t cmd_req_wait;
|
wait_queue_head_t cmd_req_wait;
|
||||||
|
wait_queue_head_t avcs_fwk_ver_req_wait;
|
||||||
u32 bus_bw_resp_received;
|
u32 bus_bw_resp_received;
|
||||||
enum cmd_flags {
|
enum cmd_flags {
|
||||||
FLAG_NONE,
|
FLAG_NONE,
|
||||||
FLAG_CMDRSP_LICENSE_RESULT
|
FLAG_CMDRSP_LICENSE_RESULT
|
||||||
} cmd_resp_received_flag;
|
} cmd_resp_received_flag;
|
||||||
|
u32 avcs_fwk_ver_resp_received;
|
||||||
struct mutex cmd_lock;
|
struct mutex cmd_lock;
|
||||||
|
struct mutex ver_lock;
|
||||||
union {
|
union {
|
||||||
struct avcs_cmdrsp_get_license_validation_result
|
struct avcs_cmdrsp_get_license_validation_result
|
||||||
cmdrsp_license_result;
|
cmdrsp_license_result;
|
||||||
@@ -54,6 +70,7 @@ struct q6core_str {
|
|||||||
struct cal_type_data *cal_data[CORE_MAX_CAL];
|
struct cal_type_data *cal_data[CORE_MAX_CAL];
|
||||||
uint32_t mem_map_cal_handle;
|
uint32_t mem_map_cal_handle;
|
||||||
int32_t adsp_status;
|
int32_t adsp_status;
|
||||||
|
struct q6core_avcs_ver_info q6core_avcs_ver_info;
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct q6core_str q6core_lcl;
|
static struct q6core_str q6core_lcl;
|
||||||
@@ -65,9 +82,61 @@ struct generic_get_data_ {
|
|||||||
};
|
};
|
||||||
static struct generic_get_data_ *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)
|
static int32_t aprv2_core_fn_q(struct apr_client_data *data, void *priv)
|
||||||
{
|
{
|
||||||
uint32_t *payload1;
|
uint32_t *payload1;
|
||||||
|
int ret = 0;
|
||||||
|
|
||||||
if (data == NULL) {
|
if (data == NULL) {
|
||||||
pr_err("%s: data argument is null\n", __func__);
|
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;
|
q6core_lcl.bus_bw_resp_received = 1;
|
||||||
wake_up(&q6core_lcl.bus_bw_req_wait);
|
wake_up(&q6core_lcl.bus_bw_req_wait);
|
||||||
break;
|
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:
|
default:
|
||||||
pr_err("%s: Invalid cmd rsp[0x%x][0x%x] opcode %d\n",
|
pr_err("%s: Invalid cmd rsp[0x%x][0x%x] opcode %d\n",
|
||||||
__func__,
|
__func__,
|
||||||
@@ -130,7 +210,7 @@ static int32_t aprv2_core_fn_q(struct apr_client_data *data, void *priv)
|
|||||||
case RESET_EVENTS:{
|
case RESET_EVENTS:{
|
||||||
pr_debug("%s: Reset event received in Core service\n",
|
pr_debug("%s: Reset event received in Core service\n",
|
||||||
__func__);
|
__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;
|
q6core_lcl.core_handle_q = NULL;
|
||||||
break;
|
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;
|
q6core_lcl.cmd_resp_received_flag = FLAG_CMDRSP_LICENSE_RESULT;
|
||||||
wake_up(&q6core_lcl.cmd_req_wait);
|
wake_up(&q6core_lcl.cmd_req_wait);
|
||||||
break;
|
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:
|
default:
|
||||||
pr_err("%s: Message id from adsp core svc: 0x%x\n",
|
pr_err("%s: Message id from adsp core svc: 0x%x\n",
|
||||||
__func__, data->opcode);
|
__func__, data->opcode);
|
||||||
@@ -217,6 +309,157 @@ struct cal_block_data *cal_utils_get_cal_block_by_key(
|
|||||||
return NULL;
|
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)
|
int32_t core_set_license(uint32_t key, uint32_t module_id)
|
||||||
{
|
{
|
||||||
struct avcs_cmd_set_license *cmd_setl = NULL;
|
struct avcs_cmd_set_license *cmd_setl = NULL;
|
||||||
@@ -827,18 +1070,16 @@ err:
|
|||||||
|
|
||||||
static int __init core_init(void)
|
static int __init core_init(void)
|
||||||
{
|
{
|
||||||
|
memset(&q6core_lcl, 0, sizeof(struct q6core_str));
|
||||||
init_waitqueue_head(&q6core_lcl.bus_bw_req_wait);
|
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.cmd_req_wait);
|
||||||
|
init_waitqueue_head(&q6core_lcl.avcs_fwk_ver_req_wait);
|
||||||
q6core_lcl.cmd_resp_received_flag = FLAG_NONE;
|
q6core_lcl.cmd_resp_received_flag = FLAG_NONE;
|
||||||
mutex_init(&q6core_lcl.cmd_lock);
|
mutex_init(&q6core_lcl.cmd_lock);
|
||||||
q6core_lcl.mem_map_cal_handle = 0;
|
mutex_init(&q6core_lcl.ver_lock);
|
||||||
q6core_lcl.adsp_status = 0;
|
|
||||||
|
|
||||||
q6core_init_cal_data();
|
q6core_init_cal_data();
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
module_init(core_init);
|
module_init(core_init);
|
||||||
@@ -846,6 +1087,7 @@ module_init(core_init);
|
|||||||
static void __exit core_exit(void)
|
static void __exit core_exit(void)
|
||||||
{
|
{
|
||||||
mutex_destroy(&q6core_lcl.cmd_lock);
|
mutex_destroy(&q6core_lcl.cmd_lock);
|
||||||
|
mutex_destroy(&q6core_lcl.ver_lock);
|
||||||
q6core_delete_cal_data();
|
q6core_delete_cal_data();
|
||||||
}
|
}
|
||||||
module_exit(core_exit);
|
module_exit(core_exit);
|
||||||
|
353
dsp/q6voice.c
353
dsp/q6voice.c
@@ -24,8 +24,9 @@
|
|||||||
#include <dsp/apr_audio-v2.h>
|
#include <dsp/apr_audio-v2.h>
|
||||||
#include <dsp/q6afe-v2.h>
|
#include <dsp/q6afe-v2.h>
|
||||||
#include <dsp/audio_cal_utils.h>
|
#include <dsp/audio_cal_utils.h>
|
||||||
#include <ipc/apr_tal.h>
|
#include <dsp/q6core.h>
|
||||||
#include <dsp/q6voice.h>
|
#include <dsp/q6voice.h>
|
||||||
|
#include <ipc/apr_tal.h>
|
||||||
#include "adsp_err.h"
|
#include "adsp_err.h"
|
||||||
|
|
||||||
#define TIMEOUT_MS 300
|
#define TIMEOUT_MS 300
|
||||||
@@ -33,6 +34,9 @@
|
|||||||
|
|
||||||
#define CMD_STATUS_SUCCESS 0
|
#define CMD_STATUS_SUCCESS 0
|
||||||
#define CMD_STATUS_FAIL 1
|
#define CMD_STATUS_FAIL 1
|
||||||
|
#define NUM_CHANNELS_MONO 1
|
||||||
|
#define NUM_CHANNELS_STEREO 2
|
||||||
|
#define CVP_VERSION_2 2
|
||||||
|
|
||||||
enum {
|
enum {
|
||||||
VOC_TOKEN_NONE,
|
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,
|
static int voice_send_cvp_media_format_cmd(struct voice_data *v,
|
||||||
uint32_t param_type);
|
uint32_t param_type);
|
||||||
static int voice_send_cvp_topology_commit_cmd(struct voice_data *v);
|
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_stop_playback(struct voice_data *v);
|
||||||
static int voice_cvs_start_playback(struct voice_data *v);
|
static int voice_cvs_start_playback(struct voice_data *v);
|
||||||
@@ -3793,6 +3802,295 @@ done:
|
|||||||
return result;
|
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)
|
static int voice_setup_vocproc(struct voice_data *v)
|
||||||
{
|
{
|
||||||
int ret = 0;
|
int ret = 0;
|
||||||
@@ -3803,6 +4101,18 @@ static int voice_setup_vocproc(struct voice_data *v)
|
|||||||
goto fail;
|
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);
|
ret = voice_send_cvp_media_fmt_info_cmd(v);
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
pr_err("%s: Set media format info failed err:%d\n", __func__,
|
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;
|
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_cvs_register_cal_cmd(v);
|
||||||
voice_send_cvp_register_dev_cfg_cmd(v);
|
voice_send_cvp_register_dev_cfg_cmd(v);
|
||||||
voice_send_cvp_register_cal_cmd(v);
|
voice_send_cvp_register_cal_cmd(v);
|
||||||
@@ -3962,11 +4281,18 @@ done:
|
|||||||
|
|
||||||
static int voice_send_cvp_media_fmt_info_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 (common.cvp_version < CVP_VERSION_2)
|
||||||
if (ret < 0)
|
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;
|
goto done;
|
||||||
|
}
|
||||||
|
|
||||||
if (voice_get_cvd_int_version(common.cvd_version) >=
|
if (voice_get_cvd_int_version(common.cvd_version) >=
|
||||||
CVD_INT_VERSION_2_3) {
|
CVD_INT_VERSION_2_3) {
|
||||||
@@ -3994,7 +4320,7 @@ static int voice_send_cvp_media_format_cmd(struct voice_data *v,
|
|||||||
void *apr_cvp;
|
void *apr_cvp;
|
||||||
u16 cvp_handle;
|
u16 cvp_handle;
|
||||||
struct vss_icommon_param_data_t *media_fmt_param_data =
|
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 =
|
struct vss_param_endpoint_media_format_info_t *media_fmt_info =
|
||||||
&media_fmt_param_data->media_format_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;
|
cvp_set_media_format_cmd.hdr.opcode = VSS_ICOMMON_CMD_SET_PARAM_V2;
|
||||||
|
|
||||||
/* Fill param data */
|
/* 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);
|
sizeof(struct vss_icommon_param_data_t);
|
||||||
media_fmt_param_data->module_id = VSS_MODULE_CVD_GENERIC;
|
media_fmt_param_data->module_id = VSS_MODULE_CVD_GENERIC;
|
||||||
media_fmt_param_data->param_size =
|
media_fmt_param_data->param_size =
|
||||||
@@ -6197,6 +6523,15 @@ int voc_enable_device(uint32_t session_id)
|
|||||||
goto done;
|
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_dev_cfg_cmd(v);
|
||||||
voice_send_cvp_register_cal_cmd(v);
|
voice_send_cvp_register_cal_cmd(v);
|
||||||
voice_send_cvp_register_vol_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:
|
case VSS_ICOMMON_CMD_SET_PARAM_V2:
|
||||||
switch (data->token) {
|
switch (data->token) {
|
||||||
case VOC_SET_MEDIA_FORMAT_PARAM_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__);
|
__func__);
|
||||||
v->cvp_state = CMD_STATUS_SUCCESS;
|
v->cvp_state = CMD_STATUS_SUCCESS;
|
||||||
v->async_err = ptr[1];
|
v->async_err = ptr[1];
|
||||||
@@ -8566,7 +8902,8 @@ static int __init voice_init(void)
|
|||||||
common.default_vol_step_val = 0;
|
common.default_vol_step_val = 0;
|
||||||
common.default_vol_ramp_duration_ms = DEFAULT_VOLUME_RAMP_DURATION;
|
common.default_vol_ramp_duration_ms = DEFAULT_VOLUME_RAMP_DURATION;
|
||||||
common.default_mute_ramp_duration_ms = DEFAULT_MUTE_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 */
|
/* Initialize EC Ref media format info */
|
||||||
common.ec_ref_ext = false;
|
common.ec_ref_ext = false;
|
||||||
common.ec_media_fmt_info.port_id = AFE_PORT_INVALID;
|
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_CMD_GET_PARAM_V2 0x0001133E
|
||||||
#define VSS_ICOMMON_RSP_GET_PARAM 0x00011008
|
#define VSS_ICOMMON_RSP_GET_PARAM 0x00011008
|
||||||
|
|
||||||
|
#define VSS_MAX_AVCS_NUM_SERVICES 25
|
||||||
|
|
||||||
/* ID of the Bass Boost module.
|
/* ID of the Bass Boost module.
|
||||||
* This module supports the following parameter IDs:
|
* This module supports the following parameter IDs:
|
||||||
* - #AUDPROC_PARAM_ID_BASS_BOOST_ENABLE
|
* - #AUDPROC_PARAM_ID_BASS_BOOST_ENABLE
|
||||||
@@ -9197,6 +9199,74 @@ struct asm_aptx_dec_fmt_blk_v2 {
|
|||||||
*/
|
*/
|
||||||
} __packed;
|
} __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 */
|
/* LSM Specific */
|
||||||
#define VW_FEAT_DIM (39)
|
#define VW_FEAT_DIM (39)
|
||||||
|
|
||||||
|
@@ -13,6 +13,7 @@
|
|||||||
#ifndef __Q6CORE_H__
|
#ifndef __Q6CORE_H__
|
||||||
#define __Q6CORE_H__
|
#define __Q6CORE_H__
|
||||||
#include <ipc/apr.h>
|
#include <ipc/apr.h>
|
||||||
|
#include <dsp/apr_audio-v2.h>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -21,6 +22,11 @@
|
|||||||
|
|
||||||
bool q6core_is_adsp_ready(void);
|
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 ADSP_CMD_SET_DTS_EAGLE_DATA_ID 0x00012919
|
||||||
#define DTS_EAGLE_LICENSE_ID 0x00028346
|
#define DTS_EAGLE_LICENSE_ID 0x00028346
|
||||||
struct adsp_dts_eagle {
|
struct adsp_dts_eagle {
|
||||||
|
@@ -124,7 +124,7 @@ struct media_format_info {
|
|||||||
};
|
};
|
||||||
|
|
||||||
enum {
|
enum {
|
||||||
VOC_NO_SET_PARAM_TOKEN = 0,
|
VOC_GENERIC_SET_PARAM_TOKEN = 0,
|
||||||
VOC_RTAC_SET_PARAM_TOKEN,
|
VOC_RTAC_SET_PARAM_TOKEN,
|
||||||
VOC_SET_MEDIA_FORMAT_PARAM_TOKEN,
|
VOC_SET_MEDIA_FORMAT_PARAM_TOKEN,
|
||||||
VOC_SET_PARAM_TOKEN_MAX
|
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];
|
uint8_t channel_mapping[VSS_NUM_CHANNELS_MAX];
|
||||||
} __packed;
|
} __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 {
|
struct vss_icommon_param_data_t {
|
||||||
/* Valid ID of the module. */
|
/* Valid ID of the module. */
|
||||||
uint32_t module_id;
|
uint32_t module_id;
|
||||||
@@ -260,6 +273,88 @@ struct vss_icommon_param_data_t {
|
|||||||
};
|
};
|
||||||
} __packed;
|
} __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. */
|
/* Payload structure for the VSS_ICOMMON_CMD_SET_PARAM_V2 command. */
|
||||||
struct vss_icommon_cmd_set_param_v2_t {
|
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
|
#define VSS_IRECORD_MODE_TX_RX_MIXING 0x00010F7B
|
||||||
/* Select mixed Tx and Rx paths. */
|
/* 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_TX_PORT_ENDPOINT_MEDIA_INFO 0x00013253
|
||||||
|
|
||||||
#define VSS_PARAM_RX_PORT_ENDPOINT_MEDIA_INFO 0x00013254
|
#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 cvp_set_media_format_cmd {
|
||||||
struct apr_hdr hdr;
|
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;
|
} __packed;
|
||||||
|
|
||||||
struct cvp_set_vp3_data_cmd {
|
struct cvp_set_vp3_data_cmd {
|
||||||
@@ -1756,6 +1868,8 @@ struct common_data {
|
|||||||
bool srvcc_rec_flag;
|
bool srvcc_rec_flag;
|
||||||
bool is_destroy_cvd;
|
bool is_destroy_cvd;
|
||||||
char cvd_version[CVD_VERSION_STRING_MAX_SIZE];
|
char cvd_version[CVD_VERSION_STRING_MAX_SIZE];
|
||||||
|
int cvp_version;
|
||||||
|
bool is_avcs_version_queried;
|
||||||
bool is_per_vocoder_cal_enabled;
|
bool is_per_vocoder_cal_enabled;
|
||||||
bool is_sound_focus_resp_success;
|
bool is_sound_focus_resp_success;
|
||||||
bool is_source_tracking_resp_success;
|
bool is_source_tracking_resp_success;
|
||||||
|
@@ -26,7 +26,7 @@
|
|||||||
#include "core.h"
|
#include "core.h"
|
||||||
#include "pinctrl-utils.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_VAL_CTL 0x00
|
||||||
#define LPI_GPIO_REG_DIR_CTL 0x04
|
#define LPI_GPIO_REG_DIR_CTL 0x04
|
||||||
@@ -109,35 +109,35 @@ static const u32 lpi_offset[] = {
|
|||||||
0x00000000,
|
0x00000000,
|
||||||
0x00001000,
|
0x00001000,
|
||||||
0x00002000,
|
0x00002000,
|
||||||
0x00002010,
|
|
||||||
0x00003000,
|
0x00003000,
|
||||||
0x00003010,
|
|
||||||
0x00004000,
|
0x00004000,
|
||||||
0x00004010,
|
|
||||||
0x00005000,
|
0x00005000,
|
||||||
0x00005010,
|
|
||||||
0x00005020,
|
|
||||||
0x00005030,
|
|
||||||
0x00006000,
|
0x00006000,
|
||||||
0x00006010,
|
|
||||||
0x00007000,
|
0x00007000,
|
||||||
0x00007010,
|
|
||||||
0x00005040,
|
|
||||||
0x00005050,
|
|
||||||
0x00008000,
|
0x00008000,
|
||||||
0x00008010,
|
|
||||||
0x00008020,
|
|
||||||
0x00008030,
|
|
||||||
0x00008040,
|
|
||||||
0x00008050,
|
|
||||||
0x00008060,
|
|
||||||
0x00008070,
|
|
||||||
0x00009000,
|
0x00009000,
|
||||||
0x00009010,
|
|
||||||
0x0000A000,
|
0x0000A000,
|
||||||
0x0000A010,
|
|
||||||
0x0000B000,
|
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[] = {
|
static const char *const lpi_gpio_functions[] = {
|
||||||
|
Reference in New Issue
Block a user