From 02e4e60f2ffbace2272d7ea8d0f717fd6b5dbd98 Mon Sep 17 00:00:00 2001 From: Fabiola Kwasowiec Date: Wed, 27 Sep 2023 09:33:29 +0200 Subject: [PATCH] dmic: add the correct gain values to the dmic registers Zephyr increments the gain until it reaches the maximum value and then sets the registers to zero which is incorrect. The values set in the DMIC config should be restored. Signed-off-by: Fabiola Kwasowiec --- drivers/dai/intel/dmic/dmic.c | 19 ++++++++++++++----- drivers/dai/intel/dmic/dmic.h | 2 ++ drivers/dai/intel/dmic/dmic_nhlt.c | 3 +++ 3 files changed, 19 insertions(+), 5 deletions(-) diff --git a/drivers/dai/intel/dmic/dmic.c b/drivers/dai/intel/dmic/dmic.c index fcc9b119670..3da5fb8c538 100644 --- a/drivers/dai/intel/dmic/dmic.c +++ b/drivers/dai/intel/dmic/dmic.c @@ -527,11 +527,20 @@ static void dai_dmic_gain_ramp(struct dai_intel_dmic *dmic) FIR_CONTROL_MUTE, 0); } - val = FIELD_PREP(OUT_GAIN, gval); - dai_dmic_write(dmic, dmic_base[i] + FIR_CHANNEL_REGS_SIZE * - dmic->dai_config_params.dai_index + OUT_GAIN_LEFT, val); - dai_dmic_write(dmic, dmic_base[i] + FIR_CHANNEL_REGS_SIZE * - dmic->dai_config_params.dai_index + OUT_GAIN_RIGHT, val); + if (gval != 0) { + val = FIELD_PREP(OUT_GAIN, gval); + dai_dmic_write(dmic, dmic_base[i] + FIR_CHANNEL_REGS_SIZE * + dmic->dai_config_params.dai_index + OUT_GAIN_LEFT, val); + dai_dmic_write(dmic, dmic_base[i] + FIR_CHANNEL_REGS_SIZE * + dmic->dai_config_params.dai_index + OUT_GAIN_RIGHT, val); + } else { + dai_dmic_write(dmic, dmic_base[i] + FIR_CHANNEL_REGS_SIZE * + dmic->dai_config_params.dai_index + OUT_GAIN_LEFT, + dmic->gain_left); + dai_dmic_write(dmic, dmic_base[i] + FIR_CHANNEL_REGS_SIZE * + dmic->dai_config_params.dai_index + OUT_GAIN_RIGHT, + dmic->gain_right); + } } k_spin_unlock(&dmic->lock, key); diff --git a/drivers/dai/intel/dmic/dmic.h b/drivers/dai/intel/dmic/dmic.h index 52399106925..e06ed80daed 100644 --- a/drivers/dai/intel/dmic/dmic.h +++ b/drivers/dai/intel/dmic/dmic.h @@ -179,6 +179,8 @@ struct dai_intel_dmic { #endif int irq; uint32_t flags; + uint32_t gain_left; + uint32_t gain_right; }; static inline int32_t sat_int32(int64_t x) diff --git a/drivers/dai/intel/dmic/dmic_nhlt.c b/drivers/dai/intel/dmic/dmic_nhlt.c index 9e3b08072cd..17a8f385a02 100644 --- a/drivers/dai/intel/dmic/dmic_nhlt.c +++ b/drivers/dai/intel/dmic/dmic_nhlt.c @@ -621,6 +621,9 @@ static void configure_fir(struct dai_intel_dmic *dmic, const uint32_t base, dai_dmic_write(dmic, base + DC_OFFSET_RIGHT, fir_cfg->dc_offset_right); dai_dmic_write(dmic, base + OUT_GAIN_LEFT, fir_cfg->out_gain_left); dai_dmic_write(dmic, base + OUT_GAIN_RIGHT, fir_cfg->out_gain_right); + + dmic->gain_left = fir_cfg->out_gain_left; + dmic->gain_right = fir_cfg->out_gain_right; } int dai_dmic_set_config_nhlt(struct dai_intel_dmic *dmic, const void *bespoke_cfg)