[<prev] [next>] [thread-next>] [day] [month] [year] [list]
Message-ID: <20251217094602.55117-3-krzysztof.kozlowski@oss.qualcomm.com>
Date: Wed, 17 Dec 2025 10:46:03 +0100
From: Krzysztof Kozlowski <krzysztof.kozlowski@....qualcomm.com>
To: 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
Cc: Krzysztof Kozlowski <krzysztof.kozlowski@....qualcomm.com>,
Srinivas Kandagatla <srinivas.kandagatla@....qualcomm.com>
Subject: [PATCH v4 1/2] ASoC: qcom: audioreach: Add support for Speaker Protection module
Speaker Protection is capability of ADSP to adjust the gain during
playback to different speakers and their temperature. This allows good
playback without blowing the speakers up.
Implement parsing MODULE_ID_SPEAKER_PROTECTION from Audioreach topology
and sending it as command to the ADSP.
Reviewed-by: Srinivas Kandagatla <srinivas.kandagatla@....qualcomm.com>
Signed-off-by: Krzysztof Kozlowski <krzysztof.kozlowski@....qualcomm.com>
---
Changes in v4:
1. Rebase so it can be properly applied
Changes in v3:
1. Add Rb tag.
Changes in v2:
1. Add and use PARAM_ID_SP_OP_MODE_NORMAL
---
sound/soc/qcom/qdsp6/audioreach.c | 13 +++++++++++++
sound/soc/qcom/qdsp6/audioreach.h | 12 ++++++++++++
2 files changed, 25 insertions(+)
diff --git a/sound/soc/qcom/qdsp6/audioreach.c b/sound/soc/qcom/qdsp6/audioreach.c
index f3fa0a5b4095..c32a5ee801e7 100644
--- a/sound/soc/qcom/qdsp6/audioreach.c
+++ b/sound/soc/qcom/qdsp6/audioreach.c
@@ -1192,6 +1192,15 @@ static int audioreach_gain_set(struct q6apm_graph *graph, struct audioreach_modu
return q6apm_send_cmd_sync(graph->apm, pkt, 0);
}
+static int audioreach_speaker_protection(struct q6apm_graph *graph,
+ struct audioreach_module *module,
+ uint32_t operation_mode)
+{
+ return audioreach_send_u32_param(graph, module, PARAM_ID_SP_OP_MODE,
+ operation_mode);
+}
+
+
int audioreach_set_media_format(struct q6apm_graph *graph, struct audioreach_module *module,
struct audioreach_module_config *cfg)
{
@@ -1241,6 +1250,10 @@ int audioreach_set_media_format(struct q6apm_graph *graph, struct audioreach_mod
case MODULE_ID_GAPLESS:
rc = audioreach_gapless_set_media_format(graph, module, cfg);
break;
+ case MODULE_ID_SPEAKER_PROTECTION:
+ rc = audioreach_speaker_protection(graph, module,
+ PARAM_ID_SP_OP_MODE_NORMAL);
+ break;
default:
rc = 0;
}
diff --git a/sound/soc/qcom/qdsp6/audioreach.h b/sound/soc/qcom/qdsp6/audioreach.h
index d1b60b36468a..19828b4accce 100644
--- a/sound/soc/qcom/qdsp6/audioreach.h
+++ b/sound/soc/qcom/qdsp6/audioreach.h
@@ -31,6 +31,7 @@ struct q6apm_graph;
#define MODULE_ID_MP3_DECODE 0x0700103B
#define MODULE_ID_GAPLESS 0x0700104D
#define MODULE_ID_DISPLAY_PORT_SINK 0x07001069
+#define MODULE_ID_SPEAKER_PROTECTION 0x070010E2
#define MODULE_ID_OPUS_DEC 0x07001174
#define APM_CMD_GET_SPF_STATE 0x01001021
@@ -559,6 +560,17 @@ struct data_logging_config {
uint32_t mode;
} __packed;
+/* Speaker Protection */
+#define PARAM_ID_SP_OP_MODE 0x080011e9
+#define PARAM_ID_SP_OP_MODE_NORMAL 0
+#define PARAM_ID_SP_OP_MODE_CALIBRATION 1
+#define PARAM_ID_SP_OP_MODE_FACTORY_TEST 2
+#define PARAM_ID_SP_OP_MODE_VALIDATION 3
+
+struct param_id_sp_op_mode {
+ uint32_t operation_mode;
+} __packed;
+
#define PARAM_ID_SAL_OUTPUT_CFG 0x08001016
struct param_id_sal_output_config {
uint32_t bits_per_sample;
--
2.51.0
Powered by blists - more mailing lists