xref: /linux/drivers/base/regmap/regmap.c (revision f2ee442115c9b6219083c019939a9cc0c9abb2f8)
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>
14 #include <linux/module.h>
15 #include <linux/mutex.h>
16 #include <linux/err.h>
17 
18 #define CREATE_TRACE_POINTS
19 #include <trace/events/regmap.h>
20 
21 #include "internal.h"
22 
23 bool 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 
34 bool regmap_readable(struct regmap *map, unsigned int reg)
35 {
36 	if (map->max_register && reg > map->max_register)
37 		return false;
38 
39 	if (map->readable_reg)
40 		return map->readable_reg(map->dev, reg);
41 
42 	return true;
43 }
44 
45 bool regmap_volatile(struct regmap *map, unsigned int reg)
46 {
47 	if (map->max_register && reg > map->max_register)
48 		return false;
49 
50 	if (map->volatile_reg)
51 		return map->volatile_reg(map->dev, reg);
52 
53 	return true;
54 }
55 
56 bool regmap_precious(struct regmap *map, unsigned int reg)
57 {
58 	if (map->max_register && reg > map->max_register)
59 		return false;
60 
61 	if (map->precious_reg)
62 		return map->precious_reg(map->dev, reg);
63 
64 	return false;
65 }
66 
67 static void regmap_format_4_12_write(struct regmap *map,
68 				     unsigned int reg, unsigned int val)
69 {
70 	__be16 *out = map->work_buf;
71 	*out = cpu_to_be16((reg << 12) | val);
72 }
73 
74 static void regmap_format_7_9_write(struct regmap *map,
75 				    unsigned int reg, unsigned int val)
76 {
77 	__be16 *out = map->work_buf;
78 	*out = cpu_to_be16((reg << 9) | val);
79 }
80 
81 static void regmap_format_8(void *buf, unsigned int val)
82 {
83 	u8 *b = buf;
84 
85 	b[0] = val;
86 }
87 
88 static void regmap_format_16(void *buf, unsigned int val)
89 {
90 	__be16 *b = buf;
91 
92 	b[0] = cpu_to_be16(val);
93 }
94 
95 static unsigned int regmap_parse_8(void *buf)
96 {
97 	u8 *b = buf;
98 
99 	return b[0];
100 }
101 
102 static unsigned int regmap_parse_16(void *buf)
103 {
104 	__be16 *b = buf;
105 
106 	b[0] = be16_to_cpu(b[0]);
107 
108 	return b[0];
109 }
110 
111 /**
112  * regmap_init(): Initialise register map
113  *
114  * @dev: Device that will be interacted with
115  * @bus: Bus-specific callbacks to use with device
116  * @config: Configuration for register map
117  *
118  * The return value will be an ERR_PTR() on error or a valid pointer to
119  * a struct regmap.  This function should generally not be called
120  * directly, it should be called by bus-specific init functions.
121  */
122 struct regmap *regmap_init(struct device *dev,
123 			   const struct regmap_bus *bus,
124 			   const struct regmap_config *config)
125 {
126 	struct regmap *map;
127 	int ret = -EINVAL;
128 
129 	if (!bus || !config)
130 		return NULL;
131 
132 	map = kzalloc(sizeof(*map), GFP_KERNEL);
133 	if (map == NULL) {
134 		ret = -ENOMEM;
135 		goto err;
136 	}
137 
138 	mutex_init(&map->lock);
139 	map->format.buf_size = (config->reg_bits + config->val_bits) / 8;
140 	map->format.reg_bytes = config->reg_bits / 8;
141 	map->format.val_bytes = config->val_bits / 8;
142 	map->dev = dev;
143 	map->bus = bus;
144 	map->max_register = config->max_register;
145 	map->writeable_reg = config->writeable_reg;
146 	map->readable_reg = config->readable_reg;
147 	map->volatile_reg = config->volatile_reg;
148 	map->precious_reg = config->precious_reg;
149 	map->cache_type = config->cache_type;
150 	map->reg_defaults = config->reg_defaults;
151 	map->num_reg_defaults = config->num_reg_defaults;
152 	map->num_reg_defaults_raw = config->num_reg_defaults_raw;
153 	map->reg_defaults_raw = config->reg_defaults_raw;
154 	map->cache_size_raw = (config->val_bits / 8) * config->num_reg_defaults_raw;
155 	map->cache_word_size = config->val_bits / 8;
156 
157 	if (config->read_flag_mask || config->write_flag_mask) {
158 		map->read_flag_mask = config->read_flag_mask;
159 		map->write_flag_mask = config->write_flag_mask;
160 	} else {
161 		map->read_flag_mask = bus->read_flag_mask;
162 	}
163 
164 	switch (config->reg_bits) {
165 	case 4:
166 		switch (config->val_bits) {
167 		case 12:
168 			map->format.format_write = regmap_format_4_12_write;
169 			break;
170 		default:
171 			goto err_map;
172 		}
173 		break;
174 
175 	case 7:
176 		switch (config->val_bits) {
177 		case 9:
178 			map->format.format_write = regmap_format_7_9_write;
179 			break;
180 		default:
181 			goto err_map;
182 		}
183 		break;
184 
185 	case 8:
186 		map->format.format_reg = regmap_format_8;
187 		break;
188 
189 	case 16:
190 		map->format.format_reg = regmap_format_16;
191 		break;
192 
193 	default:
194 		goto err_map;
195 	}
196 
197 	switch (config->val_bits) {
198 	case 8:
199 		map->format.format_val = regmap_format_8;
200 		map->format.parse_val = regmap_parse_8;
201 		break;
202 	case 16:
203 		map->format.format_val = regmap_format_16;
204 		map->format.parse_val = regmap_parse_16;
205 		break;
206 	}
207 
208 	if (!map->format.format_write &&
209 	    !(map->format.format_reg && map->format.format_val))
210 		goto err_map;
211 
212 	map->work_buf = kmalloc(map->format.buf_size, GFP_KERNEL);
213 	if (map->work_buf == NULL) {
214 		ret = -ENOMEM;
215 		goto err_map;
216 	}
217 
218 	ret = regcache_init(map);
219 	if (ret < 0)
220 		goto err_map;
221 
222 	regmap_debugfs_init(map);
223 
224 	return map;
225 
226 err_map:
227 	kfree(map);
228 err:
229 	return ERR_PTR(ret);
230 }
231 EXPORT_SYMBOL_GPL(regmap_init);
232 
233 /**
234  * regmap_exit(): Free a previously allocated register map
235  */
236 void regmap_exit(struct regmap *map)
237 {
238 	regcache_exit(map);
239 	regmap_debugfs_exit(map);
240 	kfree(map->work_buf);
241 	kfree(map);
242 }
243 EXPORT_SYMBOL_GPL(regmap_exit);
244 
245 static int _regmap_raw_write(struct regmap *map, unsigned int reg,
246 			     const void *val, size_t val_len)
247 {
248 	u8 *u8 = map->work_buf;
249 	void *buf;
250 	int ret = -ENOTSUPP;
251 	size_t len;
252 	int i;
253 
254 	/* Check for unwritable registers before we start */
255 	if (map->writeable_reg)
256 		for (i = 0; i < val_len / map->format.val_bytes; i++)
257 			if (!map->writeable_reg(map->dev, reg + i))
258 				return -EINVAL;
259 
260 	map->format.format_reg(map->work_buf, reg);
261 
262 	u8[0] |= map->write_flag_mask;
263 
264 	trace_regmap_hw_write_start(map->dev, reg,
265 				    val_len / map->format.val_bytes);
266 
267 	/* If we're doing a single register write we can probably just
268 	 * send the work_buf directly, otherwise try to do a gather
269 	 * write.
270 	 */
271 	if (val == map->work_buf + map->format.reg_bytes)
272 		ret = map->bus->write(map->dev, map->work_buf,
273 				      map->format.reg_bytes + val_len);
274 	else if (map->bus->gather_write)
275 		ret = map->bus->gather_write(map->dev, map->work_buf,
276 					     map->format.reg_bytes,
277 					     val, val_len);
278 
279 	/* If that didn't work fall back on linearising by hand. */
280 	if (ret == -ENOTSUPP) {
281 		len = map->format.reg_bytes + val_len;
282 		buf = kmalloc(len, GFP_KERNEL);
283 		if (!buf)
284 			return -ENOMEM;
285 
286 		memcpy(buf, map->work_buf, map->format.reg_bytes);
287 		memcpy(buf + map->format.reg_bytes, val, val_len);
288 		ret = map->bus->write(map->dev, buf, len);
289 
290 		kfree(buf);
291 	}
292 
293 	trace_regmap_hw_write_done(map->dev, reg,
294 				   val_len / map->format.val_bytes);
295 
296 	return ret;
297 }
298 
299 int _regmap_write(struct regmap *map, unsigned int reg,
300 		  unsigned int val)
301 {
302 	int ret;
303 	BUG_ON(!map->format.format_write && !map->format.format_val);
304 
305 	if (!map->cache_bypass) {
306 		ret = regcache_write(map, reg, val);
307 		if (ret != 0)
308 			return ret;
309 		if (map->cache_only)
310 			return 0;
311 	}
312 
313 	trace_regmap_reg_write(map->dev, reg, val);
314 
315 	if (map->format.format_write) {
316 		map->format.format_write(map, reg, val);
317 
318 		trace_regmap_hw_write_start(map->dev, reg, 1);
319 
320 		ret = map->bus->write(map->dev, map->work_buf,
321 				      map->format.buf_size);
322 
323 		trace_regmap_hw_write_done(map->dev, reg, 1);
324 
325 		return ret;
326 	} else {
327 		map->format.format_val(map->work_buf + map->format.reg_bytes,
328 				       val);
329 		return _regmap_raw_write(map, reg,
330 					 map->work_buf + map->format.reg_bytes,
331 					 map->format.val_bytes);
332 	}
333 }
334 
335 /**
336  * regmap_write(): Write a value to a single register
337  *
338  * @map: Register map to write to
339  * @reg: Register to write to
340  * @val: Value to be written
341  *
342  * A value of zero will be returned on success, a negative errno will
343  * be returned in error cases.
344  */
345 int regmap_write(struct regmap *map, unsigned int reg, unsigned int val)
346 {
347 	int ret;
348 
349 	mutex_lock(&map->lock);
350 
351 	ret = _regmap_write(map, reg, val);
352 
353 	mutex_unlock(&map->lock);
354 
355 	return ret;
356 }
357 EXPORT_SYMBOL_GPL(regmap_write);
358 
359 /**
360  * regmap_raw_write(): Write raw values to one or more registers
361  *
362  * @map: Register map to write to
363  * @reg: Initial register to write to
364  * @val: Block of data to be written, laid out for direct transmission to the
365  *       device
366  * @val_len: Length of data pointed to by val.
367  *
368  * This function is intended to be used for things like firmware
369  * download where a large block of data needs to be transferred to the
370  * device.  No formatting will be done on the data provided.
371  *
372  * A value of zero will be returned on success, a negative errno will
373  * be returned in error cases.
374  */
375 int regmap_raw_write(struct regmap *map, unsigned int reg,
376 		     const void *val, size_t val_len)
377 {
378 	int ret;
379 
380 	WARN_ON(map->cache_type != REGCACHE_NONE);
381 
382 	mutex_lock(&map->lock);
383 
384 	ret = _regmap_raw_write(map, reg, val, val_len);
385 
386 	mutex_unlock(&map->lock);
387 
388 	return ret;
389 }
390 EXPORT_SYMBOL_GPL(regmap_raw_write);
391 
392 static int _regmap_raw_read(struct regmap *map, unsigned int reg, void *val,
393 			    unsigned int val_len)
394 {
395 	u8 *u8 = map->work_buf;
396 	int ret;
397 
398 	map->format.format_reg(map->work_buf, reg);
399 
400 	/*
401 	 * Some buses or devices flag reads by setting the high bits in the
402 	 * register addresss; since it's always the high bits for all
403 	 * current formats we can do this here rather than in
404 	 * formatting.  This may break if we get interesting formats.
405 	 */
406 	u8[0] |= map->read_flag_mask;
407 
408 	trace_regmap_hw_read_start(map->dev, reg,
409 				   val_len / map->format.val_bytes);
410 
411 	ret = map->bus->read(map->dev, map->work_buf, map->format.reg_bytes,
412 			     val, val_len);
413 
414 	trace_regmap_hw_read_done(map->dev, reg,
415 				  val_len / map->format.val_bytes);
416 
417 	return ret;
418 }
419 
420 static int _regmap_read(struct regmap *map, unsigned int reg,
421 			unsigned int *val)
422 {
423 	int ret;
424 
425 	if (!map->format.parse_val)
426 		return -EINVAL;
427 
428 	if (!map->cache_bypass) {
429 		ret = regcache_read(map, reg, val);
430 		if (ret == 0)
431 			return 0;
432 	}
433 
434 	if (map->cache_only)
435 		return -EBUSY;
436 
437 	ret = _regmap_raw_read(map, reg, map->work_buf, map->format.val_bytes);
438 	if (ret == 0) {
439 		*val = map->format.parse_val(map->work_buf);
440 		trace_regmap_reg_read(map->dev, reg, *val);
441 	}
442 
443 	return ret;
444 }
445 
446 /**
447  * regmap_read(): Read a value from a single register
448  *
449  * @map: Register map to write to
450  * @reg: Register to be read from
451  * @val: Pointer to store read value
452  *
453  * A value of zero will be returned on success, a negative errno will
454  * be returned in error cases.
455  */
456 int regmap_read(struct regmap *map, unsigned int reg, unsigned int *val)
457 {
458 	int ret;
459 
460 	mutex_lock(&map->lock);
461 
462 	ret = _regmap_read(map, reg, val);
463 
464 	mutex_unlock(&map->lock);
465 
466 	return ret;
467 }
468 EXPORT_SYMBOL_GPL(regmap_read);
469 
470 /**
471  * regmap_raw_read(): Read raw data from the device
472  *
473  * @map: Register map to write to
474  * @reg: First register to be read from
475  * @val: Pointer to store read value
476  * @val_len: Size of data to read
477  *
478  * A value of zero will be returned on success, a negative errno will
479  * be returned in error cases.
480  */
481 int regmap_raw_read(struct regmap *map, unsigned int reg, void *val,
482 		    size_t val_len)
483 {
484 	int ret;
485 	int i;
486 	bool vol = true;
487 
488 	for (i = 0; i < val_len / map->format.val_bytes; i++)
489 		if (!regmap_volatile(map, reg + i))
490 			vol = false;
491 
492 	WARN_ON(!vol && map->cache_type != REGCACHE_NONE);
493 
494 	mutex_lock(&map->lock);
495 
496 	ret = _regmap_raw_read(map, reg, val, val_len);
497 
498 	mutex_unlock(&map->lock);
499 
500 	return ret;
501 }
502 EXPORT_SYMBOL_GPL(regmap_raw_read);
503 
504 /**
505  * regmap_bulk_read(): Read multiple registers from the device
506  *
507  * @map: Register map to write to
508  * @reg: First register to be read from
509  * @val: Pointer to store read value, in native register size for device
510  * @val_count: Number of registers to read
511  *
512  * A value of zero will be returned on success, a negative errno will
513  * be returned in error cases.
514  */
515 int regmap_bulk_read(struct regmap *map, unsigned int reg, void *val,
516 		     size_t val_count)
517 {
518 	int ret, i;
519 	size_t val_bytes = map->format.val_bytes;
520 	bool vol = true;
521 
522 	if (!map->format.parse_val)
523 		return -EINVAL;
524 
525 	/* Is this a block of volatile registers? */
526 	for (i = 0; i < val_count; i++)
527 		if (!regmap_volatile(map, reg + i))
528 			vol = false;
529 
530 	if (vol || map->cache_type == REGCACHE_NONE) {
531 		ret = regmap_raw_read(map, reg, val, val_bytes * val_count);
532 		if (ret != 0)
533 			return ret;
534 
535 		for (i = 0; i < val_count * val_bytes; i += val_bytes)
536 			map->format.parse_val(val + i);
537 	} else {
538 		for (i = 0; i < val_count; i++) {
539 			ret = regmap_read(map, reg + i, val + (i * val_bytes));
540 			if (ret != 0)
541 				return ret;
542 		}
543 	}
544 
545 	return 0;
546 }
547 EXPORT_SYMBOL_GPL(regmap_bulk_read);
548 
549 /**
550  * remap_update_bits: Perform a read/modify/write cycle on the register map
551  *
552  * @map: Register map to update
553  * @reg: Register to update
554  * @mask: Bitmask to change
555  * @val: New value for bitmask
556  *
557  * Returns zero for success, a negative number on error.
558  */
559 int regmap_update_bits(struct regmap *map, unsigned int reg,
560 		       unsigned int mask, unsigned int val)
561 {
562 	int ret;
563 	unsigned int tmp;
564 
565 	mutex_lock(&map->lock);
566 
567 	ret = _regmap_read(map, reg, &tmp);
568 	if (ret != 0)
569 		goto out;
570 
571 	tmp &= ~mask;
572 	tmp |= val & mask;
573 
574 	ret = _regmap_write(map, reg, tmp);
575 
576 out:
577 	mutex_unlock(&map->lock);
578 
579 	return ret;
580 }
581 EXPORT_SYMBOL_GPL(regmap_update_bits);
582 
583 static int __init regmap_initcall(void)
584 {
585 	regmap_debugfs_initcall();
586 
587 	return 0;
588 }
589 postcore_initcall(regmap_initcall);
590