* [PATCH v2 00/11] SDM660 sound card and internal MI2S support
@ 2026-03-04 19:58 Richard Acayan
2026-03-04 19:58 ` [PATCH v2 01/11] ASoC: dt-bindings: qcom,sm8250: add compatible for sdm660 Richard Acayan
` (10 more replies)
0 siblings, 11 replies; 17+ messages in thread
From: Richard Acayan @ 2026-03-04 19:58 UTC (permalink / raw)
To: Srinivas Kandagatla, Liam Girdwood, Mark Brown, Rob Herring,
Krzysztof Kozlowski, Conor Dooley, Jaroslav Kysela, Takashi Iwai,
Konrad Dybcio, linux-arm-msm, linux-sound, devicetree
Cc: Nickolay Goppen, Wesley Cheng, Greg Kroah-Hartman, Johan Hovold,
Kees Cook, Charles Keepax, Kuninori Morimoto, Richard Acayan
This adds support for the SDM660 (formerly "SDM660 internal") sound
card and support for WCD codecs over internal MI2S.
Like on MSM8916 and MSM8953, some SDM660 and SDM670 devices connect to a
digital and analog codec. The connection to the digital codec is through
special "internal" MI2S ports. The digital and analog codecs are used on
the Xiaomi Redmi Note 7 for headset (playback + capture) and earpiece,
and also on the Google Pixel 3a for the headset.
This series does not include devicetree patches.
Changes since v1 (https://lore.kernel.org/r/20260211020302.2674-1-mailingradian@gmail.com):
- rename sound card to drop "internal" (1/11, 10/11)
- use common headphone jack code (9/11, 10/11)
- remove no-op code in sound card driver (10/11)
- remove inaccurate comment about clock consumer/producer (10/11)
- add review tags (3/11, 4/11)
Nickolay Goppen (1):
ASoC: dt-bindings: qcom,sm8250: add compatible for sdm660
Richard Acayan (10):
ASoC: dt-bindings: qcom: q6dsp: add internal mi2s support
ASoC: dt-bindings: pm8916-analog-codec: Add PM660L compatible
ASoC: dt-bindings: msm8916-digital-codec: Add SDM660 compatible
ASoC: qdsp6: q6dsp-lpass-ports: add internal mi2s support
ASoC: qdsp6: q6afe: add internal mi2s support
ASoC: qdsp6: q6afe-dai: add internal mi2s support
ASoC: qdsp6: q6routing: add internal mi2s support
ASoC: qdsp6: common: support headphone jacks connected to internal
mi2s
ASoC: qcom: add sdm660 sound card support
ASoC: msm8916-wcd-analog: add quirk for cajon 2.0
.../sound/qcom,msm8916-wcd-digital-codec.yaml | 8 +-
.../sound/qcom,pm8916-wcd-analog-codec.yaml | 8 +-
.../sound/qcom,q6dsp-lpass-ports.yaml | 5 +-
.../bindings/sound/qcom,sm8250.yaml | 1 +
.../sound/qcom,q6dsp-lpass-ports.h | 14 ++
sound/soc/codecs/msm8916-wcd-analog.c | 63 +++++-
sound/soc/qcom/Kconfig | 12 ++
sound/soc/qcom/Makefile | 2 +
sound/soc/qcom/common.c | 1 +
sound/soc/qcom/qdsp6/q6afe-dai.c | 46 ++++
sound/soc/qcom/qdsp6/q6afe.c | 56 +++++
sound/soc/qcom/qdsp6/q6afe.h | 2 +-
sound/soc/qcom/qdsp6/q6dsp-lpass-ports.c | 200 ++++++++++++++++++
sound/soc/qcom/qdsp6/q6routing.c | 78 ++++++-
sound/soc/qcom/sdm660.c | 192 +++++++++++++++++
15 files changed, 681 insertions(+), 7 deletions(-)
create mode 100644 sound/soc/qcom/sdm660.c
--
2.53.0
^ permalink raw reply [flat|nested] 17+ messages in thread
* [PATCH v2 01/11] ASoC: dt-bindings: qcom,sm8250: add compatible for sdm660
2026-03-04 19:58 [PATCH v2 00/11] SDM660 sound card and internal MI2S support Richard Acayan
@ 2026-03-04 19:58 ` Richard Acayan
2026-03-05 7:52 ` Krzysztof Kozlowski
2026-03-04 19:58 ` [PATCH v2 02/11] ASoC: dt-bindings: qcom: q6dsp: add internal mi2s support Richard Acayan
` (9 subsequent siblings)
10 siblings, 1 reply; 17+ messages in thread
From: Richard Acayan @ 2026-03-04 19:58 UTC (permalink / raw)
To: Srinivas Kandagatla, Liam Girdwood, Mark Brown, Rob Herring,
Krzysztof Kozlowski, Conor Dooley, Jaroslav Kysela, Takashi Iwai,
Konrad Dybcio, linux-arm-msm, linux-sound, devicetree
Cc: Nickolay Goppen, Wesley Cheng, Greg Kroah-Hartman, Johan Hovold,
Kees Cook, Charles Keepax, Kuninori Morimoto, Richard Acayan
From: Nickolay Goppen <setotau@mainlining.org>
Add compatibles for sdm660 based soundcards.
Signed-off-by: Nickolay Goppen <setotau@mainlining.org>
---
Documentation/devicetree/bindings/sound/qcom,sm8250.yaml | 1 +
1 file changed, 1 insertion(+)
diff --git a/Documentation/devicetree/bindings/sound/qcom,sm8250.yaml b/Documentation/devicetree/bindings/sound/qcom,sm8250.yaml
index 15f38622b98b..63c744524e01 100644
--- a/Documentation/devicetree/bindings/sound/qcom,sm8250.yaml
+++ b/Documentation/devicetree/bindings/sound/qcom,sm8250.yaml
@@ -44,6 +44,7 @@ properties:
- qcom,qrb5165-rb5-sndcard
- qcom,sc7180-qdsp6-sndcard
- qcom,sc8280xp-sndcard
+ - qcom,sdm660-sndcard
- qcom,sdm845-sndcard
- qcom,sm8250-sndcard
- qcom,sm8450-sndcard
--
2.53.0
^ permalink raw reply related [flat|nested] 17+ messages in thread
* [PATCH v2 02/11] ASoC: dt-bindings: qcom: q6dsp: add internal mi2s support
2026-03-04 19:58 [PATCH v2 00/11] SDM660 sound card and internal MI2S support Richard Acayan
2026-03-04 19:58 ` [PATCH v2 01/11] ASoC: dt-bindings: qcom,sm8250: add compatible for sdm660 Richard Acayan
@ 2026-03-04 19:58 ` Richard Acayan
2026-03-05 7:57 ` Krzysztof Kozlowski
2026-03-04 19:58 ` [PATCH v2 03/11] ASoC: dt-bindings: pm8916-analog-codec: Add PM660L compatible Richard Acayan
` (8 subsequent siblings)
10 siblings, 1 reply; 17+ messages in thread
From: Richard Acayan @ 2026-03-04 19:58 UTC (permalink / raw)
To: Srinivas Kandagatla, Liam Girdwood, Mark Brown, Rob Herring,
Krzysztof Kozlowski, Conor Dooley, Jaroslav Kysela, Takashi Iwai,
Konrad Dybcio, linux-arm-msm, linux-sound, devicetree
Cc: Nickolay Goppen, Wesley Cheng, Greg Kroah-Hartman, Johan Hovold,
Kees Cook, Charles Keepax, Kuninori Morimoto, Richard Acayan
The internal MI2S ports are found on devices with the internal sound
card for Snapdragon 660. Add support for them.
Signed-off-by: Richard Acayan <mailingradian@gmail.com>
---
.../bindings/sound/qcom,q6dsp-lpass-ports.yaml | 5 ++++-
include/dt-bindings/sound/qcom,q6dsp-lpass-ports.h | 14 ++++++++++++++
2 files changed, 18 insertions(+), 1 deletion(-)
diff --git a/Documentation/devicetree/bindings/sound/qcom,q6dsp-lpass-ports.yaml b/Documentation/devicetree/bindings/sound/qcom,q6dsp-lpass-ports.yaml
index 08c618e7e428..751913894dd4 100644
--- a/Documentation/devicetree/bindings/sound/qcom,q6dsp-lpass-ports.yaml
+++ b/Documentation/devicetree/bindings/sound/qcom,q6dsp-lpass-ports.yaml
@@ -126,13 +126,16 @@ patternProperties:
reg:
contains:
# MI2S DAI ID range PRIMARY_MI2S_RX - QUATERNARY_MI2S_TX and
- # QUINARY_MI2S_RX - QUINARY_MI2S_TX
+ # QUINARY_MI2S_RX - QUINARY_MI2S_TX and
+ # INT0_MI2S_RX - INT6_MI2S_TX
items:
oneOf:
- minimum: 16
maximum: 23
- minimum: 127
maximum: 128
+ - minimum: 137
+ maximum: 150
then:
required:
- qcom,sd-lines
diff --git a/include/dt-bindings/sound/qcom,q6dsp-lpass-ports.h b/include/dt-bindings/sound/qcom,q6dsp-lpass-ports.h
index 6d1ce7f5da51..6753f7bf004b 100644
--- a/include/dt-bindings/sound/qcom,q6dsp-lpass-ports.h
+++ b/include/dt-bindings/sound/qcom,q6dsp-lpass-ports.h
@@ -140,6 +140,20 @@
#define DISPLAY_PORT_RX_6 134
#define DISPLAY_PORT_RX_7 135
#define USB_RX 136
+#define INT0_MI2S_RX 137
+#define INT0_MI2S_TX 138
+#define INT1_MI2S_RX 139
+#define INT1_MI2S_TX 140
+#define INT2_MI2S_RX 141
+#define INT2_MI2S_TX 142
+#define INT3_MI2S_RX 143
+#define INT3_MI2S_TX 144
+#define INT4_MI2S_RX 145
+#define INT4_MI2S_TX 146
+#define INT5_MI2S_RX 147
+#define INT5_MI2S_TX 148
+#define INT6_MI2S_RX 149
+#define INT6_MI2S_TX 150
#define LPASS_CLK_ID_PRI_MI2S_IBIT 1
#define LPASS_CLK_ID_PRI_MI2S_EBIT 2
--
2.53.0
^ permalink raw reply related [flat|nested] 17+ messages in thread
* [PATCH v2 03/11] ASoC: dt-bindings: pm8916-analog-codec: Add PM660L compatible
2026-03-04 19:58 [PATCH v2 00/11] SDM660 sound card and internal MI2S support Richard Acayan
2026-03-04 19:58 ` [PATCH v2 01/11] ASoC: dt-bindings: qcom,sm8250: add compatible for sdm660 Richard Acayan
2026-03-04 19:58 ` [PATCH v2 02/11] ASoC: dt-bindings: qcom: q6dsp: add internal mi2s support Richard Acayan
@ 2026-03-04 19:58 ` Richard Acayan
2026-03-04 19:58 ` [PATCH v2 04/11] ASoC: dt-bindings: msm8916-digital-codec: Add SDM660 compatible Richard Acayan
` (7 subsequent siblings)
10 siblings, 0 replies; 17+ messages in thread
From: Richard Acayan @ 2026-03-04 19:58 UTC (permalink / raw)
To: Srinivas Kandagatla, Liam Girdwood, Mark Brown, Rob Herring,
Krzysztof Kozlowski, Conor Dooley, Jaroslav Kysela, Takashi Iwai,
Konrad Dybcio, linux-arm-msm, linux-sound, devicetree
Cc: Nickolay Goppen, Wesley Cheng, Greg Kroah-Hartman, Johan Hovold,
Kees Cook, Charles Keepax, Kuninori Morimoto, Richard Acayan
The PM8916 analog codec is also found on PM660L, typically connected to
the SDM660 internal sound card via the digital codec. Provide a space
for specific compatibles and add the compatible for PM660L.
Signed-off-by: Richard Acayan <mailingradian@gmail.com>
Reviewed-by: Krzysztof Kozlowski <krzysztof.kozlowski@oss.qualcomm.com>
---
.../bindings/sound/qcom,pm8916-wcd-analog-codec.yaml | 8 +++++++-
1 file changed, 7 insertions(+), 1 deletion(-)
diff --git a/Documentation/devicetree/bindings/sound/qcom,pm8916-wcd-analog-codec.yaml b/Documentation/devicetree/bindings/sound/qcom,pm8916-wcd-analog-codec.yaml
index 94e7a1860977..c7424d755cd8 100644
--- a/Documentation/devicetree/bindings/sound/qcom,pm8916-wcd-analog-codec.yaml
+++ b/Documentation/devicetree/bindings/sound/qcom,pm8916-wcd-analog-codec.yaml
@@ -14,7 +14,13 @@ description:
properties:
compatible:
- const: qcom,pm8916-wcd-analog-codec
+ oneOf:
+ - items:
+ - enum:
+ - qcom,pm660l-wcd-analog-codec
+ - const: qcom,pm8916-wcd-analog-codec
+
+ - const: qcom,pm8916-wcd-analog-codec
reg:
maxItems: 1
--
2.53.0
^ permalink raw reply related [flat|nested] 17+ messages in thread
* [PATCH v2 04/11] ASoC: dt-bindings: msm8916-digital-codec: Add SDM660 compatible
2026-03-04 19:58 [PATCH v2 00/11] SDM660 sound card and internal MI2S support Richard Acayan
` (2 preceding siblings ...)
2026-03-04 19:58 ` [PATCH v2 03/11] ASoC: dt-bindings: pm8916-analog-codec: Add PM660L compatible Richard Acayan
@ 2026-03-04 19:58 ` Richard Acayan
2026-03-04 19:58 ` [PATCH v2 05/11] ASoC: qdsp6: q6dsp-lpass-ports: add internal mi2s support Richard Acayan
` (6 subsequent siblings)
10 siblings, 0 replies; 17+ messages in thread
From: Richard Acayan @ 2026-03-04 19:58 UTC (permalink / raw)
To: Srinivas Kandagatla, Liam Girdwood, Mark Brown, Rob Herring,
Krzysztof Kozlowski, Conor Dooley, Jaroslav Kysela, Takashi Iwai,
Konrad Dybcio, linux-arm-msm, linux-sound, devicetree
Cc: Nickolay Goppen, Wesley Cheng, Greg Kroah-Hartman, Johan Hovold,
Kees Cook, Charles Keepax, Kuninori Morimoto, Richard Acayan
The MSM8916 digital codec is also found on SDM660, typically connected to
the SDM660 internal sound card. Provide a space
for specific compatibles and add the compatible for SDM660.
Signed-off-by: Richard Acayan <mailingradian@gmail.com>
Reviewed-by: Krzysztof Kozlowski <krzysztof.kozlowski@oss.qualcomm.com>
---
.../bindings/sound/qcom,msm8916-wcd-digital-codec.yaml | 8 +++++++-
1 file changed, 7 insertions(+), 1 deletion(-)
diff --git a/Documentation/devicetree/bindings/sound/qcom,msm8916-wcd-digital-codec.yaml b/Documentation/devicetree/bindings/sound/qcom,msm8916-wcd-digital-codec.yaml
index a899c4e7c1c9..33bc23b6176a 100644
--- a/Documentation/devicetree/bindings/sound/qcom,msm8916-wcd-digital-codec.yaml
+++ b/Documentation/devicetree/bindings/sound/qcom,msm8916-wcd-digital-codec.yaml
@@ -14,7 +14,13 @@ description:
properties:
compatible:
- const: qcom,msm8916-wcd-digital-codec
+ oneOf:
+ - items:
+ - enum:
+ - qcom,sdm660-wcd-digital-codec
+ - const: qcom,msm8916-wcd-digital-codec
+
+ - const: qcom,msm8916-wcd-digital-codec
reg:
maxItems: 1
--
2.53.0
^ permalink raw reply related [flat|nested] 17+ messages in thread
* [PATCH v2 05/11] ASoC: qdsp6: q6dsp-lpass-ports: add internal mi2s support
2026-03-04 19:58 [PATCH v2 00/11] SDM660 sound card and internal MI2S support Richard Acayan
` (3 preceding siblings ...)
2026-03-04 19:58 ` [PATCH v2 04/11] ASoC: dt-bindings: msm8916-digital-codec: Add SDM660 compatible Richard Acayan
@ 2026-03-04 19:58 ` Richard Acayan
2026-03-05 7:59 ` Krzysztof Kozlowski
2026-03-04 19:58 ` [PATCH v2 06/11] ASoC: qdsp6: q6afe: " Richard Acayan
` (5 subsequent siblings)
10 siblings, 1 reply; 17+ messages in thread
From: Richard Acayan @ 2026-03-04 19:58 UTC (permalink / raw)
To: Srinivas Kandagatla, Liam Girdwood, Mark Brown, Rob Herring,
Krzysztof Kozlowski, Conor Dooley, Jaroslav Kysela, Takashi Iwai,
Konrad Dybcio, linux-arm-msm, linux-sound, devicetree
Cc: Nickolay Goppen, Wesley Cheng, Greg Kroah-Hartman, Johan Hovold,
Kees Cook, Charles Keepax, Kuninori Morimoto, Richard Acayan
Add the internal MI2S stream capabilities as specified by the audio
kernel modules and configure the ports as MI2S ports.
Link: https://android.googlesource.com/kernel/msm-extra/+/530cffa4cc977a348753831b163eb9d3302b954a/asoc/msm-dai-q6-v2.c#4597
Signed-off-by: Richard Acayan <mailingradian@gmail.com>
---
sound/soc/qcom/qdsp6/q6dsp-lpass-ports.c | 200 +++++++++++++++++++++++
1 file changed, 200 insertions(+)
diff --git a/sound/soc/qcom/qdsp6/q6dsp-lpass-ports.c b/sound/soc/qcom/qdsp6/q6dsp-lpass-ports.c
index 4eed54b071a5..fc79934fc1bf 100644
--- a/sound/soc/qcom/qdsp6/q6dsp-lpass-ports.c
+++ b/sound/soc/qcom/qdsp6/q6dsp-lpass-ports.c
@@ -594,6 +594,205 @@ static struct snd_soc_dai_driver q6dsp_audio_fe_dais[] = {
Q6AFE_CDC_DMA_TX_DAI(TX_CODEC_DMA_TX_5),
Q6AFE_CDC_DMA_RX_DAI(RX_CODEC_DMA_RX_6),
Q6AFE_CDC_DMA_RX_DAI(RX_CODEC_DMA_RX_7),
+ {
+ .playback = {
+ .stream_name = "INT0 MI2S Playback",
+ .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 |
+ SNDRV_PCM_RATE_44100 | SNDRV_PCM_RATE_48000 |
+ SNDRV_PCM_RATE_192000,
+ .formats = SNDRV_PCM_FMTBIT_S16_LE |
+ SNDRV_PCM_FMTBIT_S24_LE |
+ SNDRV_PCM_FMTBIT_S24_3LE,
+ .channels_min = 1,
+ .channels_max = 8,
+ .rate_min = 8000,
+ .rate_max = 192000,
+ },
+ .id = INT0_MI2S_RX,
+ .name = "INT0_MI2S_RX",
+ }, {
+ .capture = {
+ .stream_name = "INT0 MI2S Capture",
+ .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 |
+ SNDRV_PCM_RATE_48000,
+ .formats = SNDRV_PCM_FMTBIT_S16_LE,
+ .channels_min = 1,
+ .channels_max = 8,
+ .rate_min = 8000,
+ .rate_max = 48000,
+ },
+ .id = INT0_MI2S_TX,
+ .name = "INT0_MI2S_TX",
+ }, {
+ .playback = {
+ .stream_name = "INT1 MI2S Playback",
+ .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 |
+ SNDRV_PCM_RATE_48000,
+ .formats = SNDRV_PCM_FMTBIT_S16_LE |
+ SNDRV_PCM_FMTBIT_S24_LE |
+ SNDRV_PCM_FMTBIT_S24_3LE,
+ .channels_min = 1,
+ .channels_max = 8,
+ .rate_min = 8000,
+ .rate_max = 48000,
+ },
+ .id = INT1_MI2S_RX,
+ .name = "INT1_MI2S_RX",
+ }, {
+ .capture = {
+ .stream_name = "INT1 MI2S Capture",
+ .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 |
+ SNDRV_PCM_RATE_48000,
+ .formats = SNDRV_PCM_FMTBIT_S16_LE,
+ .channels_min = 1,
+ .channels_max = 8,
+ .rate_min = 8000,
+ .rate_max = 48000,
+ },
+ .id = INT1_MI2S_TX,
+ .name = "INT1_MI2S_TX",
+ }, {
+ .playback = {
+ .stream_name = "INT2 MI2S Playback",
+ .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 |
+ SNDRV_PCM_RATE_48000,
+ .formats = SNDRV_PCM_FMTBIT_S16_LE |
+ SNDRV_PCM_FMTBIT_S24_LE |
+ SNDRV_PCM_FMTBIT_S24_3LE,
+ .channels_min = 1,
+ .channels_max = 8,
+ .rate_min = 8000,
+ .rate_max = 48000,
+ },
+ .id = INT2_MI2S_RX,
+ .name = "INT2_MI2S_RX",
+ }, {
+ .capture = {
+ .stream_name = "INT2 MI2S Capture",
+ .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 |
+ SNDRV_PCM_RATE_48000,
+ .formats = SNDRV_PCM_FMTBIT_S16_LE,
+ .channels_min = 1,
+ .channels_max = 8,
+ .rate_min = 8000,
+ .rate_max = 48000,
+ },
+ .id = INT2_MI2S_TX,
+ .name = "INT2_MI2S_TX",
+ }, {
+ .playback = {
+ .stream_name = "INT3 MI2S Playback",
+ .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 |
+ SNDRV_PCM_RATE_48000,
+ .formats = SNDRV_PCM_FMTBIT_S16_LE |
+ SNDRV_PCM_FMTBIT_S24_LE |
+ SNDRV_PCM_FMTBIT_S24_3LE,
+ .channels_min = 1,
+ .channels_max = 8,
+ .rate_min = 8000,
+ .rate_max = 48000,
+ },
+ .id = INT3_MI2S_RX,
+ .name = "INT3_MI2S_RX",
+ }, {
+ .capture = {
+ .stream_name = "INT3 MI2S Capture",
+ .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 |
+ SNDRV_PCM_RATE_48000,
+ .formats = SNDRV_PCM_FMTBIT_S16_LE,
+ .channels_min = 1,
+ .channels_max = 8,
+ .rate_min = 8000,
+ .rate_max = 48000,
+ },
+ .id = INT3_MI2S_TX,
+ .name = "INT3_MI2S_TX",
+ }, {
+ .playback = {
+ .stream_name = "INT4 MI2S Playback",
+ .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 |
+ SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_96000 |
+ SNDRV_PCM_RATE_192000,
+ .formats = SNDRV_PCM_FMTBIT_S16_LE |
+ SNDRV_PCM_FMTBIT_S24_LE |
+ SNDRV_PCM_FMTBIT_S24_3LE,
+ .channels_min = 1,
+ .channels_max = 8,
+ .rate_min = 8000,
+ .rate_max = 192000,
+ },
+ .id = INT4_MI2S_RX,
+ .name = "INT4_MI2S_RX",
+ }, {
+ .capture = {
+ .stream_name = "INT4 MI2S Capture",
+ .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 |
+ SNDRV_PCM_RATE_48000,
+ .formats = SNDRV_PCM_FMTBIT_S16_LE,
+ .channels_min = 1,
+ .channels_max = 8,
+ .rate_min = 8000,
+ .rate_max = 48000,
+ },
+ .id = INT4_MI2S_TX,
+ .name = "INT4_MI2S_TX",
+ }, {
+ .playback = {
+ .stream_name = "INT5 MI2S Playback",
+ .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 |
+ SNDRV_PCM_RATE_48000,
+ .formats = SNDRV_PCM_FMTBIT_S16_LE |
+ SNDRV_PCM_FMTBIT_S24_LE |
+ SNDRV_PCM_FMTBIT_S24_3LE,
+ .channels_min = 1,
+ .channels_max = 8,
+ .rate_min = 8000,
+ .rate_max = 48000,
+ },
+ .id = INT5_MI2S_RX,
+ .name = "INT5_MI2S_RX",
+ }, {
+ .capture = {
+ .stream_name = "INT5 MI2S Capture",
+ .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 |
+ SNDRV_PCM_RATE_48000,
+ .formats = SNDRV_PCM_FMTBIT_S16_LE,
+ .channels_min = 1,
+ .channels_max = 8,
+ .rate_min = 8000,
+ .rate_max = 48000,
+ },
+ .id = INT5_MI2S_TX,
+ .name = "INT5_MI2S_TX",
+ }, {
+ .playback = {
+ .stream_name = "INT6 MI2S Playback",
+ .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 |
+ SNDRV_PCM_RATE_48000,
+ .formats = SNDRV_PCM_FMTBIT_S16_LE |
+ SNDRV_PCM_FMTBIT_S24_LE |
+ SNDRV_PCM_FMTBIT_S24_3LE,
+ .channels_min = 1,
+ .channels_max = 8,
+ .rate_min = 8000,
+ .rate_max = 48000,
+ },
+ .id = INT6_MI2S_RX,
+ .name = "INT6_MI2S_RX",
+ }, {
+ .capture = {
+ .stream_name = "INT6 MI2S Capture",
+ .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 |
+ SNDRV_PCM_RATE_48000,
+ .formats = SNDRV_PCM_FMTBIT_S16_LE,
+ .channels_min = 1,
+ .channels_max = 8,
+ .rate_min = 8000,
+ .rate_max = 48000,
+ },
+ .id = INT6_MI2S_TX,
+ .name = "INT6_MI2S_TX",
+ },
};
int q6dsp_audio_ports_of_xlate_dai_name(struct snd_soc_component *component,
@@ -636,6 +835,7 @@ struct snd_soc_dai_driver *q6dsp_audio_ports_set_config(struct device *dev,
break;
case QUINARY_MI2S_RX ... QUINARY_MI2S_TX:
case PRIMARY_MI2S_RX ... QUATERNARY_MI2S_TX:
+ case INT0_MI2S_RX ... INT6_MI2S_TX:
q6dsp_audio_fe_dais[i].ops = cfg->q6i2s_ops;
break;
case PRIMARY_TDM_RX_0 ... QUINARY_TDM_TX_7:
--
2.53.0
^ permalink raw reply related [flat|nested] 17+ messages in thread
* [PATCH v2 06/11] ASoC: qdsp6: q6afe: add internal mi2s support
2026-03-04 19:58 [PATCH v2 00/11] SDM660 sound card and internal MI2S support Richard Acayan
` (4 preceding siblings ...)
2026-03-04 19:58 ` [PATCH v2 05/11] ASoC: qdsp6: q6dsp-lpass-ports: add internal mi2s support Richard Acayan
@ 2026-03-04 19:58 ` Richard Acayan
2026-03-04 19:58 ` [PATCH v2 07/11] ASoC: qdsp6: q6afe-dai: " Richard Acayan
` (4 subsequent siblings)
10 siblings, 0 replies; 17+ messages in thread
From: Richard Acayan @ 2026-03-04 19:58 UTC (permalink / raw)
To: Srinivas Kandagatla, Liam Girdwood, Mark Brown, Rob Herring,
Krzysztof Kozlowski, Conor Dooley, Jaroslav Kysela, Takashi Iwai,
Konrad Dybcio, linux-arm-msm, linux-sound, devicetree
Cc: Nickolay Goppen, Wesley Cheng, Greg Kroah-Hartman, Johan Hovold,
Kees Cook, Charles Keepax, Kuninori Morimoto, Richard Acayan
Add the port mappings for internal MI2S, found on the Snapdragon 660
internal sound card.
Signed-off-by: Richard Acayan <mailingradian@gmail.com>
---
sound/soc/qcom/qdsp6/q6afe.c | 56 ++++++++++++++++++++++++++++++++++++
sound/soc/qcom/qdsp6/q6afe.h | 2 +-
2 files changed, 57 insertions(+), 1 deletion(-)
diff --git a/sound/soc/qcom/qdsp6/q6afe.c b/sound/soc/qcom/qdsp6/q6afe.c
index 43d877322bae..4112503515a9 100644
--- a/sound/soc/qcom/qdsp6/q6afe.c
+++ b/sound/soc/qcom/qdsp6/q6afe.c
@@ -130,6 +130,20 @@
#define AFE_PORT_ID_QUATERNARY_MI2S_TX 0x1007
#define AFE_PORT_ID_QUINARY_MI2S_RX 0x1016
#define AFE_PORT_ID_QUINARY_MI2S_TX 0x1017
+#define AFE_PORT_ID_INT0_MI2S_RX 0x102e
+#define AFE_PORT_ID_INT0_MI2S_TX 0x102f
+#define AFE_PORT_ID_INT1_MI2S_RX 0x1030
+#define AFE_PORT_ID_INT1_MI2S_TX 0x1031
+#define AFE_PORT_ID_INT2_MI2S_RX 0x1032
+#define AFE_PORT_ID_INT2_MI2S_TX 0x1033
+#define AFE_PORT_ID_INT3_MI2S_RX 0x1034
+#define AFE_PORT_ID_INT3_MI2S_TX 0x1035
+#define AFE_PORT_ID_INT4_MI2S_RX 0x1036
+#define AFE_PORT_ID_INT4_MI2S_TX 0x1037
+#define AFE_PORT_ID_INT5_MI2S_RX 0x1038
+#define AFE_PORT_ID_INT5_MI2S_TX 0x1039
+#define AFE_PORT_ID_INT6_MI2S_RX 0x103a
+#define AFE_PORT_ID_INT6_MI2S_TX 0x103b
/* Start of the range of port IDs for TDM devices. */
#define AFE_PORT_ID_TDM_PORT_RANGE_START 0x9000
@@ -925,6 +939,34 @@ static struct afe_port_map port_maps[AFE_PORT_MAX] = {
[RX_CODEC_DMA_RX_7] = { AFE_PORT_ID_RX_CODEC_DMA_RX_7,
RX_CODEC_DMA_RX_7, 1, 1},
[USB_RX] = { AFE_PORT_ID_USB_RX, USB_RX, 1, 1},
+ [INT0_MI2S_RX] = { AFE_PORT_ID_INT0_MI2S_RX,
+ INT0_MI2S_RX, 1, 1},
+ [INT0_MI2S_TX] = { AFE_PORT_ID_INT0_MI2S_TX,
+ INT0_MI2S_RX, 0, 1},
+ [INT1_MI2S_RX] = { AFE_PORT_ID_INT1_MI2S_RX,
+ INT1_MI2S_RX, 1, 1},
+ [INT1_MI2S_TX] = { AFE_PORT_ID_INT1_MI2S_TX,
+ INT1_MI2S_RX, 0, 1},
+ [INT2_MI2S_RX] = { AFE_PORT_ID_INT2_MI2S_RX,
+ INT2_MI2S_RX, 1, 1},
+ [INT2_MI2S_TX] = { AFE_PORT_ID_INT2_MI2S_TX,
+ INT2_MI2S_RX, 0, 1},
+ [INT3_MI2S_RX] = { AFE_PORT_ID_INT3_MI2S_RX,
+ INT3_MI2S_RX, 1, 1},
+ [INT3_MI2S_TX] = { AFE_PORT_ID_INT3_MI2S_TX,
+ INT3_MI2S_RX, 0, 1},
+ [INT4_MI2S_RX] = { AFE_PORT_ID_INT4_MI2S_RX,
+ INT4_MI2S_RX, 1, 1},
+ [INT4_MI2S_TX] = { AFE_PORT_ID_INT4_MI2S_TX,
+ INT4_MI2S_RX, 0, 1},
+ [INT5_MI2S_RX] = { AFE_PORT_ID_INT5_MI2S_RX,
+ INT5_MI2S_RX, 1, 1},
+ [INT5_MI2S_TX] = { AFE_PORT_ID_INT5_MI2S_TX,
+ INT5_MI2S_RX, 0, 1},
+ [INT6_MI2S_RX] = { AFE_PORT_ID_INT6_MI2S_RX,
+ INT6_MI2S_RX, 1, 1},
+ [INT6_MI2S_TX] = { AFE_PORT_ID_INT6_MI2S_TX,
+ INT6_MI2S_RX, 0, 1},
};
static void q6afe_port_free(struct kref *ref)
@@ -1777,6 +1819,20 @@ struct q6afe_port *q6afe_port_get_from_id(struct device *dev, int id)
case AFE_PORT_ID_QUATERNARY_MI2S_TX:
case AFE_PORT_ID_QUINARY_MI2S_RX:
case AFE_PORT_ID_QUINARY_MI2S_TX:
+ case AFE_PORT_ID_INT0_MI2S_RX:
+ case AFE_PORT_ID_INT0_MI2S_TX:
+ case AFE_PORT_ID_INT1_MI2S_RX:
+ case AFE_PORT_ID_INT1_MI2S_TX:
+ case AFE_PORT_ID_INT2_MI2S_RX:
+ case AFE_PORT_ID_INT2_MI2S_TX:
+ case AFE_PORT_ID_INT3_MI2S_RX:
+ case AFE_PORT_ID_INT3_MI2S_TX:
+ case AFE_PORT_ID_INT4_MI2S_RX:
+ case AFE_PORT_ID_INT4_MI2S_TX:
+ case AFE_PORT_ID_INT5_MI2S_RX:
+ case AFE_PORT_ID_INT5_MI2S_TX:
+ case AFE_PORT_ID_INT6_MI2S_RX:
+ case AFE_PORT_ID_INT6_MI2S_TX:
cfg_type = AFE_PARAM_ID_I2S_CONFIG;
break;
case AFE_PORT_ID_PRIMARY_TDM_RX ... AFE_PORT_ID_QUINARY_TDM_TX_7:
diff --git a/sound/soc/qcom/qdsp6/q6afe.h b/sound/soc/qcom/qdsp6/q6afe.h
index a29abe4ce436..d61fda8e8985 100644
--- a/sound/soc/qcom/qdsp6/q6afe.h
+++ b/sound/soc/qcom/qdsp6/q6afe.h
@@ -3,7 +3,7 @@
#ifndef __Q6AFE_H__
#define __Q6AFE_H__
-#define AFE_PORT_MAX 137
+#define AFE_PORT_MAX 151
#define MSM_AFE_PORT_TYPE_RX 0
#define MSM_AFE_PORT_TYPE_TX 1
--
2.53.0
^ permalink raw reply related [flat|nested] 17+ messages in thread
* [PATCH v2 07/11] ASoC: qdsp6: q6afe-dai: add internal mi2s support
2026-03-04 19:58 [PATCH v2 00/11] SDM660 sound card and internal MI2S support Richard Acayan
` (5 preceding siblings ...)
2026-03-04 19:58 ` [PATCH v2 06/11] ASoC: qdsp6: q6afe: " Richard Acayan
@ 2026-03-04 19:58 ` Richard Acayan
2026-03-04 19:58 ` [PATCH v2 08/11] ASoC: qdsp6: q6routing: " Richard Acayan
` (3 subsequent siblings)
10 siblings, 0 replies; 17+ messages in thread
From: Richard Acayan @ 2026-03-04 19:58 UTC (permalink / raw)
To: Srinivas Kandagatla, Liam Girdwood, Mark Brown, Rob Herring,
Krzysztof Kozlowski, Conor Dooley, Jaroslav Kysela, Takashi Iwai,
Konrad Dybcio, linux-arm-msm, linux-sound, devicetree
Cc: Nickolay Goppen, Wesley Cheng, Greg Kroah-Hartman, Johan Hovold,
Kees Cook, Charles Keepax, Kuninori Morimoto, Richard Acayan
Add the internal MI2S ports found on the SDM660 internal sound card.
Signed-off-by: Richard Acayan <mailingradian@gmail.com>
---
sound/soc/qcom/qdsp6/q6afe-dai.c | 46 ++++++++++++++++++++++++++++++++
1 file changed, 46 insertions(+)
diff --git a/sound/soc/qcom/qdsp6/q6afe-dai.c b/sound/soc/qcom/qdsp6/q6afe-dai.c
index 0f47aadaabe1..dfe964b1a341 100644
--- a/sound/soc/qcom/qdsp6/q6afe-dai.c
+++ b/sound/soc/qcom/qdsp6/q6afe-dai.c
@@ -411,6 +411,7 @@ static int q6afe_dai_prepare(struct snd_pcm_substream *substream,
break;
case QUINARY_MI2S_RX ... QUINARY_MI2S_TX:
case PRIMARY_MI2S_RX ... QUATERNARY_MI2S_TX:
+ case INT0_MI2S_RX ... INT6_MI2S_TX:
rc = q6afe_i2s_port_prepare(dai_data->port[dai->id],
&dai_data->port_config[dai->id].i2s_cfg);
if (rc < 0) {
@@ -662,6 +663,21 @@ static const struct snd_soc_dapm_route q6afe_dapm_routes[] = {
/* USB playback AFE port receives data for playback, hence use the RX port */
{"USB Playback", NULL, "USB_RX"},
+
+ {"INT0 MI2S Playback", NULL, "INT0_MI2S_RX"},
+ {"INT0_MI2S_TX", NULL, "INT0 MI2S Capture"},
+ {"INT1 MI2S Playback", NULL, "INT1_MI2S_RX"},
+ {"INT1_MI2S_TX", NULL, "INT1 MI2S Capture"},
+ {"INT2 MI2S Playback", NULL, "INT2_MI2S_RX"},
+ {"INT2_MI2S_TX", NULL, "INT2 MI2S Capture"},
+ {"INT3 MI2S Playback", NULL, "INT3_MI2S_RX"},
+ {"INT3_MI2S_TX", NULL, "INT3 MI2S Capture"},
+ {"INT4 MI2S Playback", NULL, "INT4_MI2S_RX"},
+ {"INT4_MI2S_TX", NULL, "INT4 MI2S Capture"},
+ {"INT5 MI2S Playback", NULL, "INT5_MI2S_RX"},
+ {"INT5_MI2S_TX", NULL, "INT5 MI2S Capture"},
+ {"INT6 MI2S Playback", NULL, "INT6_MI2S_RX"},
+ {"INT6_MI2S_TX", NULL, "INT6 MI2S Capture"},
};
static int msm_dai_q6_dai_probe(struct snd_soc_dai *dai)
@@ -1006,6 +1022,35 @@ static const struct snd_soc_dapm_widget q6afe_dai_widgets[] = {
0, SND_SOC_NOPM, 0, 0),
SND_SOC_DAPM_AIF_IN("USB_RX", NULL, 0, SND_SOC_NOPM, 0, 0),
+
+ SND_SOC_DAPM_AIF_IN("INT0_MI2S_RX", "NULL",
+ 0, SND_SOC_NOPM, 0, 0),
+ SND_SOC_DAPM_AIF_OUT("INT0_MI2S_TX", "NULL",
+ 0, SND_SOC_NOPM, 0, 0),
+ SND_SOC_DAPM_AIF_IN("INT1_MI2S_RX", "NULL",
+ 0, SND_SOC_NOPM, 0, 0),
+ SND_SOC_DAPM_AIF_OUT("INT1_MI2S_TX", "NULL",
+ 0, SND_SOC_NOPM, 0, 0),
+ SND_SOC_DAPM_AIF_IN("INT2_MI2S_RX", "NULL",
+ 0, SND_SOC_NOPM, 0, 0),
+ SND_SOC_DAPM_AIF_OUT("INT2_MI2S_TX", "NULL",
+ 0, SND_SOC_NOPM, 0, 0),
+ SND_SOC_DAPM_AIF_IN("INT3_MI2S_RX", "NULL",
+ 0, SND_SOC_NOPM, 0, 0),
+ SND_SOC_DAPM_AIF_OUT("INT3_MI2S_TX", "NULL",
+ 0, SND_SOC_NOPM, 0, 0),
+ SND_SOC_DAPM_AIF_IN("INT4_MI2S_RX", "NULL",
+ 0, SND_SOC_NOPM, 0, 0),
+ SND_SOC_DAPM_AIF_OUT("INT4_MI2S_TX", "NULL",
+ 0, SND_SOC_NOPM, 0, 0),
+ SND_SOC_DAPM_AIF_IN("INT5_MI2S_RX", "NULL",
+ 0, SND_SOC_NOPM, 0, 0),
+ SND_SOC_DAPM_AIF_OUT("INT5_MI2S_TX", "NULL",
+ 0, SND_SOC_NOPM, 0, 0),
+ SND_SOC_DAPM_AIF_IN("INT6_MI2S_RX", "NULL",
+ 0, SND_SOC_NOPM, 0, 0),
+ SND_SOC_DAPM_AIF_OUT("INT6_MI2S_TX", "NULL",
+ 0, SND_SOC_NOPM, 0, 0),
};
static const struct snd_soc_component_driver q6afe_dai_component = {
@@ -1039,6 +1084,7 @@ static void of_q6afe_parse_dai_data(struct device *dev,
/* MI2S specific properties */
case QUINARY_MI2S_RX ... QUINARY_MI2S_TX:
case PRIMARY_MI2S_RX ... QUATERNARY_MI2S_TX:
+ case INT0_MI2S_RX ... INT6_MI2S_TX:
priv = &data->priv[id];
ret = of_property_read_variable_u32_array(node,
"qcom,sd-lines",
--
2.53.0
^ permalink raw reply related [flat|nested] 17+ messages in thread
* [PATCH v2 08/11] ASoC: qdsp6: q6routing: add internal mi2s support
2026-03-04 19:58 [PATCH v2 00/11] SDM660 sound card and internal MI2S support Richard Acayan
` (6 preceding siblings ...)
2026-03-04 19:58 ` [PATCH v2 07/11] ASoC: qdsp6: q6afe-dai: " Richard Acayan
@ 2026-03-04 19:58 ` Richard Acayan
2026-03-04 19:58 ` [PATCH v2 09/11] ASoC: qdsp6: common: support headphone jacks connected to internal mi2s Richard Acayan
` (2 subsequent siblings)
10 siblings, 0 replies; 17+ messages in thread
From: Richard Acayan @ 2026-03-04 19:58 UTC (permalink / raw)
To: Srinivas Kandagatla, Liam Girdwood, Mark Brown, Rob Herring,
Krzysztof Kozlowski, Conor Dooley, Jaroslav Kysela, Takashi Iwai,
Konrad Dybcio, linux-arm-msm, linux-sound, devicetree
Cc: Nickolay Goppen, Wesley Cheng, Greg Kroah-Hartman, Johan Hovold,
Kees Cook, Charles Keepax, Kuninori Morimoto, Richard Acayan
Add the ASM-AFE routing for internal MI2S ports.
Signed-off-by: Richard Acayan <mailingradian@gmail.com>
---
sound/soc/qcom/qdsp6/q6routing.c | 78 +++++++++++++++++++++++++++++++-
1 file changed, 77 insertions(+), 1 deletion(-)
diff --git a/sound/soc/qcom/qdsp6/q6routing.c b/sound/soc/qcom/qdsp6/q6routing.c
index 7386226046fa..cfb953700f14 100644
--- a/sound/soc/qcom/qdsp6/q6routing.c
+++ b/sound/soc/qcom/qdsp6/q6routing.c
@@ -127,7 +127,14 @@
{ mix_name, "TX_CODEC_DMA_TX_2", "TX_CODEC_DMA_TX_2"}, \
{ mix_name, "TX_CODEC_DMA_TX_3", "TX_CODEC_DMA_TX_3"}, \
{ mix_name, "TX_CODEC_DMA_TX_4", "TX_CODEC_DMA_TX_4"}, \
- { mix_name, "TX_CODEC_DMA_TX_5", "TX_CODEC_DMA_TX_5"}
+ { mix_name, "TX_CODEC_DMA_TX_5", "TX_CODEC_DMA_TX_5"}, \
+ { mix_name, "INT0_MI2S_TX", "INT0_MI2S_TX" }, \
+ { mix_name, "INT1_MI2S_TX", "INT1_MI2S_TX" }, \
+ { mix_name, "INT2_MI2S_TX", "INT2_MI2S_TX" }, \
+ { mix_name, "INT3_MI2S_TX", "INT3_MI2S_TX" }, \
+ { mix_name, "INT4_MI2S_TX", "INT4_MI2S_TX" }, \
+ { mix_name, "INT5_MI2S_TX", "INT5_MI2S_TX" }, \
+ { mix_name, "INT6_MI2S_TX", "INT6_MI2S_TX" }
#define Q6ROUTING_TX_MIXERS(id) \
SOC_SINGLE_EXT("PRI_MI2S_TX", PRIMARY_MI2S_TX, \
@@ -320,6 +327,27 @@
id, 1, 0, msm_routing_get_audio_mixer, \
msm_routing_put_audio_mixer), \
SOC_SINGLE_EXT("TX_CODEC_DMA_TX_5", TX_CODEC_DMA_TX_5, \
+ id, 1, 0, msm_routing_get_audio_mixer, \
+ msm_routing_put_audio_mixer), \
+ SOC_SINGLE_EXT("INT0_MI2S_TX", INT0_MI2S_TX, \
+ id, 1, 0, msm_routing_get_audio_mixer, \
+ msm_routing_put_audio_mixer), \
+ SOC_SINGLE_EXT("INT1_MI2S_TX", INT1_MI2S_TX, \
+ id, 1, 0, msm_routing_get_audio_mixer, \
+ msm_routing_put_audio_mixer), \
+ SOC_SINGLE_EXT("INT2_MI2S_TX", INT2_MI2S_TX, \
+ id, 1, 0, msm_routing_get_audio_mixer, \
+ msm_routing_put_audio_mixer), \
+ SOC_SINGLE_EXT("INT3_MI2S_TX", INT3_MI2S_TX, \
+ id, 1, 0, msm_routing_get_audio_mixer, \
+ msm_routing_put_audio_mixer), \
+ SOC_SINGLE_EXT("INT4_MI2S_TX", INT4_MI2S_TX, \
+ id, 1, 0, msm_routing_get_audio_mixer, \
+ msm_routing_put_audio_mixer), \
+ SOC_SINGLE_EXT("INT5_MI2S_TX", INT5_MI2S_TX, \
+ id, 1, 0, msm_routing_get_audio_mixer, \
+ msm_routing_put_audio_mixer), \
+ SOC_SINGLE_EXT("INT6_MI2S_TX", INT6_MI2S_TX, \
id, 1, 0, msm_routing_get_audio_mixer, \
msm_routing_put_audio_mixer),
@@ -709,6 +737,26 @@ static const struct snd_kcontrol_new rxcodec_dma_rx_6_mixer_controls[] = {
static const struct snd_kcontrol_new rx_codec_dma_rx_7_mixer_controls[] = {
Q6ROUTING_RX_MIXERS(RX_CODEC_DMA_RX_7) };
+static const struct snd_kcontrol_new int0_mi2s_rx_mixer_controls[] = {
+ Q6ROUTING_RX_MIXERS(INT0_MI2S_RX) };
+
+static const struct snd_kcontrol_new int1_mi2s_rx_mixer_controls[] = {
+ Q6ROUTING_RX_MIXERS(INT1_MI2S_RX) };
+
+static const struct snd_kcontrol_new int2_mi2s_rx_mixer_controls[] = {
+ Q6ROUTING_RX_MIXERS(INT2_MI2S_RX) };
+
+static const struct snd_kcontrol_new int3_mi2s_rx_mixer_controls[] = {
+ Q6ROUTING_RX_MIXERS(INT3_MI2S_RX) };
+
+static const struct snd_kcontrol_new int4_mi2s_rx_mixer_controls[] = {
+ Q6ROUTING_RX_MIXERS(INT4_MI2S_RX) };
+
+static const struct snd_kcontrol_new int5_mi2s_rx_mixer_controls[] = {
+ Q6ROUTING_RX_MIXERS(INT5_MI2S_RX) };
+
+static const struct snd_kcontrol_new int6_mi2s_rx_mixer_controls[] = {
+ Q6ROUTING_RX_MIXERS(INT6_MI2S_RX) };
static const struct snd_kcontrol_new mmul1_mixer_controls[] = {
Q6ROUTING_TX_MIXERS(MSM_FRONTEND_DAI_MULTIMEDIA1) };
@@ -938,6 +986,27 @@ static const struct snd_soc_dapm_widget msm_qdsp6_widgets[] = {
SND_SOC_DAPM_MIXER("USB_RX Audio Mixer", SND_SOC_NOPM, 0, 0,
usb_rx_mixer_controls,
ARRAY_SIZE(usb_rx_mixer_controls)),
+ SND_SOC_DAPM_MIXER("INT0_MI2S_RX Audio Mixer", SND_SOC_NOPM, 0, 0,
+ int0_mi2s_rx_mixer_controls,
+ ARRAY_SIZE(int0_mi2s_rx_mixer_controls)),
+ SND_SOC_DAPM_MIXER("INT1_MI2S_RX Audio Mixer", SND_SOC_NOPM, 0, 0,
+ int1_mi2s_rx_mixer_controls,
+ ARRAY_SIZE(int1_mi2s_rx_mixer_controls)),
+ SND_SOC_DAPM_MIXER("INT2_MI2S_RX Audio Mixer", SND_SOC_NOPM, 0, 0,
+ int2_mi2s_rx_mixer_controls,
+ ARRAY_SIZE(int2_mi2s_rx_mixer_controls)),
+ SND_SOC_DAPM_MIXER("INT3_MI2S_RX Audio Mixer", SND_SOC_NOPM, 0, 0,
+ int3_mi2s_rx_mixer_controls,
+ ARRAY_SIZE(int3_mi2s_rx_mixer_controls)),
+ SND_SOC_DAPM_MIXER("INT4_MI2S_RX Audio Mixer", SND_SOC_NOPM, 0, 0,
+ int4_mi2s_rx_mixer_controls,
+ ARRAY_SIZE(int4_mi2s_rx_mixer_controls)),
+ SND_SOC_DAPM_MIXER("INT5_MI2S_RX Audio Mixer", SND_SOC_NOPM, 0, 0,
+ int5_mi2s_rx_mixer_controls,
+ ARRAY_SIZE(int5_mi2s_rx_mixer_controls)),
+ SND_SOC_DAPM_MIXER("INT6_MI2S_RX Audio Mixer", SND_SOC_NOPM, 0, 0,
+ int6_mi2s_rx_mixer_controls,
+ ARRAY_SIZE(int6_mi2s_rx_mixer_controls)),
SND_SOC_DAPM_MIXER("MultiMedia1 Mixer", SND_SOC_NOPM, 0, 0,
mmul1_mixer_controls, ARRAY_SIZE(mmul1_mixer_controls)),
SND_SOC_DAPM_MIXER("MultiMedia2 Mixer", SND_SOC_NOPM, 0, 0,
@@ -1031,6 +1100,13 @@ static const struct snd_soc_dapm_route intercon[] = {
Q6ROUTING_RX_DAPM_ROUTE("RX_CODEC_DMA_RX_6 Audio Mixer", "RX_CODEC_DMA_RX_6"),
Q6ROUTING_RX_DAPM_ROUTE("RX_CODEC_DMA_RX_7 Audio Mixer", "RX_CODEC_DMA_RX_7"),
Q6ROUTING_RX_DAPM_ROUTE("USB_RX Audio Mixer", "USB_RX"),
+ Q6ROUTING_RX_DAPM_ROUTE("INT0_MI2S_RX Audio Mixer", "INT0_MI2S_RX"),
+ Q6ROUTING_RX_DAPM_ROUTE("INT1_MI2S_RX Audio Mixer", "INT1_MI2S_RX"),
+ Q6ROUTING_RX_DAPM_ROUTE("INT2_MI2S_RX Audio Mixer", "INT2_MI2S_RX"),
+ Q6ROUTING_RX_DAPM_ROUTE("INT3_MI2S_RX Audio Mixer", "INT3_MI2S_RX"),
+ Q6ROUTING_RX_DAPM_ROUTE("INT4_MI2S_RX Audio Mixer", "INT4_MI2S_RX"),
+ Q6ROUTING_RX_DAPM_ROUTE("INT5_MI2S_RX Audio Mixer", "INT5_MI2S_RX"),
+ Q6ROUTING_RX_DAPM_ROUTE("INT6_MI2S_RX Audio Mixer", "INT6_MI2S_RX"),
Q6ROUTING_TX_DAPM_ROUTE("MultiMedia1 Mixer"),
Q6ROUTING_TX_DAPM_ROUTE("MultiMedia2 Mixer"),
Q6ROUTING_TX_DAPM_ROUTE("MultiMedia3 Mixer"),
--
2.53.0
^ permalink raw reply related [flat|nested] 17+ messages in thread
* [PATCH v2 09/11] ASoC: qdsp6: common: support headphone jacks connected to internal mi2s
2026-03-04 19:58 [PATCH v2 00/11] SDM660 sound card and internal MI2S support Richard Acayan
` (7 preceding siblings ...)
2026-03-04 19:58 ` [PATCH v2 08/11] ASoC: qdsp6: q6routing: " Richard Acayan
@ 2026-03-04 19:58 ` Richard Acayan
2026-03-04 19:58 ` [PATCH v2 10/11] ASoC: qcom: add sdm660 sound card support Richard Acayan
2026-03-04 19:58 ` [PATCH v2 11/11] ASoC: msm8916-wcd-analog: add quirk for cajon 2.0 Richard Acayan
10 siblings, 0 replies; 17+ messages in thread
From: Richard Acayan @ 2026-03-04 19:58 UTC (permalink / raw)
To: Srinivas Kandagatla, Liam Girdwood, Mark Brown, Rob Herring,
Krzysztof Kozlowski, Conor Dooley, Jaroslav Kysela, Takashi Iwai,
Konrad Dybcio, linux-arm-msm, linux-sound, devicetree
Cc: Nickolay Goppen, Wesley Cheng, Greg Kroah-Hartman, Johan Hovold,
Kees Cook, Charles Keepax, Kuninori Morimoto, Richard Acayan
Internal MI2S ports are connected to a WCD codec which may support
headphones. Register the headphone jack on codecs connected to the
playback port, INT_MI2S_RX.
Signed-off-by: Richard Acayan <mailingradian@gmail.com>
---
sound/soc/qcom/common.c | 1 +
1 file changed, 1 insertion(+)
diff --git a/sound/soc/qcom/common.c b/sound/soc/qcom/common.c
index 7ee60a58a336..aa5ba282166d 100644
--- a/sound/soc/qcom/common.c
+++ b/sound/soc/qcom/common.c
@@ -226,6 +226,7 @@ int qcom_snd_wcd_jack_setup(struct snd_soc_pcm_runtime *rtd,
}
switch (cpu_dai->id) {
+ case INT0_MI2S_RX:
case TX_CODEC_DMA_TX_0:
case TX_CODEC_DMA_TX_1:
case TX_CODEC_DMA_TX_2:
--
2.53.0
^ permalink raw reply related [flat|nested] 17+ messages in thread
* [PATCH v2 10/11] ASoC: qcom: add sdm660 sound card support
2026-03-04 19:58 [PATCH v2 00/11] SDM660 sound card and internal MI2S support Richard Acayan
` (8 preceding siblings ...)
2026-03-04 19:58 ` [PATCH v2 09/11] ASoC: qdsp6: common: support headphone jacks connected to internal mi2s Richard Acayan
@ 2026-03-04 19:58 ` Richard Acayan
2026-03-05 7:51 ` Krzysztof Kozlowski
2026-03-04 19:58 ` [PATCH v2 11/11] ASoC: msm8916-wcd-analog: add quirk for cajon 2.0 Richard Acayan
10 siblings, 1 reply; 17+ messages in thread
From: Richard Acayan @ 2026-03-04 19:58 UTC (permalink / raw)
To: Srinivas Kandagatla, Liam Girdwood, Mark Brown, Rob Herring,
Krzysztof Kozlowski, Conor Dooley, Jaroslav Kysela, Takashi Iwai,
Konrad Dybcio, linux-arm-msm, linux-sound, devicetree
Cc: Nickolay Goppen, Wesley Cheng, Greg Kroah-Hartman, Johan Hovold,
Kees Cook, Charles Keepax, Kuninori Morimoto, Richard Acayan
The Snapdragon 670 and Snapdragon 660 share the sound card, which can
have digital/analog WCD, WCD9335, WCD934X, or board-specific sound
codecs. Add support for the sound card.
Signed-off-by: Richard Acayan <mailingradian@gmail.com>
---
sound/soc/qcom/Kconfig | 12 +++
sound/soc/qcom/Makefile | 2 +
sound/soc/qcom/sdm660.c | 192 ++++++++++++++++++++++++++++++++++++++++
3 files changed, 206 insertions(+)
create mode 100644 sound/soc/qcom/sdm660.c
diff --git a/sound/soc/qcom/Kconfig b/sound/soc/qcom/Kconfig
index e6e24f3b9922..2ef4c436e534 100644
--- a/sound/soc/qcom/Kconfig
+++ b/sound/soc/qcom/Kconfig
@@ -167,6 +167,18 @@ config SND_SOC_MSM8996
APQ8096 SoC-based systems.
Say Y if you want to use audio device on this SoCs
+config SND_SOC_SDM660
+ tristate "SoC Machine driver for SDM660 and SDM670 boards"
+ depends on QCOM_APR
+ depends on OF
+ depends on PM
+ select SND_SOC_QDSP6
+ select SND_SOC_QCOM_COMMON
+ help
+ This adds support for audio on Qualcomm Technologies Inc.
+ SDM660 and SDM670 SoC-based systems.
+ Say Y if you want to use audio devices on these SoCs.
+
config SND_SOC_SDM845
tristate "SoC Machine driver for SDM845 boards"
depends on QCOM_APR && I2C && SOUNDWIRE
diff --git a/sound/soc/qcom/Makefile b/sound/soc/qcom/Makefile
index 985ce2ae286b..8b6bdc19e780 100644
--- a/sound/soc/qcom/Makefile
+++ b/sound/soc/qcom/Makefile
@@ -24,6 +24,7 @@ snd-soc-apq8016-sbc-y := apq8016_sbc.o
snd-soc-apq8096-y := apq8096.o
snd-soc-sc7180-y := sc7180.o
snd-soc-sc7280-y := sc7280.o
+snd-soc-sdm660-y := sdm660.o
snd-soc-sdm845-y := sdm845.o
snd-soc-sm8250-y := sm8250.o
snd-soc-sc8280xp-y := sc8280xp.o
@@ -38,6 +39,7 @@ obj-$(CONFIG_SND_SOC_MSM8996) += snd-soc-apq8096.o
obj-$(CONFIG_SND_SOC_SC7180) += snd-soc-sc7180.o
obj-$(CONFIG_SND_SOC_SC7280) += snd-soc-sc7280.o
obj-$(CONFIG_SND_SOC_SC8280XP) += snd-soc-sc8280xp.o
+obj-$(CONFIG_SND_SOC_SDM660) += snd-soc-sdm660.o
obj-$(CONFIG_SND_SOC_SDM845) += snd-soc-sdm845.o
obj-$(CONFIG_SND_SOC_SM8250) += snd-soc-sm8250.o
obj-$(CONFIG_SND_SOC_QCOM_COMMON) += snd-soc-qcom-common.o
diff --git a/sound/soc/qcom/sdm660.c b/sound/soc/qcom/sdm660.c
new file mode 100644
index 000000000000..8dae01b733dd
--- /dev/null
+++ b/sound/soc/qcom/sdm660.c
@@ -0,0 +1,192 @@
+// SPDX-License-Identifier: GPL-2.0-only
+/*
+ * Copyright (c) 2015-2020, The Linux Foundation. All rights reserved.
+ * Copyright (c) 2023, Richard Acayan. All rights reserved.
+ */
+
+#include <dt-bindings/sound/qcom,q6dsp-lpass-ports.h>
+#include <linux/module.h>
+#include <linux/of.h>
+#include <linux/platform_device.h>
+#include <sound/pcm.h>
+#include <sound/pcm_params.h>
+#include <sound/jack.h>
+#include <sound/soc.h>
+#include <sound/soc-card.h>
+#include <sound/soc-dai.h>
+#include <sound/soc-dapm.h>
+#include <sound/soc-jack.h>
+
+#include "common.h"
+#include "qdsp6/q6afe.h"
+
+#define DEFAULT_SAMPLE_RATE_48K 48000
+#define DEFAULT_INT_MCLK_RATE 9600000
+#define MI2S_BCLK_RATE 1536000
+
+struct sdm660_snd_data {
+ struct snd_soc_jack jack;
+ bool jack_setup;
+ uint32_t int0_mi2s_clk_count;
+ uint32_t int3_mi2s_clk_count;
+};
+
+static int snd_sdm660_startup(struct snd_pcm_substream *stream)
+{
+ struct snd_soc_pcm_runtime *rtd = snd_soc_substream_to_rtd(stream);
+ struct sdm660_snd_data *data = snd_soc_card_get_drvdata(rtd->card);
+ struct snd_soc_dai *cpu = snd_soc_rtd_to_cpu(rtd, 0);
+
+ switch (cpu->id) {
+ case INT0_MI2S_RX:
+ data->int0_mi2s_clk_count++;
+ if (data->int0_mi2s_clk_count == 1)
+ snd_soc_dai_set_sysclk(cpu,
+ Q6AFE_LPASS_CLK_ID_INT0_MI2S_IBIT,
+ MI2S_BCLK_RATE, SNDRV_PCM_STREAM_PLAYBACK);
+
+ snd_soc_dai_set_fmt(cpu, SND_SOC_DAIFMT_CBP_CFP);
+
+ break;
+ case INT3_MI2S_TX:
+ data->int3_mi2s_clk_count++;
+ if (data->int3_mi2s_clk_count == 1)
+ snd_soc_dai_set_sysclk(cpu,
+ Q6AFE_LPASS_CLK_ID_INT3_MI2S_IBIT,
+ MI2S_BCLK_RATE, SNDRV_PCM_STREAM_PLAYBACK);
+
+ snd_soc_dai_set_fmt(cpu, SND_SOC_DAIFMT_CBP_CFP);
+
+ break;
+ default:
+ dev_err(rtd->dev, "%s: invalid dai id 0x%x\n", __func__,
+ cpu->id);
+ return -EINVAL;
+ }
+
+ return 0;
+}
+
+static void snd_sdm660_shutdown(struct snd_pcm_substream *stream)
+{
+ struct snd_soc_pcm_runtime *rtd = snd_soc_substream_to_rtd(stream);
+ struct sdm660_snd_data *data = snd_soc_card_get_drvdata(rtd->card);
+ struct snd_soc_dai *cpu = snd_soc_rtd_to_cpu(rtd, 0);
+
+ switch (cpu->id) {
+ case INT0_MI2S_RX:
+ data->int0_mi2s_clk_count--;
+ if (data->int0_mi2s_clk_count == 0)
+ snd_soc_dai_set_sysclk(cpu,
+ Q6AFE_LPASS_CLK_ID_INT0_MI2S_IBIT,
+ 0, SNDRV_PCM_STREAM_PLAYBACK);
+
+ break;
+ case INT3_MI2S_TX:
+ data->int3_mi2s_clk_count--;
+ if (data->int3_mi2s_clk_count == 0)
+ snd_soc_dai_set_sysclk(cpu,
+ Q6AFE_LPASS_CLK_ID_INT3_MI2S_IBIT,
+ 0, SNDRV_PCM_STREAM_PLAYBACK);
+
+ break;
+ default:
+ dev_err(rtd->dev, "%s: invalid dai id 0x%x\n", __func__,
+ cpu->id);
+ break;
+ }
+}
+
+static const struct snd_soc_ops sdm660_ops = {
+ .startup = snd_sdm660_startup,
+ .shutdown = snd_sdm660_shutdown,
+};
+
+static int sdm660_be_hw_params_fixup(struct snd_soc_pcm_runtime *rtd,
+ struct snd_pcm_hw_params *params)
+{
+ struct snd_interval *rate = hw_param_interval(params,
+ SNDRV_PCM_HW_PARAM_RATE);
+ struct snd_interval *channels = hw_param_interval(params,
+ SNDRV_PCM_HW_PARAM_CHANNELS);
+ struct snd_mask *fmt = hw_param_mask(params, SNDRV_PCM_HW_PARAM_FORMAT);
+
+ rate->min = rate->max = DEFAULT_SAMPLE_RATE_48K;
+ snd_mask_set_format(fmt, SNDRV_PCM_FORMAT_S16_LE);
+
+ channels->min = channels->max = 2;
+
+ return 0;
+}
+
+static int sdm660_dai_init(struct snd_soc_pcm_runtime *rtd)
+{
+ struct snd_soc_card *card = rtd->card;
+ struct sdm660_snd_data *data = snd_soc_card_get_drvdata(card);
+
+ return qcom_snd_wcd_jack_setup(rtd, &data->jack, &data->jack_setup);
+}
+
+static void snd_sdm660_add_ops(struct snd_soc_card *card)
+{
+ struct snd_soc_dai_link *link;
+ int i;
+
+ for_each_card_prelinks(card, i, link) {
+ if (link->no_pcm == 1) {
+ link->ops = &sdm660_ops;
+ link->be_hw_params_fixup = sdm660_be_hw_params_fixup;
+ }
+
+ link->init = sdm660_dai_init;
+ }
+}
+
+static int snd_sdm660_probe(struct platform_device *pdev)
+{
+ struct snd_soc_card *card;
+ struct sdm660_snd_data *data;
+ struct device *dev = &pdev->dev;
+ int ret;
+
+ card = devm_kzalloc(dev, sizeof(struct snd_soc_card), GFP_KERNEL);
+ if (!card)
+ return -ENOMEM;
+
+ data = devm_kzalloc(dev, sizeof(struct sdm660_snd_data), GFP_KERNEL);
+ if (!card)
+ return -ENOMEM;
+
+ card->driver_name = "sdm660";
+ card->dev = dev;
+ card->owner = THIS_MODULE;
+
+ ret = qcom_snd_parse_of(card);
+ if (ret)
+ return ret;
+
+ snd_soc_card_set_drvdata(card, data);
+
+ snd_sdm660_add_ops(card);
+
+ return devm_snd_soc_register_card(dev, card);
+}
+
+static const struct of_device_id snd_sdm660_device_id[] = {
+ { .compatible = "qcom,sdm660-sndcard", },
+ { }
+};
+MODULE_DEVICE_TABLE(of, snd_sdm660_device_id);
+
+static struct platform_driver snd_sdm660_driver = {
+ .probe = snd_sdm660_probe,
+ .driver = {
+ .name = "sdm660-sndcard",
+ .of_match_table = snd_sdm660_device_id,
+ .pm = &snd_soc_pm_ops,
+ },
+};
+module_platform_driver(snd_sdm660_driver);
+
+MODULE_DESCRIPTION("sdm660 ASoC Machine Driver");
+MODULE_LICENSE("GPL");
--
2.53.0
^ permalink raw reply related [flat|nested] 17+ messages in thread
* [PATCH v2 11/11] ASoC: msm8916-wcd-analog: add quirk for cajon 2.0
2026-03-04 19:58 [PATCH v2 00/11] SDM660 sound card and internal MI2S support Richard Acayan
` (9 preceding siblings ...)
2026-03-04 19:58 ` [PATCH v2 10/11] ASoC: qcom: add sdm660 sound card support Richard Acayan
@ 2026-03-04 19:58 ` Richard Acayan
2026-03-05 10:07 ` Stephan Gerhold
10 siblings, 1 reply; 17+ messages in thread
From: Richard Acayan @ 2026-03-04 19:58 UTC (permalink / raw)
To: Srinivas Kandagatla, Liam Girdwood, Mark Brown, Rob Herring,
Krzysztof Kozlowski, Conor Dooley, Jaroslav Kysela, Takashi Iwai,
Konrad Dybcio, linux-arm-msm, linux-sound, devicetree
Cc: Nickolay Goppen, Wesley Cheng, Greg Kroah-Hartman, Johan Hovold,
Kees Cook, Charles Keepax, Kuninori Morimoto, Richard Acayan
The codec version CAJON_2_0 on the Snapdragon 670 requires touching the
HPH test registers. Add the quirk so this driver can also support
SDM670.
Signed-off-by: Richard Acayan <mailingradian@gmail.com>
---
sound/soc/codecs/msm8916-wcd-analog.c | 63 ++++++++++++++++++++++++++-
1 file changed, 61 insertions(+), 2 deletions(-)
diff --git a/sound/soc/codecs/msm8916-wcd-analog.c b/sound/soc/codecs/msm8916-wcd-analog.c
index 9ca381812975..6fe111e6d686 100644
--- a/sound/soc/codecs/msm8916-wcd-analog.c
+++ b/sound/soc/codecs/msm8916-wcd-analog.c
@@ -217,9 +217,11 @@
#define CDC_A_RX_HPH_BIAS_LDO_OCP (0xf195)
#define CDC_A_RX_HPH_BIAS_CNP (0xf196)
#define CDC_A_RX_HPH_CNP_EN (0xf197)
+#define CDC_A_RX_HPH_L_TEST (0xf19A)
#define CDC_A_RX_HPH_L_PA_DAC_CTL (0xf19B)
#define RX_HPA_L_PA_DAC_CTL_DATA_RESET_MASK BIT(1)
#define RX_HPA_L_PA_DAC_CTL_DATA_RESET_RESET BIT(1)
+#define CDC_A_RX_HPH_R_TEST (0xf19C)
#define CDC_A_RX_HPH_R_PA_DAC_CTL (0xf19D)
#define RX_HPH_R_PA_DAC_CTL_DATA_RESET BIT(1)
#define RX_HPH_R_PA_DAC_CTL_DATA_RESET_MASK BIT(1)
@@ -696,6 +698,59 @@ static int pm8916_wcd_analog_enable_ear_pa(struct snd_soc_dapm_widget *w,
return 0;
}
+static int pm8916_wcd_analog_enable_hphl_pa(struct snd_soc_dapm_widget *w,
+ struct snd_kcontrol *kcontrol,
+ int event)
+{
+ struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm);
+ struct pm8916_wcd_analog_priv *priv = dev_get_drvdata(component->dev);
+
+ /* This quirk is not required for revisions prior to CAJON_2_0 */
+ if (priv->codec_version < 4)
+ return 0;
+
+ switch (event) {
+ case SND_SOC_DAPM_POST_PMU:
+ usleep_range(7000, 7100);
+ snd_soc_component_update_bits(component, CDC_A_RX_HPH_L_TEST,
+ 0x04, 0x04);
+ break;
+ case SND_SOC_DAPM_POST_PMD:
+ /* wait 20 ms after the digital codec has powered down */
+ msleep(20);
+ snd_soc_component_update_bits(component, CDC_A_RX_HPH_L_TEST,
+ 0x04, 0x00);
+ break;
+ }
+ return 0;
+}
+
+static int pm8916_wcd_analog_enable_hphr_pa(struct snd_soc_dapm_widget *w,
+ struct snd_kcontrol *kcontrol,
+ int event)
+{
+ struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm);
+ struct pm8916_wcd_analog_priv *priv = dev_get_drvdata(component->dev);
+
+ /* This quirk is not required for revisions prior to CAJON_2_0 */
+ if (priv->codec_version < 4)
+ return 0;
+
+ switch (event) {
+ case SND_SOC_DAPM_POST_PMU:
+ usleep_range(7000, 7100);
+ snd_soc_component_update_bits(component, CDC_A_RX_HPH_R_TEST,
+ 0x04, 0x04);
+ break;
+ case SND_SOC_DAPM_POST_PMD:
+ msleep(20);
+ snd_soc_component_update_bits(component, CDC_A_RX_HPH_R_TEST,
+ 0x04, 0x00);
+ break;
+ }
+ return 0;
+}
+
static const struct reg_default wcd_reg_defaults_2_0[] = {
{CDC_A_RX_COM_OCP_CTL, 0xD1},
{CDC_A_RX_COM_OCP_COUNT, 0xFF},
@@ -883,11 +938,15 @@ static const struct snd_soc_dapm_widget pm8916_wcd_analog_dapm_widgets[] = {
SND_SOC_DAPM_MUX("EAR_S", SND_SOC_NOPM, 0, 0, &ear_mux),
SND_SOC_DAPM_SUPPLY("EAR CP", CDC_A_NCP_EN, 4, 0, NULL, 0),
- SND_SOC_DAPM_PGA("HPHL PA", CDC_A_RX_HPH_CNP_EN, 5, 0, NULL, 0),
+ SND_SOC_DAPM_PGA_E("HPHL PA", CDC_A_RX_HPH_CNP_EN, 5, 0, NULL, 0,
+ pm8916_wcd_analog_enable_hphl_pa,
+ SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_POST_PMD),
SND_SOC_DAPM_MUX("HPHL", SND_SOC_NOPM, 0, 0, &hphl_mux),
SND_SOC_DAPM_MIXER("HPHL DAC", CDC_A_RX_HPH_L_PA_DAC_CTL, 3, 0, NULL,
0),
- SND_SOC_DAPM_PGA("HPHR PA", CDC_A_RX_HPH_CNP_EN, 4, 0, NULL, 0),
+ SND_SOC_DAPM_PGA_E("HPHR PA", CDC_A_RX_HPH_CNP_EN, 4, 0, NULL, 0,
+ pm8916_wcd_analog_enable_hphr_pa,
+ SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_POST_PMD),
SND_SOC_DAPM_MUX("HPHR", SND_SOC_NOPM, 0, 0, &hphr_mux),
SND_SOC_DAPM_MIXER("HPHR DAC", CDC_A_RX_HPH_R_PA_DAC_CTL, 3, 0, NULL,
0),
--
2.53.0
^ permalink raw reply related [flat|nested] 17+ messages in thread
* Re: [PATCH v2 10/11] ASoC: qcom: add sdm660 sound card support
2026-03-04 19:58 ` [PATCH v2 10/11] ASoC: qcom: add sdm660 sound card support Richard Acayan
@ 2026-03-05 7:51 ` Krzysztof Kozlowski
0 siblings, 0 replies; 17+ messages in thread
From: Krzysztof Kozlowski @ 2026-03-05 7:51 UTC (permalink / raw)
To: Richard Acayan
Cc: Srinivas Kandagatla, Liam Girdwood, Mark Brown, Rob Herring,
Krzysztof Kozlowski, Conor Dooley, Jaroslav Kysela, Takashi Iwai,
Konrad Dybcio, linux-arm-msm, linux-sound, devicetree,
Nickolay Goppen, Wesley Cheng, Greg Kroah-Hartman, Johan Hovold,
Kees Cook, Charles Keepax, Kuninori Morimoto
On Wed, Mar 04, 2026 at 02:58:14PM -0500, Richard Acayan wrote:
> The Snapdragon 670 and Snapdragon 660 share the sound card, which can
> have digital/analog WCD, WCD9335, WCD934X, or board-specific sound
> codecs. Add support for the sound card.
>
> Signed-off-by: Richard Acayan <mailingradian@gmail.com>
> ---
> sound/soc/qcom/Kconfig | 12 +++
> sound/soc/qcom/Makefile | 2 +
> sound/soc/qcom/sdm660.c | 192 ++++++++++++++++++++++++++++++++++++++++
> 3 files changed, 206 insertions(+)
> create mode 100644 sound/soc/qcom/sdm660.c
>
> diff --git a/sound/soc/qcom/Kconfig b/sound/soc/qcom/Kconfig
> index e6e24f3b9922..2ef4c436e534 100644
> --- a/sound/soc/qcom/Kconfig
> +++ b/sound/soc/qcom/Kconfig
> @@ -167,6 +167,18 @@ config SND_SOC_MSM8996
> APQ8096 SoC-based systems.
> Say Y if you want to use audio device on this SoCs
>
> +config SND_SOC_SDM660
> + tristate "SoC Machine driver for SDM660 and SDM670 boards"
> + depends on QCOM_APR
> + depends on OF
> + depends on PM
> + select SND_SOC_QDSP6
> + select SND_SOC_QCOM_COMMON
> + help
> + This adds support for audio on Qualcomm Technologies Inc.
> + SDM660 and SDM670 SoC-based systems.
> + Say Y if you want to use audio devices on these SoCs.
> +
> config SND_SOC_SDM845
> tristate "SoC Machine driver for SDM845 boards"
> depends on QCOM_APR && I2C && SOUNDWIRE
> diff --git a/sound/soc/qcom/Makefile b/sound/soc/qcom/Makefile
> index 985ce2ae286b..8b6bdc19e780 100644
> --- a/sound/soc/qcom/Makefile
> +++ b/sound/soc/qcom/Makefile
> @@ -24,6 +24,7 @@ snd-soc-apq8016-sbc-y := apq8016_sbc.o
> snd-soc-apq8096-y := apq8096.o
> snd-soc-sc7180-y := sc7180.o
> snd-soc-sc7280-y := sc7280.o
> +snd-soc-sdm660-y := sdm660.o
> snd-soc-sdm845-y := sdm845.o
> snd-soc-sm8250-y := sm8250.o
> snd-soc-sc8280xp-y := sc8280xp.o
> @@ -38,6 +39,7 @@ obj-$(CONFIG_SND_SOC_MSM8996) += snd-soc-apq8096.o
> obj-$(CONFIG_SND_SOC_SC7180) += snd-soc-sc7180.o
> obj-$(CONFIG_SND_SOC_SC7280) += snd-soc-sc7280.o
> obj-$(CONFIG_SND_SOC_SC8280XP) += snd-soc-sc8280xp.o
> +obj-$(CONFIG_SND_SOC_SDM660) += snd-soc-sdm660.o
> obj-$(CONFIG_SND_SOC_SDM845) += snd-soc-sdm845.o
> obj-$(CONFIG_SND_SOC_SM8250) += snd-soc-sm8250.o
> obj-$(CONFIG_SND_SOC_QCOM_COMMON) += snd-soc-qcom-common.o
> diff --git a/sound/soc/qcom/sdm660.c b/sound/soc/qcom/sdm660.c
> new file mode 100644
> index 000000000000..8dae01b733dd
> --- /dev/null
> +++ b/sound/soc/qcom/sdm660.c
> @@ -0,0 +1,192 @@
> +// SPDX-License-Identifier: GPL-2.0-only
> +/*
> + * Copyright (c) 2015-2020, The Linux Foundation. All rights reserved.
Don't upstream 10 year old code, but take newest drivers and change them
to match your needs. Look here:
...
> +static int snd_sdm660_probe(struct platform_device *pdev)
> +{
> + struct snd_soc_card *card;
> + struct sdm660_snd_data *data;
> + struct device *dev = &pdev->dev;
> + int ret;
> +
> + card = devm_kzalloc(dev, sizeof(struct snd_soc_card), GFP_KERNEL);
> + if (!card)
> + return -ENOMEM;
> +
> + data = devm_kzalloc(dev, sizeof(struct sdm660_snd_data), GFP_KERNEL);
This is not the syntax we have. For like 10 years.
It is always sizeof(*).
Best regards,
Krzysztof
^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [PATCH v2 01/11] ASoC: dt-bindings: qcom,sm8250: add compatible for sdm660
2026-03-04 19:58 ` [PATCH v2 01/11] ASoC: dt-bindings: qcom,sm8250: add compatible for sdm660 Richard Acayan
@ 2026-03-05 7:52 ` Krzysztof Kozlowski
0 siblings, 0 replies; 17+ messages in thread
From: Krzysztof Kozlowski @ 2026-03-05 7:52 UTC (permalink / raw)
To: Richard Acayan
Cc: Srinivas Kandagatla, Liam Girdwood, Mark Brown, Rob Herring,
Krzysztof Kozlowski, Conor Dooley, Jaroslav Kysela, Takashi Iwai,
Konrad Dybcio, linux-arm-msm, linux-sound, devicetree,
Nickolay Goppen, Wesley Cheng, Greg Kroah-Hartman, Johan Hovold,
Kees Cook, Charles Keepax, Kuninori Morimoto
On Wed, Mar 04, 2026 at 02:58:05PM -0500, Richard Acayan wrote:
> From: Nickolay Goppen <setotau@mainlining.org>
>
> Add compatibles for sdm660 based soundcards.
>
> Signed-off-by: Nickolay Goppen <setotau@mainlining.org>
Incomplete DCO.
Best regards,
Krzysztof
^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [PATCH v2 02/11] ASoC: dt-bindings: qcom: q6dsp: add internal mi2s support
2026-03-04 19:58 ` [PATCH v2 02/11] ASoC: dt-bindings: qcom: q6dsp: add internal mi2s support Richard Acayan
@ 2026-03-05 7:57 ` Krzysztof Kozlowski
0 siblings, 0 replies; 17+ messages in thread
From: Krzysztof Kozlowski @ 2026-03-05 7:57 UTC (permalink / raw)
To: Richard Acayan
Cc: Srinivas Kandagatla, Liam Girdwood, Mark Brown, Rob Herring,
Krzysztof Kozlowski, Conor Dooley, Jaroslav Kysela, Takashi Iwai,
Konrad Dybcio, linux-arm-msm, linux-sound, devicetree,
Nickolay Goppen, Wesley Cheng, Greg Kroah-Hartman, Johan Hovold,
Kees Cook, Charles Keepax, Kuninori Morimoto
On Wed, Mar 04, 2026 at 02:58:06PM -0500, Richard Acayan wrote:
> then:
> required:
> - qcom,sd-lines
> diff --git a/include/dt-bindings/sound/qcom,q6dsp-lpass-ports.h b/include/dt-bindings/sound/qcom,q6dsp-lpass-ports.h
> index 6d1ce7f5da51..6753f7bf004b 100644
> --- a/include/dt-bindings/sound/qcom,q6dsp-lpass-ports.h
> +++ b/include/dt-bindings/sound/qcom,q6dsp-lpass-ports.h
> @@ -140,6 +140,20 @@
> #define DISPLAY_PORT_RX_6 134
> #define DISPLAY_PORT_RX_7 135
> #define USB_RX 136
> +#define INT0_MI2S_RX 137
> +#define INT0_MI2S_TX 138
> +#define INT1_MI2S_RX 139
> +#define INT1_MI2S_TX 140
> +#define INT2_MI2S_RX 141
> +#define INT2_MI2S_TX 142
> +#define INT3_MI2S_RX 143
> +#define INT3_MI2S_TX 144
> +#define INT4_MI2S_RX 145
> +#define INT4_MI2S_TX 146
> +#define INT5_MI2S_RX 147
> +#define INT5_MI2S_TX 148
> +#define INT6_MI2S_RX 149
> +#define INT6_MI2S_TX 150
This conflicts with Srini's patches and looks pretty the same. Please
look at his patches and avoid re-doing them.
>
> #define LPASS_CLK_ID_PRI_MI2S_IBIT 1
> #define LPASS_CLK_ID_PRI_MI2S_EBIT 2
> --
> 2.53.0
>
^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [PATCH v2 05/11] ASoC: qdsp6: q6dsp-lpass-ports: add internal mi2s support
2026-03-04 19:58 ` [PATCH v2 05/11] ASoC: qdsp6: q6dsp-lpass-ports: add internal mi2s support Richard Acayan
@ 2026-03-05 7:59 ` Krzysztof Kozlowski
0 siblings, 0 replies; 17+ messages in thread
From: Krzysztof Kozlowski @ 2026-03-05 7:59 UTC (permalink / raw)
To: Richard Acayan
Cc: Srinivas Kandagatla, Liam Girdwood, Mark Brown, Rob Herring,
Krzysztof Kozlowski, Conor Dooley, Jaroslav Kysela, Takashi Iwai,
Konrad Dybcio, linux-arm-msm, linux-sound, devicetree,
Nickolay Goppen, Wesley Cheng, Greg Kroah-Hartman, Johan Hovold,
Kees Cook, Charles Keepax, Kuninori Morimoto
On Wed, Mar 04, 2026 at 02:58:09PM -0500, Richard Acayan wrote:
> Add the internal MI2S stream capabilities as specified by the audio
> kernel modules and configure the ports as MI2S ports.
>
> Link: https://android.googlesource.com/kernel/msm-extra/+/530cffa4cc977a348753831b163eb9d3302b954a/asoc/msm-dai-q6-v2.c#4597
> Signed-off-by: Richard Acayan <mailingradian@gmail.com>
> ---
> sound/soc/qcom/qdsp6/q6dsp-lpass-ports.c | 200 +++++++++++++++++++++++
> 1 file changed, 200 insertions(+)
>
This duplicates Srini's patches.
Best regards,
Krzysztof
^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [PATCH v2 11/11] ASoC: msm8916-wcd-analog: add quirk for cajon 2.0
2026-03-04 19:58 ` [PATCH v2 11/11] ASoC: msm8916-wcd-analog: add quirk for cajon 2.0 Richard Acayan
@ 2026-03-05 10:07 ` Stephan Gerhold
0 siblings, 0 replies; 17+ messages in thread
From: Stephan Gerhold @ 2026-03-05 10:07 UTC (permalink / raw)
To: Richard Acayan
Cc: Srinivas Kandagatla, Liam Girdwood, Mark Brown, Rob Herring,
Krzysztof Kozlowski, Conor Dooley, Jaroslav Kysela, Takashi Iwai,
Konrad Dybcio, linux-arm-msm, linux-sound, devicetree,
Nickolay Goppen, Wesley Cheng, Greg Kroah-Hartman, Johan Hovold,
Kees Cook, Charles Keepax, Kuninori Morimoto
On Wed, Mar 04, 2026 at 02:58:15PM -0500, Richard Acayan wrote:
> The codec version CAJON_2_0 on the Snapdragon 670 requires touching the
> HPH test registers. Add the quirk so this driver can also support
> SDM670.
>
> Signed-off-by: Richard Acayan <mailingradian@gmail.com>
> ---
> sound/soc/codecs/msm8916-wcd-analog.c | 63 ++++++++++++++++++++++++++-
> 1 file changed, 61 insertions(+), 2 deletions(-)
>
I think you need some more changes in this driver to support CAJON_2_0
properly. Specifically, the initial register settings are different from
what is currently in the driver (wcd_reg_defaults_2_0). There was a
patch for this [1] (later [2]), but it doesn't look like it was
merged/finished up.
[1]: https://lore.kernel.org/linux-arm-msm/20240727182031.35069-3-a39.skl@gmail.com/
[2]: https://lore.kernel.org/linux-arm-msm/20240731-msm8953-msm8976-asoc-v3-4-163f23c3a28d@gmail.com/
Thanks,
Stephan
^ permalink raw reply [flat|nested] 17+ messages in thread
end of thread, other threads:[~2026-03-05 10:07 UTC | newest]
Thread overview: 17+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-03-04 19:58 [PATCH v2 00/11] SDM660 sound card and internal MI2S support Richard Acayan
2026-03-04 19:58 ` [PATCH v2 01/11] ASoC: dt-bindings: qcom,sm8250: add compatible for sdm660 Richard Acayan
2026-03-05 7:52 ` Krzysztof Kozlowski
2026-03-04 19:58 ` [PATCH v2 02/11] ASoC: dt-bindings: qcom: q6dsp: add internal mi2s support Richard Acayan
2026-03-05 7:57 ` Krzysztof Kozlowski
2026-03-04 19:58 ` [PATCH v2 03/11] ASoC: dt-bindings: pm8916-analog-codec: Add PM660L compatible Richard Acayan
2026-03-04 19:58 ` [PATCH v2 04/11] ASoC: dt-bindings: msm8916-digital-codec: Add SDM660 compatible Richard Acayan
2026-03-04 19:58 ` [PATCH v2 05/11] ASoC: qdsp6: q6dsp-lpass-ports: add internal mi2s support Richard Acayan
2026-03-05 7:59 ` Krzysztof Kozlowski
2026-03-04 19:58 ` [PATCH v2 06/11] ASoC: qdsp6: q6afe: " Richard Acayan
2026-03-04 19:58 ` [PATCH v2 07/11] ASoC: qdsp6: q6afe-dai: " Richard Acayan
2026-03-04 19:58 ` [PATCH v2 08/11] ASoC: qdsp6: q6routing: " Richard Acayan
2026-03-04 19:58 ` [PATCH v2 09/11] ASoC: qdsp6: common: support headphone jacks connected to internal mi2s Richard Acayan
2026-03-04 19:58 ` [PATCH v2 10/11] ASoC: qcom: add sdm660 sound card support Richard Acayan
2026-03-05 7:51 ` Krzysztof Kozlowski
2026-03-04 19:58 ` [PATCH v2 11/11] ASoC: msm8916-wcd-analog: add quirk for cajon 2.0 Richard Acayan
2026-03-05 10:07 ` Stephan Gerhold
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox