Loading asoc/sdm660-common.c +141 −2 Original line number Diff line number Diff line Loading @@ -87,6 +87,16 @@ static struct dev_config tdm_rx_cfg[TDM_INTERFACE_MAX][TDM_PORT_MAX] = { {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_5 */ {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_6 */ {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_7 */ }, { /* QUIN TDM */ {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_0 */ {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_1 */ {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_2 */ {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_3 */ {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_4 */ {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_5 */ {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_6 */ {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_7 */ } }; Loading Loading @@ -131,6 +141,16 @@ static struct dev_config tdm_tx_cfg[TDM_INTERFACE_MAX][TDM_PORT_MAX] = { {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_5 */ {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_6 */ {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_7 */ }, { /* QUIN TDM */ {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_0 */ {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_1 */ {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_2 */ {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_3 */ {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_4 */ {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_5 */ {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_6 */ {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_7 */ } }; Loading @@ -155,6 +175,7 @@ enum { SEC_MI2S, TERT_MI2S, QUAT_MI2S, QUIN_MI2S, MI2S_MAX, }; Loading @@ -163,6 +184,7 @@ enum { SEC_AUX_PCM, TERT_AUX_PCM, QUAT_AUX_PCM, QUIN_AUX_PCM, AUX_PCM_MAX, }; Loading @@ -171,6 +193,7 @@ enum { PCM_I2S_SEL_SEC, PCM_I2S_SEL_TERT, PCM_I2S_SEL_QUAT, PCM_I2S_SEL_QUIN, PCM_I2S_SEL_MAX, }; Loading Loading @@ -231,6 +254,7 @@ static struct dev_config mi2s_rx_cfg[] = { [SEC_MI2S] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 2}, [TERT_MI2S] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 2}, [QUAT_MI2S] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 2}, [QUIN_MI2S] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 2}, }; static struct dev_config mi2s_tx_cfg[] = { Loading @@ -238,6 +262,7 @@ static struct dev_config mi2s_tx_cfg[] = { [SEC_MI2S] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, [TERT_MI2S] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, [QUAT_MI2S] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, [QUIN_MI2S] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, }; static struct dev_config aux_pcm_rx_cfg[] = { Loading @@ -245,6 +270,7 @@ static struct dev_config aux_pcm_rx_cfg[] = { [SEC_AUX_PCM] = {SAMPLING_RATE_8KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, [TERT_AUX_PCM] = {SAMPLING_RATE_8KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, [QUAT_AUX_PCM] = {SAMPLING_RATE_8KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, [QUIN_AUX_PCM] = {SAMPLING_RATE_8KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, }; static struct dev_config aux_pcm_tx_cfg[] = { Loading @@ -252,6 +278,7 @@ static struct dev_config aux_pcm_tx_cfg[] = { [SEC_AUX_PCM] = {SAMPLING_RATE_8KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, [TERT_AUX_PCM] = {SAMPLING_RATE_8KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, [QUAT_AUX_PCM] = {SAMPLING_RATE_8KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, [QUIN_AUX_PCM] = {SAMPLING_RATE_8KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, }; static char const *ch_text[] = {"Two", "Three", "Four", "Five", Loading Loading @@ -290,26 +317,32 @@ static SOC_ENUM_SINGLE_EXT_DECL(prim_aux_pcm_rx_sample_rate, auxpcm_rate_text); static SOC_ENUM_SINGLE_EXT_DECL(sec_aux_pcm_rx_sample_rate, auxpcm_rate_text); static SOC_ENUM_SINGLE_EXT_DECL(tert_aux_pcm_rx_sample_rate, auxpcm_rate_text); static SOC_ENUM_SINGLE_EXT_DECL(quat_aux_pcm_rx_sample_rate, auxpcm_rate_text); static SOC_ENUM_SINGLE_EXT_DECL(quin_aux_pcm_rx_sample_rate, auxpcm_rate_text); static SOC_ENUM_SINGLE_EXT_DECL(prim_aux_pcm_tx_sample_rate, auxpcm_rate_text); static SOC_ENUM_SINGLE_EXT_DECL(sec_aux_pcm_tx_sample_rate, auxpcm_rate_text); static SOC_ENUM_SINGLE_EXT_DECL(tert_aux_pcm_tx_sample_rate, auxpcm_rate_text); static SOC_ENUM_SINGLE_EXT_DECL(quat_aux_pcm_tx_sample_rate, auxpcm_rate_text); static SOC_ENUM_SINGLE_EXT_DECL(quin_aux_pcm_tx_sample_rate, auxpcm_rate_text); static SOC_ENUM_SINGLE_EXT_DECL(prim_mi2s_rx_sample_rate, mi2s_rate_text); static SOC_ENUM_SINGLE_EXT_DECL(sec_mi2s_rx_sample_rate, mi2s_rate_text); static SOC_ENUM_SINGLE_EXT_DECL(tert_mi2s_rx_sample_rate, mi2s_rate_text); static SOC_ENUM_SINGLE_EXT_DECL(quat_mi2s_rx_sample_rate, mi2s_rate_text); static SOC_ENUM_SINGLE_EXT_DECL(quin_mi2s_rx_sample_rate, mi2s_rate_text); static SOC_ENUM_SINGLE_EXT_DECL(prim_mi2s_tx_sample_rate, mi2s_rate_text); static SOC_ENUM_SINGLE_EXT_DECL(sec_mi2s_tx_sample_rate, mi2s_rate_text); static SOC_ENUM_SINGLE_EXT_DECL(tert_mi2s_tx_sample_rate, mi2s_rate_text); static SOC_ENUM_SINGLE_EXT_DECL(quat_mi2s_tx_sample_rate, mi2s_rate_text); static SOC_ENUM_SINGLE_EXT_DECL(quin_mi2s_tx_sample_rate, mi2s_rate_text); static SOC_ENUM_SINGLE_EXT_DECL(prim_mi2s_rx_format, mi2s_format_text); static SOC_ENUM_SINGLE_EXT_DECL(sec_mi2s_rx_format, mi2s_format_text); static SOC_ENUM_SINGLE_EXT_DECL(tert_mi2s_rx_format, mi2s_format_text); static SOC_ENUM_SINGLE_EXT_DECL(quat_mi2s_rx_format, mi2s_format_text); static SOC_ENUM_SINGLE_EXT_DECL(quin_mi2s_rx_format, mi2s_format_text); static SOC_ENUM_SINGLE_EXT_DECL(prim_mi2s_tx_format, mi2s_format_text); static SOC_ENUM_SINGLE_EXT_DECL(sec_mi2s_tx_format, mi2s_format_text); static SOC_ENUM_SINGLE_EXT_DECL(tert_mi2s_tx_format, mi2s_format_text); static SOC_ENUM_SINGLE_EXT_DECL(quat_mi2s_tx_format, mi2s_format_text); static SOC_ENUM_SINGLE_EXT_DECL(quin_mi2s_tx_format, mi2s_format_text); static SOC_ENUM_SINGLE_EXT_DECL(prim_mi2s_rx_chs, mi2s_ch_text); static SOC_ENUM_SINGLE_EXT_DECL(prim_mi2s_tx_chs, mi2s_ch_text); static SOC_ENUM_SINGLE_EXT_DECL(sec_mi2s_rx_chs, mi2s_ch_text); Loading @@ -318,6 +351,8 @@ static SOC_ENUM_SINGLE_EXT_DECL(tert_mi2s_rx_chs, mi2s_ch_text); static SOC_ENUM_SINGLE_EXT_DECL(tert_mi2s_tx_chs, mi2s_ch_text); static SOC_ENUM_SINGLE_EXT_DECL(quat_mi2s_rx_chs, mi2s_ch_text); static SOC_ENUM_SINGLE_EXT_DECL(quat_mi2s_tx_chs, mi2s_ch_text); static SOC_ENUM_SINGLE_EXT_DECL(quin_mi2s_rx_chs, mi2s_ch_text); static SOC_ENUM_SINGLE_EXT_DECL(quin_mi2s_tx_chs, mi2s_ch_text); static SOC_ENUM_SINGLE_EXT_DECL(usb_rx_chs, usb_ch_text); static SOC_ENUM_SINGLE_EXT_DECL(usb_tx_chs, usb_ch_text); static SOC_ENUM_SINGLE_EXT_DECL(usb_rx_format, bit_format_text); Loading Loading @@ -520,6 +555,9 @@ static int tdm_get_port_idx(struct snd_kcontrol *kcontrol, } else if (strnstr(kcontrol->id.name, "QUAT", sizeof(kcontrol->id.name))) { port->mode = TDM_QUAT; } else if (strnstr(kcontrol->id.name, "QUIN", sizeof(kcontrol->id.name))) { port->mode = TDM_QUIN; } else { pr_err("%s: unsupported mode in: %s", __func__, kcontrol->id.name); Loading Loading @@ -955,6 +993,9 @@ static int aux_pcm_get_port_idx(struct snd_kcontrol *kcontrol) else if (strnstr(kcontrol->id.name, "QUAT_AUX_PCM", sizeof("QUAT_AUX_PCM"))) idx = QUAT_AUX_PCM; else if (strnstr(kcontrol->id.name, "QUIN_AUX_PCM", sizeof("QUIN_AUX_PCM"))) idx = QUIN_AUX_PCM; else { pr_err("%s: unsupported port: %s", __func__, kcontrol->id.name); Loading Loading @@ -1052,6 +1093,9 @@ static int mi2s_get_port_idx(struct snd_kcontrol *kcontrol) else if (strnstr(kcontrol->id.name, "QUAT_MI2S_RX", sizeof("QUAT_MI2S_RX"))) idx = QUAT_MI2S; else if (strnstr(kcontrol->id.name, "QUIN_MI2S_RX", sizeof("QUIN_MI2S_RX"))) idx = QUIN_MI2S; else if (strnstr(kcontrol->id.name, "PRIM_MI2S_TX", sizeof("PRIM_MI2S_TX"))) idx = PRIM_MI2S; Loading @@ -1064,6 +1108,9 @@ static int mi2s_get_port_idx(struct snd_kcontrol *kcontrol) else if (strnstr(kcontrol->id.name, "QUAT_MI2S_TX", sizeof("QUAT_MI2S_TX"))) idx = QUAT_MI2S; else if (strnstr(kcontrol->id.name, "QUIN_MI2S_TX", sizeof("QUIN_MI2S_TX"))) idx = QUIN_MI2S; else { pr_err("%s: unsupported channel: %s", __func__, kcontrol->id.name); Loading Loading @@ -1836,6 +1883,9 @@ const struct snd_kcontrol_new msm_common_snd_controls[] = { SOC_ENUM_EXT("QUAT_AUX_PCM_RX SampleRate", quat_aux_pcm_rx_sample_rate, aux_pcm_rx_sample_rate_get, aux_pcm_rx_sample_rate_put), SOC_ENUM_EXT("QUIN_AUX_PCM_RX SampleRate", quin_aux_pcm_rx_sample_rate, aux_pcm_rx_sample_rate_get, aux_pcm_rx_sample_rate_put), SOC_ENUM_EXT("PRIM_AUX_PCM_TX SampleRate", prim_aux_pcm_tx_sample_rate, aux_pcm_tx_sample_rate_get, aux_pcm_tx_sample_rate_put), Loading @@ -1848,6 +1898,9 @@ const struct snd_kcontrol_new msm_common_snd_controls[] = { SOC_ENUM_EXT("QUAT_AUX_PCM_TX SampleRate", quat_aux_pcm_tx_sample_rate, aux_pcm_tx_sample_rate_get, aux_pcm_tx_sample_rate_put), SOC_ENUM_EXT("QUIN_AUX_PCM_TX SampleRate", quin_aux_pcm_tx_sample_rate, aux_pcm_tx_sample_rate_get, aux_pcm_tx_sample_rate_put), SOC_ENUM_EXT("PRIM_MI2S_RX SampleRate", prim_mi2s_rx_sample_rate, mi2s_rx_sample_rate_get, mi2s_rx_sample_rate_put), Loading @@ -1860,6 +1913,9 @@ const struct snd_kcontrol_new msm_common_snd_controls[] = { SOC_ENUM_EXT("QUAT_MI2S_RX SampleRate", quat_mi2s_rx_sample_rate, mi2s_rx_sample_rate_get, mi2s_rx_sample_rate_put), SOC_ENUM_EXT("QUIN_MI2S_RX SampleRate", quin_mi2s_rx_sample_rate, mi2s_rx_sample_rate_get, mi2s_rx_sample_rate_put), SOC_ENUM_EXT("PRIM_MI2S_TX SampleRate", prim_mi2s_tx_sample_rate, mi2s_tx_sample_rate_get, mi2s_tx_sample_rate_put), Loading @@ -1872,6 +1928,9 @@ const struct snd_kcontrol_new msm_common_snd_controls[] = { SOC_ENUM_EXT("QUAT_MI2S_TX SampleRate", quat_mi2s_tx_sample_rate, mi2s_tx_sample_rate_get, mi2s_tx_sample_rate_put), SOC_ENUM_EXT("QUIN_MI2S_TX SampleRate", quin_mi2s_tx_sample_rate, mi2s_tx_sample_rate_get, mi2s_tx_sample_rate_put), SOC_ENUM_EXT("PRIM_MI2S_RX Format", prim_mi2s_rx_format, mi2s_rx_format_get, mi2s_rx_format_put), Loading @@ -1884,6 +1943,9 @@ const struct snd_kcontrol_new msm_common_snd_controls[] = { SOC_ENUM_EXT("QUAT_MI2S_RX Format", quat_mi2s_rx_format, mi2s_rx_format_get, mi2s_rx_format_put), SOC_ENUM_EXT("QUIN_MI2S_RX Format", quin_mi2s_rx_format, mi2s_rx_format_get, mi2s_rx_format_put), SOC_ENUM_EXT("PRIM_MI2S_TX Format", prim_mi2s_tx_format, mi2s_tx_format_get, mi2s_tx_format_put), Loading @@ -1896,6 +1958,9 @@ const struct snd_kcontrol_new msm_common_snd_controls[] = { SOC_ENUM_EXT("QUAT_MI2S_TX Format", quat_mi2s_tx_format, mi2s_tx_format_get, mi2s_tx_format_put), SOC_ENUM_EXT("QUIN_MI2S_TX Format", quin_mi2s_tx_format, mi2s_tx_format_get, mi2s_tx_format_put), SOC_ENUM_EXT("PRIM_MI2S_RX Channels", prim_mi2s_rx_chs, msm_mi2s_rx_ch_get, msm_mi2s_rx_ch_put), SOC_ENUM_EXT("PRIM_MI2S_TX Channels", prim_mi2s_tx_chs, Loading @@ -1912,6 +1977,10 @@ const struct snd_kcontrol_new msm_common_snd_controls[] = { msm_mi2s_rx_ch_get, msm_mi2s_rx_ch_put), SOC_ENUM_EXT("QUAT_MI2S_TX Channels", quat_mi2s_tx_chs, msm_mi2s_tx_ch_get, msm_mi2s_tx_ch_put), SOC_ENUM_EXT("QUIN_MI2S_RX Channels", quin_mi2s_rx_chs, msm_mi2s_rx_ch_get, msm_mi2s_rx_ch_put), SOC_ENUM_EXT("QUIN_MI2S_TX Channels", quin_mi2s_tx_chs, msm_mi2s_tx_ch_get, msm_mi2s_tx_ch_put), SOC_ENUM_EXT("USB_AUDIO_RX Channels", usb_rx_chs, usb_audio_rx_ch_get, usb_audio_rx_ch_put), SOC_ENUM_EXT("USB_AUDIO_TX Channels", usb_tx_chs, Loading Loading @@ -2005,6 +2074,24 @@ const struct snd_kcontrol_new msm_common_snd_controls[] = { SOC_ENUM_EXT("QUAT_TDM_TX_0 Channels", tdm_tx_chs, tdm_tx_ch_get, tdm_tx_ch_put), SOC_ENUM_EXT("QUIN_TDM_RX_0 SampleRate", tdm_rx_sample_rate, tdm_rx_sample_rate_get, tdm_rx_sample_rate_put), SOC_ENUM_EXT("QUIN_TDM_TX_0 SampleRate", tdm_tx_sample_rate, tdm_tx_sample_rate_get, tdm_tx_sample_rate_put), SOC_ENUM_EXT("QUIN_TDM_RX_0 Format", tdm_rx_format, tdm_rx_format_get, tdm_rx_format_put), SOC_ENUM_EXT("QUIN_TDM_TX_0 Format", tdm_tx_format, tdm_tx_format_get, tdm_tx_format_put), SOC_ENUM_EXT("QUIN_TDM_RX_0 Channels", tdm_rx_chs, tdm_rx_ch_get, tdm_rx_ch_put), SOC_ENUM_EXT("QUIN_TDM_TX_0 Channels", tdm_tx_chs, tdm_tx_ch_get, tdm_tx_ch_put), }; /** Loading Loading @@ -2187,6 +2274,22 @@ int msm_common_be_hw_params_fixup(struct snd_soc_pcm_runtime *rtd, rate->min = rate->max = tdm_tx_cfg[TDM_QUAT][TDM_0].sample_rate; break; case MSM_BACKEND_DAI_QUIN_TDM_RX_0: channels->min = channels->max = tdm_rx_cfg[TDM_QUIN][TDM_0].channels; param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, tdm_rx_cfg[TDM_QUIN][TDM_0].bit_format); rate->min = rate->max = tdm_rx_cfg[TDM_QUIN][TDM_0].sample_rate; break; case MSM_BACKEND_DAI_QUIN_TDM_TX_0: channels->min = channels->max = tdm_tx_cfg[TDM_QUIN][TDM_0].channels; param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, tdm_tx_cfg[TDM_QUIN][TDM_0].bit_format); rate->min = rate->max = tdm_tx_cfg[TDM_QUIN][TDM_0].sample_rate; break; case MSM_BACKEND_DAI_AUXPCM_RX: rate->min = rate->max = aux_pcm_rx_cfg[PRIM_AUX_PCM].sample_rate; Loading Loading @@ -2243,6 +2346,20 @@ int msm_common_be_hw_params_fixup(struct snd_soc_pcm_runtime *rtd, aux_pcm_tx_cfg[QUAT_AUX_PCM].channels; break; case MSM_BACKEND_DAI_QUIN_AUXPCM_RX: rate->min = rate->max = aux_pcm_rx_cfg[QUIN_AUX_PCM].sample_rate; channels->min = channels->max = aux_pcm_rx_cfg[QUIN_AUX_PCM].channels; break; case MSM_BACKEND_DAI_QUIN_AUXPCM_TX: rate->min = rate->max = aux_pcm_tx_cfg[QUIN_AUX_PCM].sample_rate; channels->min = channels->max = aux_pcm_tx_cfg[QUIN_AUX_PCM].channels; break; case MSM_BACKEND_DAI_PRI_MI2S_RX: rate->min = rate->max = mi2s_rx_cfg[PRIM_MI2S].sample_rate; channels->min = channels->max = Loading Loading @@ -2307,6 +2424,22 @@ int msm_common_be_hw_params_fixup(struct snd_soc_pcm_runtime *rtd, mi2s_tx_cfg[QUAT_MI2S].bit_format); break; case MSM_BACKEND_DAI_QUINARY_MI2S_RX: rate->min = rate->max = mi2s_rx_cfg[QUIN_MI2S].sample_rate; channels->min = channels->max = mi2s_rx_cfg[QUIN_MI2S].channels; param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, mi2s_rx_cfg[QUIN_MI2S].bit_format); break; case MSM_BACKEND_DAI_QUINARY_MI2S_TX: rate->min = rate->max = mi2s_tx_cfg[QUIN_MI2S].sample_rate; channels->min = channels->max = mi2s_tx_cfg[QUIN_MI2S].channels; param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, mi2s_tx_cfg[QUIN_MI2S].bit_format); break; default: rate->min = rate->max = SAMPLING_RATE_48KHZ; break; Loading Loading @@ -2381,6 +2514,12 @@ static int msm_get_port_id(int id) case MSM_BACKEND_DAI_QUATERNARY_MI2S_TX: afe_port_id = AFE_PORT_ID_QUATERNARY_MI2S_TX; break; case MSM_BACKEND_DAI_QUINARY_MI2S_RX: afe_port_id = AFE_PORT_ID_QUINARY_MI2S_RX; break; case MSM_BACKEND_DAI_QUINARY_MI2S_TX: afe_port_id = AFE_PORT_ID_QUINARY_MI2S_TX; break; default: pr_err("%s: Invalid id: %d\n", __func__, id); afe_port_id = -EINVAL; Loading Loading @@ -2481,7 +2620,7 @@ int msm_mi2s_snd_startup(struct snd_pcm_substream *substream) __func__, substream->name, substream->stream, cpu_dai->name, cpu_dai->id); if (index < PRIM_MI2S || index > QUAT_MI2S) { if (index < PRIM_MI2S || index >= MI2S_MAX) { ret = -EINVAL; dev_err(rtd->card->dev, "%s: CPU DAI id (%d) out of range\n", Loading Loading @@ -2555,7 +2694,7 @@ void msm_mi2s_snd_shutdown(struct snd_pcm_substream *substream) pr_debug("%s(): substream = %s stream = %d\n", __func__, substream->name, substream->stream); if (index < PRIM_MI2S || index > QUAT_MI2S) { if (index < PRIM_MI2S || index >= MI2S_MAX) { pr_err("%s:invalid MI2S DAI(%d)\n", __func__, index); return; } Loading asoc/sdm660-common.h +1 −0 Original line number Diff line number Diff line Loading @@ -51,6 +51,7 @@ enum { TDM_SEC, TDM_TERT, TDM_QUAT, TDM_QUIN, TDM_INTERFACE_MAX, }; Loading asoc/sdm660-ext-dai-links.c +90 −0 Original line number Diff line number Diff line Loading @@ -205,10 +205,12 @@ static int msm_tdm_snd_hw_params(struct snd_pcm_substream *substream, case AFE_PORT_ID_SECONDARY_TDM_RX: case AFE_PORT_ID_TERTIARY_TDM_RX: case AFE_PORT_ID_QUATERNARY_TDM_RX: case AFE_PORT_ID_QUINARY_TDM_RX: case AFE_PORT_ID_PRIMARY_TDM_TX: case AFE_PORT_ID_SECONDARY_TDM_TX: case AFE_PORT_ID_TERTIARY_TDM_TX: case AFE_PORT_ID_QUATERNARY_TDM_TX: case AFE_PORT_ID_QUINARY_TDM_TX: slot_offset = tdm_slot_offset[TDM_0]; break; default: Loading Loading @@ -1568,6 +1570,34 @@ static struct snd_soc_dai_link msm_ext_common_be_dai[] = { .ops = &msm_tdm_be_ops, .ignore_suspend = 1, }, { .name = LPASS_BE_QUIN_TDM_RX_0, .stream_name = "Quinary TDM0 Playback", .cpu_dai_name = "msm-dai-q6-tdm.37184", .platform_name = "msm-pcm-routing", .codec_name = "msm-stub-codec.1", .codec_dai_name = "msm-stub-rx", .no_pcm = 1, .dpcm_playback = 1, .id = MSM_BACKEND_DAI_QUIN_TDM_RX_0, .be_hw_params_fixup = msm_common_be_hw_params_fixup, .ops = &msm_tdm_be_ops, .ignore_suspend = 1, }, { .name = LPASS_BE_QUIN_TDM_TX_0, .stream_name = "Quinary TDM0 Capture", .cpu_dai_name = "msm-dai-q6-tdm.37185", .platform_name = "msm-pcm-routing", .codec_name = "msm-stub-codec.1", .codec_dai_name = "msm-stub-tx", .no_pcm = 1, .dpcm_capture = 1, .id = MSM_BACKEND_DAI_QUIN_TDM_TX_0, .be_hw_params_fixup = msm_common_be_hw_params_fixup, .ops = &msm_tdm_be_ops, .ignore_suspend = 1, }, }; static struct snd_soc_dai_link msm_mi2s_be_dai_links[] = { Loading Loading @@ -1687,6 +1717,35 @@ static struct snd_soc_dai_link msm_mi2s_be_dai_links[] = { .ops = &msm_mi2s_be_ops, .ignore_suspend = 1, }, { .name = LPASS_BE_QUIN_MI2S_RX, .stream_name = "Quinary MI2S Playback", .cpu_dai_name = "msm-dai-q6-mi2s.5", .platform_name = "msm-pcm-routing", .codec_name = "msm-stub-codec.1", .codec_dai_name = "msm-stub-rx", .no_pcm = 1, .dpcm_playback = 1, .id = MSM_BACKEND_DAI_QUINARY_MI2S_RX, .be_hw_params_fixup = msm_common_be_hw_params_fixup, .ops = &msm_mi2s_be_ops, .ignore_suspend = 1, .ignore_pmdown_time = 1, }, { .name = LPASS_BE_QUIN_MI2S_TX, .stream_name = "Quinary MI2S Capture", .cpu_dai_name = "msm-dai-q6-mi2s.5", .platform_name = "msm-pcm-routing", .codec_name = "msm-stub-codec.1", .codec_dai_name = "msm-stub-tx", .no_pcm = 1, .dpcm_capture = 1, .id = MSM_BACKEND_DAI_QUINARY_MI2S_TX, .be_hw_params_fixup = msm_common_be_hw_params_fixup, .ops = &msm_mi2s_be_ops, .ignore_suspend = 1, }, }; static struct snd_soc_dai_link msm_auxpcm_be_dai_links[] = { Loading Loading @@ -1814,6 +1873,37 @@ static struct snd_soc_dai_link msm_auxpcm_be_dai_links[] = { .ignore_pmdown_time = 1, .ops = &msm_aux_pcm_be_ops, }, /* Quinary AUX PCM Backend DAI Links */ { .name = LPASS_BE_QUIN_AUXPCM_RX, .stream_name = "Quin AUX PCM Playback", .cpu_dai_name = "msm-dai-q6-auxpcm.5", .platform_name = "msm-pcm-routing", .codec_name = "msm-stub-codec.1", .codec_dai_name = "msm-stub-rx", .no_pcm = 1, .dpcm_playback = 1, .id = MSM_BACKEND_DAI_QUIN_AUXPCM_RX, .be_hw_params_fixup = msm_common_be_hw_params_fixup, .ignore_pmdown_time = 1, .ignore_suspend = 1, .ops = &msm_aux_pcm_be_ops, }, { .name = LPASS_BE_QUIN_AUXPCM_TX, .stream_name = "Quin AUX PCM Capture", .cpu_dai_name = "msm-dai-q6-auxpcm.5", .platform_name = "msm-pcm-routing", .codec_name = "msm-stub-codec.1", .codec_dai_name = "msm-stub-tx", .no_pcm = 1, .dpcm_capture = 1, .id = MSM_BACKEND_DAI_QUIN_AUXPCM_TX, .be_hw_params_fixup = msm_common_be_hw_params_fixup, .ignore_suspend = 1, .ignore_pmdown_time = 1, .ops = &msm_aux_pcm_be_ops, }, }; static struct snd_soc_dai_link msm_wcn_be_dai_links[] = { Loading asoc/sdm660-internal.c +90 −0 Original line number Diff line number Diff line Loading @@ -1499,10 +1499,12 @@ static int msm_tdm_snd_hw_params(struct snd_pcm_substream *substream, case AFE_PORT_ID_SECONDARY_TDM_RX: case AFE_PORT_ID_TERTIARY_TDM_RX: case AFE_PORT_ID_QUATERNARY_TDM_RX: case AFE_PORT_ID_QUINARY_TDM_RX: case AFE_PORT_ID_PRIMARY_TDM_TX: case AFE_PORT_ID_SECONDARY_TDM_TX: case AFE_PORT_ID_TERTIARY_TDM_TX: case AFE_PORT_ID_QUATERNARY_TDM_TX: case AFE_PORT_ID_QUINARY_TDM_TX: slot_offset = tdm_slot_offset[TDM_0]; break; default: Loading Loading @@ -2607,6 +2609,34 @@ static struct snd_soc_dai_link msm_int_be_dai[] = { .ops = &msm_tdm_be_ops, .ignore_suspend = 1, }, { .name = LPASS_BE_QUIN_TDM_RX_0, .stream_name = "Quinary TDM0 Playback", .cpu_dai_name = "msm-dai-q6-tdm.37184", .platform_name = "msm-pcm-routing", .codec_name = "msm-stub-codec.1", .codec_dai_name = "msm-stub-rx", .no_pcm = 1, .dpcm_playback = 1, .id = MSM_BACKEND_DAI_QUIN_TDM_RX_0, .be_hw_params_fixup = msm_common_be_hw_params_fixup, .ops = &msm_tdm_be_ops, .ignore_suspend = 1, }, { .name = LPASS_BE_QUIN_TDM_TX_0, .stream_name = "Quinary TDM0 Capture", .cpu_dai_name = "msm-dai-q6-tdm.37185", .platform_name = "msm-pcm-routing", .codec_name = "msm-stub-codec.1", .codec_dai_name = "msm-stub-tx", .no_pcm = 1, .dpcm_capture = 1, .id = MSM_BACKEND_DAI_QUIN_TDM_TX_0, .be_hw_params_fixup = msm_common_be_hw_params_fixup, .ops = &msm_tdm_be_ops, .ignore_suspend = 1, }, }; static struct snd_soc_dai_link msm_mi2s_be_dai_links[] = { Loading Loading @@ -2726,6 +2756,35 @@ static struct snd_soc_dai_link msm_mi2s_be_dai_links[] = { .ops = &msm_mi2s_be_ops, .ignore_suspend = 1, }, { .name = LPASS_BE_QUIN_MI2S_RX, .stream_name = "Quinary MI2S Playback", .cpu_dai_name = "msm-dai-q6-mi2s.5", .platform_name = "msm-pcm-routing", .codec_name = "msm-stub-codec.1", .codec_dai_name = "msm-stub-rx", .no_pcm = 1, .dpcm_playback = 1, .id = MSM_BACKEND_DAI_QUINARY_MI2S_RX, .be_hw_params_fixup = msm_common_be_hw_params_fixup, .ops = &msm_mi2s_be_ops, .ignore_suspend = 1, .ignore_pmdown_time = 1, }, { .name = LPASS_BE_QUIN_MI2S_TX, .stream_name = "Quinary MI2S Capture", .cpu_dai_name = "msm-dai-q6-mi2s.5", .platform_name = "msm-pcm-routing", .codec_name = "msm-stub-codec.1", .codec_dai_name = "msm-stub-tx", .no_pcm = 1, .dpcm_capture = 1, .id = MSM_BACKEND_DAI_QUINARY_MI2S_TX, .be_hw_params_fixup = msm_common_be_hw_params_fixup, .ops = &msm_mi2s_be_ops, .ignore_suspend = 1, }, }; static struct snd_soc_dai_link msm_auxpcm_be_dai_links[] = { Loading Loading @@ -2853,6 +2912,37 @@ static struct snd_soc_dai_link msm_auxpcm_be_dai_links[] = { .ignore_pmdown_time = 1, .ops = &msm_aux_pcm_be_ops, }, /* Quinary AUX PCM Backend DAI Links */ { .name = LPASS_BE_QUIN_AUXPCM_RX, .stream_name = "Quin AUX PCM Playback", .cpu_dai_name = "msm-dai-q6-auxpcm.5", .platform_name = "msm-pcm-routing", .codec_name = "msm-stub-codec.1", .codec_dai_name = "msm-stub-rx", .no_pcm = 1, .dpcm_playback = 1, .id = MSM_BACKEND_DAI_QUIN_AUXPCM_RX, .be_hw_params_fixup = msm_common_be_hw_params_fixup, .ignore_pmdown_time = 1, .ignore_suspend = 1, .ops = &msm_aux_pcm_be_ops, }, { .name = LPASS_BE_QUIN_AUXPCM_TX, .stream_name = "Quin AUX PCM Capture", .cpu_dai_name = "msm-dai-q6-auxpcm.5", .platform_name = "msm-pcm-routing", .codec_name = "msm-stub-codec.1", .codec_dai_name = "msm-stub-tx", .no_pcm = 1, .dpcm_capture = 1, .id = MSM_BACKEND_DAI_QUIN_AUXPCM_TX, .be_hw_params_fixup = msm_common_be_hw_params_fixup, .ignore_suspend = 1, .ignore_pmdown_time = 1, .ops = &msm_aux_pcm_be_ops, }, }; Loading Loading
asoc/sdm660-common.c +141 −2 Original line number Diff line number Diff line Loading @@ -87,6 +87,16 @@ static struct dev_config tdm_rx_cfg[TDM_INTERFACE_MAX][TDM_PORT_MAX] = { {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_5 */ {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_6 */ {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_7 */ }, { /* QUIN TDM */ {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_0 */ {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_1 */ {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_2 */ {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_3 */ {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_4 */ {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_5 */ {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_6 */ {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_7 */ } }; Loading Loading @@ -131,6 +141,16 @@ static struct dev_config tdm_tx_cfg[TDM_INTERFACE_MAX][TDM_PORT_MAX] = { {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_5 */ {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_6 */ {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_7 */ }, { /* QUIN TDM */ {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_0 */ {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_1 */ {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_2 */ {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_3 */ {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_4 */ {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_5 */ {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_6 */ {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_7 */ } }; Loading @@ -155,6 +175,7 @@ enum { SEC_MI2S, TERT_MI2S, QUAT_MI2S, QUIN_MI2S, MI2S_MAX, }; Loading @@ -163,6 +184,7 @@ enum { SEC_AUX_PCM, TERT_AUX_PCM, QUAT_AUX_PCM, QUIN_AUX_PCM, AUX_PCM_MAX, }; Loading @@ -171,6 +193,7 @@ enum { PCM_I2S_SEL_SEC, PCM_I2S_SEL_TERT, PCM_I2S_SEL_QUAT, PCM_I2S_SEL_QUIN, PCM_I2S_SEL_MAX, }; Loading Loading @@ -231,6 +254,7 @@ static struct dev_config mi2s_rx_cfg[] = { [SEC_MI2S] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 2}, [TERT_MI2S] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 2}, [QUAT_MI2S] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 2}, [QUIN_MI2S] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 2}, }; static struct dev_config mi2s_tx_cfg[] = { Loading @@ -238,6 +262,7 @@ static struct dev_config mi2s_tx_cfg[] = { [SEC_MI2S] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, [TERT_MI2S] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, [QUAT_MI2S] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, [QUIN_MI2S] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, }; static struct dev_config aux_pcm_rx_cfg[] = { Loading @@ -245,6 +270,7 @@ static struct dev_config aux_pcm_rx_cfg[] = { [SEC_AUX_PCM] = {SAMPLING_RATE_8KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, [TERT_AUX_PCM] = {SAMPLING_RATE_8KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, [QUAT_AUX_PCM] = {SAMPLING_RATE_8KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, [QUIN_AUX_PCM] = {SAMPLING_RATE_8KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, }; static struct dev_config aux_pcm_tx_cfg[] = { Loading @@ -252,6 +278,7 @@ static struct dev_config aux_pcm_tx_cfg[] = { [SEC_AUX_PCM] = {SAMPLING_RATE_8KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, [TERT_AUX_PCM] = {SAMPLING_RATE_8KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, [QUAT_AUX_PCM] = {SAMPLING_RATE_8KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, [QUIN_AUX_PCM] = {SAMPLING_RATE_8KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, }; static char const *ch_text[] = {"Two", "Three", "Four", "Five", Loading Loading @@ -290,26 +317,32 @@ static SOC_ENUM_SINGLE_EXT_DECL(prim_aux_pcm_rx_sample_rate, auxpcm_rate_text); static SOC_ENUM_SINGLE_EXT_DECL(sec_aux_pcm_rx_sample_rate, auxpcm_rate_text); static SOC_ENUM_SINGLE_EXT_DECL(tert_aux_pcm_rx_sample_rate, auxpcm_rate_text); static SOC_ENUM_SINGLE_EXT_DECL(quat_aux_pcm_rx_sample_rate, auxpcm_rate_text); static SOC_ENUM_SINGLE_EXT_DECL(quin_aux_pcm_rx_sample_rate, auxpcm_rate_text); static SOC_ENUM_SINGLE_EXT_DECL(prim_aux_pcm_tx_sample_rate, auxpcm_rate_text); static SOC_ENUM_SINGLE_EXT_DECL(sec_aux_pcm_tx_sample_rate, auxpcm_rate_text); static SOC_ENUM_SINGLE_EXT_DECL(tert_aux_pcm_tx_sample_rate, auxpcm_rate_text); static SOC_ENUM_SINGLE_EXT_DECL(quat_aux_pcm_tx_sample_rate, auxpcm_rate_text); static SOC_ENUM_SINGLE_EXT_DECL(quin_aux_pcm_tx_sample_rate, auxpcm_rate_text); static SOC_ENUM_SINGLE_EXT_DECL(prim_mi2s_rx_sample_rate, mi2s_rate_text); static SOC_ENUM_SINGLE_EXT_DECL(sec_mi2s_rx_sample_rate, mi2s_rate_text); static SOC_ENUM_SINGLE_EXT_DECL(tert_mi2s_rx_sample_rate, mi2s_rate_text); static SOC_ENUM_SINGLE_EXT_DECL(quat_mi2s_rx_sample_rate, mi2s_rate_text); static SOC_ENUM_SINGLE_EXT_DECL(quin_mi2s_rx_sample_rate, mi2s_rate_text); static SOC_ENUM_SINGLE_EXT_DECL(prim_mi2s_tx_sample_rate, mi2s_rate_text); static SOC_ENUM_SINGLE_EXT_DECL(sec_mi2s_tx_sample_rate, mi2s_rate_text); static SOC_ENUM_SINGLE_EXT_DECL(tert_mi2s_tx_sample_rate, mi2s_rate_text); static SOC_ENUM_SINGLE_EXT_DECL(quat_mi2s_tx_sample_rate, mi2s_rate_text); static SOC_ENUM_SINGLE_EXT_DECL(quin_mi2s_tx_sample_rate, mi2s_rate_text); static SOC_ENUM_SINGLE_EXT_DECL(prim_mi2s_rx_format, mi2s_format_text); static SOC_ENUM_SINGLE_EXT_DECL(sec_mi2s_rx_format, mi2s_format_text); static SOC_ENUM_SINGLE_EXT_DECL(tert_mi2s_rx_format, mi2s_format_text); static SOC_ENUM_SINGLE_EXT_DECL(quat_mi2s_rx_format, mi2s_format_text); static SOC_ENUM_SINGLE_EXT_DECL(quin_mi2s_rx_format, mi2s_format_text); static SOC_ENUM_SINGLE_EXT_DECL(prim_mi2s_tx_format, mi2s_format_text); static SOC_ENUM_SINGLE_EXT_DECL(sec_mi2s_tx_format, mi2s_format_text); static SOC_ENUM_SINGLE_EXT_DECL(tert_mi2s_tx_format, mi2s_format_text); static SOC_ENUM_SINGLE_EXT_DECL(quat_mi2s_tx_format, mi2s_format_text); static SOC_ENUM_SINGLE_EXT_DECL(quin_mi2s_tx_format, mi2s_format_text); static SOC_ENUM_SINGLE_EXT_DECL(prim_mi2s_rx_chs, mi2s_ch_text); static SOC_ENUM_SINGLE_EXT_DECL(prim_mi2s_tx_chs, mi2s_ch_text); static SOC_ENUM_SINGLE_EXT_DECL(sec_mi2s_rx_chs, mi2s_ch_text); Loading @@ -318,6 +351,8 @@ static SOC_ENUM_SINGLE_EXT_DECL(tert_mi2s_rx_chs, mi2s_ch_text); static SOC_ENUM_SINGLE_EXT_DECL(tert_mi2s_tx_chs, mi2s_ch_text); static SOC_ENUM_SINGLE_EXT_DECL(quat_mi2s_rx_chs, mi2s_ch_text); static SOC_ENUM_SINGLE_EXT_DECL(quat_mi2s_tx_chs, mi2s_ch_text); static SOC_ENUM_SINGLE_EXT_DECL(quin_mi2s_rx_chs, mi2s_ch_text); static SOC_ENUM_SINGLE_EXT_DECL(quin_mi2s_tx_chs, mi2s_ch_text); static SOC_ENUM_SINGLE_EXT_DECL(usb_rx_chs, usb_ch_text); static SOC_ENUM_SINGLE_EXT_DECL(usb_tx_chs, usb_ch_text); static SOC_ENUM_SINGLE_EXT_DECL(usb_rx_format, bit_format_text); Loading Loading @@ -520,6 +555,9 @@ static int tdm_get_port_idx(struct snd_kcontrol *kcontrol, } else if (strnstr(kcontrol->id.name, "QUAT", sizeof(kcontrol->id.name))) { port->mode = TDM_QUAT; } else if (strnstr(kcontrol->id.name, "QUIN", sizeof(kcontrol->id.name))) { port->mode = TDM_QUIN; } else { pr_err("%s: unsupported mode in: %s", __func__, kcontrol->id.name); Loading Loading @@ -955,6 +993,9 @@ static int aux_pcm_get_port_idx(struct snd_kcontrol *kcontrol) else if (strnstr(kcontrol->id.name, "QUAT_AUX_PCM", sizeof("QUAT_AUX_PCM"))) idx = QUAT_AUX_PCM; else if (strnstr(kcontrol->id.name, "QUIN_AUX_PCM", sizeof("QUIN_AUX_PCM"))) idx = QUIN_AUX_PCM; else { pr_err("%s: unsupported port: %s", __func__, kcontrol->id.name); Loading Loading @@ -1052,6 +1093,9 @@ static int mi2s_get_port_idx(struct snd_kcontrol *kcontrol) else if (strnstr(kcontrol->id.name, "QUAT_MI2S_RX", sizeof("QUAT_MI2S_RX"))) idx = QUAT_MI2S; else if (strnstr(kcontrol->id.name, "QUIN_MI2S_RX", sizeof("QUIN_MI2S_RX"))) idx = QUIN_MI2S; else if (strnstr(kcontrol->id.name, "PRIM_MI2S_TX", sizeof("PRIM_MI2S_TX"))) idx = PRIM_MI2S; Loading @@ -1064,6 +1108,9 @@ static int mi2s_get_port_idx(struct snd_kcontrol *kcontrol) else if (strnstr(kcontrol->id.name, "QUAT_MI2S_TX", sizeof("QUAT_MI2S_TX"))) idx = QUAT_MI2S; else if (strnstr(kcontrol->id.name, "QUIN_MI2S_TX", sizeof("QUIN_MI2S_TX"))) idx = QUIN_MI2S; else { pr_err("%s: unsupported channel: %s", __func__, kcontrol->id.name); Loading Loading @@ -1836,6 +1883,9 @@ const struct snd_kcontrol_new msm_common_snd_controls[] = { SOC_ENUM_EXT("QUAT_AUX_PCM_RX SampleRate", quat_aux_pcm_rx_sample_rate, aux_pcm_rx_sample_rate_get, aux_pcm_rx_sample_rate_put), SOC_ENUM_EXT("QUIN_AUX_PCM_RX SampleRate", quin_aux_pcm_rx_sample_rate, aux_pcm_rx_sample_rate_get, aux_pcm_rx_sample_rate_put), SOC_ENUM_EXT("PRIM_AUX_PCM_TX SampleRate", prim_aux_pcm_tx_sample_rate, aux_pcm_tx_sample_rate_get, aux_pcm_tx_sample_rate_put), Loading @@ -1848,6 +1898,9 @@ const struct snd_kcontrol_new msm_common_snd_controls[] = { SOC_ENUM_EXT("QUAT_AUX_PCM_TX SampleRate", quat_aux_pcm_tx_sample_rate, aux_pcm_tx_sample_rate_get, aux_pcm_tx_sample_rate_put), SOC_ENUM_EXT("QUIN_AUX_PCM_TX SampleRate", quin_aux_pcm_tx_sample_rate, aux_pcm_tx_sample_rate_get, aux_pcm_tx_sample_rate_put), SOC_ENUM_EXT("PRIM_MI2S_RX SampleRate", prim_mi2s_rx_sample_rate, mi2s_rx_sample_rate_get, mi2s_rx_sample_rate_put), Loading @@ -1860,6 +1913,9 @@ const struct snd_kcontrol_new msm_common_snd_controls[] = { SOC_ENUM_EXT("QUAT_MI2S_RX SampleRate", quat_mi2s_rx_sample_rate, mi2s_rx_sample_rate_get, mi2s_rx_sample_rate_put), SOC_ENUM_EXT("QUIN_MI2S_RX SampleRate", quin_mi2s_rx_sample_rate, mi2s_rx_sample_rate_get, mi2s_rx_sample_rate_put), SOC_ENUM_EXT("PRIM_MI2S_TX SampleRate", prim_mi2s_tx_sample_rate, mi2s_tx_sample_rate_get, mi2s_tx_sample_rate_put), Loading @@ -1872,6 +1928,9 @@ const struct snd_kcontrol_new msm_common_snd_controls[] = { SOC_ENUM_EXT("QUAT_MI2S_TX SampleRate", quat_mi2s_tx_sample_rate, mi2s_tx_sample_rate_get, mi2s_tx_sample_rate_put), SOC_ENUM_EXT("QUIN_MI2S_TX SampleRate", quin_mi2s_tx_sample_rate, mi2s_tx_sample_rate_get, mi2s_tx_sample_rate_put), SOC_ENUM_EXT("PRIM_MI2S_RX Format", prim_mi2s_rx_format, mi2s_rx_format_get, mi2s_rx_format_put), Loading @@ -1884,6 +1943,9 @@ const struct snd_kcontrol_new msm_common_snd_controls[] = { SOC_ENUM_EXT("QUAT_MI2S_RX Format", quat_mi2s_rx_format, mi2s_rx_format_get, mi2s_rx_format_put), SOC_ENUM_EXT("QUIN_MI2S_RX Format", quin_mi2s_rx_format, mi2s_rx_format_get, mi2s_rx_format_put), SOC_ENUM_EXT("PRIM_MI2S_TX Format", prim_mi2s_tx_format, mi2s_tx_format_get, mi2s_tx_format_put), Loading @@ -1896,6 +1958,9 @@ const struct snd_kcontrol_new msm_common_snd_controls[] = { SOC_ENUM_EXT("QUAT_MI2S_TX Format", quat_mi2s_tx_format, mi2s_tx_format_get, mi2s_tx_format_put), SOC_ENUM_EXT("QUIN_MI2S_TX Format", quin_mi2s_tx_format, mi2s_tx_format_get, mi2s_tx_format_put), SOC_ENUM_EXT("PRIM_MI2S_RX Channels", prim_mi2s_rx_chs, msm_mi2s_rx_ch_get, msm_mi2s_rx_ch_put), SOC_ENUM_EXT("PRIM_MI2S_TX Channels", prim_mi2s_tx_chs, Loading @@ -1912,6 +1977,10 @@ const struct snd_kcontrol_new msm_common_snd_controls[] = { msm_mi2s_rx_ch_get, msm_mi2s_rx_ch_put), SOC_ENUM_EXT("QUAT_MI2S_TX Channels", quat_mi2s_tx_chs, msm_mi2s_tx_ch_get, msm_mi2s_tx_ch_put), SOC_ENUM_EXT("QUIN_MI2S_RX Channels", quin_mi2s_rx_chs, msm_mi2s_rx_ch_get, msm_mi2s_rx_ch_put), SOC_ENUM_EXT("QUIN_MI2S_TX Channels", quin_mi2s_tx_chs, msm_mi2s_tx_ch_get, msm_mi2s_tx_ch_put), SOC_ENUM_EXT("USB_AUDIO_RX Channels", usb_rx_chs, usb_audio_rx_ch_get, usb_audio_rx_ch_put), SOC_ENUM_EXT("USB_AUDIO_TX Channels", usb_tx_chs, Loading Loading @@ -2005,6 +2074,24 @@ const struct snd_kcontrol_new msm_common_snd_controls[] = { SOC_ENUM_EXT("QUAT_TDM_TX_0 Channels", tdm_tx_chs, tdm_tx_ch_get, tdm_tx_ch_put), SOC_ENUM_EXT("QUIN_TDM_RX_0 SampleRate", tdm_rx_sample_rate, tdm_rx_sample_rate_get, tdm_rx_sample_rate_put), SOC_ENUM_EXT("QUIN_TDM_TX_0 SampleRate", tdm_tx_sample_rate, tdm_tx_sample_rate_get, tdm_tx_sample_rate_put), SOC_ENUM_EXT("QUIN_TDM_RX_0 Format", tdm_rx_format, tdm_rx_format_get, tdm_rx_format_put), SOC_ENUM_EXT("QUIN_TDM_TX_0 Format", tdm_tx_format, tdm_tx_format_get, tdm_tx_format_put), SOC_ENUM_EXT("QUIN_TDM_RX_0 Channels", tdm_rx_chs, tdm_rx_ch_get, tdm_rx_ch_put), SOC_ENUM_EXT("QUIN_TDM_TX_0 Channels", tdm_tx_chs, tdm_tx_ch_get, tdm_tx_ch_put), }; /** Loading Loading @@ -2187,6 +2274,22 @@ int msm_common_be_hw_params_fixup(struct snd_soc_pcm_runtime *rtd, rate->min = rate->max = tdm_tx_cfg[TDM_QUAT][TDM_0].sample_rate; break; case MSM_BACKEND_DAI_QUIN_TDM_RX_0: channels->min = channels->max = tdm_rx_cfg[TDM_QUIN][TDM_0].channels; param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, tdm_rx_cfg[TDM_QUIN][TDM_0].bit_format); rate->min = rate->max = tdm_rx_cfg[TDM_QUIN][TDM_0].sample_rate; break; case MSM_BACKEND_DAI_QUIN_TDM_TX_0: channels->min = channels->max = tdm_tx_cfg[TDM_QUIN][TDM_0].channels; param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, tdm_tx_cfg[TDM_QUIN][TDM_0].bit_format); rate->min = rate->max = tdm_tx_cfg[TDM_QUIN][TDM_0].sample_rate; break; case MSM_BACKEND_DAI_AUXPCM_RX: rate->min = rate->max = aux_pcm_rx_cfg[PRIM_AUX_PCM].sample_rate; Loading Loading @@ -2243,6 +2346,20 @@ int msm_common_be_hw_params_fixup(struct snd_soc_pcm_runtime *rtd, aux_pcm_tx_cfg[QUAT_AUX_PCM].channels; break; case MSM_BACKEND_DAI_QUIN_AUXPCM_RX: rate->min = rate->max = aux_pcm_rx_cfg[QUIN_AUX_PCM].sample_rate; channels->min = channels->max = aux_pcm_rx_cfg[QUIN_AUX_PCM].channels; break; case MSM_BACKEND_DAI_QUIN_AUXPCM_TX: rate->min = rate->max = aux_pcm_tx_cfg[QUIN_AUX_PCM].sample_rate; channels->min = channels->max = aux_pcm_tx_cfg[QUIN_AUX_PCM].channels; break; case MSM_BACKEND_DAI_PRI_MI2S_RX: rate->min = rate->max = mi2s_rx_cfg[PRIM_MI2S].sample_rate; channels->min = channels->max = Loading Loading @@ -2307,6 +2424,22 @@ int msm_common_be_hw_params_fixup(struct snd_soc_pcm_runtime *rtd, mi2s_tx_cfg[QUAT_MI2S].bit_format); break; case MSM_BACKEND_DAI_QUINARY_MI2S_RX: rate->min = rate->max = mi2s_rx_cfg[QUIN_MI2S].sample_rate; channels->min = channels->max = mi2s_rx_cfg[QUIN_MI2S].channels; param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, mi2s_rx_cfg[QUIN_MI2S].bit_format); break; case MSM_BACKEND_DAI_QUINARY_MI2S_TX: rate->min = rate->max = mi2s_tx_cfg[QUIN_MI2S].sample_rate; channels->min = channels->max = mi2s_tx_cfg[QUIN_MI2S].channels; param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, mi2s_tx_cfg[QUIN_MI2S].bit_format); break; default: rate->min = rate->max = SAMPLING_RATE_48KHZ; break; Loading Loading @@ -2381,6 +2514,12 @@ static int msm_get_port_id(int id) case MSM_BACKEND_DAI_QUATERNARY_MI2S_TX: afe_port_id = AFE_PORT_ID_QUATERNARY_MI2S_TX; break; case MSM_BACKEND_DAI_QUINARY_MI2S_RX: afe_port_id = AFE_PORT_ID_QUINARY_MI2S_RX; break; case MSM_BACKEND_DAI_QUINARY_MI2S_TX: afe_port_id = AFE_PORT_ID_QUINARY_MI2S_TX; break; default: pr_err("%s: Invalid id: %d\n", __func__, id); afe_port_id = -EINVAL; Loading Loading @@ -2481,7 +2620,7 @@ int msm_mi2s_snd_startup(struct snd_pcm_substream *substream) __func__, substream->name, substream->stream, cpu_dai->name, cpu_dai->id); if (index < PRIM_MI2S || index > QUAT_MI2S) { if (index < PRIM_MI2S || index >= MI2S_MAX) { ret = -EINVAL; dev_err(rtd->card->dev, "%s: CPU DAI id (%d) out of range\n", Loading Loading @@ -2555,7 +2694,7 @@ void msm_mi2s_snd_shutdown(struct snd_pcm_substream *substream) pr_debug("%s(): substream = %s stream = %d\n", __func__, substream->name, substream->stream); if (index < PRIM_MI2S || index > QUAT_MI2S) { if (index < PRIM_MI2S || index >= MI2S_MAX) { pr_err("%s:invalid MI2S DAI(%d)\n", __func__, index); return; } Loading
asoc/sdm660-common.h +1 −0 Original line number Diff line number Diff line Loading @@ -51,6 +51,7 @@ enum { TDM_SEC, TDM_TERT, TDM_QUAT, TDM_QUIN, TDM_INTERFACE_MAX, }; Loading
asoc/sdm660-ext-dai-links.c +90 −0 Original line number Diff line number Diff line Loading @@ -205,10 +205,12 @@ static int msm_tdm_snd_hw_params(struct snd_pcm_substream *substream, case AFE_PORT_ID_SECONDARY_TDM_RX: case AFE_PORT_ID_TERTIARY_TDM_RX: case AFE_PORT_ID_QUATERNARY_TDM_RX: case AFE_PORT_ID_QUINARY_TDM_RX: case AFE_PORT_ID_PRIMARY_TDM_TX: case AFE_PORT_ID_SECONDARY_TDM_TX: case AFE_PORT_ID_TERTIARY_TDM_TX: case AFE_PORT_ID_QUATERNARY_TDM_TX: case AFE_PORT_ID_QUINARY_TDM_TX: slot_offset = tdm_slot_offset[TDM_0]; break; default: Loading Loading @@ -1568,6 +1570,34 @@ static struct snd_soc_dai_link msm_ext_common_be_dai[] = { .ops = &msm_tdm_be_ops, .ignore_suspend = 1, }, { .name = LPASS_BE_QUIN_TDM_RX_0, .stream_name = "Quinary TDM0 Playback", .cpu_dai_name = "msm-dai-q6-tdm.37184", .platform_name = "msm-pcm-routing", .codec_name = "msm-stub-codec.1", .codec_dai_name = "msm-stub-rx", .no_pcm = 1, .dpcm_playback = 1, .id = MSM_BACKEND_DAI_QUIN_TDM_RX_0, .be_hw_params_fixup = msm_common_be_hw_params_fixup, .ops = &msm_tdm_be_ops, .ignore_suspend = 1, }, { .name = LPASS_BE_QUIN_TDM_TX_0, .stream_name = "Quinary TDM0 Capture", .cpu_dai_name = "msm-dai-q6-tdm.37185", .platform_name = "msm-pcm-routing", .codec_name = "msm-stub-codec.1", .codec_dai_name = "msm-stub-tx", .no_pcm = 1, .dpcm_capture = 1, .id = MSM_BACKEND_DAI_QUIN_TDM_TX_0, .be_hw_params_fixup = msm_common_be_hw_params_fixup, .ops = &msm_tdm_be_ops, .ignore_suspend = 1, }, }; static struct snd_soc_dai_link msm_mi2s_be_dai_links[] = { Loading Loading @@ -1687,6 +1717,35 @@ static struct snd_soc_dai_link msm_mi2s_be_dai_links[] = { .ops = &msm_mi2s_be_ops, .ignore_suspend = 1, }, { .name = LPASS_BE_QUIN_MI2S_RX, .stream_name = "Quinary MI2S Playback", .cpu_dai_name = "msm-dai-q6-mi2s.5", .platform_name = "msm-pcm-routing", .codec_name = "msm-stub-codec.1", .codec_dai_name = "msm-stub-rx", .no_pcm = 1, .dpcm_playback = 1, .id = MSM_BACKEND_DAI_QUINARY_MI2S_RX, .be_hw_params_fixup = msm_common_be_hw_params_fixup, .ops = &msm_mi2s_be_ops, .ignore_suspend = 1, .ignore_pmdown_time = 1, }, { .name = LPASS_BE_QUIN_MI2S_TX, .stream_name = "Quinary MI2S Capture", .cpu_dai_name = "msm-dai-q6-mi2s.5", .platform_name = "msm-pcm-routing", .codec_name = "msm-stub-codec.1", .codec_dai_name = "msm-stub-tx", .no_pcm = 1, .dpcm_capture = 1, .id = MSM_BACKEND_DAI_QUINARY_MI2S_TX, .be_hw_params_fixup = msm_common_be_hw_params_fixup, .ops = &msm_mi2s_be_ops, .ignore_suspend = 1, }, }; static struct snd_soc_dai_link msm_auxpcm_be_dai_links[] = { Loading Loading @@ -1814,6 +1873,37 @@ static struct snd_soc_dai_link msm_auxpcm_be_dai_links[] = { .ignore_pmdown_time = 1, .ops = &msm_aux_pcm_be_ops, }, /* Quinary AUX PCM Backend DAI Links */ { .name = LPASS_BE_QUIN_AUXPCM_RX, .stream_name = "Quin AUX PCM Playback", .cpu_dai_name = "msm-dai-q6-auxpcm.5", .platform_name = "msm-pcm-routing", .codec_name = "msm-stub-codec.1", .codec_dai_name = "msm-stub-rx", .no_pcm = 1, .dpcm_playback = 1, .id = MSM_BACKEND_DAI_QUIN_AUXPCM_RX, .be_hw_params_fixup = msm_common_be_hw_params_fixup, .ignore_pmdown_time = 1, .ignore_suspend = 1, .ops = &msm_aux_pcm_be_ops, }, { .name = LPASS_BE_QUIN_AUXPCM_TX, .stream_name = "Quin AUX PCM Capture", .cpu_dai_name = "msm-dai-q6-auxpcm.5", .platform_name = "msm-pcm-routing", .codec_name = "msm-stub-codec.1", .codec_dai_name = "msm-stub-tx", .no_pcm = 1, .dpcm_capture = 1, .id = MSM_BACKEND_DAI_QUIN_AUXPCM_TX, .be_hw_params_fixup = msm_common_be_hw_params_fixup, .ignore_suspend = 1, .ignore_pmdown_time = 1, .ops = &msm_aux_pcm_be_ops, }, }; static struct snd_soc_dai_link msm_wcn_be_dai_links[] = { Loading
asoc/sdm660-internal.c +90 −0 Original line number Diff line number Diff line Loading @@ -1499,10 +1499,12 @@ static int msm_tdm_snd_hw_params(struct snd_pcm_substream *substream, case AFE_PORT_ID_SECONDARY_TDM_RX: case AFE_PORT_ID_TERTIARY_TDM_RX: case AFE_PORT_ID_QUATERNARY_TDM_RX: case AFE_PORT_ID_QUINARY_TDM_RX: case AFE_PORT_ID_PRIMARY_TDM_TX: case AFE_PORT_ID_SECONDARY_TDM_TX: case AFE_PORT_ID_TERTIARY_TDM_TX: case AFE_PORT_ID_QUATERNARY_TDM_TX: case AFE_PORT_ID_QUINARY_TDM_TX: slot_offset = tdm_slot_offset[TDM_0]; break; default: Loading Loading @@ -2607,6 +2609,34 @@ static struct snd_soc_dai_link msm_int_be_dai[] = { .ops = &msm_tdm_be_ops, .ignore_suspend = 1, }, { .name = LPASS_BE_QUIN_TDM_RX_0, .stream_name = "Quinary TDM0 Playback", .cpu_dai_name = "msm-dai-q6-tdm.37184", .platform_name = "msm-pcm-routing", .codec_name = "msm-stub-codec.1", .codec_dai_name = "msm-stub-rx", .no_pcm = 1, .dpcm_playback = 1, .id = MSM_BACKEND_DAI_QUIN_TDM_RX_0, .be_hw_params_fixup = msm_common_be_hw_params_fixup, .ops = &msm_tdm_be_ops, .ignore_suspend = 1, }, { .name = LPASS_BE_QUIN_TDM_TX_0, .stream_name = "Quinary TDM0 Capture", .cpu_dai_name = "msm-dai-q6-tdm.37185", .platform_name = "msm-pcm-routing", .codec_name = "msm-stub-codec.1", .codec_dai_name = "msm-stub-tx", .no_pcm = 1, .dpcm_capture = 1, .id = MSM_BACKEND_DAI_QUIN_TDM_TX_0, .be_hw_params_fixup = msm_common_be_hw_params_fixup, .ops = &msm_tdm_be_ops, .ignore_suspend = 1, }, }; static struct snd_soc_dai_link msm_mi2s_be_dai_links[] = { Loading Loading @@ -2726,6 +2756,35 @@ static struct snd_soc_dai_link msm_mi2s_be_dai_links[] = { .ops = &msm_mi2s_be_ops, .ignore_suspend = 1, }, { .name = LPASS_BE_QUIN_MI2S_RX, .stream_name = "Quinary MI2S Playback", .cpu_dai_name = "msm-dai-q6-mi2s.5", .platform_name = "msm-pcm-routing", .codec_name = "msm-stub-codec.1", .codec_dai_name = "msm-stub-rx", .no_pcm = 1, .dpcm_playback = 1, .id = MSM_BACKEND_DAI_QUINARY_MI2S_RX, .be_hw_params_fixup = msm_common_be_hw_params_fixup, .ops = &msm_mi2s_be_ops, .ignore_suspend = 1, .ignore_pmdown_time = 1, }, { .name = LPASS_BE_QUIN_MI2S_TX, .stream_name = "Quinary MI2S Capture", .cpu_dai_name = "msm-dai-q6-mi2s.5", .platform_name = "msm-pcm-routing", .codec_name = "msm-stub-codec.1", .codec_dai_name = "msm-stub-tx", .no_pcm = 1, .dpcm_capture = 1, .id = MSM_BACKEND_DAI_QUINARY_MI2S_TX, .be_hw_params_fixup = msm_common_be_hw_params_fixup, .ops = &msm_mi2s_be_ops, .ignore_suspend = 1, }, }; static struct snd_soc_dai_link msm_auxpcm_be_dai_links[] = { Loading Loading @@ -2853,6 +2912,37 @@ static struct snd_soc_dai_link msm_auxpcm_be_dai_links[] = { .ignore_pmdown_time = 1, .ops = &msm_aux_pcm_be_ops, }, /* Quinary AUX PCM Backend DAI Links */ { .name = LPASS_BE_QUIN_AUXPCM_RX, .stream_name = "Quin AUX PCM Playback", .cpu_dai_name = "msm-dai-q6-auxpcm.5", .platform_name = "msm-pcm-routing", .codec_name = "msm-stub-codec.1", .codec_dai_name = "msm-stub-rx", .no_pcm = 1, .dpcm_playback = 1, .id = MSM_BACKEND_DAI_QUIN_AUXPCM_RX, .be_hw_params_fixup = msm_common_be_hw_params_fixup, .ignore_pmdown_time = 1, .ignore_suspend = 1, .ops = &msm_aux_pcm_be_ops, }, { .name = LPASS_BE_QUIN_AUXPCM_TX, .stream_name = "Quin AUX PCM Capture", .cpu_dai_name = "msm-dai-q6-auxpcm.5", .platform_name = "msm-pcm-routing", .codec_name = "msm-stub-codec.1", .codec_dai_name = "msm-stub-tx", .no_pcm = 1, .dpcm_capture = 1, .id = MSM_BACKEND_DAI_QUIN_AUXPCM_TX, .be_hw_params_fixup = msm_common_be_hw_params_fixup, .ignore_suspend = 1, .ignore_pmdown_time = 1, .ops = &msm_aux_pcm_be_ops, }, }; Loading