History

ASoC: qcom: q6dsp: Add Senary MI2S audio interface support

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.

Mohammad Rafi Shaik committed 7 months ago

Commit ae0de4e1 parent bcd0df13 files · +43 −0Browse files

Unified · Split

3 files
  1. sound/soc/qcom/qdsp6/q6afe-dai.c +6 −0
  2. sound/soc/qcom/qdsp6/q6afe.c +8 −0
  3. sound/soc/qcom/qdsp6/q6dsp-lpass-ports.c +29 −0
sound/soc/qcom/qdsp6/q6afe-dai.c+6−0
@@ -409,6 +409,7 @@ static int q6afe_dai_prepare(struct snd_pcm_substream *substream, · 408 unmodified lines
409 q6afe_slim_port_prepare(dai_data->port[dai->id],409 q6afe_slim_port_prepare(dai_data->port[dai->id],
410 &dai_data->port_config[dai->id].slim);410 &dai_data->port_config[dai->id].slim);
411 break;411 break;
412 case SENARY_MI2S_RX ... SENARY_MI2S_TX:
412 case QUINARY_MI2S_RX ... QUINARY_MI2S_TX:413 case QUINARY_MI2S_RX ... QUINARY_MI2S_TX:
413 case PRIMARY_MI2S_RX ... QUATERNARY_MI2S_TX:414 case PRIMARY_MI2S_RX ... QUATERNARY_MI2S_TX:
414 rc = q6afe_i2s_port_prepare(dai_data->port[dai->id],415 rc = q6afe_i2s_port_prepare(dai_data->port[dai->id],
@@ -540,6 +541,7 @@ static const struct snd_soc_dapm_route q6afe_dapm_routes[] = { · 125 unmodified lines
540 {"Tertiary MI2S Playback", NULL, "TERT_MI2S_RX"},541 {"Tertiary MI2S Playback", NULL, "TERT_MI2S_RX"},
541 {"Quaternary MI2S Playback", NULL, "QUAT_MI2S_RX"},542 {"Quaternary MI2S Playback", NULL, "QUAT_MI2S_RX"},
542 {"Quinary MI2S Playback", NULL, "QUIN_MI2S_RX"},543 {"Quinary MI2S Playback", NULL, "QUIN_MI2S_RX"},
544 {"Senary MI2S Playback", NULL, "SEN_MI2S_RX"},
543 545
544 {"Primary TDM0 Playback", NULL, "PRIMARY_TDM_RX_0"},546 {"Primary TDM0 Playback", NULL, "PRIMARY_TDM_RX_0"},
545 {"Primary TDM1 Playback", NULL, "PRIMARY_TDM_RX_1"},547 {"Primary TDM1 Playback", NULL, "PRIMARY_TDM_RX_1"},
@@ -636,6 +638,7 @@ static const struct snd_soc_dapm_route q6afe_dapm_routes[] = { · 90 unmodified lines
636 {"SEC_MI2S_TX", NULL, "Secondary MI2S Capture"},638 {"SEC_MI2S_TX", NULL, "Secondary MI2S Capture"},
637 {"QUAT_MI2S_TX", NULL, "Quaternary MI2S Capture"},639 {"QUAT_MI2S_TX", NULL, "Quaternary MI2S Capture"},
638 {"QUIN_MI2S_TX", NULL, "Quinary MI2S Capture"},640 {"QUIN_MI2S_TX", NULL, "Quinary MI2S Capture"},
641 {"SEN_MI2S_TX", NULL, "Senary MI2S Capture"},
639 642
640 {"WSA_CODEC_DMA_RX_0 Playback", NULL, "WSA_CODEC_DMA_RX_0"},643 {"WSA_CODEC_DMA_RX_0 Playback", NULL, "WSA_CODEC_DMA_RX_0"},
641 {"WSA_CODEC_DMA_TX_0", NULL, "WSA_CODEC_DMA_TX_0 Capture"},644 {"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[] = { · 128 unmodified lines
770 SND_SOC_DAPM_AIF_OUT("SLIMBUS_4_TX", NULL, 0, SND_SOC_NOPM, 0, 0),773 SND_SOC_DAPM_AIF_OUT("SLIMBUS_4_TX", NULL, 0, SND_SOC_NOPM, 0, 0),
771 SND_SOC_DAPM_AIF_OUT("SLIMBUS_5_TX", NULL, 0, SND_SOC_NOPM, 0, 0),774 SND_SOC_DAPM_AIF_OUT("SLIMBUS_5_TX", NULL, 0, SND_SOC_NOPM, 0, 0),
772 SND_SOC_DAPM_AIF_OUT("SLIMBUS_6_TX", NULL, 0, SND_SOC_NOPM, 0, 0),775 SND_SOC_DAPM_AIF_OUT("SLIMBUS_6_TX", NULL, 0, SND_SOC_NOPM, 0, 0),
776 SND_SOC_DAPM_AIF_IN("SEN_MI2S_RX", NULL, 0, SND_SOC_NOPM, 0, 0),
777 SND_SOC_DAPM_AIF_OUT("SEN_MI2S_TX", NULL, 0, SND_SOC_NOPM, 0, 0),
773 SND_SOC_DAPM_AIF_IN("QUIN_MI2S_RX", NULL,778 SND_SOC_DAPM_AIF_IN("QUIN_MI2S_RX", NULL,
774 0, SND_SOC_NOPM, 0, 0),779 0, SND_SOC_NOPM, 0, 0),
775 SND_SOC_DAPM_AIF_OUT("QUIN_MI2S_TX", NULL,780 SND_SOC_DAPM_AIF_OUT("QUIN_MI2S_TX", NULL,
@@ -1037,6 +1042,7 @@ static void of_q6afe_parse_dai_data(struct device *dev, · 261 unmodified lines
1037 1042
1038 switch (id) {1043 switch (id) {
1039 /* MI2S specific properties */1044 /* MI2S specific properties */
1045 case SENARY_MI2S_RX ... SENARY_MI2S_TX:
1040 case QUINARY_MI2S_RX ... QUINARY_MI2S_TX:1046 case QUINARY_MI2S_RX ... QUINARY_MI2S_TX:
1041 case PRIMARY_MI2S_RX ... QUATERNARY_MI2S_TX:1047 case PRIMARY_MI2S_RX ... QUATERNARY_MI2S_TX:
1042 priv = &data->priv[id];1048 priv = &data->priv[id];
sound/soc/qcom/qdsp6/q6afe.c+8−0
@@ -130,6 +130,8 @@ · 129 unmodified lines
130#define AFE_PORT_ID_QUATERNARY_MI2S_TX 0x1007130#define AFE_PORT_ID_QUATERNARY_MI2S_TX 0x1007
131#define AFE_PORT_ID_QUINARY_MI2S_RX 0x1016131#define AFE_PORT_ID_QUINARY_MI2S_RX 0x1016
132#define AFE_PORT_ID_QUINARY_MI2S_TX 0x1017132#define AFE_PORT_ID_QUINARY_MI2S_TX 0x1017
133#define AFE_PORT_ID_SENARY_MI2S_RX 0x1018
134#define AFE_PORT_ID_SENARY_MI2S_TX 0x1019
133 135
134/* Start of the range of port IDs for TDM devices. */136/* Start of the range of port IDs for TDM devices. */
135#define AFE_PORT_ID_TDM_PORT_RANGE_START 0x9000137#define AFE_PORT_ID_TDM_PORT_RANGE_START 0x9000
@@ -718,6 +720,10 @@ static struct afe_port_map port_maps[AFE_PORT_MAX] = { · 582 unmodified lines
718 QUINARY_MI2S_RX, 1, 1},720 QUINARY_MI2S_RX, 1, 1},
719 [QUINARY_MI2S_TX] = { AFE_PORT_ID_QUINARY_MI2S_TX,721 [QUINARY_MI2S_TX] = { AFE_PORT_ID_QUINARY_MI2S_TX,
720 QUINARY_MI2S_TX, 0, 1},722 QUINARY_MI2S_TX, 0, 1},
723 [SENARY_MI2S_RX] = { AFE_PORT_ID_SENARY_MI2S_RX,
724 SENARY_MI2S_RX, 1, 1},
725 [SENARY_MI2S_TX] = { AFE_PORT_ID_SENARY_MI2S_TX,
726 SENARY_MI2S_TX, 0, 1},
721 [PRIMARY_TDM_RX_0] = { AFE_PORT_ID_PRIMARY_TDM_RX,727 [PRIMARY_TDM_RX_0] = { AFE_PORT_ID_PRIMARY_TDM_RX,
722 PRIMARY_TDM_RX_0, 1, 1},728 PRIMARY_TDM_RX_0, 1, 1},
723 [PRIMARY_TDM_TX_0] = { AFE_PORT_ID_PRIMARY_TDM_TX,729 [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) · 1053 unmodified lines
1777 case AFE_PORT_ID_QUATERNARY_MI2S_TX:1783 case AFE_PORT_ID_QUATERNARY_MI2S_TX:
1778 case AFE_PORT_ID_QUINARY_MI2S_RX:1784 case AFE_PORT_ID_QUINARY_MI2S_RX:
1779 case AFE_PORT_ID_QUINARY_MI2S_TX:1785 case AFE_PORT_ID_QUINARY_MI2S_TX:
1786 case AFE_PORT_ID_SENARY_MI2S_RX:
1787 case AFE_PORT_ID_SENARY_MI2S_TX:
1780 cfg_type = AFE_PARAM_ID_I2S_CONFIG;1788 cfg_type = AFE_PARAM_ID_I2S_CONFIG;
1781 break;1789 break;
1782 case AFE_PORT_ID_PRIMARY_TDM_RX ... AFE_PORT_ID_QUINARY_TDM_TX_7:1790 case AFE_PORT_ID_PRIMARY_TDM_RX ... AFE_PORT_ID_QUINARY_TDM_TX_7:
sound/soc/qcom/qdsp6/q6dsp-lpass-ports.c+29−0
@@ -519,6 +519,34 @@ static struct snd_soc_dai_driver q6dsp_audio_fe_dais[] = { · 518 unmodified lines
519 },519 },
520 .id = QUINARY_MI2S_TX,520 .id = QUINARY_MI2S_TX,
521 .name = "QUIN_MI2S_TX",521 .name = "QUIN_MI2S_TX",
522 }, {
523 .playback = {
524 .stream_name = "Senary MI2S Playback",
525 .rates = SNDRV_PCM_RATE_8000_192000,
526 .formats = SNDRV_PCM_FMTBIT_S16_LE |
527 SNDRV_PCM_FMTBIT_S24_LE |
528 SNDRV_PCM_FMTBIT_S32_LE,
529 .channels_min = 1,
530 .channels_max = 8,
531 .rate_min = 8000,
532 .rate_max = 192000,
533 },
534 .id = SENARY_MI2S_RX,
535 .name = "SEN_MI2S_RX",
536 }, {
537 .capture = {
538 .stream_name = "Senary MI2S Capture",
539 .rates = SNDRV_PCM_RATE_8000_192000,
540 .formats = SNDRV_PCM_FMTBIT_S16_LE |
541 SNDRV_PCM_FMTBIT_S24_LE |
542 SNDRV_PCM_FMTBIT_S32_LE,
543 .channels_min = 1,
544 .channels_max = 8,
545 .rate_min = 8000,
546 .rate_max = 192000,
547 },
548 .id = SENARY_MI2S_TX,
549 .name = "SEN_MI2S_TX",
522 },550 },
523 Q6AFE_MI2S_RX_DAI("LPI RX0", LPI_MI2S_RX_0),551 Q6AFE_MI2S_RX_DAI("LPI RX0", LPI_MI2S_RX_0),
524 Q6AFE_MI2S_RX_DAI("LPI RX1", LPI_MI2S_RX_1),552 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, · 155 unmodified lines
680 case SLIMBUS_0_RX ... SLIMBUS_6_TX:708 case SLIMBUS_0_RX ... SLIMBUS_6_TX:
681 q6dsp_audio_fe_dais[i].ops = cfg->q6slim_ops;709 q6dsp_audio_fe_dais[i].ops = cfg->q6slim_ops;
682 break;710 break;
711 case SENARY_MI2S_RX ... SENARY_MI2S_TX:
683 case QUINARY_MI2S_RX ... QUINARY_MI2S_TX:712 case QUINARY_MI2S_RX ... QUINARY_MI2S_TX:
684 case PRIMARY_MI2S_RX ... QUATERNARY_MI2S_TX:713 case PRIMARY_MI2S_RX ... QUATERNARY_MI2S_TX:
685 case LPI_MI2S_RX_0 ... LPI_MI2S_TX_4:714 case LPI_MI2S_RX_0 ... LPI_MI2S_TX_4: