Prechádzať zdrojové kódy

asoc: qcs405: Add support for VAD in QCS405 machine driver

Update QCS405 machine driver to create HW dependent node for AFE
to hold VAD core calibration.

Change-Id: Ied9c11af87df0fb2b419f1e4a9c1e5cc67d84c00
Signed-off-by: Mangesh Kunchamwar <[email protected]>
Mangesh Kunchamwar 7 rokov pred
rodič
commit
d4a064213f
1 zmenil súbory, kde vykonal 87 pridanie a 2 odobranie
  1. 87 2
      asoc/qcs405.c

+ 87 - 2
asoc/qcs405.c

@@ -3218,6 +3218,8 @@ static const struct snd_kcontrol_new msm_snd_controls[] = {
 			msm_aux_pcm_rx_format_get, msm_aux_pcm_rx_format_put),
 	SOC_ENUM_EXT("QUIN_AUX_PCM_TX Format", aux_pcm_tx_format,
 			msm_aux_pcm_tx_format_get, msm_aux_pcm_tx_format_put),
+	SOC_SINGLE_MULTI_EXT("VAD CFG", SND_SOC_NOPM, 0, 1000, 0, 3, NULL,
+				msm_snd_vad_cfg_put),
 };
 
 static int msm_snd_enable_codec_ext_clk(struct snd_soc_codec *codec,
@@ -3466,6 +3468,29 @@ static int msm_slim_get_ch_from_beid(int32_t be_id)
 	return ch_id;
 }
 
+static int msm_vad_get_portid_from_beid(int32_t be_id, int *port_id)
+{
+	*port_id = 0xFFFF;
+
+	switch (be_id) {
+	case MSM_BACKEND_DAI_VA_CDC_DMA_TX_0:
+		*port_id = AFE_PORT_ID_VA_CODEC_DMA_TX_0;
+		break;
+	case MSM_BACKEND_DAI_QUINARY_MI2S_TX:
+		*port_id = AFE_PORT_ID_QUINARY_MI2S_TX;
+		break;
+	case MSM_BACKEND_DAI_QUIN_TDM_TX_0:
+		*port_id = AFE_PORT_ID_QUINARY_TDM_TX;
+		break;
+	case MSM_BACKEND_DAI_QUIN_AUXPCM_TX:
+		*port_id = AFE_PORT_ID_QUINARY_PCM_TX;
+		break;
+	default:
+		return -EINVAL;
+	}
+	return 0;
+}
+
 static int msm_cdc_dma_get_idx_from_beid(int32_t be_id)
 {
 	int idx = 0;
@@ -6652,10 +6677,72 @@ static int msm_snd_card_tasha_late_probe(struct snd_soc_card *card)
 	return ret;
 }
 
+
+static int msm_snd_vad_cfg_put(struct snd_kcontrol *kcontrol,
+				  struct snd_ctl_elem_value *ucontrol)
+{
+	int ret = 0;
+	int port_id;
+	uint32_t vad_enable = ucontrol->value.integer.value[0];
+	uint32_t preroll_config = ucontrol->value.integer.value[1];
+	uint32_t vad_intf = ucontrol->value.integer.value[2];
+
+	if ((preroll_config < 0) || (preroll_config > 1000) ||
+	    (vad_enable < 0) || (vad_enable > 1) ||
+	    (vad_intf > MSM_BACKEND_DAI_MAX)) {
+		pr_err("%s: Invalid arguments\n", __func__);
+		ret = -EINVAL;
+		goto done;
+	}
+
+	pr_debug("%s: vad_enable=%d preroll_config=%d vad_intf=%d\n", __func__,
+		 vad_enable, preroll_config, vad_intf);
+
+	ret = msm_vad_get_portid_from_beid(vad_intf, &port_id);
+	if (ret) {
+		pr_err("%s: Invalid vad interface\n", __func__);
+		goto done;
+	}
+
+	afe_set_vad_cfg(vad_enable, preroll_config, port_id);
+
+done:
+	return ret;
+}
+
+static int msm_snd_card_codec_late_probe(struct snd_soc_card *card)
+{
+	int ret = 0;
+	uint32_t tasha_codec = 0;
+
+	ret = afe_cal_init_hwdep(card);
+	if (ret) {
+		dev_err(card->dev, "afe cal hwdep init failed (%d)\n", ret);
+		ret = 0;
+	}
+
+	/* tasha late probe when it is present */
+	ret = of_property_read_u32(card->dev->of_node, "qcom,tasha-codec",
+				   &tasha_codec);
+	if (ret) {
+		dev_err(card->dev, "%s: No DT match tasha codec\n", __func__);
+		ret = 0;
+	} else {
+		if (tasha_codec) {
+			ret = msm_snd_card_tasha_late_probe(card);
+			if (ret)
+				dev_err(card->dev, "%s: tasha late probe err\n",
+					__func__);
+		}
+	}
+	return ret;
+}
+
 struct snd_soc_card snd_soc_card_qcs405_msm = {
 	.name		= "qcs405-snd-card",
 	.controls	= msm_snd_controls,
 	.num_controls	= ARRAY_SIZE(msm_snd_controls),
+	.late_probe	= msm_snd_card_codec_late_probe,
 };
 
 static int msm_populate_dai_link_component_of_node(
@@ -6892,8 +6979,6 @@ static struct snd_soc_card *populate_snd_card_dailinks(struct device *dev)
 			if (tasha_codec) {
 				dev_dbg(dev, "%s(): Tasha codec is present\n",
 					__func__);
-				card->late_probe =
-				msm_snd_card_tasha_late_probe;
 				memcpy(msm_qcs405_dai_links + total_links,
 						msm_tasha_fe_dai_links,
 						sizeof(msm_tasha_fe_dai_links));