Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
torvalds
GitHub Repository: torvalds/linux
Path: blob/master/drivers/base/regmap/internal.h
48985 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
int (*populate)(struct regmap *map);
190
#ifdef CONFIG_DEBUG_FS
191
void (*debugfs_init)(struct regmap *map);
192
#endif
193
int (*read)(struct regmap *map, unsigned int reg, unsigned int *value);
194
int (*write)(struct regmap *map, unsigned int reg, unsigned int value);
195
int (*sync)(struct regmap *map, unsigned int min, unsigned int max);
196
int (*drop)(struct regmap *map, unsigned int min, unsigned int max);
197
};
198
199
bool regmap_cached(struct regmap *map, unsigned int reg);
200
bool regmap_writeable(struct regmap *map, unsigned int reg);
201
bool regmap_readable(struct regmap *map, unsigned int reg);
202
bool regmap_volatile(struct regmap *map, unsigned int reg);
203
bool regmap_precious(struct regmap *map, unsigned int reg);
204
bool regmap_writeable_noinc(struct regmap *map, unsigned int reg);
205
bool regmap_readable_noinc(struct regmap *map, unsigned int reg);
206
207
int _regmap_write(struct regmap *map, unsigned int reg,
208
unsigned int val);
209
210
struct regmap_range_node {
211
struct rb_node node;
212
const char *name;
213
struct regmap *map;
214
215
unsigned int range_min;
216
unsigned int range_max;
217
218
unsigned int selector_reg;
219
unsigned int selector_mask;
220
int selector_shift;
221
222
unsigned int window_start;
223
unsigned int window_len;
224
};
225
226
struct regmap_field {
227
struct regmap *regmap;
228
unsigned int mask;
229
/* lsb */
230
unsigned int shift;
231
unsigned int reg;
232
233
unsigned int id_size;
234
unsigned int id_offset;
235
};
236
237
#ifdef CONFIG_DEBUG_FS
238
extern void regmap_debugfs_initcall(void);
239
extern void regmap_debugfs_init(struct regmap *map);
240
extern void regmap_debugfs_exit(struct regmap *map);
241
242
static inline void regmap_debugfs_disable(struct regmap *map)
243
{
244
map->debugfs_disable = true;
245
}
246
247
#else
248
static inline void regmap_debugfs_initcall(void) { }
249
static inline void regmap_debugfs_init(struct regmap *map) { }
250
static inline void regmap_debugfs_exit(struct regmap *map) { }
251
static inline void regmap_debugfs_disable(struct regmap *map) { }
252
#endif
253
254
/* regcache core declarations */
255
int regcache_init(struct regmap *map, const struct regmap_config *config);
256
void regcache_exit(struct regmap *map);
257
int regcache_read(struct regmap *map,
258
unsigned int reg, unsigned int *value);
259
int regcache_write(struct regmap *map,
260
unsigned int reg, unsigned int value);
261
int regcache_sync(struct regmap *map);
262
int regcache_sync_block(struct regmap *map, void *block,
263
unsigned long *cache_present,
264
unsigned int block_base, unsigned int start,
265
unsigned int end);
266
bool regcache_reg_needs_sync(struct regmap *map, unsigned int reg,
267
unsigned int val);
268
269
static inline const void *regcache_get_val_addr(struct regmap *map,
270
const void *base,
271
unsigned int idx)
272
{
273
return base + (map->cache_word_size * idx);
274
}
275
276
unsigned int regcache_get_val(struct regmap *map, const void *base,
277
unsigned int idx);
278
void regcache_set_val(struct regmap *map, void *base, unsigned int idx,
279
unsigned int val);
280
int regcache_lookup_reg(struct regmap *map, unsigned int reg);
281
int regcache_sync_val(struct regmap *map, unsigned int reg, unsigned int val);
282
283
int _regmap_raw_write(struct regmap *map, unsigned int reg,
284
const void *val, size_t val_len, bool noinc);
285
286
void regmap_async_complete_cb(struct regmap_async *async, int ret);
287
288
enum regmap_endian regmap_get_val_endian(struct device *dev,
289
const struct regmap_bus *bus,
290
const struct regmap_config *config);
291
292
extern struct regcache_ops regcache_flat_sparse_ops;
293
extern struct regcache_ops regcache_rbtree_ops;
294
extern struct regcache_ops regcache_maple_ops;
295
extern struct regcache_ops regcache_flat_ops;
296
297
static inline const char *regmap_name(const struct regmap *map)
298
{
299
if (map->dev)
300
return dev_name(map->dev);
301
302
return map->name;
303
}
304
305
static inline unsigned int regmap_get_offset(const struct regmap *map,
306
unsigned int index)
307
{
308
if (map->reg_stride_order >= 0)
309
return index << map->reg_stride_order;
310
else
311
return index * map->reg_stride;
312
}
313
314
static inline unsigned int regcache_get_index_by_order(const struct regmap *map,
315
unsigned int reg)
316
{
317
return reg >> map->reg_stride_order;
318
}
319
320
struct regmap_ram_data {
321
unsigned int *vals; /* Allocatd by caller */
322
bool *read;
323
bool *written;
324
enum regmap_endian reg_endian;
325
bool (*noinc_reg)(struct regmap_ram_data *data, unsigned int reg);
326
};
327
328
/*
329
* Create a test register map with data stored in RAM, not intended
330
* for practical use.
331
*/
332
struct regmap *__regmap_init_ram(struct device *dev,
333
const struct regmap_config *config,
334
struct regmap_ram_data *data,
335
struct lock_class_key *lock_key,
336
const char *lock_name);
337
338
#define regmap_init_ram(dev, config, data) \
339
__regmap_lockdep_wrapper(__regmap_init_ram, #dev, dev, config, data)
340
341
struct regmap *__regmap_init_raw_ram(struct device *dev,
342
const struct regmap_config *config,
343
struct regmap_ram_data *data,
344
struct lock_class_key *lock_key,
345
const char *lock_name);
346
347
#define regmap_init_raw_ram(dev, config, data) \
348
__regmap_lockdep_wrapper(__regmap_init_raw_ram, #dev, dev, config, data)
349
350
#endif
351
352