mfd: twl6040: Use regmap for register cache

Rather then open coding a cache of the vibra control registers use the
regmap cache code.  Also cache the interrupt mask register, providing
a small performance improvement for the interrupt code.

Signed-off-by: Mark Brown <broonie@linaro.org>
Acked-by: Peter Ujfalusi <peter.ujfalusi@ti.com>
Signed-off-by: Samuel Ortiz <sameo@linux.intel.com>
This commit is contained in:
Mark Brown 2013-08-31 17:48:19 +01:00 committed by Samuel Ortiz
parent 921a2c870f
commit c6f39257c9
2 changed files with 30 additions and 14 deletions

View File

@ -63,15 +63,9 @@ int twl6040_reg_read(struct twl6040 *twl6040, unsigned int reg)
int ret; int ret;
unsigned int val; unsigned int val;
/* Vibra control registers from cache */ ret = regmap_read(twl6040->regmap, reg, &val);
if (unlikely(reg == TWL6040_REG_VIBCTLL || if (ret < 0)
reg == TWL6040_REG_VIBCTLR)) { return ret;
val = twl6040->vibra_ctrl_cache[VIBRACTRL_MEMBER(reg)];
} else {
ret = regmap_read(twl6040->regmap, reg, &val);
if (ret < 0)
return ret;
}
return val; return val;
} }
@ -82,9 +76,6 @@ int twl6040_reg_write(struct twl6040 *twl6040, unsigned int reg, u8 val)
int ret; int ret;
ret = regmap_write(twl6040->regmap, reg, val); ret = regmap_write(twl6040->regmap, reg, val);
/* Cache the vibra control registers */
if (reg == TWL6040_REG_VIBCTLL || reg == TWL6040_REG_VIBCTLR)
twl6040->vibra_ctrl_cache[VIBRACTRL_MEMBER(reg)] = val;
return ret; return ret;
} }
@ -461,9 +452,20 @@ EXPORT_SYMBOL(twl6040_get_sysclk);
/* Get the combined status of the vibra control register */ /* Get the combined status of the vibra control register */
int twl6040_get_vibralr_status(struct twl6040 *twl6040) int twl6040_get_vibralr_status(struct twl6040 *twl6040)
{ {
unsigned int reg;
int ret;
u8 status; u8 status;
status = twl6040->vibra_ctrl_cache[0] | twl6040->vibra_ctrl_cache[1]; ret = regmap_read(twl6040->regmap, TWL6040_REG_VIBCTLL, &reg);
if (ret != 0)
return ret;
status = reg;
ret = regmap_read(twl6040->regmap, TWL6040_REG_VIBCTLR, &reg);
if (ret != 0)
return ret;
status |= reg;
status &= (TWL6040_VIBENA | TWL6040_VIBSEL); status &= (TWL6040_VIBENA | TWL6040_VIBSEL);
return status; return status;
@ -490,12 +492,27 @@ static bool twl6040_readable_reg(struct device *dev, unsigned int reg)
return true; return true;
} }
static bool twl6040_volatile_reg(struct device *dev, unsigned int reg)
{
switch (reg) {
case TWL6040_REG_VIBCTLL:
case TWL6040_REG_VIBCTLR:
case TWL6040_REG_INTMR:
return false;
default:
return true;
}
}
static struct regmap_config twl6040_regmap_config = { static struct regmap_config twl6040_regmap_config = {
.reg_bits = 8, .reg_bits = 8,
.val_bits = 8, .val_bits = 8,
.max_register = TWL6040_REG_STATUS, /* 0x2e */ .max_register = TWL6040_REG_STATUS, /* 0x2e */
.readable_reg = twl6040_readable_reg, .readable_reg = twl6040_readable_reg,
.volatile_reg = twl6040_volatile_reg,
.cache_type = REGCACHE_RBTREE,
}; };
static const struct regmap_irq twl6040_irqs[] = { static const struct regmap_irq twl6040_irqs[] = {

View File

@ -229,7 +229,6 @@ struct twl6040 {
int audpwron; int audpwron;
int power_count; int power_count;
int rev; int rev;
u8 vibra_ctrl_cache[2];
/* PLL configuration */ /* PLL configuration */
int pll; int pll;