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.
Unified · Split
| @@ -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]; |
| @@ -130,6 +130,8 @@ · 129 unmodified lines | |||
| 130 | #define AFE_PORT_ID_QUATERNARY_MI2S_TX 0x1007 | 130 | #define AFE_PORT_ID_QUATERNARY_MI2S_TX 0x1007 |
| 131 | #define AFE_PORT_ID_QUINARY_MI2S_RX 0x1016 | 131 | #define AFE_PORT_ID_QUINARY_MI2S_RX 0x1016 |
| 132 | #define AFE_PORT_ID_QUINARY_MI2S_TX 0x1017 | 132 | #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 0x9000 | 137 | #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: |
| @@ -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: |