aboutsummaryrefslogtreecommitdiffstats
path: root/sound/soc/codecs/twl6040.c
diff options
context:
space:
mode:
Diffstat (limited to 'sound/soc/codecs/twl6040.c')
-rw-r--r--sound/soc/codecs/twl6040.c22
1 files changed, 5 insertions, 17 deletions
diff --git a/sound/soc/codecs/twl6040.c b/sound/soc/codecs/twl6040.c
index 35059a242fa4..f2f4bcb2ff71 100644
--- a/sound/soc/codecs/twl6040.c
+++ b/sound/soc/codecs/twl6040.c
@@ -54,12 +54,7 @@ enum twl6040_dai_id {
54#define TWL6040_OUTHF_0dB 0x03 54#define TWL6040_OUTHF_0dB 0x03
55#define TWL6040_OUTHF_M52dB 0x1D 55#define TWL6040_OUTHF_M52dB 0x1D
56 56
57/* Shadow register used by the driver */ 57#define TWL6040_CACHEREGNUM (TWL6040_REG_STATUS + 1)
58#define TWL6040_REG_SW_SHADOW 0x2F
59#define TWL6040_CACHEREGNUM (TWL6040_REG_SW_SHADOW + 1)
60
61/* TWL6040_REG_SW_SHADOW (0x2F) fields */
62#define TWL6040_EAR_PATH_ENABLE 0x01
63 58
64struct twl6040_jack_data { 59struct twl6040_jack_data {
65 struct snd_soc_jack *jack; 60 struct snd_soc_jack *jack;
@@ -135,8 +130,6 @@ static const u8 twl6040_reg[TWL6040_CACHEREGNUM] = {
135 0x00, /* REG_HFOTRIM 0x2C */ 130 0x00, /* REG_HFOTRIM 0x2C */
136 0x09, /* REG_ACCCTL 0x2D */ 131 0x09, /* REG_ACCCTL 0x2D */
137 0x00, /* REG_STATUS 0x2E (ro) */ 132 0x00, /* REG_STATUS 0x2E (ro) */
138
139 0x00, /* REG_SW_SHADOW 0x2F - Shadow, non HW register */
140}; 133};
141 134
142/* List of registers to be restored after power up */ 135/* List of registers to be restored after power up */
@@ -220,12 +213,8 @@ static int twl6040_read_reg_volatile(struct snd_soc_codec *codec,
220 if (reg >= TWL6040_CACHEREGNUM) 213 if (reg >= TWL6040_CACHEREGNUM)
221 return -EIO; 214 return -EIO;
222 215
223 if (likely(reg < TWL6040_REG_SW_SHADOW)) { 216 value = twl6040_reg_read(twl6040, reg);
224 value = twl6040_reg_read(twl6040, reg); 217 twl6040_write_reg_cache(codec, reg, value);
225 twl6040_write_reg_cache(codec, reg, value);
226 } else {
227 value = twl6040_read_reg_cache(codec, reg);
228 }
229 218
230 return value; 219 return value;
231} 220}
@@ -261,8 +250,7 @@ static int twl6040_write(struct snd_soc_codec *codec,
261 return -EIO; 250 return -EIO;
262 251
263 twl6040_write_reg_cache(codec, reg, value); 252 twl6040_write_reg_cache(codec, reg, value);
264 if (likely(reg < TWL6040_REG_SW_SHADOW) && 253 if (twl6040_is_path_unmuted(codec, reg))
265 twl6040_is_path_unmuted(codec, reg))
266 return twl6040_reg_write(twl6040, reg, value); 254 return twl6040_reg_write(twl6040, reg, value);
267 else 255 else
268 return 0; 256 return 0;
@@ -555,7 +543,7 @@ static const struct snd_kcontrol_new hfr_mux_controls =
555 SOC_DAPM_ENUM("Route", twl6040_hf_enum[1]); 543 SOC_DAPM_ENUM("Route", twl6040_hf_enum[1]);
556 544
557static const struct snd_kcontrol_new ep_path_enable_control = 545static const struct snd_kcontrol_new ep_path_enable_control =
558 SOC_DAPM_SINGLE("Switch", TWL6040_REG_SW_SHADOW, 0, 1, 0); 546 SOC_DAPM_SINGLE_VIRT("Switch", 1);
559 547
560static const struct snd_kcontrol_new auxl_switch_control = 548static const struct snd_kcontrol_new auxl_switch_control =
561 SOC_DAPM_SINGLE("Switch", TWL6040_REG_HFLCTL, 6, 1, 0); 549 SOC_DAPM_SINGLE("Switch", TWL6040_REG_HFLCTL, 6, 1, 0);