diff options
-rw-r--r-- | drivers/mfd/twl6040-core.c | 19 | ||||
-rw-r--r-- | include/linux/mfd/twl6040.h | 1 |
2 files changed, 16 insertions, 4 deletions
diff --git a/drivers/mfd/twl6040-core.c b/drivers/mfd/twl6040-core.c index 7dc8c4715001..75987c8ca049 100644 --- a/drivers/mfd/twl6040-core.c +++ b/drivers/mfd/twl6040-core.c | |||
@@ -34,16 +34,24 @@ | |||
34 | #include <linux/mfd/core.h> | 34 | #include <linux/mfd/core.h> |
35 | #include <linux/mfd/twl6040.h> | 35 | #include <linux/mfd/twl6040.h> |
36 | 36 | ||
37 | #define VIBRACTRL_MEMBER(reg) ((reg == TWL6040_REG_VIBCTLL) ? 0 : 1) | ||
38 | |||
37 | int twl6040_reg_read(struct twl6040 *twl6040, unsigned int reg) | 39 | int twl6040_reg_read(struct twl6040 *twl6040, unsigned int reg) |
38 | { | 40 | { |
39 | int ret; | 41 | int ret; |
40 | u8 val = 0; | 42 | u8 val = 0; |
41 | 43 | ||
42 | mutex_lock(&twl6040->io_mutex); | 44 | mutex_lock(&twl6040->io_mutex); |
43 | ret = twl_i2c_read_u8(TWL_MODULE_AUDIO_VOICE, &val, reg); | 45 | /* Vibra control registers from cache */ |
44 | if (ret < 0) { | 46 | if (unlikely(reg == TWL6040_REG_VIBCTLL || |
45 | mutex_unlock(&twl6040->io_mutex); | 47 | reg == TWL6040_REG_VIBCTLR)) { |
46 | return ret; | 48 | val = twl6040->vibra_ctrl_cache[VIBRACTRL_MEMBER(reg)]; |
49 | } else { | ||
50 | ret = twl_i2c_read_u8(TWL_MODULE_AUDIO_VOICE, &val, reg); | ||
51 | if (ret < 0) { | ||
52 | mutex_unlock(&twl6040->io_mutex); | ||
53 | return ret; | ||
54 | } | ||
47 | } | 55 | } |
48 | mutex_unlock(&twl6040->io_mutex); | 56 | mutex_unlock(&twl6040->io_mutex); |
49 | 57 | ||
@@ -57,6 +65,9 @@ int twl6040_reg_write(struct twl6040 *twl6040, unsigned int reg, u8 val) | |||
57 | 65 | ||
58 | mutex_lock(&twl6040->io_mutex); | 66 | mutex_lock(&twl6040->io_mutex); |
59 | ret = twl_i2c_write_u8(TWL_MODULE_AUDIO_VOICE, val, reg); | 67 | ret = twl_i2c_write_u8(TWL_MODULE_AUDIO_VOICE, val, reg); |
68 | /* Cache the vibra control registers */ | ||
69 | if (reg == TWL6040_REG_VIBCTLL || reg == TWL6040_REG_VIBCTLR) | ||
70 | twl6040->vibra_ctrl_cache[VIBRACTRL_MEMBER(reg)] = val; | ||
60 | mutex_unlock(&twl6040->io_mutex); | 71 | mutex_unlock(&twl6040->io_mutex); |
61 | 72 | ||
62 | return ret; | 73 | return ret; |
diff --git a/include/linux/mfd/twl6040.h b/include/linux/mfd/twl6040.h index e6c755db4560..2f8585a4c74b 100644 --- a/include/linux/mfd/twl6040.h +++ b/include/linux/mfd/twl6040.h | |||
@@ -184,6 +184,7 @@ struct twl6040 { | |||
184 | int audpwron; | 184 | int audpwron; |
185 | int power_count; | 185 | int power_count; |
186 | int rev; | 186 | int rev; |
187 | u8 vibra_ctrl_cache[2]; | ||
187 | 188 | ||
188 | int pll; | 189 | int pll; |
189 | unsigned int sysclk; | 190 | unsigned int sysclk; |