regmap.c 36.3 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12
/*
 * Register map access API
 *
 * Copyright 2011 Wolfson Microelectronics plc
 *
 * Author: Mark Brown <broonie@opensource.wolfsonmicro.com>
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License version 2 as
 * published by the Free Software Foundation.
 */

13
#include <linux/device.h>
14
#include <linux/slab.h>
15
#include <linux/export.h>
16 17
#include <linux/mutex.h>
#include <linux/err.h>
18
#include <linux/rbtree.h>
19

M
Mark Brown 已提交
20 21 22
#define CREATE_TRACE_POINTS
#include <trace/events/regmap.h>

23
#include "internal.h"
24

25 26 27 28 29 30 31 32 33 34 35 36
/*
 * Sometimes for failures during very early init the trace
 * infrastructure isn't available early enough to be used.  For this
 * sort of problem defining LOG_DEVICE will add printks for basic
 * register I/O on a specific device.
 */
#undef LOG_DEVICE

static int _regmap_update_bits(struct regmap *map, unsigned int reg,
			       unsigned int mask, unsigned int val,
			       bool *change);

37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66
bool regmap_reg_in_ranges(unsigned int reg,
			  const struct regmap_range *ranges,
			  unsigned int nranges)
{
	const struct regmap_range *r;
	int i;

	for (i = 0, r = ranges; i < nranges; i++, r++)
		if (regmap_reg_in_range(reg, r))
			return true;
	return false;
}
EXPORT_SYMBOL_GPL(regmap_reg_in_ranges);

static bool _regmap_check_range_table(struct regmap *map,
				      unsigned int reg,
				      const struct regmap_access_table *table)
{
	/* Check "no ranges" first */
	if (regmap_reg_in_ranges(reg, table->no_ranges, table->n_no_ranges))
		return false;

	/* In case zero "yes ranges" are supplied, any reg is OK */
	if (!table->n_yes_ranges)
		return true;

	return regmap_reg_in_ranges(reg, table->yes_ranges,
				    table->n_yes_ranges);
}

67 68 69 70 71 72 73 74
bool regmap_writeable(struct regmap *map, unsigned int reg)
{
	if (map->max_register && reg > map->max_register)
		return false;

	if (map->writeable_reg)
		return map->writeable_reg(map->dev, reg);

75 76 77
	if (map->wr_table)
		return _regmap_check_range_table(map, reg, map->wr_table);

78 79 80 81 82 83 84 85
	return true;
}

bool regmap_readable(struct regmap *map, unsigned int reg)
{
	if (map->max_register && reg > map->max_register)
		return false;

86 87 88
	if (map->format.format_write)
		return false;

89 90 91
	if (map->readable_reg)
		return map->readable_reg(map->dev, reg);

92 93 94
	if (map->rd_table)
		return _regmap_check_range_table(map, reg, map->rd_table);

95 96 97 98 99
	return true;
}

bool regmap_volatile(struct regmap *map, unsigned int reg)
{
100
	if (!regmap_readable(map, reg))
101 102 103 104 105
		return false;

	if (map->volatile_reg)
		return map->volatile_reg(map->dev, reg);

106 107 108
	if (map->volatile_table)
		return _regmap_check_range_table(map, reg, map->volatile_table);

109 110 111 112 113
	return true;
}

bool regmap_precious(struct regmap *map, unsigned int reg)
{
114
	if (!regmap_readable(map, reg))
115 116 117 118 119
		return false;

	if (map->precious_reg)
		return map->precious_reg(map->dev, reg);

120 121 122
	if (map->precious_table)
		return _regmap_check_range_table(map, reg, map->precious_table);

123 124 125
	return false;
}

126
static bool regmap_volatile_range(struct regmap *map, unsigned int reg,
P
Paul Bolle 已提交
127
	size_t num)
128 129 130 131 132 133 134 135 136 137
{
	unsigned int i;

	for (i = 0; i < num; i++)
		if (!regmap_volatile(map, reg + i))
			return false;

	return true;
}

138 139 140 141 142 143 144 145
static void regmap_format_2_6_write(struct regmap *map,
				     unsigned int reg, unsigned int val)
{
	u8 *out = map->work_buf;

	*out = (reg << 6) | val;
}

146 147 148 149 150 151 152 153 154 155 156 157 158 159
static void regmap_format_4_12_write(struct regmap *map,
				     unsigned int reg, unsigned int val)
{
	__be16 *out = map->work_buf;
	*out = cpu_to_be16((reg << 12) | val);
}

static void regmap_format_7_9_write(struct regmap *map,
				    unsigned int reg, unsigned int val)
{
	__be16 *out = map->work_buf;
	*out = cpu_to_be16((reg << 9) | val);
}

160 161 162 163 164 165 166 167 168 169
static void regmap_format_10_14_write(struct regmap *map,
				    unsigned int reg, unsigned int val)
{
	u8 *out = map->work_buf;

	out[2] = val;
	out[1] = (val >> 8) | (reg << 6);
	out[0] = reg >> 2;
}

170
static void regmap_format_8(void *buf, unsigned int val, unsigned int shift)
171 172 173
{
	u8 *b = buf;

174
	b[0] = val << shift;
175 176
}

177
static void regmap_format_16_be(void *buf, unsigned int val, unsigned int shift)
178 179 180
{
	__be16 *b = buf;

181
	b[0] = cpu_to_be16(val << shift);
182 183
}

184 185 186 187 188 189
static void regmap_format_16_native(void *buf, unsigned int val,
				    unsigned int shift)
{
	*(u16 *)buf = val << shift;
}

190
static void regmap_format_24(void *buf, unsigned int val, unsigned int shift)
191 192 193
{
	u8 *b = buf;

194 195
	val <<= shift;

196 197 198 199 200
	b[0] = val >> 16;
	b[1] = val >> 8;
	b[2] = val;
}

201
static void regmap_format_32_be(void *buf, unsigned int val, unsigned int shift)
202 203 204
{
	__be32 *b = buf;

205
	b[0] = cpu_to_be32(val << shift);
206 207
}

208 209 210 211 212 213
static void regmap_format_32_native(void *buf, unsigned int val,
				    unsigned int shift)
{
	*(u32 *)buf = val << shift;
}

214 215 216 217 218 219 220
static unsigned int regmap_parse_8(void *buf)
{
	u8 *b = buf;

	return b[0];
}

221
static unsigned int regmap_parse_16_be(void *buf)
222 223 224 225 226 227 228 229
{
	__be16 *b = buf;

	b[0] = be16_to_cpu(b[0]);

	return b[0];
}

230 231 232 233 234
static unsigned int regmap_parse_16_native(void *buf)
{
	return *(u16 *)buf;
}

235 236 237 238 239 240 241 242 243 244
static unsigned int regmap_parse_24(void *buf)
{
	u8 *b = buf;
	unsigned int ret = b[2];
	ret |= ((unsigned int)b[1]) << 8;
	ret |= ((unsigned int)b[0]) << 16;

	return ret;
}

245
static unsigned int regmap_parse_32_be(void *buf)
246 247 248 249 250 251 252 253
{
	__be32 *b = buf;

	b[0] = be32_to_cpu(b[0]);

	return b[0];
}

254 255 256 257 258
static unsigned int regmap_parse_32_native(void *buf)
{
	return *(u32 *)buf;
}

259
static void regmap_lock_mutex(void *__map)
260
{
261
	struct regmap *map = __map;
262 263 264
	mutex_lock(&map->mutex);
}

265
static void regmap_unlock_mutex(void *__map)
266
{
267
	struct regmap *map = __map;
268 269 270
	mutex_unlock(&map->mutex);
}

271
static void regmap_lock_spinlock(void *__map)
272
{
273
	struct regmap *map = __map;
274 275 276
	spin_lock(&map->spinlock);
}

277
static void regmap_unlock_spinlock(void *__map)
278
{
279
	struct regmap *map = __map;
280 281 282
	spin_unlock(&map->spinlock);
}

M
Mark Brown 已提交
283 284 285 286 287 288 289 290 291
static void dev_get_regmap_release(struct device *dev, void *res)
{
	/*
	 * We don't actually have anything to do here; the goal here
	 * is not to manage the regmap but to provide a simple way to
	 * get the regmap back given a struct device.
	 */
}

292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352
static bool _regmap_range_add(struct regmap *map,
			      struct regmap_range_node *data)
{
	struct rb_root *root = &map->range_tree;
	struct rb_node **new = &(root->rb_node), *parent = NULL;

	while (*new) {
		struct regmap_range_node *this =
			container_of(*new, struct regmap_range_node, node);

		parent = *new;
		if (data->range_max < this->range_min)
			new = &((*new)->rb_left);
		else if (data->range_min > this->range_max)
			new = &((*new)->rb_right);
		else
			return false;
	}

	rb_link_node(&data->node, parent, new);
	rb_insert_color(&data->node, root);

	return true;
}

static struct regmap_range_node *_regmap_range_lookup(struct regmap *map,
						      unsigned int reg)
{
	struct rb_node *node = map->range_tree.rb_node;

	while (node) {
		struct regmap_range_node *this =
			container_of(node, struct regmap_range_node, node);

		if (reg < this->range_min)
			node = node->rb_left;
		else if (reg > this->range_max)
			node = node->rb_right;
		else
			return this;
	}

	return NULL;
}

static void regmap_range_exit(struct regmap *map)
{
	struct rb_node *next;
	struct regmap_range_node *range_node;

	next = rb_first(&map->range_tree);
	while (next) {
		range_node = rb_entry(next, struct regmap_range_node, node);
		next = rb_next(&range_node->node);
		rb_erase(&range_node->node, &map->range_tree);
		kfree(range_node);
	}

	kfree(map->selector_work_buf);
}

353 354 355 356 357
/**
 * regmap_init(): Initialise register map
 *
 * @dev: Device that will be interacted with
 * @bus: Bus-specific callbacks to use with device
358
 * @bus_context: Data passed to bus-specific callbacks
359 360 361 362 363 364 365 366
 * @config: Configuration for register map
 *
 * The return value will be an ERR_PTR() on error or a valid pointer to
 * a struct regmap.  This function should generally not be called
 * directly, it should be called by bus-specific init functions.
 */
struct regmap *regmap_init(struct device *dev,
			   const struct regmap_bus *bus,
367
			   void *bus_context,
368 369
			   const struct regmap_config *config)
{
M
Mark Brown 已提交
370
	struct regmap *map, **m;
371
	int ret = -EINVAL;
372
	enum regmap_endian reg_endian, val_endian;
373
	int i, j;
374 375

	if (!bus || !config)
376
		goto err;
377 378 379 380 381 382 383

	map = kzalloc(sizeof(*map), GFP_KERNEL);
	if (map == NULL) {
		ret = -ENOMEM;
		goto err;
	}

384 385 386 387
	if (config->lock && config->unlock) {
		map->lock = config->lock;
		map->unlock = config->unlock;
		map->lock_arg = config->lock_arg;
388
	} else {
389 390 391 392 393 394 395 396 397 398
		if (bus->fast_io) {
			spin_lock_init(&map->spinlock);
			map->lock = regmap_lock_spinlock;
			map->unlock = regmap_unlock_spinlock;
		} else {
			mutex_init(&map->mutex);
			map->lock = regmap_lock_mutex;
			map->unlock = regmap_unlock_mutex;
		}
		map->lock_arg = map;
399
	}
400
	map->format.reg_bytes = DIV_ROUND_UP(config->reg_bits, 8);
401
	map->format.pad_bytes = config->pad_bits / 8;
402
	map->format.val_bytes = DIV_ROUND_UP(config->val_bits, 8);
403 404
	map->format.buf_size = DIV_ROUND_UP(config->reg_bits +
			config->val_bits + config->pad_bits, 8);
405
	map->reg_shift = config->pad_bits % 8;
406 407 408 409
	if (config->reg_stride)
		map->reg_stride = config->reg_stride;
	else
		map->reg_stride = 1;
410
	map->use_single_rw = config->use_single_rw;
411 412
	map->dev = dev;
	map->bus = bus;
413
	map->bus_context = bus_context;
414
	map->max_register = config->max_register;
415 416 417 418
	map->wr_table = config->wr_table;
	map->rd_table = config->rd_table;
	map->volatile_table = config->volatile_table;
	map->precious_table = config->precious_table;
419 420 421
	map->writeable_reg = config->writeable_reg;
	map->readable_reg = config->readable_reg;
	map->volatile_reg = config->volatile_reg;
422
	map->precious_reg = config->precious_reg;
423
	map->cache_type = config->cache_type;
M
Mark Brown 已提交
424
	map->name = config->name;
425

426 427 428 429 430 431 432
	if (config->read_flag_mask || config->write_flag_mask) {
		map->read_flag_mask = config->read_flag_mask;
		map->write_flag_mask = config->write_flag_mask;
	} else {
		map->read_flag_mask = bus->read_flag_mask;
	}

433 434 435 436 437 438 439 440 441 442 443 444
	reg_endian = config->reg_format_endian;
	if (reg_endian == REGMAP_ENDIAN_DEFAULT)
		reg_endian = bus->reg_format_endian_default;
	if (reg_endian == REGMAP_ENDIAN_DEFAULT)
		reg_endian = REGMAP_ENDIAN_BIG;

	val_endian = config->val_format_endian;
	if (val_endian == REGMAP_ENDIAN_DEFAULT)
		val_endian = bus->val_format_endian_default;
	if (val_endian == REGMAP_ENDIAN_DEFAULT)
		val_endian = REGMAP_ENDIAN_BIG;

445
	switch (config->reg_bits + map->reg_shift) {
446 447 448 449 450 451 452 453 454 455
	case 2:
		switch (config->val_bits) {
		case 6:
			map->format.format_write = regmap_format_2_6_write;
			break;
		default:
			goto err_map;
		}
		break;

456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475
	case 4:
		switch (config->val_bits) {
		case 12:
			map->format.format_write = regmap_format_4_12_write;
			break;
		default:
			goto err_map;
		}
		break;

	case 7:
		switch (config->val_bits) {
		case 9:
			map->format.format_write = regmap_format_7_9_write;
			break;
		default:
			goto err_map;
		}
		break;

476 477 478 479 480 481 482 483 484 485
	case 10:
		switch (config->val_bits) {
		case 14:
			map->format.format_write = regmap_format_10_14_write;
			break;
		default:
			goto err_map;
		}
		break;

486 487 488 489 490
	case 8:
		map->format.format_reg = regmap_format_8;
		break;

	case 16:
491 492 493 494 495 496 497 498 499 500
		switch (reg_endian) {
		case REGMAP_ENDIAN_BIG:
			map->format.format_reg = regmap_format_16_be;
			break;
		case REGMAP_ENDIAN_NATIVE:
			map->format.format_reg = regmap_format_16_native;
			break;
		default:
			goto err_map;
		}
501 502
		break;

503
	case 32:
504 505 506 507 508 509 510 511 512 513
		switch (reg_endian) {
		case REGMAP_ENDIAN_BIG:
			map->format.format_reg = regmap_format_32_be;
			break;
		case REGMAP_ENDIAN_NATIVE:
			map->format.format_reg = regmap_format_32_native;
			break;
		default:
			goto err_map;
		}
514 515
		break;

516 517 518 519 520 521 522 523 524 525
	default:
		goto err_map;
	}

	switch (config->val_bits) {
	case 8:
		map->format.format_val = regmap_format_8;
		map->format.parse_val = regmap_parse_8;
		break;
	case 16:
526 527 528 529 530 531 532 533 534 535 536 537
		switch (val_endian) {
		case REGMAP_ENDIAN_BIG:
			map->format.format_val = regmap_format_16_be;
			map->format.parse_val = regmap_parse_16_be;
			break;
		case REGMAP_ENDIAN_NATIVE:
			map->format.format_val = regmap_format_16_native;
			map->format.parse_val = regmap_parse_16_native;
			break;
		default:
			goto err_map;
		}
538
		break;
539
	case 24:
540 541
		if (val_endian != REGMAP_ENDIAN_BIG)
			goto err_map;
542 543 544
		map->format.format_val = regmap_format_24;
		map->format.parse_val = regmap_parse_24;
		break;
545
	case 32:
546 547 548 549 550 551 552 553 554 555 556 557
		switch (val_endian) {
		case REGMAP_ENDIAN_BIG:
			map->format.format_val = regmap_format_32_be;
			map->format.parse_val = regmap_parse_32_be;
			break;
		case REGMAP_ENDIAN_NATIVE:
			map->format.format_val = regmap_format_32_native;
			map->format.parse_val = regmap_parse_32_native;
			break;
		default:
			goto err_map;
		}
558
		break;
559 560
	}

561 562 563 564
	if (map->format.format_write) {
		if ((reg_endian != REGMAP_ENDIAN_BIG) ||
		    (val_endian != REGMAP_ENDIAN_BIG))
			goto err_map;
565
		map->use_single_rw = true;
566
	}
567

568 569 570 571
	if (!map->format.format_write &&
	    !(map->format.format_reg && map->format.format_val))
		goto err_map;

572
	map->work_buf = kzalloc(map->format.buf_size, GFP_KERNEL);
573 574
	if (map->work_buf == NULL) {
		ret = -ENOMEM;
575
		goto err_map;
576 577
	}

578
	map->range_tree = RB_ROOT;
M
Mark Brown 已提交
579
	for (i = 0; i < config->num_ranges; i++) {
580 581 582 583
		const struct regmap_range_cfg *range_cfg = &config->ranges[i];
		struct regmap_range_node *new;

		/* Sanity check */
584 585 586
		if (range_cfg->range_max < range_cfg->range_min) {
			dev_err(map->dev, "Invalid range %d: %d < %d\n", i,
				range_cfg->range_max, range_cfg->range_min);
587
			goto err_range;
588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606
		}

		if (range_cfg->range_max > map->max_register) {
			dev_err(map->dev, "Invalid range %d: %d > %d\n", i,
				range_cfg->range_max, map->max_register);
			goto err_range;
		}

		if (range_cfg->selector_reg > map->max_register) {
			dev_err(map->dev,
				"Invalid range %d: selector out of map\n", i);
			goto err_range;
		}

		if (range_cfg->window_len == 0) {
			dev_err(map->dev, "Invalid range %d: window_len 0\n",
				i);
			goto err_range;
		}
607 608 609

		/* Make sure, that this register range has no selector
		   or data window within its boundary */
M
Mark Brown 已提交
610
		for (j = 0; j < config->num_ranges; j++) {
611 612 613 614 615 616 617
			unsigned sel_reg = config->ranges[j].selector_reg;
			unsigned win_min = config->ranges[j].window_start;
			unsigned win_max = win_min +
					   config->ranges[j].window_len - 1;

			if (range_cfg->range_min <= sel_reg &&
			    sel_reg <= range_cfg->range_max) {
618 619 620
				dev_err(map->dev,
					"Range %d: selector for %d in window\n",
					i, j);
621 622 623 624 625
				goto err_range;
			}

			if (!(win_max < range_cfg->range_min ||
			      win_min > range_cfg->range_max)) {
626 627 628
				dev_err(map->dev,
					"Range %d: window for %d in window\n",
					i, j);
629 630 631 632 633 634 635 636 637 638
				goto err_range;
			}
		}

		new = kzalloc(sizeof(*new), GFP_KERNEL);
		if (new == NULL) {
			ret = -ENOMEM;
			goto err_range;
		}

639
		new->map = map;
M
Mark Brown 已提交
640
		new->name = range_cfg->name;
641 642 643 644 645 646 647 648 649
		new->range_min = range_cfg->range_min;
		new->range_max = range_cfg->range_max;
		new->selector_reg = range_cfg->selector_reg;
		new->selector_mask = range_cfg->selector_mask;
		new->selector_shift = range_cfg->selector_shift;
		new->window_start = range_cfg->window_start;
		new->window_len = range_cfg->window_len;

		if (_regmap_range_add(map, new) == false) {
650
			dev_err(map->dev, "Failed to add range %d\n", i);
651 652 653 654 655 656 657 658 659 660 661 662 663
			kfree(new);
			goto err_range;
		}

		if (map->selector_work_buf == NULL) {
			map->selector_work_buf =
				kzalloc(map->format.buf_size, GFP_KERNEL);
			if (map->selector_work_buf == NULL) {
				ret = -ENOMEM;
				goto err_range;
			}
		}
	}
664

665
	ret = regcache_init(map, config);
666
	if (ret != 0)
667 668 669
		goto err_range;

	regmap_debugfs_init(map, config->name);
670

M
Mark Brown 已提交
671 672 673 674
	/* Add a devres resource for dev_get_regmap() */
	m = devres_alloc(dev_get_regmap_release, sizeof(*m), GFP_KERNEL);
	if (!m) {
		ret = -ENOMEM;
675
		goto err_debugfs;
M
Mark Brown 已提交
676 677 678 679
	}
	*m = map;
	devres_add(dev, m);

680 681
	return map;

682 683
err_debugfs:
	regmap_debugfs_exit(map);
M
Mark Brown 已提交
684
	regcache_exit(map);
685 686
err_range:
	regmap_range_exit(map);
687
	kfree(map->work_buf);
688 689 690 691 692 693 694
err_map:
	kfree(map);
err:
	return ERR_PTR(ret);
}
EXPORT_SYMBOL_GPL(regmap_init);

695 696 697 698 699 700 701 702 703 704
static void devm_regmap_release(struct device *dev, void *res)
{
	regmap_exit(*(struct regmap **)res);
}

/**
 * devm_regmap_init(): Initialise managed register map
 *
 * @dev: Device that will be interacted with
 * @bus: Bus-specific callbacks to use with device
705
 * @bus_context: Data passed to bus-specific callbacks
706 707 708 709 710 711 712 713 714
 * @config: Configuration for register map
 *
 * The return value will be an ERR_PTR() on error or a valid pointer
 * to a struct regmap.  This function should generally not be called
 * directly, it should be called by bus-specific init functions.  The
 * map will be automatically freed by the device management code.
 */
struct regmap *devm_regmap_init(struct device *dev,
				const struct regmap_bus *bus,
715
				void *bus_context,
716 717 718 719 720 721 722 723
				const struct regmap_config *config)
{
	struct regmap **ptr, *regmap;

	ptr = devres_alloc(devm_regmap_release, sizeof(*ptr), GFP_KERNEL);
	if (!ptr)
		return ERR_PTR(-ENOMEM);

724
	regmap = regmap_init(dev, bus, bus_context, config);
725 726 727 728 729 730 731 732 733 734 735
	if (!IS_ERR(regmap)) {
		*ptr = regmap;
		devres_add(dev, ptr);
	} else {
		devres_free(ptr);
	}

	return regmap;
}
EXPORT_SYMBOL_GPL(devm_regmap_init);

736 737 738 739 740 741 742 743 744 745
/**
 * regmap_reinit_cache(): Reinitialise the current register cache
 *
 * @map: Register map to operate on.
 * @config: New configuration.  Only the cache data will be used.
 *
 * Discard any existing register cache for the map and initialize a
 * new cache.  This can be used to restore the cache to defaults or to
 * update the cache configuration to reflect runtime discovery of the
 * hardware.
746 747 748
 *
 * No explicit locking is done here, the user needs to ensure that
 * this function will not race with other calls to regmap.
749 750 751 752
 */
int regmap_reinit_cache(struct regmap *map, const struct regmap_config *config)
{
	regcache_exit(map);
753
	regmap_debugfs_exit(map);
754 755 756 757 758 759 760 761

	map->max_register = config->max_register;
	map->writeable_reg = config->writeable_reg;
	map->readable_reg = config->readable_reg;
	map->volatile_reg = config->volatile_reg;
	map->precious_reg = config->precious_reg;
	map->cache_type = config->cache_type;

762
	regmap_debugfs_init(map, config->name);
763

764 765 766
	map->cache_bypass = false;
	map->cache_only = false;

767
	return regcache_init(map, config);
768
}
769
EXPORT_SYMBOL_GPL(regmap_reinit_cache);
770

771 772 773 774 775
/**
 * regmap_exit(): Free a previously allocated register map
 */
void regmap_exit(struct regmap *map)
{
776
	regcache_exit(map);
777
	regmap_debugfs_exit(map);
778
	regmap_range_exit(map);
779 780
	if (map->bus->free_context)
		map->bus->free_context(map->bus_context);
781 782 783 784 785
	kfree(map->work_buf);
	kfree(map);
}
EXPORT_SYMBOL_GPL(regmap_exit);

M
Mark Brown 已提交
786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823
static int dev_get_regmap_match(struct device *dev, void *res, void *data)
{
	struct regmap **r = res;
	if (!r || !*r) {
		WARN_ON(!r || !*r);
		return 0;
	}

	/* If the user didn't specify a name match any */
	if (data)
		return (*r)->name == data;
	else
		return 1;
}

/**
 * dev_get_regmap(): Obtain the regmap (if any) for a device
 *
 * @dev: Device to retrieve the map for
 * @name: Optional name for the register map, usually NULL.
 *
 * Returns the regmap for the device if one is present, or NULL.  If
 * name is specified then it must match the name specified when
 * registering the device, if it is NULL then the first regmap found
 * will be used.  Devices with multiple register maps are very rare,
 * generic code should normally not need to specify a name.
 */
struct regmap *dev_get_regmap(struct device *dev, const char *name)
{
	struct regmap **r = devres_find(dev, dev_get_regmap_release,
					dev_get_regmap_match, (void *)name);

	if (!r)
		return NULL;
	return *r;
}
EXPORT_SYMBOL_GPL(dev_get_regmap);

824
static int _regmap_select_page(struct regmap *map, unsigned int *reg,
825
			       struct regmap_range_node *range,
826 827 828 829 830 831 832 833
			       unsigned int val_num)
{
	void *orig_work_buf;
	unsigned int win_offset;
	unsigned int win_page;
	bool page_chg;
	int ret;

834 835
	win_offset = (*reg - range->range_min) % range->window_len;
	win_page = (*reg - range->range_min) / range->window_len;
836

837 838 839 840
	if (val_num > 1) {
		/* Bulk write shouldn't cross range boundary */
		if (*reg + val_num - 1 > range->range_max)
			return -EINVAL;
841

842 843 844 845
		/* ... or single page boundary */
		if (val_num > range->window_len - win_offset)
			return -EINVAL;
	}
846

847 848 849 850 851 852 853 854
	/* It is possible to have selector register inside data window.
	   In that case, selector register is located on every page and
	   it needs no page switching, when accessed alone. */
	if (val_num > 1 ||
	    range->window_start + win_offset != range->selector_reg) {
		/* Use separate work_buf during page switching */
		orig_work_buf = map->work_buf;
		map->work_buf = map->selector_work_buf;
855

856 857 858 859
		ret = _regmap_update_bits(map, range->selector_reg,
					  range->selector_mask,
					  win_page << range->selector_shift,
					  &page_chg);
860

861
		map->work_buf = orig_work_buf;
862

863
		if (ret != 0)
864
			return ret;
865 866
	}

867 868
	*reg = range->window_start + win_offset;

869 870 871
	return 0;
}

872 873 874
static int _regmap_raw_write(struct regmap *map, unsigned int reg,
			     const void *val, size_t val_len)
{
875
	struct regmap_range_node *range;
876
	u8 *u8 = map->work_buf;
877 878 879
	void *buf;
	int ret = -ENOTSUPP;
	size_t len;
880 881 882 883 884
	int i;

	/* Check for unwritable registers before we start */
	if (map->writeable_reg)
		for (i = 0; i < val_len / map->format.val_bytes; i++)
885 886
			if (!map->writeable_reg(map->dev,
						reg + (i * map->reg_stride)))
887
				return -EINVAL;
888

889 890 891 892 893 894
	if (!map->cache_bypass && map->format.parse_val) {
		unsigned int ival;
		int val_bytes = map->format.val_bytes;
		for (i = 0; i < val_len / val_bytes; i++) {
			memcpy(map->work_buf, val + (i * val_bytes), val_bytes);
			ival = map->format.parse_val(map->work_buf);
895 896
			ret = regcache_write(map, reg + (i * map->reg_stride),
					     ival);
897 898
			if (ret) {
				dev_err(map->dev,
899
					"Error in caching of register: %x ret: %d\n",
900 901 902 903 904 905 906 907 908 909
					reg + i, ret);
				return ret;
			}
		}
		if (map->cache_only) {
			map->cache_dirty = true;
			return 0;
		}
	}

910 911
	range = _regmap_range_lookup(map, reg);
	if (range) {
912 913 914 915 916 917
		int val_num = val_len / map->format.val_bytes;
		int win_offset = (reg - range->range_min) % range->window_len;
		int win_residue = range->window_len - win_offset;

		/* If the write goes beyond the end of the window split it */
		while (val_num > win_residue) {
918
			dev_dbg(map->dev, "Writing window %d/%zu\n",
919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935
				win_residue, val_len / map->format.val_bytes);
			ret = _regmap_raw_write(map, reg, val, win_residue *
						map->format.val_bytes);
			if (ret != 0)
				return ret;

			reg += win_residue;
			val_num -= win_residue;
			val += win_residue * map->format.val_bytes;
			val_len -= win_residue * map->format.val_bytes;

			win_offset = (reg - range->range_min) %
				range->window_len;
			win_residue = range->window_len - win_offset;
		}

		ret = _regmap_select_page(map, &reg, range, val_num);
936
		if (ret != 0)
937 938
			return ret;
	}
939

940
	map->format.format_reg(map->work_buf, reg, map->reg_shift);
941

942 943
	u8[0] |= map->write_flag_mask;

M
Mark Brown 已提交
944 945 946
	trace_regmap_hw_write_start(map->dev, reg,
				    val_len / map->format.val_bytes);

947 948 949 950
	/* If we're doing a single register write we can probably just
	 * send the work_buf directly, otherwise try to do a gather
	 * write.
	 */
951 952
	if (val == (map->work_buf + map->format.pad_bytes +
		    map->format.reg_bytes))
953
		ret = map->bus->write(map->bus_context, map->work_buf,
954 955 956
				      map->format.reg_bytes +
				      map->format.pad_bytes +
				      val_len);
957
	else if (map->bus->gather_write)
958
		ret = map->bus->gather_write(map->bus_context, map->work_buf,
959 960
					     map->format.reg_bytes +
					     map->format.pad_bytes,
961 962
					     val, val_len);

963
	/* If that didn't work fall back on linearising by hand. */
964
	if (ret == -ENOTSUPP) {
965 966
		len = map->format.reg_bytes + map->format.pad_bytes + val_len;
		buf = kzalloc(len, GFP_KERNEL);
967 968 969 970
		if (!buf)
			return -ENOMEM;

		memcpy(buf, map->work_buf, map->format.reg_bytes);
971 972
		memcpy(buf + map->format.reg_bytes + map->format.pad_bytes,
		       val, val_len);
973
		ret = map->bus->write(map->bus_context, buf, len);
974 975 976 977

		kfree(buf);
	}

M
Mark Brown 已提交
978 979 980
	trace_regmap_hw_write_done(map->dev, reg,
				   val_len / map->format.val_bytes);

981 982 983
	return ret;
}

984 985
int _regmap_write(struct regmap *map, unsigned int reg,
		  unsigned int val)
986
{
987
	struct regmap_range_node *range;
M
Mark Brown 已提交
988
	int ret;
989 990
	BUG_ON(!map->format.format_write && !map->format.format_val);

991
	if (!map->cache_bypass && map->format.format_write) {
992 993 994
		ret = regcache_write(map, reg, val);
		if (ret != 0)
			return ret;
995 996
		if (map->cache_only) {
			map->cache_dirty = true;
997
			return 0;
998
		}
999 1000
	}

1001 1002 1003 1004 1005
#ifdef LOG_DEVICE
	if (strcmp(dev_name(map->dev), LOG_DEVICE) == 0)
		dev_info(map->dev, "%x <= %x\n", reg, val);
#endif

M
Mark Brown 已提交
1006 1007
	trace_regmap_reg_write(map->dev, reg, val);

1008
	if (map->format.format_write) {
1009 1010 1011
		range = _regmap_range_lookup(map, reg);
		if (range) {
			ret = _regmap_select_page(map, &reg, range, 1);
1012
			if (ret != 0)
1013 1014
				return ret;
		}
1015

1016 1017
		map->format.format_write(map, reg, val);

M
Mark Brown 已提交
1018 1019
		trace_regmap_hw_write_start(map->dev, reg, 1);

1020
		ret = map->bus->write(map->bus_context, map->work_buf,
M
Mark Brown 已提交
1021 1022 1023 1024 1025
				      map->format.buf_size);

		trace_regmap_hw_write_done(map->dev, reg, 1);

		return ret;
1026
	} else {
1027
		map->format.format_val(map->work_buf + map->format.reg_bytes
1028
				       + map->format.pad_bytes, val, 0);
1029
		return _regmap_raw_write(map, reg,
1030 1031 1032
					 map->work_buf +
					 map->format.reg_bytes +
					 map->format.pad_bytes,
1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050
					 map->format.val_bytes);
	}
}

/**
 * regmap_write(): Write a value to a single register
 *
 * @map: Register map to write to
 * @reg: Register to write to
 * @val: Value to be written
 *
 * A value of zero will be returned on success, a negative errno will
 * be returned in error cases.
 */
int regmap_write(struct regmap *map, unsigned int reg, unsigned int val)
{
	int ret;

1051 1052 1053
	if (reg % map->reg_stride)
		return -EINVAL;

1054
	map->lock(map->lock_arg);
1055 1056 1057

	ret = _regmap_write(map, reg, val);

1058
	map->unlock(map->lock_arg);
1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 1069 1070 1071 1072 1073 1074 1075 1076 1077 1078 1079 1080 1081 1082 1083 1084

	return ret;
}
EXPORT_SYMBOL_GPL(regmap_write);

/**
 * regmap_raw_write(): Write raw values to one or more registers
 *
 * @map: Register map to write to
 * @reg: Initial register to write to
 * @val: Block of data to be written, laid out for direct transmission to the
 *       device
 * @val_len: Length of data pointed to by val.
 *
 * This function is intended to be used for things like firmware
 * download where a large block of data needs to be transferred to the
 * device.  No formatting will be done on the data provided.
 *
 * A value of zero will be returned on success, a negative errno will
 * be returned in error cases.
 */
int regmap_raw_write(struct regmap *map, unsigned int reg,
		     const void *val, size_t val_len)
{
	int ret;

1085 1086
	if (val_len % map->format.val_bytes)
		return -EINVAL;
1087 1088
	if (reg % map->reg_stride)
		return -EINVAL;
1089

1090
	map->lock(map->lock_arg);
1091 1092 1093

	ret = _regmap_raw_write(map, reg, val, val_len);

1094
	map->unlock(map->lock_arg);
1095 1096 1097 1098 1099

	return ret;
}
EXPORT_SYMBOL_GPL(regmap_raw_write);

1100 1101 1102 1103 1104 1105 1106 1107 1108 1109 1110 1111 1112 1113 1114 1115 1116 1117 1118 1119 1120 1121 1122
/*
 * regmap_bulk_write(): Write multiple registers to the device
 *
 * @map: Register map to write to
 * @reg: First register to be write from
 * @val: Block of data to be written, in native register size for device
 * @val_count: Number of registers to write
 *
 * This function is intended to be used for writing a large block of
 * data to be device either in single transfer or multiple transfer.
 *
 * A value of zero will be returned on success, a negative errno will
 * be returned in error cases.
 */
int regmap_bulk_write(struct regmap *map, unsigned int reg, const void *val,
		     size_t val_count)
{
	int ret = 0, i;
	size_t val_bytes = map->format.val_bytes;
	void *wval;

	if (!map->format.parse_val)
		return -EINVAL;
1123 1124
	if (reg % map->reg_stride)
		return -EINVAL;
1125

1126
	map->lock(map->lock_arg);
1127 1128 1129 1130 1131 1132 1133 1134 1135 1136 1137 1138 1139 1140

	/* No formatting is require if val_byte is 1 */
	if (val_bytes == 1) {
		wval = (void *)val;
	} else {
		wval = kmemdup(val, val_count * val_bytes, GFP_KERNEL);
		if (!wval) {
			ret = -ENOMEM;
			dev_err(map->dev, "Error in memory allocation\n");
			goto out;
		}
		for (i = 0; i < val_count * val_bytes; i += val_bytes)
			map->format.parse_val(wval + i);
	}
1141 1142 1143 1144 1145 1146 1147 1148 1149 1150 1151 1152 1153 1154 1155 1156
	/*
	 * Some devices does not support bulk write, for
	 * them we have a series of single write operations.
	 */
	if (map->use_single_rw) {
		for (i = 0; i < val_count; i++) {
			ret = regmap_raw_write(map,
						reg + (i * map->reg_stride),
						val + (i * val_bytes),
						val_bytes);
			if (ret != 0)
				return ret;
		}
	} else {
		ret = _regmap_raw_write(map, reg, wval, val_bytes * val_count);
	}
1157 1158 1159 1160 1161

	if (val_bytes != 1)
		kfree(wval);

out:
1162
	map->unlock(map->lock_arg);
1163 1164 1165 1166
	return ret;
}
EXPORT_SYMBOL_GPL(regmap_bulk_write);

1167 1168 1169
static int _regmap_raw_read(struct regmap *map, unsigned int reg, void *val,
			    unsigned int val_len)
{
1170
	struct regmap_range_node *range;
1171 1172 1173
	u8 *u8 = map->work_buf;
	int ret;

1174 1175 1176 1177
	range = _regmap_range_lookup(map, reg);
	if (range) {
		ret = _regmap_select_page(map, &reg, range,
					  val_len / map->format.val_bytes);
1178
		if (ret != 0)
1179 1180
			return ret;
	}
1181

1182
	map->format.format_reg(map->work_buf, reg, map->reg_shift);
1183 1184

	/*
1185
	 * Some buses or devices flag reads by setting the high bits in the
1186 1187 1188 1189
	 * register addresss; since it's always the high bits for all
	 * current formats we can do this here rather than in
	 * formatting.  This may break if we get interesting formats.
	 */
1190
	u8[0] |= map->read_flag_mask;
1191

M
Mark Brown 已提交
1192 1193 1194
	trace_regmap_hw_read_start(map->dev, reg,
				   val_len / map->format.val_bytes);

1195
	ret = map->bus->read(map->bus_context, map->work_buf,
1196
			     map->format.reg_bytes + map->format.pad_bytes,
M
Mark Brown 已提交
1197
			     val, val_len);
1198

M
Mark Brown 已提交
1199 1200 1201 1202
	trace_regmap_hw_read_done(map->dev, reg,
				  val_len / map->format.val_bytes);

	return ret;
1203 1204 1205 1206 1207 1208 1209
}

static int _regmap_read(struct regmap *map, unsigned int reg,
			unsigned int *val)
{
	int ret;

1210 1211 1212 1213 1214 1215
	if (!map->cache_bypass) {
		ret = regcache_read(map, reg, val);
		if (ret == 0)
			return 0;
	}

1216 1217 1218
	if (!map->format.parse_val)
		return -EINVAL;

1219 1220 1221
	if (map->cache_only)
		return -EBUSY;

1222
	ret = _regmap_raw_read(map, reg, map->work_buf, map->format.val_bytes);
M
Mark Brown 已提交
1223
	if (ret == 0) {
1224
		*val = map->format.parse_val(map->work_buf);
1225 1226 1227 1228 1229 1230

#ifdef LOG_DEVICE
		if (strcmp(dev_name(map->dev), LOG_DEVICE) == 0)
			dev_info(map->dev, "%x => %x\n", reg, *val);
#endif

M
Mark Brown 已提交
1231 1232
		trace_regmap_reg_read(map->dev, reg, *val);
	}
1233

1234 1235 1236
	if (ret == 0 && !map->cache_bypass)
		regcache_write(map, reg, *val);

1237 1238 1239 1240 1241 1242 1243 1244 1245 1246 1247 1248 1249 1250 1251 1252 1253
	return ret;
}

/**
 * regmap_read(): Read a value from a single register
 *
 * @map: Register map to write to
 * @reg: Register to be read from
 * @val: Pointer to store read value
 *
 * A value of zero will be returned on success, a negative errno will
 * be returned in error cases.
 */
int regmap_read(struct regmap *map, unsigned int reg, unsigned int *val)
{
	int ret;

1254 1255 1256
	if (reg % map->reg_stride)
		return -EINVAL;

1257
	map->lock(map->lock_arg);
1258 1259 1260

	ret = _regmap_read(map, reg, val);

1261
	map->unlock(map->lock_arg);
1262 1263 1264 1265 1266 1267 1268 1269 1270 1271 1272 1273 1274 1275 1276 1277 1278 1279 1280

	return ret;
}
EXPORT_SYMBOL_GPL(regmap_read);

/**
 * regmap_raw_read(): Read raw data from the device
 *
 * @map: Register map to write to
 * @reg: First register to be read from
 * @val: Pointer to store read value
 * @val_len: Size of data to read
 *
 * A value of zero will be returned on success, a negative errno will
 * be returned in error cases.
 */
int regmap_raw_read(struct regmap *map, unsigned int reg, void *val,
		    size_t val_len)
{
1281 1282 1283 1284
	size_t val_bytes = map->format.val_bytes;
	size_t val_count = val_len / val_bytes;
	unsigned int v;
	int ret, i;
1285

1286 1287
	if (val_len % map->format.val_bytes)
		return -EINVAL;
1288 1289
	if (reg % map->reg_stride)
		return -EINVAL;
1290

1291
	map->lock(map->lock_arg);
1292

1293 1294 1295 1296 1297 1298 1299 1300 1301 1302
	if (regmap_volatile_range(map, reg, val_count) || map->cache_bypass ||
	    map->cache_type == REGCACHE_NONE) {
		/* Physical block read if there's no cache involved */
		ret = _regmap_raw_read(map, reg, val, val_len);

	} else {
		/* Otherwise go word by word for the cache; should be low
		 * cost as we expect to hit the cache.
		 */
		for (i = 0; i < val_count; i++) {
1303 1304
			ret = _regmap_read(map, reg + (i * map->reg_stride),
					   &v);
1305 1306 1307
			if (ret != 0)
				goto out;

1308
			map->format.format_val(val + (i * val_bytes), v, 0);
1309 1310
		}
	}
1311

1312
 out:
1313
	map->unlock(map->lock_arg);
1314 1315 1316 1317 1318 1319 1320 1321 1322 1323 1324 1325 1326 1327 1328 1329 1330 1331 1332 1333 1334

	return ret;
}
EXPORT_SYMBOL_GPL(regmap_raw_read);

/**
 * regmap_bulk_read(): Read multiple registers from the device
 *
 * @map: Register map to write to
 * @reg: First register to be read from
 * @val: Pointer to store read value, in native register size for device
 * @val_count: Number of registers to read
 *
 * A value of zero will be returned on success, a negative errno will
 * be returned in error cases.
 */
int regmap_bulk_read(struct regmap *map, unsigned int reg, void *val,
		     size_t val_count)
{
	int ret, i;
	size_t val_bytes = map->format.val_bytes;
1335
	bool vol = regmap_volatile_range(map, reg, val_count);
1336

1337 1338
	if (!map->format.parse_val)
		return -EINVAL;
1339 1340
	if (reg % map->reg_stride)
		return -EINVAL;
1341

1342
	if (vol || map->cache_type == REGCACHE_NONE) {
1343 1344 1345 1346 1347 1348 1349 1350 1351 1352 1353 1354 1355 1356 1357 1358 1359 1360 1361
		/*
		 * Some devices does not support bulk read, for
		 * them we have a series of single read operations.
		 */
		if (map->use_single_rw) {
			for (i = 0; i < val_count; i++) {
				ret = regmap_raw_read(map,
						reg + (i * map->reg_stride),
						val + (i * val_bytes),
						val_bytes);
				if (ret != 0)
					return ret;
			}
		} else {
			ret = regmap_raw_read(map, reg, val,
					      val_bytes * val_count);
			if (ret != 0)
				return ret;
		}
1362 1363 1364 1365 1366

		for (i = 0; i < val_count * val_bytes; i += val_bytes)
			map->format.parse_val(val + i);
	} else {
		for (i = 0; i < val_count; i++) {
1367
			unsigned int ival;
1368
			ret = regmap_read(map, reg + (i * map->reg_stride),
1369
					  &ival);
1370 1371
			if (ret != 0)
				return ret;
1372
			memcpy(val + (i * val_bytes), &ival, val_bytes);
1373 1374
		}
	}
1375 1376 1377 1378 1379

	return 0;
}
EXPORT_SYMBOL_GPL(regmap_bulk_read);

1380 1381 1382
static int _regmap_update_bits(struct regmap *map, unsigned int reg,
			       unsigned int mask, unsigned int val,
			       bool *change)
1383 1384
{
	int ret;
1385
	unsigned int tmp, orig;
1386

1387
	ret = _regmap_read(map, reg, &orig);
1388
	if (ret != 0)
1389
		return ret;
1390

1391
	tmp = orig & ~mask;
1392 1393
	tmp |= val & mask;

1394
	if (tmp != orig) {
1395
		ret = _regmap_write(map, reg, tmp);
1396 1397 1398 1399
		*change = true;
	} else {
		*change = false;
	}
1400 1401 1402

	return ret;
}
1403 1404 1405 1406 1407 1408 1409 1410 1411 1412 1413 1414 1415 1416 1417

/**
 * regmap_update_bits: Perform a read/modify/write cycle on the register map
 *
 * @map: Register map to update
 * @reg: Register to update
 * @mask: Bitmask to change
 * @val: New value for bitmask
 *
 * Returns zero for success, a negative number on error.
 */
int regmap_update_bits(struct regmap *map, unsigned int reg,
		       unsigned int mask, unsigned int val)
{
	bool change;
1418 1419
	int ret;

1420
	map->lock(map->lock_arg);
1421
	ret = _regmap_update_bits(map, reg, mask, val, &change);
1422
	map->unlock(map->lock_arg);
1423 1424

	return ret;
1425
}
1426
EXPORT_SYMBOL_GPL(regmap_update_bits);
1427

1428 1429 1430 1431 1432 1433 1434 1435 1436 1437 1438 1439 1440 1441 1442 1443
/**
 * regmap_update_bits_check: Perform a read/modify/write cycle on the
 *                           register map and report if updated
 *
 * @map: Register map to update
 * @reg: Register to update
 * @mask: Bitmask to change
 * @val: New value for bitmask
 * @change: Boolean indicating if a write was done
 *
 * Returns zero for success, a negative number on error.
 */
int regmap_update_bits_check(struct regmap *map, unsigned int reg,
			     unsigned int mask, unsigned int val,
			     bool *change)
{
1444 1445
	int ret;

1446
	map->lock(map->lock_arg);
1447
	ret = _regmap_update_bits(map, reg, mask, val, change);
1448
	map->unlock(map->lock_arg);
1449
	return ret;
1450 1451 1452
}
EXPORT_SYMBOL_GPL(regmap_update_bits_check);

M
Mark Brown 已提交
1453 1454 1455 1456 1457 1458 1459 1460 1461 1462 1463 1464 1465 1466 1467 1468 1469 1470 1471 1472 1473 1474 1475 1476
/**
 * regmap_register_patch: Register and apply register updates to be applied
 *                        on device initialistion
 *
 * @map: Register map to apply updates to.
 * @regs: Values to update.
 * @num_regs: Number of entries in regs.
 *
 * Register a set of register updates to be applied to the device
 * whenever the device registers are synchronised with the cache and
 * apply them immediately.  Typically this is used to apply
 * corrections to be applied to the device defaults on startup, such
 * as the updates some vendors provide to undocumented registers.
 */
int regmap_register_patch(struct regmap *map, const struct reg_default *regs,
			  int num_regs)
{
	int i, ret;
	bool bypass;

	/* If needed the implementation can be extended to support this */
	if (map->patch)
		return -EBUSY;

1477
	map->lock(map->lock_arg);
M
Mark Brown 已提交
1478 1479 1480 1481 1482 1483 1484 1485 1486 1487 1488 1489 1490 1491 1492

	bypass = map->cache_bypass;

	map->cache_bypass = true;

	/* Write out first; it's useful to apply even if we fail later. */
	for (i = 0; i < num_regs; i++) {
		ret = _regmap_write(map, regs[i].reg, regs[i].def);
		if (ret != 0) {
			dev_err(map->dev, "Failed to write %x = %x: %d\n",
				regs[i].reg, regs[i].def, ret);
			goto out;
		}
	}

1493
	map->patch = kcalloc(num_regs, sizeof(struct reg_default), GFP_KERNEL);
M
Mark Brown 已提交
1494 1495 1496 1497 1498 1499 1500 1501 1502 1503 1504
	if (map->patch != NULL) {
		memcpy(map->patch, regs,
		       num_regs * sizeof(struct reg_default));
		map->patch_regs = num_regs;
	} else {
		ret = -ENOMEM;
	}

out:
	map->cache_bypass = bypass;

1505
	map->unlock(map->lock_arg);
M
Mark Brown 已提交
1506 1507 1508 1509 1510

	return ret;
}
EXPORT_SYMBOL_GPL(regmap_register_patch);

1511
/*
1512 1513 1514 1515 1516 1517 1518 1519 1520 1521 1522 1523 1524 1525
 * regmap_get_val_bytes(): Report the size of a register value
 *
 * Report the size of a register value, mainly intended to for use by
 * generic infrastructure built on top of regmap.
 */
int regmap_get_val_bytes(struct regmap *map)
{
	if (map->format.format_write)
		return -EINVAL;

	return map->format.val_bytes;
}
EXPORT_SYMBOL_GPL(regmap_get_val_bytes);

1526 1527 1528 1529 1530 1531 1532
static int __init regmap_initcall(void)
{
	regmap_debugfs_initcall();

	return 0;
}
postcore_initcall(regmap_initcall);