From b5edf3ad182c0250328c54f439cf078b2d6daf38 Mon Sep 17 00:00:00 2001 From: Junkai Cai Date: Mon, 3 May 2021 16:37:25 -0700 Subject: [PATCH] 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 --- asoc/codecs/lpass-cdc/lpass-cdc-regmap.c | 2 -- asoc/codecs/lpass-cdc/lpass-cdc-rx-macro.c | 35 ++++++++++------------ 2 files changed, 16 insertions(+), 21 deletions(-) diff --git a/asoc/codecs/lpass-cdc/lpass-cdc-regmap.c b/asoc/codecs/lpass-cdc/lpass-cdc-regmap.c index 532f9489d1..3e537efc02 100644 --- a/asoc/codecs/lpass-cdc/lpass-cdc-regmap.c +++ b/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; diff --git a/asoc/codecs/lpass-cdc/lpass-cdc-rx-macro.c b/asoc/codecs/lpass-cdc/lpass-cdc-rx-macro.c index 756bac8f1d..154501c613 100644 --- a/asoc/codecs/lpass-cdc/lpass-cdc-rx-macro.c +++ b/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; }