Commit d17bf318 authored by Peter Ujfalusi's avatar Peter Ujfalusi Committed by Mark Brown

ASoC: twl6040: Introduce SW only shadow register

Software only shadow register to be used by the driver.
For example Earpiece path will need this shadow register.
Signed-off-by: default avatarPeter Ujfalusi <peter.ujfalusi@ti.com>
Acked-by: default avatarLiam Girdwood <lrg@ti.com>
Signed-off-by: default avatarMark Brown <broonie@opensource.wolfsonmicro.com>
parent 5bf692d9
...@@ -68,8 +68,6 @@ ...@@ -68,8 +68,6 @@
#define TWL6040_REG_ACCCTL 0x2D #define TWL6040_REG_ACCCTL 0x2D
#define TWL6040_REG_STATUS 0x2E #define TWL6040_REG_STATUS 0x2E
#define TWL6040_CACHEREGNUM (TWL6040_REG_STATUS + 1)
/* INTID (0x03) fields */ /* INTID (0x03) fields */
#define TWL6040_THINT 0x01 #define TWL6040_THINT 0x01
......
...@@ -57,6 +57,10 @@ ...@@ -57,6 +57,10 @@
#define TWL6040_HF_VOL_MASK 0x1F #define TWL6040_HF_VOL_MASK 0x1F
#define TWL6040_HF_VOL_SHIFT 0 #define TWL6040_HF_VOL_SHIFT 0
/* Shadow register used by the driver */
#define TWL6040_REG_SW_SHADOW 0x2F
#define TWL6040_CACHEREGNUM (TWL6040_REG_SW_SHADOW + 1)
struct twl6040_output { struct twl6040_output {
u16 active; u16 active;
u16 left_vol; u16 left_vol;
...@@ -153,6 +157,8 @@ static const u8 twl6040_reg[TWL6040_CACHEREGNUM] = { ...@@ -153,6 +157,8 @@ static const u8 twl6040_reg[TWL6040_CACHEREGNUM] = {
0x00, /* REG_HFOTRIM 0x2C */ 0x00, /* REG_HFOTRIM 0x2C */
0x09, /* REG_ACCCTL 0x2D */ 0x09, /* REG_ACCCTL 0x2D */
0x00, /* REG_STATUS 0x2E (ro) */ 0x00, /* REG_STATUS 0x2E (ro) */
0x00, /* REG_SW_SHADOW 0x2F - Shadow, non HW register */
}; };
/* List of registers to be restored after power up */ /* List of registers to be restored after power up */
...@@ -236,8 +242,12 @@ static int twl6040_read_reg_volatile(struct snd_soc_codec *codec, ...@@ -236,8 +242,12 @@ static int twl6040_read_reg_volatile(struct snd_soc_codec *codec,
if (reg >= TWL6040_CACHEREGNUM) if (reg >= TWL6040_CACHEREGNUM)
return -EIO; return -EIO;
value = twl6040_reg_read(twl6040, reg); if (likely(reg < TWL6040_REG_SW_SHADOW)) {
twl6040_write_reg_cache(codec, reg, value); value = twl6040_reg_read(twl6040, reg);
twl6040_write_reg_cache(codec, reg, value);
} else {
value = twl6040_read_reg_cache(codec, reg);
}
return value; return value;
} }
...@@ -254,7 +264,10 @@ static int twl6040_write(struct snd_soc_codec *codec, ...@@ -254,7 +264,10 @@ static int twl6040_write(struct snd_soc_codec *codec,
return -EIO; return -EIO;
twl6040_write_reg_cache(codec, reg, value); twl6040_write_reg_cache(codec, reg, value);
return twl6040_reg_write(twl6040, reg, value); if (likely(reg < TWL6040_REG_SW_SHADOW))
return twl6040_reg_write(twl6040, reg, value);
else
return 0;
} }
static void twl6040_init_chip(struct snd_soc_codec *codec) static void twl6040_init_chip(struct snd_soc_codec *codec)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment