2 * Register map access API
4 * Copyright 2011 Wolfson Microelectronics plc
6 * Author: Mark Brown <broonie@opensource.wolfsonmicro.com>
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.
13 #include <linux/slab.h>
14 #include <linux/module.h>
15 #include <linux/mutex.h>
16 #include <linux/err.h>
18 #include <linux/regmap.h>
22 struct regmap_format
{
26 void (*format_write
)(struct regmap
*map
,
27 unsigned int reg
, unsigned int val
);
28 void (*format_reg
)(void *buf
, unsigned int reg
);
29 void (*format_val
)(void *buf
, unsigned int val
);
30 unsigned int (*parse_val
)(void *buf
);
36 struct device
*dev
; /* Device we do I/O on */
37 void *work_buf
; /* Scratch buffer used to format I/O */
38 struct regmap_format format
; /* Buffer format */
39 const struct regmap_bus
*bus
;
42 static void regmap_format_4_12_write(struct regmap
*map
,
43 unsigned int reg
, unsigned int val
)
45 __be16
*out
= map
->work_buf
;
46 *out
= cpu_to_be16((reg
<< 12) | val
);
49 static void regmap_format_7_9_write(struct regmap
*map
,
50 unsigned int reg
, unsigned int val
)
52 __be16
*out
= map
->work_buf
;
53 *out
= cpu_to_be16((reg
<< 9) | val
);
56 static void regmap_format_8(void *buf
, unsigned int val
)
63 static void regmap_format_16(void *buf
, unsigned int val
)
67 b
[0] = cpu_to_be16(val
);
70 static unsigned int regmap_parse_8(void *buf
)
77 static unsigned int regmap_parse_16(void *buf
)
81 b
[0] = be16_to_cpu(b
[0]);
87 * regmap_init(): Initialise register map
89 * @dev: Device that will be interacted with
90 * @bus: Bus-specific callbacks to use with device
91 * @config: Configuration for register map
93 * The return value will be an ERR_PTR() on error or a valid pointer to
94 * a struct regmap. This function should generally not be called
95 * directly, it should be called by bus-specific init functions.
97 struct regmap
*regmap_init(struct device
*dev
,
98 const struct regmap_bus
*bus
,
99 const struct regmap_config
*config
)
107 map
= kzalloc(sizeof(*map
), GFP_KERNEL
);
113 mutex_init(&map
->lock
);
114 map
->format
.buf_size
= (config
->reg_bits
+ config
->val_bits
) / 8;
115 map
->format
.reg_bytes
= config
->reg_bits
/ 8;
116 map
->format
.val_bytes
= config
->val_bits
/ 8;
120 switch (config
->reg_bits
) {
122 switch (config
->val_bits
) {
124 map
->format
.format_write
= regmap_format_4_12_write
;
132 switch (config
->val_bits
) {
134 map
->format
.format_write
= regmap_format_7_9_write
;
142 map
->format
.format_reg
= regmap_format_8
;
146 map
->format
.format_reg
= regmap_format_16
;
153 switch (config
->val_bits
) {
155 map
->format
.format_val
= regmap_format_8
;
156 map
->format
.parse_val
= regmap_parse_8
;
159 map
->format
.format_val
= regmap_format_16
;
160 map
->format
.parse_val
= regmap_parse_16
;
164 if (!map
->format
.format_write
&&
165 !(map
->format
.format_reg
&& map
->format
.format_val
))
168 map
->work_buf
= kmalloc(map
->format
.buf_size
, GFP_KERNEL
);
169 if (map
->work_buf
== NULL
) {
181 EXPORT_SYMBOL_GPL(regmap_init
);
184 * regmap_exit(): Free a previously allocated register map
186 void regmap_exit(struct regmap
*map
)
188 kfree(map
->work_buf
);
191 EXPORT_SYMBOL_GPL(regmap_exit
);
193 static int _regmap_raw_write(struct regmap
*map
, unsigned int reg
,
194 const void *val
, size_t val_len
)
200 map
->format
.format_reg(map
->work_buf
, reg
);
202 /* Try to do a gather write if we can */
203 if (map
->bus
->gather_write
)
204 ret
= map
->bus
->gather_write(map
->dev
, map
->work_buf
,
205 map
->format
.reg_bytes
,
208 /* Otherwise fall back on linearising by hand. */
209 if (ret
== -ENOTSUPP
) {
210 len
= map
->format
.reg_bytes
+ val_len
;
211 buf
= kmalloc(len
, GFP_KERNEL
);
215 memcpy(buf
, map
->work_buf
, map
->format
.reg_bytes
);
216 memcpy(buf
+ map
->format
.reg_bytes
, val
, val_len
);
217 ret
= map
->bus
->write(map
->dev
, buf
, len
);
225 static int _regmap_write(struct regmap
*map
, unsigned int reg
,
228 BUG_ON(!map
->format
.format_write
&& !map
->format
.format_val
);
230 if (map
->format
.format_write
) {
231 map
->format
.format_write(map
, reg
, val
);
233 return map
->bus
->write(map
->dev
, map
->work_buf
,
234 map
->format
.buf_size
);
236 map
->format
.format_val(map
->work_buf
+ map
->format
.reg_bytes
,
238 return _regmap_raw_write(map
, reg
,
239 map
->work_buf
+ map
->format
.reg_bytes
,
240 map
->format
.val_bytes
);
245 * regmap_write(): Write a value to a single register
247 * @map: Register map to write to
248 * @reg: Register to write to
249 * @val: Value to be written
251 * A value of zero will be returned on success, a negative errno will
252 * be returned in error cases.
254 int regmap_write(struct regmap
*map
, unsigned int reg
, unsigned int val
)
258 mutex_lock(&map
->lock
);
260 ret
= _regmap_write(map
, reg
, val
);
262 mutex_unlock(&map
->lock
);
266 EXPORT_SYMBOL_GPL(regmap_write
);
269 * regmap_raw_write(): Write raw values to one or more registers
271 * @map: Register map to write to
272 * @reg: Initial register to write to
273 * @val: Block of data to be written, laid out for direct transmission to the
275 * @val_len: Length of data pointed to by val.
277 * This function is intended to be used for things like firmware
278 * download where a large block of data needs to be transferred to the
279 * device. No formatting will be done on the data provided.
281 * A value of zero will be returned on success, a negative errno will
282 * be returned in error cases.
284 int regmap_raw_write(struct regmap
*map
, unsigned int reg
,
285 const void *val
, size_t val_len
)
289 mutex_lock(&map
->lock
);
291 ret
= _regmap_raw_write(map
, reg
, val
, val_len
);
293 mutex_unlock(&map
->lock
);
297 EXPORT_SYMBOL_GPL(regmap_raw_write
);
299 static int _regmap_raw_read(struct regmap
*map
, unsigned int reg
, void *val
,
300 unsigned int val_len
)
302 u8
*u8
= map
->work_buf
;
305 map
->format
.format_reg(map
->work_buf
, reg
);
308 * Some buses flag reads by setting the high bits in the
309 * register addresss; since it's always the high bits for all
310 * current formats we can do this here rather than in
311 * formatting. This may break if we get interesting formats.
313 if (map
->bus
->read_flag_mask
)
314 u8
[0] |= map
->bus
->read_flag_mask
;
316 ret
= map
->bus
->read(map
->dev
, map
->work_buf
, map
->format
.reg_bytes
,
324 static int _regmap_read(struct regmap
*map
, unsigned int reg
,
329 if (!map
->format
.parse_val
)
332 ret
= _regmap_raw_read(map
, reg
, map
->work_buf
, map
->format
.val_bytes
);
334 *val
= map
->format
.parse_val(map
->work_buf
);
340 * regmap_read(): Read a value from a single register
342 * @map: Register map to write to
343 * @reg: Register to be read from
344 * @val: Pointer to store read value
346 * A value of zero will be returned on success, a negative errno will
347 * be returned in error cases.
349 int regmap_read(struct regmap
*map
, unsigned int reg
, unsigned int *val
)
353 mutex_lock(&map
->lock
);
355 ret
= _regmap_read(map
, reg
, val
);
357 mutex_unlock(&map
->lock
);
361 EXPORT_SYMBOL_GPL(regmap_read
);
364 * regmap_raw_read(): Read raw data from the device
366 * @map: Register map to write to
367 * @reg: First register to be read from
368 * @val: Pointer to store read value
369 * @val_len: Size of data to read
371 * A value of zero will be returned on success, a negative errno will
372 * be returned in error cases.
374 int regmap_raw_read(struct regmap
*map
, unsigned int reg
, void *val
,
379 mutex_lock(&map
->lock
);
381 ret
= _regmap_raw_read(map
, reg
, val
, val_len
);
383 mutex_unlock(&map
->lock
);
387 EXPORT_SYMBOL_GPL(regmap_raw_read
);
390 * regmap_bulk_read(): Read multiple registers from the device
392 * @map: Register map to write to
393 * @reg: First register to be read from
394 * @val: Pointer to store read value, in native register size for device
395 * @val_count: Number of registers to read
397 * A value of zero will be returned on success, a negative errno will
398 * be returned in error cases.
400 int regmap_bulk_read(struct regmap
*map
, unsigned int reg
, void *val
,
404 size_t val_bytes
= map
->format
.val_bytes
;
406 if (!map
->format
.parse_val
)
409 ret
= regmap_raw_read(map
, reg
, val
, val_bytes
* val_count
);
413 for (i
= 0; i
< val_count
* val_bytes
; i
+= val_bytes
)
414 map
->format
.parse_val(val
+ i
);
418 EXPORT_SYMBOL_GPL(regmap_bulk_read
);
421 * remap_update_bits: Perform a read/modify/write cycle on the register map
423 * @map: Register map to update
424 * @reg: Register to update
425 * @mask: Bitmask to change
426 * @val: New value for bitmask
428 * Returns zero for success, a negative number on error.
430 int regmap_update_bits(struct regmap
*map
, unsigned int reg
,
431 unsigned int mask
, unsigned int val
)
436 mutex_lock(&map
->lock
);
438 ret
= _regmap_read(map
, reg
, &tmp
);
445 ret
= _regmap_write(map
, reg
, tmp
);
448 mutex_unlock(&map
->lock
);
452 EXPORT_SYMBOL_GPL(regmap_update_bits
);