1#ifndef __LINUX_REGMAP_H
2#define __LINUX_REGMAP_H
3
4
5
6
7
8
9
10
11
12
13
14
15
16#include <linux/list.h>
17#include <linux/rbtree.h>
18#include <linux/err.h>
19#include <linux/bug.h>
20
21struct module;
22struct device;
23struct i2c_client;
24struct irq_domain;
25struct spi_device;
26struct spmi_device;
27struct regmap;
28struct regmap_range_cfg;
29struct regmap_field;
30
31
32enum regcache_type {
33 REGCACHE_NONE,
34 REGCACHE_RBTREE,
35 REGCACHE_COMPRESSED,
36 REGCACHE_FLAT,
37};
38
39
40
41
42
43
44
45
46
47struct reg_default {
48 unsigned int reg;
49 unsigned int def;
50};
51
52#ifdef CONFIG_REGMAP
53
54enum regmap_endian {
55
56 REGMAP_ENDIAN_DEFAULT = 0,
57 REGMAP_ENDIAN_BIG,
58 REGMAP_ENDIAN_LITTLE,
59 REGMAP_ENDIAN_NATIVE,
60};
61
62
63
64
65
66
67
68
69struct regmap_range {
70 unsigned int range_min;
71 unsigned int range_max;
72};
73
74#define regmap_reg_range(low, high) { .range_min = low, .range_max = high, }
75
76
77
78
79
80
81
82
83
84
85
86
87struct regmap_access_table {
88 const struct regmap_range *yes_ranges;
89 unsigned int n_yes_ranges;
90 const struct regmap_range *no_ranges;
91 unsigned int n_no_ranges;
92};
93
94typedef void (*regmap_lock)(void *);
95typedef void (*regmap_unlock)(void *);
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185struct regmap_config {
186 const char *name;
187
188 int reg_bits;
189 int reg_stride;
190 int pad_bits;
191 int val_bits;
192
193 bool (*writeable_reg)(struct device *dev, unsigned int reg);
194 bool (*readable_reg)(struct device *dev, unsigned int reg);
195 bool (*volatile_reg)(struct device *dev, unsigned int reg);
196 bool (*precious_reg)(struct device *dev, unsigned int reg);
197 regmap_lock lock;
198 regmap_unlock unlock;
199 void *lock_arg;
200
201 int (*reg_read)(void *context, unsigned int reg, unsigned int *val);
202 int (*reg_write)(void *context, unsigned int reg, unsigned int val);
203
204 bool fast_io;
205
206 unsigned int max_register;
207 const struct regmap_access_table *wr_table;
208 const struct regmap_access_table *rd_table;
209 const struct regmap_access_table *volatile_table;
210 const struct regmap_access_table *precious_table;
211 const struct reg_default *reg_defaults;
212 unsigned int num_reg_defaults;
213 enum regcache_type cache_type;
214 const void *reg_defaults_raw;
215 unsigned int num_reg_defaults_raw;
216
217 u8 read_flag_mask;
218 u8 write_flag_mask;
219
220 bool use_single_rw;
221 bool can_multi_write;
222
223 enum regmap_endian reg_format_endian;
224 enum regmap_endian val_format_endian;
225
226 const struct regmap_range_cfg *ranges;
227 unsigned int num_ranges;
228};
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248struct regmap_range_cfg {
249 const char *name;
250
251
252 unsigned int range_min;
253 unsigned int range_max;
254
255
256 unsigned int selector_reg;
257 unsigned int selector_mask;
258 int selector_shift;
259
260
261 unsigned int window_start;
262 unsigned int window_len;
263};
264
265struct regmap_async;
266
267typedef int (*regmap_hw_write)(void *context, const void *data,
268 size_t count);
269typedef int (*regmap_hw_gather_write)(void *context,
270 const void *reg, size_t reg_len,
271 const void *val, size_t val_len);
272typedef int (*regmap_hw_async_write)(void *context,
273 const void *reg, size_t reg_len,
274 const void *val, size_t val_len,
275 struct regmap_async *async);
276typedef int (*regmap_hw_read)(void *context,
277 const void *reg_buf, size_t reg_size,
278 void *val_buf, size_t val_size);
279typedef int (*regmap_hw_reg_read)(void *context, unsigned int reg,
280 unsigned int *val);
281typedef int (*regmap_hw_reg_write)(void *context, unsigned int reg,
282 unsigned int val);
283typedef struct regmap_async *(*regmap_hw_async_alloc)(void);
284typedef void (*regmap_hw_free_context)(void *context);
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311struct regmap_bus {
312 bool fast_io;
313 regmap_hw_write write;
314 regmap_hw_gather_write gather_write;
315 regmap_hw_async_write async_write;
316 regmap_hw_reg_write reg_write;
317 regmap_hw_read read;
318 regmap_hw_reg_read reg_read;
319 regmap_hw_free_context free_context;
320 regmap_hw_async_alloc async_alloc;
321 u8 read_flag_mask;
322 enum regmap_endian reg_format_endian_default;
323 enum regmap_endian val_format_endian_default;
324};
325
326struct regmap *regmap_init(struct device *dev,
327 const struct regmap_bus *bus,
328 void *bus_context,
329 const struct regmap_config *config);
330int regmap_attach_dev(struct device *dev, struct regmap *map,
331 const struct regmap_config *config);
332struct regmap *regmap_init_i2c(struct i2c_client *i2c,
333 const struct regmap_config *config);
334struct regmap *regmap_init_spi(struct spi_device *dev,
335 const struct regmap_config *config);
336struct regmap *regmap_init_spmi_base(struct spmi_device *dev,
337 const struct regmap_config *config);
338struct regmap *regmap_init_spmi_ext(struct spmi_device *dev,
339 const struct regmap_config *config);
340struct regmap *regmap_init_mmio_clk(struct device *dev, const char *clk_id,
341 void __iomem *regs,
342 const struct regmap_config *config);
343
344struct regmap *devm_regmap_init(struct device *dev,
345 const struct regmap_bus *bus,
346 void *bus_context,
347 const struct regmap_config *config);
348struct regmap *devm_regmap_init_i2c(struct i2c_client *i2c,
349 const struct regmap_config *config);
350struct regmap *devm_regmap_init_spi(struct spi_device *dev,
351 const struct regmap_config *config);
352struct regmap *devm_regmap_init_spmi_base(struct spmi_device *dev,
353 const struct regmap_config *config);
354struct regmap *devm_regmap_init_spmi_ext(struct spmi_device *dev,
355 const struct regmap_config *config);
356struct regmap *devm_regmap_init_mmio_clk(struct device *dev, const char *clk_id,
357 void __iomem *regs,
358 const struct regmap_config *config);
359
360
361
362
363
364
365
366
367
368
369
370static inline struct regmap *regmap_init_mmio(struct device *dev,
371 void __iomem *regs,
372 const struct regmap_config *config)
373{
374 return regmap_init_mmio_clk(dev, NULL, regs, config);
375}
376
377
378
379
380
381
382
383
384
385
386
387
388static inline struct regmap *devm_regmap_init_mmio(struct device *dev,
389 void __iomem *regs,
390 const struct regmap_config *config)
391{
392 return devm_regmap_init_mmio_clk(dev, NULL, regs, config);
393}
394
395void regmap_exit(struct regmap *map);
396int regmap_reinit_cache(struct regmap *map,
397 const struct regmap_config *config);
398struct regmap *dev_get_regmap(struct device *dev, const char *name);
399struct device *regmap_get_device(struct regmap *map);
400int regmap_write(struct regmap *map, unsigned int reg, unsigned int val);
401int regmap_write_async(struct regmap *map, unsigned int reg, unsigned int val);
402int regmap_raw_write(struct regmap *map, unsigned int reg,
403 const void *val, size_t val_len);
404int regmap_bulk_write(struct regmap *map, unsigned int reg, const void *val,
405 size_t val_count);
406int regmap_multi_reg_write(struct regmap *map, const struct reg_default *regs,
407 int num_regs);
408int regmap_multi_reg_write_bypassed(struct regmap *map,
409 const struct reg_default *regs,
410 int num_regs);
411int regmap_raw_write_async(struct regmap *map, unsigned int reg,
412 const void *val, size_t val_len);
413int regmap_read(struct regmap *map, unsigned int reg, unsigned int *val);
414int regmap_raw_read(struct regmap *map, unsigned int reg,
415 void *val, size_t val_len);
416int regmap_bulk_read(struct regmap *map, unsigned int reg, void *val,
417 size_t val_count);
418int regmap_update_bits(struct regmap *map, unsigned int reg,
419 unsigned int mask, unsigned int val);
420int regmap_update_bits_async(struct regmap *map, unsigned int reg,
421 unsigned int mask, unsigned int val);
422int regmap_update_bits_check(struct regmap *map, unsigned int reg,
423 unsigned int mask, unsigned int val,
424 bool *change);
425int regmap_update_bits_check_async(struct regmap *map, unsigned int reg,
426 unsigned int mask, unsigned int val,
427 bool *change);
428int regmap_get_val_bytes(struct regmap *map);
429int regmap_async_complete(struct regmap *map);
430bool regmap_can_raw_write(struct regmap *map);
431
432int regcache_sync(struct regmap *map);
433int regcache_sync_region(struct regmap *map, unsigned int min,
434 unsigned int max);
435int regcache_drop_region(struct regmap *map, unsigned int min,
436 unsigned int max);
437void regcache_cache_only(struct regmap *map, bool enable);
438void regcache_cache_bypass(struct regmap *map, bool enable);
439void regcache_mark_dirty(struct regmap *map);
440
441bool regmap_check_range_table(struct regmap *map, unsigned int reg,
442 const struct regmap_access_table *table);
443
444int regmap_register_patch(struct regmap *map, const struct reg_default *regs,
445 int num_regs);
446int regmap_parse_val(struct regmap *map, const void *buf,
447 unsigned int *val);
448
449static inline bool regmap_reg_in_range(unsigned int reg,
450 const struct regmap_range *range)
451{
452 return reg >= range->range_min && reg <= range->range_max;
453}
454
455bool regmap_reg_in_ranges(unsigned int reg,
456 const struct regmap_range *ranges,
457 unsigned int nranges);
458
459
460
461
462
463
464
465
466
467
468struct reg_field {
469 unsigned int reg;
470 unsigned int lsb;
471 unsigned int msb;
472 unsigned int id_size;
473 unsigned int id_offset;
474};
475
476#define REG_FIELD(_reg, _lsb, _msb) { \
477 .reg = _reg, \
478 .lsb = _lsb, \
479 .msb = _msb, \
480 }
481
482struct regmap_field *regmap_field_alloc(struct regmap *regmap,
483 struct reg_field reg_field);
484void regmap_field_free(struct regmap_field *field);
485
486struct regmap_field *devm_regmap_field_alloc(struct device *dev,
487 struct regmap *regmap, struct reg_field reg_field);
488void devm_regmap_field_free(struct device *dev, struct regmap_field *field);
489
490int regmap_field_read(struct regmap_field *field, unsigned int *val);
491int regmap_field_write(struct regmap_field *field, unsigned int val);
492int regmap_field_update_bits(struct regmap_field *field,
493 unsigned int mask, unsigned int val);
494
495int regmap_fields_write(struct regmap_field *field, unsigned int id,
496 unsigned int val);
497int regmap_fields_read(struct regmap_field *field, unsigned int id,
498 unsigned int *val);
499int regmap_fields_update_bits(struct regmap_field *field, unsigned int id,
500 unsigned int mask, unsigned int val);
501
502
503
504
505
506
507
508struct regmap_irq {
509 unsigned int reg_offset;
510 unsigned int mask;
511};
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537struct regmap_irq_chip {
538 const char *name;
539
540 unsigned int status_base;
541 unsigned int mask_base;
542 unsigned int ack_base;
543 unsigned int wake_base;
544 unsigned int irq_reg_stride;
545 bool init_ack_masked:1;
546 bool mask_invert:1;
547 bool use_ack:1;
548 bool wake_invert:1;
549 bool runtime_pm:1;
550
551 int num_regs;
552
553 const struct regmap_irq *irqs;
554 int num_irqs;
555};
556
557struct regmap_irq_chip_data;
558
559int regmap_add_irq_chip(struct regmap *map, int irq, int irq_flags,
560 int irq_base, const struct regmap_irq_chip *chip,
561 struct regmap_irq_chip_data **data);
562void regmap_del_irq_chip(int irq, struct regmap_irq_chip_data *data);
563int regmap_irq_chip_get_base(struct regmap_irq_chip_data *data);
564int regmap_irq_get_virq(struct regmap_irq_chip_data *data, int irq);
565struct irq_domain *regmap_irq_get_domain(struct regmap_irq_chip_data *data);
566
567#else
568
569
570
571
572
573
574
575
576static inline int regmap_write(struct regmap *map, unsigned int reg,
577 unsigned int val)
578{
579 WARN_ONCE(1, "regmap API is disabled");
580 return -EINVAL;
581}
582
583static inline int regmap_write_async(struct regmap *map, unsigned int reg,
584 unsigned int val)
585{
586 WARN_ONCE(1, "regmap API is disabled");
587 return -EINVAL;
588}
589
590static inline int regmap_raw_write(struct regmap *map, unsigned int reg,
591 const void *val, size_t val_len)
592{
593 WARN_ONCE(1, "regmap API is disabled");
594 return -EINVAL;
595}
596
597static inline int regmap_raw_write_async(struct regmap *map, unsigned int reg,
598 const void *val, size_t val_len)
599{
600 WARN_ONCE(1, "regmap API is disabled");
601 return -EINVAL;
602}
603
604static inline int regmap_bulk_write(struct regmap *map, unsigned int reg,
605 const void *val, size_t val_count)
606{
607 WARN_ONCE(1, "regmap API is disabled");
608 return -EINVAL;
609}
610
611static inline int regmap_read(struct regmap *map, unsigned int reg,
612 unsigned int *val)
613{
614 WARN_ONCE(1, "regmap API is disabled");
615 return -EINVAL;
616}
617
618static inline int regmap_raw_read(struct regmap *map, unsigned int reg,
619 void *val, size_t val_len)
620{
621 WARN_ONCE(1, "regmap API is disabled");
622 return -EINVAL;
623}
624
625static inline int regmap_bulk_read(struct regmap *map, unsigned int reg,
626 void *val, size_t val_count)
627{
628 WARN_ONCE(1, "regmap API is disabled");
629 return -EINVAL;
630}
631
632static inline int regmap_update_bits(struct regmap *map, unsigned int reg,
633 unsigned int mask, unsigned int val)
634{
635 WARN_ONCE(1, "regmap API is disabled");
636 return -EINVAL;
637}
638
639static inline int regmap_update_bits_async(struct regmap *map,
640 unsigned int reg,
641 unsigned int mask, unsigned int val)
642{
643 WARN_ONCE(1, "regmap API is disabled");
644 return -EINVAL;
645}
646
647static inline int regmap_update_bits_check(struct regmap *map,
648 unsigned int reg,
649 unsigned int mask, unsigned int val,
650 bool *change)
651{
652 WARN_ONCE(1, "regmap API is disabled");
653 return -EINVAL;
654}
655
656static inline int regmap_update_bits_check_async(struct regmap *map,
657 unsigned int reg,
658 unsigned int mask,
659 unsigned int val,
660 bool *change)
661{
662 WARN_ONCE(1, "regmap API is disabled");
663 return -EINVAL;
664}
665
666static inline int regmap_get_val_bytes(struct regmap *map)
667{
668 WARN_ONCE(1, "regmap API is disabled");
669 return -EINVAL;
670}
671
672static inline int regcache_sync(struct regmap *map)
673{
674 WARN_ONCE(1, "regmap API is disabled");
675 return -EINVAL;
676}
677
678static inline int regcache_sync_region(struct regmap *map, unsigned int min,
679 unsigned int max)
680{
681 WARN_ONCE(1, "regmap API is disabled");
682 return -EINVAL;
683}
684
685static inline int regcache_drop_region(struct regmap *map, unsigned int min,
686 unsigned int max)
687{
688 WARN_ONCE(1, "regmap API is disabled");
689 return -EINVAL;
690}
691
692static inline void regcache_cache_only(struct regmap *map, bool enable)
693{
694 WARN_ONCE(1, "regmap API is disabled");
695}
696
697static inline void regcache_cache_bypass(struct regmap *map, bool enable)
698{
699 WARN_ONCE(1, "regmap API is disabled");
700}
701
702static inline void regcache_mark_dirty(struct regmap *map)
703{
704 WARN_ONCE(1, "regmap API is disabled");
705}
706
707static inline void regmap_async_complete(struct regmap *map)
708{
709 WARN_ONCE(1, "regmap API is disabled");
710}
711
712static inline int regmap_register_patch(struct regmap *map,
713 const struct reg_default *regs,
714 int num_regs)
715{
716 WARN_ONCE(1, "regmap API is disabled");
717 return -EINVAL;
718}
719
720static inline int regmap_parse_val(struct regmap *map, const void *buf,
721 unsigned int *val)
722{
723 WARN_ONCE(1, "regmap API is disabled");
724 return -EINVAL;
725}
726
727static inline struct regmap *dev_get_regmap(struct device *dev,
728 const char *name)
729{
730 return NULL;
731}
732
733static inline struct device *regmap_get_device(struct regmap *map)
734{
735 WARN_ONCE(1, "regmap API is disabled");
736 return NULL;
737}
738
739#endif
740
741#endif
742