aboutsummaryrefslogtreecommitdiffstats
path: root/include/linux/regmap.h
diff options
context:
space:
mode:
authorMark Brown <broonie@opensource.wolfsonmicro.com>2011-08-19 05:09:38 -0400
committerMark Brown <broonie@opensource.wolfsonmicro.com>2011-08-21 07:54:54 -0400
commitbd20eb541ebbb17a5e047cd20e74b9ccf19a4123 (patch)
tree51743ac99d54e15a5e5717db8984b29cb394047f /include/linux/regmap.h
parent3566cc9d90e3f774cea47de6986c59a09090ce2b (diff)
regmap: Allow drivers to specify register defaults
It is useful for the register cache code to be able to specify the default values for the device registers. The major use is when restoring the register cache after suspend, knowing the register defaults allows us to skip registers that are at their default values when we resume which can be a substantial win on larger modern devices. For some devices (mostly older ones) the hardware does not support readback so the only way we can know the values is from code and so initializing the cache with default values makes it much easier for drivers work with read/modify/write updates. Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
Diffstat (limited to 'include/linux/regmap.h')
-rw-r--r--include/linux/regmap.h24
1 files changed, 22 insertions, 2 deletions
diff --git a/include/linux/regmap.h b/include/linux/regmap.h
index 4de137bc16a7..e2200f21c602 100644
--- a/include/linux/regmap.h
+++ b/include/linux/regmap.h
@@ -21,12 +21,24 @@ struct i2c_client;
21struct spi_device; 21struct spi_device;
22 22
23/** 23/**
24 * Default value for a register. We use an array of structs rather
25 * than a simple array as many modern devices have very sparse
26 * register maps.
27 *
28 * @reg: Register address.
29 * @def: Register default value.
30 */
31struct reg_default {
32 unsigned int reg;
33 unsigned int def;
34};
35
36/**
24 * Configuration for the register map of a device. 37 * Configuration for the register map of a device.
25 * 38 *
26 * @reg_bits: Number of bits in a register address, mandatory. 39 * @reg_bits: Number of bits in a register address, mandatory.
27 * @val_bits: Number of bits in a register value, mandatory. 40 * @val_bits: Number of bits in a register value, mandatory.
28 * 41 *
29 * @max_register: Optional, specifies the maximum valid register index.
30 * @writeable_reg: Optional callback returning true if the register 42 * @writeable_reg: Optional callback returning true if the register
31 * can be written to. 43 * can be written to.
32 * @readable_reg: Optional callback returning true if the register 44 * @readable_reg: Optional callback returning true if the register
@@ -36,16 +48,24 @@ struct spi_device;
36 * @precious_reg: Optional callback returning true if the rgister 48 * @precious_reg: Optional callback returning true if the rgister
37 * should not be read outside of a call from the driver 49 * should not be read outside of a call from the driver
38 * (eg, a clear on read interrupt status register). 50 * (eg, a clear on read interrupt status register).
51 *
52 * @max_register: Optional, specifies the maximum valid register index.
53 * @reg_defaults: Power on reset values for registers (for use with
54 * register cache support).
55 * @num_reg_defaults: Number of elements in reg_defaults.
39 */ 56 */
40struct regmap_config { 57struct regmap_config {
41 int reg_bits; 58 int reg_bits;
42 int val_bits; 59 int val_bits;
43 60
44 unsigned int max_register;
45 bool (*writeable_reg)(struct device *dev, unsigned int reg); 61 bool (*writeable_reg)(struct device *dev, unsigned int reg);
46 bool (*readable_reg)(struct device *dev, unsigned int reg); 62 bool (*readable_reg)(struct device *dev, unsigned int reg);
47 bool (*volatile_reg)(struct device *dev, unsigned int reg); 63 bool (*volatile_reg)(struct device *dev, unsigned int reg);
48 bool (*precious_reg)(struct device *dev, unsigned int reg); 64 bool (*precious_reg)(struct device *dev, unsigned int reg);
65
66 unsigned int max_register;
67 struct reg_default *reg_defaults;
68 int num_reg_defaults;
49}; 69};
50 70
51typedef int (*regmap_hw_write)(struct device *dev, const void *data, 71typedef int (*regmap_hw_write)(struct device *dev, const void *data,