From: Greg Meiste Date: Fri, 10 Dec 2010 21:35:52 +0000 (-0600) Subject: mfd: cpcap: Improve ST DAC enable time X-Git-Tag: firefly_0821_release~9834^2~239 X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=1b8f70341ab834da4e481960e40e26a1e22642fc;p=firefly-linux-kernel-4.4.55.git mfd: cpcap: Improve ST DAC enable time Workaround provided by ST to improve ST DAC enable time. Change-Id: I246ef7af1e9b5c2d21f9ec311d35fc704b4589bd Signed-off-by: Greg Meiste Signed-off-by: Iliyan Malchev --- diff --git a/drivers/mfd/cpcap-audio-core.c b/drivers/mfd/cpcap-audio-core.c index d08e3ddccdbe..d7180f43bbea 100644 --- a/drivers/mfd/cpcap-audio-core.c +++ b/drivers/mfd/cpcap-audio-core.c @@ -32,11 +32,16 @@ #include #define SLEEP_ACTIVATE_POWER_DELAY_MS 2 -#define STM_STDAC_ACTIVATE_RAMP_TIME 60 +#define STM_STDAC_ACTIVATE_RAMP_TIME 1 #define CLOCK_TREE_RESET_DELAY_MS 1 #define CPCAP_AUDIO_SPI_READBACK 1 +#define STM_STDAC_EN_TEST_PRE 0x090C +#define STM_STDAC_EN_TEST_POST 0x0000 +#define STM_STDAC_EN_ST_TEST1_PRE 0x2400 +#define STM_STDAC_EN_ST_TEST1_POST 0x0400 + #define E(args...) pr_err("cpcap-audio: " args) static struct cpcap_audio_state current_state = { @@ -765,11 +770,25 @@ static void cpcap_audio_configure_stdac(struct cpcap_audio_state *state, stdac_changes.mask = stdac_changes.value | prev_stdac_data; prev_stdac_data = stdac_changes.value; + if ((stdac_changes.value | CPCAP_BIT_ST_DAC_EN) && + (state->cpcap->vendor == CPCAP_VENDOR_ST)) { + logged_cpcap_write(state->cpcap, CPCAP_REG_TEST, + STM_STDAC_EN_TEST_PRE, 0xFFFF); + logged_cpcap_write(state->cpcap, CPCAP_REG_ST_TEST1, + STM_STDAC_EN_ST_TEST1_PRE, 0xFFFF); + } + logged_cpcap_write(state->cpcap, CPCAP_REG_SDAC, stdac_changes.value, stdac_changes.mask); + if ((stdac_changes.value | CPCAP_BIT_ST_DAC_EN) && - (state->cpcap->vendor == CPCAP_VENDOR_ST)) + (state->cpcap->vendor == CPCAP_VENDOR_ST)) { msleep(STM_STDAC_ACTIVATE_RAMP_TIME); + logged_cpcap_write(state->cpcap, CPCAP_REG_ST_TEST1, + STM_STDAC_EN_ST_TEST1_POST, 0xFFFF); + logged_cpcap_write(state->cpcap, CPCAP_REG_TEST, + STM_STDAC_EN_TEST_POST, 0xFFFF); + } } } diff --git a/drivers/mfd/cpcap-regacc.c b/drivers/mfd/cpcap-regacc.c index 2b8de54a8dab..3d5252e44536 100644 --- a/drivers/mfd/cpcap-regacc.c +++ b/drivers/mfd/cpcap-regacc.c @@ -242,6 +242,8 @@ static const struct { [CPCAP_REG_LGDET] = {1181, 0xFF00, 0xFFFF}, [CPCAP_REG_LMISC] = {1182, 0xFF07, 0xFFFF}, [CPCAP_REG_LMACE] = {1183, 0xFFF8, 0xFFFF}, + [CPCAP_REG_TEST] = {7936, 0x0000, 0xFFFF}, + [CPCAP_REG_ST_TEST1] = {8002, 0x0000, 0xFFFF}, }; static int cpcap_spi_access(struct spi_device *spi, u8 *buf, diff --git a/include/linux/spi/cpcap.h b/include/linux/spi/cpcap.h index e7c5e3b18c5e..366faed2556a 100644 --- a/include/linux/spi/cpcap.h +++ b/include/linux/spi/cpcap.h @@ -306,7 +306,10 @@ enum cpcap_reg { CPCAP_REG_LMISC, /* LMR Misc Bits */ CPCAP_REG_LMACE, /* LMR Mace IC Support */ - CPCAP_REG_END = CPCAP_REG_LMACE, /* End of CPCAP registers. */ + CPCAP_REG_TEST, /* Test */ + CPCAP_REG_ST_TEST1, /* ST Test 1 */ + + CPCAP_REG_END = CPCAP_REG_ST_TEST1, /* End of CPCAP registers. */ CPCAP_REG_MAX /* The largest valid register value. */ = CPCAP_REG_END,