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 #define CREATE_TRACE_POINTS
19 #include <trace/events/regmap.h>
23 static void regmap_format_4_12_write(struct regmap
*map
,
24 unsigned int reg
, unsigned int val
)
26 __be16
*out
= map
->work_buf
;
27 *out
= cpu_to_be16((reg
<< 12) | val
);
30 static void regmap_format_7_9_write(struct regmap
*map
,
31 unsigned int reg
, unsigned int val
)
33 __be16
*out
= map
->work_buf
;
34 *out
= cpu_to_be16((reg
<< 9) | val
);
37 static void regmap_format_8(void *buf
, unsigned int val
)
44 static void regmap_format_16(void *buf
, unsigned int val
)
48 b
[0] = cpu_to_be16(val
);
51 static unsigned int regmap_parse_8(void *buf
)
58 static unsigned int regmap_parse_16(void *buf
)
62 b
[0] = be16_to_cpu(b
[0]);
68 * regmap_init(): Initialise register map
70 * @dev: Device that will be interacted with
71 * @bus: Bus-specific callbacks to use with device
72 * @config: Configuration for register map
74 * The return value will be an ERR_PTR() on error or a valid pointer to
75 * a struct regmap. This function should generally not be called
76 * directly, it should be called by bus-specific init functions.
78 struct regmap
*regmap_init(struct device
*dev
,
79 const struct regmap_bus
*bus
,
80 const struct regmap_config
*config
)
88 map
= kzalloc(sizeof(*map
), GFP_KERNEL
);
94 mutex_init(&map
->lock
);
95 map
->format
.buf_size
= (config
->reg_bits
+ config
->val_bits
) / 8;
96 map
->format
.reg_bytes
= config
->reg_bits
/ 8;
97 map
->format
.val_bytes
= config
->val_bits
/ 8;
100 map
->max_register
= config
->max_register
;
101 map
->writeable_reg
= config
->writeable_reg
;
102 map
->readable_reg
= config
->readable_reg
;
103 map
->volatile_reg
= config
->volatile_reg
;
105 switch (config
->reg_bits
) {
107 switch (config
->val_bits
) {
109 map
->format
.format_write
= regmap_format_4_12_write
;
117 switch (config
->val_bits
) {
119 map
->format
.format_write
= regmap_format_7_9_write
;
127 map
->format
.format_reg
= regmap_format_8
;
131 map
->format
.format_reg
= regmap_format_16
;
138 switch (config
->val_bits
) {
140 map
->format
.format_val
= regmap_format_8
;
141 map
->format
.parse_val
= regmap_parse_8
;
144 map
->format
.format_val
= regmap_format_16
;
145 map
->format
.parse_val
= regmap_parse_16
;
149 if (!map
->format
.format_write
&&
150 !(map
->format
.format_reg
&& map
->format
.format_val
))
153 map
->work_buf
= kmalloc(map
->format
.buf_size
, GFP_KERNEL
);
154 if (map
->work_buf
== NULL
) {
159 regmap_debugfs_init(map
);
164 module_put(map
->bus
->owner
);
170 EXPORT_SYMBOL_GPL(regmap_init
);
173 * regmap_exit(): Free a previously allocated register map
175 void regmap_exit(struct regmap
*map
)
177 regmap_debugfs_exit(map
);
178 kfree(map
->work_buf
);
179 module_put(map
->bus
->owner
);
182 EXPORT_SYMBOL_GPL(regmap_exit
);
184 static int _regmap_raw_write(struct regmap
*map
, unsigned int reg
,
185 const void *val
, size_t val_len
)
192 /* Check for unwritable registers before we start */
193 if (map
->writeable_reg
)
194 for (i
= 0; i
< val_len
/ map
->format
.val_bytes
; i
++)
195 if (!map
->writeable_reg(map
->dev
, reg
+ i
))
198 map
->format
.format_reg(map
->work_buf
, reg
);
200 trace_regmap_hw_write_start(map
->dev
, reg
,
201 val_len
/ map
->format
.val_bytes
);
203 /* If we're doing a single register write we can probably just
204 * send the work_buf directly, otherwise try to do a gather
207 if (val
== map
->work_buf
+ map
->format
.reg_bytes
)
208 ret
= map
->bus
->write(map
->dev
, map
->work_buf
,
209 map
->format
.reg_bytes
+ val_len
);
210 else if (map
->bus
->gather_write
)
211 ret
= map
->bus
->gather_write(map
->dev
, map
->work_buf
,
212 map
->format
.reg_bytes
,
215 /* If that didn't work fall back on linearising by hand. */
216 if (ret
== -ENOTSUPP
) {
217 len
= map
->format
.reg_bytes
+ val_len
;
218 buf
= kmalloc(len
, GFP_KERNEL
);
222 memcpy(buf
, map
->work_buf
, map
->format
.reg_bytes
);
223 memcpy(buf
+ map
->format
.reg_bytes
, val
, val_len
);
224 ret
= map
->bus
->write(map
->dev
, buf
, len
);
229 trace_regmap_hw_write_done(map
->dev
, reg
,
230 val_len
/ map
->format
.val_bytes
);
235 static int _regmap_write(struct regmap
*map
, unsigned int reg
,
239 BUG_ON(!map
->format
.format_write
&& !map
->format
.format_val
);
241 trace_regmap_reg_write(map
->dev
, reg
, val
);
243 if (map
->format
.format_write
) {
244 map
->format
.format_write(map
, reg
, val
);
246 trace_regmap_hw_write_start(map
->dev
, reg
, 1);
248 ret
= map
->bus
->write(map
->dev
, map
->work_buf
,
249 map
->format
.buf_size
);
251 trace_regmap_hw_write_done(map
->dev
, reg
, 1);
255 map
->format
.format_val(map
->work_buf
+ map
->format
.reg_bytes
,
257 return _regmap_raw_write(map
, reg
,
258 map
->work_buf
+ map
->format
.reg_bytes
,
259 map
->format
.val_bytes
);
264 * regmap_write(): Write a value to a single register
266 * @map: Register map to write to
267 * @reg: Register to write to
268 * @val: Value to be written
270 * A value of zero will be returned on success, a negative errno will
271 * be returned in error cases.
273 int regmap_write(struct regmap
*map
, unsigned int reg
, unsigned int val
)
277 mutex_lock(&map
->lock
);
279 ret
= _regmap_write(map
, reg
, val
);
281 mutex_unlock(&map
->lock
);
285 EXPORT_SYMBOL_GPL(regmap_write
);
288 * regmap_raw_write(): Write raw values to one or more registers
290 * @map: Register map to write to
291 * @reg: Initial register to write to
292 * @val: Block of data to be written, laid out for direct transmission to the
294 * @val_len: Length of data pointed to by val.
296 * This function is intended to be used for things like firmware
297 * download where a large block of data needs to be transferred to the
298 * device. No formatting will be done on the data provided.
300 * A value of zero will be returned on success, a negative errno will
301 * be returned in error cases.
303 int regmap_raw_write(struct regmap
*map
, unsigned int reg
,
304 const void *val
, size_t val_len
)
308 mutex_lock(&map
->lock
);
310 ret
= _regmap_raw_write(map
, reg
, val
, val_len
);
312 mutex_unlock(&map
->lock
);
316 EXPORT_SYMBOL_GPL(regmap_raw_write
);
318 static int _regmap_raw_read(struct regmap
*map
, unsigned int reg
, void *val
,
319 unsigned int val_len
)
321 u8
*u8
= map
->work_buf
;
324 map
->format
.format_reg(map
->work_buf
, reg
);
327 * Some buses flag reads by setting the high bits in the
328 * register addresss; since it's always the high bits for all
329 * current formats we can do this here rather than in
330 * formatting. This may break if we get interesting formats.
332 if (map
->bus
->read_flag_mask
)
333 u8
[0] |= map
->bus
->read_flag_mask
;
335 trace_regmap_hw_read_start(map
->dev
, reg
,
336 val_len
/ map
->format
.val_bytes
);
338 ret
= map
->bus
->read(map
->dev
, map
->work_buf
, map
->format
.reg_bytes
,
341 trace_regmap_hw_read_done(map
->dev
, reg
,
342 val_len
/ map
->format
.val_bytes
);
347 static int _regmap_read(struct regmap
*map
, unsigned int reg
,
352 if (!map
->format
.parse_val
)
355 ret
= _regmap_raw_read(map
, reg
, map
->work_buf
, map
->format
.val_bytes
);
357 *val
= map
->format
.parse_val(map
->work_buf
);
358 trace_regmap_reg_read(map
->dev
, reg
, *val
);
365 * regmap_read(): Read a value from a single register
367 * @map: Register map to write to
368 * @reg: Register to be read from
369 * @val: Pointer to store read value
371 * A value of zero will be returned on success, a negative errno will
372 * be returned in error cases.
374 int regmap_read(struct regmap
*map
, unsigned int reg
, unsigned int *val
)
378 mutex_lock(&map
->lock
);
380 ret
= _regmap_read(map
, reg
, val
);
382 mutex_unlock(&map
->lock
);
386 EXPORT_SYMBOL_GPL(regmap_read
);
389 * regmap_raw_read(): Read raw data from the device
391 * @map: Register map to write to
392 * @reg: First register to be read from
393 * @val: Pointer to store read value
394 * @val_len: Size of data to read
396 * A value of zero will be returned on success, a negative errno will
397 * be returned in error cases.
399 int regmap_raw_read(struct regmap
*map
, unsigned int reg
, void *val
,
404 mutex_lock(&map
->lock
);
406 ret
= _regmap_raw_read(map
, reg
, val
, val_len
);
408 mutex_unlock(&map
->lock
);
412 EXPORT_SYMBOL_GPL(regmap_raw_read
);
415 * regmap_bulk_read(): Read multiple registers from the device
417 * @map: Register map to write to
418 * @reg: First register to be read from
419 * @val: Pointer to store read value, in native register size for device
420 * @val_count: Number of registers to read
422 * A value of zero will be returned on success, a negative errno will
423 * be returned in error cases.
425 int regmap_bulk_read(struct regmap
*map
, unsigned int reg
, void *val
,
429 size_t val_bytes
= map
->format
.val_bytes
;
431 if (!map
->format
.parse_val
)
434 ret
= regmap_raw_read(map
, reg
, val
, val_bytes
* val_count
);
438 for (i
= 0; i
< val_count
* val_bytes
; i
+= val_bytes
)
439 map
->format
.parse_val(val
+ i
);
443 EXPORT_SYMBOL_GPL(regmap_bulk_read
);
446 * remap_update_bits: Perform a read/modify/write cycle on the register map
448 * @map: Register map to update
449 * @reg: Register to update
450 * @mask: Bitmask to change
451 * @val: New value for bitmask
453 * Returns zero for success, a negative number on error.
455 int regmap_update_bits(struct regmap
*map
, unsigned int reg
,
456 unsigned int mask
, unsigned int val
)
461 mutex_lock(&map
->lock
);
463 ret
= _regmap_read(map
, reg
, &tmp
);
470 ret
= _regmap_write(map
, reg
, tmp
);
473 mutex_unlock(&map
->lock
);
477 EXPORT_SYMBOL_GPL(regmap_update_bits
);
479 static int __init
regmap_initcall(void)
481 regmap_debugfs_initcall();
485 postcore_initcall(regmap_initcall
);
This page took 0.120424 seconds and 6 git commands to generate.