1 /* SPDX-License-Identifier: GPL-2.0 */
3 * Register map access API internal header
5 * Copyright 2011 Wolfson Microelectronics plc
7 * Author: Mark Brown <broonie@opensource.wolfsonmicro.com>
10 #ifndef _REGMAP_INTERNAL_H
11 #define _REGMAP_INTERNAL_H
13 #include <linux/device.h>
14 #include <linux/regmap.h>
16 #include <linux/list.h>
17 #include <linux/wait.h>
22 struct regmap_debugfs_off_cache
{
23 struct list_head list
;
26 unsigned int base_reg
;
30 struct regmap_format
{
36 void (*format_write
)(struct regmap
*map
,
37 unsigned int reg
, unsigned int val
);
38 void (*format_reg
)(void *buf
, unsigned int reg
, unsigned int shift
);
39 void (*format_val
)(void *buf
, unsigned int val
, unsigned int shift
);
40 unsigned int (*parse_val
)(const void *buf
);
41 void (*parse_inplace
)(void *buf
);
45 struct list_head list
;
55 unsigned long spinlock_flags
;
58 raw_spinlock_t raw_spinlock
;
59 unsigned long raw_spinlock_flags
;
62 struct lock_class_key
*lock_key
;
65 void *lock_arg
; /* This is passed to lock/unlock functions */
67 unsigned int reg_base
;
69 struct device
*dev
; /* Device we do I/O on */
70 void *work_buf
; /* Scratch buffer used to format I/O */
71 struct regmap_format format
; /* Buffer format */
72 const struct regmap_bus
*bus
;
77 spinlock_t async_lock
;
78 wait_queue_head_t async_waitq
;
79 struct list_head async_list
;
80 struct list_head async_free
;
83 #ifdef CONFIG_DEBUG_FS
85 struct dentry
*debugfs
;
86 const char *debugfs_name
;
88 unsigned int debugfs_reg_len
;
89 unsigned int debugfs_val_len
;
90 unsigned int debugfs_tot_len
;
92 struct list_head debugfs_off_cache
;
93 struct mutex cache_lock
;
96 unsigned int max_register
;
97 bool max_register_is_set
;
98 bool (*writeable_reg
)(struct device
*dev
, unsigned int reg
);
99 bool (*readable_reg
)(struct device
*dev
, unsigned int reg
);
100 bool (*volatile_reg
)(struct device
*dev
, unsigned int reg
);
101 bool (*precious_reg
)(struct device
*dev
, unsigned int reg
);
102 bool (*writeable_noinc_reg
)(struct device
*dev
, unsigned int reg
);
103 bool (*readable_noinc_reg
)(struct device
*dev
, unsigned int reg
);
104 const struct regmap_access_table
*wr_table
;
105 const struct regmap_access_table
*rd_table
;
106 const struct regmap_access_table
*volatile_table
;
107 const struct regmap_access_table
*precious_table
;
108 const struct regmap_access_table
*wr_noinc_table
;
109 const struct regmap_access_table
*rd_noinc_table
;
111 int (*reg_read
)(void *context
, unsigned int reg
, unsigned int *val
);
112 int (*reg_write
)(void *context
, unsigned int reg
, unsigned int val
);
113 int (*reg_update_bits
)(void *context
, unsigned int reg
,
114 unsigned int mask
, unsigned int val
);
115 /* Bulk read/write */
116 int (*read
)(void *context
, const void *reg_buf
, size_t reg_size
,
117 void *val_buf
, size_t val_size
);
118 int (*write
)(void *context
, const void *data
, size_t count
);
122 unsigned long read_flag_mask
;
123 unsigned long write_flag_mask
;
125 /* number of bits to (left) shift the reg value when formatting*/
128 int reg_stride_order
;
130 /* If set, will always write field to HW. */
131 bool force_write_field
;
133 /* regcache specific members */
134 const struct regcache_ops
*cache_ops
;
135 enum regcache_type cache_type
;
137 /* number of bytes in reg_defaults_raw */
138 unsigned int cache_size_raw
;
139 /* number of bytes per word in reg_defaults_raw */
140 unsigned int cache_word_size
;
141 /* number of entries in reg_defaults */
142 unsigned int num_reg_defaults
;
143 /* number of entries in reg_defaults_raw */
144 unsigned int num_reg_defaults_raw
;
146 /* if set, only the cache is modified not the HW */
148 /* if set, only the HW is modified not the cache */
150 /* if set, remember to free reg_defaults_raw */
153 struct reg_default
*reg_defaults
;
154 const void *reg_defaults_raw
;
156 /* if set, the cache contains newer data than the HW */
158 /* if set, the HW registers are known to match map->reg_defaults */
159 bool no_sync_defaults
;
161 struct reg_sequence
*patch
;
164 /* if set, converts bulk read to single read */
165 bool use_single_read
;
166 /* if set, converts bulk write to single write */
167 bool use_single_write
;
168 /* if set, the device supports multi write mode */
169 bool can_multi_write
;
171 /* if set, raw reads/writes are limited to this size */
173 size_t max_raw_write
;
175 struct rb_root range_tree
;
176 void *selector_work_buf
; /* Scratch buffer used for selector */
178 struct hwspinlock
*hwlock
;
180 /* if set, the regmap core can sleep */
184 struct regcache_ops
{
186 enum regcache_type type
;
187 int (*init
)(struct regmap
*map
);
188 int (*exit
)(struct regmap
*map
);
189 #ifdef CONFIG_DEBUG_FS
190 void (*debugfs_init
)(struct regmap
*map
);
192 int (*read
)(struct regmap
*map
, unsigned int reg
, unsigned int *value
);
193 int (*write
)(struct regmap
*map
, unsigned int reg
, unsigned int value
);
194 int (*sync
)(struct regmap
*map
, unsigned int min
, unsigned int max
);
195 int (*drop
)(struct regmap
*map
, unsigned int min
, unsigned int max
);
198 bool regmap_cached(struct regmap
*map
, unsigned int reg
);
199 bool regmap_writeable(struct regmap
*map
, unsigned int reg
);
200 bool regmap_readable(struct regmap
*map
, unsigned int reg
);
201 bool regmap_volatile(struct regmap
*map
, unsigned int reg
);
202 bool regmap_precious(struct regmap
*map
, unsigned int reg
);
203 bool regmap_writeable_noinc(struct regmap
*map
, unsigned int reg
);
204 bool regmap_readable_noinc(struct regmap
*map
, unsigned int reg
);
206 int _regmap_write(struct regmap
*map
, unsigned int reg
,
209 struct regmap_range_node
{
214 unsigned int range_min
;
215 unsigned int range_max
;
217 unsigned int selector_reg
;
218 unsigned int selector_mask
;
221 unsigned int window_start
;
222 unsigned int window_len
;
225 struct regmap_field
{
226 struct regmap
*regmap
;
232 unsigned int id_size
;
233 unsigned int id_offset
;
236 #ifdef CONFIG_DEBUG_FS
237 extern void regmap_debugfs_initcall(void);
238 extern void regmap_debugfs_init(struct regmap
*map
);
239 extern void regmap_debugfs_exit(struct regmap
*map
);
241 static inline void regmap_debugfs_disable(struct regmap
*map
)
243 map
->debugfs_disable
= true;
247 static inline void regmap_debugfs_initcall(void) { }
248 static inline void regmap_debugfs_init(struct regmap
*map
) { }
249 static inline void regmap_debugfs_exit(struct regmap
*map
) { }
250 static inline void regmap_debugfs_disable(struct regmap
*map
) { }
253 /* regcache core declarations */
254 int regcache_init(struct regmap
*map
, const struct regmap_config
*config
);
255 void regcache_exit(struct regmap
*map
);
256 int regcache_read(struct regmap
*map
,
257 unsigned int reg
, unsigned int *value
);
258 int regcache_write(struct regmap
*map
,
259 unsigned int reg
, unsigned int value
);
260 int regcache_sync(struct regmap
*map
);
261 int regcache_sync_block(struct regmap
*map
, void *block
,
262 unsigned long *cache_present
,
263 unsigned int block_base
, unsigned int start
,
265 bool regcache_reg_needs_sync(struct regmap
*map
, unsigned int reg
,
268 static inline const void *regcache_get_val_addr(struct regmap
*map
,
272 return base
+ (map
->cache_word_size
* idx
);
275 unsigned int regcache_get_val(struct regmap
*map
, const void *base
,
277 void regcache_set_val(struct regmap
*map
, void *base
, unsigned int idx
,
279 int regcache_lookup_reg(struct regmap
*map
, unsigned int reg
);
280 int regcache_sync_val(struct regmap
*map
, unsigned int reg
, unsigned int val
);
282 int _regmap_raw_write(struct regmap
*map
, unsigned int reg
,
283 const void *val
, size_t val_len
, bool noinc
);
285 void regmap_async_complete_cb(struct regmap_async
*async
, int ret
);
287 enum regmap_endian
regmap_get_val_endian(struct device
*dev
,
288 const struct regmap_bus
*bus
,
289 const struct regmap_config
*config
);
291 extern struct regcache_ops regcache_rbtree_ops
;
292 extern struct regcache_ops regcache_maple_ops
;
293 extern struct regcache_ops regcache_flat_ops
;
295 static inline const char *regmap_name(const struct regmap
*map
)
298 return dev_name(map
->dev
);
303 static inline unsigned int regmap_get_offset(const struct regmap
*map
,
306 if (map
->reg_stride_order
>= 0)
307 return index
<< map
->reg_stride_order
;
309 return index
* map
->reg_stride
;
312 static inline unsigned int regcache_get_index_by_order(const struct regmap
*map
,
315 return reg
>> map
->reg_stride_order
;
318 struct regmap_ram_data
{
319 unsigned int *vals
; /* Allocatd by caller */
322 enum regmap_endian reg_endian
;
323 bool (*noinc_reg
)(struct regmap_ram_data
*data
, unsigned int reg
);
327 * Create a test register map with data stored in RAM, not intended
330 struct regmap
*__regmap_init_ram(struct device
*dev
,
331 const struct regmap_config
*config
,
332 struct regmap_ram_data
*data
,
333 struct lock_class_key
*lock_key
,
334 const char *lock_name
);
336 #define regmap_init_ram(dev, config, data) \
337 __regmap_lockdep_wrapper(__regmap_init_ram, #dev, dev, config, data)
339 struct regmap
*__regmap_init_raw_ram(struct device
*dev
,
340 const struct regmap_config
*config
,
341 struct regmap_ram_data
*data
,
342 struct lock_class_key
*lock_key
,
343 const char *lock_name
);
345 #define regmap_init_raw_ram(dev, config, data) \
346 __regmap_lockdep_wrapper(__regmap_init_raw_ram, #dev, dev, config, data)