Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

regmap: cache: Split raw and non-raw syncs

For code clarity after implementing block writes split out the raw and
non-raw I/O sync implementations.

Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
Reviewed-by: Dimitris Papastamos <dp@opensource.wolfsonmicro.com>

+53 -11
+53 -11
drivers/base/regmap/regcache.c
··· 545 545 return -ENOENT; 546 546 } 547 547 548 - int regcache_sync_block(struct regmap *map, void *block, 549 - unsigned int block_base, unsigned int start, 550 - unsigned int end) 548 + static int regcache_sync_block_single(struct regmap *map, void *block, 549 + unsigned int block_base, 550 + unsigned int start, unsigned int end) 551 + { 552 + unsigned int i, regtmp, val; 553 + int ret; 554 + 555 + for (i = start; i < end; i++) { 556 + regtmp = block_base + (i * map->reg_stride); 557 + 558 + if (!regcache_reg_present(map, regtmp)) 559 + continue; 560 + 561 + val = regcache_get_val(map, block, i); 562 + 563 + /* Is this the hardware default? If so skip. */ 564 + ret = regcache_lookup_reg(map, regtmp); 565 + if (ret >= 0 && val == map->reg_defaults[ret].def) 566 + continue; 567 + 568 + map->cache_bypass = 1; 569 + 570 + ret = _regmap_write(map, regtmp, val); 571 + 572 + map->cache_bypass = 0; 573 + if (ret != 0) 574 + return ret; 575 + dev_dbg(map->dev, "Synced register %#x, value %#x\n", 576 + regtmp, val); 577 + } 578 + 579 + return 0; 580 + } 581 + 582 + int regcache_sync_block_raw(struct regmap *map, void *block, 583 + unsigned int block_base, unsigned int start, 584 + unsigned int end) 551 585 { 552 586 unsigned int i, regtmp, val; 553 587 const void *addr; ··· 602 568 603 569 map->cache_bypass = 1; 604 570 605 - if (regmap_can_raw_write(map)) { 606 - addr = regcache_get_val_addr(map, block, i); 607 - ret = _regmap_raw_write(map, regtmp, addr, 608 - map->format.val_bytes, 609 - false); 610 - } else { 611 - ret = _regmap_write(map, regtmp, val); 612 - } 571 + addr = regcache_get_val_addr(map, block, i); 572 + ret = _regmap_raw_write(map, regtmp, addr, 573 + map->format.val_bytes, 574 + false); 613 575 614 576 map->cache_bypass = 0; 615 577 if (ret != 0) ··· 615 585 } 616 586 617 587 return 0; 588 + } 589 + 590 + int regcache_sync_block(struct regmap *map, void *block, 591 + unsigned int block_base, unsigned int start, 592 + unsigned int end) 593 + { 594 + if (regmap_can_raw_write(map)) 595 + return regcache_sync_block_raw(map, block, block_base, 596 + start, end); 597 + else 598 + return regcache_sync_block_single(map, block, block_base, 599 + start, end); 618 600 }