]> git.proxmox.com Git - mirror_ubuntu-zesty-kernel.git/blame - drivers/base/regmap/regmap.c
regmap: Rejig struct declarations for stubbed API
[mirror_ubuntu-zesty-kernel.git] / drivers / base / regmap / regmap.c
CommitLineData
b83a313b
MB
1/*
2 * Register map access API
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#include <linux/slab.h>
19694b5e 14#include <linux/export.h>
b83a313b
MB
15#include <linux/mutex.h>
16#include <linux/err.h>
17
fb2736bb
MB
18#define CREATE_TRACE_POINTS
19#include <trace/events/regmap.h>
20
93de9124 21#include "internal.h"
b83a313b 22
8de2f081
MB
23bool regmap_writeable(struct regmap *map, unsigned int reg)
24{
25 if (map->max_register && reg > map->max_register)
26 return false;
27
28 if (map->writeable_reg)
29 return map->writeable_reg(map->dev, reg);
30
31 return true;
32}
33
34bool regmap_readable(struct regmap *map, unsigned int reg)
35{
36 if (map->max_register && reg > map->max_register)
37 return false;
38
4191f197
WS
39 if (map->format.format_write)
40 return false;
41
8de2f081
MB
42 if (map->readable_reg)
43 return map->readable_reg(map->dev, reg);
44
45 return true;
46}
47
48bool regmap_volatile(struct regmap *map, unsigned int reg)
49{
4191f197 50 if (!regmap_readable(map, reg))
8de2f081
MB
51 return false;
52
53 if (map->volatile_reg)
54 return map->volatile_reg(map->dev, reg);
55
56 return true;
57}
58
59bool regmap_precious(struct regmap *map, unsigned int reg)
60{
4191f197 61 if (!regmap_readable(map, reg))
8de2f081
MB
62 return false;
63
64 if (map->precious_reg)
65 return map->precious_reg(map->dev, reg);
66
67 return false;
68}
69
82cd9965
LPC
70static bool regmap_volatile_range(struct regmap *map, unsigned int reg,
71 unsigned int num)
72{
73 unsigned int i;
74
75 for (i = 0; i < num; i++)
76 if (!regmap_volatile(map, reg + i))
77 return false;
78
79 return true;
80}
81
9aa50750
WS
82static void regmap_format_2_6_write(struct regmap *map,
83 unsigned int reg, unsigned int val)
84{
85 u8 *out = map->work_buf;
86
87 *out = (reg << 6) | val;
88}
89
b83a313b
MB
90static void regmap_format_4_12_write(struct regmap *map,
91 unsigned int reg, unsigned int val)
92{
93 __be16 *out = map->work_buf;
94 *out = cpu_to_be16((reg << 12) | val);
95}
96
97static void regmap_format_7_9_write(struct regmap *map,
98 unsigned int reg, unsigned int val)
99{
100 __be16 *out = map->work_buf;
101 *out = cpu_to_be16((reg << 9) | val);
102}
103
7e5ec63e
LPC
104static void regmap_format_10_14_write(struct regmap *map,
105 unsigned int reg, unsigned int val)
106{
107 u8 *out = map->work_buf;
108
109 out[2] = val;
110 out[1] = (val >> 8) | (reg << 6);
111 out[0] = reg >> 2;
112}
113
b83a313b
MB
114static void regmap_format_8(void *buf, unsigned int val)
115{
116 u8 *b = buf;
117
118 b[0] = val;
119}
120
121static void regmap_format_16(void *buf, unsigned int val)
122{
123 __be16 *b = buf;
124
125 b[0] = cpu_to_be16(val);
126}
127
7d5e525b
MB
128static void regmap_format_32(void *buf, unsigned int val)
129{
130 __be32 *b = buf;
131
132 b[0] = cpu_to_be32(val);
133}
134
b83a313b
MB
135static unsigned int regmap_parse_8(void *buf)
136{
137 u8 *b = buf;
138
139 return b[0];
140}
141
142static unsigned int regmap_parse_16(void *buf)
143{
144 __be16 *b = buf;
145
146 b[0] = be16_to_cpu(b[0]);
147
148 return b[0];
149}
150
7d5e525b
MB
151static unsigned int regmap_parse_32(void *buf)
152{
153 __be32 *b = buf;
154
155 b[0] = be32_to_cpu(b[0]);
156
157 return b[0];
158}
159
b83a313b
MB
160/**
161 * regmap_init(): Initialise register map
162 *
163 * @dev: Device that will be interacted with
164 * @bus: Bus-specific callbacks to use with device
165 * @config: Configuration for register map
166 *
167 * The return value will be an ERR_PTR() on error or a valid pointer to
168 * a struct regmap. This function should generally not be called
169 * directly, it should be called by bus-specific init functions.
170 */
171struct regmap *regmap_init(struct device *dev,
172 const struct regmap_bus *bus,
173 const struct regmap_config *config)
174{
175 struct regmap *map;
176 int ret = -EINVAL;
177
178 if (!bus || !config)
abbb18fb 179 goto err;
b83a313b
MB
180
181 map = kzalloc(sizeof(*map), GFP_KERNEL);
182 if (map == NULL) {
183 ret = -ENOMEM;
184 goto err;
185 }
186
187 mutex_init(&map->lock);
188 map->format.buf_size = (config->reg_bits + config->val_bits) / 8;
c212accc 189 map->format.reg_bytes = DIV_ROUND_UP(config->reg_bits, 8);
82159ba8 190 map->format.pad_bytes = config->pad_bits / 8;
c212accc 191 map->format.val_bytes = DIV_ROUND_UP(config->val_bits, 8);
82159ba8 192 map->format.buf_size += map->format.pad_bytes;
b83a313b
MB
193 map->dev = dev;
194 map->bus = bus;
2e2ae66d
MB
195 map->max_register = config->max_register;
196 map->writeable_reg = config->writeable_reg;
197 map->readable_reg = config->readable_reg;
198 map->volatile_reg = config->volatile_reg;
2efe1642 199 map->precious_reg = config->precious_reg;
5d1729e7 200 map->cache_type = config->cache_type;
b83a313b 201
6f306441
LPC
202 if (config->read_flag_mask || config->write_flag_mask) {
203 map->read_flag_mask = config->read_flag_mask;
204 map->write_flag_mask = config->write_flag_mask;
205 } else {
206 map->read_flag_mask = bus->read_flag_mask;
207 }
208
b83a313b 209 switch (config->reg_bits) {
9aa50750
WS
210 case 2:
211 switch (config->val_bits) {
212 case 6:
213 map->format.format_write = regmap_format_2_6_write;
214 break;
215 default:
216 goto err_map;
217 }
218 break;
219
b83a313b
MB
220 case 4:
221 switch (config->val_bits) {
222 case 12:
223 map->format.format_write = regmap_format_4_12_write;
224 break;
225 default:
226 goto err_map;
227 }
228 break;
229
230 case 7:
231 switch (config->val_bits) {
232 case 9:
233 map->format.format_write = regmap_format_7_9_write;
234 break;
235 default:
236 goto err_map;
237 }
238 break;
239
7e5ec63e
LPC
240 case 10:
241 switch (config->val_bits) {
242 case 14:
243 map->format.format_write = regmap_format_10_14_write;
244 break;
245 default:
246 goto err_map;
247 }
248 break;
249
b83a313b
MB
250 case 8:
251 map->format.format_reg = regmap_format_8;
252 break;
253
254 case 16:
255 map->format.format_reg = regmap_format_16;
256 break;
257
7d5e525b
MB
258 case 32:
259 map->format.format_reg = regmap_format_32;
260 break;
261
b83a313b
MB
262 default:
263 goto err_map;
264 }
265
266 switch (config->val_bits) {
267 case 8:
268 map->format.format_val = regmap_format_8;
269 map->format.parse_val = regmap_parse_8;
270 break;
271 case 16:
272 map->format.format_val = regmap_format_16;
273 map->format.parse_val = regmap_parse_16;
274 break;
7d5e525b
MB
275 case 32:
276 map->format.format_val = regmap_format_32;
277 map->format.parse_val = regmap_parse_32;
278 break;
b83a313b
MB
279 }
280
281 if (!map->format.format_write &&
282 !(map->format.format_reg && map->format.format_val))
283 goto err_map;
284
82159ba8 285 map->work_buf = kzalloc(map->format.buf_size, GFP_KERNEL);
b83a313b
MB
286 if (map->work_buf == NULL) {
287 ret = -ENOMEM;
5204f5e3 288 goto err_map;
b83a313b
MB
289 }
290
052d2cd1
MB
291 regmap_debugfs_init(map);
292
e5e3b8ab 293 ret = regcache_init(map, config);
5d1729e7 294 if (ret < 0)
58072cbf 295 goto err_free_workbuf;
5d1729e7 296
b83a313b
MB
297 return map;
298
58072cbf
LPC
299err_free_workbuf:
300 kfree(map->work_buf);
b83a313b
MB
301err_map:
302 kfree(map);
303err:
304 return ERR_PTR(ret);
305}
306EXPORT_SYMBOL_GPL(regmap_init);
307
bf315173
MB
308/**
309 * regmap_reinit_cache(): Reinitialise the current register cache
310 *
311 * @map: Register map to operate on.
312 * @config: New configuration. Only the cache data will be used.
313 *
314 * Discard any existing register cache for the map and initialize a
315 * new cache. This can be used to restore the cache to defaults or to
316 * update the cache configuration to reflect runtime discovery of the
317 * hardware.
318 */
319int regmap_reinit_cache(struct regmap *map, const struct regmap_config *config)
320{
321 int ret;
322
323 mutex_lock(&map->lock);
324
325 regcache_exit(map);
a24f64a6 326 regmap_debugfs_exit(map);
bf315173
MB
327
328 map->max_register = config->max_register;
329 map->writeable_reg = config->writeable_reg;
330 map->readable_reg = config->readable_reg;
331 map->volatile_reg = config->volatile_reg;
332 map->precious_reg = config->precious_reg;
333 map->cache_type = config->cache_type;
334
a24f64a6
MB
335 regmap_debugfs_init(map);
336
bf315173
MB
337 ret = regcache_init(map, config);
338
339 mutex_unlock(&map->lock);
340
341 return ret;
342}
343
b83a313b
MB
344/**
345 * regmap_exit(): Free a previously allocated register map
346 */
347void regmap_exit(struct regmap *map)
348{
5d1729e7 349 regcache_exit(map);
31244e39 350 regmap_debugfs_exit(map);
b83a313b 351 kfree(map->work_buf);
b83a313b
MB
352 kfree(map);
353}
354EXPORT_SYMBOL_GPL(regmap_exit);
355
356static int _regmap_raw_write(struct regmap *map, unsigned int reg,
357 const void *val, size_t val_len)
358{
6f306441 359 u8 *u8 = map->work_buf;
b83a313b
MB
360 void *buf;
361 int ret = -ENOTSUPP;
362 size_t len;
73304781
MB
363 int i;
364
365 /* Check for unwritable registers before we start */
366 if (map->writeable_reg)
367 for (i = 0; i < val_len / map->format.val_bytes; i++)
368 if (!map->writeable_reg(map->dev, reg + i))
369 return -EINVAL;
b83a313b
MB
370
371 map->format.format_reg(map->work_buf, reg);
372
6f306441
LPC
373 u8[0] |= map->write_flag_mask;
374
fb2736bb
MB
375 trace_regmap_hw_write_start(map->dev, reg,
376 val_len / map->format.val_bytes);
377
2547e201
MB
378 /* If we're doing a single register write we can probably just
379 * send the work_buf directly, otherwise try to do a gather
380 * write.
381 */
82159ba8
MB
382 if (val == (map->work_buf + map->format.pad_bytes +
383 map->format.reg_bytes))
2547e201 384 ret = map->bus->write(map->dev, map->work_buf,
82159ba8
MB
385 map->format.reg_bytes +
386 map->format.pad_bytes +
387 val_len);
2547e201 388 else if (map->bus->gather_write)
b83a313b 389 ret = map->bus->gather_write(map->dev, map->work_buf,
82159ba8
MB
390 map->format.reg_bytes +
391 map->format.pad_bytes,
b83a313b
MB
392 val, val_len);
393
2547e201 394 /* If that didn't work fall back on linearising by hand. */
b83a313b 395 if (ret == -ENOTSUPP) {
82159ba8
MB
396 len = map->format.reg_bytes + map->format.pad_bytes + val_len;
397 buf = kzalloc(len, GFP_KERNEL);
b83a313b
MB
398 if (!buf)
399 return -ENOMEM;
400
401 memcpy(buf, map->work_buf, map->format.reg_bytes);
82159ba8
MB
402 memcpy(buf + map->format.reg_bytes + map->format.pad_bytes,
403 val, val_len);
b83a313b
MB
404 ret = map->bus->write(map->dev, buf, len);
405
406 kfree(buf);
407 }
408
fb2736bb
MB
409 trace_regmap_hw_write_done(map->dev, reg,
410 val_len / map->format.val_bytes);
411
b83a313b
MB
412 return ret;
413}
414
4d2dc095
DP
415int _regmap_write(struct regmap *map, unsigned int reg,
416 unsigned int val)
b83a313b 417{
fb2736bb 418 int ret;
b83a313b
MB
419 BUG_ON(!map->format.format_write && !map->format.format_val);
420
5d1729e7
DP
421 if (!map->cache_bypass) {
422 ret = regcache_write(map, reg, val);
423 if (ret != 0)
424 return ret;
8ae0d7e8
MB
425 if (map->cache_only) {
426 map->cache_dirty = true;
5d1729e7 427 return 0;
8ae0d7e8 428 }
5d1729e7
DP
429 }
430
fb2736bb
MB
431 trace_regmap_reg_write(map->dev, reg, val);
432
b83a313b
MB
433 if (map->format.format_write) {
434 map->format.format_write(map, reg, val);
435
fb2736bb
MB
436 trace_regmap_hw_write_start(map->dev, reg, 1);
437
438 ret = map->bus->write(map->dev, map->work_buf,
439 map->format.buf_size);
440
441 trace_regmap_hw_write_done(map->dev, reg, 1);
442
443 return ret;
b83a313b 444 } else {
82159ba8
MB
445 map->format.format_val(map->work_buf + map->format.reg_bytes
446 + map->format.pad_bytes, val);
b83a313b 447 return _regmap_raw_write(map, reg,
82159ba8
MB
448 map->work_buf +
449 map->format.reg_bytes +
450 map->format.pad_bytes,
b83a313b
MB
451 map->format.val_bytes);
452 }
453}
454
455/**
456 * regmap_write(): Write a value to a single register
457 *
458 * @map: Register map to write to
459 * @reg: Register to write to
460 * @val: Value to be written
461 *
462 * A value of zero will be returned on success, a negative errno will
463 * be returned in error cases.
464 */
465int regmap_write(struct regmap *map, unsigned int reg, unsigned int val)
466{
467 int ret;
468
469 mutex_lock(&map->lock);
470
471 ret = _regmap_write(map, reg, val);
472
473 mutex_unlock(&map->lock);
474
475 return ret;
476}
477EXPORT_SYMBOL_GPL(regmap_write);
478
479/**
480 * regmap_raw_write(): Write raw values to one or more registers
481 *
482 * @map: Register map to write to
483 * @reg: Initial register to write to
484 * @val: Block of data to be written, laid out for direct transmission to the
485 * device
486 * @val_len: Length of data pointed to by val.
487 *
488 * This function is intended to be used for things like firmware
489 * download where a large block of data needs to be transferred to the
490 * device. No formatting will be done on the data provided.
491 *
492 * A value of zero will be returned on success, a negative errno will
493 * be returned in error cases.
494 */
495int regmap_raw_write(struct regmap *map, unsigned int reg,
496 const void *val, size_t val_len)
497{
c48a9d74 498 size_t val_count = val_len / map->format.val_bytes;
b83a313b
MB
499 int ret;
500
c48a9d74
LPC
501 WARN_ON(!regmap_volatile_range(map, reg, val_count) &&
502 map->cache_type != REGCACHE_NONE);
04e016ad 503
b83a313b
MB
504 mutex_lock(&map->lock);
505
506 ret = _regmap_raw_write(map, reg, val, val_len);
507
508 mutex_unlock(&map->lock);
509
510 return ret;
511}
512EXPORT_SYMBOL_GPL(regmap_raw_write);
513
514static int _regmap_raw_read(struct regmap *map, unsigned int reg, void *val,
515 unsigned int val_len)
516{
517 u8 *u8 = map->work_buf;
518 int ret;
519
520 map->format.format_reg(map->work_buf, reg);
521
522 /*
6f306441 523 * Some buses or devices flag reads by setting the high bits in the
b83a313b
MB
524 * register addresss; since it's always the high bits for all
525 * current formats we can do this here rather than in
526 * formatting. This may break if we get interesting formats.
527 */
6f306441 528 u8[0] |= map->read_flag_mask;
b83a313b 529
fb2736bb
MB
530 trace_regmap_hw_read_start(map->dev, reg,
531 val_len / map->format.val_bytes);
532
82159ba8
MB
533 ret = map->bus->read(map->dev, map->work_buf,
534 map->format.reg_bytes + map->format.pad_bytes,
40c5cc26 535 val, val_len);
b83a313b 536
fb2736bb
MB
537 trace_regmap_hw_read_done(map->dev, reg,
538 val_len / map->format.val_bytes);
539
540 return ret;
b83a313b
MB
541}
542
543static int _regmap_read(struct regmap *map, unsigned int reg,
544 unsigned int *val)
545{
546 int ret;
547
5d1729e7
DP
548 if (!map->cache_bypass) {
549 ret = regcache_read(map, reg, val);
550 if (ret == 0)
551 return 0;
552 }
553
19254411
LPC
554 if (!map->format.parse_val)
555 return -EINVAL;
556
5d1729e7
DP
557 if (map->cache_only)
558 return -EBUSY;
559
b83a313b 560 ret = _regmap_raw_read(map, reg, map->work_buf, map->format.val_bytes);
fb2736bb 561 if (ret == 0) {
b83a313b 562 *val = map->format.parse_val(map->work_buf);
fb2736bb
MB
563 trace_regmap_reg_read(map->dev, reg, *val);
564 }
b83a313b
MB
565
566 return ret;
567}
568
569/**
570 * regmap_read(): Read a value from a single register
571 *
572 * @map: Register map to write to
573 * @reg: Register to be read from
574 * @val: Pointer to store read value
575 *
576 * A value of zero will be returned on success, a negative errno will
577 * be returned in error cases.
578 */
579int regmap_read(struct regmap *map, unsigned int reg, unsigned int *val)
580{
581 int ret;
582
583 mutex_lock(&map->lock);
584
585 ret = _regmap_read(map, reg, val);
586
587 mutex_unlock(&map->lock);
588
589 return ret;
590}
591EXPORT_SYMBOL_GPL(regmap_read);
592
593/**
594 * regmap_raw_read(): Read raw data from the device
595 *
596 * @map: Register map to write to
597 * @reg: First register to be read from
598 * @val: Pointer to store read value
599 * @val_len: Size of data to read
600 *
601 * A value of zero will be returned on success, a negative errno will
602 * be returned in error cases.
603 */
604int regmap_raw_read(struct regmap *map, unsigned int reg, void *val,
605 size_t val_len)
606{
b8fb5ab1
MB
607 size_t val_bytes = map->format.val_bytes;
608 size_t val_count = val_len / val_bytes;
609 unsigned int v;
610 int ret, i;
04e016ad 611
b83a313b
MB
612 mutex_lock(&map->lock);
613
b8fb5ab1
MB
614 if (regmap_volatile_range(map, reg, val_count) || map->cache_bypass ||
615 map->cache_type == REGCACHE_NONE) {
616 /* Physical block read if there's no cache involved */
617 ret = _regmap_raw_read(map, reg, val, val_len);
618
619 } else {
620 /* Otherwise go word by word for the cache; should be low
621 * cost as we expect to hit the cache.
622 */
623 for (i = 0; i < val_count; i++) {
624 ret = _regmap_read(map, reg + i, &v);
625 if (ret != 0)
626 goto out;
627
628 map->format.format_val(val + (i * val_bytes), v);
629 }
630 }
b83a313b 631
b8fb5ab1 632 out:
b83a313b
MB
633 mutex_unlock(&map->lock);
634
635 return ret;
636}
637EXPORT_SYMBOL_GPL(regmap_raw_read);
638
639/**
640 * regmap_bulk_read(): Read multiple registers from the device
641 *
642 * @map: Register map to write to
643 * @reg: First register to be read from
644 * @val: Pointer to store read value, in native register size for device
645 * @val_count: Number of registers to read
646 *
647 * A value of zero will be returned on success, a negative errno will
648 * be returned in error cases.
649 */
650int regmap_bulk_read(struct regmap *map, unsigned int reg, void *val,
651 size_t val_count)
652{
653 int ret, i;
654 size_t val_bytes = map->format.val_bytes;
82cd9965 655 bool vol = regmap_volatile_range(map, reg, val_count);
5d1729e7 656
b83a313b
MB
657 if (!map->format.parse_val)
658 return -EINVAL;
659
de2d808f
MB
660 if (vol || map->cache_type == REGCACHE_NONE) {
661 ret = regmap_raw_read(map, reg, val, val_bytes * val_count);
662 if (ret != 0)
663 return ret;
664
665 for (i = 0; i < val_count * val_bytes; i += val_bytes)
666 map->format.parse_val(val + i);
667 } else {
668 for (i = 0; i < val_count; i++) {
669 ret = regmap_read(map, reg + i, val + (i * val_bytes));
670 if (ret != 0)
671 return ret;
672 }
673 }
b83a313b
MB
674
675 return 0;
676}
677EXPORT_SYMBOL_GPL(regmap_bulk_read);
678
018690d3
MB
679static int _regmap_update_bits(struct regmap *map, unsigned int reg,
680 unsigned int mask, unsigned int val,
681 bool *change)
b83a313b
MB
682{
683 int ret;
d91e8db2 684 unsigned int tmp, orig;
b83a313b
MB
685
686 mutex_lock(&map->lock);
687
d91e8db2 688 ret = _regmap_read(map, reg, &orig);
b83a313b
MB
689 if (ret != 0)
690 goto out;
691
d91e8db2 692 tmp = orig & ~mask;
b83a313b
MB
693 tmp |= val & mask;
694
018690d3 695 if (tmp != orig) {
d91e8db2 696 ret = _regmap_write(map, reg, tmp);
018690d3
MB
697 *change = true;
698 } else {
699 *change = false;
700 }
b83a313b
MB
701
702out:
703 mutex_unlock(&map->lock);
704
705 return ret;
706}
018690d3
MB
707
708/**
709 * regmap_update_bits: Perform a read/modify/write cycle on the register map
710 *
711 * @map: Register map to update
712 * @reg: Register to update
713 * @mask: Bitmask to change
714 * @val: New value for bitmask
715 *
716 * Returns zero for success, a negative number on error.
717 */
718int regmap_update_bits(struct regmap *map, unsigned int reg,
719 unsigned int mask, unsigned int val)
720{
721 bool change;
722 return _regmap_update_bits(map, reg, mask, val, &change);
723}
b83a313b 724EXPORT_SYMBOL_GPL(regmap_update_bits);
31244e39 725
018690d3
MB
726/**
727 * regmap_update_bits_check: Perform a read/modify/write cycle on the
728 * register map and report if updated
729 *
730 * @map: Register map to update
731 * @reg: Register to update
732 * @mask: Bitmask to change
733 * @val: New value for bitmask
734 * @change: Boolean indicating if a write was done
735 *
736 * Returns zero for success, a negative number on error.
737 */
738int regmap_update_bits_check(struct regmap *map, unsigned int reg,
739 unsigned int mask, unsigned int val,
740 bool *change)
741{
742 return _regmap_update_bits(map, reg, mask, val, change);
743}
744EXPORT_SYMBOL_GPL(regmap_update_bits_check);
745
31244e39
MB
746static int __init regmap_initcall(void)
747{
748 regmap_debugfs_initcall();
749
750 return 0;
751}
752postcore_initcall(regmap_initcall);