From d93e0544198b75542b23b02a8b819d81e98ff880 Mon Sep 17 00:00:00 2001 From: Aidan MacDonald Date: Mon, 10 Jan 2022 22:33:42 +0000 Subject: [PATCH] fiiom3k: power down amp before switching DAC power modes As detailed in the section of the AK4376A datasheet, the amp should be powered down before switching power modes (or to a sample rate <= 12 KHz). Change-Id: I3ab0a21c78a3ad2bb418b64c916f7dbe2a843efa --- firmware/drivers/audio/ak4376.c | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/firmware/drivers/audio/ak4376.c b/firmware/drivers/audio/ak4376.c index 2e772ace84..8d2b9f44f3 100644 --- a/firmware/drivers/audio/ak4376.c +++ b/firmware/drivers/audio/ak4376.c @@ -245,8 +245,26 @@ void ak4376_set_freqmode(int fsel, int mult, int power_mode) if(power_mode == SOUND_LOW_POWER || hw_freq_sampr[fsel] <= SAMPR_12) mode_ctrl |= 0x40; + /* Handle the LPMODE bit */ + int pwr3 = power_mode == SOUND_LOW_POWER ? 0x11 : 0x01; + + /* The datasheet says the HP amp must be powered down before changing + * the operating mode of the DAC or HP amp. I'm assuming this means + * the amp must be shut down when changing DSMLP or LPMODE. */ + int cur_mode_ctrl = ak4376_read(AK4376_REG_MODE_CTRL); + int cur_pwr3 = ak4376_read(AK4376_REG_PWR3); + bool disable_amp = mode_ctrl != cur_mode_ctrl || pwr3 != cur_pwr3; + /* Program the new settings */ + if(disable_amp) + ak4376_write(AK4376_REG_PWR4, 0x00); + ak4376_write(AK4376_REG_CLOCK_MODE, clock_mode); ak4376_write(AK4376_REG_MODE_CTRL, mode_ctrl); - ak4376_write(AK4376_REG_PWR3, power_mode == SOUND_LOW_POWER ? 0x11 : 0x01); + ak4376_write(AK4376_REG_PWR3, pwr3); + + if(disable_amp) { + ak4376_write(AK4376_REG_PWR4, 0x03); + mdelay(26); + } }