diff options
author | qctecmdr <qctecmdr@localhost> | 2020-02-28 18:10:30 -0800 |
---|---|---|
committer | Gerrit - the friendly Code Review server <code-review@localhost> | 2020-02-28 18:10:29 -0800 |
commit | 034f5e8bfb830355307835e67c32b92b46b266d1 (patch) | |
tree | d63b1a7d2c0184998c7bb2cfad01154c8440d611 | |
parent | 51b61dc4a5131abbf06cb6d5c8641b3b267cc092 (diff) | |
parent | 9fb14b346750d1a1912111c99483e4939b7b9c30 (diff) | |
download | msm-extra-034f5e8bfb830355307835e67c32b92b46b266d1.tar.gz |
Merge "ASoC: sm8150 fix for i2s"
-rw-r--r-- | asoc/msm-pcm-routing-v2.c | 28 | ||||
-rw-r--r-- | asoc/msm-pcm-routing-v2.h | 4 | ||||
-rw-r--r-- | asoc/sm8150.c | 98 |
3 files changed, 114 insertions, 16 deletions
diff --git a/asoc/msm-pcm-routing-v2.c b/asoc/msm-pcm-routing-v2.c index ce670a24..514bbf7d 100644 --- a/asoc/msm-pcm-routing-v2.c +++ b/asoc/msm-pcm-routing-v2.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2012-2019, The Linux Foundation. All rights reserved. +/* Copyright (c) 2012-2020, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -730,6 +730,12 @@ static struct msm_pcm_routing_fdai_data /* MULTIMEDIA29 */ {{0, INVALID_SESSION, LEGACY_PCM_MODE, {NULL, NULL}, LEGACY_PCM}, {0, INVALID_SESSION, LEGACY_PCM_MODE, {NULL, NULL}, LEGACY_PCM} }, + /* MULTIMEDIA30 */ + {{0, INVALID_SESSION, LEGACY_PCM_MODE, {NULL, NULL}, LEGACY_PCM}, + {0, INVALID_SESSION, LEGACY_PCM_MODE, {NULL, NULL}, LEGACY_PCM} }, + /* MULTIMEDIA31 */ + {{0, INVALID_SESSION, LEGACY_PCM_MODE, {NULL, NULL}, LEGACY_PCM}, + {0, INVALID_SESSION, LEGACY_PCM_MODE, {NULL, NULL}, LEGACY_PCM} }, /* VOIP */ {{0, INVALID_SESSION, LEGACY_PCM_MODE, {NULL, NULL}, LEGACY_PCM}, {0, INVALID_SESSION, LEGACY_PCM_MODE, {NULL, NULL}, LEGACY_PCM} }, @@ -12324,6 +12330,10 @@ static const struct snd_kcontrol_new slimbus_rx_voice_mixer_controls[] = { MSM_BACKEND_DAI_SLIMBUS_0_RX, MSM_FRONTEND_DAI_VOICEMMODE2, 1, 0, msm_routing_get_voice_mixer, msm_routing_put_voice_mixer), + SOC_DOUBLE_EXT("Voice Stub", SND_SOC_NOPM, + MSM_BACKEND_DAI_SLIMBUS_0_RX, + MSM_FRONTEND_DAI_VOICE_STUB, 1, 0, msm_routing_get_voice_stub_mixer, + msm_routing_put_voice_stub_mixer), }; static const struct snd_kcontrol_new slimbus_6_rx_voice_mixer_controls[] = { @@ -12347,6 +12357,10 @@ MSM_BACKEND_DAI_SLIMBUS_6_RX, MSM_BACKEND_DAI_SLIMBUS_6_RX, MSM_FRONTEND_DAI_VOICEMMODE2, 1, 0, msm_routing_get_voice_mixer, msm_routing_put_voice_mixer), + SOC_DOUBLE_EXT("Voice Stub", SND_SOC_NOPM, + MSM_BACKEND_DAI_SLIMBUS_6_RX, + MSM_FRONTEND_DAI_VOICE_STUB, 1, 0, msm_routing_get_voice_stub_mixer, + msm_routing_put_voice_stub_mixer), }; static const struct snd_kcontrol_new usb_audio_rx_voice_mixer_controls[] = { @@ -12577,6 +12591,10 @@ static const struct snd_kcontrol_new quat_mi2s_rx_voice_mixer_controls[] = { MSM_BACKEND_DAI_QUATERNARY_MI2S_RX, MSM_FRONTEND_DAI_VOICEMMODE2, 1, 0, msm_routing_get_voice_mixer, msm_routing_put_voice_mixer), + SOC_DOUBLE_EXT("Voice Stub", SND_SOC_NOPM, + MSM_BACKEND_DAI_QUATERNARY_MI2S_RX, + MSM_FRONTEND_DAI_VOICE_STUB, 1, 0, msm_routing_get_voice_stub_mixer, + msm_routing_put_voice_stub_mixer), }; static const struct snd_kcontrol_new quin_mi2s_rx_voice_mixer_controls[] = { @@ -14278,6 +14296,10 @@ static const struct snd_kcontrol_new quat_mi2s_rx_port_mixer_controls[] = { MSM_BACKEND_DAI_QUATERNARY_MI2S_RX, MSM_BACKEND_DAI_SLIMBUS_0_TX, 1, 0, msm_routing_get_port_mixer, msm_routing_put_port_mixer), + SOC_DOUBLE_EXT("SLIM_1_TX", SND_SOC_NOPM, + MSM_BACKEND_DAI_QUATERNARY_MI2S_RX, + MSM_BACKEND_DAI_SLIMBUS_1_TX, 1, 0, msm_routing_get_port_mixer, + msm_routing_put_port_mixer), SOC_DOUBLE_EXT("SEC_MI2S_TX", SND_SOC_NOPM, MSM_BACKEND_DAI_QUATERNARY_MI2S_RX, MSM_BACKEND_DAI_SECONDARY_MI2S_TX, 1, 0, msm_routing_get_port_mixer, @@ -21595,6 +21617,7 @@ static const struct snd_soc_dapm_route intercon[] = { {"SLIM_0_RX_Voice Mixer", "QCHAT", "QCHAT_DL"}, {"SLIM_0_RX_Voice Mixer", "VoiceMMode1", "VOICEMMODE1_DL"}, {"SLIM_0_RX_Voice Mixer", "VoiceMMode2", "VOICEMMODE2_DL"}, + {"SLIM_0_RX_Voice Mixer", "Voice Stub", "VOICE_STUB_DL"}, {"SLIMBUS_0_RX", NULL, "SLIM_0_RX_Voice Mixer"}, {"SLIM_6_RX_Voice Mixer", "Voip", "VOIP_DL"}, @@ -21602,6 +21625,7 @@ static const struct snd_soc_dapm_route intercon[] = { {"SLIM_6_RX_Voice Mixer", "QCHAT", "QCHAT_DL"}, {"SLIM_6_RX_Voice Mixer", "VoiceMMode1", "VOICEMMODE1_DL"}, {"SLIM_6_RX_Voice Mixer", "VoiceMMode2", "VOICEMMODE2_DL"}, + {"SLIM_6_RX_Voice Mixer", "Voice Stub", "VOICE_STUB_DL"}, {"SLIMBUS_6_RX", NULL, "SLIM_6_RX_Voice Mixer"}, {"USB_AUDIO_RX_Voice Mixer", "Voip", "VOIP_DL"}, @@ -21721,6 +21745,7 @@ static const struct snd_soc_dapm_route intercon[] = { {"QUAT_MI2S_RX_Voice Mixer", "QCHAT", "QCHAT_DL"}, {"QUAT_MI2S_RX_Voice Mixer", "VoiceMMode1", "VOICEMMODE1_DL"}, {"QUAT_MI2S_RX_Voice Mixer", "VoiceMMode2", "VOICEMMODE2_DL"}, + {"QUAT_MI2S_RX_Voice Mixer", "Voice Stub", "VOICE_STUB_DL"}, {"QUAT_MI2S_RX", NULL, "QUAT_MI2S_RX_Voice Mixer"}, {"QUIN_MI2S_RX_Voice Mixer", "Voip", "VOIP_DL"}, @@ -22868,6 +22893,7 @@ static const struct snd_soc_dapm_route intercon[] = { {"QUAT_MI2S_RX Port Mixer", "QUAT_MI2S_TX", "QUAT_MI2S_TX"}, {"QUAT_MI2S_RX Port Mixer", "QUIN_MI2S_TX", "QUIN_MI2S_TX"}, {"QUAT_MI2S_RX Port Mixer", "SLIM_0_TX", "SLIMBUS_0_TX"}, + {"QUAT_MI2S_RX Port Mixer", "SLIM_1_TX", "SLIMBUS_1_TX"}, {"QUAT_MI2S_RX Port Mixer", "INTERNAL_FM_TX", "INT_FM_TX"}, {"QUAT_MI2S_RX Port Mixer", "AUX_PCM_UL_TX", "AUX_PCM_TX"}, {"QUAT_MI2S_RX Port Mixer", "SLIM_8_TX", "SLIMBUS_8_TX"}, diff --git a/asoc/msm-pcm-routing-v2.h b/asoc/msm-pcm-routing-v2.h index fa5c8585..2c605bfb 100644 --- a/asoc/msm-pcm-routing-v2.h +++ b/asoc/msm-pcm-routing-v2.h @@ -272,8 +272,8 @@ enum { MSM_FRONTEND_DAI_MAX, }; -#define MSM_FRONTEND_DAI_MM_SIZE (MSM_FRONTEND_DAI_MULTIMEDIA31 + 1) -#define MSM_FRONTEND_DAI_MM_MAX_ID MSM_FRONTEND_DAI_MULTIMEDIA31 +#define MSM_FRONTEND_DAI_MM_SIZE (MSM_FRONTEND_DAI_VOLTE_STUB + 1) +#define MSM_FRONTEND_DAI_MM_MAX_ID MSM_FRONTEND_DAI_VOLTE_STUB enum { MSM_BACKEND_DAI_PRI_I2S_RX = 0, diff --git a/asoc/sm8150.c b/asoc/sm8150.c index 71d1204c..b0d62ef8 100644 --- a/asoc/sm8150.c +++ b/asoc/sm8150.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2016-2019, The Linux Foundation. All rights reserved. +/* Copyright (c) 2016-2020, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -174,6 +174,7 @@ struct msm_asoc_mach_data { struct device_node *hph_en1_gpio_p; /* used by pinctrl API */ struct device_node *hph_en0_gpio_p; /* used by pinctrl API */ struct device_node *fsa_handle; + struct device_node *mi2s_gpio_p[MI2S_MAX]; /* used by pinctrl API */ struct snd_soc_codec *codec; struct work_struct adsp_power_up_work; }; @@ -5037,23 +5038,29 @@ static int msm_mi2s_snd_startup(struct snd_pcm_substream *substream) ret = msm_mi2s_set_sclk(substream, true); if (ret < 0) { dev_err(rtd->card->dev, - "%s: afe lpass clock failed to enable MI2S clock, err:%d\n", + "%s: afe lpass clock failed ", + "to enable MI2S clock, err:%d\n", __func__, ret); goto clean_up; } ret = snd_soc_dai_set_fmt(cpu_dai, fmt); if (ret < 0) { - pr_err("%s: set fmt cpu dai failed for MI2S (%d), err:%d\n", + pr_err("%s: set fmt cpu dai failed for MI2S(%d) err:%d\n", __func__, index, ret); goto clk_off; } if (index == QUAT_MI2S) { ret_pinctrl = msm_set_pinctrl(pinctrl_info, - STATE_MI2S_ACTIVE); - if (ret_pinctrl) - pr_err("%s: MI2S TLMM pinctrl set failed with %d\n", + STATE_MI2S_ACTIVE); + if (ret_pinctrl) { + pr_err("%s: MI2S TLMM pinctrl set failed %d", + "switching to gpio\n", __func__, ret_pinctrl); + if (pdata->mi2s_gpio_p[index]) + msm_cdc_pinctrl_select_active_state( + pdata->mi2s_gpio_p[index]); + } } } clk_off: @@ -5088,14 +5095,19 @@ static void msm_mi2s_snd_shutdown(struct snd_pcm_substream *substream) if (--mi2s_intf_conf[index].ref_cnt == 0) { ret = msm_mi2s_set_sclk(substream, false); if (ret < 0) - pr_err("%s:clock disable failed for MI2S (%d); ret=%d\n", + pr_err("%s:clock disable failed for MI2S(%d) ret=%d\n", __func__, index, ret); if (index == QUAT_MI2S) { ret_pinctrl = msm_set_pinctrl(pinctrl_info, - STATE_DISABLE); - if (ret_pinctrl) - pr_err("%s: MI2S TLMM pinctrl set failed with %d\n", + STATE_DISABLE); + if (ret_pinctrl) { + pr_err("%s: MI2S TLMM pinctrl set failed %d", + "switching to gpio\n", __func__, ret_pinctrl); + if (pdata->mi2s_gpio_p[index]) + msm_cdc_pinctrl_select_sleep_state( + pdata->mi2s_gpio_p[index]); + } } } mutex_unlock(&mi2s_intf_conf[index].lock); @@ -5867,6 +5879,54 @@ static struct snd_soc_dai_link msm_common_misc_fe_dai_links[] = { .ignore_pmdown_time = 1, .id = MSM_FRONTEND_DAI_MULTIMEDIA31, }, + { + .name = "Quaternary MI2S_RX Hostless Playback", + .stream_name = "Quaternary MI2S_RX Hostless Playback", + .cpu_dai_name = "QUAT_MI2S_RX_HOSTLESS", + .platform_name = "msm-pcm-hostless", + .dynamic = 1, + .dpcm_playback = 1, + .trigger = {SND_SOC_DPCM_TRIGGER_POST, + SND_SOC_DPCM_TRIGGER_POST}, + .no_host_mode = SND_SOC_DAI_LINK_NO_HOST, + .ignore_suspend = 1, + .ignore_pmdown_time = 1, + .codec_dai_name = "snd-soc-dummy-dai", + .codec_name = "snd-soc-dummy", + }, + { + .name = "Quaternary MI2S_TX Hostless Capture", + .stream_name = "Quaternary MI2S_TX Hostless Capture", + .cpu_dai_name = "QUAT_MI2S_TX_HOSTLESS", + .platform_name = "msm-pcm-hostless", + .dynamic = 1, + .dpcm_capture = 1, + .trigger = {SND_SOC_DPCM_TRIGGER_POST, + SND_SOC_DPCM_TRIGGER_POST}, + .no_host_mode = SND_SOC_DAI_LINK_NO_HOST, + .ignore_suspend = 1, + .ignore_pmdown_time = 1, + .codec_dai_name = "snd-soc-dummy-dai", + .codec_name = "snd-soc-dummy", + }, +/* Voice Stub */ + { + .name = "Voice Stub", + .stream_name = "Voice Stub", + .cpu_dai_name = "VOICE_STUB", + .platform_name = "msm-pcm-hostless", + .dynamic = 1, + .dpcm_playback = 1, + .dpcm_capture = 1, + .trigger = {SND_SOC_DPCM_TRIGGER_POST, + SND_SOC_DPCM_TRIGGER_POST}, + .no_host_mode = SND_SOC_DAI_LINK_NO_HOST, + .ignore_suspend = 1, + /* this dainlink has playback support */ + .ignore_pmdown_time = 1, + .codec_dai_name = "snd-soc-dummy-dai", + .codec_name = "snd-soc-dummy", + }, }; static struct snd_soc_dai_link msm_common_be_dai_links[] = { @@ -6935,6 +6995,11 @@ struct snd_soc_card snd_soc_card_tavil_msm = { .late_probe = msm_snd_card_tavil_late_probe, }; +struct snd_soc_card snd_soc_card_hanasdx_msm = { + .name = "sm8150-hana55-snd-card", + .late_probe = msm_snd_card_tavil_late_probe, +}; + static int msm_populate_dai_link_component_of_node( struct snd_soc_card *card) { @@ -7147,6 +7212,8 @@ static const struct of_device_id sm8150_asoc_machine_of_match[] = { .data = "tavil_codec"}, { .compatible = "qcom,sm8150-asoc-snd-stub", .data = "stub_codec"}, + { .compatible = "qcom,sm8150-asoc-snd-hana55", + .data = "tavil_codec"}, {}, }; @@ -7231,7 +7298,10 @@ static struct snd_soc_card *populate_snd_card_dailinks(struct device *dev) dailink = msm_pahu_snd_card_dai_links; } else if (!strcmp(match->data, "tavil_codec")) { - card = &snd_soc_card_tavil_msm; + if (!strcmp(match->compatible, "qcom,sm8150-asoc-snd-hana55")) + card = &snd_soc_card_hanasdx_msm; + else + card = &snd_soc_card_tavil_msm; len_1 = ARRAY_SIZE(msm_common_dai_links); len_2 = len_1 + ARRAY_SIZE(msm_tavil_fe_dai_links); len_3 = len_2 + ARRAY_SIZE(msm_common_misc_fe_dai_links); @@ -7730,10 +7800,12 @@ static int msm_asoc_machine_probe(struct platform_device *pdev) if (!ret) { pr_debug("%s: pinctrl parsing successful\n", __func__); } else { - dev_dbg(&pdev->dev, - "%s: Parsing pinctrl failed with %d. Cannot use Ports\n", + pr_err("%s: Parsing pinctrl failed %d. switching to gpio\n", __func__, ret); ret = 0; + pdata->mi2s_gpio_p[QUAT_MI2S] = + of_parse_phandle(pdev->dev.of_node, + "qcom,quat-mi2s-gpios", 0); } msm_i2s_auxpcm_init(pdev); |