[PATCH v4 8/8] ASoC: qcom: lpass: Add support for LPASS codec v4.0
From: Mohammad Rafi Shaik
Date: Tue Sep 22 2026 - 05:45:35 EST
From: Prasad Kumpatla <prasad.kumpatla@xxxxxxxxxxxxxxxx>
Hawi and Maili use the LPASS codec v4.0, which the macro drivers do not
yet recognise.
Add LPASS_CODEC_VERSION_4_0 and its "v4.0" version string, and detect it
in the VA macro when the hardware reports major version 4, minor 0.
The RX macro register layout of LPASS codec v4.0 matches the v2.5+
layout, so reuse the existing v2.5 register access helpers, controls,
widgets and register defaults for it. Unlike v4.1, v4.0 does not need
the FS counter bypass or the adaptive filter blocks, so those stay keyed
off v4.1 only.
Add the "qcom,hawi-lpass-rx-macro" and "qcom,hawi-lpass-va-macro"
compatibles, both pointing at the sm8550 match data, so the version is
read back from the hardware at probe.
Signed-off-by: Prasad Kumpatla <prasad.kumpatla@xxxxxxxxxxxxxxxx>
Signed-off-by: Mohammad Rafi Shaik <mohammad.rafi.shaik@xxxxxxxxxxxxxxxx>
---
sound/soc/codecs/lpass-macro-common.h | 3 +++
sound/soc/codecs/lpass-rx-macro.c | 5 +++++
sound/soc/codecs/lpass-va-macro.c | 4 ++++
3 files changed, 12 insertions(+)
diff --git a/sound/soc/codecs/lpass-macro-common.h b/sound/soc/codecs/lpass-macro-common.h
index 707b22a6bda6..a51a6012a7ec 100644
--- a/sound/soc/codecs/lpass-macro-common.h
+++ b/sound/soc/codecs/lpass-macro-common.h
@@ -31,6 +31,7 @@ enum lpass_codec_version {
LPASS_CODEC_VERSION_2_7,
LPASS_CODEC_VERSION_2_8,
LPASS_CODEC_VERSION_2_9,
+ LPASS_CODEC_VERSION_4_0,
LPASS_CODEC_VERSION_4_1,
};
@@ -72,6 +73,8 @@ static inline const char *lpass_macro_get_codec_version_string(int version)
return "v2.8";
case LPASS_CODEC_VERSION_2_9:
return "v2.9";
+ case LPASS_CODEC_VERSION_4_0:
+ return "v4.0";
case LPASS_CODEC_VERSION_4_1:
return "v4.1";
default:
diff --git a/sound/soc/codecs/lpass-rx-macro.c b/sound/soc/codecs/lpass-rx-macro.c
index 93ceee878b78..b7c1eff05ce6 100644
--- a/sound/soc/codecs/lpass-rx-macro.c
+++ b/sound/soc/codecs/lpass-rx-macro.c
@@ -1615,6 +1615,7 @@ static bool rx_is_rw_register(struct device *dev, unsigned int reg)
case LPASS_CODEC_VERSION_2_6:
case LPASS_CODEC_VERSION_2_7:
case LPASS_CODEC_VERSION_2_8:
+ case LPASS_CODEC_VERSION_4_0:
case LPASS_CODEC_VERSION_4_1:
return rx_2_5_is_rw_register(dev, reg);
default:
@@ -3660,6 +3661,7 @@ static int rx_macro_component_probe(struct snd_soc_component *component)
case LPASS_CODEC_VERSION_2_6:
case LPASS_CODEC_VERSION_2_7:
case LPASS_CODEC_VERSION_2_8:
+ case LPASS_CODEC_VERSION_4_0:
case LPASS_CODEC_VERSION_4_1:
controls = rx_macro_2_5_snd_controls;
num_controls = ARRAY_SIZE(rx_macro_2_5_snd_controls);
@@ -3846,6 +3848,7 @@ static int rx_macro_probe(struct platform_device *pdev)
case LPASS_CODEC_VERSION_2_6:
case LPASS_CODEC_VERSION_2_7:
case LPASS_CODEC_VERSION_2_8:
+ case LPASS_CODEC_VERSION_4_0:
case LPASS_CODEC_VERSION_4_1:
rx->rxn_reg_stride = 0xc0;
rx->rxn_reg_stride2 = 0x0;
@@ -3959,6 +3962,8 @@ static const struct of_device_id rx_macro_dt_match[] = {
.data = (void *)LPASS_MACRO_FLAG_HAS_NPL_CLOCK,
}, {
.compatible = "qcom,sm8550-lpass-rx-macro",
+ }, {
+ .compatible = "qcom,hawi-lpass-rx-macro",
}, {
.compatible = "qcom,sc8280xp-lpass-rx-macro",
.data = (void *)LPASS_MACRO_FLAG_HAS_NPL_CLOCK,
diff --git a/sound/soc/codecs/lpass-va-macro.c b/sound/soc/codecs/lpass-va-macro.c
index 79abbdd158b7..46ae627ca594 100644
--- a/sound/soc/codecs/lpass-va-macro.c
+++ b/sound/soc/codecs/lpass-va-macro.c
@@ -1896,6 +1896,9 @@ static int va_macro_set_lpass_codec_version(struct va_macro *va)
}
} else if (maj == 4) {
switch (min) {
+ case 0:
+ version = LPASS_CODEC_VERSION_4_0;
+ break;
case 1:
version = LPASS_CODEC_VERSION_4_1;
break;
@@ -2166,6 +2169,7 @@ static const struct of_device_id va_macro_dt_match[] = {
{ .compatible = "qcom,sm8250-lpass-va-macro", .data = &sm8250_va_data },
{ .compatible = "qcom,sm8450-lpass-va-macro", .data = &sm8450_va_data },
{ .compatible = "qcom,sm8550-lpass-va-macro", .data = &sm8550_va_data },
+ { .compatible = "qcom,hawi-lpass-va-macro", .data = &sm8550_va_data },
{ .compatible = "qcom,sc8280xp-lpass-va-macro", .data = &sm8450_va_data },
{ .compatible = "qcom,shikra-lpass-va-macro", .data = &shikra_va_data },
{}
--
2.34.1