Merge "asoc: add AFE logging PID and APIs"

This commit is contained in:
qctecmdr 2021-03-17 17:20:29 -07:00 committed by Gerrit - the friendly Code Review server
commit 8cf97af576
4 changed files with 175 additions and 0 deletions

View File

@ -394,6 +394,12 @@ static const struct soc_enum tdm_config_enum[] = {
SOC_ENUM_SINGLE_EXT(ARRAY_SIZE(tdm_header_type), tdm_header_type),
};
static u16 afe_port_logging_port_id;
static bool afe_port_logging_item[IDX_TDM_MAX];
static int afe_port_loggging_control_added;
static DEFINE_MUTEX(tdm_mutex);
static atomic_t tdm_group_ref[IDX_GROUP_TDM_MAX];
@ -9272,6 +9278,87 @@ static int msm_dai_q6_tdm_set_clk(
return rc;
}
static int msm_pcm_afe_port_logging_info(struct snd_kcontrol *kcontrol,
struct snd_ctl_elem_info* ucontrol)
{
ucontrol->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
/* two int values: port_id and enable/disable */
ucontrol->count = 2;
/* Valid range is all positive values to support above controls */
ucontrol->value.integer.min = 0;
ucontrol->value.integer.max = INT_MAX;
return 0;
}
static int msm_pcm_afe_port_logging_ctl_get(struct snd_kcontrol *kcontrol,
struct snd_ctl_elem_value *ucontrol)
{
int port_idx = afe_port_logging_port_id - AFE_PORT_ID_TDM_PORT_RANGE_START;
ucontrol->value.integer.value[0] = afe_port_logging_port_id;
ucontrol->value.integer.value[1] = afe_port_logging_item[port_idx];
return 0;
}
static int msm_pcm_afe_port_logging_ctl_put(struct snd_kcontrol *kcontrol,
struct snd_ctl_elem_value *ucontrol)
{
u16 port_id;
struct afe_param_id_port_data_log_disable_t log_disable;
struct param_hdr_v3 param_hdr;
int ret = -EINVAL, port_idx;
pr_debug("%s: enter\n", __func__);
memset(&param_hdr, 0, sizeof(param_hdr));
port_id = ucontrol->value.integer.value[0];
log_disable.disable_logging_flag = ucontrol->value.integer.value[1];
ret = afe_port_send_logging_cfg(port_id, &log_disable);
if (ret)
pr_err("%s: AFE port logging setting for port 0x%x failed %d\n",
__func__, port_id, ret);
afe_port_logging_port_id = port_id;
port_idx = port_id - AFE_PORT_ID_TDM_PORT_RANGE_START;
afe_port_logging_item[port_idx] = ucontrol->value.integer.value[1];
return ret;
}
static int msm_pcm_add_afe_port_logging_control(struct snd_soc_dai *dai)
{
const char* afe_port_logging_ctl_name = "AFE_port_logging_disable";
int rc = 0;
struct snd_kcontrol_new *knew = NULL;
struct snd_kcontrol* kctl = NULL;
/* Add AFE port logging controls */
knew = kzalloc(sizeof(struct snd_kcontrol_new), GFP_KERNEL);
if (!knew) {
return -ENOMEM;
}
knew->iface = SNDRV_CTL_ELEM_IFACE_MIXER;
knew->info = msm_pcm_afe_port_logging_info;
knew->get = msm_pcm_afe_port_logging_ctl_get;
knew->put = msm_pcm_afe_port_logging_ctl_put;
knew->name = afe_port_logging_ctl_name;
knew->private_value = dai->id;
kctl = snd_ctl_new1(knew, knew);
if (!kctl) {
kfree(knew);
return -ENOMEM;
}
rc = snd_ctl_add(dai->component->card->snd_card, kctl);
if (rc < 0)
pr_err("%s: err add AFE port logging disable control, DAI = %s\n",
__func__, dai->name);
return rc;
}
static int msm_dai_q6_dai_tdm_probe(struct snd_soc_dai *dai)
{
int rc = 0;
@ -9348,6 +9435,18 @@ static int msm_dai_q6_dai_tdm_probe(struct snd_soc_dai *dai)
}
}
/* add AFE port logging controls */
if (!afe_port_loggging_control_added) {
rc = msm_pcm_add_afe_port_logging_control(dai);
if (rc < 0) {
dev_err(dai->dev, "%s: add AFE port logging control failed DAI: %s\n",
__func__, dai->name);
goto rtn;
}
afe_port_loggging_control_added = 1;
}
if (tdm_dai_data->is_island_dai)
rc = msm_dai_q6_add_island_mx_ctls(
dai->component->card->snd_card,

View File

@ -4800,6 +4800,40 @@ void afe_set_routing_callback(routing_cb cb)
}
EXPORT_SYMBOL(afe_set_routing_callback);
/**
* afe_port_send_logging_cfg -
* set AFE port logging status
*
* @port_id: AFE port id number
* @log_disable: logging payload
*
* Returns 0 on success or error value on set param failure
*/
int afe_port_send_logging_cfg(u16 port_id,
struct afe_param_id_port_data_log_disable_t *log_disable)
{
struct param_hdr_v3 param_hdr;
int ret = -EINVAL;
pr_debug("%s: enter, port: 0x%x logging flag: %x\n", __func__, port_id,
log_disable->disable_logging_flag);
memset(&param_hdr, 0, sizeof(param_hdr));
param_hdr.module_id = AFE_MODULE_AUDIO_DEV_INTERFACE;
param_hdr.instance_id = INSTANCE_ID_0;
param_hdr.param_id = AFE_PARAM_ID_PORT_DATA_LOGGING_DISABLE;
param_hdr.param_size = sizeof(&log_disable);
ret = q6afe_pack_and_set_param_in_band(port_id,
q6audio_get_port_index(port_id), param_hdr, (u8*)log_disable);
if (ret)
pr_err("%s: AFE port logging setting for port 0x%x failed %d\n",
__func__, port_id, ret);
return ret;
}
EXPORT_SYMBOL(afe_port_send_logging_cfg);
int afe_port_send_usb_dev_param(u16 port_id, union afe_port_config *afe_config)
{
struct afe_param_id_usb_audio_dev_params usb_dev;

View File

@ -13414,4 +13414,44 @@ struct afe_param_id_tdm_lane_cfg {
*/
};
/** ID of the parameter used to set the AFE port data logging to enable or disable state.
* For non-group device use cases, #AFE_MODULE_AUDIO_DEV_INTERFACE uses this
* parameter to configure the flag used for data logging in afe_data_logging_t
* of the respective port to enabled or disabled state.
* The HLOS client can use this parameter to configure the data logging
* disable flag for it's respective port.
* The reason for this parameter addition is if a number of ports are
* configured and running, Upon enabling logging through 0x1586 tap point,
* we will get input/output logs for all the enabled ports.
* In order to disabled logging for a specific port for which data logging
* is not needed, the HLOS client can make use of AFE_PORT_DATA_LOGGING_DISABLE flag.
* This flag will set to AFE_PORT_DATA_LOGGING_ENABLE during port initialization and also
* during port stop. If port is restarted, the set param should be called again
* by the HLOS client if needed to disable data logging.
* @par
* If HLOS client doesn't set this paramter, by default the disable flag = AFE_PORT_DATA_LOGGING_ENABLE.
* If HLOS client sets the flag = AFE_PORT_DATA_LOGGING_DISABLE, the respective port will be disabled for data logging.
*/
#define AFE_PARAM_ID_PORT_DATA_LOGGING_DISABLE 0x000102E9
/** Enable flag for port data logging. */
#define AFE_PORT_DATA_LOGGING_ENABLE 0
/** Disable flag for port data logging. */
#define AFE_PORT_DATA_LOGGING_DISABLE 1
/*
* Payload of the AFE_PARAM_ID_PORT_DATA_LOGGING_DISABLE parameter used by
* AFE_MODULE_AUDIO_DEV_INTERFACE
*/
struct afe_param_id_port_data_log_disable_t
{
uint32_t disable_logging_flag;
/** Flag for enabling or disabling data logging.
* @values
* - AFE_PORT_DATA_LOGGING_ENABLE - enable data logging.
* - AFE_PORT_DATA_LOGGING_DISABLE - disable data logging.
*/
} __packed;
#endif /*_APR_AUDIO_V2_H_ */

View File

@ -520,6 +520,8 @@ int afe_send_custom_tdm_header_cfg(
int afe_tdm_port_start(u16 port_id, struct afe_tdm_port_config *tdm_port,
u32 rate, u16 num_groups);
void afe_set_routing_callback(routing_cb cb);
int afe_port_send_logging_cfg(u16 port_id,
struct afe_param_id_port_data_log_disable_t *log_disable);
int afe_get_av_dev_drift(struct afe_param_id_dev_timing_stats *timing_stats,
u16 port);
int afe_get_sp_rx_tmax_xmax_logging_data(