blob: 8a25006b2a4de1885387e3223e29e27f4cd3fcfc [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 Brown8de2f082011-08-10 17:14:41 +090024bool regmap_writeable(struct regmap *map, unsigned int reg)
25{
26 if (map->max_register && reg > map->max_register)
27 return false;
28
29 if (map->writeable_reg)
30 return map->writeable_reg(map->dev, reg);
31
32 return true;
33}
34
35bool regmap_readable(struct regmap *map, unsigned int reg)
36{
37 if (map->max_register && reg > map->max_register)
38 return false;
39
Wolfram Sang4191f192012-01-30 15:08:16 +010040 if (map->format.format_write)
41 return false;
42
Mark Brown8de2f082011-08-10 17:14:41 +090043 if (map->readable_reg)
44 return map->readable_reg(map->dev, reg);
45
46 return true;
47}
48
49bool regmap_volatile(struct regmap *map, unsigned int reg)
50{
Wolfram Sang4191f192012-01-30 15:08:16 +010051 if (!regmap_readable(map, reg))
Mark Brown8de2f082011-08-10 17:14:41 +090052 return false;
53
54 if (map->volatile_reg)
55 return map->volatile_reg(map->dev, reg);
56
57 return true;
58}
59
60bool regmap_precious(struct regmap *map, unsigned int reg)
61{
Wolfram Sang4191f192012-01-30 15:08:16 +010062 if (!regmap_readable(map, reg))
Mark Brown8de2f082011-08-10 17:14:41 +090063 return false;
64
65 if (map->precious_reg)
66 return map->precious_reg(map->dev, reg);
67
68 return false;
69}
70
Lars-Peter Clausen82cd9962011-11-08 18:37:25 +010071static bool regmap_volatile_range(struct regmap *map, unsigned int reg,
72 unsigned int num)
73{
74 unsigned int i;
75
76 for (i = 0; i < num; i++)
77 if (!regmap_volatile(map, reg + i))
78 return false;
79
80 return true;
81}
82
Wolfram Sang9aa50752012-01-27 16:10:22 +010083static void regmap_format_2_6_write(struct regmap *map,
84 unsigned int reg, unsigned int val)
85{
86 u8 *out = map->work_buf;
87
88 *out = (reg << 6) | val;
89}
90
Mark Brownb83a3132011-05-11 19:59:58 +020091static void regmap_format_4_12_write(struct regmap *map,
92 unsigned int reg, unsigned int val)
93{
94 __be16 *out = map->work_buf;
95 *out = cpu_to_be16((reg << 12) | val);
96}
97
98static void regmap_format_7_9_write(struct regmap *map,
99 unsigned int reg, unsigned int val)
100{
101 __be16 *out = map->work_buf;
102 *out = cpu_to_be16((reg << 9) | val);
103}
104
Lars-Peter Clausen7e5ec632011-11-16 16:28:21 +0100105static void regmap_format_10_14_write(struct regmap *map,
106 unsigned int reg, unsigned int val)
107{
108 u8 *out = map->work_buf;
109
110 out[2] = val;
111 out[1] = (val >> 8) | (reg << 6);
112 out[0] = reg >> 2;
113}
114
Marc Reillyd939fb92012-03-16 12:11:43 +1100115static void regmap_format_8(void *buf, unsigned int val, unsigned int shift)
Mark Brownb83a3132011-05-11 19:59:58 +0200116{
117 u8 *b = buf;
118
Marc Reillyd939fb92012-03-16 12:11:43 +1100119 b[0] = val << shift;
Mark Brownb83a3132011-05-11 19:59:58 +0200120}
121
Marc Reillyd939fb92012-03-16 12:11:43 +1100122static void regmap_format_16(void *buf, unsigned int val, unsigned int shift)
Mark Brownb83a3132011-05-11 19:59:58 +0200123{
124 __be16 *b = buf;
125
Marc Reillyd939fb92012-03-16 12:11:43 +1100126 b[0] = cpu_to_be16(val << shift);
Mark Brownb83a3132011-05-11 19:59:58 +0200127}
128
Marc Reillyd939fb92012-03-16 12:11:43 +1100129static void regmap_format_24(void *buf, unsigned int val, unsigned int shift)
Marc Reillyea279fc2012-03-16 12:11:42 +1100130{
131 u8 *b = buf;
132
Marc Reillyd939fb92012-03-16 12:11:43 +1100133 val <<= shift;
134
Marc Reillyea279fc2012-03-16 12:11:42 +1100135 b[0] = val >> 16;
136 b[1] = val >> 8;
137 b[2] = val;
138}
139
Marc Reillyd939fb92012-03-16 12:11:43 +1100140static void regmap_format_32(void *buf, unsigned int val, unsigned int shift)
Mark Brown7d5e5252012-02-17 15:58:25 -0800141{
142 __be32 *b = buf;
143
Marc Reillyd939fb92012-03-16 12:11:43 +1100144 b[0] = cpu_to_be32(val << shift);
Mark Brown7d5e5252012-02-17 15:58:25 -0800145}
146
Mark Brownb83a3132011-05-11 19:59:58 +0200147static unsigned int regmap_parse_8(void *buf)
148{
149 u8 *b = buf;
150
151 return b[0];
152}
153
154static unsigned int regmap_parse_16(void *buf)
155{
156 __be16 *b = buf;
157
158 b[0] = be16_to_cpu(b[0]);
159
160 return b[0];
161}
162
Marc Reillyea279fc2012-03-16 12:11:42 +1100163static unsigned int regmap_parse_24(void *buf)
164{
165 u8 *b = buf;
166 unsigned int ret = b[2];
167 ret |= ((unsigned int)b[1]) << 8;
168 ret |= ((unsigned int)b[0]) << 16;
169
170 return ret;
171}
172
Mark Brown7d5e5252012-02-17 15:58:25 -0800173static unsigned int regmap_parse_32(void *buf)
174{
175 __be32 *b = buf;
176
177 b[0] = be32_to_cpu(b[0]);
178
179 return b[0];
180}
181
Stephen Warrenbacdbe02012-04-04 15:48:28 -0600182static void regmap_lock_mutex(struct regmap *map)
183{
184 mutex_lock(&map->mutex);
185}
186
187static void regmap_unlock_mutex(struct regmap *map)
188{
189 mutex_unlock(&map->mutex);
190}
191
192static void regmap_lock_spinlock(struct regmap *map)
193{
194 spin_lock(&map->spinlock);
195}
196
197static void regmap_unlock_spinlock(struct regmap *map)
198{
199 spin_unlock(&map->spinlock);
200}
201
Mark Brownb83a3132011-05-11 19:59:58 +0200202/**
203 * regmap_init(): Initialise register map
204 *
205 * @dev: Device that will be interacted with
206 * @bus: Bus-specific callbacks to use with device
Stephen Warren0135bbc2012-04-04 15:48:30 -0600207 * @bus_context: Data passed to bus-specific callbacks
Mark Brownb83a3132011-05-11 19:59:58 +0200208 * @config: Configuration for register map
209 *
210 * The return value will be an ERR_PTR() on error or a valid pointer to
211 * a struct regmap. This function should generally not be called
212 * directly, it should be called by bus-specific init functions.
213 */
214struct regmap *regmap_init(struct device *dev,
215 const struct regmap_bus *bus,
Stephen Warren0135bbc2012-04-04 15:48:30 -0600216 void *bus_context,
Mark Brownb83a3132011-05-11 19:59:58 +0200217 const struct regmap_config *config)
218{
219 struct regmap *map;
220 int ret = -EINVAL;
221
222 if (!bus || !config)
Lars-Peter Clausenabbb18f2011-11-14 10:40:15 +0100223 goto err;
Mark Brownb83a3132011-05-11 19:59:58 +0200224
225 map = kzalloc(sizeof(*map), GFP_KERNEL);
226 if (map == NULL) {
227 ret = -ENOMEM;
228 goto err;
229 }
230
Stephen Warrenbacdbe02012-04-04 15:48:28 -0600231 if (bus->fast_io) {
232 spin_lock_init(&map->spinlock);
233 map->lock = regmap_lock_spinlock;
234 map->unlock = regmap_unlock_spinlock;
235 } else {
236 mutex_init(&map->mutex);
237 map->lock = regmap_lock_mutex;
238 map->unlock = regmap_unlock_mutex;
239 }
Mark Brownb83a3132011-05-11 19:59:58 +0200240 map->format.buf_size = (config->reg_bits + config->val_bits) / 8;
Wolfram Sangc212acc2012-01-28 02:16:41 +0100241 map->format.reg_bytes = DIV_ROUND_UP(config->reg_bits, 8);
Mark Brown82159ba2012-01-18 10:52:25 +0000242 map->format.pad_bytes = config->pad_bits / 8;
Wolfram Sangc212acc2012-01-28 02:16:41 +0100243 map->format.val_bytes = DIV_ROUND_UP(config->val_bits, 8);
Mark Brown82159ba2012-01-18 10:52:25 +0000244 map->format.buf_size += map->format.pad_bytes;
Marc Reillyd939fb92012-03-16 12:11:43 +1100245 map->reg_shift = config->pad_bits % 8;
Stephen Warrenf01ee602012-04-09 13:40:24 -0600246 if (config->reg_stride)
247 map->reg_stride = config->reg_stride;
248 else
249 map->reg_stride = 1;
Mark Brownb83a3132011-05-11 19:59:58 +0200250 map->dev = dev;
251 map->bus = bus;
Stephen Warren0135bbc2012-04-04 15:48:30 -0600252 map->bus_context = bus_context;
Mark Brown2e2ae662011-07-20 22:33:39 +0100253 map->max_register = config->max_register;
254 map->writeable_reg = config->writeable_reg;
255 map->readable_reg = config->readable_reg;
256 map->volatile_reg = config->volatile_reg;
Mark Brown2efe1642011-08-08 15:41:46 +0900257 map->precious_reg = config->precious_reg;
Dimitris Papastamos5d1729e2011-09-19 14:34:05 +0100258 map->cache_type = config->cache_type;
Mark Brownb83a3132011-05-11 19:59:58 +0200259
Lars-Peter Clausen6f306442011-09-05 20:46:32 +0200260 if (config->read_flag_mask || config->write_flag_mask) {
261 map->read_flag_mask = config->read_flag_mask;
262 map->write_flag_mask = config->write_flag_mask;
263 } else {
264 map->read_flag_mask = bus->read_flag_mask;
265 }
266
Marc Reillyd939fb92012-03-16 12:11:43 +1100267 switch (config->reg_bits + map->reg_shift) {
Wolfram Sang9aa50752012-01-27 16:10:22 +0100268 case 2:
269 switch (config->val_bits) {
270 case 6:
271 map->format.format_write = regmap_format_2_6_write;
272 break;
273 default:
274 goto err_map;
275 }
276 break;
277
Mark Brownb83a3132011-05-11 19:59:58 +0200278 case 4:
279 switch (config->val_bits) {
280 case 12:
281 map->format.format_write = regmap_format_4_12_write;
282 break;
283 default:
284 goto err_map;
285 }
286 break;
287
288 case 7:
289 switch (config->val_bits) {
290 case 9:
291 map->format.format_write = regmap_format_7_9_write;
292 break;
293 default:
294 goto err_map;
295 }
296 break;
297
Lars-Peter Clausen7e5ec632011-11-16 16:28:21 +0100298 case 10:
299 switch (config->val_bits) {
300 case 14:
301 map->format.format_write = regmap_format_10_14_write;
302 break;
303 default:
304 goto err_map;
305 }
306 break;
307
Mark Brownb83a3132011-05-11 19:59:58 +0200308 case 8:
309 map->format.format_reg = regmap_format_8;
310 break;
311
312 case 16:
313 map->format.format_reg = regmap_format_16;
314 break;
315
Mark Brown7d5e5252012-02-17 15:58:25 -0800316 case 32:
317 map->format.format_reg = regmap_format_32;
318 break;
319
Mark Brownb83a3132011-05-11 19:59:58 +0200320 default:
321 goto err_map;
322 }
323
324 switch (config->val_bits) {
325 case 8:
326 map->format.format_val = regmap_format_8;
327 map->format.parse_val = regmap_parse_8;
328 break;
329 case 16:
330 map->format.format_val = regmap_format_16;
331 map->format.parse_val = regmap_parse_16;
332 break;
Marc Reillyea279fc2012-03-16 12:11:42 +1100333 case 24:
334 map->format.format_val = regmap_format_24;
335 map->format.parse_val = regmap_parse_24;
336 break;
Mark Brown7d5e5252012-02-17 15:58:25 -0800337 case 32:
338 map->format.format_val = regmap_format_32;
339 map->format.parse_val = regmap_parse_32;
340 break;
Mark Brownb83a3132011-05-11 19:59:58 +0200341 }
342
343 if (!map->format.format_write &&
344 !(map->format.format_reg && map->format.format_val))
345 goto err_map;
346
Mark Brown82159ba2012-01-18 10:52:25 +0000347 map->work_buf = kzalloc(map->format.buf_size, GFP_KERNEL);
Mark Brownb83a3132011-05-11 19:59:58 +0200348 if (map->work_buf == NULL) {
349 ret = -ENOMEM;
Mark Brown5204f5e2011-09-05 08:07:47 -0700350 goto err_map;
Mark Brownb83a3132011-05-11 19:59:58 +0200351 }
352
Stephen Warrend3c242e2012-04-04 15:48:29 -0600353 regmap_debugfs_init(map, config->name);
Mark Brown052d2cd2011-11-21 19:05:13 +0000354
Lars-Peter Clausene5e3b8a2011-11-16 16:28:16 +0100355 ret = regcache_init(map, config);
Dimitris Papastamos5d1729e2011-09-19 14:34:05 +0100356 if (ret < 0)
Lars-Peter Clausen58072cb2011-11-10 18:15:15 +0100357 goto err_free_workbuf;
Dimitris Papastamos5d1729e2011-09-19 14:34:05 +0100358
Mark Brownb83a3132011-05-11 19:59:58 +0200359 return map;
360
Lars-Peter Clausen58072cb2011-11-10 18:15:15 +0100361err_free_workbuf:
362 kfree(map->work_buf);
Mark Brownb83a3132011-05-11 19:59:58 +0200363err_map:
364 kfree(map);
365err:
366 return ERR_PTR(ret);
367}
368EXPORT_SYMBOL_GPL(regmap_init);
369
Mark Brownc0eb4672012-01-30 19:56:52 +0000370static void devm_regmap_release(struct device *dev, void *res)
371{
372 regmap_exit(*(struct regmap **)res);
373}
374
375/**
376 * devm_regmap_init(): Initialise managed register map
377 *
378 * @dev: Device that will be interacted with
379 * @bus: Bus-specific callbacks to use with device
Stephen Warren0135bbc2012-04-04 15:48:30 -0600380 * @bus_context: Data passed to bus-specific callbacks
Mark Brownc0eb4672012-01-30 19:56:52 +0000381 * @config: Configuration for register map
382 *
383 * The return value will be an ERR_PTR() on error or a valid pointer
384 * to a struct regmap. This function should generally not be called
385 * directly, it should be called by bus-specific init functions. The
386 * map will be automatically freed by the device management code.
387 */
388struct regmap *devm_regmap_init(struct device *dev,
389 const struct regmap_bus *bus,
Stephen Warren0135bbc2012-04-04 15:48:30 -0600390 void *bus_context,
Mark Brownc0eb4672012-01-30 19:56:52 +0000391 const struct regmap_config *config)
392{
393 struct regmap **ptr, *regmap;
394
395 ptr = devres_alloc(devm_regmap_release, sizeof(*ptr), GFP_KERNEL);
396 if (!ptr)
397 return ERR_PTR(-ENOMEM);
398
Stephen Warren0135bbc2012-04-04 15:48:30 -0600399 regmap = regmap_init(dev, bus, bus_context, config);
Mark Brownc0eb4672012-01-30 19:56:52 +0000400 if (!IS_ERR(regmap)) {
401 *ptr = regmap;
402 devres_add(dev, ptr);
403 } else {
404 devres_free(ptr);
405 }
406
407 return regmap;
408}
409EXPORT_SYMBOL_GPL(devm_regmap_init);
410
Mark Brownb83a3132011-05-11 19:59:58 +0200411/**
Mark Brownbf315172011-12-03 17:06:20 +0000412 * regmap_reinit_cache(): Reinitialise the current register cache
413 *
414 * @map: Register map to operate on.
415 * @config: New configuration. Only the cache data will be used.
416 *
417 * Discard any existing register cache for the map and initialize a
418 * new cache. This can be used to restore the cache to defaults or to
419 * update the cache configuration to reflect runtime discovery of the
420 * hardware.
421 */
422int regmap_reinit_cache(struct regmap *map, const struct regmap_config *config)
423{
424 int ret;
425
Stephen Warrenbacdbe02012-04-04 15:48:28 -0600426 map->lock(map);
Mark Brownbf315172011-12-03 17:06:20 +0000427
428 regcache_exit(map);
Mark Browna24f64a2012-01-26 18:30:16 +0000429 regmap_debugfs_exit(map);
Mark Brownbf315172011-12-03 17:06:20 +0000430
431 map->max_register = config->max_register;
432 map->writeable_reg = config->writeable_reg;
433 map->readable_reg = config->readable_reg;
434 map->volatile_reg = config->volatile_reg;
435 map->precious_reg = config->precious_reg;
436 map->cache_type = config->cache_type;
437
Stephen Warrend3c242e2012-04-04 15:48:29 -0600438 regmap_debugfs_init(map, config->name);
Mark Browna24f64a2012-01-26 18:30:16 +0000439
Mark Brown421e8d22012-01-20 13:39:37 +0000440 map->cache_bypass = false;
441 map->cache_only = false;
442
Mark Brownbf315172011-12-03 17:06:20 +0000443 ret = regcache_init(map, config);
444
Stephen Warrenbacdbe02012-04-04 15:48:28 -0600445 map->unlock(map);
Mark Brownbf315172011-12-03 17:06:20 +0000446
447 return ret;
448}
449
450/**
Mark Brownb83a3132011-05-11 19:59:58 +0200451 * regmap_exit(): Free a previously allocated register map
452 */
453void regmap_exit(struct regmap *map)
454{
Dimitris Papastamos5d1729e2011-09-19 14:34:05 +0100455 regcache_exit(map);
Mark Brown31244e32011-07-20 22:56:53 +0100456 regmap_debugfs_exit(map);
Stephen Warren0135bbc2012-04-04 15:48:30 -0600457 if (map->bus->free_context)
458 map->bus->free_context(map->bus_context);
Mark Brownb83a3132011-05-11 19:59:58 +0200459 kfree(map->work_buf);
Mark Brownb83a3132011-05-11 19:59:58 +0200460 kfree(map);
461}
462EXPORT_SYMBOL_GPL(regmap_exit);
463
464static int _regmap_raw_write(struct regmap *map, unsigned int reg,
465 const void *val, size_t val_len)
466{
Lars-Peter Clausen6f306442011-09-05 20:46:32 +0200467 u8 *u8 = map->work_buf;
Mark Brownb83a3132011-05-11 19:59:58 +0200468 void *buf;
469 int ret = -ENOTSUPP;
470 size_t len;
Mark Brown73304782011-07-24 11:46:20 +0100471 int i;
472
473 /* Check for unwritable registers before we start */
474 if (map->writeable_reg)
475 for (i = 0; i < val_len / map->format.val_bytes; i++)
Stephen Warrenf01ee602012-04-09 13:40:24 -0600476 if (!map->writeable_reg(map->dev,
477 reg + (i * map->reg_stride)))
Mark Brown73304782011-07-24 11:46:20 +0100478 return -EINVAL;
Mark Brownb83a3132011-05-11 19:59:58 +0200479
Laxman Dewanganc9157192012-02-10 21:30:27 +0530480 if (!map->cache_bypass && map->format.parse_val) {
481 unsigned int ival;
482 int val_bytes = map->format.val_bytes;
483 for (i = 0; i < val_len / val_bytes; i++) {
484 memcpy(map->work_buf, val + (i * val_bytes), val_bytes);
485 ival = map->format.parse_val(map->work_buf);
Stephen Warrenf01ee602012-04-09 13:40:24 -0600486 ret = regcache_write(map, reg + (i * map->reg_stride),
487 ival);
Laxman Dewanganc9157192012-02-10 21:30:27 +0530488 if (ret) {
489 dev_err(map->dev,
490 "Error in caching of register: %u ret: %d\n",
491 reg + i, ret);
492 return ret;
493 }
494 }
495 if (map->cache_only) {
496 map->cache_dirty = true;
497 return 0;
498 }
499 }
500
Marc Reillyd939fb92012-03-16 12:11:43 +1100501 map->format.format_reg(map->work_buf, reg, map->reg_shift);
Mark Brownb83a3132011-05-11 19:59:58 +0200502
Lars-Peter Clausen6f306442011-09-05 20:46:32 +0200503 u8[0] |= map->write_flag_mask;
504
Mark Brownfb2736b2011-07-24 21:30:55 +0100505 trace_regmap_hw_write_start(map->dev, reg,
506 val_len / map->format.val_bytes);
507
Mark Brown2547e202011-07-20 21:47:22 +0100508 /* If we're doing a single register write we can probably just
509 * send the work_buf directly, otherwise try to do a gather
510 * write.
511 */
Mark Brown82159ba2012-01-18 10:52:25 +0000512 if (val == (map->work_buf + map->format.pad_bytes +
513 map->format.reg_bytes))
Stephen Warren0135bbc2012-04-04 15:48:30 -0600514 ret = map->bus->write(map->bus_context, map->work_buf,
Mark Brown82159ba2012-01-18 10:52:25 +0000515 map->format.reg_bytes +
516 map->format.pad_bytes +
517 val_len);
Mark Brown2547e202011-07-20 21:47:22 +0100518 else if (map->bus->gather_write)
Stephen Warren0135bbc2012-04-04 15:48:30 -0600519 ret = map->bus->gather_write(map->bus_context, map->work_buf,
Mark Brown82159ba2012-01-18 10:52:25 +0000520 map->format.reg_bytes +
521 map->format.pad_bytes,
Mark Brownb83a3132011-05-11 19:59:58 +0200522 val, val_len);
523
Mark Brown2547e202011-07-20 21:47:22 +0100524 /* If that didn't work fall back on linearising by hand. */
Mark Brownb83a3132011-05-11 19:59:58 +0200525 if (ret == -ENOTSUPP) {
Mark Brown82159ba2012-01-18 10:52:25 +0000526 len = map->format.reg_bytes + map->format.pad_bytes + val_len;
527 buf = kzalloc(len, GFP_KERNEL);
Mark Brownb83a3132011-05-11 19:59:58 +0200528 if (!buf)
529 return -ENOMEM;
530
531 memcpy(buf, map->work_buf, map->format.reg_bytes);
Mark Brown82159ba2012-01-18 10:52:25 +0000532 memcpy(buf + map->format.reg_bytes + map->format.pad_bytes,
533 val, val_len);
Stephen Warren0135bbc2012-04-04 15:48:30 -0600534 ret = map->bus->write(map->bus_context, buf, len);
Mark Brownb83a3132011-05-11 19:59:58 +0200535
536 kfree(buf);
537 }
538
Mark Brownfb2736b2011-07-24 21:30:55 +0100539 trace_regmap_hw_write_done(map->dev, reg,
540 val_len / map->format.val_bytes);
541
Mark Brownb83a3132011-05-11 19:59:58 +0200542 return ret;
543}
544
Dimitris Papastamos4d2dc092011-09-29 10:39:07 +0100545int _regmap_write(struct regmap *map, unsigned int reg,
546 unsigned int val)
Mark Brownb83a3132011-05-11 19:59:58 +0200547{
Mark Brownfb2736b2011-07-24 21:30:55 +0100548 int ret;
Mark Brownb83a3132011-05-11 19:59:58 +0200549 BUG_ON(!map->format.format_write && !map->format.format_val);
550
Laxman Dewanganc9157192012-02-10 21:30:27 +0530551 if (!map->cache_bypass && map->format.format_write) {
Dimitris Papastamos5d1729e2011-09-19 14:34:05 +0100552 ret = regcache_write(map, reg, val);
553 if (ret != 0)
554 return ret;
Mark Brown8ae0d7e2011-10-26 10:34:22 +0200555 if (map->cache_only) {
556 map->cache_dirty = true;
Dimitris Papastamos5d1729e2011-09-19 14:34:05 +0100557 return 0;
Mark Brown8ae0d7e2011-10-26 10:34:22 +0200558 }
Dimitris Papastamos5d1729e2011-09-19 14:34:05 +0100559 }
560
Mark Brownfb2736b2011-07-24 21:30:55 +0100561 trace_regmap_reg_write(map->dev, reg, val);
562
Mark Brownb83a3132011-05-11 19:59:58 +0200563 if (map->format.format_write) {
564 map->format.format_write(map, reg, val);
565
Mark Brownfb2736b2011-07-24 21:30:55 +0100566 trace_regmap_hw_write_start(map->dev, reg, 1);
567
Stephen Warren0135bbc2012-04-04 15:48:30 -0600568 ret = map->bus->write(map->bus_context, map->work_buf,
Mark Brownfb2736b2011-07-24 21:30:55 +0100569 map->format.buf_size);
570
571 trace_regmap_hw_write_done(map->dev, reg, 1);
572
573 return ret;
Mark Brownb83a3132011-05-11 19:59:58 +0200574 } else {
Mark Brown82159ba2012-01-18 10:52:25 +0000575 map->format.format_val(map->work_buf + map->format.reg_bytes
Marc Reillyd939fb92012-03-16 12:11:43 +1100576 + map->format.pad_bytes, val, 0);
Mark Brownb83a3132011-05-11 19:59:58 +0200577 return _regmap_raw_write(map, reg,
Mark Brown82159ba2012-01-18 10:52:25 +0000578 map->work_buf +
579 map->format.reg_bytes +
580 map->format.pad_bytes,
Mark Brownb83a3132011-05-11 19:59:58 +0200581 map->format.val_bytes);
582 }
583}
584
585/**
586 * regmap_write(): Write a value to a single register
587 *
588 * @map: Register map to write to
589 * @reg: Register to write to
590 * @val: Value to be written
591 *
592 * A value of zero will be returned on success, a negative errno will
593 * be returned in error cases.
594 */
595int regmap_write(struct regmap *map, unsigned int reg, unsigned int val)
596{
597 int ret;
598
Stephen Warrenf01ee602012-04-09 13:40:24 -0600599 if (reg % map->reg_stride)
600 return -EINVAL;
601
Stephen Warrenbacdbe02012-04-04 15:48:28 -0600602 map->lock(map);
Mark Brownb83a3132011-05-11 19:59:58 +0200603
604 ret = _regmap_write(map, reg, val);
605
Stephen Warrenbacdbe02012-04-04 15:48:28 -0600606 map->unlock(map);
Mark Brownb83a3132011-05-11 19:59:58 +0200607
608 return ret;
609}
610EXPORT_SYMBOL_GPL(regmap_write);
611
612/**
613 * regmap_raw_write(): Write raw values to one or more registers
614 *
615 * @map: Register map to write to
616 * @reg: Initial register to write to
617 * @val: Block of data to be written, laid out for direct transmission to the
618 * device
619 * @val_len: Length of data pointed to by val.
620 *
621 * This function is intended to be used for things like firmware
622 * download where a large block of data needs to be transferred to the
623 * device. No formatting will be done on the data provided.
624 *
625 * A value of zero will be returned on success, a negative errno will
626 * be returned in error cases.
627 */
628int regmap_raw_write(struct regmap *map, unsigned int reg,
629 const void *val, size_t val_len)
630{
631 int ret;
632
Stephen Warren851960b2012-04-06 15:16:03 -0600633 if (val_len % map->format.val_bytes)
634 return -EINVAL;
Stephen Warrenf01ee602012-04-09 13:40:24 -0600635 if (reg % map->reg_stride)
636 return -EINVAL;
Stephen Warren851960b2012-04-06 15:16:03 -0600637
Stephen Warrenbacdbe02012-04-04 15:48:28 -0600638 map->lock(map);
Mark Brownb83a3132011-05-11 19:59:58 +0200639
640 ret = _regmap_raw_write(map, reg, val, val_len);
641
Stephen Warrenbacdbe02012-04-04 15:48:28 -0600642 map->unlock(map);
Mark Brownb83a3132011-05-11 19:59:58 +0200643
644 return ret;
645}
646EXPORT_SYMBOL_GPL(regmap_raw_write);
647
Laxman Dewangan8eaeb212012-02-12 19:49:43 +0530648/*
649 * regmap_bulk_write(): Write multiple registers to the device
650 *
651 * @map: Register map to write to
652 * @reg: First register to be write from
653 * @val: Block of data to be written, in native register size for device
654 * @val_count: Number of registers to write
655 *
656 * This function is intended to be used for writing a large block of
657 * data to be device either in single transfer or multiple transfer.
658 *
659 * A value of zero will be returned on success, a negative errno will
660 * be returned in error cases.
661 */
662int regmap_bulk_write(struct regmap *map, unsigned int reg, const void *val,
663 size_t val_count)
664{
665 int ret = 0, i;
666 size_t val_bytes = map->format.val_bytes;
667 void *wval;
668
669 if (!map->format.parse_val)
670 return -EINVAL;
Stephen Warrenf01ee602012-04-09 13:40:24 -0600671 if (reg % map->reg_stride)
672 return -EINVAL;
Laxman Dewangan8eaeb212012-02-12 19:49:43 +0530673
Stephen Warrenbacdbe02012-04-04 15:48:28 -0600674 map->lock(map);
Laxman Dewangan8eaeb212012-02-12 19:49:43 +0530675
676 /* No formatting is require if val_byte is 1 */
677 if (val_bytes == 1) {
678 wval = (void *)val;
679 } else {
680 wval = kmemdup(val, val_count * val_bytes, GFP_KERNEL);
681 if (!wval) {
682 ret = -ENOMEM;
683 dev_err(map->dev, "Error in memory allocation\n");
684 goto out;
685 }
686 for (i = 0; i < val_count * val_bytes; i += val_bytes)
687 map->format.parse_val(wval + i);
688 }
689 ret = _regmap_raw_write(map, reg, wval, val_bytes * val_count);
690
691 if (val_bytes != 1)
692 kfree(wval);
693
694out:
Stephen Warrenbacdbe02012-04-04 15:48:28 -0600695 map->unlock(map);
Laxman Dewangan8eaeb212012-02-12 19:49:43 +0530696 return ret;
697}
698EXPORT_SYMBOL_GPL(regmap_bulk_write);
699
Mark Brownb83a3132011-05-11 19:59:58 +0200700static int _regmap_raw_read(struct regmap *map, unsigned int reg, void *val,
701 unsigned int val_len)
702{
703 u8 *u8 = map->work_buf;
704 int ret;
705
Marc Reillyd939fb92012-03-16 12:11:43 +1100706 map->format.format_reg(map->work_buf, reg, map->reg_shift);
Mark Brownb83a3132011-05-11 19:59:58 +0200707
708 /*
Lars-Peter Clausen6f306442011-09-05 20:46:32 +0200709 * Some buses or devices flag reads by setting the high bits in the
Mark Brownb83a3132011-05-11 19:59:58 +0200710 * register addresss; since it's always the high bits for all
711 * current formats we can do this here rather than in
712 * formatting. This may break if we get interesting formats.
713 */
Lars-Peter Clausen6f306442011-09-05 20:46:32 +0200714 u8[0] |= map->read_flag_mask;
Mark Brownb83a3132011-05-11 19:59:58 +0200715
Mark Brownfb2736b2011-07-24 21:30:55 +0100716 trace_regmap_hw_read_start(map->dev, reg,
717 val_len / map->format.val_bytes);
718
Stephen Warren0135bbc2012-04-04 15:48:30 -0600719 ret = map->bus->read(map->bus_context, map->work_buf,
Mark Brown82159ba2012-01-18 10:52:25 +0000720 map->format.reg_bytes + map->format.pad_bytes,
Mark Brown40c5cc22011-07-24 22:39:12 +0100721 val, val_len);
Mark Brownb83a3132011-05-11 19:59:58 +0200722
Mark Brownfb2736b2011-07-24 21:30:55 +0100723 trace_regmap_hw_read_done(map->dev, reg,
724 val_len / map->format.val_bytes);
725
726 return ret;
Mark Brownb83a3132011-05-11 19:59:58 +0200727}
728
729static int _regmap_read(struct regmap *map, unsigned int reg,
730 unsigned int *val)
731{
732 int ret;
733
Dimitris Papastamos5d1729e2011-09-19 14:34:05 +0100734 if (!map->cache_bypass) {
735 ret = regcache_read(map, reg, val);
736 if (ret == 0)
737 return 0;
738 }
739
Lars-Peter Clausen19254412011-11-16 16:28:19 +0100740 if (!map->format.parse_val)
741 return -EINVAL;
742
Dimitris Papastamos5d1729e2011-09-19 14:34:05 +0100743 if (map->cache_only)
744 return -EBUSY;
745
Mark Brownb83a3132011-05-11 19:59:58 +0200746 ret = _regmap_raw_read(map, reg, map->work_buf, map->format.val_bytes);
Mark Brownfb2736b2011-07-24 21:30:55 +0100747 if (ret == 0) {
Mark Brownb83a3132011-05-11 19:59:58 +0200748 *val = map->format.parse_val(map->work_buf);
Mark Brownfb2736b2011-07-24 21:30:55 +0100749 trace_regmap_reg_read(map->dev, reg, *val);
750 }
Mark Brownb83a3132011-05-11 19:59:58 +0200751
752 return ret;
753}
754
755/**
756 * regmap_read(): Read a value from a single register
757 *
758 * @map: Register map to write to
759 * @reg: Register to be read from
760 * @val: Pointer to store read value
761 *
762 * A value of zero will be returned on success, a negative errno will
763 * be returned in error cases.
764 */
765int regmap_read(struct regmap *map, unsigned int reg, unsigned int *val)
766{
767 int ret;
768
Stephen Warrenf01ee602012-04-09 13:40:24 -0600769 if (reg % map->reg_stride)
770 return -EINVAL;
771
Stephen Warrenbacdbe02012-04-04 15:48:28 -0600772 map->lock(map);
Mark Brownb83a3132011-05-11 19:59:58 +0200773
774 ret = _regmap_read(map, reg, val);
775
Stephen Warrenbacdbe02012-04-04 15:48:28 -0600776 map->unlock(map);
Mark Brownb83a3132011-05-11 19:59:58 +0200777
778 return ret;
779}
780EXPORT_SYMBOL_GPL(regmap_read);
781
782/**
783 * regmap_raw_read(): Read raw data from the device
784 *
785 * @map: Register map to write to
786 * @reg: First register to be read from
787 * @val: Pointer to store read value
788 * @val_len: Size of data to read
789 *
790 * A value of zero will be returned on success, a negative errno will
791 * be returned in error cases.
792 */
793int regmap_raw_read(struct regmap *map, unsigned int reg, void *val,
794 size_t val_len)
795{
Mark Brownb8fb5ab2012-02-21 19:12:47 +0000796 size_t val_bytes = map->format.val_bytes;
797 size_t val_count = val_len / val_bytes;
798 unsigned int v;
799 int ret, i;
Mark Brown04e016a2011-10-09 13:35:43 +0100800
Stephen Warren851960b2012-04-06 15:16:03 -0600801 if (val_len % map->format.val_bytes)
802 return -EINVAL;
Stephen Warrenf01ee602012-04-09 13:40:24 -0600803 if (reg % map->reg_stride)
804 return -EINVAL;
Stephen Warren851960b2012-04-06 15:16:03 -0600805
Stephen Warrenbacdbe02012-04-04 15:48:28 -0600806 map->lock(map);
Mark Brownb83a3132011-05-11 19:59:58 +0200807
Mark Brownb8fb5ab2012-02-21 19:12:47 +0000808 if (regmap_volatile_range(map, reg, val_count) || map->cache_bypass ||
809 map->cache_type == REGCACHE_NONE) {
810 /* Physical block read if there's no cache involved */
811 ret = _regmap_raw_read(map, reg, val, val_len);
Mark Brownb83a3132011-05-11 19:59:58 +0200812
Mark Brownb8fb5ab2012-02-21 19:12:47 +0000813 } else {
814 /* Otherwise go word by word for the cache; should be low
815 * cost as we expect to hit the cache.
816 */
817 for (i = 0; i < val_count; i++) {
Stephen Warrenf01ee602012-04-09 13:40:24 -0600818 ret = _regmap_read(map, reg + (i * map->reg_stride),
819 &v);
Mark Brownb8fb5ab2012-02-21 19:12:47 +0000820 if (ret != 0)
821 goto out;
822
Marc Reillyd939fb92012-03-16 12:11:43 +1100823 map->format.format_val(val + (i * val_bytes), v, 0);
Mark Brownb8fb5ab2012-02-21 19:12:47 +0000824 }
825 }
826
827 out:
Stephen Warrenbacdbe02012-04-04 15:48:28 -0600828 map->unlock(map);
Mark Brownb83a3132011-05-11 19:59:58 +0200829
830 return ret;
831}
832EXPORT_SYMBOL_GPL(regmap_raw_read);
833
834/**
835 * regmap_bulk_read(): Read multiple registers from the device
836 *
837 * @map: Register map to write to
838 * @reg: First register to be read from
839 * @val: Pointer to store read value, in native register size for device
840 * @val_count: Number of registers to read
841 *
842 * A value of zero will be returned on success, a negative errno will
843 * be returned in error cases.
844 */
845int regmap_bulk_read(struct regmap *map, unsigned int reg, void *val,
846 size_t val_count)
847{
848 int ret, i;
849 size_t val_bytes = map->format.val_bytes;
Lars-Peter Clausen82cd9962011-11-08 18:37:25 +0100850 bool vol = regmap_volatile_range(map, reg, val_count);
Dimitris Papastamos5d1729e2011-09-19 14:34:05 +0100851
Mark Brownb83a3132011-05-11 19:59:58 +0200852 if (!map->format.parse_val)
853 return -EINVAL;
Stephen Warrenf01ee602012-04-09 13:40:24 -0600854 if (reg % map->reg_stride)
855 return -EINVAL;
Mark Brownb83a3132011-05-11 19:59:58 +0200856
Mark Brownde2d8082011-10-10 13:24:52 +0100857 if (vol || map->cache_type == REGCACHE_NONE) {
858 ret = regmap_raw_read(map, reg, val, val_bytes * val_count);
859 if (ret != 0)
860 return ret;
861
862 for (i = 0; i < val_count * val_bytes; i += val_bytes)
863 map->format.parse_val(val + i);
864 } else {
865 for (i = 0; i < val_count; i++) {
Stephen Warrenf01ee602012-04-09 13:40:24 -0600866 ret = regmap_read(map, reg + (i * map->reg_stride),
867 val + (i * val_bytes));
Mark Brownde2d8082011-10-10 13:24:52 +0100868 if (ret != 0)
869 return ret;
870 }
871 }
Mark Brownb83a3132011-05-11 19:59:58 +0200872
873 return 0;
874}
875EXPORT_SYMBOL_GPL(regmap_bulk_read);
876
Mark Brown018690d2011-11-29 20:10:36 +0000877static int _regmap_update_bits(struct regmap *map, unsigned int reg,
878 unsigned int mask, unsigned int val,
879 bool *change)
Mark Brownb83a3132011-05-11 19:59:58 +0200880{
881 int ret;
Mark Brownd91e8db2011-11-18 16:03:50 +0000882 unsigned int tmp, orig;
Mark Brownb83a3132011-05-11 19:59:58 +0200883
Stephen Warrenbacdbe02012-04-04 15:48:28 -0600884 map->lock(map);
Mark Brownb83a3132011-05-11 19:59:58 +0200885
Mark Brownd91e8db2011-11-18 16:03:50 +0000886 ret = _regmap_read(map, reg, &orig);
Mark Brownb83a3132011-05-11 19:59:58 +0200887 if (ret != 0)
888 goto out;
889
Mark Brownd91e8db2011-11-18 16:03:50 +0000890 tmp = orig & ~mask;
Mark Brownb83a3132011-05-11 19:59:58 +0200891 tmp |= val & mask;
892
Mark Brown018690d2011-11-29 20:10:36 +0000893 if (tmp != orig) {
Mark Brownd91e8db2011-11-18 16:03:50 +0000894 ret = _regmap_write(map, reg, tmp);
Mark Brown018690d2011-11-29 20:10:36 +0000895 *change = true;
896 } else {
897 *change = false;
898 }
Mark Brownb83a3132011-05-11 19:59:58 +0200899
900out:
Stephen Warrenbacdbe02012-04-04 15:48:28 -0600901 map->unlock(map);
Mark Brownb83a3132011-05-11 19:59:58 +0200902
903 return ret;
904}
Mark Brown018690d2011-11-29 20:10:36 +0000905
906/**
907 * regmap_update_bits: Perform a read/modify/write cycle on the register map
908 *
909 * @map: Register map to update
910 * @reg: Register to update
911 * @mask: Bitmask to change
912 * @val: New value for bitmask
913 *
914 * Returns zero for success, a negative number on error.
915 */
916int regmap_update_bits(struct regmap *map, unsigned int reg,
917 unsigned int mask, unsigned int val)
918{
919 bool change;
920 return _regmap_update_bits(map, reg, mask, val, &change);
921}
Mark Brownb83a3132011-05-11 19:59:58 +0200922EXPORT_SYMBOL_GPL(regmap_update_bits);
Mark Brown31244e32011-07-20 22:56:53 +0100923
Mark Brown018690d2011-11-29 20:10:36 +0000924/**
925 * regmap_update_bits_check: Perform a read/modify/write cycle on the
926 * register map and report if updated
927 *
928 * @map: Register map to update
929 * @reg: Register to update
930 * @mask: Bitmask to change
931 * @val: New value for bitmask
932 * @change: Boolean indicating if a write was done
933 *
934 * Returns zero for success, a negative number on error.
935 */
936int regmap_update_bits_check(struct regmap *map, unsigned int reg,
937 unsigned int mask, unsigned int val,
938 bool *change)
939{
940 return _regmap_update_bits(map, reg, mask, val, change);
941}
942EXPORT_SYMBOL_GPL(regmap_update_bits_check);
943
Mark Brown22f0d902012-01-21 12:01:14 +0000944/**
945 * regmap_register_patch: Register and apply register updates to be applied
946 * on device initialistion
947 *
948 * @map: Register map to apply updates to.
949 * @regs: Values to update.
950 * @num_regs: Number of entries in regs.
951 *
952 * Register a set of register updates to be applied to the device
953 * whenever the device registers are synchronised with the cache and
954 * apply them immediately. Typically this is used to apply
955 * corrections to be applied to the device defaults on startup, such
956 * as the updates some vendors provide to undocumented registers.
957 */
958int regmap_register_patch(struct regmap *map, const struct reg_default *regs,
959 int num_regs)
960{
961 int i, ret;
962 bool bypass;
963
964 /* If needed the implementation can be extended to support this */
965 if (map->patch)
966 return -EBUSY;
967
Stephen Warrenbacdbe02012-04-04 15:48:28 -0600968 map->lock(map);
Mark Brown22f0d902012-01-21 12:01:14 +0000969
970 bypass = map->cache_bypass;
971
972 map->cache_bypass = true;
973
974 /* Write out first; it's useful to apply even if we fail later. */
975 for (i = 0; i < num_regs; i++) {
976 ret = _regmap_write(map, regs[i].reg, regs[i].def);
977 if (ret != 0) {
978 dev_err(map->dev, "Failed to write %x = %x: %d\n",
979 regs[i].reg, regs[i].def, ret);
980 goto out;
981 }
982 }
983
Axel Lin2a14d7d2012-02-10 19:29:55 +0800984 map->patch = kcalloc(num_regs, sizeof(struct reg_default), GFP_KERNEL);
Mark Brown22f0d902012-01-21 12:01:14 +0000985 if (map->patch != NULL) {
986 memcpy(map->patch, regs,
987 num_regs * sizeof(struct reg_default));
988 map->patch_regs = num_regs;
989 } else {
990 ret = -ENOMEM;
991 }
992
993out:
994 map->cache_bypass = bypass;
995
Stephen Warrenbacdbe02012-04-04 15:48:28 -0600996 map->unlock(map);
Mark Brown22f0d902012-01-21 12:01:14 +0000997
998 return ret;
999}
1000EXPORT_SYMBOL_GPL(regmap_register_patch);
1001
Mark Browneae4b512012-03-14 13:15:03 +00001002/*
Mark Browna6539c32012-02-17 14:20:14 -08001003 * regmap_get_val_bytes(): Report the size of a register value
1004 *
1005 * Report the size of a register value, mainly intended to for use by
1006 * generic infrastructure built on top of regmap.
1007 */
1008int regmap_get_val_bytes(struct regmap *map)
1009{
1010 if (map->format.format_write)
1011 return -EINVAL;
1012
1013 return map->format.val_bytes;
1014}
1015EXPORT_SYMBOL_GPL(regmap_get_val_bytes);
1016
Mark Brown31244e32011-07-20 22:56:53 +01001017static int __init regmap_initcall(void)
1018{
1019 regmap_debugfs_initcall();
1020
1021 return 0;
1022}
1023postcore_initcall(regmap_initcall);