* [PATCH v2 0/6] ASoC: qcom: Add shikra LPASS RX/VA macro support
@ 2026-09-10 9:46 Mohammad Rafi Shaik
2026-09-10 9:46 ` [PATCH v2 1/6] ASoC: dt-bindings: qcom: Add Shikra RX and VA macro compatibles Mohammad Rafi Shaik
` (5 more replies)
0 siblings, 6 replies; 14+ messages in thread
From: Mohammad Rafi Shaik @ 2026-09-10 9:46 UTC (permalink / raw)
To: Srinivas Kandagatla, Liam Girdwood, Mark Brown, Rob Herring,
Krzysztof Kozlowski, Conor Dooley, Jaroslav Kysela, Takashi Iwai
Cc: Mohammad Rafi Shaik, linux-sound, linux-arm-msm, devicetree,
linux-kernel
This series adds support for the Qualcomm Shikra audio platform and
extends VA macro functionality to support SoundWire microphone inputs.
The first part of the series introduces new DT bindings and driver
updates required for LPASS codec version 4.1 used on Shikra, including
RX and VA macro support, version detection enhancements, and associated
register programming changes.
The final patch adds support for routing VA decimators from SoundWire
microphone (SMIC) inputs in addition to existing DMIC sources, allowing
audio capture through SoundWire-connected microphones.
Signed-off-by: Mohammad Rafi Shaik <mohammad.rafi.shaik@oss.qualcomm.com>
---
Changes in v2:
- Updated FS CONTROL and ADPT only for version 4.1, as suggested by Krzysztof.
- Addressed Konrad's review comments from v1 by replacing magic numbers and
lower hex reg values where appropriate.
- Link to v1: https://patch.msgid.link/20260608172023.2965292-1-mohammad.rafi.shaik@oss.qualcomm.com
To: Srinivas Kandagatla <srini@kernel.org>
To: Liam Girdwood <lgirdwood@gmail.com>
To: Mark Brown <broonie@kernel.org>
To: Rob Herring <robh@kernel.org>
To: Krzysztof Kozlowski <krzk+dt@kernel.org>
To: Conor Dooley <conor+dt@kernel.org>
To: Jaroslav Kysela <perex@perex.cz>
To: Takashi Iwai <tiwai@suse.com>
Cc: linux-sound@vger.kernel.org
Cc: linux-arm-msm@vger.kernel.org
Cc: devicetree@vger.kernel.org
Cc: linux-kernel@vger.kernel.org
---
Mohammad Rafi Shaik (6):
ASoC: dt-bindings: qcom: Add Shikra RX and VA macro compatibles
ASoC: qcom: lpass-macro-common: Add missing v2.9 version string
ASoC: qcom: lpass-macro-common: Add LPASS codec version 4.1
ASoC: qcom: lpass-rx-macro: Add shikra compatible
ASoC: qcom: lpass-va-macro: Add shikra compatible
ASoC: qcom: lpass-va-macro: Add SoundWire microphone mux support
.../bindings/sound/qcom,lpass-rx-macro.yaml | 1 +
.../bindings/sound/qcom,lpass-va-macro.yaml | 1 +
sound/soc/codecs/lpass-macro-common.h | 5 +
sound/soc/codecs/lpass-rx-macro.c | 17 +
sound/soc/codecs/lpass-va-macro.c | 352 +++++++++++++++++++--
5 files changed, 358 insertions(+), 18 deletions(-)
---
base-commit: c68a982815dcce5464e3bf2a31ac94f5146c04ca
change-id: 20260910-add_shikra_support-bfe526d82692
Best regards,
--
Mohammad Rafi Shaik <mohammad.rafi.shaik@oss.qualcomm.com>
^ permalink raw reply [flat|nested] 14+ messages in thread
* [PATCH v2 1/6] ASoC: dt-bindings: qcom: Add Shikra RX and VA macro compatibles
2026-09-10 9:46 [PATCH v2 0/6] ASoC: qcom: Add shikra LPASS RX/VA macro support Mohammad Rafi Shaik
@ 2026-09-10 9:46 ` Mohammad Rafi Shaik
2026-09-10 9:53 ` sashiko-bot
2026-09-13 8:48 ` Krzysztof Kozlowski
2026-09-10 9:46 ` [PATCH v2 2/6] ASoC: qcom: lpass-macro-common: Add missing v2.9 version string Mohammad Rafi Shaik
` (4 subsequent siblings)
5 siblings, 2 replies; 14+ messages in thread
From: Mohammad Rafi Shaik @ 2026-09-10 9:46 UTC (permalink / raw)
To: Srinivas Kandagatla, Liam Girdwood, Mark Brown, Rob Herring,
Krzysztof Kozlowski, Conor Dooley, Jaroslav Kysela, Takashi Iwai
Cc: Mohammad Rafi Shaik, linux-sound, linux-arm-msm, devicetree,
linux-kernel
Add bindings for Qualcomm shikra rx and va macro codec.
Shikra integrates LPASS codec version 4.1, which is not backwards
compatible with the already described compatibles.
Signed-off-by: Mohammad Rafi Shaik <mohammad.rafi.shaik@oss.qualcomm.com>
---
Documentation/devicetree/bindings/sound/qcom,lpass-rx-macro.yaml | 1 +
Documentation/devicetree/bindings/sound/qcom,lpass-va-macro.yaml | 1 +
2 files changed, 2 insertions(+)
diff --git a/Documentation/devicetree/bindings/sound/qcom,lpass-rx-macro.yaml b/Documentation/devicetree/bindings/sound/qcom,lpass-rx-macro.yaml
index 4988e7ed6..d2f68b025 100644
--- a/Documentation/devicetree/bindings/sound/qcom,lpass-rx-macro.yaml
+++ b/Documentation/devicetree/bindings/sound/qcom,lpass-rx-macro.yaml
@@ -19,6 +19,7 @@ properties:
- qcom,sm8450-lpass-rx-macro
- qcom,sm8550-lpass-rx-macro
- qcom,sc8280xp-lpass-rx-macro
+ - qcom,shikra-lpass-rx-macro
- items:
- enum:
- qcom,eliza-lpass-rx-macro
diff --git a/Documentation/devicetree/bindings/sound/qcom,lpass-va-macro.yaml b/Documentation/devicetree/bindings/sound/qcom,lpass-va-macro.yaml
index aea31fbda..23f00de82 100644
--- a/Documentation/devicetree/bindings/sound/qcom,lpass-va-macro.yaml
+++ b/Documentation/devicetree/bindings/sound/qcom,lpass-va-macro.yaml
@@ -19,6 +19,7 @@ properties:
- qcom,sm8450-lpass-va-macro
- qcom,sm8550-lpass-va-macro
- qcom,sc8280xp-lpass-va-macro
+ - qcom,shikra-lpass-va-macro
- items:
- enum:
- qcom,eliza-lpass-va-macro
--
2.34.1
^ permalink raw reply related [flat|nested] 14+ messages in thread
* [PATCH v2 2/6] ASoC: qcom: lpass-macro-common: Add missing v2.9 version string
2026-09-10 9:46 [PATCH v2 0/6] ASoC: qcom: Add shikra LPASS RX/VA macro support Mohammad Rafi Shaik
2026-09-10 9:46 ` [PATCH v2 1/6] ASoC: dt-bindings: qcom: Add Shikra RX and VA macro compatibles Mohammad Rafi Shaik
@ 2026-09-10 9:46 ` Mohammad Rafi Shaik
2026-09-10 9:46 ` [PATCH v2 3/6] ASoC: qcom: lpass-macro-common: Add LPASS codec version 4.1 Mohammad Rafi Shaik
` (3 subsequent siblings)
5 siblings, 0 replies; 14+ messages in thread
From: Mohammad Rafi Shaik @ 2026-09-10 9:46 UTC (permalink / raw)
To: Srinivas Kandagatla, Liam Girdwood, Mark Brown, Rob Herring,
Krzysztof Kozlowski, Conor Dooley, Jaroslav Kysela, Takashi Iwai
Cc: Mohammad Rafi Shaik, linux-sound, linux-arm-msm, devicetree,
linux-kernel
LPASS_CODEC_VERSION_2_9 is detected by lpass-va-macro.c and consumed by
lpass-wsa-macro.c, but lpass_macro_get_codec_version_string() never
learned about it, so the probe log reports "LPASS Codec Version NA" on
those parts.
Add the missing case.
Signed-off-by: Mohammad Rafi Shaik <mohammad.rafi.shaik@oss.qualcomm.com>
---
sound/soc/codecs/lpass-macro-common.h | 2 ++
1 file changed, 2 insertions(+)
diff --git a/sound/soc/codecs/lpass-macro-common.h b/sound/soc/codecs/lpass-macro-common.h
index 10ad68201..573b2145e 100644
--- a/sound/soc/codecs/lpass-macro-common.h
+++ b/sound/soc/codecs/lpass-macro-common.h
@@ -68,6 +68,8 @@ static inline const char *lpass_macro_get_codec_version_string(int version)
return "v2.7";
case LPASS_CODEC_VERSION_2_8:
return "v2.8";
+ case LPASS_CODEC_VERSION_2_9:
+ return "v2.9";
default:
break;
}
--
2.34.1
^ permalink raw reply related [flat|nested] 14+ messages in thread
* [PATCH v2 3/6] ASoC: qcom: lpass-macro-common: Add LPASS codec version 4.1
2026-09-10 9:46 [PATCH v2 0/6] ASoC: qcom: Add shikra LPASS RX/VA macro support Mohammad Rafi Shaik
2026-09-10 9:46 ` [PATCH v2 1/6] ASoC: dt-bindings: qcom: Add Shikra RX and VA macro compatibles Mohammad Rafi Shaik
2026-09-10 9:46 ` [PATCH v2 2/6] ASoC: qcom: lpass-macro-common: Add missing v2.9 version string Mohammad Rafi Shaik
@ 2026-09-10 9:46 ` Mohammad Rafi Shaik
2026-09-13 8:46 ` Krzysztof Kozlowski
2026-09-10 9:46 ` [PATCH v2 4/6] ASoC: qcom: lpass-rx-macro: Add shikra compatible Mohammad Rafi Shaik
` (2 subsequent siblings)
5 siblings, 1 reply; 14+ messages in thread
From: Mohammad Rafi Shaik @ 2026-09-10 9:46 UTC (permalink / raw)
To: Srinivas Kandagatla, Liam Girdwood, Mark Brown, Rob Herring,
Krzysztof Kozlowski, Conor Dooley, Jaroslav Kysela, Takashi Iwai
Cc: Mohammad Rafi Shaik, linux-sound, linux-arm-msm, devicetree,
linux-kernel
Shikra integrates LPASS codec version 4.1. Add the new version to the
codec version enum and to the version string helper.
The enum stays ordered by version so that the existing '>=' comparisons
on enum lpass_codec_version keep working.
Signed-off-by: Mohammad Rafi Shaik <mohammad.rafi.shaik@oss.qualcomm.com>
---
sound/soc/codecs/lpass-macro-common.h | 3 +++
1 file changed, 3 insertions(+)
diff --git a/sound/soc/codecs/lpass-macro-common.h b/sound/soc/codecs/lpass-macro-common.h
index 573b2145e..b52665b11 100644
--- a/sound/soc/codecs/lpass-macro-common.h
+++ b/sound/soc/codecs/lpass-macro-common.h
@@ -30,6 +30,7 @@ enum lpass_codec_version {
LPASS_CODEC_VERSION_2_7,
LPASS_CODEC_VERSION_2_8,
LPASS_CODEC_VERSION_2_9,
+ LPASS_CODEC_VERSION_4_1,
};
struct lpass_macro {
@@ -70,6 +71,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_1:
+ return "v4.1";
default:
break;
}
--
2.34.1
^ permalink raw reply related [flat|nested] 14+ messages in thread
* [PATCH v2 4/6] ASoC: qcom: lpass-rx-macro: Add shikra compatible
2026-09-10 9:46 [PATCH v2 0/6] ASoC: qcom: Add shikra LPASS RX/VA macro support Mohammad Rafi Shaik
` (2 preceding siblings ...)
2026-09-10 9:46 ` [PATCH v2 3/6] ASoC: qcom: lpass-macro-common: Add LPASS codec version 4.1 Mohammad Rafi Shaik
@ 2026-09-10 9:46 ` Mohammad Rafi Shaik
2026-09-10 9:59 ` sashiko-bot
2026-09-10 9:46 ` [PATCH v2 5/6] ASoC: qcom: lpass-va-macro: " Mohammad Rafi Shaik
2026-09-10 9:46 ` [PATCH v2 6/6] ASoC: qcom: lpass-va-macro: Add SoundWire microphone mux support Mohammad Rafi Shaik
5 siblings, 1 reply; 14+ messages in thread
From: Mohammad Rafi Shaik @ 2026-09-10 9:46 UTC (permalink / raw)
To: Srinivas Kandagatla, Liam Girdwood, Mark Brown, Rob Herring,
Krzysztof Kozlowski, Conor Dooley, Jaroslav Kysela, Takashi Iwai
Cc: Mohammad Rafi Shaik, linux-sound, linux-arm-msm, devicetree,
linux-kernel
Add shikra RX macro compatible data and hook it into the existing
LPASS codec v4.1 flow.
The RX macro register layout of LPASS codec v4.1 matches the v2.5+
layout, so reuse the existing v2.5 register access helpers, controls
and widgets for it.
v4.1 additionally requires the FS counter to be bypassed before it is
enabled during MCLK enable. This is a property of the codec version and
not of the board, so key it off the version detected by the VA macro
rather than off match data.
Signed-off-by: Mohammad Rafi Shaik <mohammad.rafi.shaik@oss.qualcomm.com>
---
sound/soc/codecs/lpass-rx-macro.c | 17 +++++++++++++++++
1 file changed, 17 insertions(+)
diff --git a/sound/soc/codecs/lpass-rx-macro.c b/sound/soc/codecs/lpass-rx-macro.c
index 2e74ec1a5..83372123c 100644
--- a/sound/soc/codecs/lpass-rx-macro.c
+++ b/sound/soc/codecs/lpass-rx-macro.c
@@ -60,6 +60,7 @@
#define CDC_RX_FS_MCLK_CNT_ENABLE BIT(0)
#define CDC_RX_FS_MCLK_CNT_CLR_MASK BIT(1)
#define CDC_RX_FS_MCLK_CNT_CLR BIT(1)
+#define CDC_RX_FS_CNT_BYPASS BIT(7)
#define CDC_RX_CLK_RST_CTRL_SWR_CONTROL (0x0108)
#define CDC_RX_SWR_CLK_EN_MASK BIT(0)
#define CDC_RX_SWR_RESET_MASK BIT(1)
@@ -1613,6 +1614,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_1:
return rx_2_5_is_rw_register(dev, reg);
default:
break;
@@ -2045,6 +2047,16 @@ static int rx_macro_mclk_enable(struct rx_macro *rx, bool mclk_enable)
CDC_RX_CLK_MCLK2_ENABLE);
regmap_update_bits(regmap, CDC_RX_CLK_RST_CTRL_FS_CNT_CONTROL,
CDC_RX_FS_MCLK_CNT_CLR_MASK, 0x00);
+
+ /*
+ * From LPASS codec v4.1 onwards the FS counter has to be
+ * bypassed before it is enabled, otherwise the fsgen
+ * output does not come up.
+ */
+ if (rx->codec_version >= LPASS_CODEC_VERSION_4_1)
+ regmap_set_bits(regmap, CDC_RX_CLK_RST_CTRL_FS_CNT_CONTROL,
+ CDC_RX_FS_CNT_BYPASS);
+
regmap_update_bits(regmap, CDC_RX_CLK_RST_CTRL_FS_CNT_CONTROL,
CDC_RX_FS_MCLK_CNT_EN_MASK,
CDC_RX_FS_MCLK_CNT_ENABLE);
@@ -3652,6 +3664,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_1:
controls = rx_macro_2_5_snd_controls;
num_controls = ARRAY_SIZE(rx_macro_2_5_snd_controls);
widgets = rx_macro_2_5_dapm_widgets;
@@ -3837,6 +3850,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_1:
rx->rxn_reg_stride = 0xc0;
rx->rxn_reg_stride2 = 0x0;
def_count = ARRAY_SIZE(rx_defaults) + ARRAY_SIZE(rx_2_5_defaults);
@@ -3949,6 +3963,9 @@ static const struct of_device_id rx_macro_dt_match[] = {
}, {
.compatible = "qcom,sc8280xp-lpass-rx-macro",
.data = (void *)LPASS_MACRO_FLAG_HAS_NPL_CLOCK,
+ }, {
+ .compatible = "qcom,shikra-lpass-rx-macro",
+ .data = (void *)LPASS_MACRO_FLAG_HAS_NPL_CLOCK,
},
{ }
};
--
2.34.1
^ permalink raw reply related [flat|nested] 14+ messages in thread
* [PATCH v2 5/6] ASoC: qcom: lpass-va-macro: Add shikra compatible
2026-09-10 9:46 [PATCH v2 0/6] ASoC: qcom: Add shikra LPASS RX/VA macro support Mohammad Rafi Shaik
` (3 preceding siblings ...)
2026-09-10 9:46 ` [PATCH v2 4/6] ASoC: qcom: lpass-rx-macro: Add shikra compatible Mohammad Rafi Shaik
@ 2026-09-10 9:46 ` Mohammad Rafi Shaik
2026-09-10 10:03 ` sashiko-bot
2026-09-10 9:46 ` [PATCH v2 6/6] ASoC: qcom: lpass-va-macro: Add SoundWire microphone mux support Mohammad Rafi Shaik
5 siblings, 1 reply; 14+ messages in thread
From: Mohammad Rafi Shaik @ 2026-09-10 9:46 UTC (permalink / raw)
To: Srinivas Kandagatla, Liam Girdwood, Mark Brown, Rob Herring,
Krzysztof Kozlowski, Conor Dooley, Jaroslav Kysela, Takashi Iwai
Cc: Mohammad Rafi Shaik, linux-sound, linux-arm-msm, devicetree,
linux-kernel
Add shikra specific VA macro data and register programming needed by
the LPASS codec v4.0 implementation.
LPASS codec v4.1 extends the VA macro with four adaptive filter (ADPT)
blocks at 0x0800..0x09a4 and requires the FS counter to be bypassed
before it is enabled.
Add the new registers as a separate reg_default array that is
concatenated with the common defaults at probe time.
The register layout has to be chosen before the regmap exists, i.e.
before CDC_VA_TOP_CSR_CORE_ID_* can be read, so it comes from match data;
probe then cross checks it against the version reported by the hardware.
Signed-off-by: Mohammad Rafi Shaik <mohammad.rafi.shaik@oss.qualcomm.com>
---
sound/soc/codecs/lpass-va-macro.c | 228 ++++++++++++++++++++++++++++++++++++--
1 file changed, 221 insertions(+), 7 deletions(-)
diff --git a/sound/soc/codecs/lpass-va-macro.c b/sound/soc/codecs/lpass-va-macro.c
index a3b3af0d7..8353921f7 100644
--- a/sound/soc/codecs/lpass-va-macro.c
+++ b/sound/soc/codecs/lpass-va-macro.c
@@ -26,6 +26,7 @@
#define CDC_VA_CLK_RST_CTRL_FS_CNT_CONTROL (0x0004)
#define CDC_VA_FS_CONTROL_EN BIT(0)
#define CDC_VA_FS_COUNTER_CLR BIT(1)
+#define CDC_VA_FS_CNT_BYPASS BIT(7)
#define CDC_VA_CLK_RST_CTRL_SWR_CONTROL (0x0008)
#define CDC_VA_SWR_RESET_MASK BIT(1)
#define CDC_VA_SWR_RESET_ENABLE BIT(1)
@@ -156,7 +157,54 @@
#define CDC_VA_TX3_TX_PATH_SEC5 (0x05A4)
#define CDC_VA_TX3_TX_PATH_SEC6 (0x05A8)
+/* LPASS codec v4.1 adaptive filter (ADPT) blocks */
+#define CDC_VA_CDC_ADPT0_ADPT_CTRL 0x0800
+#define CDC_VA_ADPT_CTRL_EN_MASK GENMASK(7, 0)
+#define CDC_VA_CDC_ADPT0_ADPT_GAIN_0 0x0804
+#define CDC_VA_CDC_ADPT0_ADPT_GAIN_1 0x0808
+#define CDC_VA_CDC_ADPT0_DH_FSM_CTRL 0x080c
+#define CDC_VA_CDC_ADPT0_CUTOFF_FSM_CTRL_0 0x0810
+#define CDC_VA_CDC_ADPT0_CUTOFF_FSM_CTRL_1 0x0814
+#define CDC_VA_CDC_ADPT0_CUTOFF_FSM_CTRL_2 0x0818
+#define CDC_VA_CDC_ADPT0_CUTOFF_FSM_CTRL_3 0x081c
+#define CDC_VA_CDC_ADPT0_CUTOFF_FSM_CTRL_4 0x0820
+#define CDC_VA_CDC_ADPT0_CUTOFF_FSM_CTRL_5 0x0824
+
+#define CDC_VA_CDC_ADPT1_ADPT_CTRL 0x0880
+#define CDC_VA_CDC_ADPT1_ADPT_GAIN_0 0x0884
+#define CDC_VA_CDC_ADPT1_ADPT_GAIN_1 0x0888
+#define CDC_VA_CDC_ADPT1_DH_FSM_CTRL 0x088c
+#define CDC_VA_CDC_ADPT1_CUTOFF_FSM_CTRL_0 0x0890
+#define CDC_VA_CDC_ADPT1_CUTOFF_FSM_CTRL_1 0x0894
+#define CDC_VA_CDC_ADPT1_CUTOFF_FSM_CTRL_2 0x0898
+#define CDC_VA_CDC_ADPT1_CUTOFF_FSM_CTRL_3 0x089c
+#define CDC_VA_CDC_ADPT1_CUTOFF_FSM_CTRL_4 0x08a0
+#define CDC_VA_CDC_ADPT1_CUTOFF_FSM_CTRL_5 0x08a4
+
+#define CDC_VA_CDC_ADPT2_ADPT_CTRL 0x0900
+#define CDC_VA_CDC_ADPT2_ADPT_GAIN_0 0x0904
+#define CDC_VA_CDC_ADPT2_ADPT_GAIN_1 0x0908
+#define CDC_VA_CDC_ADPT2_DH_FSM_CTRL 0x090c
+#define CDC_VA_CDC_ADPT2_CUTOFF_FSM_CTRL_0 0x0910
+#define CDC_VA_CDC_ADPT2_CUTOFF_FSM_CTRL_1 0x0914
+#define CDC_VA_CDC_ADPT2_CUTOFF_FSM_CTRL_2 0x0918
+#define CDC_VA_CDC_ADPT2_CUTOFF_FSM_CTRL_3 0x091c
+#define CDC_VA_CDC_ADPT2_CUTOFF_FSM_CTRL_4 0x0920
+#define CDC_VA_CDC_ADPT2_CUTOFF_FSM_CTRL_5 0x0924
+
+#define CDC_VA_CDC_ADPT3_ADPT_CTRL 0x0980
+#define CDC_VA_CDC_ADPT3_ADPT_GAIN_0 0x0984
+#define CDC_VA_CDC_ADPT3_ADPT_GAIN_1 0x0988
+#define CDC_VA_CDC_ADPT3_DH_FSM_CTRL 0x098c
+#define CDC_VA_CDC_ADPT3_CUTOFF_FSM_CTRL_0 0x0990
+#define CDC_VA_CDC_ADPT3_CUTOFF_FSM_CTRL_1 0x0994
+#define CDC_VA_CDC_ADPT3_CUTOFF_FSM_CTRL_2 0x0998
+#define CDC_VA_CDC_ADPT3_CUTOFF_FSM_CTRL_3 0x099c
+#define CDC_VA_CDC_ADPT3_CUTOFF_FSM_CTRL_4 0x09a0
+#define CDC_VA_CDC_ADPT3_CUTOFF_FSM_CTRL_5 0x09a4
+
#define VA_MAX_OFFSET (0x07A8)
+#define VA_4_1_MAX_OFFSET 0x09a4
#define VA_MACRO_NUM_DECIMATORS 4
#define VA_MACRO_RATES (SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 |\
@@ -210,7 +258,6 @@ struct va_macro {
u16 dmic_clk_div;
bool has_swr_master;
bool has_npl_clk;
-
int dec_mode[VA_MACRO_NUM_DECIMATORS];
struct regmap *regmap;
struct clk *mclk;
@@ -237,6 +284,7 @@ struct va_macro_data {
bool has_swr_master;
bool has_npl_clk;
int version;
+ const struct regmap_config *regmap_config;
};
static const struct va_macro_data sm8250_va_data = {
@@ -357,6 +405,127 @@ static const struct reg_default va_defaults[] = {
{ CDC_VA_TX3_TX_PATH_SEC6, 0x00},
};
+static const struct reg_default va_4_1_defaults[] = {
+ /* VA macro */
+ { CDC_VA_CLK_RST_CTRL_MCLK_CONTROL, 0x00},
+ { CDC_VA_CLK_RST_CTRL_FS_CNT_CONTROL, 0x00},
+ { CDC_VA_CLK_RST_CTRL_SWR_CONTROL, 0x00},
+ { CDC_VA_TOP_CSR_TOP_CFG0, 0x00},
+ { CDC_VA_TOP_CSR_DMIC0_CTL, 0x00},
+ { CDC_VA_TOP_CSR_DMIC1_CTL, 0x00},
+ { CDC_VA_TOP_CSR_DMIC2_CTL, 0x00},
+ { CDC_VA_TOP_CSR_DMIC3_CTL, 0x00},
+ { CDC_VA_TOP_CSR_DMIC_CFG, 0x80},
+ { CDC_VA_TOP_CSR_DEBUG_BUS, 0x00},
+ { CDC_VA_TOP_CSR_DEBUG_EN, 0x00},
+ { CDC_VA_TOP_CSR_TX_I2S_CTL, 0x0C},
+ { CDC_VA_TOP_CSR_I2S_CLK, 0x00},
+ { CDC_VA_TOP_CSR_I2S_RESET, 0x00},
+ { CDC_VA_TOP_CSR_CORE_ID_0, 0x00},
+ { CDC_VA_TOP_CSR_CORE_ID_1, 0x00},
+ { CDC_VA_TOP_CSR_CORE_ID_2, 0x00},
+ { CDC_VA_TOP_CSR_CORE_ID_3, 0x00},
+ { CDC_VA_TOP_CSR_SWR_MIC_CTL0, 0xEE},
+ { CDC_VA_TOP_CSR_SWR_MIC_CTL1, 0xEE},
+ { CDC_VA_TOP_CSR_SWR_MIC_CTL2, 0xEE},
+ { CDC_VA_TOP_CSR_SWR_CTRL, 0x06},
+ /* VA core */
+ { CDC_VA_INP_MUX_ADC_MUX0_CFG0, 0x00},
+ { CDC_VA_INP_MUX_ADC_MUX0_CFG1, 0x00},
+ { CDC_VA_INP_MUX_ADC_MUX1_CFG0, 0x00},
+ { CDC_VA_INP_MUX_ADC_MUX1_CFG1, 0x00},
+ { CDC_VA_INP_MUX_ADC_MUX2_CFG0, 0x00},
+ { CDC_VA_INP_MUX_ADC_MUX2_CFG1, 0x00},
+ { CDC_VA_INP_MUX_ADC_MUX3_CFG0, 0x00},
+ { CDC_VA_INP_MUX_ADC_MUX3_CFG1, 0x00},
+ { CDC_VA_TX0_TX_PATH_CTL, 0x04},
+ { CDC_VA_TX0_TX_PATH_CFG0, 0x10},
+ { CDC_VA_TX0_TX_PATH_CFG1, 0x0B},
+ { CDC_VA_TX0_TX_VOL_CTL, 0x00},
+ { CDC_VA_TX0_TX_PATH_SEC0, 0x00},
+ { CDC_VA_TX0_TX_PATH_SEC1, 0x00},
+ { CDC_VA_TX0_TX_PATH_SEC2, 0x01},
+ { CDC_VA_TX0_TX_PATH_SEC3, 0x3C},
+ { CDC_VA_TX0_TX_PATH_SEC4, 0x20},
+ { CDC_VA_TX0_TX_PATH_SEC5, 0x00},
+ { CDC_VA_TX0_TX_PATH_SEC6, 0x00},
+ { CDC_VA_TX0_TX_PATH_SEC7, 0x25},
+ { CDC_VA_TX1_TX_PATH_CTL, 0x04},
+ { CDC_VA_TX1_TX_PATH_CFG0, 0x10},
+ { CDC_VA_TX1_TX_PATH_CFG1, 0x0B},
+ { CDC_VA_TX1_TX_VOL_CTL, 0x00},
+ { CDC_VA_TX1_TX_PATH_SEC0, 0x00},
+ { CDC_VA_TX1_TX_PATH_SEC1, 0x00},
+ { CDC_VA_TX1_TX_PATH_SEC2, 0x01},
+ { CDC_VA_TX1_TX_PATH_SEC3, 0x3C},
+ { CDC_VA_TX1_TX_PATH_SEC4, 0x20},
+ { CDC_VA_TX1_TX_PATH_SEC5, 0x00},
+ { CDC_VA_TX1_TX_PATH_SEC6, 0x00},
+ { CDC_VA_TX2_TX_PATH_CTL, 0x04},
+ { CDC_VA_TX2_TX_PATH_CFG0, 0x10},
+ { CDC_VA_TX2_TX_PATH_CFG1, 0x0B},
+ { CDC_VA_TX2_TX_VOL_CTL, 0x00},
+ { CDC_VA_TX2_TX_PATH_SEC0, 0x00},
+ { CDC_VA_TX2_TX_PATH_SEC1, 0x00},
+ { CDC_VA_TX2_TX_PATH_SEC2, 0x01},
+ { CDC_VA_TX2_TX_PATH_SEC3, 0x3C},
+ { CDC_VA_TX2_TX_PATH_SEC4, 0x20},
+ { CDC_VA_TX2_TX_PATH_SEC5, 0x00},
+ { CDC_VA_TX2_TX_PATH_SEC6, 0x00},
+ { CDC_VA_TX3_TX_PATH_CTL, 0x04},
+ { CDC_VA_TX3_TX_PATH_CFG0, 0x10},
+ { CDC_VA_TX3_TX_PATH_CFG1, 0x0B},
+ { CDC_VA_TX3_TX_VOL_CTL, 0x00},
+ { CDC_VA_TX3_TX_PATH_SEC0, 0x00},
+ { CDC_VA_TX3_TX_PATH_SEC1, 0x00},
+ { CDC_VA_TX3_TX_PATH_SEC2, 0x01},
+ { CDC_VA_TX3_TX_PATH_SEC3, 0x3C},
+ { CDC_VA_TX3_TX_PATH_SEC4, 0x20},
+ { CDC_VA_TX3_TX_PATH_SEC5, 0x00},
+ { CDC_VA_TX3_TX_PATH_SEC6, 0x00},
+ /* ADPT blocks */
+ { CDC_VA_CDC_ADPT0_ADPT_CTRL, 0x51},
+ { CDC_VA_CDC_ADPT0_ADPT_GAIN_0, 0x11},
+ { CDC_VA_CDC_ADPT0_ADPT_GAIN_1, 0x01},
+ { CDC_VA_CDC_ADPT0_DH_FSM_CTRL, 0x02},
+ { CDC_VA_CDC_ADPT0_CUTOFF_FSM_CTRL_0, 0x77},
+ { CDC_VA_CDC_ADPT0_CUTOFF_FSM_CTRL_1, 0x64},
+ { CDC_VA_CDC_ADPT0_CUTOFF_FSM_CTRL_2, 0x00},
+ { CDC_VA_CDC_ADPT0_CUTOFF_FSM_CTRL_3, 0x41},
+ { CDC_VA_CDC_ADPT0_CUTOFF_FSM_CTRL_4, 0x04},
+ { CDC_VA_CDC_ADPT0_CUTOFF_FSM_CTRL_5, 0x01},
+ { CDC_VA_CDC_ADPT1_ADPT_CTRL, 0x51},
+ { CDC_VA_CDC_ADPT1_ADPT_GAIN_0, 0x11},
+ { CDC_VA_CDC_ADPT1_ADPT_GAIN_1, 0x01},
+ { CDC_VA_CDC_ADPT1_DH_FSM_CTRL, 0x02},
+ { CDC_VA_CDC_ADPT1_CUTOFF_FSM_CTRL_0, 0x77},
+ { CDC_VA_CDC_ADPT1_CUTOFF_FSM_CTRL_1, 0x64},
+ { CDC_VA_CDC_ADPT1_CUTOFF_FSM_CTRL_2, 0x00},
+ { CDC_VA_CDC_ADPT1_CUTOFF_FSM_CTRL_3, 0x41},
+ { CDC_VA_CDC_ADPT1_CUTOFF_FSM_CTRL_4, 0x04},
+ { CDC_VA_CDC_ADPT1_CUTOFF_FSM_CTRL_5, 0x01},
+ { CDC_VA_CDC_ADPT2_ADPT_CTRL, 0x51},
+ { CDC_VA_CDC_ADPT2_ADPT_GAIN_0, 0x11},
+ { CDC_VA_CDC_ADPT2_ADPT_GAIN_1, 0x01},
+ { CDC_VA_CDC_ADPT2_DH_FSM_CTRL, 0x02},
+ { CDC_VA_CDC_ADPT2_CUTOFF_FSM_CTRL_0, 0x77},
+ { CDC_VA_CDC_ADPT2_CUTOFF_FSM_CTRL_1, 0x64},
+ { CDC_VA_CDC_ADPT2_CUTOFF_FSM_CTRL_2, 0x00},
+ { CDC_VA_CDC_ADPT2_CUTOFF_FSM_CTRL_3, 0x41},
+ { CDC_VA_CDC_ADPT2_CUTOFF_FSM_CTRL_4, 0x04},
+ { CDC_VA_CDC_ADPT2_CUTOFF_FSM_CTRL_5, 0x01},
+ { CDC_VA_CDC_ADPT3_ADPT_CTRL, 0x51},
+ { CDC_VA_CDC_ADPT3_ADPT_GAIN_0, 0x11},
+ { CDC_VA_CDC_ADPT3_ADPT_GAIN_1, 0x01},
+ { CDC_VA_CDC_ADPT3_DH_FSM_CTRL, 0x02},
+ { CDC_VA_CDC_ADPT3_CUTOFF_FSM_CTRL_0, 0x77},
+ { CDC_VA_CDC_ADPT3_CUTOFF_FSM_CTRL_1, 0x64},
+ { CDC_VA_CDC_ADPT3_CUTOFF_FSM_CTRL_2, 0x00},
+ { CDC_VA_CDC_ADPT3_CUTOFF_FSM_CTRL_3, 0x41},
+ { CDC_VA_CDC_ADPT3_CUTOFF_FSM_CTRL_4, 0x04},
+ { CDC_VA_CDC_ADPT3_CUTOFF_FSM_CTRL_5, 0x01},
+};
+
static bool va_is_rw_register(struct device *dev, unsigned int reg)
{
switch (reg) {
@@ -430,6 +599,10 @@ static bool va_is_rw_register(struct device *dev, unsigned int reg)
case CDC_VA_TX3_TX_PATH_SEC4:
case CDC_VA_TX3_TX_PATH_SEC5:
case CDC_VA_TX3_TX_PATH_SEC6:
+ case CDC_VA_CDC_ADPT0_ADPT_CTRL:
+ case CDC_VA_CDC_ADPT1_ADPT_CTRL:
+ case CDC_VA_CDC_ADPT2_ADPT_CTRL:
+ case CDC_VA_CDC_ADPT3_ADPT_CTRL:
return true;
}
@@ -463,6 +636,27 @@ static const struct regmap_config va_regmap_config = {
.writeable_reg = va_is_rw_register,
};
+static const struct regmap_config va_4_1_regmap_config = {
+ .name = "va_macro",
+ .reg_bits = 32,
+ .val_bits = 32,
+ .reg_stride = 4,
+ .cache_type = REGCACHE_FLAT,
+ .reg_defaults = va_4_1_defaults,
+ .num_reg_defaults = ARRAY_SIZE(va_4_1_defaults),
+ .max_register = VA_4_1_MAX_OFFSET,
+ .volatile_reg = va_is_volatile_register,
+ .readable_reg = va_is_readable_register,
+ .writeable_reg = va_is_rw_register,
+};
+
+static const struct va_macro_data shikra_va_data = {
+ .has_swr_master = true,
+ .has_npl_clk = true,
+ .version = LPASS_CODEC_VERSION_4_1,
+ .regmap_config = &va_4_1_regmap_config,
+};
+
static int va_clk_rsc_fs_gen_request(struct va_macro *va, bool enable)
{
struct regmap *regmap = va->regmap;
@@ -471,10 +665,14 @@ static int va_clk_rsc_fs_gen_request(struct va_macro *va, bool enable)
regmap_update_bits(regmap, CDC_VA_CLK_RST_CTRL_MCLK_CONTROL,
CDC_VA_MCLK_CONTROL_EN,
CDC_VA_MCLK_CONTROL_EN);
- /* clear the fs counter */
+
regmap_update_bits(regmap, CDC_VA_CLK_RST_CTRL_FS_CNT_CONTROL,
CDC_VA_FS_CONTROL_EN | CDC_VA_FS_COUNTER_CLR,
CDC_VA_FS_CONTROL_EN | CDC_VA_FS_COUNTER_CLR);
+
+ if (lpass_macro_get_codec_version() >= LPASS_CODEC_VERSION_4_1)
+ regmap_set_bits(regmap, CDC_VA_CLK_RST_CTRL_FS_CNT_CONTROL,
+ CDC_VA_FS_CNT_BYPASS);
regmap_update_bits(regmap, CDC_VA_CLK_RST_CTRL_FS_CNT_CONTROL,
CDC_VA_FS_CONTROL_EN | CDC_VA_FS_COUNTER_CLR,
CDC_VA_FS_CONTROL_EN);
@@ -503,7 +701,7 @@ static int va_macro_mclk_enable(struct va_macro *va, bool mclk_enable)
if (mclk_enable) {
va_clk_rsc_fs_gen_request(va, true);
regcache_mark_dirty(regmap);
- regcache_sync_region(regmap, 0x0, VA_MAX_OFFSET);
+ regcache_sync_region(regmap, 0x0, regmap_get_max_register(regmap));
} else {
va_clk_rsc_fs_gen_request(va, false);
}
@@ -749,6 +947,7 @@ static int va_macro_enable_dec(struct snd_soc_dapm_widget *w,
unsigned int decimator;
u16 tx_vol_ctl_reg, dec_cfg_reg, hpf_gate_reg;
u16 tx_gain_ctl_reg;
+ u16 adpt_ctrl_reg;
u8 hpf_cut_off_freq;
struct va_macro *va = snd_soc_component_get_drvdata(comp);
@@ -763,6 +962,7 @@ static int va_macro_enable_dec(struct snd_soc_dapm_widget *w,
VA_MACRO_TX_PATH_OFFSET * decimator;
tx_gain_ctl_reg = CDC_VA_TX0_TX_VOL_CTL +
VA_MACRO_TX_PATH_OFFSET * decimator;
+ adpt_ctrl_reg = CDC_VA_CDC_ADPT0_ADPT_CTRL + decimator * VA_MACRO_TX_PATH_OFFSET;
switch (event) {
case SND_SOC_DAPM_PRE_PMU:
@@ -772,6 +972,10 @@ static int va_macro_enable_dec(struct snd_soc_dapm_widget *w,
/* Enable TX PGA Mute */
break;
case SND_SOC_DAPM_POST_PMU:
+ if (lpass_macro_get_codec_version() >= LPASS_CODEC_VERSION_4_1)
+ snd_soc_component_update_bits(comp, adpt_ctrl_reg,
+ CDC_VA_ADPT_CTRL_EN_MASK, 0x00);
+
/* Enable TX CLK */
snd_soc_component_update_bits(comp, tx_vol_ctl_reg,
CDC_VA_TX_PATH_CLK_EN_MASK,
@@ -1526,6 +1730,14 @@ static int va_macro_set_lpass_codec_version(struct va_macro *va)
default:
break;
}
+ } else if (maj == 4) {
+ switch (min) {
+ case 1:
+ version = LPASS_CODEC_VERSION_4_1;
+ break;
+ default:
+ break;
+ }
}
if (version == LPASS_CODEC_VERSION_UNKNOWN) {
@@ -1556,6 +1768,7 @@ static int va_macro_probe(struct platform_device *pdev)
return -ENOMEM;
va->dev = dev;
+ data = of_device_get_match_data(dev);
va->macro = devm_clk_get_optional(dev, "macro");
if (IS_ERR(va->macro))
@@ -1592,15 +1805,15 @@ static int va_macro_probe(struct platform_device *pdev)
goto err;
}
- va->regmap = devm_regmap_init_mmio(dev, base, &va_regmap_config);
+ dev_set_drvdata(dev, va);
+
+ va->regmap = devm_regmap_init_mmio(dev, base,
+ data->regmap_config ?: &va_regmap_config);
if (IS_ERR(va->regmap)) {
ret = -EINVAL;
goto err;
}
- dev_set_drvdata(dev, va);
-
- data = of_device_get_match_data(dev);
va->has_swr_master = data->has_swr_master;
va->has_npl_clk = data->has_npl_clk;
@@ -1775,6 +1988,7 @@ static const struct of_device_id va_macro_dt_match[] = {
{ .compatible = "qcom,sm8450-lpass-va-macro", .data = &sm8450_va_data },
{ .compatible = "qcom,sm8550-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 },
{}
};
MODULE_DEVICE_TABLE(of, va_macro_dt_match);
--
2.34.1
^ permalink raw reply related [flat|nested] 14+ messages in thread
* [PATCH v2 6/6] ASoC: qcom: lpass-va-macro: Add SoundWire microphone mux support
2026-09-10 9:46 [PATCH v2 0/6] ASoC: qcom: Add shikra LPASS RX/VA macro support Mohammad Rafi Shaik
` (4 preceding siblings ...)
2026-09-10 9:46 ` [PATCH v2 5/6] ASoC: qcom: lpass-va-macro: " Mohammad Rafi Shaik
@ 2026-09-10 9:46 ` Mohammad Rafi Shaik
2026-09-10 10:00 ` sashiko-bot
5 siblings, 1 reply; 14+ messages in thread
From: Mohammad Rafi Shaik @ 2026-09-10 9:46 UTC (permalink / raw)
To: Srinivas Kandagatla, Liam Girdwood, Mark Brown, Rob Herring,
Krzysztof Kozlowski, Conor Dooley, Jaroslav Kysela, Takashi Iwai
Cc: Mohammad Rafi Shaik, linux-sound, linux-arm-msm, devicetree,
linux-kernel
The VA decimators can currently capture audio only from DMIC inputs.
Add support for routing audio from SoundWire microphone (SMIC) inputs
as well.
Update the decimator source selection logic to switch between DMIC and
SMIC sources based on the active input path.
Add a helper to detect whether a decimator is using a SoundWire microphone
input. Use this information to skip DMIC-specific HPF programming sequences
when the decimator is configured for an SMIC source.
This enables VA decimators to capture audio from either DMIC or SoundWire
microphone inputs.
Signed-off-by: Mohammad Rafi Shaik <mohammad.rafi.shaik@oss.qualcomm.com>
---
sound/soc/codecs/lpass-va-macro.c | 124 ++++++++++++++++++++++++++++++++++----
1 file changed, 113 insertions(+), 11 deletions(-)
diff --git a/sound/soc/codecs/lpass-va-macro.c b/sound/soc/codecs/lpass-va-macro.c
index 8353921f7..46f35a984 100644
--- a/sound/soc/codecs/lpass-va-macro.c
+++ b/sound/soc/codecs/lpass-va-macro.c
@@ -249,6 +249,7 @@ enum {
VA_MACRO_CLK_DIV_16,
};
+
#define VA_NUM_CLKS_MAX 3
struct va_macro {
@@ -756,10 +757,16 @@ static int va_macro_put_dec_enum(struct snd_kcontrol *kcontrol,
return -EINVAL;
}
- if (val != 0)
- snd_soc_component_update_bits(component, mic_sel_reg,
+ if (val != 0) {
+ if (strstr(widget->name, "SMIC"))
+ snd_soc_component_update_bits(component, mic_sel_reg,
+ CDC_VA_TX_PATH_ADC_DMIC_SEL_MASK,
+ CDC_VA_TX_PATH_ADC_DMIC_SEL_ADC);
+ else
+ snd_soc_component_update_bits(component, mic_sel_reg,
CDC_VA_TX_PATH_ADC_DMIC_SEL_MASK,
CDC_VA_TX_PATH_ADC_DMIC_SEL_DMIC);
+ }
return snd_soc_dapm_put_enum_double(kcontrol, ucontrol);
}
@@ -940,6 +947,16 @@ static int va_macro_enable_dmic(struct snd_soc_dapm_widget *w,
return 0;
}
+static bool is_amic_enabled(struct snd_soc_component *comp, int decimator)
+{
+ u16 adc_mux_reg;
+
+ adc_mux_reg = CDC_VA_INP_MUX_ADC_MUX0_CFG1 +
+ VA_MACRO_ADC_MUX_CFG_OFFSET * decimator;
+
+ return snd_soc_component_read(comp, adc_mux_reg) & BIT(0);
+}
+
static int va_macro_enable_dec(struct snd_soc_dapm_widget *w,
struct snd_kcontrol *kcontrol, int event)
{
@@ -949,7 +966,6 @@ static int va_macro_enable_dec(struct snd_soc_dapm_widget *w,
u16 tx_gain_ctl_reg;
u16 adpt_ctrl_reg;
u8 hpf_cut_off_freq;
-
struct va_macro *va = snd_soc_component_get_drvdata(comp);
decimator = w->shift;
@@ -980,7 +996,8 @@ static int va_macro_enable_dec(struct snd_soc_dapm_widget *w,
snd_soc_component_update_bits(comp, tx_vol_ctl_reg,
CDC_VA_TX_PATH_CLK_EN_MASK,
CDC_VA_TX_PATH_CLK_EN);
- snd_soc_component_update_bits(comp, hpf_gate_reg,
+ if (!is_amic_enabled(comp, decimator))
+ snd_soc_component_update_bits(comp, hpf_gate_reg,
CDC_VA_TX_HPF_ZERO_GATE_MASK,
CDC_VA_TX_HPF_ZERO_GATE);
@@ -994,21 +1011,20 @@ static int va_macro_enable_dec(struct snd_soc_dapm_widget *w,
CF_MIN_3DB_150HZ << 5);
snd_soc_component_update_bits(comp, hpf_gate_reg,
- CDC_VA_TX_HPF_CUTOFF_FREQ_CHANGE_MASK,
- CDC_VA_TX_HPF_CUTOFF_FREQ_CHANGE_REQ);
+ CDC_VA_TX_HPF_CUTOFF_FREQ_CHANGE_MASK,
+ CDC_VA_TX_HPF_CUTOFF_FREQ_CHANGE_REQ);
/*
* Minimum 1 clk cycle delay is required as per HW spec
*/
usleep_range(1000, 1010);
- snd_soc_component_update_bits(comp,
- hpf_gate_reg,
- CDC_VA_TX_HPF_CUTOFF_FREQ_CHANGE_MASK,
- 0x0);
+ if (!is_amic_enabled(comp, decimator))
+ snd_soc_component_update_bits(comp, hpf_gate_reg,
+ CDC_VA_TX_HPF_CUTOFF_FREQ_CHANGE_MASK,
+ 0x0);
}
-
usleep_range(1000, 1010);
snd_soc_component_update_bits(comp, hpf_gate_reg,
CDC_VA_TX_HPF_ZERO_GATE_MASK,
@@ -1208,6 +1224,39 @@ static const char * const adc_mux_text[] = {
"VA_DMIC", "SWR_MIC"
};
+static const char * const smic_mux_text[] = {
+ "ZERO", "SWR_MIC0", "SWR_MIC1", "SWR_MIC2", "SWR_MIC3",
+ "SWR_MIC4", "SWR_MIC5", "SWR_MIC6", "SWR_MIC7"
+};
+
+static SOC_ENUM_SINGLE_DECL(va_smic0_enum, CDC_VA_INP_MUX_ADC_MUX0_CFG0,
+ 0, smic_mux_text);
+
+static SOC_ENUM_SINGLE_DECL(va_smic1_enum, CDC_VA_INP_MUX_ADC_MUX1_CFG0,
+ 0, smic_mux_text);
+
+static SOC_ENUM_SINGLE_DECL(va_smic2_enum, CDC_VA_INP_MUX_ADC_MUX2_CFG0,
+ 0, smic_mux_text);
+
+static SOC_ENUM_SINGLE_DECL(va_smic3_enum, CDC_VA_INP_MUX_ADC_MUX3_CFG0,
+ 0, smic_mux_text);
+
+static const struct snd_kcontrol_new va_smic0_mux = SOC_DAPM_ENUM_EXT("va_smic0",
+ va_smic0_enum, snd_soc_dapm_get_enum_double,
+ va_macro_put_dec_enum);
+
+static const struct snd_kcontrol_new va_smic1_mux = SOC_DAPM_ENUM_EXT("va_smic1",
+ va_smic1_enum, snd_soc_dapm_get_enum_double,
+ va_macro_put_dec_enum);
+
+static const struct snd_kcontrol_new va_smic2_mux = SOC_DAPM_ENUM_EXT("va_smic2",
+ va_smic2_enum, snd_soc_dapm_get_enum_double,
+ va_macro_put_dec_enum);
+
+static const struct snd_kcontrol_new va_smic3_mux = SOC_DAPM_ENUM_EXT("va_smic3",
+ va_smic3_enum, snd_soc_dapm_get_enum_double,
+ va_macro_put_dec_enum);
+
static SOC_ENUM_SINGLE_DECL(va_dec0_enum, CDC_VA_INP_MUX_ADC_MUX0_CFG1,
0, adc_mux_text);
static SOC_ENUM_SINGLE_DECL(va_dec1_enum, CDC_VA_INP_MUX_ADC_MUX1_CFG1,
@@ -1343,6 +1392,11 @@ static const struct snd_soc_dapm_widget va_macro_dapm_widgets[] = {
SND_SOC_DAPM_MUX("VA DMIC MUX2", SND_SOC_NOPM, 0, 0, &va_dmic2_mux),
SND_SOC_DAPM_MUX("VA DMIC MUX3", SND_SOC_NOPM, 0, 0, &va_dmic3_mux),
+ SND_SOC_DAPM_MUX("VA SMIC MUX0", SND_SOC_NOPM, 0, 0, &va_smic0_mux),
+ SND_SOC_DAPM_MUX("VA SMIC MUX1", SND_SOC_NOPM, 0, 0, &va_smic1_mux),
+ SND_SOC_DAPM_MUX("VA SMIC MUX2", SND_SOC_NOPM, 0, 0, &va_smic2_mux),
+ SND_SOC_DAPM_MUX("VA SMIC MUX3", SND_SOC_NOPM, 0, 0, &va_smic3_mux),
+
SND_SOC_DAPM_REGULATOR_SUPPLY("vdd-micb", 0, 0),
SND_SOC_DAPM_INPUT("DMIC0 Pin"),
SND_SOC_DAPM_INPUT("DMIC1 Pin"),
@@ -1397,6 +1451,14 @@ static const struct snd_soc_dapm_widget va_macro_dapm_widgets[] = {
SND_SOC_DAPM_INPUT("VA SWR_MIC5"),
SND_SOC_DAPM_INPUT("VA SWR_MIC6"),
SND_SOC_DAPM_INPUT("VA SWR_MIC7"),
+ SND_SOC_DAPM_INPUT("VA SWR_INPUT0"),
+ SND_SOC_DAPM_INPUT("VA SWR_INPUT1"),
+ SND_SOC_DAPM_INPUT("VA SWR_INPUT2"),
+ SND_SOC_DAPM_INPUT("VA SWR_INPUT3"),
+ SND_SOC_DAPM_INPUT("VA SWR_INPUT4"),
+ SND_SOC_DAPM_INPUT("VA SWR_INPUT5"),
+ SND_SOC_DAPM_INPUT("VA SWR_INPUT6"),
+ SND_SOC_DAPM_INPUT("VA SWR_INPUT7"),
SND_SOC_DAPM_MUX_E("VA DEC0 MUX", SND_SOC_NOPM, VA_MACRO_DEC0, 0,
&va_dec0_mux, va_macro_enable_dec,
@@ -1487,6 +1549,46 @@ static const struct snd_soc_dapm_route va_audio_map[] = {
{"VA DMIC MUX3", "DMIC6", "VA DMIC6"},
{"VA DMIC MUX3", "DMIC7", "VA DMIC7"},
+ {"VA DEC0 MUX", "SWR_MIC", "VA SMIC MUX0"},
+ {"VA SMIC MUX0", "SWR_MIC0", "VA SWR_INPUT0"},
+ {"VA SMIC MUX0", "SWR_MIC1", "VA SWR_INPUT1"},
+ {"VA SMIC MUX0", "SWR_MIC2", "VA SWR_INPUT2"},
+ {"VA SMIC MUX0", "SWR_MIC3", "VA SWR_INPUT3"},
+ {"VA SMIC MUX0", "SWR_MIC4", "VA SWR_INPUT4"},
+ {"VA SMIC MUX0", "SWR_MIC5", "VA SWR_INPUT5"},
+ {"VA SMIC MUX0", "SWR_MIC6", "VA SWR_INPUT6"},
+ {"VA SMIC MUX0", "SWR_MIC7", "VA SWR_INPUT7"},
+
+ {"VA DEC1 MUX", "SWR_MIC", "VA SMIC MUX1"},
+ {"VA SMIC MUX1", "SWR_MIC0", "VA SWR_INPUT0"},
+ {"VA SMIC MUX1", "SWR_MIC1", "VA SWR_INPUT1"},
+ {"VA SMIC MUX1", "SWR_MIC2", "VA SWR_INPUT2"},
+ {"VA SMIC MUX1", "SWR_MIC3", "VA SWR_INPUT3"},
+ {"VA SMIC MUX1", "SWR_MIC4", "VA SWR_INPUT4"},
+ {"VA SMIC MUX1", "SWR_MIC5", "VA SWR_INPUT5"},
+ {"VA SMIC MUX1", "SWR_MIC6", "VA SWR_INPUT6"},
+ {"VA SMIC MUX1", "SWR_MIC7", "VA SWR_INPUT7"},
+
+ {"VA DEC2 MUX", "SWR_MIC", "VA SMIC MUX2"},
+ {"VA SMIC MUX2", "SWR_MIC0", "VA SWR_INPUT0"},
+ {"VA SMIC MUX2", "SWR_MIC1", "VA SWR_INPUT1"},
+ {"VA SMIC MUX2", "SWR_MIC2", "VA SWR_INPUT2"},
+ {"VA SMIC MUX2", "SWR_MIC3", "VA SWR_INPUT3"},
+ {"VA SMIC MUX2", "SWR_MIC4", "VA SWR_INPUT4"},
+ {"VA SMIC MUX2", "SWR_MIC5", "VA SWR_INPUT5"},
+ {"VA SMIC MUX2", "SWR_MIC6", "VA SWR_INPUT6"},
+ {"VA SMIC MUX2", "SWR_MIC7", "VA SWR_INPUT7"},
+
+ {"VA DEC3 MUX", "SWR_MIC", "VA SMIC MUX3"},
+ {"VA SMIC MUX3", "SWR_MIC0", "VA SWR_INPUT0"},
+ {"VA SMIC MUX3", "SWR_MIC1", "VA SWR_INPUT1"},
+ {"VA SMIC MUX3", "SWR_MIC2", "VA SWR_INPUT2"},
+ {"VA SMIC MUX3", "SWR_MIC3", "VA SWR_INPUT3"},
+ {"VA SMIC MUX3", "SWR_MIC4", "VA SWR_INPUT4"},
+ {"VA SMIC MUX3", "SWR_MIC5", "VA SWR_INPUT5"},
+ {"VA SMIC MUX3", "SWR_MIC6", "VA SWR_INPUT6"},
+ {"VA SMIC MUX3", "SWR_MIC7", "VA SWR_INPUT7"},
+
{ "VA DMIC0", NULL, "DMIC0 Pin" },
{ "VA DMIC1", NULL, "DMIC1 Pin" },
{ "VA DMIC2", NULL, "DMIC2 Pin" },
--
2.34.1
^ permalink raw reply related [flat|nested] 14+ messages in thread
* Re: [PATCH v2 1/6] ASoC: dt-bindings: qcom: Add Shikra RX and VA macro compatibles
2026-09-10 9:46 ` [PATCH v2 1/6] ASoC: dt-bindings: qcom: Add Shikra RX and VA macro compatibles Mohammad Rafi Shaik
@ 2026-09-10 9:53 ` sashiko-bot
2026-09-13 8:48 ` Krzysztof Kozlowski
1 sibling, 0 replies; 14+ messages in thread
From: sashiko-bot @ 2026-09-10 9:53 UTC (permalink / raw)
To: Mohammad Rafi Shaik; +Cc: conor+dt, devicetree, robh
Thank you for your contribution! Sashiko AI review found 1 potential issue(s) to consider:
- [Medium] Missing `if-then` conditional constraints for the newly added `qcom,shikra-lpass-rx-macro` and `qcom,shikra-lpass-va-macro` compatible strings.
--
commit fd8a851e254921359c89e0a86263375bd7af870d
Author: Mohammad Rafi Shaik <mohammad.rafi.shaik@oss.qualcomm.com>
ASoC: dt-bindings: qcom: Add Shikra RX and VA macro compatibles
Add bindings for Qualcomm shikra rx and va macro codec.
Shikra integrates LPASS codec version 4.1, which is not backwards
compatible with the already described compatibles.
> diff --git a/Documentation/devicetree/bindings/sound/qcom,lpass-rx-macro.yaml b/Documentation/devicetree/bindings/sound/qcom,lpass-rx-macro.yaml
> index 4988e7ed6e34b..d2f68b02566b8 100644
> --- a/Documentation/devicetree/bindings/sound/qcom,lpass-rx-macro.yaml
> +++ b/Documentation/devicetree/bindings/sound/qcom,lpass-rx-macro.yaml
> @@ -19,6 +19,7 @@ properties:
> - qcom,sm8450-lpass-rx-macro
> - qcom,sm8550-lpass-rx-macro
> - qcom,sc8280xp-lpass-rx-macro
> + - qcom,shikra-lpass-rx-macro
[Severity: Medium]
Is there a missing update to the conditional constraints in the allOf section
for this new compatible string?
When validating a device tree containing the qcom,shikra-lpass-rx-macro
node, the schema validation might fall back to the loose top-level limits
instead of strictly enforcing the required clocks for this hardware variant
(e.g. mclk, npl, macro, dcodec, fsgen). Device trees with invalid clock
configurations could silently pass dt_binding_check validation.
Could we ensure the corresponding if-then block is added to enforce
constraints for clocks and clock-names?
> - items:
> - enum:
> - qcom,eliza-lpass-rx-macro
> diff --git a/Documentation/devicetree/bindings/sound/qcom,lpass-va-macro.yaml b/Documentation/devicetree/bindings/sound/qcom,lpass-va-macro.yaml
> index aea31fbdad376..23f00de82cd36 100644
> --- a/Documentation/devicetree/bindings/sound/qcom,lpass-va-macro.yaml
> +++ b/Documentation/devicetree/bindings/sound/qcom,lpass-va-macro.yaml
> @@ -19,6 +19,7 @@ properties:
> - qcom,sm8450-lpass-va-macro
> - qcom,sm8550-lpass-va-macro
> - qcom,sc8280xp-lpass-va-macro
> + - qcom,shikra-lpass-va-macro
[Severity: Medium]
Similarly, does the new qcom,shikra-lpass-va-macro compatible string also
need a matching conditional constraint block in the allOf section?
Like the rx-macro binding, schema validation could fall back to loose
top-level limits instead of strictly enforcing the required clocks for this
variant. This allows device trees with invalid clock configurations to
silently pass validation.
Should we add the required constraints for this variant as well?
> - items:
> - enum:
> - qcom,eliza-lpass-va-macro
--
Sashiko AI review · https://sashiko.dev/#/patchset/20260910-add_shikra_support-v2-0-fdd2129c696c@oss.qualcomm.com?part=1
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH v2 4/6] ASoC: qcom: lpass-rx-macro: Add shikra compatible
2026-09-10 9:46 ` [PATCH v2 4/6] ASoC: qcom: lpass-rx-macro: Add shikra compatible Mohammad Rafi Shaik
@ 2026-09-10 9:59 ` sashiko-bot
0 siblings, 0 replies; 14+ messages in thread
From: sashiko-bot @ 2026-09-10 9:59 UTC (permalink / raw)
To: Mohammad Rafi Shaik; +Cc: robh, devicetree, conor+dt
Thank you for your contribution! Sashiko AI review found 1 potential issue(s) to consider:
Pre-existing issues:
- [High] Data race on `rx_mclk_users` and MCLK enablement due to lack of synchronization across CCF and DAPM contexts.
--
commit 3459bbdd1dba9dbf895d5d3272f789b95e526f28
Author: Mohammad Rafi Shaik <mohammad.rafi.shaik@oss.qualcomm.com>
ASoC: qcom: lpass-rx-macro: Add shikra compatible
This commit adds shikra RX macro compatible data and hooks it into the
existing LPASS codec v4.1 flow. It reuses the v2.5 register access helpers
and bypasses the FS counter before enabling MCLK for codec versions 4.1
and later.
> diff --git a/sound/soc/codecs/lpass-rx-macro.c b/sound/soc/codecs/lpass-rx-macro.c
> index 2e74ec1a52f8a..83372123c9018 100644
> --- a/sound/soc/codecs/lpass-rx-macro.c
> +++ b/sound/soc/codecs/lpass-rx-macro.c
[ ... ]
> @@ -2045,6 +2047,16 @@ static int rx_macro_mclk_enable(struct rx_macro *rx, bool mclk_enable)
> CDC_RX_CLK_MCLK2_ENABLE);
> regmap_update_bits(regmap, CDC_RX_CLK_RST_CTRL_FS_CNT_CONTROL,
> CDC_RX_FS_MCLK_CNT_CLR_MASK, 0x00);
> +
> + /*
> + * From LPASS codec v4.1 onwards the FS counter has to be
> + * bypassed before it is enabled, otherwise the fsgen
> + * output does not come up.
> + */
> + if (rx->codec_version >= LPASS_CODEC_VERSION_4_1)
> + regmap_set_bits(regmap, CDC_RX_CLK_RST_CTRL_FS_CNT_CONTROL,
> + CDC_RX_FS_CNT_BYPASS);
> +
[Severity: High]
This is a pre-existing issue, but is there a risk of a data race on
rx_mclk_users and the MCLK enablement here?
It looks like this shared state is being read and mutated without a driver
lock across different contexts. For example, an unprivileged user can trigger
DAPM events (e.g., via amixer or PCM start) which calls into this function
through rx_macro_mclk_event(). Concurrently, the Soundwire runtime PM or
clock framework can call into this via swclk_gate_enable().
If both paths invoke rx_macro_mclk_enable() simultaneously, could a
read-modify-write race on rx->rx_mclk_users occur, leading to lost increments
or decrements?
If the increments are lost, can this result in the hardware clock being
prematurely disabled while a subsystem (like the Soundwire master) still
expects it to be running? Accessing unclocked registers on Qualcomm platforms
typically triggers an XPU violation, which might lead to an unrecoverable
kernel panic.
Would it make sense to introduce a lock to protect rx_mclk_users and the
corresponding register updates in this function?
> regmap_update_bits(regmap, CDC_RX_CLK_RST_CTRL_FS_CNT_CONTROL,
> CDC_RX_FS_MCLK_CNT_EN_MASK,
> CDC_RX_FS_MCLK_CNT_ENABLE);
--
Sashiko AI review · https://sashiko.dev/#/patchset/20260910-add_shikra_support-v2-0-fdd2129c696c@oss.qualcomm.com?part=4
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH v2 6/6] ASoC: qcom: lpass-va-macro: Add SoundWire microphone mux support
2026-09-10 9:46 ` [PATCH v2 6/6] ASoC: qcom: lpass-va-macro: Add SoundWire microphone mux support Mohammad Rafi Shaik
@ 2026-09-10 10:00 ` sashiko-bot
0 siblings, 0 replies; 14+ messages in thread
From: sashiko-bot @ 2026-09-10 10:00 UTC (permalink / raw)
To: Mohammad Rafi Shaik; +Cc: conor+dt, robh, devicetree
Thank you for your contribution! Sashiko AI review found 3 potential issue(s) to consider:
New issues:
- [High] The HPF cutoff frequency change request bit (`CDC_VA_TX_HPF_CUTOFF_FREQ_CHANGE_REQ`) is permanently left asserted for SMIC sources.
- [High] The VA SMIC and VA DMIC mux put handlers conflict over the `CDC_VA_TX_PATH_ADC_DMIC_SEL_MASK` hardware bit, leading to silent audio routing failures.
Pre-existing issues:
- [High] The kcontrol put callback `va_macro_put_dec_enum` modifies hardware register state outside the DAPM mutex and prior to validation, introducing a TOCTOU race condition and state desynchronization.
--
commit 65c41e47c0a34211271b24ec96e2c5b75c4b06b0
Author: Mohammad Rafi Shaik <mohammad.rafi.shaik@oss.qualcomm.com>
ASoC: qcom: lpass-va-macro: Add SoundWire microphone mux support
The VA decimators can currently capture audio only from DMIC inputs.
Add support for routing audio from SoundWire microphone (SMIC) inputs
as well.
> diff --git a/sound/soc/codecs/lpass-va-macro.c b/sound/soc/codecs/lpass-va-macro.c
> index 8353921f718e3..46f35a984321c 100644
> --- a/sound/soc/codecs/lpass-va-macro.c
> +++ b/sound/soc/codecs/lpass-va-macro.c
[ ... ]
> @@ -756,10 +757,16 @@ static int va_macro_put_dec_enum(struct snd_kcontrol *kcontrol,
> return -EINVAL;
> }
>
> - if (val != 0)
> - snd_soc_component_update_bits(component, mic_sel_reg,
> + if (val != 0) {
> + if (strstr(widget->name, "SMIC"))
> + snd_soc_component_update_bits(component, mic_sel_reg,
> + CDC_VA_TX_PATH_ADC_DMIC_SEL_MASK,
> + CDC_VA_TX_PATH_ADC_DMIC_SEL_ADC);
> + else
> + snd_soc_component_update_bits(component, mic_sel_reg,
> CDC_VA_TX_PATH_ADC_DMIC_SEL_MASK,
> CDC_VA_TX_PATH_ADC_DMIC_SEL_DMIC);
> + }
>
> return snd_soc_dapm_put_enum_double(kcontrol, ucontrol);
> }
[Severity: High]
This is a pre-existing issue, but does modifying the hardware register here in
va_macro_put_dec_enum() happen outside the DAPM mutex?
Since snd_soc_dapm_put_enum_double() acquires the DAPM mutex and performs
bounds checking later, could an out-of-bounds enum index malicious update the
hardware but get rejected by the DAPM core, causing the hardware and software
states to permanently desynchronize?
[Severity: High]
Does this code also unconditionally overwrite the shared hardware mux selection
based on whichever control was touched last?
If userspace toggles the target DEC source (VA DECx MUX) between DMIC and SMIC
without also re-triggering the corresponding input mux, could this cause the
hardware register to remain incorrectly stuck on the previous selection? The
DAPM graph would properly power the new SMIC path, but the hardware register
would be incorrectly left on DMIC, potentially resulting in silent audio
routing failures.
[ ... ]
> @@ -994,21 +1011,20 @@ static int va_macro_enable_dec(struct snd_soc_dapm_widget *w,
> CF_MIN_3DB_150HZ << 5);
>
> snd_soc_component_update_bits(comp, hpf_gate_reg,
> - CDC_VA_TX_HPF_CUTOFF_FREQ_CHANGE_MASK,
> - CDC_VA_TX_HPF_CUTOFF_FREQ_CHANGE_REQ);
> + CDC_VA_TX_HPF_CUTOFF_FREQ_CHANGE_MASK,
> + CDC_VA_TX_HPF_CUTOFF_FREQ_CHANGE_REQ);
>
> /*
> * Minimum 1 clk cycle delay is required as per HW spec
> */
> usleep_range(1000, 1010);
>
> - snd_soc_component_update_bits(comp,
> - hpf_gate_reg,
> - CDC_VA_TX_HPF_CUTOFF_FREQ_CHANGE_MASK,
> - 0x0);
> + if (!is_amic_enabled(comp, decimator))
> + snd_soc_component_update_bits(comp, hpf_gate_reg,
> + CDC_VA_TX_HPF_CUTOFF_FREQ_CHANGE_MASK,
> + 0x0);
> }
[Severity: High]
If an SMIC path is active (!is_amic_enabled evaluates to false), does the
frequency change request bit CDC_VA_TX_HPF_CUTOFF_FREQ_CHANGE_REQ remain
permanently asserted?
The hardware state machine for the HPF typically requires a 0->1->0 transition.
If this bit is conditionally left at 1 when an SMIC source is active and the
cutoff frequency differs from CF_MIN_3DB_150HZ, could it become stuck and
prevent any future HPF cutoff frequency changes from completing?
--
Sashiko AI review · https://sashiko.dev/#/patchset/20260910-add_shikra_support-v2-0-fdd2129c696c@oss.qualcomm.com?part=6
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH v2 5/6] ASoC: qcom: lpass-va-macro: Add shikra compatible
2026-09-10 9:46 ` [PATCH v2 5/6] ASoC: qcom: lpass-va-macro: " Mohammad Rafi Shaik
@ 2026-09-10 10:03 ` sashiko-bot
0 siblings, 0 replies; 14+ messages in thread
From: sashiko-bot @ 2026-09-10 10:03 UTC (permalink / raw)
To: Mohammad Rafi Shaik; +Cc: robh, conor+dt, devicetree
Thank you for your contribution! Sashiko AI review found 2 potential issue(s) to consider:
- [High] 36 new ADPT configuration registers are missing from the va_is_rw_register() whitelist, causing regmap to silently drop their defaults during initialization.
- [Medium] The FS counter is enabled before it is bypassed, which contradicts the hardware initialization sequence stated in the commit message.
--
commit 7975fbfb906db9ea84cf327e35c78c8a83584393
Author: Mohammad Rafi Shaik <mohammad.rafi.shaik@oss.qualcomm.com>
ASoC: qcom: lpass-va-macro: Add shikra compatible
Add shikra specific VA macro data and register programming needed by
the LPASS codec v4.0 implementation. This includes adding the v4.1 ADPT
blocks and required FS counter bypass initialization.
> diff --git a/sound/soc/codecs/lpass-va-macro.c b/sound/soc/codecs/lpass-va-macro.c
> index a3b3af0d7db3c..8353921f718e3 100644
> --- a/sound/soc/codecs/lpass-va-macro.c
> +++ b/sound/soc/codecs/lpass-va-macro.c
[ ... ]
> @@ -357,6 +405,127 @@ static const struct reg_default va_defaults[] = {
> { CDC_VA_TX3_TX_PATH_SEC6, 0x00},
> };
>
> +static const struct reg_default va_4_1_defaults[] = {
[ ... ]
> + /* ADPT blocks */
> + { CDC_VA_CDC_ADPT0_ADPT_CTRL, 0x51},
> + { CDC_VA_CDC_ADPT0_ADPT_GAIN_0, 0x11},
> + { CDC_VA_CDC_ADPT0_ADPT_GAIN_1, 0x01},
> + { CDC_VA_CDC_ADPT0_DH_FSM_CTRL, 0x02},
> + { CDC_VA_CDC_ADPT0_CUTOFF_FSM_CTRL_0, 0x77},
[Severity: High]
Are the newly added ADPT configuration registers (such as ADPT_GAIN, DH_FSM,
and CUTOFF_FSM) accessible by regmap?
Because these 36 registers are missing from the va_is_rw_register() whitelist
below, they will be treated as non-writeable by the regmap subsystem. During
probe, when regcache_sync_region() is called from va_macro_mclk_enable(),
regmap will silently discard the default values specified here in
va_4_1_defaults, leaving the v4.1 adaptive filters unconfigured.
[ ... ]
> @@ -430,6 +599,10 @@ static bool va_is_rw_register(struct device *dev, unsigned int reg)
> case CDC_VA_TX3_TX_PATH_SEC4:
> case CDC_VA_TX3_TX_PATH_SEC5:
> case CDC_VA_TX3_TX_PATH_SEC6:
> + case CDC_VA_CDC_ADPT0_ADPT_CTRL:
> + case CDC_VA_CDC_ADPT1_ADPT_CTRL:
> + case CDC_VA_CDC_ADPT2_ADPT_CTRL:
> + case CDC_VA_CDC_ADPT3_ADPT_CTRL:
> return true;
> }
[ ... ]
> @@ -471,10 +665,14 @@ static int va_clk_rsc_fs_gen_request(struct va_macro *va, bool enable)
> regmap_update_bits(regmap, CDC_VA_CLK_RST_CTRL_MCLK_CONTROL,
> CDC_VA_MCLK_CONTROL_EN,
> CDC_VA_MCLK_CONTROL_EN);
> - /* clear the fs counter */
> +
> regmap_update_bits(regmap, CDC_VA_CLK_RST_CTRL_FS_CNT_CONTROL,
> CDC_VA_FS_CONTROL_EN | CDC_VA_FS_COUNTER_CLR,
> CDC_VA_FS_CONTROL_EN | CDC_VA_FS_COUNTER_CLR);
> +
> + if (lpass_macro_get_codec_version() >= LPASS_CODEC_VERSION_4_1)
> + regmap_set_bits(regmap, CDC_VA_CLK_RST_CTRL_FS_CNT_CONTROL,
> + CDC_VA_FS_CNT_BYPASS);
[Severity: Medium]
Will this sequence enable the block before bypassing it?
The commit message notes that the hardware requires the FS counter to be
bypassed before it is enabled. However, the preceding regmap_update_bits()
call asserts the CDC_VA_FS_CONTROL_EN bit prior to the CDC_VA_FS_CNT_BYPASS
bit being set here. Could this open a window where the control block is
enabled without the bypass, potentially placing the ADPT hardware in an
invalid state?
--
Sashiko AI review · https://sashiko.dev/#/patchset/20260910-add_shikra_support-v2-0-fdd2129c696c@oss.qualcomm.com?part=5
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH v2 3/6] ASoC: qcom: lpass-macro-common: Add LPASS codec version 4.1
2026-09-10 9:46 ` [PATCH v2 3/6] ASoC: qcom: lpass-macro-common: Add LPASS codec version 4.1 Mohammad Rafi Shaik
@ 2026-09-13 8:46 ` Krzysztof Kozlowski
0 siblings, 0 replies; 14+ messages in thread
From: Krzysztof Kozlowski @ 2026-09-13 8:46 UTC (permalink / raw)
To: Mohammad Rafi Shaik
Cc: Srinivas Kandagatla, Liam Girdwood, Mark Brown, Rob Herring,
Krzysztof Kozlowski, Conor Dooley, Jaroslav Kysela, Takashi Iwai,
linux-sound, linux-arm-msm, devicetree, linux-kernel
On Thu, Sep 10, 2026 at 03:16:54PM +0530, Mohammad Rafi Shaik wrote:
> Shikra integrates LPASS codec version 4.1. Add the new version to the
> codec version enum and to the version string helper.
>
> The enum stays ordered by version so that the existing '>=' comparisons
> on enum lpass_codec_version keep working.
>
> Signed-off-by: Mohammad Rafi Shaik <mohammad.rafi.shaik@oss.qualcomm.com>
> ---
> sound/soc/codecs/lpass-macro-common.h | 3 +++
> 1 file changed, 3 insertions(+)
>
> diff --git a/sound/soc/codecs/lpass-macro-common.h b/sound/soc/codecs/lpass-macro-common.h
> index 573b2145e..b52665b11 100644
> --- a/sound/soc/codecs/lpass-macro-common.h
> +++ b/sound/soc/codecs/lpass-macro-common.h
> @@ -30,6 +30,7 @@ enum lpass_codec_version {
> LPASS_CODEC_VERSION_2_7,
> LPASS_CODEC_VERSION_2_8,
> LPASS_CODEC_VERSION_2_9,
> + LPASS_CODEC_VERSION_4_1,
> };
>
This commit no sense on its own. You added dead code here. Add this with
an user of that version..
Best regards,
Krzysztof
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH v2 1/6] ASoC: dt-bindings: qcom: Add Shikra RX and VA macro compatibles
2026-09-10 9:46 ` [PATCH v2 1/6] ASoC: dt-bindings: qcom: Add Shikra RX and VA macro compatibles Mohammad Rafi Shaik
2026-09-10 9:53 ` sashiko-bot
@ 2026-09-13 8:48 ` Krzysztof Kozlowski
2026-09-13 8:49 ` Krzysztof Kozlowski
1 sibling, 1 reply; 14+ messages in thread
From: Krzysztof Kozlowski @ 2026-09-13 8:48 UTC (permalink / raw)
To: Mohammad Rafi Shaik
Cc: Srinivas Kandagatla, Liam Girdwood, Mark Brown, Rob Herring,
Krzysztof Kozlowski, Conor Dooley, Jaroslav Kysela, Takashi Iwai,
linux-sound, linux-arm-msm, devicetree, linux-kernel
On Thu, Sep 10, 2026 at 03:16:52PM +0530, Mohammad Rafi Shaik wrote:
> Add bindings for Qualcomm shikra rx and va macro codec.
>
> Shikra integrates LPASS codec version 4.1, which is not backwards
> compatible with the already described compatibles.
OK, so it is not compatible with anything so far, thus existing
constraints from the binding do not apply. Then why are the clock inputs
flexible?
Best regards,
Krzysztof
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH v2 1/6] ASoC: dt-bindings: qcom: Add Shikra RX and VA macro compatibles
2026-09-13 8:48 ` Krzysztof Kozlowski
@ 2026-09-13 8:49 ` Krzysztof Kozlowski
0 siblings, 0 replies; 14+ messages in thread
From: Krzysztof Kozlowski @ 2026-09-13 8:49 UTC (permalink / raw)
To: Mohammad Rafi Shaik
Cc: Srinivas Kandagatla, Liam Girdwood, Mark Brown, Rob Herring,
Krzysztof Kozlowski, Conor Dooley, Jaroslav Kysela, Takashi Iwai,
linux-sound, linux-arm-msm, devicetree, linux-kernel
On 13/09/2026 10:48, Krzysztof Kozlowski wrote:
> On Thu, Sep 10, 2026 at 03:16:52PM +0530, Mohammad Rafi Shaik wrote:
>> Add bindings for Qualcomm shikra rx and va macro codec.
>>
>> Shikra integrates LPASS codec version 4.1, which is not backwards
>> compatible with the already described compatibles.
>
> OK, so it is not compatible with anything so far, thus existing
> constraints from the binding do not apply. Then why are the clock inputs
> flexible?
>
Heh, and you already received EXACTLY the same feedback at v1, which you
completely ignored.
So now second time...
Best regards,
Krzysztof
^ permalink raw reply [flat|nested] 14+ messages in thread
end of thread, other threads:[~2026-09-13 8:49 UTC | newest]
Thread overview: 14+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-09-10 9:46 [PATCH v2 0/6] ASoC: qcom: Add shikra LPASS RX/VA macro support Mohammad Rafi Shaik
2026-09-10 9:46 ` [PATCH v2 1/6] ASoC: dt-bindings: qcom: Add Shikra RX and VA macro compatibles Mohammad Rafi Shaik
2026-09-10 9:53 ` sashiko-bot
2026-09-13 8:48 ` Krzysztof Kozlowski
2026-09-13 8:49 ` Krzysztof Kozlowski
2026-09-10 9:46 ` [PATCH v2 2/6] ASoC: qcom: lpass-macro-common: Add missing v2.9 version string Mohammad Rafi Shaik
2026-09-10 9:46 ` [PATCH v2 3/6] ASoC: qcom: lpass-macro-common: Add LPASS codec version 4.1 Mohammad Rafi Shaik
2026-09-13 8:46 ` Krzysztof Kozlowski
2026-09-10 9:46 ` [PATCH v2 4/6] ASoC: qcom: lpass-rx-macro: Add shikra compatible Mohammad Rafi Shaik
2026-09-10 9:59 ` sashiko-bot
2026-09-10 9:46 ` [PATCH v2 5/6] ASoC: qcom: lpass-va-macro: " Mohammad Rafi Shaik
2026-09-10 10:03 ` sashiko-bot
2026-09-10 9:46 ` [PATCH v2 6/6] ASoC: qcom: lpass-va-macro: Add SoundWire microphone mux support Mohammad Rafi Shaik
2026-09-10 10:00 ` sashiko-bot
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox