mfd: cpcap: Improve ST DAC enable time
authorGreg Meiste <w30289@motorola.com>
Fri, 10 Dec 2010 21:35:52 +0000 (15:35 -0600)
committerIliyan Malchev <malchev@google.com>
Wed, 15 Dec 2010 23:57:10 +0000 (15:57 -0800)
Workaround provided by ST to improve ST DAC enable time.

Change-Id: I246ef7af1e9b5c2d21f9ec311d35fc704b4589bd
Signed-off-by: Greg Meiste <w30289@motorola.com>
Signed-off-by: Iliyan Malchev <malchev@google.com>
drivers/mfd/cpcap-audio-core.c
drivers/mfd/cpcap-regacc.c
include/linux/spi/cpcap.h

index d08e3ddccdbedcc08e76ce09d44a5c13002c47e4..d7180f43bbea641b88a769995bddab72dc8afd42 100644 (file)
 #include <mach/cpcap_audio.h>
 
 #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);
+               }
        }
 }
 
index 2b8de54a8dabbc7f6d0873e2a8d5f798d4a87b17..3d5252e4453635acf74651be9b37d73018d0a929 100644 (file)
@@ -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,
index e7c5e3b18c5efd4d566e6adc4ff5a80bd6eed02e..366faed2556a583570388bb0896c2b8e4981276f 100644 (file)
@@ -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,