aboutsummaryrefslogtreecommitdiffstats
path: root/include/linux/regmap.h
diff options
context:
space:
mode:
Diffstat (limited to 'include/linux/regmap.h')
-rw-r--r--include/linux/regmap.h97
1 files changed, 89 insertions, 8 deletions
diff --git a/include/linux/regmap.h b/include/linux/regmap.h
index b7e95bf942c9..bf77dfdabef9 100644
--- a/include/linux/regmap.h
+++ b/include/linux/regmap.h
@@ -28,7 +28,8 @@ struct regmap_range_cfg;
28enum regcache_type { 28enum regcache_type {
29 REGCACHE_NONE, 29 REGCACHE_NONE,
30 REGCACHE_RBTREE, 30 REGCACHE_RBTREE,
31 REGCACHE_COMPRESSED 31 REGCACHE_COMPRESSED,
32 REGCACHE_FLAT,
32}; 33};
33 34
34/** 35/**
@@ -127,7 +128,18 @@ typedef void (*regmap_unlock)(void *);
127 * @lock_arg: this field is passed as the only argument of lock/unlock 128 * @lock_arg: this field is passed as the only argument of lock/unlock
128 * functions (ignored in case regular lock/unlock functions 129 * functions (ignored in case regular lock/unlock functions
129 * are not overridden). 130 * are not overridden).
130 * 131 * @reg_read: Optional callback that if filled will be used to perform
132 * all the reads from the registers. Should only be provided for
133 * devices whos read operation cannot be represented as a simple read
134 * operation on a bus such as SPI, I2C, etc. Most of the devices do
135 * not need this.
136 * @reg_write: Same as above for writing.
137 * @fast_io: Register IO is fast. Use a spinlock instead of a mutex
138 * to perform locking. This field is ignored if custom lock/unlock
139 * functions are used (see fields lock/unlock of struct regmap_config).
140 * This field is a duplicate of a similar file in
141 * 'struct regmap_bus' and serves exact same purpose.
142 * Use it only for "no-bus" cases.
131 * @max_register: Optional, specifies the maximum valid register index. 143 * @max_register: Optional, specifies the maximum valid register index.
132 * @wr_table: Optional, points to a struct regmap_access_table specifying 144 * @wr_table: Optional, points to a struct regmap_access_table specifying
133 * valid ranges for write access. 145 * valid ranges for write access.
@@ -177,6 +189,11 @@ struct regmap_config {
177 regmap_unlock unlock; 189 regmap_unlock unlock;
178 void *lock_arg; 190 void *lock_arg;
179 191
192 int (*reg_read)(void *context, unsigned int reg, unsigned int *val);
193 int (*reg_write)(void *context, unsigned int reg, unsigned int val);
194
195 bool fast_io;
196
180 unsigned int max_register; 197 unsigned int max_register;
181 const struct regmap_access_table *wr_table; 198 const struct regmap_access_table *wr_table;
182 const struct regmap_access_table *rd_table; 199 const struct regmap_access_table *rd_table;
@@ -235,14 +252,21 @@ struct regmap_range_cfg {
235 unsigned int window_len; 252 unsigned int window_len;
236}; 253};
237 254
255struct regmap_async;
256
238typedef int (*regmap_hw_write)(void *context, const void *data, 257typedef int (*regmap_hw_write)(void *context, const void *data,
239 size_t count); 258 size_t count);
240typedef int (*regmap_hw_gather_write)(void *context, 259typedef int (*regmap_hw_gather_write)(void *context,
241 const void *reg, size_t reg_len, 260 const void *reg, size_t reg_len,
242 const void *val, size_t val_len); 261 const void *val, size_t val_len);
262typedef int (*regmap_hw_async_write)(void *context,
263 const void *reg, size_t reg_len,
264 const void *val, size_t val_len,
265 struct regmap_async *async);
243typedef int (*regmap_hw_read)(void *context, 266typedef int (*regmap_hw_read)(void *context,
244 const void *reg_buf, size_t reg_size, 267 const void *reg_buf, size_t reg_size,
245 void *val_buf, size_t val_size); 268 void *val_buf, size_t val_size);
269typedef struct regmap_async *(*regmap_hw_async_alloc)(void);
246typedef void (*regmap_hw_free_context)(void *context); 270typedef void (*regmap_hw_free_context)(void *context);
247 271
248/** 272/**
@@ -255,8 +279,11 @@ typedef void (*regmap_hw_free_context)(void *context);
255 * @write: Write operation. 279 * @write: Write operation.
256 * @gather_write: Write operation with split register/value, return -ENOTSUPP 280 * @gather_write: Write operation with split register/value, return -ENOTSUPP
257 * if not implemented on a given device. 281 * if not implemented on a given device.
282 * @async_write: Write operation which completes asynchronously, optional and
283 * must serialise with respect to non-async I/O.
258 * @read: Read operation. Data is returned in the buffer used to transmit 284 * @read: Read operation. Data is returned in the buffer used to transmit
259 * data. 285 * data.
286 * @async_alloc: Allocate a regmap_async() structure.
260 * @read_flag_mask: Mask to be set in the top byte of the register when doing 287 * @read_flag_mask: Mask to be set in the top byte of the register when doing
261 * a read. 288 * a read.
262 * @reg_format_endian_default: Default endianness for formatted register 289 * @reg_format_endian_default: Default endianness for formatted register
@@ -265,13 +292,16 @@ typedef void (*regmap_hw_free_context)(void *context);
265 * @val_format_endian_default: Default endianness for formatted register 292 * @val_format_endian_default: Default endianness for formatted register
266 * values. Used when the regmap_config specifies DEFAULT. If this is 293 * values. Used when the regmap_config specifies DEFAULT. If this is
267 * DEFAULT, BIG is assumed. 294 * DEFAULT, BIG is assumed.
295 * @async_size: Size of struct used for async work.
268 */ 296 */
269struct regmap_bus { 297struct regmap_bus {
270 bool fast_io; 298 bool fast_io;
271 regmap_hw_write write; 299 regmap_hw_write write;
272 regmap_hw_gather_write gather_write; 300 regmap_hw_gather_write gather_write;
301 regmap_hw_async_write async_write;
273 regmap_hw_read read; 302 regmap_hw_read read;
274 regmap_hw_free_context free_context; 303 regmap_hw_free_context free_context;
304 regmap_hw_async_alloc async_alloc;
275 u8 read_flag_mask; 305 u8 read_flag_mask;
276 enum regmap_endian reg_format_endian_default; 306 enum regmap_endian reg_format_endian_default;
277 enum regmap_endian val_format_endian_default; 307 enum regmap_endian val_format_endian_default;
@@ -285,9 +315,9 @@ struct regmap *regmap_init_i2c(struct i2c_client *i2c,
285 const struct regmap_config *config); 315 const struct regmap_config *config);
286struct regmap *regmap_init_spi(struct spi_device *dev, 316struct regmap *regmap_init_spi(struct spi_device *dev,
287 const struct regmap_config *config); 317 const struct regmap_config *config);
288struct regmap *regmap_init_mmio(struct device *dev, 318struct regmap *regmap_init_mmio_clk(struct device *dev, const char *clk_id,
289 void __iomem *regs, 319 void __iomem *regs,
290 const struct regmap_config *config); 320 const struct regmap_config *config);
291 321
292struct regmap *devm_regmap_init(struct device *dev, 322struct regmap *devm_regmap_init(struct device *dev,
293 const struct regmap_bus *bus, 323 const struct regmap_bus *bus,
@@ -297,9 +327,44 @@ struct regmap *devm_regmap_init_i2c(struct i2c_client *i2c,
297 const struct regmap_config *config); 327 const struct regmap_config *config);
298struct regmap *devm_regmap_init_spi(struct spi_device *dev, 328struct regmap *devm_regmap_init_spi(struct spi_device *dev,
299 const struct regmap_config *config); 329 const struct regmap_config *config);
300struct regmap *devm_regmap_init_mmio(struct device *dev, 330struct regmap *devm_regmap_init_mmio_clk(struct device *dev, const char *clk_id,
301 void __iomem *regs, 331 void __iomem *regs,
302 const struct regmap_config *config); 332 const struct regmap_config *config);
333
334/**
335 * regmap_init_mmio(): Initialise register map
336 *
337 * @dev: Device that will be interacted with
338 * @regs: Pointer to memory-mapped IO region
339 * @config: Configuration for register map
340 *
341 * The return value will be an ERR_PTR() on error or a valid pointer to
342 * a struct regmap.
343 */
344static inline struct regmap *regmap_init_mmio(struct device *dev,
345 void __iomem *regs,
346 const struct regmap_config *config)
347{
348 return regmap_init_mmio_clk(dev, NULL, regs, config);
349}
350
351/**
352 * devm_regmap_init_mmio(): Initialise managed register map
353 *
354 * @dev: Device that will be interacted with
355 * @regs: Pointer to memory-mapped IO region
356 * @config: Configuration for register map
357 *
358 * The return value will be an ERR_PTR() on error or a valid pointer
359 * to a struct regmap. The regmap will be automatically freed by the
360 * device management code.
361 */
362static inline struct regmap *devm_regmap_init_mmio(struct device *dev,
363 void __iomem *regs,
364 const struct regmap_config *config)
365{
366 return devm_regmap_init_mmio_clk(dev, NULL, regs, config);
367}
303 368
304void regmap_exit(struct regmap *map); 369void regmap_exit(struct regmap *map);
305int regmap_reinit_cache(struct regmap *map, 370int regmap_reinit_cache(struct regmap *map,
@@ -310,6 +375,8 @@ int regmap_raw_write(struct regmap *map, unsigned int reg,
310 const void *val, size_t val_len); 375 const void *val, size_t val_len);
311int regmap_bulk_write(struct regmap *map, unsigned int reg, const void *val, 376int regmap_bulk_write(struct regmap *map, unsigned int reg, const void *val,
312 size_t val_count); 377 size_t val_count);
378int regmap_raw_write_async(struct regmap *map, unsigned int reg,
379 const void *val, size_t val_len);
313int regmap_read(struct regmap *map, unsigned int reg, unsigned int *val); 380int regmap_read(struct regmap *map, unsigned int reg, unsigned int *val);
314int regmap_raw_read(struct regmap *map, unsigned int reg, 381int regmap_raw_read(struct regmap *map, unsigned int reg,
315 void *val, size_t val_len); 382 void *val, size_t val_len);
@@ -321,6 +388,7 @@ int regmap_update_bits_check(struct regmap *map, unsigned int reg,
321 unsigned int mask, unsigned int val, 388 unsigned int mask, unsigned int val,
322 bool *change); 389 bool *change);
323int regmap_get_val_bytes(struct regmap *map); 390int regmap_get_val_bytes(struct regmap *map);
391int regmap_async_complete(struct regmap *map);
324 392
325int regcache_sync(struct regmap *map); 393int regcache_sync(struct regmap *map);
326int regcache_sync_region(struct regmap *map, unsigned int min, 394int regcache_sync_region(struct regmap *map, unsigned int min,
@@ -381,6 +449,7 @@ struct regmap_irq_chip {
381 unsigned int wake_base; 449 unsigned int wake_base;
382 unsigned int irq_reg_stride; 450 unsigned int irq_reg_stride;
383 unsigned int mask_invert; 451 unsigned int mask_invert;
452 unsigned int wake_invert;
384 bool runtime_pm; 453 bool runtime_pm;
385 454
386 int num_regs; 455 int num_regs;
@@ -422,6 +491,13 @@ static inline int regmap_raw_write(struct regmap *map, unsigned int reg,
422 return -EINVAL; 491 return -EINVAL;
423} 492}
424 493
494static inline int regmap_raw_write_async(struct regmap *map, unsigned int reg,
495 const void *val, size_t val_len)
496{
497 WARN_ONCE(1, "regmap API is disabled");
498 return -EINVAL;
499}
500
425static inline int regmap_bulk_write(struct regmap *map, unsigned int reg, 501static inline int regmap_bulk_write(struct regmap *map, unsigned int reg,
426 const void *val, size_t val_count) 502 const void *val, size_t val_count)
427{ 503{
@@ -500,6 +576,11 @@ static inline void regcache_mark_dirty(struct regmap *map)
500 WARN_ONCE(1, "regmap API is disabled"); 576 WARN_ONCE(1, "regmap API is disabled");
501} 577}
502 578
579static inline void regmap_async_complete(struct regmap *map)
580{
581 WARN_ONCE(1, "regmap API is disabled");
582}
583
503static inline int regmap_register_patch(struct regmap *map, 584static inline int regmap_register_patch(struct regmap *map,
504 const struct reg_default *regs, 585 const struct reg_default *regs,
505 int num_regs) 586 int num_regs)