Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
torvalds
GitHub Repository: torvalds/linux
Path: blob/master/drivers/base/regmap/internal.h
26426 views
1
/* SPDX-License-Identifier: GPL-2.0 */
2
/*
3
* Register map access API internal header
4
*
5
* Copyright 2011 Wolfson Microelectronics plc
6
*
7
* Author: Mark Brown <[email protected]>
8
*/
9
10
#ifndef _REGMAP_INTERNAL_H
11
#define _REGMAP_INTERNAL_H
12
13
#include <linux/device.h>
14
#include <linux/regmap.h>
15
#include <linux/fs.h>
16
#include <linux/list.h>
17
#include <linux/wait.h>
18
19
struct regmap;
20
struct regcache_ops;
21
22
struct regmap_debugfs_off_cache {
23
struct list_head list;
24
off_t min;
25
off_t max;
26
unsigned int base_reg;
27
unsigned int max_reg;
28
};
29
30
struct regmap_format {
31
size_t buf_size;
32
size_t reg_bytes;
33
size_t pad_bytes;
34
size_t val_bytes;
35
s8 reg_shift;
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);
42
};
43
44
struct regmap_async {
45
struct list_head list;
46
struct regmap *map;
47
void *work_buf;
48
};
49
50
struct regmap {
51
union {
52
struct mutex mutex;
53
struct {
54
spinlock_t spinlock;
55
unsigned long spinlock_flags;
56
};
57
struct {
58
raw_spinlock_t raw_spinlock;
59
unsigned long raw_spinlock_flags;
60
};
61
};
62
struct lock_class_key *lock_key;
63
regmap_lock lock;
64
regmap_unlock unlock;
65
void *lock_arg; /* This is passed to lock/unlock functions */
66
gfp_t alloc_flags;
67
unsigned int reg_base;
68
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;
73
void *bus_context;
74
const char *name;
75
76
spinlock_t async_lock;
77
wait_queue_head_t async_waitq;
78
struct list_head async_list;
79
struct list_head async_free;
80
int async_ret;
81
bool async;
82
83
#ifdef CONFIG_DEBUG_FS
84
bool debugfs_disable;
85
struct dentry *debugfs;
86
const char *debugfs_name;
87
88
unsigned int debugfs_reg_len;
89
unsigned int debugfs_val_len;
90
unsigned int debugfs_tot_len;
91
92
struct list_head debugfs_off_cache;
93
struct mutex cache_lock;
94
#endif
95
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;
110
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);
119
120
unsigned long read_flag_mask;
121
unsigned long write_flag_mask;
122
123
/* number of bits to (left) shift the reg value when formatting*/
124
int reg_shift;
125
int reg_stride;
126
int reg_stride_order;
127
128
bool defer_caching;
129
130
/* If set, will always write field to HW. */
131
bool force_write_field;
132
133
/* regcache specific members */
134
const struct regcache_ops *cache_ops;
135
enum regcache_type cache_type;
136
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;
145
146
/* if set, only the cache is modified not the HW */
147
bool cache_only;
148
/* if set, only the HW is modified not the cache */
149
bool cache_bypass;
150
/* if set, remember to free reg_defaults_raw */
151
bool cache_free;
152
153
struct reg_default *reg_defaults;
154
const void *reg_defaults_raw;
155
void *cache;
156
/* if set, the cache contains newer data than the HW */
157
bool cache_dirty;
158
/* if set, the HW registers are known to match map->reg_defaults */
159
bool no_sync_defaults;
160
161
struct reg_sequence *patch;
162
int patch_regs;
163
164
/* if set, the regmap core can sleep */
165
bool can_sleep;
166
167
/* if set, converts bulk read to single read */
168
bool use_single_read;
169
/* if set, converts bulk write to single write */
170
bool use_single_write;
171
/* if set, the device supports multi write mode */
172
bool can_multi_write;
173
174
/* if set, raw reads/writes are limited to this size */
175
size_t max_raw_read;
176
size_t max_raw_write;
177
178
struct rb_root range_tree;
179
void *selector_work_buf; /* Scratch buffer used for selector */
180
181
struct hwspinlock *hwlock;
182
};
183
184
struct regcache_ops {
185
const char *name;
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);
191
#endif
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);
196
};
197
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);
205
206
int _regmap_write(struct regmap *map, unsigned int reg,
207
unsigned int val);
208
209
struct regmap_range_node {
210
struct rb_node node;
211
const char *name;
212
struct regmap *map;
213
214
unsigned int range_min;
215
unsigned int range_max;
216
217
unsigned int selector_reg;
218
unsigned int selector_mask;
219
int selector_shift;
220
221
unsigned int window_start;
222
unsigned int window_len;
223
};
224
225
struct regmap_field {
226
struct regmap *regmap;
227
unsigned int mask;
228
/* lsb */
229
unsigned int shift;
230
unsigned int reg;
231
232
unsigned int id_size;
233
unsigned int id_offset;
234
};
235
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);
240
241
static inline void regmap_debugfs_disable(struct regmap *map)
242
{
243
map->debugfs_disable = true;
244
}
245
246
#else
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) { }
251
#endif
252
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,
264
unsigned int end);
265
bool regcache_reg_needs_sync(struct regmap *map, unsigned int reg,
266
unsigned int val);
267
268
static inline const void *regcache_get_val_addr(struct regmap *map,
269
const void *base,
270
unsigned int idx)
271
{
272
return base + (map->cache_word_size * idx);
273
}
274
275
unsigned int regcache_get_val(struct regmap *map, const void *base,
276
unsigned int idx);
277
void regcache_set_val(struct regmap *map, void *base, unsigned int idx,
278
unsigned int val);
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);
281
282
int _regmap_raw_write(struct regmap *map, unsigned int reg,
283
const void *val, size_t val_len, bool noinc);
284
285
void regmap_async_complete_cb(struct regmap_async *async, int ret);
286
287
enum regmap_endian regmap_get_val_endian(struct device *dev,
288
const struct regmap_bus *bus,
289
const struct regmap_config *config);
290
291
extern struct regcache_ops regcache_rbtree_ops;
292
extern struct regcache_ops regcache_maple_ops;
293
extern struct regcache_ops regcache_flat_ops;
294
295
static inline const char *regmap_name(const struct regmap *map)
296
{
297
if (map->dev)
298
return dev_name(map->dev);
299
300
return map->name;
301
}
302
303
static inline unsigned int regmap_get_offset(const struct regmap *map,
304
unsigned int index)
305
{
306
if (map->reg_stride_order >= 0)
307
return index << map->reg_stride_order;
308
else
309
return index * map->reg_stride;
310
}
311
312
static inline unsigned int regcache_get_index_by_order(const struct regmap *map,
313
unsigned int reg)
314
{
315
return reg >> map->reg_stride_order;
316
}
317
318
struct regmap_ram_data {
319
unsigned int *vals; /* Allocatd by caller */
320
bool *read;
321
bool *written;
322
enum regmap_endian reg_endian;
323
bool (*noinc_reg)(struct regmap_ram_data *data, unsigned int reg);
324
};
325
326
/*
327
* Create a test register map with data stored in RAM, not intended
328
* for practical use.
329
*/
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);
335
336
#define regmap_init_ram(dev, config, data) \
337
__regmap_lockdep_wrapper(__regmap_init_ram, #dev, dev, config, data)
338
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);
344
345
#define regmap_init_raw_ram(dev, config, data) \
346
__regmap_lockdep_wrapper(__regmap_init_raw_ram, #dev, dev, config, data)
347
348
#endif
349
350