Merge remote-tracking branch 'regmap/topic/debugfs' into regmap-next
[firefly-linux-kernel-4.4.55.git] / drivers / base / regmap / internal.h
1 /*
2  * Register map access API internal header
3  *
4  * Copyright 2011 Wolfson Microelectronics plc
5  *
6  * Author: Mark Brown <broonie@opensource.wolfsonmicro.com>
7  *
8  * This program is free software; you can redistribute it and/or modify
9  * it under the terms of the GNU General Public License version 2 as
10  * published by the Free Software Foundation.
11  */
12
13 #ifndef _REGMAP_INTERNAL_H
14 #define _REGMAP_INTERNAL_H
15
16 #include <linux/regmap.h>
17 #include <linux/fs.h>
18 #include <linux/list.h>
19 #include <linux/wait.h>
20
21 struct regmap;
22 struct regcache_ops;
23
24 struct regmap_debugfs_off_cache {
25         struct list_head list;
26         off_t min;
27         off_t max;
28         unsigned int base_reg;
29         unsigned int max_reg;
30 };
31
32 struct regmap_format {
33         size_t buf_size;
34         size_t reg_bytes;
35         size_t pad_bytes;
36         size_t val_bytes;
37         void (*format_write)(struct regmap *map,
38                              unsigned int reg, unsigned int val);
39         void (*format_reg)(void *buf, unsigned int reg, unsigned int shift);
40         void (*format_val)(void *buf, unsigned int val, unsigned int shift);
41         unsigned int (*parse_val)(void *buf);
42 };
43
44 struct regmap_async {
45         struct list_head list;
46         struct work_struct cleanup;
47         struct regmap *map;
48         void *work_buf;
49 };
50
51 struct regmap {
52         struct mutex mutex;
53         spinlock_t spinlock;
54         regmap_lock lock;
55         regmap_unlock unlock;
56         void *lock_arg; /* This is passed to lock/unlock functions */
57
58         struct device *dev; /* Device we do I/O on */
59         void *work_buf;     /* Scratch buffer used to format I/O */
60         struct regmap_format format;  /* Buffer format */
61         const struct regmap_bus *bus;
62         void *bus_context;
63         const char *name;
64
65         spinlock_t async_lock;
66         wait_queue_head_t async_waitq;
67         struct list_head async_list;
68         int async_ret;
69
70 #ifdef CONFIG_DEBUG_FS
71         struct dentry *debugfs;
72         const char *debugfs_name;
73
74         unsigned int debugfs_reg_len;
75         unsigned int debugfs_val_len;
76         unsigned int debugfs_tot_len;
77
78         struct list_head debugfs_off_cache;
79 #endif
80
81         unsigned int max_register;
82         bool (*writeable_reg)(struct device *dev, unsigned int reg);
83         bool (*readable_reg)(struct device *dev, unsigned int reg);
84         bool (*volatile_reg)(struct device *dev, unsigned int reg);
85         bool (*precious_reg)(struct device *dev, unsigned int reg);
86         const struct regmap_access_table *wr_table;
87         const struct regmap_access_table *rd_table;
88         const struct regmap_access_table *volatile_table;
89         const struct regmap_access_table *precious_table;
90
91         int (*reg_read)(void *context, unsigned int reg, unsigned int *val);
92         int (*reg_write)(void *context, unsigned int reg, unsigned int val);
93
94         u8 read_flag_mask;
95         u8 write_flag_mask;
96
97         /* number of bits to (left) shift the reg value when formatting*/
98         int reg_shift;
99         int reg_stride;
100
101         /* regcache specific members */
102         const struct regcache_ops *cache_ops;
103         enum regcache_type cache_type;
104
105         /* number of bytes in reg_defaults_raw */
106         unsigned int cache_size_raw;
107         /* number of bytes per word in reg_defaults_raw */
108         unsigned int cache_word_size;
109         /* number of entries in reg_defaults */
110         unsigned int num_reg_defaults;
111         /* number of entries in reg_defaults_raw */
112         unsigned int num_reg_defaults_raw;
113
114         /* if set, only the cache is modified not the HW */
115         u32 cache_only;
116         /* if set, only the HW is modified not the cache */
117         u32 cache_bypass;
118         /* if set, remember to free reg_defaults_raw */
119         bool cache_free;
120
121         struct reg_default *reg_defaults;
122         const void *reg_defaults_raw;
123         void *cache;
124         u32 cache_dirty;
125
126         struct reg_default *patch;
127         int patch_regs;
128
129         /* if set, converts bulk rw to single rw */
130         bool use_single_rw;
131
132         struct rb_root range_tree;
133         void *selector_work_buf;        /* Scratch buffer used for selector */
134 };
135
136 struct regcache_ops {
137         const char *name;
138         enum regcache_type type;
139         int (*init)(struct regmap *map);
140         int (*exit)(struct regmap *map);
141         int (*read)(struct regmap *map, unsigned int reg, unsigned int *value);
142         int (*write)(struct regmap *map, unsigned int reg, unsigned int value);
143         int (*sync)(struct regmap *map, unsigned int min, unsigned int max);
144 };
145
146 bool regmap_writeable(struct regmap *map, unsigned int reg);
147 bool regmap_readable(struct regmap *map, unsigned int reg);
148 bool regmap_volatile(struct regmap *map, unsigned int reg);
149 bool regmap_precious(struct regmap *map, unsigned int reg);
150
151 int _regmap_write(struct regmap *map, unsigned int reg,
152                   unsigned int val);
153
154 struct regmap_range_node {
155         struct rb_node node;
156         const char *name;
157         struct regmap *map;
158
159         unsigned int range_min;
160         unsigned int range_max;
161
162         unsigned int selector_reg;
163         unsigned int selector_mask;
164         int selector_shift;
165
166         unsigned int window_start;
167         unsigned int window_len;
168 };
169
170 #ifdef CONFIG_DEBUG_FS
171 extern void regmap_debugfs_initcall(void);
172 extern void regmap_debugfs_init(struct regmap *map, const char *name);
173 extern void regmap_debugfs_exit(struct regmap *map);
174 #else
175 static inline void regmap_debugfs_initcall(void) { }
176 static inline void regmap_debugfs_init(struct regmap *map, const char *name) { }
177 static inline void regmap_debugfs_exit(struct regmap *map) { }
178 #endif
179
180 /* regcache core declarations */
181 int regcache_init(struct regmap *map, const struct regmap_config *config);
182 void regcache_exit(struct regmap *map);
183 int regcache_read(struct regmap *map,
184                        unsigned int reg, unsigned int *value);
185 int regcache_write(struct regmap *map,
186                         unsigned int reg, unsigned int value);
187 int regcache_sync(struct regmap *map);
188
189 unsigned int regcache_get_val(const void *base, unsigned int idx,
190                               unsigned int word_size);
191 bool regcache_set_val(void *base, unsigned int idx,
192                       unsigned int val, unsigned int word_size);
193 int regcache_lookup_reg(struct regmap *map, unsigned int reg);
194
195 void regmap_async_complete_cb(struct regmap_async *async, int ret);
196
197 extern struct regcache_ops regcache_rbtree_ops;
198 extern struct regcache_ops regcache_lzo_ops;
199
200 #endif