Blame view

include/linux/regmap.h 40.6 KB
b83a313bf   Mark Brown   regmap: Add gener...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
  #ifndef __LINUX_REGMAP_H
  #define __LINUX_REGMAP_H
  
  /*
   * Register map access API
   *
   * Copyright 2011 Wolfson Microelectronics plc
   *
   * Author: Mark Brown <broonie@opensource.wolfsonmicro.com>
   *
   * This program is free software; you can redistribute it and/or modify
   * it under the terms of the GNU General Public License version 2 as
   * published by the Free Software Foundation.
   */
b83a313bf   Mark Brown   regmap: Add gener...
15
  #include <linux/list.h>
6863ca622   Krystian Garbaciak   regmap: Add suppo...
16
  #include <linux/rbtree.h>
adf08d481   Masahiro Yamada   regmap: include <...
17
  #include <linux/delay.h>
49ccc142f   Mateusz Krawczuk   regmap: Add missi...
18
  #include <linux/err.h>
3f0fa9a80   Kevin Hilman   regmap: Add anoth...
19
  #include <linux/bug.h>
3cfe7a74d   Nicolas Boichat   regmap: Use diffe...
20
  #include <linux/lockdep.h>
b83a313bf   Mark Brown   regmap: Add gener...
21

de4772542   Paul Gortmaker   include: replace ...
22
  struct module;
313162d0b   Paul Gortmaker   device.h: audit a...
23
  struct device;
9943fa300   Mark Brown   regmap: Add I2C b...
24
  struct i2c_client;
90f790d2d   Mark Brown   regmap: irq: Allo...
25
  struct irq_domain;
a676f0830   Mark Brown   regmap: Add SPI b...
26
  struct spi_device;
a01779f89   Josh Cartwright   regmap: add SPMI ...
27
  struct spmi_device;
b83d2ff01   Mark Brown   regmap: Rejig str...
28
  struct regmap;
6863ca622   Krystian Garbaciak   regmap: Add suppo...
29
  struct regmap_range_cfg;
672522878   Srinivas Kandagatla   regmap: Add regma...
30
  struct regmap_field;
22853223d   Mark Brown   regmap: ac97: Add...
31
  struct snd_ac97;
9943fa300   Mark Brown   regmap: Add I2C b...
32

9fabe24e9   Dimitris Papastamos   regmap: Introduce...
33
34
35
  /* An enum of all the supported cache types */
  enum regcache_type {
  	REGCACHE_NONE,
28644c809   Dimitris Papastamos   regmap: Add the r...
36
  	REGCACHE_RBTREE,
2ac902ce1   Mark Brown   regmap: flat: Add...
37
38
  	REGCACHE_COMPRESSED,
  	REGCACHE_FLAT,
9fabe24e9   Dimitris Papastamos   regmap: Introduce...
39
  };
dd898b209   Mark Brown   regmap: Add kerne...
40
  /**
2cf8e2dfd   Charles Keepax   regmap: Fixup the...
41
   * struct reg_default - Default value for a register.
bd20eb541   Mark Brown   regmap: Allow dri...
42
43
44
   *
   * @reg: Register address.
   * @def: Register default value.
2cf8e2dfd   Charles Keepax   regmap: Fixup the...
45
46
47
   *
   * We use an array of structs rather than a simple array as many modern devices
   * have very sparse register maps.
bd20eb541   Mark Brown   regmap: Allow dri...
48
49
50
51
52
   */
  struct reg_default {
  	unsigned int reg;
  	unsigned int def;
  };
8019ff6cf   Nariman Poushin   regmap: Use reg_s...
53
  /**
2cf8e2dfd   Charles Keepax   regmap: Fixup the...
54
   * struct reg_sequence - An individual write from a sequence of writes.
8019ff6cf   Nariman Poushin   regmap: Use reg_s...
55
56
57
   *
   * @reg: Register address.
   * @def: Register value.
2de9d6006   Nariman Poushin   regmap: Apply opt...
58
   * @delay_us: Delay to be applied after the register write in microseconds
2cf8e2dfd   Charles Keepax   regmap: Fixup the...
59
60
61
   *
   * Register/value pairs for sequences of writes with an optional delay in
   * microseconds to be applied after each write.
8019ff6cf   Nariman Poushin   regmap: Use reg_s...
62
63
64
65
   */
  struct reg_sequence {
  	unsigned int reg;
  	unsigned int def;
2de9d6006   Nariman Poushin   regmap: Apply opt...
66
  	unsigned int delay_us;
8019ff6cf   Nariman Poushin   regmap: Use reg_s...
67
  };
ca7a94464   Kuninori Morimoto   regmap: merge reg...
68
69
  #define	regmap_update_bits(map, reg, mask, val) \
  	regmap_update_bits_base(map, reg, mask, val, NULL, false, false)
30ed9cb7a   Kuninori Morimoto   regmap: merge reg...
70
71
  #define	regmap_update_bits_async(map, reg, mask, val)\
  	regmap_update_bits_base(map, reg, mask, val, NULL, true, false)
98c2dc486   Kuninori Morimoto   regmap: merge reg...
72
73
  #define	regmap_update_bits_check(map, reg, mask, val, change)\
  	regmap_update_bits_base(map, reg, mask, val, change, false, false)
89d8d4b83   Kuninori Morimoto   regmap: merge reg...
74
75
  #define	regmap_update_bits_check_async(map, reg, mask, val, change)\
  	regmap_update_bits_base(map, reg, mask, val, change, true, false)
ca7a94464   Kuninori Morimoto   regmap: merge reg...
76

b821957a5   Kuninori Morimoto   regmap: replace r...
77
78
  #define	regmap_write_bits(map, reg, mask, val) \
  	regmap_update_bits_base(map, reg, mask, val, NULL, false, true)
3674124b3   Kuninori Morimoto   regmap: merge reg...
79
80
  #define	regmap_field_write(field, val) \
  	regmap_field_update_bits_base(field, ~0, val, NULL, false, false)
489061bba   Kuninori Morimoto   regmap: add regma...
81
82
  #define	regmap_field_force_write(field, val) \
  	regmap_field_update_bits_base(field, ~0, val, NULL, false, true)
721ed64dd   Kuninori Morimoto   regmap: merge reg...
83
84
  #define	regmap_field_update_bits(field, mask, val)\
  	regmap_field_update_bits_base(field, mask, val, NULL, false, false)
489061bba   Kuninori Morimoto   regmap: add regma...
85
86
  #define	regmap_field_force_update_bits(field, mask, val) \
  	regmap_field_update_bits_base(field, mask, val, NULL, false, true)
3674124b3   Kuninori Morimoto   regmap: merge reg...
87

bbf2c46f4   Kuninori Morimoto   regmap: merge reg...
88
89
  #define	regmap_fields_write(field, id, val) \
  	regmap_fields_update_bits_base(field, id, ~0, val, NULL, false, false)
e6ef243fa   Kuninori Morimoto   regmap: add regma...
90
91
  #define	regmap_fields_force_write(field, id, val) \
  	regmap_fields_update_bits_base(field, id, ~0, val, NULL, false, true)
481386091   Kuninori Morimoto   regmap: merge reg...
92
93
  #define	regmap_fields_update_bits(field, id, mask, val)\
  	regmap_fields_update_bits_base(field, id, mask, val, NULL, false, false)
e6ef243fa   Kuninori Morimoto   regmap: add regma...
94
95
  #define	regmap_fields_force_update_bits(field, id, mask, val) \
  	regmap_fields_update_bits_base(field, id, mask, val, NULL, false, true)
bbf2c46f4   Kuninori Morimoto   regmap: merge reg...
96

08188ba88   Philipp Zabel   regmap: add iopol...
97
98
  /**
   * regmap_read_poll_timeout - Poll until a condition is met or a timeout occurs
2cf8e2dfd   Charles Keepax   regmap: Fixup the...
99
   *
08188ba88   Philipp Zabel   regmap: add iopol...
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
   * @map: Regmap to read from
   * @addr: Address to poll
   * @val: Unsigned integer variable to read the value into
   * @cond: Break condition (usually involving @val)
   * @sleep_us: Maximum time to sleep between reads in us (0
   *            tight-loops).  Should be less than ~20ms since usleep_range
   *            is used (see Documentation/timers/timers-howto.txt).
   * @timeout_us: Timeout in us, 0 means never timeout
   *
   * Returns 0 on success and -ETIMEDOUT upon a timeout or the regmap_read
   * error return value in case of a error read. In the two former cases,
   * the last read value at @addr is stored in @val. Must not be called
   * from atomic context if sleep_us or timeout_us are used.
   *
   * This is modelled after the readx_poll_timeout macros in linux/iopoll.h.
   */
  #define regmap_read_poll_timeout(map, addr, val, cond, sleep_us, timeout_us) \
  ({ \
  	ktime_t timeout = ktime_add_us(ktime_get(), timeout_us); \
72193a953   Charles Keepax   regmap: Rename re...
119
  	int pollret; \
08188ba88   Philipp Zabel   regmap: add iopol...
120
121
  	might_sleep_if(sleep_us); \
  	for (;;) { \
72193a953   Charles Keepax   regmap: Rename re...
122
123
  		pollret = regmap_read((map), (addr), &(val)); \
  		if (pollret) \
08188ba88   Philipp Zabel   regmap: add iopol...
124
125
126
127
  			break; \
  		if (cond) \
  			break; \
  		if (timeout_us && ktime_compare(ktime_get(), timeout) > 0) { \
72193a953   Charles Keepax   regmap: Rename re...
128
  			pollret = regmap_read((map), (addr), &(val)); \
08188ba88   Philipp Zabel   regmap: add iopol...
129
130
131
132
133
  			break; \
  		} \
  		if (sleep_us) \
  			usleep_range((sleep_us >> 2) + 1, sleep_us); \
  	} \
72193a953   Charles Keepax   regmap: Rename re...
134
  	pollret ?: ((cond) ? 0 : -ETIMEDOUT); \
08188ba88   Philipp Zabel   regmap: add iopol...
135
  })
b83d2ff01   Mark Brown   regmap: Rejig str...
136
  #ifdef CONFIG_REGMAP
141eba2e0   Stephen Warren   regmap: allow bus...
137
138
139
140
141
142
143
  enum regmap_endian {
  	/* Unspecified -> 0 -> Backwards compatible default */
  	REGMAP_ENDIAN_DEFAULT = 0,
  	REGMAP_ENDIAN_BIG,
  	REGMAP_ENDIAN_LITTLE,
  	REGMAP_ENDIAN_NATIVE,
  };
76aad392f   Davide Ciminaghi   regmap: introduce...
144
  /**
2cf8e2dfd   Charles Keepax   regmap: Fixup the...
145
146
   * struct regmap_range - A register range, used for access related checks
   *                       (readable/writeable/volatile/precious checks)
76aad392f   Davide Ciminaghi   regmap: introduce...
147
148
149
150
151
152
153
154
   *
   * @range_min: address of first register
   * @range_max: address of last register
   */
  struct regmap_range {
  	unsigned int range_min;
  	unsigned int range_max;
  };
6112fe60a   Laxman Dewangan   regmap: add helpe...
155
  #define regmap_reg_range(low, high) { .range_min = low, .range_max = high, }
2cf8e2dfd   Charles Keepax   regmap: Fixup the...
156
157
  /**
   * struct regmap_access_table - A table of register ranges for access checks
76aad392f   Davide Ciminaghi   regmap: introduce...
158
159
160
161
162
   *
   * @yes_ranges : pointer to an array of regmap ranges used as "yes ranges"
   * @n_yes_ranges: size of the above array
   * @no_ranges: pointer to an array of regmap ranges used as "no ranges"
   * @n_no_ranges: size of the above array
2cf8e2dfd   Charles Keepax   regmap: Fixup the...
163
164
165
166
167
   *
   * A table of ranges including some yes ranges and some no ranges.
   * If a register belongs to a no_range, the corresponding check function
   * will return false. If a register belongs to a yes range, the corresponding
   * check function will return true. "no_ranges" are searched first.
76aad392f   Davide Ciminaghi   regmap: introduce...
168
169
170
171
172
173
174
   */
  struct regmap_access_table {
  	const struct regmap_range *yes_ranges;
  	unsigned int n_yes_ranges;
  	const struct regmap_range *no_ranges;
  	unsigned int n_no_ranges;
  };
0d4529c53   Davide Ciminaghi   regmap: make lock...
175
176
  typedef void (*regmap_lock)(void *);
  typedef void (*regmap_unlock)(void *);
bd20eb541   Mark Brown   regmap: Allow dri...
177
  /**
2cf8e2dfd   Charles Keepax   regmap: Fixup the...
178
   * struct regmap_config - Configuration for the register map of a device.
dd898b209   Mark Brown   regmap: Add kerne...
179
   *
d3c242e1f   Stephen Warren   regmap: allow reg...
180
181
182
   * @name: Optional name of the regmap. Useful when a device has multiple
   *        register regions.
   *
dd898b209   Mark Brown   regmap: Add kerne...
183
   * @reg_bits: Number of bits in a register address, mandatory.
f01ee60ff   Stephen Warren   regmap: implement...
184
185
186
   * @reg_stride: The register address stride. Valid register addresses are a
   *              multiple of this value. If set to 0, a value of 1 will be
   *              used.
82159ba8e   Mark Brown   regmap: Add suppo...
187
   * @pad_bits: Number of bits of padding between register and value.
dd898b209   Mark Brown   regmap: Add kerne...
188
   * @val_bits: Number of bits in a register value, mandatory.
2e2ae66df   Mark Brown   regmap: Allow dev...
189
   *
3566cc9d9   Mark Brown   regmap: Fix kerne...
190
   * @writeable_reg: Optional callback returning true if the register
76aad392f   Davide Ciminaghi   regmap: introduce...
191
192
193
194
   *		   can be written to. If this field is NULL but wr_table
   *		   (see below) is not, the check is performed on such table
   *                 (a register is writeable if it belongs to one of the ranges
   *                  specified by wr_table).
3566cc9d9   Mark Brown   regmap: Fix kerne...
195
   * @readable_reg: Optional callback returning true if the register
76aad392f   Davide Ciminaghi   regmap: introduce...
196
197
198
199
   *		  can be read from. If this field is NULL but rd_table
   *		   (see below) is not, the check is performed on such table
   *                 (a register is readable if it belongs to one of the ranges
   *                  specified by rd_table).
3566cc9d9   Mark Brown   regmap: Fix kerne...
200
   * @volatile_reg: Optional callback returning true if the register
76aad392f   Davide Ciminaghi   regmap: introduce...
201
202
203
204
   *		  value can't be cached. If this field is NULL but
   *		  volatile_table (see below) is not, the check is performed on
   *                such table (a register is volatile if it belongs to one of
   *                the ranges specified by volatile_table).
bdc39644b   Laszlo Papp   regmap: fix a cou...
205
   * @precious_reg: Optional callback returning true if the register
76aad392f   Davide Ciminaghi   regmap: introduce...
206
   *		  should not be read outside of a call from the driver
bdc39644b   Laszlo Papp   regmap: fix a cou...
207
   *		  (e.g., a clear on read interrupt status register). If this
76aad392f   Davide Ciminaghi   regmap: introduce...
208
209
210
211
212
213
214
215
216
   *                field is NULL but precious_table (see below) is not, the
   *                check is performed on such table (a register is precious if
   *                it belongs to one of the ranges specified by precious_table).
   * @lock:	  Optional lock callback (overrides regmap's default lock
   *		  function, based on spinlock or mutex).
   * @unlock:	  As above for unlocking.
   * @lock_arg:	  this field is passed as the only argument of lock/unlock
   *		  functions (ignored in case regular lock/unlock functions
   *		  are not overridden).
d2a5884a6   Andrey Smirnov   regmap: Add "no-b...
217
218
   * @reg_read:	  Optional callback that if filled will be used to perform
   *           	  all the reads from the registers. Should only be provided for
bdc39644b   Laszlo Papp   regmap: fix a cou...
219
220
221
   *		  devices whose read operation cannot be represented as a simple
   *		  read operation on a bus such as SPI, I2C, etc. Most of the
   *		  devices do not need this.
d2a5884a6   Andrey Smirnov   regmap: Add "no-b...
222
223
224
225
226
227
228
   * @reg_write:	  Same as above for writing.
   * @fast_io:	  Register IO is fast. Use a spinlock instead of a mutex
   *	     	  to perform locking. This field is ignored if custom lock/unlock
   *	     	  functions are used (see fields lock/unlock of struct regmap_config).
   *		  This field is a duplicate of a similar file in
   *		  'struct regmap_bus' and serves exact same purpose.
   *		   Use it only for "no-bus" cases.
b429fab44   Stefan Agner   regmap: clairify ...
229
   * @max_register: Optional, specifies the maximum valid register address.
76aad392f   Davide Ciminaghi   regmap: introduce...
230
231
232
233
234
   * @wr_table:     Optional, points to a struct regmap_access_table specifying
   *                valid ranges for write access.
   * @rd_table:     As above, for read access.
   * @volatile_table: As above, for volatile registers.
   * @precious_table: As above, for precious registers.
bd20eb541   Mark Brown   regmap: Allow dri...
235
236
237
   * @reg_defaults: Power on reset values for registers (for use with
   *                register cache support).
   * @num_reg_defaults: Number of elements in reg_defaults.
6f306441e   Lars-Peter Clausen   regmap: Add suppo...
238
   *
f50e38c99   Tony Lindgren   regmap: Allow lon...
239
   * @read_flag_mask: Mask to be set in the top bytes of the register when doing
6f306441e   Lars-Peter Clausen   regmap: Add suppo...
240
   *                  a read.
f50e38c99   Tony Lindgren   regmap: Allow lon...
241
   * @write_flag_mask: Mask to be set in the top bytes of the register when doing
6f306441e   Lars-Peter Clausen   regmap: Add suppo...
242
243
   *                   a write. If both read_flag_mask and write_flag_mask are
   *                   empty the regmap_bus default masks are used.
2e33caf16   Ashish Jangam   regmap: Converts ...
244
245
246
   * @use_single_rw: If set, converts the bulk read and write operations into
   *		    a series of single read and write operations. This is useful
   *		    for device that does not support bulk read and write.
e894c3f46   Opensource [Anthony Olech]   regmap: Implement...
247
248
249
   * @can_multi_write: If set, the device supports the multi write mode of bulk
   *                   write operations, if clear multi write requests will be
   *                   split into individual write operations
9fabe24e9   Dimitris Papastamos   regmap: Introduce...
250
251
252
253
254
   *
   * @cache_type: The actual cache type.
   * @reg_defaults_raw: Power on reset values for registers (for use with
   *                    register cache support).
   * @num_reg_defaults_raw: Number of elements in reg_defaults_raw.
141eba2e0   Stephen Warren   regmap: allow bus...
255
256
257
258
259
260
   * @reg_format_endian: Endianness for formatted register addresses. If this is
   *                     DEFAULT, the @reg_format_endian_default value from the
   *                     regmap bus is used.
   * @val_format_endian: Endianness for formatted register values. If this is
   *                     DEFAULT, the @reg_format_endian_default value from the
   *                     regmap bus is used.
6863ca622   Krystian Garbaciak   regmap: Add suppo...
261
262
263
   *
   * @ranges: Array of configuration entries for virtual address ranges.
   * @num_ranges: Number of range configuration entries.
dd898b209   Mark Brown   regmap: Add kerne...
264
   */
b83a313bf   Mark Brown   regmap: Add gener...
265
  struct regmap_config {
d3c242e1f   Stephen Warren   regmap: allow reg...
266
  	const char *name;
b83a313bf   Mark Brown   regmap: Add gener...
267
  	int reg_bits;
f01ee60ff   Stephen Warren   regmap: implement...
268
  	int reg_stride;
82159ba8e   Mark Brown   regmap: Add suppo...
269
  	int pad_bits;
b83a313bf   Mark Brown   regmap: Add gener...
270
  	int val_bits;
2e2ae66df   Mark Brown   regmap: Allow dev...
271

2e2ae66df   Mark Brown   regmap: Allow dev...
272
273
274
  	bool (*writeable_reg)(struct device *dev, unsigned int reg);
  	bool (*readable_reg)(struct device *dev, unsigned int reg);
  	bool (*volatile_reg)(struct device *dev, unsigned int reg);
18694886b   Mark Brown   regmap: Add preci...
275
  	bool (*precious_reg)(struct device *dev, unsigned int reg);
0d4529c53   Davide Ciminaghi   regmap: make lock...
276
277
278
  	regmap_lock lock;
  	regmap_unlock unlock;
  	void *lock_arg;
bd20eb541   Mark Brown   regmap: Allow dri...
279

d2a5884a6   Andrey Smirnov   regmap: Add "no-b...
280
281
282
283
  	int (*reg_read)(void *context, unsigned int reg, unsigned int *val);
  	int (*reg_write)(void *context, unsigned int reg, unsigned int val);
  
  	bool fast_io;
bd20eb541   Mark Brown   regmap: Allow dri...
284
  	unsigned int max_register;
76aad392f   Davide Ciminaghi   regmap: introduce...
285
286
287
288
  	const struct regmap_access_table *wr_table;
  	const struct regmap_access_table *rd_table;
  	const struct regmap_access_table *volatile_table;
  	const struct regmap_access_table *precious_table;
720e4616e   Lars-Peter Clausen   regmap: Make reg_...
289
  	const struct reg_default *reg_defaults;
9fabe24e9   Dimitris Papastamos   regmap: Introduce...
290
291
292
293
  	unsigned int num_reg_defaults;
  	enum regcache_type cache_type;
  	const void *reg_defaults_raw;
  	unsigned int num_reg_defaults_raw;
6f306441e   Lars-Peter Clausen   regmap: Add suppo...
294

f50e38c99   Tony Lindgren   regmap: Allow lon...
295
296
  	unsigned long read_flag_mask;
  	unsigned long write_flag_mask;
2e33caf16   Ashish Jangam   regmap: Converts ...
297
298
  
  	bool use_single_rw;
e894c3f46   Opensource [Anthony Olech]   regmap: Implement...
299
  	bool can_multi_write;
141eba2e0   Stephen Warren   regmap: allow bus...
300
301
302
  
  	enum regmap_endian reg_format_endian;
  	enum regmap_endian val_format_endian;
38e23194e   Mark Brown   Merge branches 'r...
303

6863ca622   Krystian Garbaciak   regmap: Add suppo...
304
  	const struct regmap_range_cfg *ranges;
e3549cd01   Mark Brown   regmap: Rename n_...
305
  	unsigned int num_ranges;
6863ca622   Krystian Garbaciak   regmap: Add suppo...
306
307
308
  };
  
  /**
2cf8e2dfd   Charles Keepax   regmap: Fixup the...
309
310
   * struct regmap_range_cfg - Configuration for indirectly accessed or paged
   *                           registers.
6863ca622   Krystian Garbaciak   regmap: Add suppo...
311
   *
d058bb496   Mark Brown   regmap: Allow ran...
312
313
   * @name: Descriptive name for diagnostics
   *
6863ca622   Krystian Garbaciak   regmap: Add suppo...
314
315
316
   * @range_min: Address of the lowest register address in virtual range.
   * @range_max: Address of the highest register in virtual range.
   *
2cf8e2dfd   Charles Keepax   regmap: Fixup the...
317
318
319
   * @selector_reg: Register with selector field.
   * @selector_mask: Bit shift for selector value.
   * @selector_shift: Bit mask for selector value.
6863ca622   Krystian Garbaciak   regmap: Add suppo...
320
321
322
   *
   * @window_start: Address of first (lowest) register in data window.
   * @window_len: Number of registers in data window.
2cf8e2dfd   Charles Keepax   regmap: Fixup the...
323
324
325
326
   *
   * Registers, mapped to this virtual range, are accessed in two steps:
   *     1. page selector register update;
   *     2. access through data window registers.
6863ca622   Krystian Garbaciak   regmap: Add suppo...
327
328
   */
  struct regmap_range_cfg {
d058bb496   Mark Brown   regmap: Allow ran...
329
  	const char *name;
6863ca622   Krystian Garbaciak   regmap: Add suppo...
330
331
332
333
334
335
336
337
338
339
340
341
  	/* Registers of virtual address range */
  	unsigned int range_min;
  	unsigned int range_max;
  
  	/* Page selector for indirect addressing */
  	unsigned int selector_reg;
  	unsigned int selector_mask;
  	int selector_shift;
  
  	/* Data window (per each page) */
  	unsigned int window_start;
  	unsigned int window_len;
b83a313bf   Mark Brown   regmap: Add gener...
342
  };
0d509f2b1   Mark Brown   regmap: Add async...
343
  struct regmap_async;
0135bbcc7   Stephen Warren   regmap: introduce...
344
  typedef int (*regmap_hw_write)(void *context, const void *data,
b83a313bf   Mark Brown   regmap: Add gener...
345
  			       size_t count);
0135bbcc7   Stephen Warren   regmap: introduce...
346
  typedef int (*regmap_hw_gather_write)(void *context,
b83a313bf   Mark Brown   regmap: Add gener...
347
348
  				      const void *reg, size_t reg_len,
  				      const void *val, size_t val_len);
0d509f2b1   Mark Brown   regmap: Add async...
349
350
351
352
  typedef int (*regmap_hw_async_write)(void *context,
  				     const void *reg, size_t reg_len,
  				     const void *val, size_t val_len,
  				     struct regmap_async *async);
0135bbcc7   Stephen Warren   regmap: introduce...
353
  typedef int (*regmap_hw_read)(void *context,
b83a313bf   Mark Brown   regmap: Add gener...
354
355
  			      const void *reg_buf, size_t reg_size,
  			      void *val_buf, size_t val_size);
3ac170376   Boris BREZILLON   regmap: add reg_r...
356
357
358
359
  typedef int (*regmap_hw_reg_read)(void *context, unsigned int reg,
  				  unsigned int *val);
  typedef int (*regmap_hw_reg_write)(void *context, unsigned int reg,
  				   unsigned int val);
77792b114   Jon Ringle   regmap: Allow ins...
360
361
  typedef int (*regmap_hw_reg_update_bits)(void *context, unsigned int reg,
  					 unsigned int mask, unsigned int val);
0d509f2b1   Mark Brown   regmap: Add async...
362
  typedef struct regmap_async *(*regmap_hw_async_alloc)(void);
0135bbcc7   Stephen Warren   regmap: introduce...
363
  typedef void (*regmap_hw_free_context)(void *context);
b83a313bf   Mark Brown   regmap: Add gener...
364
365
  
  /**
2cf8e2dfd   Charles Keepax   regmap: Fixup the...
366
367
   * struct regmap_bus - Description of a hardware bus for the register map
   *                     infrastructure.
b83a313bf   Mark Brown   regmap: Add gener...
368
   *
bacdbe077   Stephen Warren   regmap: introduce...
369
   * @fast_io: Register IO is fast. Use a spinlock instead of a mutex
0d4529c53   Davide Ciminaghi   regmap: make lock...
370
371
372
   *	     to perform locking. This field is ignored if custom lock/unlock
   *	     functions are used (see fields lock/unlock of
   *	     struct regmap_config).
b83a313bf   Mark Brown   regmap: Add gener...
373
374
375
   * @write: Write operation.
   * @gather_write: Write operation with split register/value, return -ENOTSUPP
   *                if not implemented  on a given device.
0d509f2b1   Mark Brown   regmap: Add async...
376
377
   * @async_write: Write operation which completes asynchronously, optional and
   *               must serialise with respect to non-async I/O.
c5f58f2d7   Markus Pargmann   regmap: Add missi...
378
379
   * @reg_write: Write a single register value to the given register address. This
   *             write operation has to complete when returning from the function.
2cf8e2dfd   Charles Keepax   regmap: Fixup the...
380
381
382
383
   * @reg_update_bits: Update bits operation to be used against volatile
   *                   registers, intended for devices supporting some mechanism
   *                   for setting clearing bits without having to
   *                   read/modify/write.
b83a313bf   Mark Brown   regmap: Add gener...
384
385
   * @read: Read operation.  Data is returned in the buffer used to transmit
   *         data.
c5f58f2d7   Markus Pargmann   regmap: Add missi...
386
387
   * @reg_read: Read a single register value from a given register address.
   * @free_context: Free context.
0d509f2b1   Mark Brown   regmap: Add async...
388
   * @async_alloc: Allocate a regmap_async() structure.
b83a313bf   Mark Brown   regmap: Add gener...
389
390
   * @read_flag_mask: Mask to be set in the top byte of the register when doing
   *                  a read.
141eba2e0   Stephen Warren   regmap: allow bus...
391
392
393
394
395
396
   * @reg_format_endian_default: Default endianness for formatted register
   *     addresses. Used when the regmap_config specifies DEFAULT. If this is
   *     DEFAULT, BIG is assumed.
   * @val_format_endian_default: Default endianness for formatted register
   *     values. Used when the regmap_config specifies DEFAULT. If this is
   *     DEFAULT, BIG is assumed.
adaac4597   Markus Pargmann   regmap: Introduce...
397
398
   * @max_raw_read: Max raw read size that can be used on the bus.
   * @max_raw_write: Max raw write size that can be used on the bus.
b83a313bf   Mark Brown   regmap: Add gener...
399
400
   */
  struct regmap_bus {
bacdbe077   Stephen Warren   regmap: introduce...
401
  	bool fast_io;
b83a313bf   Mark Brown   regmap: Add gener...
402
403
  	regmap_hw_write write;
  	regmap_hw_gather_write gather_write;
0d509f2b1   Mark Brown   regmap: Add async...
404
  	regmap_hw_async_write async_write;
3ac170376   Boris BREZILLON   regmap: add reg_r...
405
  	regmap_hw_reg_write reg_write;
77792b114   Jon Ringle   regmap: Allow ins...
406
  	regmap_hw_reg_update_bits reg_update_bits;
b83a313bf   Mark Brown   regmap: Add gener...
407
  	regmap_hw_read read;
3ac170376   Boris BREZILLON   regmap: add reg_r...
408
  	regmap_hw_reg_read reg_read;
0135bbcc7   Stephen Warren   regmap: introduce...
409
  	regmap_hw_free_context free_context;
0d509f2b1   Mark Brown   regmap: Add async...
410
  	regmap_hw_async_alloc async_alloc;
b83a313bf   Mark Brown   regmap: Add gener...
411
  	u8 read_flag_mask;
141eba2e0   Stephen Warren   regmap: allow bus...
412
413
  	enum regmap_endian reg_format_endian_default;
  	enum regmap_endian val_format_endian_default;
adaac4597   Markus Pargmann   regmap: Introduce...
414
415
  	size_t max_raw_read;
  	size_t max_raw_write;
b83a313bf   Mark Brown   regmap: Add gener...
416
  };
3cfe7a74d   Nicolas Boichat   regmap: Use diffe...
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
  /*
   * __regmap_init functions.
   *
   * These functions take a lock key and name parameter, and should not be called
   * directly. Instead, use the regmap_init macros that generate a key and name
   * for each call.
   */
  struct regmap *__regmap_init(struct device *dev,
  			     const struct regmap_bus *bus,
  			     void *bus_context,
  			     const struct regmap_config *config,
  			     struct lock_class_key *lock_key,
  			     const char *lock_name);
  struct regmap *__regmap_init_i2c(struct i2c_client *i2c,
  				 const struct regmap_config *config,
  				 struct lock_class_key *lock_key,
  				 const char *lock_name);
  struct regmap *__regmap_init_spi(struct spi_device *dev,
  				 const struct regmap_config *config,
  				 struct lock_class_key *lock_key,
  				 const char *lock_name);
  struct regmap *__regmap_init_spmi_base(struct spmi_device *dev,
  				       const struct regmap_config *config,
  				       struct lock_class_key *lock_key,
  				       const char *lock_name);
  struct regmap *__regmap_init_spmi_ext(struct spmi_device *dev,
  				      const struct regmap_config *config,
  				      struct lock_class_key *lock_key,
  				      const char *lock_name);
cc5d0db39   Alex A. Mihaylov   regmap: Add 1-Wir...
446
447
448
449
  struct regmap *__regmap_init_w1(struct device *w1_dev,
  				 const struct regmap_config *config,
  				 struct lock_class_key *lock_key,
  				 const char *lock_name);
3cfe7a74d   Nicolas Boichat   regmap: Use diffe...
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
  struct regmap *__regmap_init_mmio_clk(struct device *dev, const char *clk_id,
  				      void __iomem *regs,
  				      const struct regmap_config *config,
  				      struct lock_class_key *lock_key,
  				      const char *lock_name);
  struct regmap *__regmap_init_ac97(struct snd_ac97 *ac97,
  				  const struct regmap_config *config,
  				  struct lock_class_key *lock_key,
  				  const char *lock_name);
  
  struct regmap *__devm_regmap_init(struct device *dev,
  				  const struct regmap_bus *bus,
  				  void *bus_context,
  				  const struct regmap_config *config,
  				  struct lock_class_key *lock_key,
  				  const char *lock_name);
  struct regmap *__devm_regmap_init_i2c(struct i2c_client *i2c,
  				      const struct regmap_config *config,
  				      struct lock_class_key *lock_key,
  				      const char *lock_name);
  struct regmap *__devm_regmap_init_spi(struct spi_device *dev,
  				      const struct regmap_config *config,
  				      struct lock_class_key *lock_key,
  				      const char *lock_name);
  struct regmap *__devm_regmap_init_spmi_base(struct spmi_device *dev,
  					    const struct regmap_config *config,
  					    struct lock_class_key *lock_key,
  					    const char *lock_name);
  struct regmap *__devm_regmap_init_spmi_ext(struct spmi_device *dev,
  					   const struct regmap_config *config,
  					   struct lock_class_key *lock_key,
  					   const char *lock_name);
cc5d0db39   Alex A. Mihaylov   regmap: Add 1-Wir...
482
483
484
485
  struct regmap *__devm_regmap_init_w1(struct device *w1_dev,
  				      const struct regmap_config *config,
  				      struct lock_class_key *lock_key,
  				      const char *lock_name);
3cfe7a74d   Nicolas Boichat   regmap: Use diffe...
486
487
488
489
490
491
492
493
494
495
  struct regmap *__devm_regmap_init_mmio_clk(struct device *dev,
  					   const char *clk_id,
  					   void __iomem *regs,
  					   const struct regmap_config *config,
  					   struct lock_class_key *lock_key,
  					   const char *lock_name);
  struct regmap *__devm_regmap_init_ac97(struct snd_ac97 *ac97,
  				       const struct regmap_config *config,
  				       struct lock_class_key *lock_key,
  				       const char *lock_name);
22853223d   Mark Brown   regmap: ac97: Add...
496

3cfe7a74d   Nicolas Boichat   regmap: Use diffe...
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
  /*
   * Wrapper for regmap_init macros to include a unique lockdep key and name
   * for each call. No-op if CONFIG_LOCKDEP is not set.
   *
   * @fn: Real function to call (in the form __[*_]regmap_init[_*])
   * @name: Config variable name (#config in the calling macro)
   **/
  #ifdef CONFIG_LOCKDEP
  #define __regmap_lockdep_wrapper(fn, name, ...)				\
  (									\
  	({								\
  		static struct lock_class_key _key;			\
  		fn(__VA_ARGS__, &_key,					\
  			KBUILD_BASENAME ":"				\
  			__stringify(__LINE__) ":"			\
  			"(" name ")->lock");				\
  	})								\
  )
  #else
  #define __regmap_lockdep_wrapper(fn, name, ...) fn(__VA_ARGS__, NULL, NULL)
  #endif
1ed811144   Nicolas Boichat   regmap: Move docu...
518
  /**
2cf8e2dfd   Charles Keepax   regmap: Fixup the...
519
   * regmap_init() - Initialise register map
1ed811144   Nicolas Boichat   regmap: Move docu...
520
521
522
523
524
525
526
527
528
529
   *
   * @dev: Device that will be interacted with
   * @bus: Bus-specific callbacks to use with device
   * @bus_context: Data passed to bus-specific callbacks
   * @config: Configuration for register map
   *
   * The return value will be an ERR_PTR() on error or a valid pointer to
   * a struct regmap.  This function should generally not be called
   * directly, it should be called by bus-specific init functions.
   */
3cfe7a74d   Nicolas Boichat   regmap: Use diffe...
530
531
532
  #define regmap_init(dev, bus, bus_context, config)			\
  	__regmap_lockdep_wrapper(__regmap_init, #config,		\
  				dev, bus, bus_context, config)
6cfec04bc   Michal Simek   regmap: Separate ...
533
  int regmap_attach_dev(struct device *dev, struct regmap *map,
3cfe7a74d   Nicolas Boichat   regmap: Use diffe...
534
  		      const struct regmap_config *config);
22853223d   Mark Brown   regmap: ac97: Add...
535

1ed811144   Nicolas Boichat   regmap: Move docu...
536
  /**
2cf8e2dfd   Charles Keepax   regmap: Fixup the...
537
   * regmap_init_i2c() - Initialise register map
1ed811144   Nicolas Boichat   regmap: Move docu...
538
539
540
541
542
543
544
   *
   * @i2c: Device that will be interacted with
   * @config: Configuration for register map
   *
   * The return value will be an ERR_PTR() on error or a valid pointer to
   * a struct regmap.
   */
3cfe7a74d   Nicolas Boichat   regmap: Use diffe...
545
546
547
  #define regmap_init_i2c(i2c, config)					\
  	__regmap_lockdep_wrapper(__regmap_init_i2c, #config,		\
  				i2c, config)
1ed811144   Nicolas Boichat   regmap: Move docu...
548
549
  
  /**
2cf8e2dfd   Charles Keepax   regmap: Fixup the...
550
   * regmap_init_spi() - Initialise register map
1ed811144   Nicolas Boichat   regmap: Move docu...
551
   *
2cf8e2dfd   Charles Keepax   regmap: Fixup the...
552
   * @dev: Device that will be interacted with
1ed811144   Nicolas Boichat   regmap: Move docu...
553
554
555
556
557
   * @config: Configuration for register map
   *
   * The return value will be an ERR_PTR() on error or a valid pointer to
   * a struct regmap.
   */
3cfe7a74d   Nicolas Boichat   regmap: Use diffe...
558
559
560
  #define regmap_init_spi(dev, config)					\
  	__regmap_lockdep_wrapper(__regmap_init_spi, #config,		\
  				dev, config)
1ed811144   Nicolas Boichat   regmap: Move docu...
561
562
  
  /**
2cf8e2dfd   Charles Keepax   regmap: Fixup the...
563
564
565
   * regmap_init_spmi_base() - Create regmap for the Base register space
   *
   * @dev:	SPMI device that will be interacted with
1ed811144   Nicolas Boichat   regmap: Move docu...
566
567
568
569
570
   * @config:	Configuration for register map
   *
   * The return value will be an ERR_PTR() on error or a valid pointer to
   * a struct regmap.
   */
3cfe7a74d   Nicolas Boichat   regmap: Use diffe...
571
572
573
  #define regmap_init_spmi_base(dev, config)				\
  	__regmap_lockdep_wrapper(__regmap_init_spmi_base, #config,	\
  				dev, config)
1ed811144   Nicolas Boichat   regmap: Move docu...
574
575
  
  /**
2cf8e2dfd   Charles Keepax   regmap: Fixup the...
576
577
578
   * regmap_init_spmi_ext() - Create regmap for Ext register space
   *
   * @dev:	Device that will be interacted with
1ed811144   Nicolas Boichat   regmap: Move docu...
579
580
581
582
583
   * @config:	Configuration for register map
   *
   * The return value will be an ERR_PTR() on error or a valid pointer to
   * a struct regmap.
   */
3cfe7a74d   Nicolas Boichat   regmap: Use diffe...
584
585
586
  #define regmap_init_spmi_ext(dev, config)				\
  	__regmap_lockdep_wrapper(__regmap_init_spmi_ext, #config,	\
  				dev, config)
1ed811144   Nicolas Boichat   regmap: Move docu...
587
588
  
  /**
cc5d0db39   Alex A. Mihaylov   regmap: Add 1-Wir...
589
590
591
592
593
594
595
596
597
598
599
600
601
   * regmap_init_w1() - Initialise register map
   *
   * @w1_dev: Device that will be interacted with
   * @config: Configuration for register map
   *
   * The return value will be an ERR_PTR() on error or a valid pointer to
   * a struct regmap.
   */
  #define regmap_init_w1(w1_dev, config)					\
  	__regmap_lockdep_wrapper(__regmap_init_w1, #config,		\
  				w1_dev, config)
  
  /**
2cf8e2dfd   Charles Keepax   regmap: Fixup the...
602
   * regmap_init_mmio_clk() - Initialise register map with register clock
1ed811144   Nicolas Boichat   regmap: Move docu...
603
604
605
606
607
608
609
610
611
   *
   * @dev: Device that will be interacted with
   * @clk_id: register clock consumer ID
   * @regs: Pointer to memory-mapped IO region
   * @config: Configuration for register map
   *
   * The return value will be an ERR_PTR() on error or a valid pointer to
   * a struct regmap.
   */
3cfe7a74d   Nicolas Boichat   regmap: Use diffe...
612
613
614
  #define regmap_init_mmio_clk(dev, clk_id, regs, config)			\
  	__regmap_lockdep_wrapper(__regmap_init_mmio_clk, #config,	\
  				dev, clk_id, regs, config)
878ec67b3   Philipp Zabel   regmap: mmio: add...
615
616
  
  /**
2cf8e2dfd   Charles Keepax   regmap: Fixup the...
617
   * regmap_init_mmio() - Initialise register map
878ec67b3   Philipp Zabel   regmap: mmio: add...
618
619
620
621
622
623
624
625
   *
   * @dev: Device that will be interacted with
   * @regs: Pointer to memory-mapped IO region
   * @config: Configuration for register map
   *
   * The return value will be an ERR_PTR() on error or a valid pointer to
   * a struct regmap.
   */
1ed811144   Nicolas Boichat   regmap: Move docu...
626
627
628
629
  #define regmap_init_mmio(dev, regs, config)		\
  	regmap_init_mmio_clk(dev, NULL, regs, config)
  
  /**
2cf8e2dfd   Charles Keepax   regmap: Fixup the...
630
   * regmap_init_ac97() - Initialise AC'97 register map
1ed811144   Nicolas Boichat   regmap: Move docu...
631
632
633
634
635
636
637
   *
   * @ac97: Device that will be interacted with
   * @config: Configuration for register map
   *
   * The return value will be an ERR_PTR() on error or a valid pointer to
   * a struct regmap.
   */
3cfe7a74d   Nicolas Boichat   regmap: Use diffe...
638
639
640
  #define regmap_init_ac97(ac97, config)					\
  	__regmap_lockdep_wrapper(__regmap_init_ac97, #config,		\
  				ac97, config)
22853223d   Mark Brown   regmap: ac97: Add...
641
  bool regmap_ac97_default_volatile(struct device *dev, unsigned int reg);
878ec67b3   Philipp Zabel   regmap: mmio: add...
642

1ed811144   Nicolas Boichat   regmap: Move docu...
643
  /**
2cf8e2dfd   Charles Keepax   regmap: Fixup the...
644
   * devm_regmap_init() - Initialise managed register map
1ed811144   Nicolas Boichat   regmap: Move docu...
645
646
647
648
649
650
651
652
653
654
655
   *
   * @dev: Device that will be interacted with
   * @bus: Bus-specific callbacks to use with device
   * @bus_context: Data passed to bus-specific callbacks
   * @config: Configuration for register map
   *
   * The return value will be an ERR_PTR() on error or a valid pointer
   * to a struct regmap.  This function should generally not be called
   * directly, it should be called by bus-specific init functions.  The
   * map will be automatically freed by the device management code.
   */
3cfe7a74d   Nicolas Boichat   regmap: Use diffe...
656
657
658
  #define devm_regmap_init(dev, bus, bus_context, config)			\
  	__regmap_lockdep_wrapper(__devm_regmap_init, #config,		\
  				dev, bus, bus_context, config)
1ed811144   Nicolas Boichat   regmap: Move docu...
659
660
  
  /**
2cf8e2dfd   Charles Keepax   regmap: Fixup the...
661
   * devm_regmap_init_i2c() - Initialise managed register map
1ed811144   Nicolas Boichat   regmap: Move docu...
662
663
664
665
666
667
668
669
   *
   * @i2c: Device that will be interacted with
   * @config: Configuration for register map
   *
   * The return value will be an ERR_PTR() on error or a valid pointer
   * to a struct regmap.  The regmap will be automatically freed by the
   * device management code.
   */
3cfe7a74d   Nicolas Boichat   regmap: Use diffe...
670
671
672
  #define devm_regmap_init_i2c(i2c, config)				\
  	__regmap_lockdep_wrapper(__devm_regmap_init_i2c, #config,	\
  				i2c, config)
1ed811144   Nicolas Boichat   regmap: Move docu...
673
674
  
  /**
2cf8e2dfd   Charles Keepax   regmap: Fixup the...
675
   * devm_regmap_init_spi() - Initialise register map
1ed811144   Nicolas Boichat   regmap: Move docu...
676
   *
2cf8e2dfd   Charles Keepax   regmap: Fixup the...
677
   * @dev: Device that will be interacted with
1ed811144   Nicolas Boichat   regmap: Move docu...
678
679
680
681
682
683
   * @config: Configuration for register map
   *
   * The return value will be an ERR_PTR() on error or a valid pointer
   * to a struct regmap.  The map will be automatically freed by the
   * device management code.
   */
3cfe7a74d   Nicolas Boichat   regmap: Use diffe...
684
685
686
  #define devm_regmap_init_spi(dev, config)				\
  	__regmap_lockdep_wrapper(__devm_regmap_init_spi, #config,	\
  				dev, config)
1ed811144   Nicolas Boichat   regmap: Move docu...
687
688
  
  /**
2cf8e2dfd   Charles Keepax   regmap: Fixup the...
689
690
691
   * devm_regmap_init_spmi_base() - Create managed regmap for Base register space
   *
   * @dev:	SPMI device that will be interacted with
1ed811144   Nicolas Boichat   regmap: Move docu...
692
693
694
695
696
697
   * @config:	Configuration for register map
   *
   * The return value will be an ERR_PTR() on error or a valid pointer
   * to a struct regmap.  The regmap will be automatically freed by the
   * device management code.
   */
3cfe7a74d   Nicolas Boichat   regmap: Use diffe...
698
699
700
  #define devm_regmap_init_spmi_base(dev, config)				\
  	__regmap_lockdep_wrapper(__devm_regmap_init_spmi_base, #config,	\
  				dev, config)
1ed811144   Nicolas Boichat   regmap: Move docu...
701
702
  
  /**
2cf8e2dfd   Charles Keepax   regmap: Fixup the...
703
704
705
   * devm_regmap_init_spmi_ext() - Create managed regmap for Ext register space
   *
   * @dev:	SPMI device that will be interacted with
1ed811144   Nicolas Boichat   regmap: Move docu...
706
707
708
709
710
711
   * @config:	Configuration for register map
   *
   * The return value will be an ERR_PTR() on error or a valid pointer
   * to a struct regmap.  The regmap will be automatically freed by the
   * device management code.
   */
3cfe7a74d   Nicolas Boichat   regmap: Use diffe...
712
713
714
  #define devm_regmap_init_spmi_ext(dev, config)				\
  	__regmap_lockdep_wrapper(__devm_regmap_init_spmi_ext, #config,	\
  				dev, config)
3cfe7a74d   Nicolas Boichat   regmap: Use diffe...
715

878ec67b3   Philipp Zabel   regmap: mmio: add...
716
  /**
cc5d0db39   Alex A. Mihaylov   regmap: Add 1-Wir...
717
718
719
720
721
722
723
724
725
726
727
728
729
   * devm_regmap_init_w1() - Initialise managed register map
   *
   * @w1_dev: Device that will be interacted with
   * @config: Configuration for register map
   *
   * The return value will be an ERR_PTR() on error or a valid pointer
   * to a struct regmap.  The regmap will be automatically freed by the
   * device management code.
   */
  #define devm_regmap_init_w1(w1_dev, config)				\
  	__regmap_lockdep_wrapper(__devm_regmap_init_w1, #config,	\
  				w1_dev, config)
  /**
2cf8e2dfd   Charles Keepax   regmap: Fixup the...
730
   * devm_regmap_init_mmio_clk() - Initialise managed register map with clock
878ec67b3   Philipp Zabel   regmap: mmio: add...
731
732
   *
   * @dev: Device that will be interacted with
1ed811144   Nicolas Boichat   regmap: Move docu...
733
   * @clk_id: register clock consumer ID
878ec67b3   Philipp Zabel   regmap: mmio: add...
734
735
736
   * @regs: Pointer to memory-mapped IO region
   * @config: Configuration for register map
   *
1ed811144   Nicolas Boichat   regmap: Move docu...
737
738
739
   * The return value will be an ERR_PTR() on error or a valid pointer
   * to a struct regmap.  The regmap will be automatically freed by the
   * device management code.
878ec67b3   Philipp Zabel   regmap: mmio: add...
740
   */
1ed811144   Nicolas Boichat   regmap: Move docu...
741
742
743
  #define devm_regmap_init_mmio_clk(dev, clk_id, regs, config)		\
  	__regmap_lockdep_wrapper(__devm_regmap_init_mmio_clk, #config,	\
  				dev, clk_id, regs, config)
878ec67b3   Philipp Zabel   regmap: mmio: add...
744
745
  
  /**
2cf8e2dfd   Charles Keepax   regmap: Fixup the...
746
   * devm_regmap_init_mmio() - Initialise managed register map
878ec67b3   Philipp Zabel   regmap: mmio: add...
747
748
749
750
751
752
753
754
755
   *
   * @dev: Device that will be interacted with
   * @regs: Pointer to memory-mapped IO region
   * @config: Configuration for register map
   *
   * The return value will be an ERR_PTR() on error or a valid pointer
   * to a struct regmap.  The regmap will be automatically freed by the
   * device management code.
   */
3cfe7a74d   Nicolas Boichat   regmap: Use diffe...
756
757
  #define devm_regmap_init_mmio(dev, regs, config)		\
  	devm_regmap_init_mmio_clk(dev, NULL, regs, config)
c0eb46766   Mark Brown   regmap: Implement...
758

1ed811144   Nicolas Boichat   regmap: Move docu...
759
  /**
2cf8e2dfd   Charles Keepax   regmap: Fixup the...
760
   * devm_regmap_init_ac97() - Initialise AC'97 register map
1ed811144   Nicolas Boichat   regmap: Move docu...
761
762
763
764
765
766
767
768
769
770
771
   *
   * @ac97: Device that will be interacted with
   * @config: Configuration for register map
   *
   * The return value will be an ERR_PTR() on error or a valid pointer
   * to a struct regmap.  The regmap will be automatically freed by the
   * device management code.
   */
  #define devm_regmap_init_ac97(ac97, config)				\
  	__regmap_lockdep_wrapper(__devm_regmap_init_ac97, #config,	\
  				ac97, config)
c0eb46766   Mark Brown   regmap: Implement...
772

b83a313bf   Mark Brown   regmap: Add gener...
773
  void regmap_exit(struct regmap *map);
bf3151733   Mark Brown   regmap: Allow dri...
774
775
  int regmap_reinit_cache(struct regmap *map,
  			const struct regmap_config *config);
72b39f6f2   Mark Brown   regmap: Implement...
776
  struct regmap *dev_get_regmap(struct device *dev, const char *name);
8d7d3972a   Tuomas Tynkkynen   regmap: Add regma...
777
  struct device *regmap_get_device(struct regmap *map);
b83a313bf   Mark Brown   regmap: Add gener...
778
  int regmap_write(struct regmap *map, unsigned int reg, unsigned int val);
915f441b6   Mark Brown   regmap: Provide a...
779
  int regmap_write_async(struct regmap *map, unsigned int reg, unsigned int val);
b83a313bf   Mark Brown   regmap: Add gener...
780
781
  int regmap_raw_write(struct regmap *map, unsigned int reg,
  		     const void *val, size_t val_len);
8eaeb2192   Laxman Dewangan   regmap: add regma...
782
783
  int regmap_bulk_write(struct regmap *map, unsigned int reg, const void *val,
  			size_t val_count);
8019ff6cf   Nariman Poushin   regmap: Use reg_s...
784
  int regmap_multi_reg_write(struct regmap *map, const struct reg_sequence *regs,
e33fabd36   Anthony Olech   regmap: new API r...
785
  			int num_regs);
1d5b40bcc   Charles Keepax   regmap: Add bypas...
786
  int regmap_multi_reg_write_bypassed(struct regmap *map,
8019ff6cf   Nariman Poushin   regmap: Use reg_s...
787
  				    const struct reg_sequence *regs,
1d5b40bcc   Charles Keepax   regmap: Add bypas...
788
  				    int num_regs);
0d509f2b1   Mark Brown   regmap: Add async...
789
790
  int regmap_raw_write_async(struct regmap *map, unsigned int reg,
  			   const void *val, size_t val_len);
b83a313bf   Mark Brown   regmap: Add gener...
791
792
793
794
795
  int regmap_read(struct regmap *map, unsigned int reg, unsigned int *val);
  int regmap_raw_read(struct regmap *map, unsigned int reg,
  		    void *val, size_t val_len);
  int regmap_bulk_read(struct regmap *map, unsigned int reg, void *val,
  		     size_t val_count);
91d31b9f8   Kuninori Morimoto   regmap: add regma...
796
797
798
  int regmap_update_bits_base(struct regmap *map, unsigned int reg,
  			    unsigned int mask, unsigned int val,
  			    bool *change, bool async, bool force);
a6539c329   Mark Brown   regmap: Allow use...
799
  int regmap_get_val_bytes(struct regmap *map);
668abc729   Srinivas Kandagatla   regmap: Introduce...
800
  int regmap_get_max_register(struct regmap *map);
a2f776cbb   Srinivas Kandagatla   regmap: Introduce...
801
  int regmap_get_reg_stride(struct regmap *map);
0d509f2b1   Mark Brown   regmap: Add async...
802
  int regmap_async_complete(struct regmap *map);
221ad7f2d   Mark Brown   regmap: core: Pro...
803
  bool regmap_can_raw_write(struct regmap *map);
f50c9eb4e   Markus Pargmann   regmap: regmap ma...
804
805
  size_t regmap_get_raw_read_max(struct regmap *map);
  size_t regmap_get_raw_write_max(struct regmap *map);
b83a313bf   Mark Brown   regmap: Add gener...
806

39a58439d   Mark Brown   regmap: Prototype...
807
  int regcache_sync(struct regmap *map);
4d4cfd165   Mark Brown   regmap: Allow dri...
808
809
  int regcache_sync_region(struct regmap *map, unsigned int min,
  			 unsigned int max);
697e85bc6   Mark Brown   regmap: Add suppo...
810
811
  int regcache_drop_region(struct regmap *map, unsigned int min,
  			 unsigned int max);
92afb286d   Mark Brown   regmap: Allow dri...
812
  void regcache_cache_only(struct regmap *map, bool enable);
6eb0f5e01   Dimitris Papastamos   regmap: Implement...
813
  void regcache_cache_bypass(struct regmap *map, bool enable);
8ae0d7e8a   Mark Brown   regmap: Track if ...
814
  void regcache_mark_dirty(struct regmap *map);
92afb286d   Mark Brown   regmap: Allow dri...
815

154881e59   Mark Brown   regmap: Make regm...
816
817
  bool regmap_check_range_table(struct regmap *map, unsigned int reg,
  			      const struct regmap_access_table *table);
8019ff6cf   Nariman Poushin   regmap: Use reg_s...
818
  int regmap_register_patch(struct regmap *map, const struct reg_sequence *regs,
22f0d90a3   Mark Brown   regmap: Support r...
819
  			  int num_regs);
13ff50c85   Nenghua Cao   regmap: add regma...
820
821
  int regmap_parse_val(struct regmap *map, const void *buf,
  				unsigned int *val);
22f0d90a3   Mark Brown   regmap: Support r...
822

76aad392f   Davide Ciminaghi   regmap: introduce...
823
824
825
826
827
828
829
830
831
  static inline bool regmap_reg_in_range(unsigned int reg,
  				       const struct regmap_range *range)
  {
  	return reg >= range->range_min && reg <= range->range_max;
  }
  
  bool regmap_reg_in_ranges(unsigned int reg,
  			  const struct regmap_range *ranges,
  			  unsigned int nranges);
f8beab2bb   Mark Brown   regmap: Add a reu...
832
  /**
2cf8e2dfd   Charles Keepax   regmap: Fixup the...
833
   * struct reg_field - Description of an register field
672522878   Srinivas Kandagatla   regmap: Add regma...
834
835
836
   *
   * @reg: Offset of the register within the regmap bank
   * @lsb: lsb of the register field.
f27b37f59   Bintian Wang   regmap: correct t...
837
   * @msb: msb of the register field.
a0102375e   Kuninori Morimoto   regmap: Add regma...
838
839
   * @id_size: port size if it has some ports
   * @id_offset: address offset for each ports
672522878   Srinivas Kandagatla   regmap: Add regma...
840
841
842
843
844
   */
  struct reg_field {
  	unsigned int reg;
  	unsigned int lsb;
  	unsigned int msb;
a0102375e   Kuninori Morimoto   regmap: Add regma...
845
846
  	unsigned int id_size;
  	unsigned int id_offset;
672522878   Srinivas Kandagatla   regmap: Add regma...
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
  };
  
  #define REG_FIELD(_reg, _lsb, _msb) {		\
  				.reg = _reg,	\
  				.lsb = _lsb,	\
  				.msb = _msb,	\
  				}
  
  struct regmap_field *regmap_field_alloc(struct regmap *regmap,
  		struct reg_field reg_field);
  void regmap_field_free(struct regmap_field *field);
  
  struct regmap_field *devm_regmap_field_alloc(struct device *dev,
  		struct regmap *regmap, struct reg_field reg_field);
  void devm_regmap_field_free(struct device *dev,	struct regmap_field *field);
  
  int regmap_field_read(struct regmap_field *field, unsigned int *val);
28972eaa3   Kuninori Morimoto   regmap: add regma...
864
865
866
  int regmap_field_update_bits_base(struct regmap_field *field,
  				  unsigned int mask, unsigned int val,
  				  bool *change, bool async, bool force);
a0102375e   Kuninori Morimoto   regmap: Add regma...
867
868
  int regmap_fields_read(struct regmap_field *field, unsigned int id,
  		       unsigned int *val);
e126edec1   Kuninori Morimoto   regmap: add regma...
869
870
871
  int regmap_fields_update_bits_base(struct regmap_field *field,  unsigned int id,
  				   unsigned int mask, unsigned int val,
  				   bool *change, bool async, bool force);
76aad392f   Davide Ciminaghi   regmap: introduce...
872

f8beab2bb   Mark Brown   regmap: Add a reu...
873
  /**
2cf8e2dfd   Charles Keepax   regmap: Fixup the...
874
   * struct regmap_irq - Description of an IRQ for the generic regmap irq_chip.
f8beab2bb   Mark Brown   regmap: Add a reu...
875
876
877
   *
   * @reg_offset: Offset of the status/mask register within the bank
   * @mask:       Mask used to flag/control the register.
7a78479fd   Laxman Dewangan   regmap: irq: add ...
878
879
880
   * @type_reg_offset: Offset register for the irq type setting.
   * @type_rising_mask: Mask bit to configure RISING type irq.
   * @type_falling_mask: Mask bit to configure FALLING type irq.
f8beab2bb   Mark Brown   regmap: Add a reu...
881
882
883
884
   */
  struct regmap_irq {
  	unsigned int reg_offset;
  	unsigned int mask;
7a78479fd   Laxman Dewangan   regmap: irq: add ...
885
886
887
  	unsigned int type_reg_offset;
  	unsigned int type_rising_mask;
  	unsigned int type_falling_mask;
f8beab2bb   Mark Brown   regmap: Add a reu...
888
  };
b4fe8ba7a   Qipeng Zha   regmap: Add gener...
889
890
  #define REGMAP_IRQ_REG(_irq, _off, _mask)		\
  	[_irq] = { .reg_offset = (_off), .mask = (_mask) }
f8beab2bb   Mark Brown   regmap: Add a reu...
891
  /**
2cf8e2dfd   Charles Keepax   regmap: Fixup the...
892
   * struct regmap_irq_chip - Description of a generic regmap irq_chip.
f8beab2bb   Mark Brown   regmap: Add a reu...
893
894
895
896
897
   *
   * @name:        Descriptive name for IRQ controller.
   *
   * @status_base: Base status register address.
   * @mask_base:   Base mask register address.
a71411dbf   Michael Grzeschik   regmap: irq: add ...
898
   * @mask_writeonly: Base mask register is write only.
7b7d1968e   Guo Zeng   regmap: irq: add ...
899
900
   * @unmask_base:  Base unmask register address. for chips who have
   *                separate mask and unmask registers
d32334333   Alexander Shiyan   regmap: irq: Allo...
901
902
   * @ack_base:    Base ack address. If zero then the chip is clear on read.
   *               Using zero value is possible with @use_ack bit.
a43fd50dc   Mark Brown   regmap: Implement...
903
   * @wake_base:   Base address for wake enables.  If zero unsupported.
7a78479fd   Laxman Dewangan   regmap: irq: add ...
904
   * @type_base:   Base address for irq type.  If zero unsupported.
022f926a2   Graeme Gregory   regmap: add suppo...
905
   * @irq_reg_stride:  Stride to use for chips where registers are not contiguous.
2753e6f82   Philipp Zabel   regmap: irq: Allo...
906
   * @init_ack_masked: Ack all masked interrupts once during initalization.
68622bdfe   Philipp Zabel   regmap: irq: docu...
907
   * @mask_invert: Inverted mask register: cleared bits are masked out.
d32334333   Alexander Shiyan   regmap: irq: Allo...
908
   * @use_ack:     Use @ack register even if it is zero.
a650fdd94   Guo Zeng   regmap: irq: add ...
909
   * @ack_invert:  Inverted ack register: cleared bits for ack.
68622bdfe   Philipp Zabel   regmap: irq: docu...
910
   * @wake_invert: Inverted wake register: cleared bits are wake enabled.
7a78479fd   Laxman Dewangan   regmap: irq: add ...
911
   * @type_invert: Invert the type flags.
0c00c50b4   Mark Brown   regmap: irq: Enab...
912
   * @runtime_pm:  Hold a runtime PM lock on the device when accessing it.
f8beab2bb   Mark Brown   regmap: Add a reu...
913
914
915
916
917
   *
   * @num_regs:    Number of registers in each control bank.
   * @irqs:        Descriptors for individual IRQs.  Interrupt numbers are
   *               assigned based on the index in the array of the interrupt.
   * @num_irqs:    Number of descriptors.
7a78479fd   Laxman Dewangan   regmap: irq: add ...
918
919
920
   * @num_type_reg:    Number of type registers.
   * @type_reg_stride: Stride to use for chips where type registers are not
   *			contiguous.
ccc125619   Laxman Dewangan   regmap: irq: Add ...
921
922
923
924
925
926
   * @handle_pre_irq:  Driver specific callback to handle interrupt from device
   *		     before regmap_irq_handler process the interrupts.
   * @handle_post_irq: Driver specific callback to handle interrupt from device
   *		     after handling the interrupts in regmap_irq_handler().
   * @irq_drv_data:    Driver specific IRQ data which is passed as parameter when
   *		     driver specific pre/post interrupt handler is called.
2cf8e2dfd   Charles Keepax   regmap: Fixup the...
927
928
929
930
   *
   * This is not intended to handle every possible interrupt controller, but
   * it should handle a substantial proportion of those that are found in the
   * wild.
f8beab2bb   Mark Brown   regmap: Add a reu...
931
932
933
934
935
936
   */
  struct regmap_irq_chip {
  	const char *name;
  
  	unsigned int status_base;
  	unsigned int mask_base;
7b7d1968e   Guo Zeng   regmap: irq: add ...
937
  	unsigned int unmask_base;
f8beab2bb   Mark Brown   regmap: Add a reu...
938
  	unsigned int ack_base;
a43fd50dc   Mark Brown   regmap: Implement...
939
  	unsigned int wake_base;
7a78479fd   Laxman Dewangan   regmap: irq: add ...
940
  	unsigned int type_base;
022f926a2   Graeme Gregory   regmap: add suppo...
941
  	unsigned int irq_reg_stride;
a71411dbf   Michael Grzeschik   regmap: irq: add ...
942
  	bool mask_writeonly:1;
f484f7a6b   Philipp Zabel   regmap: irq: make...
943
944
  	bool init_ack_masked:1;
  	bool mask_invert:1;
d32334333   Alexander Shiyan   regmap: irq: Allo...
945
  	bool use_ack:1;
a650fdd94   Guo Zeng   regmap: irq: add ...
946
  	bool ack_invert:1;
f484f7a6b   Philipp Zabel   regmap: irq: make...
947
948
  	bool wake_invert:1;
  	bool runtime_pm:1;
7a78479fd   Laxman Dewangan   regmap: irq: add ...
949
  	bool type_invert:1;
f8beab2bb   Mark Brown   regmap: Add a reu...
950
951
952
953
954
  
  	int num_regs;
  
  	const struct regmap_irq *irqs;
  	int num_irqs;
7a78479fd   Laxman Dewangan   regmap: irq: add ...
955
956
957
  
  	int num_type_reg;
  	unsigned int type_reg_stride;
ccc125619   Laxman Dewangan   regmap: irq: Add ...
958
959
960
961
  
  	int (*handle_pre_irq)(void *irq_drv_data);
  	int (*handle_post_irq)(void *irq_drv_data);
  	void *irq_drv_data;
f8beab2bb   Mark Brown   regmap: Add a reu...
962
963
964
965
966
  };
  
  struct regmap_irq_chip_data;
  
  int regmap_add_irq_chip(struct regmap *map, int irq, int irq_flags,
b026ddbbd   Mark Brown   regmap: Constify ...
967
  			int irq_base, const struct regmap_irq_chip *chip,
f8beab2bb   Mark Brown   regmap: Add a reu...
968
969
  			struct regmap_irq_chip_data **data);
  void regmap_del_irq_chip(int irq, struct regmap_irq_chip_data *data);
045b98480   Laxman Dewangan   regmap: irq: add ...
970
971
972
973
974
975
976
  
  int devm_regmap_add_irq_chip(struct device *dev, struct regmap *map, int irq,
  			     int irq_flags, int irq_base,
  			     const struct regmap_irq_chip *chip,
  			     struct regmap_irq_chip_data **data);
  void devm_regmap_del_irq_chip(struct device *dev, int irq,
  			      struct regmap_irq_chip_data *data);
209a60062   Mark Brown   regmap: Add irq_b...
977
  int regmap_irq_chip_get_base(struct regmap_irq_chip_data *data);
4af8be67f   Mark Brown   regmap: Convert r...
978
  int regmap_irq_get_virq(struct regmap_irq_chip_data *data, int irq);
90f790d2d   Mark Brown   regmap: irq: Allo...
979
  struct irq_domain *regmap_irq_get_domain(struct regmap_irq_chip_data *data);
92afb286d   Mark Brown   regmap: Allow dri...
980

9cde5fcd4   Mark Brown   regmap: Add stub ...
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
  #else
  
  /*
   * These stubs should only ever be called by generic code which has
   * regmap based facilities, if they ever get called at runtime
   * something is going wrong and something probably needs to select
   * REGMAP.
   */
  
  static inline int regmap_write(struct regmap *map, unsigned int reg,
  			       unsigned int val)
  {
  	WARN_ONCE(1, "regmap API is disabled");
  	return -EINVAL;
  }
915f441b6   Mark Brown   regmap: Provide a...
996
997
998
999
1000
1001
  static inline int regmap_write_async(struct regmap *map, unsigned int reg,
  				     unsigned int val)
  {
  	WARN_ONCE(1, "regmap API is disabled");
  	return -EINVAL;
  }
9cde5fcd4   Mark Brown   regmap: Add stub ...
1002
1003
1004
1005
1006
1007
  static inline int regmap_raw_write(struct regmap *map, unsigned int reg,
  				   const void *val, size_t val_len)
  {
  	WARN_ONCE(1, "regmap API is disabled");
  	return -EINVAL;
  }
0d509f2b1   Mark Brown   regmap: Add async...
1008
1009
1010
1011
1012
1013
  static inline int regmap_raw_write_async(struct regmap *map, unsigned int reg,
  					 const void *val, size_t val_len)
  {
  	WARN_ONCE(1, "regmap API is disabled");
  	return -EINVAL;
  }
9cde5fcd4   Mark Brown   regmap: Add stub ...
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
  static inline int regmap_bulk_write(struct regmap *map, unsigned int reg,
  				    const void *val, size_t val_count)
  {
  	WARN_ONCE(1, "regmap API is disabled");
  	return -EINVAL;
  }
  
  static inline int regmap_read(struct regmap *map, unsigned int reg,
  			      unsigned int *val)
  {
  	WARN_ONCE(1, "regmap API is disabled");
  	return -EINVAL;
  }
  
  static inline int regmap_raw_read(struct regmap *map, unsigned int reg,
  				  void *val, size_t val_len)
  {
  	WARN_ONCE(1, "regmap API is disabled");
  	return -EINVAL;
  }
  
  static inline int regmap_bulk_read(struct regmap *map, unsigned int reg,
  				   void *val, size_t val_count)
  {
  	WARN_ONCE(1, "regmap API is disabled");
  	return -EINVAL;
  }
91d31b9f8   Kuninori Morimoto   regmap: add regma...
1041
1042
1043
  static inline int regmap_update_bits_base(struct regmap *map, unsigned int reg,
  					  unsigned int mask, unsigned int val,
  					  bool *change, bool async, bool force)
fd4b7286c   Kuninori Morimoto   regmap: add regma...
1044
1045
1046
1047
  {
  	WARN_ONCE(1, "regmap API is disabled");
  	return -EINVAL;
  }
28972eaa3   Kuninori Morimoto   regmap: add regma...
1048
1049
1050
  static inline int regmap_field_update_bits_base(struct regmap_field *field,
  					unsigned int mask, unsigned int val,
  					bool *change, bool async, bool force)
915f441b6   Mark Brown   regmap: Provide a...
1051
1052
1053
1054
  {
  	WARN_ONCE(1, "regmap API is disabled");
  	return -EINVAL;
  }
e126edec1   Kuninori Morimoto   regmap: add regma...
1055
1056
1057
1058
  static inline int regmap_fields_update_bits_base(struct regmap_field *field,
  				   unsigned int id,
  				   unsigned int mask, unsigned int val,
  				   bool *change, bool async, bool force)
915f441b6   Mark Brown   regmap: Provide a...
1059
1060
1061
1062
  {
  	WARN_ONCE(1, "regmap API is disabled");
  	return -EINVAL;
  }
9cde5fcd4   Mark Brown   regmap: Add stub ...
1063
1064
1065
1066
1067
  static inline int regmap_get_val_bytes(struct regmap *map)
  {
  	WARN_ONCE(1, "regmap API is disabled");
  	return -EINVAL;
  }
668abc729   Srinivas Kandagatla   regmap: Introduce...
1068
1069
1070
1071
1072
  static inline int regmap_get_max_register(struct regmap *map)
  {
  	WARN_ONCE(1, "regmap API is disabled");
  	return -EINVAL;
  }
a2f776cbb   Srinivas Kandagatla   regmap: Introduce...
1073
1074
1075
1076
1077
  static inline int regmap_get_reg_stride(struct regmap *map)
  {
  	WARN_ONCE(1, "regmap API is disabled");
  	return -EINVAL;
  }
9cde5fcd4   Mark Brown   regmap: Add stub ...
1078
1079
1080
1081
1082
  static inline int regcache_sync(struct regmap *map)
  {
  	WARN_ONCE(1, "regmap API is disabled");
  	return -EINVAL;
  }
a313f9f56   Mark Brown   regmap: Add stub ...
1083
1084
1085
1086
1087
1088
  static inline int regcache_sync_region(struct regmap *map, unsigned int min,
  				       unsigned int max)
  {
  	WARN_ONCE(1, "regmap API is disabled");
  	return -EINVAL;
  }
697e85bc6   Mark Brown   regmap: Add suppo...
1089
1090
1091
1092
1093
1094
  static inline int regcache_drop_region(struct regmap *map, unsigned int min,
  				       unsigned int max)
  {
  	WARN_ONCE(1, "regmap API is disabled");
  	return -EINVAL;
  }
9cde5fcd4   Mark Brown   regmap: Add stub ...
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
  static inline void regcache_cache_only(struct regmap *map, bool enable)
  {
  	WARN_ONCE(1, "regmap API is disabled");
  }
  
  static inline void regcache_cache_bypass(struct regmap *map, bool enable)
  {
  	WARN_ONCE(1, "regmap API is disabled");
  }
  
  static inline void regcache_mark_dirty(struct regmap *map)
  {
  	WARN_ONCE(1, "regmap API is disabled");
  }
0d509f2b1   Mark Brown   regmap: Add async...
1109
1110
1111
1112
  static inline void regmap_async_complete(struct regmap *map)
  {
  	WARN_ONCE(1, "regmap API is disabled");
  }
9cde5fcd4   Mark Brown   regmap: Add stub ...
1113
  static inline int regmap_register_patch(struct regmap *map,
a6baa3dea   Daniel Wagner   regmap: Fix lefto...
1114
  					const struct reg_sequence *regs,
9cde5fcd4   Mark Brown   regmap: Add stub ...
1115
1116
1117
1118
1119
  					int num_regs)
  {
  	WARN_ONCE(1, "regmap API is disabled");
  	return -EINVAL;
  }
13ff50c85   Nenghua Cao   regmap: add regma...
1120
1121
1122
1123
1124
1125
  static inline int regmap_parse_val(struct regmap *map, const void *buf,
  				unsigned int *val)
  {
  	WARN_ONCE(1, "regmap API is disabled");
  	return -EINVAL;
  }
72b39f6f2   Mark Brown   regmap: Implement...
1126
1127
1128
  static inline struct regmap *dev_get_regmap(struct device *dev,
  					    const char *name)
  {
72b39f6f2   Mark Brown   regmap: Implement...
1129
1130
  	return NULL;
  }
8d7d3972a   Tuomas Tynkkynen   regmap: Add regma...
1131
1132
1133
  static inline struct device *regmap_get_device(struct regmap *map)
  {
  	WARN_ONCE(1, "regmap API is disabled");
1d33dc6b0   Mark Brown   regmap: Fix retur...
1134
  	return NULL;
8d7d3972a   Tuomas Tynkkynen   regmap: Add regma...
1135
  }
9cde5fcd4   Mark Brown   regmap: Add stub ...
1136
  #endif
b83a313bf   Mark Brown   regmap: Add gener...
1137
  #endif