Prechádzať zdrojové kódy

asoc: lpass-cdc: update sequence of HIFI FIR coeff number

The number of HIFI FIR coeff will not be retained if power collapsed,
need to be written right before FIR_START is kicked off.

Change-Id: I034949eb7748f8b2e5b21445fa10f4f1df66a7bf
Junkai Cai 3 rokov pred
rodič
commit
b5edf3ad18

+ 0 - 2
asoc/codecs/lpass-cdc/lpass-cdc-regmap.c

@@ -1228,8 +1228,6 @@ static bool lpass_cdc_is_volatile_register(struct device *dev,
 	case LPASS_CDC_RX_RX1_RX_FIR_COEFF_WDATA7:
 	case LPASS_CDC_RX_RX0_RX_FIR_CTL:
 	case LPASS_CDC_RX_RX1_RX_FIR_CTL:
-	case LPASS_CDC_RX_RX0_RX_FIR_CFG:
-	case LPASS_CDC_RX_RX1_RX_FIR_CFG:
 	case LPASS_CDC_RX_RX0_RX_PATH_CTL:
 	case LPASS_CDC_RX_RX1_RX_PATH_CTL:
 		return true;

+ 16 - 19
asoc/codecs/lpass-cdc/lpass-cdc-rx-macro.c

@@ -3236,6 +3236,19 @@ static int lpass_cdc_rx_macro_fir_filter_enable_put(struct snd_kcontrol *kcontro
 			return ret;
 		}
 
+		snd_soc_component_write(component, LPASS_CDC_RX_RX0_RX_FIR_CFG,
+					rx_priv->fir_total_coeff_num[RX0_PATH]);
+		dev_dbg(component->dev, "%s: HIFI FIR Path:%d total coefficients"
+				" number written: %d.\n",
+				__func__, RX0_PATH,
+				rx_priv->fir_total_coeff_num[RX0_PATH]);
+		snd_soc_component_write(component, LPASS_CDC_RX_RX1_RX_FIR_CFG,
+					rx_priv->fir_total_coeff_num[RX1_PATH]);
+		dev_dbg(component->dev, "%s: HIFI FIR Path:%d total coefficients"
+				" number written: %d.\n",
+				__func__, RX1_PATH,
+				rx_priv->fir_total_coeff_num[RX1_PATH]);
+
 		/* Enable HIFI_FEAT_EN bit */
 		snd_soc_component_update_bits(component, LPASS_CDC_RX_TOP_TOP_CFG1, 0x01, 0x01);
 		/* Enable FIR_CLK_EN */
@@ -3488,7 +3501,7 @@ disable_FIR:
 	clk_disable_unprepare(rx_priv->hifi_fir_clk);
 
 disable_mclk_block:
-	ret = lpass_cdc_rx_macro_mclk_enable(rx_priv, 0, false);
+	lpass_cdc_rx_macro_mclk_enable(rx_priv, 0, false);
 
 exit:
 	return ret;
@@ -3620,7 +3633,7 @@ static int lpass_cdc_rx_macro_fir_coeff_num_put(struct snd_kcontrol *kcontrol,
 	struct device *rx_dev = NULL;
 	struct lpass_cdc_rx_macro_priv *rx_priv = NULL;
 	unsigned int ret = 0;
-	unsigned int grp_idx, stored_total_num, num_coeff_addr;
+	unsigned int grp_idx, stored_total_num;
 
 	if (!component) {
 		pr_err("%s: component is NULL\n", __func__);
@@ -3630,20 +3643,6 @@ static int lpass_cdc_rx_macro_fir_coeff_num_put(struct snd_kcontrol *kcontrol,
 	if (!lpass_cdc_rx_macro_get_data(component, &rx_dev, &rx_priv, __func__))
 		return -EINVAL;
 
-	switch (path_idx) {
-	case RX0_PATH:
-		num_coeff_addr = LPASS_CDC_RX_RX0_RX_FIR_CFG;
-		break;
-	case RX1_PATH:
-		num_coeff_addr = LPASS_CDC_RX_RX1_RX_FIR_CFG;
-		break;
-	default:
-		dev_err(rx_priv->dev,
-			"%s: inavlid FIR ID: %d\n", __func__, path_idx);
-		ret = -EINVAL;
-		goto exit;
-	}
-
 	if (fir_total_coeff_num > LPASS_CDC_RX_MACRO_FIR_COEFF_MAX * GRP_MAX) {
 		dev_err(rx_priv->dev,
 			"%s: inavlid total number of RX_FIR coefficients:%d"
@@ -3655,9 +3654,8 @@ static int lpass_cdc_rx_macro_fir_coeff_num_put(struct snd_kcontrol *kcontrol,
 		rx_priv->fir_total_coeff_num[path_idx] = fir_total_coeff_num;
 	}
 
-	snd_soc_component_write(component, num_coeff_addr, fir_total_coeff_num);
 	dev_dbg(component->dev, "%s: HIFI FIR Path:%d total coefficients"
-				" number updated: %d.\n",
+				" number updated in private data: %d.\n",
 				__func__, path_idx, fir_total_coeff_num);
 
 	stored_total_num = 0;
@@ -3667,7 +3665,6 @@ static int lpass_cdc_rx_macro_fir_coeff_num_put(struct snd_kcontrol *kcontrol,
 	if (fir_total_coeff_num == stored_total_num)
 		ret = set_fir_filter_coeff(component, rx_priv, path_idx);
 
-exit:
 	return ret;
 }