blob: f8a937654af292e46401a15e25406e0295b85a01 [file] [log] [blame]
Mark Brownb83a3132011-05-11 19:59:58 +02001/*
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
Stephen Warrenf5d6eba2012-03-09 13:17:28 -070013#include <linux/device.h>
Mark Brownb83a3132011-05-11 19:59:58 +020014#include <linux/slab.h>
Paul Gortmaker19694b52012-02-28 19:28:02 -050015#include <linux/export.h>
Mark Brownb83a3132011-05-11 19:59:58 +020016#include <linux/mutex.h>
17#include <linux/err.h>
18
Mark Brownfb2736b2011-07-24 21:30:55 +010019#define CREATE_TRACE_POINTS
20#include <trace/events/regmap.h>
21
Mark Brown93de9122011-07-20 22:35:37 +010022#include "internal.h"
Mark Brownb83a3132011-05-11 19:59:58 +020023
Mark Brown1044c182012-07-06 14:10:23 +010024/*
25 * Sometimes for failures during very early init the trace
26 * infrastructure isn't available early enough to be used. For this
27 * sort of problem defining LOG_DEVICE will add printks for basic
28 * register I/O on a specific device.
29 */
30#undef LOG_DEVICE
31
32static int _regmap_update_bits(struct regmap *map, unsigned int reg,
33 unsigned int mask, unsigned int val,
34 bool *change);
35
Mark Brown8de2f082011-08-10 17:14:41 +090036bool regmap_writeable(struct regmap *map, unsigned int reg)
37{
38 if (map->max_register && reg > map->max_register)
39 return false;
40
41 if (map->writeable_reg)
42 return map->writeable_reg(map->dev, reg);
43
44 return true;
45}
46
47bool regmap_readable(struct regmap *map, unsigned int reg)
48{
49 if (map->max_register && reg > map->max_register)
50 return false;
51
Wolfram Sang4191f192012-01-30 15:08:16 +010052 if (map->format.format_write)
53 return false;
54
Mark Brown8de2f082011-08-10 17:14:41 +090055 if (map->readable_reg)
56 return map->readable_reg(map->dev, reg);
57
58 return true;
59}
60
61bool regmap_volatile(struct regmap *map, unsigned int reg)
62{
Wolfram Sang4191f192012-01-30 15:08:16 +010063 if (!regmap_readable(map, reg))
Mark Brown8de2f082011-08-10 17:14:41 +090064 return false;
65
66 if (map->volatile_reg)
67 return map->volatile_reg(map->dev, reg);
68
69 return true;
70}
71
72bool regmap_precious(struct regmap *map, unsigned int reg)
73{
Wolfram Sang4191f192012-01-30 15:08:16 +010074 if (!regmap_readable(map, reg))
Mark Brown8de2f082011-08-10 17:14:41 +090075 return false;
76
77 if (map->precious_reg)
78 return map->precious_reg(map->dev, reg);
79
80 return false;
81}
82
Lars-Peter Clausen82cd9962011-11-08 18:37:25 +010083static bool regmap_volatile_range(struct regmap *map, unsigned int reg,
84 unsigned int num)
85{
86 unsigned int i;
87
88 for (i = 0; i < num; i++)
89 if (!regmap_volatile(map, reg + i))
90 return false;
91
92 return true;
93}
94
Wolfram Sang9aa50752012-01-27 16:10:22 +010095static void regmap_format_2_6_write(struct regmap *map,
96 unsigned int reg, unsigned int val)
97{
98 u8 *out = map->work_buf;
99
100 *out = (reg << 6) | val;
101}
102
Mark Brownb83a3132011-05-11 19:59:58 +0200103static void regmap_format_4_12_write(struct regmap *map,
104 unsigned int reg, unsigned int val)
105{
106 __be16 *out = map->work_buf;
107 *out = cpu_to_be16((reg << 12) | val);
108}
109
110static void regmap_format_7_9_write(struct regmap *map,
111 unsigned int reg, unsigned int val)
112{
113 __be16 *out = map->work_buf;
114 *out = cpu_to_be16((reg << 9) | val);
115}
116
Lars-Peter Clausen7e5ec632011-11-16 16:28:21 +0100117static void regmap_format_10_14_write(struct regmap *map,
118 unsigned int reg, unsigned int val)
119{
120 u8 *out = map->work_buf;
121
122 out[2] = val;
123 out[1] = (val >> 8) | (reg << 6);
124 out[0] = reg >> 2;
125}
126
Marc Reillyd939fb92012-03-16 12:11:43 +1100127static void regmap_format_8(void *buf, unsigned int val, unsigned int shift)
Mark Brownb83a3132011-05-11 19:59:58 +0200128{
129 u8 *b = buf;
130
Marc Reillyd939fb92012-03-16 12:11:43 +1100131 b[0] = val << shift;
Mark Brownb83a3132011-05-11 19:59:58 +0200132}
133
Stephen Warren141eba22012-05-24 10:47:26 -0600134static void regmap_format_16_be(void *buf, unsigned int val, unsigned int shift)
Mark Brownb83a3132011-05-11 19:59:58 +0200135{
136 __be16 *b = buf;
137
Marc Reillyd939fb92012-03-16 12:11:43 +1100138 b[0] = cpu_to_be16(val << shift);
Mark Brownb83a3132011-05-11 19:59:58 +0200139}
140
Stephen Warren141eba22012-05-24 10:47:26 -0600141static void regmap_format_16_native(void *buf, unsigned int val,
142 unsigned int shift)
143{
144 *(u16 *)buf = val << shift;
145}
146
Marc Reillyd939fb92012-03-16 12:11:43 +1100147static void regmap_format_24(void *buf, unsigned int val, unsigned int shift)
Marc Reillyea279fc2012-03-16 12:11:42 +1100148{
149 u8 *b = buf;
150
Marc Reillyd939fb92012-03-16 12:11:43 +1100151 val <<= shift;
152
Marc Reillyea279fc2012-03-16 12:11:42 +1100153 b[0] = val >> 16;
154 b[1] = val >> 8;
155 b[2] = val;
156}
157
Stephen Warren141eba22012-05-24 10:47:26 -0600158static void regmap_format_32_be(void *buf, unsigned int val, unsigned int shift)
Mark Brown7d5e5252012-02-17 15:58:25 -0800159{
160 __be32 *b = buf;
161
Marc Reillyd939fb92012-03-16 12:11:43 +1100162 b[0] = cpu_to_be32(val << shift);
Mark Brown7d5e5252012-02-17 15:58:25 -0800163}
164
Stephen Warren141eba22012-05-24 10:47:26 -0600165static void regmap_format_32_native(void *buf, unsigned int val,
166 unsigned int shift)
167{
168 *(u32 *)buf = val << shift;
169}
170
Mark Brownb83a3132011-05-11 19:59:58 +0200171static unsigned int regmap_parse_8(void *buf)
172{
173 u8 *b = buf;
174
175 return b[0];
176}
177
Stephen Warren141eba22012-05-24 10:47:26 -0600178static unsigned int regmap_parse_16_be(void *buf)
Mark Brownb83a3132011-05-11 19:59:58 +0200179{
180 __be16 *b = buf;
181
182 b[0] = be16_to_cpu(b[0]);
183
184 return b[0];
185}
186
Stephen Warren141eba22012-05-24 10:47:26 -0600187static unsigned int regmap_parse_16_native(void *buf)
188{
189 return *(u16 *)buf;
190}
191
Marc Reillyea279fc2012-03-16 12:11:42 +1100192static unsigned int regmap_parse_24(void *buf)
193{
194 u8 *b = buf;
195 unsigned int ret = b[2];
196 ret |= ((unsigned int)b[1]) << 8;
197 ret |= ((unsigned int)b[0]) << 16;
198
199 return ret;
200}
201
Stephen Warren141eba22012-05-24 10:47:26 -0600202static unsigned int regmap_parse_32_be(void *buf)
Mark Brown7d5e5252012-02-17 15:58:25 -0800203{
204 __be32 *b = buf;
205
206 b[0] = be32_to_cpu(b[0]);
207
208 return b[0];
209}
210
Stephen Warren141eba22012-05-24 10:47:26 -0600211static unsigned int regmap_parse_32_native(void *buf)
212{
213 return *(u32 *)buf;
214}
215
Stephen Warrenbacdbe02012-04-04 15:48:28 -0600216static void regmap_lock_mutex(struct regmap *map)
217{
218 mutex_lock(&map->mutex);
219}
220
221static void regmap_unlock_mutex(struct regmap *map)
222{
223 mutex_unlock(&map->mutex);
224}
225
226static void regmap_lock_spinlock(struct regmap *map)
227{
228 spin_lock(&map->spinlock);
229}
230
231static void regmap_unlock_spinlock(struct regmap *map)
232{
233 spin_unlock(&map->spinlock);
234}
235
Mark Brown72b39f62012-05-08 17:44:40 +0100236static void dev_get_regmap_release(struct device *dev, void *res)
237{
238 /*
239 * We don't actually have anything to do here; the goal here
240 * is not to manage the regmap but to provide a simple way to
241 * get the regmap back given a struct device.
242 */
243}
244
Mark Brownb83a3132011-05-11 19:59:58 +0200245/**
246 * regmap_init(): Initialise register map
247 *
248 * @dev: Device that will be interacted with
249 * @bus: Bus-specific callbacks to use with device
Stephen Warren0135bbc2012-04-04 15:48:30 -0600250 * @bus_context: Data passed to bus-specific callbacks
Mark Brownb83a3132011-05-11 19:59:58 +0200251 * @config: Configuration for register map
252 *
253 * The return value will be an ERR_PTR() on error or a valid pointer to
254 * a struct regmap. This function should generally not be called
255 * directly, it should be called by bus-specific init functions.
256 */
257struct regmap *regmap_init(struct device *dev,
258 const struct regmap_bus *bus,
Stephen Warren0135bbc2012-04-04 15:48:30 -0600259 void *bus_context,
Mark Brownb83a3132011-05-11 19:59:58 +0200260 const struct regmap_config *config)
261{
Mark Brown72b39f62012-05-08 17:44:40 +0100262 struct regmap *map, **m;
Mark Brownb83a3132011-05-11 19:59:58 +0200263 int ret = -EINVAL;
Stephen Warren141eba22012-05-24 10:47:26 -0600264 enum regmap_endian reg_endian, val_endian;
Mark Brownb83a3132011-05-11 19:59:58 +0200265
266 if (!bus || !config)
Lars-Peter Clausenabbb18f2011-11-14 10:40:15 +0100267 goto err;
Mark Brownb83a3132011-05-11 19:59:58 +0200268
269 map = kzalloc(sizeof(*map), GFP_KERNEL);
270 if (map == NULL) {
271 ret = -ENOMEM;
272 goto err;
273 }
274
Stephen Warrenbacdbe02012-04-04 15:48:28 -0600275 if (bus->fast_io) {
276 spin_lock_init(&map->spinlock);
277 map->lock = regmap_lock_spinlock;
278 map->unlock = regmap_unlock_spinlock;
279 } else {
280 mutex_init(&map->mutex);
281 map->lock = regmap_lock_mutex;
282 map->unlock = regmap_unlock_mutex;
283 }
Mark Brownb83a3132011-05-11 19:59:58 +0200284 map->format.buf_size = (config->reg_bits + config->val_bits) / 8;
Wolfram Sangc212acc2012-01-28 02:16:41 +0100285 map->format.reg_bytes = DIV_ROUND_UP(config->reg_bits, 8);
Mark Brown82159ba2012-01-18 10:52:25 +0000286 map->format.pad_bytes = config->pad_bits / 8;
Wolfram Sangc212acc2012-01-28 02:16:41 +0100287 map->format.val_bytes = DIV_ROUND_UP(config->val_bits, 8);
Mark Brown82159ba2012-01-18 10:52:25 +0000288 map->format.buf_size += map->format.pad_bytes;
Marc Reillyd939fb92012-03-16 12:11:43 +1100289 map->reg_shift = config->pad_bits % 8;
Stephen Warrenf01ee602012-04-09 13:40:24 -0600290 if (config->reg_stride)
291 map->reg_stride = config->reg_stride;
292 else
293 map->reg_stride = 1;
Ashish Jangam2e33caf2012-04-30 23:23:40 +0100294 map->use_single_rw = config->use_single_rw;
Mark Brownb83a3132011-05-11 19:59:58 +0200295 map->dev = dev;
296 map->bus = bus;
Stephen Warren0135bbc2012-04-04 15:48:30 -0600297 map->bus_context = bus_context;
Mark Brown2e2ae662011-07-20 22:33:39 +0100298 map->max_register = config->max_register;
299 map->writeable_reg = config->writeable_reg;
300 map->readable_reg = config->readable_reg;
301 map->volatile_reg = config->volatile_reg;
Mark Brown2efe1642011-08-08 15:41:46 +0900302 map->precious_reg = config->precious_reg;
Dimitris Papastamos5d1729e2011-09-19 14:34:05 +0100303 map->cache_type = config->cache_type;
Mark Brown72b39f62012-05-08 17:44:40 +0100304 map->name = config->name;
Mark Brownb83a3132011-05-11 19:59:58 +0200305
Lars-Peter Clausen6f306442011-09-05 20:46:32 +0200306 if (config->read_flag_mask || config->write_flag_mask) {
307 map->read_flag_mask = config->read_flag_mask;
308 map->write_flag_mask = config->write_flag_mask;
309 } else {
310 map->read_flag_mask = bus->read_flag_mask;
311 }
312
Stephen Warren141eba22012-05-24 10:47:26 -0600313 reg_endian = config->reg_format_endian;
314 if (reg_endian == REGMAP_ENDIAN_DEFAULT)
315 reg_endian = bus->reg_format_endian_default;
316 if (reg_endian == REGMAP_ENDIAN_DEFAULT)
317 reg_endian = REGMAP_ENDIAN_BIG;
318
319 val_endian = config->val_format_endian;
320 if (val_endian == REGMAP_ENDIAN_DEFAULT)
321 val_endian = bus->val_format_endian_default;
322 if (val_endian == REGMAP_ENDIAN_DEFAULT)
323 val_endian = REGMAP_ENDIAN_BIG;
324
Marc Reillyd939fb92012-03-16 12:11:43 +1100325 switch (config->reg_bits + map->reg_shift) {
Wolfram Sang9aa50752012-01-27 16:10:22 +0100326 case 2:
327 switch (config->val_bits) {
328 case 6:
329 map->format.format_write = regmap_format_2_6_write;
330 break;
331 default:
332 goto err_map;
333 }
334 break;
335
Mark Brownb83a3132011-05-11 19:59:58 +0200336 case 4:
337 switch (config->val_bits) {
338 case 12:
339 map->format.format_write = regmap_format_4_12_write;
340 break;
341 default:
342 goto err_map;
343 }
344 break;
345
346 case 7:
347 switch (config->val_bits) {
348 case 9:
349 map->format.format_write = regmap_format_7_9_write;
350 break;
351 default:
352 goto err_map;
353 }
354 break;
355
Lars-Peter Clausen7e5ec632011-11-16 16:28:21 +0100356 case 10:
357 switch (config->val_bits) {
358 case 14:
359 map->format.format_write = regmap_format_10_14_write;
360 break;
361 default:
362 goto err_map;
363 }
364 break;
365
Mark Brownb83a3132011-05-11 19:59:58 +0200366 case 8:
367 map->format.format_reg = regmap_format_8;
368 break;
369
370 case 16:
Stephen Warren141eba22012-05-24 10:47:26 -0600371 switch (reg_endian) {
372 case REGMAP_ENDIAN_BIG:
373 map->format.format_reg = regmap_format_16_be;
374 break;
375 case REGMAP_ENDIAN_NATIVE:
376 map->format.format_reg = regmap_format_16_native;
377 break;
378 default:
379 goto err_map;
380 }
Mark Brownb83a3132011-05-11 19:59:58 +0200381 break;
382
Mark Brown7d5e5252012-02-17 15:58:25 -0800383 case 32:
Stephen Warren141eba22012-05-24 10:47:26 -0600384 switch (reg_endian) {
385 case REGMAP_ENDIAN_BIG:
386 map->format.format_reg = regmap_format_32_be;
387 break;
388 case REGMAP_ENDIAN_NATIVE:
389 map->format.format_reg = regmap_format_32_native;
390 break;
391 default:
392 goto err_map;
393 }
Mark Brown7d5e5252012-02-17 15:58:25 -0800394 break;
395
Mark Brownb83a3132011-05-11 19:59:58 +0200396 default:
397 goto err_map;
398 }
399
400 switch (config->val_bits) {
401 case 8:
402 map->format.format_val = regmap_format_8;
403 map->format.parse_val = regmap_parse_8;
404 break;
405 case 16:
Stephen Warren141eba22012-05-24 10:47:26 -0600406 switch (val_endian) {
407 case REGMAP_ENDIAN_BIG:
408 map->format.format_val = regmap_format_16_be;
409 map->format.parse_val = regmap_parse_16_be;
410 break;
411 case REGMAP_ENDIAN_NATIVE:
412 map->format.format_val = regmap_format_16_native;
413 map->format.parse_val = regmap_parse_16_native;
414 break;
415 default:
416 goto err_map;
417 }
Mark Brownb83a3132011-05-11 19:59:58 +0200418 break;
Marc Reillyea279fc2012-03-16 12:11:42 +1100419 case 24:
Stephen Warren141eba22012-05-24 10:47:26 -0600420 if (val_endian != REGMAP_ENDIAN_BIG)
421 goto err_map;
Marc Reillyea279fc2012-03-16 12:11:42 +1100422 map->format.format_val = regmap_format_24;
423 map->format.parse_val = regmap_parse_24;
424 break;
Mark Brown7d5e5252012-02-17 15:58:25 -0800425 case 32:
Stephen Warren141eba22012-05-24 10:47:26 -0600426 switch (val_endian) {
427 case REGMAP_ENDIAN_BIG:
428 map->format.format_val = regmap_format_32_be;
429 map->format.parse_val = regmap_parse_32_be;
430 break;
431 case REGMAP_ENDIAN_NATIVE:
432 map->format.format_val = regmap_format_32_native;
433 map->format.parse_val = regmap_parse_32_native;
434 break;
435 default:
436 goto err_map;
437 }
Mark Brown7d5e5252012-02-17 15:58:25 -0800438 break;
Mark Brownb83a3132011-05-11 19:59:58 +0200439 }
440
Stephen Warren141eba22012-05-24 10:47:26 -0600441 if (map->format.format_write) {
442 if ((reg_endian != REGMAP_ENDIAN_BIG) ||
443 (val_endian != REGMAP_ENDIAN_BIG))
444 goto err_map;
Mark Brown7a647612012-04-30 23:26:32 +0100445 map->use_single_rw = true;
Stephen Warren141eba22012-05-24 10:47:26 -0600446 }
Mark Brown7a647612012-04-30 23:26:32 +0100447
Mark Brownb83a3132011-05-11 19:59:58 +0200448 if (!map->format.format_write &&
449 !(map->format.format_reg && map->format.format_val))
450 goto err_map;
451
Mark Brown82159ba2012-01-18 10:52:25 +0000452 map->work_buf = kzalloc(map->format.buf_size, GFP_KERNEL);
Mark Brownb83a3132011-05-11 19:59:58 +0200453 if (map->work_buf == NULL) {
454 ret = -ENOMEM;
Mark Brown5204f5e2011-09-05 08:07:47 -0700455 goto err_map;
Mark Brownb83a3132011-05-11 19:59:58 +0200456 }
457
Stephen Warrend3c242e2012-04-04 15:48:29 -0600458 regmap_debugfs_init(map, config->name);
Mark Brown052d2cd2011-11-21 19:05:13 +0000459
Lars-Peter Clausene5e3b8a2011-11-16 16:28:16 +0100460 ret = regcache_init(map, config);
Dimitris Papastamos5d1729e2011-09-19 14:34:05 +0100461 if (ret < 0)
Lars-Peter Clausen58072cb2011-11-10 18:15:15 +0100462 goto err_free_workbuf;
Dimitris Papastamos5d1729e2011-09-19 14:34:05 +0100463
Mark Brown72b39f62012-05-08 17:44:40 +0100464 /* Add a devres resource for dev_get_regmap() */
465 m = devres_alloc(dev_get_regmap_release, sizeof(*m), GFP_KERNEL);
466 if (!m) {
467 ret = -ENOMEM;
468 goto err_cache;
469 }
470 *m = map;
471 devres_add(dev, m);
472
Mark Brownb83a3132011-05-11 19:59:58 +0200473 return map;
474
Mark Brown72b39f62012-05-08 17:44:40 +0100475err_cache:
476 regcache_exit(map);
Lars-Peter Clausen58072cb2011-11-10 18:15:15 +0100477err_free_workbuf:
478 kfree(map->work_buf);
Mark Brownb83a3132011-05-11 19:59:58 +0200479err_map:
480 kfree(map);
481err:
482 return ERR_PTR(ret);
483}
484EXPORT_SYMBOL_GPL(regmap_init);
485
Mark Brownc0eb4672012-01-30 19:56:52 +0000486static void devm_regmap_release(struct device *dev, void *res)
487{
488 regmap_exit(*(struct regmap **)res);
489}
490
491/**
492 * devm_regmap_init(): Initialise managed register map
493 *
494 * @dev: Device that will be interacted with
495 * @bus: Bus-specific callbacks to use with device
Stephen Warren0135bbc2012-04-04 15:48:30 -0600496 * @bus_context: Data passed to bus-specific callbacks
Mark Brownc0eb4672012-01-30 19:56:52 +0000497 * @config: Configuration for register map
498 *
499 * The return value will be an ERR_PTR() on error or a valid pointer
500 * to a struct regmap. This function should generally not be called
501 * directly, it should be called by bus-specific init functions. The
502 * map will be automatically freed by the device management code.
503 */
504struct regmap *devm_regmap_init(struct device *dev,
505 const struct regmap_bus *bus,
Stephen Warren0135bbc2012-04-04 15:48:30 -0600506 void *bus_context,
Mark Brownc0eb4672012-01-30 19:56:52 +0000507 const struct regmap_config *config)
508{
509 struct regmap **ptr, *regmap;
510
511 ptr = devres_alloc(devm_regmap_release, sizeof(*ptr), GFP_KERNEL);
512 if (!ptr)
513 return ERR_PTR(-ENOMEM);
514
Stephen Warren0135bbc2012-04-04 15:48:30 -0600515 regmap = regmap_init(dev, bus, bus_context, config);
Mark Brownc0eb4672012-01-30 19:56:52 +0000516 if (!IS_ERR(regmap)) {
517 *ptr = regmap;
518 devres_add(dev, ptr);
519 } else {
520 devres_free(ptr);
521 }
522
523 return regmap;
524}
525EXPORT_SYMBOL_GPL(devm_regmap_init);
526
Mark Brownb83a3132011-05-11 19:59:58 +0200527/**
Mark Brownbf315172011-12-03 17:06:20 +0000528 * regmap_reinit_cache(): Reinitialise the current register cache
529 *
530 * @map: Register map to operate on.
531 * @config: New configuration. Only the cache data will be used.
532 *
533 * Discard any existing register cache for the map and initialize a
534 * new cache. This can be used to restore the cache to defaults or to
535 * update the cache configuration to reflect runtime discovery of the
536 * hardware.
537 */
538int regmap_reinit_cache(struct regmap *map, const struct regmap_config *config)
539{
540 int ret;
541
Stephen Warrenbacdbe02012-04-04 15:48:28 -0600542 map->lock(map);
Mark Brownbf315172011-12-03 17:06:20 +0000543
544 regcache_exit(map);
Mark Browna24f64a2012-01-26 18:30:16 +0000545 regmap_debugfs_exit(map);
Mark Brownbf315172011-12-03 17:06:20 +0000546
547 map->max_register = config->max_register;
548 map->writeable_reg = config->writeable_reg;
549 map->readable_reg = config->readable_reg;
550 map->volatile_reg = config->volatile_reg;
551 map->precious_reg = config->precious_reg;
552 map->cache_type = config->cache_type;
553
Stephen Warrend3c242e2012-04-04 15:48:29 -0600554 regmap_debugfs_init(map, config->name);
Mark Browna24f64a2012-01-26 18:30:16 +0000555
Mark Brown421e8d22012-01-20 13:39:37 +0000556 map->cache_bypass = false;
557 map->cache_only = false;
558
Mark Brownbf315172011-12-03 17:06:20 +0000559 ret = regcache_init(map, config);
560
Stephen Warrenbacdbe02012-04-04 15:48:28 -0600561 map->unlock(map);
Mark Brownbf315172011-12-03 17:06:20 +0000562
563 return ret;
564}
565
566/**
Mark Brownb83a3132011-05-11 19:59:58 +0200567 * regmap_exit(): Free a previously allocated register map
568 */
569void regmap_exit(struct regmap *map)
570{
Dimitris Papastamos5d1729e2011-09-19 14:34:05 +0100571 regcache_exit(map);
Mark Brown31244e32011-07-20 22:56:53 +0100572 regmap_debugfs_exit(map);
Stephen Warren0135bbc2012-04-04 15:48:30 -0600573 if (map->bus->free_context)
574 map->bus->free_context(map->bus_context);
Mark Brownb83a3132011-05-11 19:59:58 +0200575 kfree(map->work_buf);
Mark Brownb83a3132011-05-11 19:59:58 +0200576 kfree(map);
577}
578EXPORT_SYMBOL_GPL(regmap_exit);
579
Mark Brown72b39f62012-05-08 17:44:40 +0100580static int dev_get_regmap_match(struct device *dev, void *res, void *data)
581{
582 struct regmap **r = res;
583 if (!r || !*r) {
584 WARN_ON(!r || !*r);
585 return 0;
586 }
587
588 /* If the user didn't specify a name match any */
589 if (data)
590 return (*r)->name == data;
591 else
592 return 1;
593}
594
595/**
596 * dev_get_regmap(): Obtain the regmap (if any) for a device
597 *
598 * @dev: Device to retrieve the map for
599 * @name: Optional name for the register map, usually NULL.
600 *
601 * Returns the regmap for the device if one is present, or NULL. If
602 * name is specified then it must match the name specified when
603 * registering the device, if it is NULL then the first regmap found
604 * will be used. Devices with multiple register maps are very rare,
605 * generic code should normally not need to specify a name.
606 */
607struct regmap *dev_get_regmap(struct device *dev, const char *name)
608{
609 struct regmap **r = devres_find(dev, dev_get_regmap_release,
610 dev_get_regmap_match, (void *)name);
611
612 if (!r)
613 return NULL;
614 return *r;
615}
616EXPORT_SYMBOL_GPL(dev_get_regmap);
617
Mark Brownb83a3132011-05-11 19:59:58 +0200618static int _regmap_raw_write(struct regmap *map, unsigned int reg,
619 const void *val, size_t val_len)
620{
Lars-Peter Clausen6f306442011-09-05 20:46:32 +0200621 u8 *u8 = map->work_buf;
Mark Brownb83a3132011-05-11 19:59:58 +0200622 void *buf;
623 int ret = -ENOTSUPP;
624 size_t len;
Mark Brown73304782011-07-24 11:46:20 +0100625 int i;
626
627 /* Check for unwritable registers before we start */
628 if (map->writeable_reg)
629 for (i = 0; i < val_len / map->format.val_bytes; i++)
Stephen Warrenf01ee602012-04-09 13:40:24 -0600630 if (!map->writeable_reg(map->dev,
631 reg + (i * map->reg_stride)))
Mark Brown73304782011-07-24 11:46:20 +0100632 return -EINVAL;
Mark Brownb83a3132011-05-11 19:59:58 +0200633
Laxman Dewanganc9157192012-02-10 21:30:27 +0530634 if (!map->cache_bypass && map->format.parse_val) {
635 unsigned int ival;
636 int val_bytes = map->format.val_bytes;
637 for (i = 0; i < val_len / val_bytes; i++) {
638 memcpy(map->work_buf, val + (i * val_bytes), val_bytes);
639 ival = map->format.parse_val(map->work_buf);
Stephen Warrenf01ee602012-04-09 13:40:24 -0600640 ret = regcache_write(map, reg + (i * map->reg_stride),
641 ival);
Laxman Dewanganc9157192012-02-10 21:30:27 +0530642 if (ret) {
643 dev_err(map->dev,
644 "Error in caching of register: %u ret: %d\n",
645 reg + i, ret);
646 return ret;
647 }
648 }
649 if (map->cache_only) {
650 map->cache_dirty = true;
651 return 0;
652 }
653 }
654
Marc Reillyd939fb92012-03-16 12:11:43 +1100655 map->format.format_reg(map->work_buf, reg, map->reg_shift);
Mark Brownb83a3132011-05-11 19:59:58 +0200656
Lars-Peter Clausen6f306442011-09-05 20:46:32 +0200657 u8[0] |= map->write_flag_mask;
658
Mark Brownfb2736b2011-07-24 21:30:55 +0100659 trace_regmap_hw_write_start(map->dev, reg,
660 val_len / map->format.val_bytes);
661
Mark Brown2547e202011-07-20 21:47:22 +0100662 /* If we're doing a single register write we can probably just
663 * send the work_buf directly, otherwise try to do a gather
664 * write.
665 */
Mark Brown82159ba2012-01-18 10:52:25 +0000666 if (val == (map->work_buf + map->format.pad_bytes +
667 map->format.reg_bytes))
Stephen Warren0135bbc2012-04-04 15:48:30 -0600668 ret = map->bus->write(map->bus_context, map->work_buf,
Mark Brown82159ba2012-01-18 10:52:25 +0000669 map->format.reg_bytes +
670 map->format.pad_bytes +
671 val_len);
Mark Brown2547e202011-07-20 21:47:22 +0100672 else if (map->bus->gather_write)
Stephen Warren0135bbc2012-04-04 15:48:30 -0600673 ret = map->bus->gather_write(map->bus_context, map->work_buf,
Mark Brown82159ba2012-01-18 10:52:25 +0000674 map->format.reg_bytes +
675 map->format.pad_bytes,
Mark Brownb83a3132011-05-11 19:59:58 +0200676 val, val_len);
677
Mark Brown2547e202011-07-20 21:47:22 +0100678 /* If that didn't work fall back on linearising by hand. */
Mark Brownb83a3132011-05-11 19:59:58 +0200679 if (ret == -ENOTSUPP) {
Mark Brown82159ba2012-01-18 10:52:25 +0000680 len = map->format.reg_bytes + map->format.pad_bytes + val_len;
681 buf = kzalloc(len, GFP_KERNEL);
Mark Brownb83a3132011-05-11 19:59:58 +0200682 if (!buf)
683 return -ENOMEM;
684
685 memcpy(buf, map->work_buf, map->format.reg_bytes);
Mark Brown82159ba2012-01-18 10:52:25 +0000686 memcpy(buf + map->format.reg_bytes + map->format.pad_bytes,
687 val, val_len);
Stephen Warren0135bbc2012-04-04 15:48:30 -0600688 ret = map->bus->write(map->bus_context, buf, len);
Mark Brownb83a3132011-05-11 19:59:58 +0200689
690 kfree(buf);
691 }
692
Mark Brownfb2736b2011-07-24 21:30:55 +0100693 trace_regmap_hw_write_done(map->dev, reg,
694 val_len / map->format.val_bytes);
695
Mark Brownb83a3132011-05-11 19:59:58 +0200696 return ret;
697}
698
Dimitris Papastamos4d2dc092011-09-29 10:39:07 +0100699int _regmap_write(struct regmap *map, unsigned int reg,
700 unsigned int val)
Mark Brownb83a3132011-05-11 19:59:58 +0200701{
Mark Brownfb2736b2011-07-24 21:30:55 +0100702 int ret;
Mark Brownb83a3132011-05-11 19:59:58 +0200703 BUG_ON(!map->format.format_write && !map->format.format_val);
704
Laxman Dewanganc9157192012-02-10 21:30:27 +0530705 if (!map->cache_bypass && map->format.format_write) {
Dimitris Papastamos5d1729e2011-09-19 14:34:05 +0100706 ret = regcache_write(map, reg, val);
707 if (ret != 0)
708 return ret;
Mark Brown8ae0d7e2011-10-26 10:34:22 +0200709 if (map->cache_only) {
710 map->cache_dirty = true;
Dimitris Papastamos5d1729e2011-09-19 14:34:05 +0100711 return 0;
Mark Brown8ae0d7e2011-10-26 10:34:22 +0200712 }
Dimitris Papastamos5d1729e2011-09-19 14:34:05 +0100713 }
714
Mark Brown1044c182012-07-06 14:10:23 +0100715#ifdef LOG_DEVICE
716 if (strcmp(dev_name(map->dev), LOG_DEVICE) == 0)
717 dev_info(map->dev, "%x <= %x\n", reg, val);
718#endif
719
Mark Brownfb2736b2011-07-24 21:30:55 +0100720 trace_regmap_reg_write(map->dev, reg, val);
721
Mark Brownb83a3132011-05-11 19:59:58 +0200722 if (map->format.format_write) {
723 map->format.format_write(map, reg, val);
724
Mark Brownfb2736b2011-07-24 21:30:55 +0100725 trace_regmap_hw_write_start(map->dev, reg, 1);
726
Stephen Warren0135bbc2012-04-04 15:48:30 -0600727 ret = map->bus->write(map->bus_context, map->work_buf,
Mark Brownfb2736b2011-07-24 21:30:55 +0100728 map->format.buf_size);
729
730 trace_regmap_hw_write_done(map->dev, reg, 1);
731
732 return ret;
Mark Brownb83a3132011-05-11 19:59:58 +0200733 } else {
Mark Brown82159ba2012-01-18 10:52:25 +0000734 map->format.format_val(map->work_buf + map->format.reg_bytes
Marc Reillyd939fb92012-03-16 12:11:43 +1100735 + map->format.pad_bytes, val, 0);
Mark Brownb83a3132011-05-11 19:59:58 +0200736 return _regmap_raw_write(map, reg,
Mark Brown82159ba2012-01-18 10:52:25 +0000737 map->work_buf +
738 map->format.reg_bytes +
739 map->format.pad_bytes,
Mark Brownb83a3132011-05-11 19:59:58 +0200740 map->format.val_bytes);
741 }
742}
743
744/**
745 * regmap_write(): Write a value to a single register
746 *
747 * @map: Register map to write to
748 * @reg: Register to write to
749 * @val: Value to be written
750 *
751 * A value of zero will be returned on success, a negative errno will
752 * be returned in error cases.
753 */
754int regmap_write(struct regmap *map, unsigned int reg, unsigned int val)
755{
756 int ret;
757
Stephen Warrenf01ee602012-04-09 13:40:24 -0600758 if (reg % map->reg_stride)
759 return -EINVAL;
760
Stephen Warrenbacdbe02012-04-04 15:48:28 -0600761 map->lock(map);
Mark Brownb83a3132011-05-11 19:59:58 +0200762
763 ret = _regmap_write(map, reg, val);
764
Stephen Warrenbacdbe02012-04-04 15:48:28 -0600765 map->unlock(map);
Mark Brownb83a3132011-05-11 19:59:58 +0200766
767 return ret;
768}
769EXPORT_SYMBOL_GPL(regmap_write);
770
771/**
772 * regmap_raw_write(): Write raw values to one or more registers
773 *
774 * @map: Register map to write to
775 * @reg: Initial register to write to
776 * @val: Block of data to be written, laid out for direct transmission to the
777 * device
778 * @val_len: Length of data pointed to by val.
779 *
780 * This function is intended to be used for things like firmware
781 * download where a large block of data needs to be transferred to the
782 * device. No formatting will be done on the data provided.
783 *
784 * A value of zero will be returned on success, a negative errno will
785 * be returned in error cases.
786 */
787int regmap_raw_write(struct regmap *map, unsigned int reg,
788 const void *val, size_t val_len)
789{
790 int ret;
791
Stephen Warren851960b2012-04-06 15:16:03 -0600792 if (val_len % map->format.val_bytes)
793 return -EINVAL;
Stephen Warrenf01ee602012-04-09 13:40:24 -0600794 if (reg % map->reg_stride)
795 return -EINVAL;
Stephen Warren851960b2012-04-06 15:16:03 -0600796
Stephen Warrenbacdbe02012-04-04 15:48:28 -0600797 map->lock(map);
Mark Brownb83a3132011-05-11 19:59:58 +0200798
799 ret = _regmap_raw_write(map, reg, val, val_len);
800
Stephen Warrenbacdbe02012-04-04 15:48:28 -0600801 map->unlock(map);
Mark Brownb83a3132011-05-11 19:59:58 +0200802
803 return ret;
804}
805EXPORT_SYMBOL_GPL(regmap_raw_write);
806
Laxman Dewangan8eaeb212012-02-12 19:49:43 +0530807/*
808 * regmap_bulk_write(): Write multiple registers to the device
809 *
810 * @map: Register map to write to
811 * @reg: First register to be write from
812 * @val: Block of data to be written, in native register size for device
813 * @val_count: Number of registers to write
814 *
815 * This function is intended to be used for writing a large block of
816 * data to be device either in single transfer or multiple transfer.
817 *
818 * A value of zero will be returned on success, a negative errno will
819 * be returned in error cases.
820 */
821int regmap_bulk_write(struct regmap *map, unsigned int reg, const void *val,
822 size_t val_count)
823{
824 int ret = 0, i;
825 size_t val_bytes = map->format.val_bytes;
826 void *wval;
827
828 if (!map->format.parse_val)
829 return -EINVAL;
Stephen Warrenf01ee602012-04-09 13:40:24 -0600830 if (reg % map->reg_stride)
831 return -EINVAL;
Laxman Dewangan8eaeb212012-02-12 19:49:43 +0530832
Stephen Warrenbacdbe02012-04-04 15:48:28 -0600833 map->lock(map);
Laxman Dewangan8eaeb212012-02-12 19:49:43 +0530834
835 /* No formatting is require if val_byte is 1 */
836 if (val_bytes == 1) {
837 wval = (void *)val;
838 } else {
839 wval = kmemdup(val, val_count * val_bytes, GFP_KERNEL);
840 if (!wval) {
841 ret = -ENOMEM;
842 dev_err(map->dev, "Error in memory allocation\n");
843 goto out;
844 }
845 for (i = 0; i < val_count * val_bytes; i += val_bytes)
846 map->format.parse_val(wval + i);
847 }
Ashish Jangam2e33caf2012-04-30 23:23:40 +0100848 /*
849 * Some devices does not support bulk write, for
850 * them we have a series of single write operations.
851 */
852 if (map->use_single_rw) {
853 for (i = 0; i < val_count; i++) {
854 ret = regmap_raw_write(map,
855 reg + (i * map->reg_stride),
856 val + (i * val_bytes),
857 val_bytes);
858 if (ret != 0)
859 return ret;
860 }
861 } else {
862 ret = _regmap_raw_write(map, reg, wval, val_bytes * val_count);
863 }
Laxman Dewangan8eaeb212012-02-12 19:49:43 +0530864
865 if (val_bytes != 1)
866 kfree(wval);
867
868out:
Stephen Warrenbacdbe02012-04-04 15:48:28 -0600869 map->unlock(map);
Laxman Dewangan8eaeb212012-02-12 19:49:43 +0530870 return ret;
871}
872EXPORT_SYMBOL_GPL(regmap_bulk_write);
873
Mark Brownb83a3132011-05-11 19:59:58 +0200874static int _regmap_raw_read(struct regmap *map, unsigned int reg, void *val,
875 unsigned int val_len)
876{
877 u8 *u8 = map->work_buf;
878 int ret;
879
Marc Reillyd939fb92012-03-16 12:11:43 +1100880 map->format.format_reg(map->work_buf, reg, map->reg_shift);
Mark Brownb83a3132011-05-11 19:59:58 +0200881
882 /*
Lars-Peter Clausen6f306442011-09-05 20:46:32 +0200883 * Some buses or devices flag reads by setting the high bits in the
Mark Brownb83a3132011-05-11 19:59:58 +0200884 * register addresss; since it's always the high bits for all
885 * current formats we can do this here rather than in
886 * formatting. This may break if we get interesting formats.
887 */
Lars-Peter Clausen6f306442011-09-05 20:46:32 +0200888 u8[0] |= map->read_flag_mask;
Mark Brownb83a3132011-05-11 19:59:58 +0200889
Mark Brownfb2736b2011-07-24 21:30:55 +0100890 trace_regmap_hw_read_start(map->dev, reg,
891 val_len / map->format.val_bytes);
892
Stephen Warren0135bbc2012-04-04 15:48:30 -0600893 ret = map->bus->read(map->bus_context, map->work_buf,
Mark Brown82159ba2012-01-18 10:52:25 +0000894 map->format.reg_bytes + map->format.pad_bytes,
Mark Brown40c5cc22011-07-24 22:39:12 +0100895 val, val_len);
Mark Brownb83a3132011-05-11 19:59:58 +0200896
Mark Brownfb2736b2011-07-24 21:30:55 +0100897 trace_regmap_hw_read_done(map->dev, reg,
898 val_len / map->format.val_bytes);
899
900 return ret;
Mark Brownb83a3132011-05-11 19:59:58 +0200901}
902
903static int _regmap_read(struct regmap *map, unsigned int reg,
904 unsigned int *val)
905{
906 int ret;
907
Dimitris Papastamos5d1729e2011-09-19 14:34:05 +0100908 if (!map->cache_bypass) {
909 ret = regcache_read(map, reg, val);
910 if (ret == 0)
911 return 0;
912 }
913
Lars-Peter Clausen19254412011-11-16 16:28:19 +0100914 if (!map->format.parse_val)
915 return -EINVAL;
916
Dimitris Papastamos5d1729e2011-09-19 14:34:05 +0100917 if (map->cache_only)
918 return -EBUSY;
919
Mark Brownb83a3132011-05-11 19:59:58 +0200920 ret = _regmap_raw_read(map, reg, map->work_buf, map->format.val_bytes);
Mark Brownfb2736b2011-07-24 21:30:55 +0100921 if (ret == 0) {
Mark Brownb83a3132011-05-11 19:59:58 +0200922 *val = map->format.parse_val(map->work_buf);
Mark Brown1044c182012-07-06 14:10:23 +0100923
924#ifdef LOG_DEVICE
925 if (strcmp(dev_name(map->dev), LOG_DEVICE) == 0)
926 dev_info(map->dev, "%x => %x\n", reg, *val);
927#endif
928
Mark Brownfb2736b2011-07-24 21:30:55 +0100929 trace_regmap_reg_read(map->dev, reg, *val);
930 }
Mark Brownb83a3132011-05-11 19:59:58 +0200931
Mark Brownf2985362012-04-30 21:25:05 +0100932 if (ret == 0 && !map->cache_bypass)
933 regcache_write(map, reg, *val);
934
Mark Brownb83a3132011-05-11 19:59:58 +0200935 return ret;
936}
937
938/**
939 * regmap_read(): Read a value from a single register
940 *
941 * @map: Register map to write to
942 * @reg: Register to be read from
943 * @val: Pointer to store read value
944 *
945 * A value of zero will be returned on success, a negative errno will
946 * be returned in error cases.
947 */
948int regmap_read(struct regmap *map, unsigned int reg, unsigned int *val)
949{
950 int ret;
951
Stephen Warrenf01ee602012-04-09 13:40:24 -0600952 if (reg % map->reg_stride)
953 return -EINVAL;
954
Stephen Warrenbacdbe02012-04-04 15:48:28 -0600955 map->lock(map);
Mark Brownb83a3132011-05-11 19:59:58 +0200956
957 ret = _regmap_read(map, reg, val);
958
Stephen Warrenbacdbe02012-04-04 15:48:28 -0600959 map->unlock(map);
Mark Brownb83a3132011-05-11 19:59:58 +0200960
961 return ret;
962}
963EXPORT_SYMBOL_GPL(regmap_read);
964
965/**
966 * regmap_raw_read(): Read raw data from the device
967 *
968 * @map: Register map to write to
969 * @reg: First register to be read from
970 * @val: Pointer to store read value
971 * @val_len: Size of data to read
972 *
973 * A value of zero will be returned on success, a negative errno will
974 * be returned in error cases.
975 */
976int regmap_raw_read(struct regmap *map, unsigned int reg, void *val,
977 size_t val_len)
978{
Mark Brownb8fb5ab2012-02-21 19:12:47 +0000979 size_t val_bytes = map->format.val_bytes;
980 size_t val_count = val_len / val_bytes;
981 unsigned int v;
982 int ret, i;
Mark Brown04e016a2011-10-09 13:35:43 +0100983
Stephen Warren851960b2012-04-06 15:16:03 -0600984 if (val_len % map->format.val_bytes)
985 return -EINVAL;
Stephen Warrenf01ee602012-04-09 13:40:24 -0600986 if (reg % map->reg_stride)
987 return -EINVAL;
Stephen Warren851960b2012-04-06 15:16:03 -0600988
Stephen Warrenbacdbe02012-04-04 15:48:28 -0600989 map->lock(map);
Mark Brownb83a3132011-05-11 19:59:58 +0200990
Mark Brownb8fb5ab2012-02-21 19:12:47 +0000991 if (regmap_volatile_range(map, reg, val_count) || map->cache_bypass ||
992 map->cache_type == REGCACHE_NONE) {
993 /* Physical block read if there's no cache involved */
994 ret = _regmap_raw_read(map, reg, val, val_len);
Mark Brownb83a3132011-05-11 19:59:58 +0200995
Mark Brownb8fb5ab2012-02-21 19:12:47 +0000996 } else {
997 /* Otherwise go word by word for the cache; should be low
998 * cost as we expect to hit the cache.
999 */
1000 for (i = 0; i < val_count; i++) {
Stephen Warrenf01ee602012-04-09 13:40:24 -06001001 ret = _regmap_read(map, reg + (i * map->reg_stride),
1002 &v);
Mark Brownb8fb5ab2012-02-21 19:12:47 +00001003 if (ret != 0)
1004 goto out;
1005
Marc Reillyd939fb92012-03-16 12:11:43 +11001006 map->format.format_val(val + (i * val_bytes), v, 0);
Mark Brownb8fb5ab2012-02-21 19:12:47 +00001007 }
1008 }
1009
1010 out:
Stephen Warrenbacdbe02012-04-04 15:48:28 -06001011 map->unlock(map);
Mark Brownb83a3132011-05-11 19:59:58 +02001012
1013 return ret;
1014}
1015EXPORT_SYMBOL_GPL(regmap_raw_read);
1016
1017/**
1018 * regmap_bulk_read(): Read multiple registers from the device
1019 *
1020 * @map: Register map to write to
1021 * @reg: First register to be read from
1022 * @val: Pointer to store read value, in native register size for device
1023 * @val_count: Number of registers to read
1024 *
1025 * A value of zero will be returned on success, a negative errno will
1026 * be returned in error cases.
1027 */
1028int regmap_bulk_read(struct regmap *map, unsigned int reg, void *val,
1029 size_t val_count)
1030{
1031 int ret, i;
1032 size_t val_bytes = map->format.val_bytes;
Lars-Peter Clausen82cd9962011-11-08 18:37:25 +01001033 bool vol = regmap_volatile_range(map, reg, val_count);
Dimitris Papastamos5d1729e2011-09-19 14:34:05 +01001034
Mark Brownb83a3132011-05-11 19:59:58 +02001035 if (!map->format.parse_val)
1036 return -EINVAL;
Stephen Warrenf01ee602012-04-09 13:40:24 -06001037 if (reg % map->reg_stride)
1038 return -EINVAL;
Mark Brownb83a3132011-05-11 19:59:58 +02001039
Mark Brownde2d8082011-10-10 13:24:52 +01001040 if (vol || map->cache_type == REGCACHE_NONE) {
Ashish Jangam2e33caf2012-04-30 23:23:40 +01001041 /*
1042 * Some devices does not support bulk read, for
1043 * them we have a series of single read operations.
1044 */
1045 if (map->use_single_rw) {
1046 for (i = 0; i < val_count; i++) {
1047 ret = regmap_raw_read(map,
1048 reg + (i * map->reg_stride),
1049 val + (i * val_bytes),
1050 val_bytes);
1051 if (ret != 0)
1052 return ret;
1053 }
1054 } else {
1055 ret = regmap_raw_read(map, reg, val,
1056 val_bytes * val_count);
1057 if (ret != 0)
1058 return ret;
1059 }
Mark Brownde2d8082011-10-10 13:24:52 +01001060
1061 for (i = 0; i < val_count * val_bytes; i += val_bytes)
1062 map->format.parse_val(val + i);
1063 } else {
1064 for (i = 0; i < val_count; i++) {
Laxman Dewangan6560ffd2012-05-09 17:43:12 +05301065 unsigned int ival;
Stephen Warrenf01ee602012-04-09 13:40:24 -06001066 ret = regmap_read(map, reg + (i * map->reg_stride),
Mark Brown25061d22012-05-12 13:06:08 +01001067 &ival);
Mark Brownde2d8082011-10-10 13:24:52 +01001068 if (ret != 0)
1069 return ret;
Laxman Dewangan6560ffd2012-05-09 17:43:12 +05301070 memcpy(val + (i * val_bytes), &ival, val_bytes);
Mark Brownde2d8082011-10-10 13:24:52 +01001071 }
1072 }
Mark Brownb83a3132011-05-11 19:59:58 +02001073
1074 return 0;
1075}
1076EXPORT_SYMBOL_GPL(regmap_bulk_read);
1077
Mark Brown018690d2011-11-29 20:10:36 +00001078static int _regmap_update_bits(struct regmap *map, unsigned int reg,
1079 unsigned int mask, unsigned int val,
1080 bool *change)
Mark Brownb83a3132011-05-11 19:59:58 +02001081{
1082 int ret;
Mark Brownd91e8db22011-11-18 16:03:50 +00001083 unsigned int tmp, orig;
Mark Brownb83a3132011-05-11 19:59:58 +02001084
Stephen Warrenbacdbe02012-04-04 15:48:28 -06001085 map->lock(map);
Mark Brownb83a3132011-05-11 19:59:58 +02001086
Mark Brownd91e8db22011-11-18 16:03:50 +00001087 ret = _regmap_read(map, reg, &orig);
Mark Brownb83a3132011-05-11 19:59:58 +02001088 if (ret != 0)
1089 goto out;
1090
Mark Brownd91e8db22011-11-18 16:03:50 +00001091 tmp = orig & ~mask;
Mark Brownb83a3132011-05-11 19:59:58 +02001092 tmp |= val & mask;
1093
Mark Brown018690d2011-11-29 20:10:36 +00001094 if (tmp != orig) {
Mark Brownd91e8db22011-11-18 16:03:50 +00001095 ret = _regmap_write(map, reg, tmp);
Mark Brown018690d2011-11-29 20:10:36 +00001096 *change = true;
1097 } else {
1098 *change = false;
1099 }
Mark Brownb83a3132011-05-11 19:59:58 +02001100
1101out:
Stephen Warrenbacdbe02012-04-04 15:48:28 -06001102 map->unlock(map);
Mark Brownb83a3132011-05-11 19:59:58 +02001103
1104 return ret;
1105}
Mark Brown018690d2011-11-29 20:10:36 +00001106
1107/**
1108 * regmap_update_bits: Perform a read/modify/write cycle on the register map
1109 *
1110 * @map: Register map to update
1111 * @reg: Register to update
1112 * @mask: Bitmask to change
1113 * @val: New value for bitmask
1114 *
1115 * Returns zero for success, a negative number on error.
1116 */
1117int regmap_update_bits(struct regmap *map, unsigned int reg,
1118 unsigned int mask, unsigned int val)
1119{
1120 bool change;
1121 return _regmap_update_bits(map, reg, mask, val, &change);
1122}
Mark Brownb83a3132011-05-11 19:59:58 +02001123EXPORT_SYMBOL_GPL(regmap_update_bits);
Mark Brown31244e32011-07-20 22:56:53 +01001124
Mark Brown018690d2011-11-29 20:10:36 +00001125/**
1126 * regmap_update_bits_check: Perform a read/modify/write cycle on the
1127 * register map and report if updated
1128 *
1129 * @map: Register map to update
1130 * @reg: Register to update
1131 * @mask: Bitmask to change
1132 * @val: New value for bitmask
1133 * @change: Boolean indicating if a write was done
1134 *
1135 * Returns zero for success, a negative number on error.
1136 */
1137int regmap_update_bits_check(struct regmap *map, unsigned int reg,
1138 unsigned int mask, unsigned int val,
1139 bool *change)
1140{
1141 return _regmap_update_bits(map, reg, mask, val, change);
1142}
1143EXPORT_SYMBOL_GPL(regmap_update_bits_check);
1144
Mark Brown22f0d902012-01-21 12:01:14 +00001145/**
1146 * regmap_register_patch: Register and apply register updates to be applied
1147 * on device initialistion
1148 *
1149 * @map: Register map to apply updates to.
1150 * @regs: Values to update.
1151 * @num_regs: Number of entries in regs.
1152 *
1153 * Register a set of register updates to be applied to the device
1154 * whenever the device registers are synchronised with the cache and
1155 * apply them immediately. Typically this is used to apply
1156 * corrections to be applied to the device defaults on startup, such
1157 * as the updates some vendors provide to undocumented registers.
1158 */
1159int regmap_register_patch(struct regmap *map, const struct reg_default *regs,
1160 int num_regs)
1161{
1162 int i, ret;
1163 bool bypass;
1164
1165 /* If needed the implementation can be extended to support this */
1166 if (map->patch)
1167 return -EBUSY;
1168
Stephen Warrenbacdbe02012-04-04 15:48:28 -06001169 map->lock(map);
Mark Brown22f0d902012-01-21 12:01:14 +00001170
1171 bypass = map->cache_bypass;
1172
1173 map->cache_bypass = true;
1174
1175 /* Write out first; it's useful to apply even if we fail later. */
1176 for (i = 0; i < num_regs; i++) {
1177 ret = _regmap_write(map, regs[i].reg, regs[i].def);
1178 if (ret != 0) {
1179 dev_err(map->dev, "Failed to write %x = %x: %d\n",
1180 regs[i].reg, regs[i].def, ret);
1181 goto out;
1182 }
1183 }
1184
Axel Lin2a14d7d92012-02-10 19:29:55 +08001185 map->patch = kcalloc(num_regs, sizeof(struct reg_default), GFP_KERNEL);
Mark Brown22f0d902012-01-21 12:01:14 +00001186 if (map->patch != NULL) {
1187 memcpy(map->patch, regs,
1188 num_regs * sizeof(struct reg_default));
1189 map->patch_regs = num_regs;
1190 } else {
1191 ret = -ENOMEM;
1192 }
1193
1194out:
1195 map->cache_bypass = bypass;
1196
Stephen Warrenbacdbe02012-04-04 15:48:28 -06001197 map->unlock(map);
Mark Brown22f0d902012-01-21 12:01:14 +00001198
1199 return ret;
1200}
1201EXPORT_SYMBOL_GPL(regmap_register_patch);
1202
Mark Browneae4b512012-03-14 13:15:03 +00001203/*
Mark Browna6539c32012-02-17 14:20:14 -08001204 * regmap_get_val_bytes(): Report the size of a register value
1205 *
1206 * Report the size of a register value, mainly intended to for use by
1207 * generic infrastructure built on top of regmap.
1208 */
1209int regmap_get_val_bytes(struct regmap *map)
1210{
1211 if (map->format.format_write)
1212 return -EINVAL;
1213
1214 return map->format.val_bytes;
1215}
1216EXPORT_SYMBOL_GPL(regmap_get_val_bytes);
1217
Mark Brown31244e32011-07-20 22:56:53 +01001218static int __init regmap_initcall(void)
1219{
1220 regmap_debugfs_initcall();
1221
1222 return 0;
1223}
1224postcore_initcall(regmap_initcall);