Jelajahi Sumber

msm: common: retrieve clk attribute for tdm and mi2s from dtsi

retrieve clk attribute for tdm and mi2s from dtsi.

Change-Id: Ie00ac5cf7c2e1d7ca56e27d291dfd6af3feb8d8f
Signed-off-by: Prasad Kumpatla <[email protected]>
Prasad Kumpatla 3 tahun lalu
induk
melakukan
adf32e6429
2 mengubah file dengan 39 tambahan dan 5 penghapusan
  1. 37 5
      asoc/msm_common.c
  2. 2 0
      asoc/msm_common.h

+ 37 - 5
asoc/msm_common.c

@@ -410,7 +410,7 @@ int msm_common_snd_hw_params(struct snd_pcm_substream *substream,
 				}
 
 				intf_clk_cfg.clk_freq_in_hz = rate * slot_width * slots;
-				intf_clk_cfg.clk_attri = CLOCK_ATTRIBUTE_COUPLE_NO;
+				intf_clk_cfg.clk_attri = pdata->tdm_clk_attribute[index];
 				intf_clk_cfg.clk_root = 0;
 
 				if (pdata->is_audio_hw_vote_required[index]  &&
@@ -455,7 +455,7 @@ int msm_common_snd_hw_params(struct snd_pcm_substream *substream,
 
 				intf_clk_cfg.clk_freq_in_hz = rate *
 					MI2S_NUM_CHANNELS * sample_width;
-				intf_clk_cfg.clk_attri = CLOCK_ATTRIBUTE_COUPLE_NO;
+				intf_clk_cfg.clk_attri = pdata->mi2s_clk_attribute[index];
 				intf_clk_cfg.clk_root = CLOCK_ROOT_DEFAULT;
 
 				if (pdata->is_audio_hw_vote_required[index]  &&
@@ -603,7 +603,7 @@ int msm_common_snd_init(struct platform_device *pdev, struct snd_soc_card *card)
 {
 	struct msm_common_pdata *common_pdata = NULL;
 	int count, ret = 0;
-	uint32_t lpass_audio_hw_vote_required[MI2S_TDM_AUXPCM_MAX] = {0};
+	uint32_t val_array[MI2S_TDM_AUXPCM_MAX] = {0};
 	struct clk *lpass_audio_hw_vote = NULL;
 
 	common_pdata = kcalloc(1, sizeof(struct msm_common_pdata), GFP_KERNEL);
@@ -641,14 +641,46 @@ int msm_common_snd_init(struct platform_device *pdev, struct snd_soc_card *card)
 
 	ret = of_property_read_u32_array(pdev->dev.of_node,
 				"qcom,mi2s-tdm-is-hw-vote-needed",
-				lpass_audio_hw_vote_required, MI2S_TDM_AUXPCM_MAX);
+				val_array, MI2S_TDM_AUXPCM_MAX);
 	if (ret) {
 		dev_dbg(&pdev->dev, "%s:no qcom,mi2s-tdm-is-hw-vote-needed in DT node\n",
 			__func__);
 	} else {
 		for (count = 0; count < MI2S_TDM_AUXPCM_MAX; count++) {
 			common_pdata->is_audio_hw_vote_required[count] =
-					lpass_audio_hw_vote_required[count];
+					val_array[count];
+		}
+	}
+
+	ret = of_property_read_u32_array(pdev->dev.of_node, "qcom,tdm-clk-attribute",
+			val_array, MI2S_TDM_AUXPCM_MAX);
+	if (ret) {
+		dev_info(&pdev->dev,
+			"%s: No DT match for tdm clk attribute, set to default\n", __func__);
+		for (count = 0; count < MI2S_TDM_AUXPCM_MAX; count++) {
+			common_pdata->tdm_clk_attribute[count] =
+				CLOCK_ATTRIBUTE_COUPLE_NO;
+		}
+	} else {
+		for (count = 0; count < MI2S_TDM_AUXPCM_MAX; count++) {
+			common_pdata->tdm_clk_attribute[count] =
+					val_array[count];
+		}
+	}
+
+	ret = of_property_read_u32_array(pdev->dev.of_node, "qcom,mi2s-clk-attribute",
+			val_array, MI2S_TDM_AUXPCM_MAX);
+	if (ret) {
+		dev_info(&pdev->dev,
+			"%s: No DT match for mi2s clk attribute, set to default\n", __func__);
+		for (count = 0; count < MI2S_TDM_AUXPCM_MAX; count++) {
+			common_pdata->mi2s_clk_attribute[count] =
+				CLOCK_ATTRIBUTE_COUPLE_NO;
+		}
+	} else {
+		for (count = 0; count < MI2S_TDM_AUXPCM_MAX; count++) {
+			common_pdata->mi2s_clk_attribute[count] =
+				val_array[count];
 		}
 	}
 

+ 2 - 0
asoc/msm_common.h

@@ -49,6 +49,8 @@ struct msm_common_pdata {
 	atomic_t lpass_audio_hw_vote_ref_cnt;
 	struct clk *lpass_audio_hw_vote;
 	uint32_t is_audio_hw_vote_required[MI2S_TDM_AUXPCM_MAX];
+	uint32_t tdm_clk_attribute[MI2S_TDM_AUXPCM_MAX];
+	uint32_t mi2s_clk_attribute[MI2S_TDM_AUXPCM_MAX];
 };
 
 int snd_card_notify_user(snd_card_status_t card_status);