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

Commit fe311197 authored by Phani Kumar Uppalapati's avatar Phani Kumar Uppalapati Committed by Stephen Boyd
Browse files

ASoC: msm8226: Divide snd card dai links based on the codec type



Add support to detect tapan codec variants by dividing
dai links based on the codec node and registering the two
sound cards.

Change-Id: I2dcea055de08b886abf93be1a7c09435b3e9493c
Signed-off-by: default avatarPhani Kumar Uppalapati <phaniu@codeaurora.org>
[agopik: Port to 3.10]
Signed-off-by: default avatarGopikrishnaiah Anandan <agopik@codeaurora.org>
parent 58e3a0a8
Loading
Loading
Loading
Loading
+2 −1
Original line number Diff line number Diff line
@@ -444,7 +444,8 @@ Optional properties:
			    amplifier.

- qcom,headset-jack-type-NO: Adjust GPIO level based on the headset jack type.

- qcom,tapan-codec-9302: Indicates that this device node is for WCD9302 audio
			    codec.

* APQ8074 ASoC Machine driver

+205 −40
Original line number Diff line number Diff line
@@ -904,7 +904,7 @@ static struct snd_soc_ops msm8226_be_ops = {
};

/* Digital audio interface glue - connects codec <---> CPU */
static struct snd_soc_dai_link msm8226_dai[] = {
static struct snd_soc_dai_link msm8226_common_dai[] = {
	/* FrontEnd DAI Links */
	{
		.name = "MSM8226 Media1",
@@ -1305,6 +1305,61 @@ static struct snd_soc_dai_link msm8226_dai[] = {
		.ops = &msm_auxpcm_be_ops,
		.ignore_suspend = 1
	},
	/* Incall Record Uplink BACK END DAI Link */
	{
		.name = LPASS_BE_INCALL_RECORD_TX,
		.stream_name = "Voice Uplink Capture",
		.cpu_dai_name = "msm-dai-q6-dev.32772",
		.platform_name = "msm-pcm-routing",
		.codec_name     = "msm-stub-codec.1",
		.codec_dai_name = "msm-stub-tx",
		.no_pcm = 1,
		.be_id = MSM_BACKEND_DAI_INCALL_RECORD_TX,
		.be_hw_params_fixup = msm_be_hw_params_fixup,
		.ignore_suspend = 1,
	},
	/* Incall Record Downlink BACK END DAI Link */
	{
		.name = LPASS_BE_INCALL_RECORD_RX,
		.stream_name = "Voice Downlink Capture",
		.cpu_dai_name = "msm-dai-q6-dev.32771",
		.platform_name = "msm-pcm-routing",
		.codec_name     = "msm-stub-codec.1",
		.codec_dai_name = "msm-stub-tx",
		.no_pcm = 1,
		.be_id = MSM_BACKEND_DAI_INCALL_RECORD_RX,
		.be_hw_params_fixup = msm_be_hw_params_fixup,
		.ignore_suspend = 1,
	},
	/* Incall Music BACK END DAI Link */
	{
		.name = LPASS_BE_VOICE_PLAYBACK_TX,
		.stream_name = "Voice Farend Playback",
		.cpu_dai_name = "msm-dai-q6-dev.32773",
		.platform_name = "msm-pcm-routing",
		.codec_name     = "msm-stub-codec.1",
		.codec_dai_name = "msm-stub-rx",
		.no_pcm = 1,
		.be_id = MSM_BACKEND_DAI_VOICE_PLAYBACK_TX,
		.be_hw_params_fixup = msm_be_hw_params_fixup,
		.ignore_suspend = 1,
	},
	/* Incall Music 2 BACK END DAI Link */
	{
		.name = LPASS_BE_VOICE2_PLAYBACK_TX,
		.stream_name = "Voice2 Farend Playback",
		.cpu_dai_name = "msm-dai-q6-dev.32770",
		.platform_name = "msm-pcm-routing",
		.codec_name     = "msm-stub-codec.1",
		.codec_dai_name = "msm-stub-rx",
		.no_pcm = 1,
		.be_id = MSM_BACKEND_DAI_VOICE2_PLAYBACK_TX,
		.be_hw_params_fixup = msm_be_hw_params_fixup,
		.ignore_suspend = 1,
	},
};

static struct snd_soc_dai_link msm8226_9306_dai[] = {
	/* Backend DAI Links */
	{
		.name = LPASS_BE_SLIMBUS_0_RX,
@@ -1418,64 +1473,142 @@ static struct snd_soc_dai_link msm8226_dai[] = {
		.ops = &msm8226_be_ops,
		.ignore_suspend = 1,
	},
	/* Incall Record Uplink BACK END DAI Link */
};

static struct snd_soc_dai_link msm8226_9302_dai[] = {
	/* Backend DAI Links */
	{
		.name = LPASS_BE_INCALL_RECORD_TX,
		.stream_name = "Voice Uplink Capture",
		.cpu_dai_name = "msm-dai-q6-dev.32772",
		.name = LPASS_BE_SLIMBUS_0_RX,
		.stream_name = "Slimbus Playback",
		.cpu_dai_name = "msm-dai-q6-dev.16384",
		.platform_name = "msm-pcm-routing",
		.codec_name     = "msm-stub-codec.1",
		.codec_dai_name = "msm-stub-tx",
		.codec_name = "tapan_codec",
		.codec_dai_name	= "tapan9302_rx1",
		.no_pcm = 1,
		.be_id = MSM_BACKEND_DAI_INCALL_RECORD_TX,
		.be_hw_params_fixup = msm_be_hw_params_fixup,
		.be_id = MSM_BACKEND_DAI_SLIMBUS_0_RX,
		.init = &msm_audrx_init,
		.be_hw_params_fixup = msm_slim_0_rx_be_hw_params_fixup,
		.ops = &msm8226_be_ops,
		.ignore_pmdown_time = 1, /* dai link has playback support */
		.ignore_suspend = 1,
	},
	/* Incall Record Downlink BACK END DAI Link */
	{
		.name = LPASS_BE_INCALL_RECORD_RX,
		.stream_name = "Voice Downlink Capture",
		.cpu_dai_name = "msm-dai-q6-dev.32771",
		.name = LPASS_BE_SLIMBUS_0_TX,
		.stream_name = "Slimbus Capture",
		.cpu_dai_name = "msm-dai-q6-dev.16385",
		.platform_name = "msm-pcm-routing",
		.codec_name     = "msm-stub-codec.1",
		.codec_dai_name = "msm-stub-tx",
		.codec_name = "tapan_codec",
		.codec_dai_name	= "tapan9302_tx1",
		.no_pcm = 1,
		.be_id = MSM_BACKEND_DAI_INCALL_RECORD_RX,
		.be_hw_params_fixup = msm_be_hw_params_fixup,
		.be_id = MSM_BACKEND_DAI_SLIMBUS_0_TX,
		.be_hw_params_fixup = msm_slim_0_tx_be_hw_params_fixup,
		.ops = &msm8226_be_ops,
		.ignore_suspend = 1,
	},
	/* Incall Music BACK END DAI Link */
	{
		.name = LPASS_BE_VOICE_PLAYBACK_TX,
		.stream_name = "Voice Farend Playback",
		.cpu_dai_name = "msm-dai-q6-dev.32773",
		.name = LPASS_BE_SLIMBUS_1_RX,
		.stream_name = "Slimbus1 Playback",
		.cpu_dai_name = "msm-dai-q6-dev.16386",
		.platform_name = "msm-pcm-routing",
		.codec_name     = "msm-stub-codec.1",
		.codec_dai_name = "msm-stub-rx",
		.codec_name = "tapan_codec",
		.codec_dai_name	= "tapan9302_rx1",
		.no_pcm = 1,
		.be_id = MSM_BACKEND_DAI_VOICE_PLAYBACK_TX,
		.be_hw_params_fixup = msm_be_hw_params_fixup,
		.be_id = MSM_BACKEND_DAI_SLIMBUS_1_RX,
		.be_hw_params_fixup = msm_slim_0_rx_be_hw_params_fixup,
		.ops = &msm8226_be_ops,
		/* dai link has playback support */
		.ignore_pmdown_time = 1,
		.ignore_suspend = 1,
	},
	/* Incall Music 2 BACK END DAI Link */
	{
		.name = LPASS_BE_VOICE2_PLAYBACK_TX,
		.stream_name = "Voice2 Farend Playback",
		.cpu_dai_name = "msm-dai-q6-dev.32770",
		.name = LPASS_BE_SLIMBUS_1_TX,
		.stream_name = "Slimbus1 Capture",
		.cpu_dai_name = "msm-dai-q6-dev.16387",
		.platform_name = "msm-pcm-routing",
		.codec_name     = "msm-stub-codec.1",
		.codec_dai_name = "msm-stub-rx",
		.codec_name = "tapan_codec",
		.codec_dai_name	= "tapan9302_tx1",
		.no_pcm = 1,
		.be_id = MSM_BACKEND_DAI_VOICE2_PLAYBACK_TX,
		.be_hw_params_fixup = msm_be_hw_params_fixup,
		.be_id = MSM_BACKEND_DAI_SLIMBUS_1_TX,
		.be_hw_params_fixup = msm_slim_0_tx_be_hw_params_fixup,
		.ops = &msm8226_be_ops,
		.ignore_suspend = 1,
	},
	{
		.name = LPASS_BE_SLIMBUS_3_RX,
		.stream_name = "Slimbus3 Playback",
		.cpu_dai_name = "msm-dai-q6-dev.16390",
		.platform_name = "msm-pcm-routing",
		.codec_name = "tapan_codec",
		.codec_dai_name	= "tapan9302_rx1",
		.no_pcm = 1,
		.be_id = MSM_BACKEND_DAI_SLIMBUS_3_RX,
		.be_hw_params_fixup = msm_slim_0_rx_be_hw_params_fixup,
		.ops = &msm8226_be_ops,
		/* dai link has playback support */
		.ignore_pmdown_time = 1,
		.ignore_suspend = 1,
	},
	{
		.name = LPASS_BE_SLIMBUS_3_TX,
		.stream_name = "Slimbus3 Capture",
		.cpu_dai_name = "msm-dai-q6-dev.16391",
		.platform_name = "msm-pcm-routing",
		.codec_name = "tapan_codec",
		.codec_dai_name	= "tapan9302_tx1",
		.no_pcm = 1,
		.be_id = MSM_BACKEND_DAI_SLIMBUS_3_TX,
		.be_hw_params_fixup = msm_slim_0_tx_be_hw_params_fixup,
		.ops = &msm8226_be_ops,
		.ignore_suspend = 1,
	},
	{
		.name = LPASS_BE_SLIMBUS_4_RX,
		.stream_name = "Slimbus4 Playback",
		.cpu_dai_name = "msm-dai-q6-dev.16392",
		.platform_name = "msm-pcm-routing",
		.codec_name = "tapan_codec",
		.codec_dai_name	= "tapan9302_rx1",
		.no_pcm = 1,
		.be_id = MSM_BACKEND_DAI_SLIMBUS_4_RX,
		.be_hw_params_fixup = msm_slim_0_rx_be_hw_params_fixup,
		.ops = &msm8226_be_ops,
		/* dai link has playback support */
		.ignore_pmdown_time = 1,
		.ignore_suspend = 1,
	},
	{
		.name = LPASS_BE_SLIMBUS_4_TX,
		.stream_name = "Slimbus4 Capture",
		.cpu_dai_name = "msm-dai-q6-dev.16393",
		.platform_name = "msm-pcm-routing",
		.codec_name = "tapan_codec",
		.codec_dai_name	= "tapan9302_tx1",
		.no_pcm = 1,
		.be_id = MSM_BACKEND_DAI_SLIMBUS_4_TX,
		.be_hw_params_fixup = msm_slim_0_tx_be_hw_params_fixup,
		.ops = &msm8226_be_ops,
		.ignore_suspend = 1,
	},
};

static struct snd_soc_dai_link msm8226_9306_dai_links[
				ARRAY_SIZE(msm8226_common_dai) +
				ARRAY_SIZE(msm8226_9306_dai)];

static struct snd_soc_dai_link msm8226_9302_dai_links[
				ARRAY_SIZE(msm8226_common_dai) +
				ARRAY_SIZE(msm8226_9302_dai)];

struct snd_soc_card snd_soc_card_msm8226 = {
	.name		= "msm8226-tapan-snd-card",
	.dai_link	= msm8226_dai,
	.num_links	= ARRAY_SIZE(msm8226_dai),
	.dai_link	= msm8226_9306_dai_links,
	.num_links	= ARRAY_SIZE(msm8226_9306_dai_links),
};

struct snd_soc_card snd_soc_card_9302_msm8226 = {
	.name		= "msm8226-tapan9302-snd-card",
	.dai_link	= msm8226_9302_dai_links,
	.num_links	= ARRAY_SIZE(msm8226_9302_dai_links),
};

static int msm8226_dtparse_auxpcm(struct platform_device *pdev,
@@ -1550,7 +1683,7 @@ static int msm8226_prepare_codec_mclk(struct snd_soc_card *card)
		ret = gpio_request(pdata->mclk_gpio, "TAPAN_CODEC_PMIC_MCLK");
		if (ret) {
			dev_err(card->dev,
				"%s: Failed to request taiko mclk gpio %d\n",
				"%s: Failed to request tapan mclk gpio %d\n",
				__func__, pdata->mclk_gpio);
			return ret;
		}
@@ -1596,9 +1729,36 @@ static int msm8226_setup_hs_jack(struct platform_device *pdev,
	return 0;
}

static struct snd_soc_card *populate_snd_card_dailinks(struct device *dev)
{

	struct snd_soc_card *card;

	if (of_property_read_bool(dev->of_node,
					"qcom,tapan-codec-9302")) {
		card = &snd_soc_card_9302_msm8226;

		memcpy(msm8226_9302_dai_links, msm8226_common_dai,
				sizeof(msm8226_common_dai));
		memcpy(msm8226_9302_dai_links + ARRAY_SIZE(msm8226_common_dai),
			msm8226_9302_dai, sizeof(msm8226_9302_dai));

	} else {

		card = &snd_soc_card_msm8226;

		memcpy(msm8226_9306_dai_links, msm8226_common_dai,
				sizeof(msm8226_common_dai));
		memcpy(msm8226_9306_dai_links + ARRAY_SIZE(msm8226_common_dai),
			msm8226_9306_dai, sizeof(msm8226_9306_dai));
	}

	return card;
}

static int msm8226_asoc_machine_probe(struct platform_device *pdev)
{
	struct snd_soc_card *card = &snd_soc_card_msm8226;
	struct snd_soc_card *card;
	struct msm8226_asoc_mach_data *pdata;
	int ret;
	const char *auxpcm_pri_gpio_set = NULL;
@@ -1616,6 +1776,8 @@ static int msm8226_asoc_machine_probe(struct platform_device *pdev)
		goto err;
	}

	card = populate_snd_card_dailinks(&pdev->dev);

	card->dev = &pdev->dev;
	platform_set_drvdata(pdev, card);
	snd_soc_card_set_drvdata(card, pdata);
@@ -1657,9 +1819,13 @@ static int msm8226_asoc_machine_probe(struct platform_device *pdev)
	}
	ret = msm8226_prepare_codec_mclk(card);
	if (ret)
		goto err;
		goto err1;

	mutex_init(&cdc_mclk_mutex);

	mbhc_cfg.gpio_level_insert = of_property_read_bool(pdev->dev.of_node,
					"qcom,headset-jack-type-NO");

	ret = snd_soc_register_card(card);
	if (ret) {
		dev_err(&pdev->dev, "snd_soc_register_card failed (%d)\n",
@@ -1713,8 +1879,6 @@ static int msm8226_asoc_machine_probe(struct platform_device *pdev)
		}
	}

	mbhc_cfg.gpio_level_insert = of_property_read_bool(pdev->dev.of_node,
					"qcom,headset-jack-type-NO");
	msm8226_setup_hs_jack(pdev, pdata);

	ret = of_property_read_string(pdev->dev.of_node,
@@ -1762,6 +1926,7 @@ err:
		gpio_free(pdata->mclk_gpio);
		pdata->mclk_gpio = 0;
	}
err1:
	devm_kfree(&pdev->dev, pdata);
	return ret;
}