asoc: sdm660: update machine driver for QCS605 LC variant

Add clock support for digital codec MCLK in machine driver
And support for logic of parsing digital codec node only.

Change-Id: I13da7a737f4bce0dbf83dea944e47341356941a1
Signed-off-by: Viraja Kommaraju <virajak@codeaurora.org>
diff --git a/asoc/sdm660-common.c b/asoc/sdm660-common.c
index f2376b4..3695ae5 100644
--- a/asoc/sdm660-common.c
+++ b/asoc/sdm660-common.c
@@ -3043,10 +3043,30 @@
 				index = of_property_match_string(cdev->of_node,
 							"asoc-codec-names",
 							PMIC_INT_ANALOG_CODEC);
+				phandle = of_parse_phandle(
+							cdev->of_node,
+							"asoc-codec",
+							index);
+				dai_link[i].codecs[ANA_CDC].of_node =
+								phandle;
+			}
+		}
+		if (pdata->snd_card_val == INT_DIG_SND_CARD) {
+			if ((dai_link[i].id ==
+					MSM_BACKEND_DAI_INT0_MI2S_RX) ||
+			    (dai_link[i].id ==
+					MSM_BACKEND_DAI_INT1_MI2S_RX) ||
+			    (dai_link[i].id ==
+					MSM_BACKEND_DAI_INT2_MI2S_TX) ||
+			    (dai_link[i].id ==
+					MSM_BACKEND_DAI_INT3_MI2S_TX)) {
+				index = of_property_match_string(cdev->of_node,
+							"asoc-codec-names",
+							MSM_INT_DIGITAL_CODEC);
 				phandle = of_parse_phandle(cdev->of_node,
 							   "asoc-codec",
 							   index);
-				dai_link[i].codecs[ANA_CDC].of_node = phandle;
+				dai_link[i].codec_of_node = phandle;
 			}
 		}
 	}
@@ -3342,6 +3362,8 @@
 	  .data = "tasha_codec"},
 	{ .compatible = "qcom,sdm670-asoc-snd-tavil",
 	  .data = "tavil_codec"},
+	{ .compatible = "qcom,qcs605-dig-asoc-snd",
+	  .data = "digital_codec"},
 	{},
 };
 
@@ -3388,6 +3410,11 @@
 		ret = msm_int_cdc_init(pdev, pdata, &card, &mbhc_cfg);
 		if (ret)
 			goto err;
+	} else if (!strcmp(match->data, "digital_codec")) {
+		pdata->snd_card_val = INT_DIG_SND_CARD;
+		ret = msm_int_cdc_init(pdev, pdata, &card, NULL);
+		if (ret)
+			goto err;
 	} else {
 		dev_err(&pdev->dev,
 			"%s: Not a matching DT sound node\n", __func__);
@@ -3408,6 +3435,11 @@
 					"qcom,cdc-ext-spk-gpios", 0);
 	}
 
+	if (pdata->snd_card_val == INT_DIG_SND_CARD) {
+		/*reading the gpio configurations from dtsi file*/
+		pdata->dmic_gpio_p = of_parse_phandle(pdev->dev.of_node,
+					"qcom,cdc-dmic-gpios", 0);
+	}
 	pdata->mi2s_gpio_p[PRIM_MI2S] = of_parse_phandle(pdev->dev.of_node,
 					"qcom,pri-mi2s-gpios", 0);
 	pdata->mi2s_gpio_p[SEC_MI2S] = of_parse_phandle(pdev->dev.of_node,
@@ -3479,7 +3511,7 @@
 			ret);
 		goto err;
 	}
-	if (pdata->snd_card_val != INT_SND_CARD)
+	if (pdata->snd_card_val > INT_MAX_SND_CARD)
 		msm_ext_register_audio_notifier(pdev);
 
 	return 0;
@@ -3510,7 +3542,7 @@
 	struct snd_soc_card *card = platform_get_drvdata(pdev);
 	struct msm_asoc_mach_data *pdata = snd_soc_card_get_drvdata(card);
 
-	if (pdata->snd_card_val == INT_SND_CARD)
+	if (pdata->snd_card_val <= INT_MAX_SND_CARD)
 		mutex_destroy(&pdata->cdc_int_mclk0_mutex);
 
 	if (gpio_is_valid(pdata->us_euro_gpio)) {
@@ -3526,7 +3558,7 @@
 		pdata->hph_en0_gpio = 0;
 	}
 
-	if (pdata->snd_card_val != INT_SND_CARD)
+	if (pdata->snd_card_val > INT_MAX_SND_CARD)
 		audio_notifier_deregister("sdm660");
 
 	snd_soc_unregister_card(card);