Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 9fb14b34 authored by Asish Bhattacharya's avatar Asish Bhattacharya Committed by Pallavi
Browse files

ASoC: sm8150 fix for i2s



Changes in audio-kernel to extend support for
hanasdx55 target.

Change-Id: If575528e763e9dccbb60c4a2054b767582d3701a
Signed-off-by: default avatarPallavi Mishra <pallavim@codeaurora.org>
parent f1992d62
Loading
Loading
Loading
Loading
+27 −1
Original line number Diff line number Diff line
/* 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
@@ -728,6 +728,12 @@ static struct msm_pcm_routing_fdai_data
	{{0, INVALID_SESSION, LEGACY_PCM_MODE, {NULL, NULL}, LEGACY_PCM},
	 {0, INVALID_SESSION, LEGACY_PCM_MODE, {NULL, NULL}, LEGACY_PCM} },
	/* 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 */
@@ -12313,6 +12319,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[] = {
@@ -12336,6 +12346,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[] = {
@@ -12566,6 +12580,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[] = {
@@ -14267,6 +14285,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,
@@ -21584,6 +21606,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"},
@@ -21591,6 +21614,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"},
@@ -21710,6 +21734,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"},
@@ -22857,6 +22882,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"},
+2 −2
Original line number Diff line number Diff line
@@ -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,
+85 −13
Original line number Diff line number Diff line
/* 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",
			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",
			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,6 +7298,9 @@ 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")) {
		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);
@@ -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);