Merge series "ASoC: qdsp6: Add Quinary MI2S ports support" from Gabriel David <ultracoolguy@disroot.org>:
Various devices(such as the Motorola Moto G7 Power, codename ocean) use the Quinary MI2S ports for reproducing audio. Add support to them in kernel. Signed-off-by: Gabriel David <ultracoolguy@disroot.org> Gabriel David (4): ASoC: q6afe: dt-bindings: Add QUIN_MI2S_RX/TX ASoC: qdsp6: q6afe: Add Quinary MI2S ports ASoC: qdsp6: q6afe-dai: Add Quinary MI2S ports ASoC: qdsp6: q6routing: Add Quinary MI2S ports include/dt-bindings/sound/qcom,q6afe.h | 2 ++ sound/soc/qcom/qdsp6/q6afe-dai.c | 41 ++++++++++++++++++++++++++ sound/soc/qcom/qdsp6/q6afe.c | 8 +++++ sound/soc/qcom/qdsp6/q6afe.h | 2 +- sound/soc/qcom/qdsp6/q6routing.c | 11 +++++++ 5 files changed, 63 insertions(+), 1 deletion(-) --- As a warning, I'm currently the only tester of these patches. If that's gonna be a problem then I understand. -- 2.31.1
This commit is contained in:
commit
6fac124455
@ -129,6 +129,8 @@
|
||||
#define TX_CODEC_DMA_TX_5 124
|
||||
#define RX_CODEC_DMA_RX_6 125
|
||||
#define RX_CODEC_DMA_RX_7 126
|
||||
#define QUINARY_MI2S_RX 127
|
||||
#define QUINARY_MI2S_TX 128
|
||||
|
||||
#define LPASS_CLK_ID_PRI_MI2S_IBIT 1
|
||||
#define LPASS_CLK_ID_PRI_MI2S_EBIT 2
|
||||
|
@ -475,6 +475,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 QUINARY_MI2S_RX ... QUINARY_MI2S_TX:
|
||||
case PRIMARY_MI2S_RX ... QUATERNARY_MI2S_TX:
|
||||
rc = q6afe_i2s_port_prepare(dai_data->port[dai->id],
|
||||
&dai_data->port_config[dai->id].i2s_cfg);
|
||||
@ -598,6 +599,7 @@ static const struct snd_soc_dapm_route q6afe_dapm_routes[] = {
|
||||
{"Secondary MI2S Playback", NULL, "SEC_MI2S_RX"},
|
||||
{"Tertiary MI2S Playback", NULL, "TERT_MI2S_RX"},
|
||||
{"Quaternary MI2S Playback", NULL, "QUAT_MI2S_RX"},
|
||||
{"Quinary MI2S Playback", NULL, "QUIN_MI2S_RX"},
|
||||
|
||||
{"Primary TDM0 Playback", NULL, "PRIMARY_TDM_RX_0"},
|
||||
{"Primary TDM1 Playback", NULL, "PRIMARY_TDM_RX_1"},
|
||||
@ -693,6 +695,7 @@ static const struct snd_soc_dapm_route q6afe_dapm_routes[] = {
|
||||
{"PRI_MI2S_TX", NULL, "Primary MI2S Capture"},
|
||||
{"SEC_MI2S_TX", NULL, "Secondary MI2S Capture"},
|
||||
{"QUAT_MI2S_TX", NULL, "Quaternary MI2S Capture"},
|
||||
{"QUIN_MI2S_TX", NULL, "Quinary 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"},
|
||||
@ -1190,6 +1193,39 @@ static struct snd_soc_dai_driver q6afe_dais[] = {
|
||||
.ops = &q6i2s_ops,
|
||||
.probe = msm_dai_q6_dai_probe,
|
||||
.remove = msm_dai_q6_dai_remove,
|
||||
}, {
|
||||
.playback = {
|
||||
.stream_name = "Quinary MI2S Playback",
|
||||
.rates = SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_8000 |
|
||||
SNDRV_PCM_RATE_16000 | SNDRV_PCM_RATE_96000 |
|
||||
SNDRV_PCM_RATE_192000,
|
||||
.formats = SNDRV_PCM_FMTBIT_S16_LE,
|
||||
.channels_min = 1,
|
||||
.channels_max = 8,
|
||||
.rate_min = 8000,
|
||||
.rate_max = 192000,
|
||||
},
|
||||
.id = QUINARY_MI2S_RX,
|
||||
.name = "QUIN_MI2S_RX",
|
||||
.ops = &q6i2s_ops,
|
||||
.probe = msm_dai_q6_dai_probe,
|
||||
.remove = msm_dai_q6_dai_remove,
|
||||
}, {
|
||||
.capture = {
|
||||
.stream_name = "Quinary MI2S Capture",
|
||||
.rates = SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_8000 |
|
||||
SNDRV_PCM_RATE_16000,
|
||||
.formats = SNDRV_PCM_FMTBIT_S16_LE,
|
||||
.channels_min = 1,
|
||||
.channels_max = 8,
|
||||
.rate_min = 8000,
|
||||
.rate_max = 48000,
|
||||
},
|
||||
.id = QUINARY_MI2S_TX,
|
||||
.name = "QUIN_MI2S_TX",
|
||||
.ops = &q6i2s_ops,
|
||||
.probe = msm_dai_q6_dai_probe,
|
||||
.remove = msm_dai_q6_dai_remove,
|
||||
},
|
||||
Q6AFE_TDM_PB_DAI("Primary", 0, PRIMARY_TDM_RX_0),
|
||||
Q6AFE_TDM_PB_DAI("Primary", 1, PRIMARY_TDM_RX_1),
|
||||
@ -1349,6 +1385,10 @@ 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("QUIN_MI2S_RX", NULL,
|
||||
0, SND_SOC_NOPM, 0, 0),
|
||||
SND_SOC_DAPM_AIF_OUT("QUIN_MI2S_TX", NULL,
|
||||
0, SND_SOC_NOPM, 0, 0),
|
||||
SND_SOC_DAPM_AIF_IN("QUAT_MI2S_RX", NULL,
|
||||
0, SND_SOC_NOPM, 0, 0),
|
||||
SND_SOC_DAPM_AIF_OUT("QUAT_MI2S_TX", NULL,
|
||||
@ -1610,6 +1650,7 @@ static void of_q6afe_parse_dai_data(struct device *dev,
|
||||
|
||||
switch (id) {
|
||||
/* MI2S specific properties */
|
||||
case QUINARY_MI2S_RX ... QUINARY_MI2S_TX:
|
||||
case PRIMARY_MI2S_RX ... QUATERNARY_MI2S_TX:
|
||||
priv = &data->priv[id];
|
||||
ret = of_property_read_variable_u32_array(node,
|
||||
|
@ -120,6 +120,8 @@
|
||||
#define AFE_PORT_ID_TERTIARY_MI2S_TX 0x1005
|
||||
#define AFE_PORT_ID_QUATERNARY_MI2S_RX 0x1006
|
||||
#define AFE_PORT_ID_QUATERNARY_MI2S_TX 0x1007
|
||||
#define AFE_PORT_ID_QUINARY_MI2S_RX 0x1016
|
||||
#define AFE_PORT_ID_QUINARY_MI2S_TX 0x1017
|
||||
|
||||
/* Start of the range of port IDs for TDM devices. */
|
||||
#define AFE_PORT_ID_TDM_PORT_RANGE_START 0x9000
|
||||
@ -620,6 +622,10 @@ static struct afe_port_map port_maps[AFE_PORT_MAX] = {
|
||||
QUATERNARY_MI2S_RX, 1, 1},
|
||||
[QUATERNARY_MI2S_TX] = { AFE_PORT_ID_QUATERNARY_MI2S_TX,
|
||||
QUATERNARY_MI2S_TX, 0, 1},
|
||||
[QUINARY_MI2S_RX] = { AFE_PORT_ID_QUINARY_MI2S_RX,
|
||||
QUINARY_MI2S_RX, 1, 1},
|
||||
[QUINARY_MI2S_TX] = { AFE_PORT_ID_QUINARY_MI2S_TX,
|
||||
QUINARY_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,
|
||||
@ -1596,6 +1602,8 @@ struct q6afe_port *q6afe_port_get_from_id(struct device *dev, int id)
|
||||
case AFE_PORT_ID_TERTIARY_MI2S_TX:
|
||||
case AFE_PORT_ID_QUATERNARY_MI2S_RX:
|
||||
case AFE_PORT_ID_QUATERNARY_MI2S_TX:
|
||||
case AFE_PORT_ID_QUINARY_MI2S_RX:
|
||||
case AFE_PORT_ID_QUINARY_MI2S_TX:
|
||||
cfg_type = AFE_PARAM_ID_I2S_CONFIG;
|
||||
break;
|
||||
case AFE_PORT_ID_PRIMARY_TDM_RX ... AFE_PORT_ID_QUINARY_TDM_TX_7:
|
||||
|
@ -5,7 +5,7 @@
|
||||
|
||||
#include <dt-bindings/sound/qcom,q6afe.h>
|
||||
|
||||
#define AFE_PORT_MAX 127
|
||||
#define AFE_PORT_MAX 129
|
||||
|
||||
#define MSM_AFE_PORT_TYPE_RX 0
|
||||
#define MSM_AFE_PORT_TYPE_TX 1
|
||||
|
@ -66,6 +66,7 @@
|
||||
{ mix_name, "PRI_MI2S_TX", "PRI_MI2S_TX" }, \
|
||||
{ mix_name, "SEC_MI2S_TX", "SEC_MI2S_TX" }, \
|
||||
{ mix_name, "QUAT_MI2S_TX", "QUAT_MI2S_TX" }, \
|
||||
{ mix_name, "QUIN_MI2S_TX", "QUIN_MI2S_TX" }, \
|
||||
{ mix_name, "TERT_MI2S_TX", "TERT_MI2S_TX" }, \
|
||||
{ mix_name, "SLIMBUS_0_TX", "SLIMBUS_0_TX" }, \
|
||||
{ mix_name, "SLIMBUS_1_TX", "SLIMBUS_1_TX" }, \
|
||||
@ -140,6 +141,9 @@
|
||||
SOC_SINGLE_EXT("QUAT_MI2S_TX", QUATERNARY_MI2S_TX, \
|
||||
id, 1, 0, msm_routing_get_audio_mixer, \
|
||||
msm_routing_put_audio_mixer), \
|
||||
SOC_SINGLE_EXT("QUIN_MI2S_TX", QUINARY_MI2S_TX, \
|
||||
id, 1, 0, msm_routing_get_audio_mixer, \
|
||||
msm_routing_put_audio_mixer), \
|
||||
SOC_SINGLE_EXT("SLIMBUS_0_TX", SLIMBUS_0_TX, \
|
||||
id, 1, 0, msm_routing_get_audio_mixer, \
|
||||
msm_routing_put_audio_mixer), \
|
||||
@ -513,6 +517,9 @@ static const struct snd_kcontrol_new secondary_mi2s_rx_mixer_controls[] = {
|
||||
static const struct snd_kcontrol_new quaternary_mi2s_rx_mixer_controls[] = {
|
||||
Q6ROUTING_RX_MIXERS(QUATERNARY_MI2S_RX) };
|
||||
|
||||
static const struct snd_kcontrol_new quinary_mi2s_rx_mixer_controls[] = {
|
||||
Q6ROUTING_RX_MIXERS(QUINARY_MI2S_RX) };
|
||||
|
||||
static const struct snd_kcontrol_new tertiary_mi2s_rx_mixer_controls[] = {
|
||||
Q6ROUTING_RX_MIXERS(TERTIARY_MI2S_RX) };
|
||||
|
||||
@ -752,6 +759,9 @@ static const struct snd_soc_dapm_widget msm_qdsp6_widgets[] = {
|
||||
SND_SOC_DAPM_MIXER("QUAT_MI2S_RX Audio Mixer", SND_SOC_NOPM, 0, 0,
|
||||
quaternary_mi2s_rx_mixer_controls,
|
||||
ARRAY_SIZE(quaternary_mi2s_rx_mixer_controls)),
|
||||
SND_SOC_DAPM_MIXER("QUIN_MI2S_RX Audio Mixer", SND_SOC_NOPM, 0, 0,
|
||||
quinary_mi2s_rx_mixer_controls,
|
||||
ARRAY_SIZE(quinary_mi2s_rx_mixer_controls)),
|
||||
SND_SOC_DAPM_MIXER("TERT_MI2S_RX Audio Mixer", SND_SOC_NOPM, 0, 0,
|
||||
tertiary_mi2s_rx_mixer_controls,
|
||||
ARRAY_SIZE(tertiary_mi2s_rx_mixer_controls)),
|
||||
@ -941,6 +951,7 @@ static const struct snd_soc_dapm_route intercon[] = {
|
||||
Q6ROUTING_RX_DAPM_ROUTE("SLIMBUS_5_RX Audio Mixer", "SLIMBUS_5_RX"),
|
||||
Q6ROUTING_RX_DAPM_ROUTE("SLIMBUS_6_RX Audio Mixer", "SLIMBUS_6_RX"),
|
||||
Q6ROUTING_RX_DAPM_ROUTE("QUAT_MI2S_RX Audio Mixer", "QUAT_MI2S_RX"),
|
||||
Q6ROUTING_RX_DAPM_ROUTE("QUIN_MI2S_RX Audio Mixer", "QUIN_MI2S_RX"),
|
||||
Q6ROUTING_RX_DAPM_ROUTE("TERT_MI2S_RX Audio Mixer", "TERT_MI2S_RX"),
|
||||
Q6ROUTING_RX_DAPM_ROUTE("SEC_MI2S_RX Audio Mixer", "SEC_MI2S_RX"),
|
||||
Q6ROUTING_RX_DAPM_ROUTE("PRI_MI2S_RX Audio Mixer", "PRI_MI2S_RX"),
|
||||
|
Loading…
Reference in New Issue
Block a user