[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <79274958-52a0-4041-b4f3-365ee84fb088@oss.qualcomm.com>
Date: Thu, 4 Sep 2025 12:04:06 +0100
From: Srinivas Kandagatla <srinivas.kandagatla@....qualcomm.com>
To: Krzysztof Kozlowski <krzysztof.kozlowski@...aro.org>,
Srinivas Kandagatla <srini@...nel.org>,
Liam Girdwood <lgirdwood@...il.com>, Mark Brown <broonie@...nel.org>,
Jaroslav Kysela <perex@...ex.cz>, Takashi Iwai <tiwai@...e.com>,
linux-sound@...r.kernel.org, linux-arm-msm@...r.kernel.org,
linux-kernel@...r.kernel.org
Subject: Re: [PATCH v2 2/2] ASoC: qcom: audioreach: Add support for VI Sense
module
On 9/4/25 11:26 AM, Krzysztof Kozlowski wrote:
> VI Sense module in ADSP is responsible for feedback loop for measuring
> current and voltage of amplifiers, necessary for proper calibration of
> Speaker Protection algorightms. Implement parsing
> MODULE_ID_SPEAKER_PROTECTION_VI from Audioreach topology and sending it
> as command to the ADSP.
>
> Signed-off-by: Krzysztof Kozlowski <krzysztof.kozlowski@...aro.org>
>
> ---
>
> Changes in v2:
> 1. Use PARAM_ID_SP_VI_OP_MODE_NORMAL
> 2. Make num_channels u32
> 3. I did not change uint32_t type in the header for consistency
> ---
> sound/soc/qcom/qdsp6/audioreach.c | 112 ++++++++++++++++++++++++++++++
> sound/soc/qcom/qdsp6/audioreach.h | 27 +++++++
> 2 files changed, 139 insertions(+)
>
> diff --git a/sound/soc/qcom/qdsp6/audioreach.c b/sound/soc/qcom/qdsp6/audioreach.c
> index 3b7dffd696e7..f344ce80676f 100644
> --- a/sound/soc/qcom/qdsp6/audioreach.c
> +++ b/sound/soc/qcom/qdsp6/audioreach.c
> @@ -202,6 +202,31 @@ struct apm_display_port_module_intf_cfg {
> } __packed;
> #define APM_DP_INTF_CFG_PSIZE ALIGN(sizeof(struct apm_display_port_module_intf_cfg), 8)
>
> +struct apm_module_sp_vi_op_mode_cfg {
> + struct apm_module_param_data param_data;
> + struct param_id_sp_vi_op_mode_cfg cfg;
> +} __packed;
> +
> +#define APM_SP_VI_OP_MODE_CFG_PSIZE(ch) ALIGN( \
> + sizeof(struct apm_module_sp_vi_op_mode_cfg) + \
> + (ch) * sizeof(uint32_t), 8)
> +
> +struct apm_module_sp_vi_ex_mode_cfg {
> + struct apm_module_param_data param_data;
> + struct param_id_sp_vi_ex_mode_cfg cfg;
> +} __packed;
> +
> +#define APM_SP_VI_EX_MODE_CFG_PSIZE ALIGN(sizeof(struct apm_module_sp_vi_ex_mode_cfg), 8)
> +
> +struct apm_module_sp_vi_channel_map_cfg {
> + struct apm_module_param_data param_data;
> + struct param_id_sp_vi_channel_map_cfg cfg;
> +} __packed;
> +
> +#define APM_SP_VI_CH_MAP_CFG_PSIZE(ch) ALIGN( \
> + sizeof(struct apm_module_sp_vi_channel_map_cfg) + \
> + (ch) * sizeof(uint32_t), 8)
> +
> static void *__audioreach_alloc_pkt(int payload_size, uint32_t opcode, uint32_t token,
> uint32_t src_port, uint32_t dest_port, bool has_cmd_hdr)
> {
> @@ -1258,6 +1283,89 @@ static int audioreach_speaker_protection(struct q6apm_graph *graph,
> operation_mode);
> }
>
> +static int audioreach_speaker_protection_vi(struct q6apm_graph *graph,
> + struct audioreach_module *module,
> + struct audioreach_module_config *mcfg)
> +{
> + u32 num_channels = mcfg->num_channels;
> + struct apm_module_sp_vi_op_mode_cfg *op_cfg;
> + struct apm_module_sp_vi_channel_map_cfg *cm_cfg;
> + struct apm_module_sp_vi_ex_mode_cfg *ex_cfg;
> + int op_sz, cm_sz, ex_sz;
> + struct apm_module_param_data *param_data;
> + int rc, i, payload_size;
> + struct gpr_pkt *pkt;
> + void *p;
> +
> + if (num_channels > 2) {
> + dev_err(graph->dev, "Error: Invalid channels (%d)!\n", num_channels);
> + return -EINVAL;
> + }
> +
> + op_sz = APM_SP_VI_OP_MODE_CFG_PSIZE(num_channels);
> + /* Channel mapping for Isense and Vsense, thus twice number of speakers. */
> + cm_sz = APM_SP_VI_CH_MAP_CFG_PSIZE(num_channels * 2);
> + ex_sz = APM_SP_VI_EX_MODE_CFG_PSIZE;
> +
> + payload_size = op_sz + cm_sz + ex_sz;
> +
> + pkt = audioreach_alloc_apm_cmd_pkt(payload_size, APM_CMD_SET_CFG, 0);
> + if (IS_ERR(pkt))
> + return PTR_ERR(pkt);
> +
> + p = (void *)pkt + GPR_HDR_SIZE + APM_CMD_HDR_SIZE;
> +
> + op_cfg = p;
> + param_data = &op_cfg->param_data;
> + param_data->module_instance_id = module->instance_id;
> + param_data->error_code = 0;
> + param_data->param_id = PARAM_ID_SP_VI_OP_MODE_CFG;
> + param_data->param_size = op_sz - APM_MODULE_PARAM_DATA_SIZE;
> +
> + op_cfg->cfg.num_channels = num_channels;
> + op_cfg->cfg.operation_mode = PARAM_ID_SP_VI_OP_MODE_NORMAL;
> + op_cfg->cfg.quick_calibration = 1;
This field is only valid in calibration mode, we can remove it.
Other than that, it LGTM
Reviewed-by: Srinivas Kandagatla <srinivas.kandagatla@....qualcomm.com>
--srini
Powered by blists - more mailing lists