diff options
Diffstat (limited to 'include/linux/regmap.h')
-rw-r--r-- | include/linux/regmap.h | 217 |
1 files changed, 217 insertions, 0 deletions
diff --git a/include/linux/regmap.h b/include/linux/regmap.h new file mode 100644 index 00000000000..9fce3c8eb40 --- /dev/null +++ b/include/linux/regmap.h | |||
@@ -0,0 +1,217 @@ | |||
1 | #ifndef __LINUX_REGMAP_H | ||
2 | #define __LINUX_REGMAP_H | ||
3 | |||
4 | /* | ||
5 | * Register map access API | ||
6 | * | ||
7 | * Copyright 2011 Wolfson Microelectronics plc | ||
8 | * | ||
9 | * Author: Mark Brown <broonie@opensource.wolfsonmicro.com> | ||
10 | * | ||
11 | * This program is free software; you can redistribute it and/or modify | ||
12 | * it under the terms of the GNU General Public License version 2 as | ||
13 | * published by the Free Software Foundation. | ||
14 | */ | ||
15 | |||
16 | #include <linux/device.h> | ||
17 | #include <linux/list.h> | ||
18 | #include <linux/module.h> | ||
19 | |||
20 | struct i2c_client; | ||
21 | struct spi_device; | ||
22 | |||
23 | /* An enum of all the supported cache types */ | ||
24 | enum regcache_type { | ||
25 | REGCACHE_NONE, | ||
26 | REGCACHE_RBTREE, | ||
27 | REGCACHE_COMPRESSED | ||
28 | }; | ||
29 | |||
30 | /** | ||
31 | * Default value for a register. We use an array of structs rather | ||
32 | * than a simple array as many modern devices have very sparse | ||
33 | * register maps. | ||
34 | * | ||
35 | * @reg: Register address. | ||
36 | * @def: Register default value. | ||
37 | */ | ||
38 | struct reg_default { | ||
39 | unsigned int reg; | ||
40 | unsigned int def; | ||
41 | }; | ||
42 | |||
43 | /** | ||
44 | * Configuration for the register map of a device. | ||
45 | * | ||
46 | * @reg_bits: Number of bits in a register address, mandatory. | ||
47 | * @pad_bits: Number of bits of padding between register and value. | ||
48 | * @val_bits: Number of bits in a register value, mandatory. | ||
49 | * | ||
50 | * @writeable_reg: Optional callback returning true if the register | ||
51 | * can be written to. | ||
52 | * @readable_reg: Optional callback returning true if the register | ||
53 | * can be read from. | ||
54 | * @volatile_reg: Optional callback returning true if the register | ||
55 | * value can't be cached. | ||
56 | * @precious_reg: Optional callback returning true if the rgister | ||
57 | * should not be read outside of a call from the driver | ||
58 | * (eg, a clear on read interrupt status register). | ||
59 | * | ||
60 | * @max_register: Optional, specifies the maximum valid register index. | ||
61 | * @reg_defaults: Power on reset values for registers (for use with | ||
62 | * register cache support). | ||
63 | * @num_reg_defaults: Number of elements in reg_defaults. | ||
64 | * | ||
65 | * @read_flag_mask: Mask to be set in the top byte of the register when doing | ||
66 | * a read. | ||
67 | * @write_flag_mask: Mask to be set in the top byte of the register when doing | ||
68 | * a write. If both read_flag_mask and write_flag_mask are | ||
69 | * empty the regmap_bus default masks are used. | ||
70 | * | ||
71 | * @cache_type: The actual cache type. | ||
72 | * @reg_defaults_raw: Power on reset values for registers (for use with | ||
73 | * register cache support). | ||
74 | * @num_reg_defaults_raw: Number of elements in reg_defaults_raw. | ||
75 | */ | ||
76 | struct regmap_config { | ||
77 | int reg_bits; | ||
78 | int pad_bits; | ||
79 | int val_bits; | ||
80 | |||
81 | bool (*writeable_reg)(struct device *dev, unsigned int reg); | ||
82 | bool (*readable_reg)(struct device *dev, unsigned int reg); | ||
83 | bool (*volatile_reg)(struct device *dev, unsigned int reg); | ||
84 | bool (*precious_reg)(struct device *dev, unsigned int reg); | ||
85 | |||
86 | unsigned int max_register; | ||
87 | const struct reg_default *reg_defaults; | ||
88 | unsigned int num_reg_defaults; | ||
89 | enum regcache_type cache_type; | ||
90 | const void *reg_defaults_raw; | ||
91 | unsigned int num_reg_defaults_raw; | ||
92 | |||
93 | u8 read_flag_mask; | ||
94 | u8 write_flag_mask; | ||
95 | }; | ||
96 | |||
97 | typedef int (*regmap_hw_write)(struct device *dev, const void *data, | ||
98 | size_t count); | ||
99 | typedef int (*regmap_hw_gather_write)(struct device *dev, | ||
100 | const void *reg, size_t reg_len, | ||
101 | const void *val, size_t val_len); | ||
102 | typedef int (*regmap_hw_read)(struct device *dev, | ||
103 | const void *reg_buf, size_t reg_size, | ||
104 | void *val_buf, size_t val_size); | ||
105 | |||
106 | /** | ||
107 | * Description of a hardware bus for the register map infrastructure. | ||
108 | * | ||
109 | * @write: Write operation. | ||
110 | * @gather_write: Write operation with split register/value, return -ENOTSUPP | ||
111 | * if not implemented on a given device. | ||
112 | * @read: Read operation. Data is returned in the buffer used to transmit | ||
113 | * data. | ||
114 | * @read_flag_mask: Mask to be set in the top byte of the register when doing | ||
115 | * a read. | ||
116 | */ | ||
117 | struct regmap_bus { | ||
118 | regmap_hw_write write; | ||
119 | regmap_hw_gather_write gather_write; | ||
120 | regmap_hw_read read; | ||
121 | u8 read_flag_mask; | ||
122 | }; | ||
123 | |||
124 | struct regmap *regmap_init(struct device *dev, | ||
125 | const struct regmap_bus *bus, | ||
126 | const struct regmap_config *config); | ||
127 | struct regmap *regmap_init_i2c(struct i2c_client *i2c, | ||
128 | const struct regmap_config *config); | ||
129 | struct regmap *regmap_init_spi(struct spi_device *dev, | ||
130 | const struct regmap_config *config); | ||
131 | |||
132 | struct regmap *devm_regmap_init(struct device *dev, | ||
133 | const struct regmap_bus *bus, | ||
134 | const struct regmap_config *config); | ||
135 | struct regmap *devm_regmap_init_i2c(struct i2c_client *i2c, | ||
136 | const struct regmap_config *config); | ||
137 | struct regmap *devm_regmap_init_spi(struct spi_device *dev, | ||
138 | const struct regmap_config *config); | ||
139 | |||
140 | void regmap_exit(struct regmap *map); | ||
141 | int regmap_reinit_cache(struct regmap *map, | ||
142 | const struct regmap_config *config); | ||
143 | int regmap_write(struct regmap *map, unsigned int reg, unsigned int val); | ||
144 | int regmap_raw_write(struct regmap *map, unsigned int reg, | ||
145 | const void *val, size_t val_len); | ||
146 | int regmap_bulk_write(struct regmap *map, unsigned int reg, const void *val, | ||
147 | size_t val_count); | ||
148 | int regmap_read(struct regmap *map, unsigned int reg, unsigned int *val); | ||
149 | int regmap_raw_read(struct regmap *map, unsigned int reg, | ||
150 | void *val, size_t val_len); | ||
151 | int regmap_bulk_read(struct regmap *map, unsigned int reg, void *val, | ||
152 | size_t val_count); | ||
153 | int regmap_update_bits(struct regmap *map, unsigned int reg, | ||
154 | unsigned int mask, unsigned int val); | ||
155 | int regmap_update_bits_lazy(struct regmap *map, unsigned int reg, | ||
156 | unsigned int mask, unsigned int val); | ||
157 | int regmap_update_bits_check(struct regmap *map, unsigned int reg, | ||
158 | unsigned int mask, unsigned int val, | ||
159 | bool *change); | ||
160 | |||
161 | int regcache_sync(struct regmap *map); | ||
162 | void regcache_cache_only(struct regmap *map, bool enable); | ||
163 | void regcache_cache_bypass(struct regmap *map, bool enable); | ||
164 | void regcache_mark_dirty(struct regmap *map); | ||
165 | |||
166 | int regmap_register_patch(struct regmap *map, const struct reg_default *regs, | ||
167 | int num_regs); | ||
168 | |||
169 | /** | ||
170 | * Description of an IRQ for the generic regmap irq_chip. | ||
171 | * | ||
172 | * @reg_offset: Offset of the status/mask register within the bank | ||
173 | * @mask: Mask used to flag/control the register. | ||
174 | */ | ||
175 | struct regmap_irq { | ||
176 | unsigned int reg_offset; | ||
177 | unsigned int mask; | ||
178 | }; | ||
179 | |||
180 | /** | ||
181 | * Description of a generic regmap irq_chip. This is not intended to | ||
182 | * handle every possible interrupt controller, but it should handle a | ||
183 | * substantial proportion of those that are found in the wild. | ||
184 | * | ||
185 | * @name: Descriptive name for IRQ controller. | ||
186 | * | ||
187 | * @status_base: Base status register address. | ||
188 | * @mask_base: Base mask register address. | ||
189 | * @ack_base: Base ack address. If zero then the chip is clear on read. | ||
190 | * | ||
191 | * @num_regs: Number of registers in each control bank. | ||
192 | * @irqs: Descriptors for individual IRQs. Interrupt numbers are | ||
193 | * assigned based on the index in the array of the interrupt. | ||
194 | * @num_irqs: Number of descriptors. | ||
195 | */ | ||
196 | struct regmap_irq_chip { | ||
197 | const char *name; | ||
198 | |||
199 | unsigned int status_base; | ||
200 | unsigned int mask_base; | ||
201 | unsigned int ack_base; | ||
202 | |||
203 | int num_regs; | ||
204 | |||
205 | const struct regmap_irq *irqs; | ||
206 | int num_irqs; | ||
207 | }; | ||
208 | |||
209 | struct regmap_irq_chip_data; | ||
210 | |||
211 | int regmap_add_irq_chip(struct regmap *map, int irq, int irq_flags, | ||
212 | int irq_base, struct regmap_irq_chip *chip, | ||
213 | struct regmap_irq_chip_data **data); | ||
214 | void regmap_del_irq_chip(int irq, struct regmap_irq_chip_data *data); | ||
215 | int regmap_irq_chip_get_base(struct regmap_irq_chip_data *data); | ||
216 | |||
217 | #endif | ||