]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
ASoC: qcom: q6dsp: Add Senary MI2S audio interface support
authorMohammad Rafi Shaik <mohammad.rafi.shaik@oss.qualcomm.com>
Thu, 2 Apr 2026 08:11:14 +0000 (08:11 +0000)
committerMark Brown <broonie@kernel.org>
Thu, 2 Apr 2026 15:33:45 +0000 (16:33 +0100)
Introduces support for the Senary MI2S audio interface in the Qualcomm
q6dsp. Add new AFE port IDs for Senary MI2S RX and TX and include the
necessary mappings in the port configuration  to allow audio routing
over the Senary MI2S interface.

Signed-off-by: Mohammad Rafi Shaik <mohammad.rafi.shaik@oss.qualcomm.com>
Signed-off-by: Srinivas Kandagatla <srinivas.kandagatla@oss.qualcomm.com>
Tested-by: Val Packett <val@packett.cool> # sm7325-motorola-dubai
Link: https://patch.msgid.link/20260402081118.348071-10-srinivas.kandagatla@oss.qualcomm.com
Signed-off-by: Mark Brown <broonie@kernel.org>
sound/soc/qcom/qdsp6/q6afe-dai.c
sound/soc/qcom/qdsp6/q6afe.c
sound/soc/qcom/qdsp6/q6dsp-lpass-ports.c

index 0f47aadaabe171bcab42de260609b832557f74f5..a0d21034a6264d72ad65a25fc0195dd7f46a31aa 100644 (file)
@@ -409,6 +409,7 @@ static int q6afe_dai_prepare(struct snd_pcm_substream *substream,
                q6afe_slim_port_prepare(dai_data->port[dai->id],
                                        &dai_data->port_config[dai->id].slim);
                break;
+       case SENARY_MI2S_RX ... SENARY_MI2S_TX:
        case QUINARY_MI2S_RX ... QUINARY_MI2S_TX:
        case PRIMARY_MI2S_RX ... QUATERNARY_MI2S_TX:
                rc = q6afe_i2s_port_prepare(dai_data->port[dai->id],
@@ -540,6 +541,7 @@ static const struct snd_soc_dapm_route q6afe_dapm_routes[] = {
        {"Tertiary MI2S Playback", NULL, "TERT_MI2S_RX"},
        {"Quaternary MI2S Playback", NULL, "QUAT_MI2S_RX"},
        {"Quinary MI2S Playback", NULL, "QUIN_MI2S_RX"},
+       {"Senary MI2S Playback", NULL, "SEN_MI2S_RX"},
 
        {"Primary TDM0 Playback", NULL, "PRIMARY_TDM_RX_0"},
        {"Primary TDM1 Playback", NULL, "PRIMARY_TDM_RX_1"},
@@ -636,6 +638,7 @@ static const struct snd_soc_dapm_route q6afe_dapm_routes[] = {
        {"SEC_MI2S_TX", NULL, "Secondary MI2S Capture"},
        {"QUAT_MI2S_TX", NULL, "Quaternary MI2S Capture"},
        {"QUIN_MI2S_TX", NULL, "Quinary MI2S Capture"},
+       {"SEN_MI2S_TX", NULL, "Senary MI2S Capture"},
 
        {"WSA_CODEC_DMA_RX_0 Playback", NULL, "WSA_CODEC_DMA_RX_0"},
        {"WSA_CODEC_DMA_TX_0", NULL, "WSA_CODEC_DMA_TX_0 Capture"},
@@ -770,6 +773,8 @@ static const struct snd_soc_dapm_widget q6afe_dai_widgets[] = {
        SND_SOC_DAPM_AIF_OUT("SLIMBUS_4_TX", NULL, 0, SND_SOC_NOPM, 0, 0),
        SND_SOC_DAPM_AIF_OUT("SLIMBUS_5_TX", NULL, 0, SND_SOC_NOPM, 0, 0),
        SND_SOC_DAPM_AIF_OUT("SLIMBUS_6_TX", NULL, 0, SND_SOC_NOPM, 0, 0),
+       SND_SOC_DAPM_AIF_IN("SEN_MI2S_RX", NULL, 0, SND_SOC_NOPM, 0, 0),
+       SND_SOC_DAPM_AIF_OUT("SEN_MI2S_TX", NULL, 0, SND_SOC_NOPM, 0, 0),
        SND_SOC_DAPM_AIF_IN("QUIN_MI2S_RX", NULL,
                                                0, SND_SOC_NOPM, 0, 0),
        SND_SOC_DAPM_AIF_OUT("QUIN_MI2S_TX", NULL,
@@ -1037,6 +1042,7 @@ static void of_q6afe_parse_dai_data(struct device *dev,
 
                switch (id) {
                /* MI2S specific properties */
+               case SENARY_MI2S_RX ... SENARY_MI2S_TX:
                case QUINARY_MI2S_RX ... QUINARY_MI2S_TX:
                case PRIMARY_MI2S_RX ... QUATERNARY_MI2S_TX:
                        priv = &data->priv[id];
index 43d877322baee3119a858811ce3ebc13472289ff..40237267fda051b07043ff2a9437ab33aba18361 100644 (file)
 #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_SENARY_MI2S_RX          0x1018
+#define AFE_PORT_ID_SENARY_MI2S_TX          0x1019
 
 /* Start of the range of port IDs for TDM devices. */
 #define AFE_PORT_ID_TDM_PORT_RANGE_START       0x9000
@@ -718,6 +720,10 @@ static struct afe_port_map port_maps[AFE_PORT_MAX] = {
                                QUINARY_MI2S_RX, 1, 1},
        [QUINARY_MI2S_TX] =   { AFE_PORT_ID_QUINARY_MI2S_TX,
                                QUINARY_MI2S_TX, 0, 1},
+       [SENARY_MI2S_RX]  =  { AFE_PORT_ID_SENARY_MI2S_RX,
+                               SENARY_MI2S_RX, 1, 1},
+       [SENARY_MI2S_TX] =   { AFE_PORT_ID_SENARY_MI2S_TX,
+                               SENARY_MI2S_TX, 0, 1},
        [PRIMARY_TDM_RX_0] =  { AFE_PORT_ID_PRIMARY_TDM_RX,
                                PRIMARY_TDM_RX_0, 1, 1},
        [PRIMARY_TDM_TX_0] =  { AFE_PORT_ID_PRIMARY_TDM_TX,
@@ -1777,6 +1783,8 @@ 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_SENARY_MI2S_RX:
+       case AFE_PORT_ID_SENARY_MI2S_TX:
                cfg_type = AFE_PARAM_ID_I2S_CONFIG;
                break;
        case AFE_PORT_ID_PRIMARY_TDM_RX ... AFE_PORT_ID_QUINARY_TDM_TX_7:
index d31388ed3ccf9b231d93d247331ce023473a52a9..e5cd82f77b5520003ce597c6b70e71ad31965b04 100644 (file)
@@ -519,6 +519,34 @@ static struct snd_soc_dai_driver q6dsp_audio_fe_dais[] = {
                },
                .id = QUINARY_MI2S_TX,
                .name = "QUIN_MI2S_TX",
+       }, {
+               .playback = {
+                       .stream_name = "Senary MI2S Playback",
+                       .rates = SNDRV_PCM_RATE_8000_192000,
+                       .formats = SNDRV_PCM_FMTBIT_S16_LE |
+                                  SNDRV_PCM_FMTBIT_S24_LE |
+                                  SNDRV_PCM_FMTBIT_S32_LE,
+                       .channels_min = 1,
+                       .channels_max = 8,
+                       .rate_min =     8000,
+                       .rate_max =     192000,
+               },
+               .id = SENARY_MI2S_RX,
+               .name = "SEN_MI2S_RX",
+       }, {
+               .capture = {
+                       .stream_name = "Senary MI2S Capture",
+                       .rates = SNDRV_PCM_RATE_8000_192000,
+                       .formats = SNDRV_PCM_FMTBIT_S16_LE |
+                                  SNDRV_PCM_FMTBIT_S24_LE |
+                                  SNDRV_PCM_FMTBIT_S32_LE,
+                       .channels_min = 1,
+                       .channels_max = 8,
+                       .rate_min =     8000,
+                       .rate_max =     192000,
+               },
+               .id = SENARY_MI2S_TX,
+               .name = "SEN_MI2S_TX",
        },
        Q6AFE_MI2S_RX_DAI("LPI RX0", LPI_MI2S_RX_0),
        Q6AFE_MI2S_RX_DAI("LPI RX1", LPI_MI2S_RX_1),
@@ -680,6 +708,7 @@ struct snd_soc_dai_driver *q6dsp_audio_ports_set_config(struct device *dev,
                case SLIMBUS_0_RX ... SLIMBUS_6_TX:
                        q6dsp_audio_fe_dais[i].ops = cfg->q6slim_ops;
                        break;
+               case SENARY_MI2S_RX ... SENARY_MI2S_TX:
                case QUINARY_MI2S_RX ... QUINARY_MI2S_TX:
                case PRIMARY_MI2S_RX ... QUATERNARY_MI2S_TX:
                case LPI_MI2S_RX_0 ... LPI_MI2S_TX_4: