aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2014-04-01 16:16:04 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2014-04-01 16:16:04 -0400
commitc6b38ec06e281af0608f02763ac7484ace267024 (patch)
tree217a1c1c80d5d79ba336b80cc188ba2ab02bbc4d
parentd64b3932531cbc0c9d6bdb744446934435e9d6af (diff)
parent6012b1f3424c4dc36369697845a9ca699887b0c7 (diff)
Merge tag 'regmap-v3.15' of git://git.kernel.org/pub/scm/linux/kernel/git/broonie/regmap
Pull regmap updates from Mark Brown: "Quite a busy release for regmap this time around, the standout changes are: - A real implementation of regmap_multi_write() and a bypassed version of it for use by drivers doing patch-like things with more open coding for surrounding startup sequences. - Support fast_io on bulk operations. - Support split device binding and map initialisation for use by devices required in early init (mainly system controllers). - Fixes for some operations on maps with strides set. - Export the value parsing operations to help generic code built on top of the API. - Support for MMIO regmaps with non-32 bit register sizes. plus a few smaller fixes" * tag 'regmap-v3.15' of git://git.kernel.org/pub/scm/linux/kernel/git/broonie/regmap: (22 commits) regmap: mmio: Add regmap_mmio_regbits_check. regmap: mmio: Add support for 1/2/8 bytes wide register address. regmap: mmio: add regmap_mmio_{regsize, count}_check. regmap: cache: Don't attempt to sync non-writeable registers regmap: cache: Step by stride in default sync regmap: Fix possible sleep-in-atomic in regmap_bulk_write() regmap: Ensure regmap_register_patch() is compatible with fast_io regmap: irq: Set data pointer only on regmap_add_irq_chip success regmap: Implementation for regmap_multi_reg_write regmap: add regmap_parse_val api mfd: arizona: Use new regmap features for manual register patch regmap: Base regmap_register_patch on _regmap_multi_reg_write regmap: Add bypassed version of regmap_multi_reg_write regmap: Mark reg_defaults in regmap_multi_reg_write as const regmap: fix coccinelle warnings regmap: Check stride of register patch as we register it regmap: Clean up _regmap_update_bits() regmap: Separate regmap dev initialization regmap: Check readable regs in _regmap_read regmap: irq: Remove domain on exit ...
-rw-r--r--drivers/base/regmap/internal.h2
-rw-r--r--drivers/base/regmap/regcache.c13
-rw-r--r--drivers/base/regmap/regmap-debugfs.c2
-rw-r--r--drivers/base/regmap/regmap-irq.c6
-rw-r--r--drivers/base/regmap/regmap-mmio.c56
-rw-r--r--drivers/base/regmap/regmap.c353
-rw-r--r--drivers/mfd/arizona-core.c4
-rw-r--r--drivers/mfd/wm5102-tables.c21
-rw-r--r--include/linux/regmap.h20
9 files changed, 377 insertions, 100 deletions
diff --git a/drivers/base/regmap/internal.h b/drivers/base/regmap/internal.h
index 33414b1de201..7d1326985bee 100644
--- a/drivers/base/regmap/internal.h
+++ b/drivers/base/regmap/internal.h
@@ -134,6 +134,8 @@ struct regmap {
134 134
135 /* if set, converts bulk rw to single rw */ 135 /* if set, converts bulk rw to single rw */
136 bool use_single_rw; 136 bool use_single_rw;
137 /* if set, the device supports multi write mode */
138 bool can_multi_write;
137 139
138 struct rb_root range_tree; 140 struct rb_root range_tree;
139 void *selector_work_buf; /* Scratch buffer used for selector */ 141 void *selector_work_buf; /* Scratch buffer used for selector */
diff --git a/drivers/base/regmap/regcache.c b/drivers/base/regmap/regcache.c
index d4dd77134814..29b4128da0b0 100644
--- a/drivers/base/regmap/regcache.c
+++ b/drivers/base/regmap/regcache.c
@@ -249,11 +249,12 @@ static int regcache_default_sync(struct regmap *map, unsigned int min,
249{ 249{
250 unsigned int reg; 250 unsigned int reg;
251 251
252 for (reg = min; reg <= max; reg++) { 252 for (reg = min; reg <= max; reg += map->reg_stride) {
253 unsigned int val; 253 unsigned int val;
254 int ret; 254 int ret;
255 255
256 if (regmap_volatile(map, reg)) 256 if (regmap_volatile(map, reg) ||
257 !regmap_writeable(map, reg))
257 continue; 258 continue;
258 259
259 ret = regcache_read(map, reg, &val); 260 ret = regcache_read(map, reg, &val);
@@ -312,10 +313,6 @@ int regcache_sync(struct regmap *map)
312 /* Apply any patch first */ 313 /* Apply any patch first */
313 map->cache_bypass = 1; 314 map->cache_bypass = 1;
314 for (i = 0; i < map->patch_regs; i++) { 315 for (i = 0; i < map->patch_regs; i++) {
315 if (map->patch[i].reg % map->reg_stride) {
316 ret = -EINVAL;
317 goto out;
318 }
319 ret = _regmap_write(map, map->patch[i].reg, map->patch[i].def); 316 ret = _regmap_write(map, map->patch[i].reg, map->patch[i].def);
320 if (ret != 0) { 317 if (ret != 0) {
321 dev_err(map->dev, "Failed to write %x = %x: %d\n", 318 dev_err(map->dev, "Failed to write %x = %x: %d\n",
@@ -636,10 +633,10 @@ static int regcache_sync_block_raw_flush(struct regmap *map, const void **data,
636 if (*data == NULL) 633 if (*data == NULL)
637 return 0; 634 return 0;
638 635
639 count = cur - base; 636 count = (cur - base) / map->reg_stride;
640 637
641 dev_dbg(map->dev, "Writing %zu bytes for %d registers from 0x%x-0x%x\n", 638 dev_dbg(map->dev, "Writing %zu bytes for %d registers from 0x%x-0x%x\n",
642 count * val_bytes, count, base, cur - 1); 639 count * val_bytes, count, base, cur - map->reg_stride);
643 640
644 map->cache_bypass = 1; 641 map->cache_bypass = 1;
645 642
diff --git a/drivers/base/regmap/regmap-debugfs.c b/drivers/base/regmap/regmap-debugfs.c
index c5471cd6ebb7..45d812c0ea77 100644
--- a/drivers/base/regmap/regmap-debugfs.c
+++ b/drivers/base/regmap/regmap-debugfs.c
@@ -511,7 +511,7 @@ void regmap_debugfs_init(struct regmap *map, const char *name)
511 debugfs_create_file("range", 0400, map->debugfs, 511 debugfs_create_file("range", 0400, map->debugfs,
512 map, &regmap_reg_ranges_fops); 512 map, &regmap_reg_ranges_fops);
513 513
514 if (map->max_register) { 514 if (map->max_register || regmap_readable(map, 0)) {
515 debugfs_create_file("registers", 0400, map->debugfs, 515 debugfs_create_file("registers", 0400, map->debugfs,
516 map, &regmap_map_fops); 516 map, &regmap_map_fops);
517 debugfs_create_file("access", 0400, map->debugfs, 517 debugfs_create_file("access", 0400, map->debugfs,
diff --git a/drivers/base/regmap/regmap-irq.c b/drivers/base/regmap/regmap-irq.c
index 82692068d3cb..edf88f20cbce 100644
--- a/drivers/base/regmap/regmap-irq.c
+++ b/drivers/base/regmap/regmap-irq.c
@@ -368,8 +368,6 @@ int regmap_add_irq_chip(struct regmap *map, int irq, int irq_flags,
368 if (!d) 368 if (!d)
369 return -ENOMEM; 369 return -ENOMEM;
370 370
371 *data = d;
372
373 d->status_buf = kzalloc(sizeof(unsigned int) * chip->num_regs, 371 d->status_buf = kzalloc(sizeof(unsigned int) * chip->num_regs,
374 GFP_KERNEL); 372 GFP_KERNEL);
375 if (!d->status_buf) 373 if (!d->status_buf)
@@ -506,6 +504,8 @@ int regmap_add_irq_chip(struct regmap *map, int irq, int irq_flags,
506 goto err_domain; 504 goto err_domain;
507 } 505 }
508 506
507 *data = d;
508
509 return 0; 509 return 0;
510 510
511err_domain: 511err_domain:
@@ -533,7 +533,7 @@ void regmap_del_irq_chip(int irq, struct regmap_irq_chip_data *d)
533 return; 533 return;
534 534
535 free_irq(irq, d); 535 free_irq(irq, d);
536 /* We should unmap the domain but... */ 536 irq_domain_remove(d->domain);
537 kfree(d->wake_buf); 537 kfree(d->wake_buf);
538 kfree(d->mask_buf_def); 538 kfree(d->mask_buf_def);
539 kfree(d->mask_buf); 539 kfree(d->mask_buf);
diff --git a/drivers/base/regmap/regmap-mmio.c b/drivers/base/regmap/regmap-mmio.c
index 81f977510775..de45a1e1548f 100644
--- a/drivers/base/regmap/regmap-mmio.c
+++ b/drivers/base/regmap/regmap-mmio.c
@@ -26,10 +26,47 @@
26 26
27struct regmap_mmio_context { 27struct regmap_mmio_context {
28 void __iomem *regs; 28 void __iomem *regs;
29 unsigned reg_bytes;
29 unsigned val_bytes; 30 unsigned val_bytes;
31 unsigned pad_bytes;
30 struct clk *clk; 32 struct clk *clk;
31}; 33};
32 34
35static inline void regmap_mmio_regsize_check(size_t reg_size)
36{
37 switch (reg_size) {
38 case 1:
39 case 2:
40 case 4:
41#ifdef CONFIG_64BIT
42 case 8:
43#endif
44 break;
45 default:
46 BUG();
47 }
48}
49
50static int regmap_mmio_regbits_check(size_t reg_bits)
51{
52 switch (reg_bits) {
53 case 8:
54 case 16:
55 case 32:
56#ifdef CONFIG_64BIT
57 case 64:
58#endif
59 return 0;
60 default:
61 return -EINVAL;
62 }
63}
64
65static inline void regmap_mmio_count_check(size_t count)
66{
67 BUG_ON(count % 2 != 0);
68}
69
33static int regmap_mmio_gather_write(void *context, 70static int regmap_mmio_gather_write(void *context,
34 const void *reg, size_t reg_size, 71 const void *reg, size_t reg_size,
35 const void *val, size_t val_size) 72 const void *val, size_t val_size)
@@ -38,7 +75,7 @@ static int regmap_mmio_gather_write(void *context,
38 u32 offset; 75 u32 offset;
39 int ret; 76 int ret;
40 77
41 BUG_ON(reg_size != 4); 78 regmap_mmio_regsize_check(reg_size);
42 79
43 if (!IS_ERR(ctx->clk)) { 80 if (!IS_ERR(ctx->clk)) {
44 ret = clk_enable(ctx->clk); 81 ret = clk_enable(ctx->clk);
@@ -81,9 +118,13 @@ static int regmap_mmio_gather_write(void *context,
81 118
82static int regmap_mmio_write(void *context, const void *data, size_t count) 119static int regmap_mmio_write(void *context, const void *data, size_t count)
83{ 120{
84 BUG_ON(count < 4); 121 struct regmap_mmio_context *ctx = context;
122 u32 offset = ctx->reg_bytes + ctx->pad_bytes;
123
124 regmap_mmio_count_check(count);
85 125
86 return regmap_mmio_gather_write(context, data, 4, data + 4, count - 4); 126 return regmap_mmio_gather_write(context, data, ctx->reg_bytes,
127 data + offset, count - offset);
87} 128}
88 129
89static int regmap_mmio_read(void *context, 130static int regmap_mmio_read(void *context,
@@ -94,7 +135,7 @@ static int regmap_mmio_read(void *context,
94 u32 offset; 135 u32 offset;
95 int ret; 136 int ret;
96 137
97 BUG_ON(reg_size != 4); 138 regmap_mmio_regsize_check(reg_size);
98 139
99 if (!IS_ERR(ctx->clk)) { 140 if (!IS_ERR(ctx->clk)) {
100 ret = clk_enable(ctx->clk); 141 ret = clk_enable(ctx->clk);
@@ -165,8 +206,9 @@ static struct regmap_mmio_context *regmap_mmio_gen_context(struct device *dev,
165 int min_stride; 206 int min_stride;
166 int ret; 207 int ret;
167 208
168 if (config->reg_bits != 32) 209 ret = regmap_mmio_regbits_check(config->reg_bits);
169 return ERR_PTR(-EINVAL); 210 if (ret)
211 return ERR_PTR(ret);
170 212
171 if (config->pad_bits) 213 if (config->pad_bits)
172 return ERR_PTR(-EINVAL); 214 return ERR_PTR(-EINVAL);
@@ -209,6 +251,8 @@ static struct regmap_mmio_context *regmap_mmio_gen_context(struct device *dev,
209 251
210 ctx->regs = regs; 252 ctx->regs = regs;
211 ctx->val_bytes = config->val_bits / 8; 253 ctx->val_bytes = config->val_bits / 8;
254 ctx->reg_bytes = config->reg_bits / 8;
255 ctx->pad_bytes = config->pad_bits / 8;
212 ctx->clk = ERR_PTR(-ENODEV); 256 ctx->clk = ERR_PTR(-ENODEV);
213 257
214 if (clk_id == NULL) 258 if (clk_id == NULL)
diff --git a/drivers/base/regmap/regmap.c b/drivers/base/regmap/regmap.c
index 6a19515f8a45..d0a072463a04 100644
--- a/drivers/base/regmap/regmap.c
+++ b/drivers/base/regmap/regmap.c
@@ -380,6 +380,28 @@ static void regmap_range_exit(struct regmap *map)
380 kfree(map->selector_work_buf); 380 kfree(map->selector_work_buf);
381} 381}
382 382
383int regmap_attach_dev(struct device *dev, struct regmap *map,
384 const struct regmap_config *config)
385{
386 struct regmap **m;
387
388 map->dev = dev;
389
390 regmap_debugfs_init(map, config->name);
391
392 /* Add a devres resource for dev_get_regmap() */
393 m = devres_alloc(dev_get_regmap_release, sizeof(*m), GFP_KERNEL);
394 if (!m) {
395 regmap_debugfs_exit(map);
396 return -ENOMEM;
397 }
398 *m = map;
399 devres_add(dev, m);
400
401 return 0;
402}
403EXPORT_SYMBOL_GPL(regmap_attach_dev);
404
383/** 405/**
384 * regmap_init(): Initialise register map 406 * regmap_init(): Initialise register map
385 * 407 *
@@ -397,7 +419,7 @@ struct regmap *regmap_init(struct device *dev,
397 void *bus_context, 419 void *bus_context,
398 const struct regmap_config *config) 420 const struct regmap_config *config)
399{ 421{
400 struct regmap *map, **m; 422 struct regmap *map;
401 int ret = -EINVAL; 423 int ret = -EINVAL;
402 enum regmap_endian reg_endian, val_endian; 424 enum regmap_endian reg_endian, val_endian;
403 int i, j; 425 int i, j;
@@ -439,6 +461,7 @@ struct regmap *regmap_init(struct device *dev,
439 else 461 else
440 map->reg_stride = 1; 462 map->reg_stride = 1;
441 map->use_single_rw = config->use_single_rw; 463 map->use_single_rw = config->use_single_rw;
464 map->can_multi_write = config->can_multi_write;
442 map->dev = dev; 465 map->dev = dev;
443 map->bus = bus; 466 map->bus = bus;
444 map->bus_context = bus_context; 467 map->bus_context = bus_context;
@@ -718,7 +741,7 @@ skip_format_initialization:
718 new->window_start = range_cfg->window_start; 741 new->window_start = range_cfg->window_start;
719 new->window_len = range_cfg->window_len; 742 new->window_len = range_cfg->window_len;
720 743
721 if (_regmap_range_add(map, new) == false) { 744 if (!_regmap_range_add(map, new)) {
722 dev_err(map->dev, "Failed to add range %d\n", i); 745 dev_err(map->dev, "Failed to add range %d\n", i);
723 kfree(new); 746 kfree(new);
724 goto err_range; 747 goto err_range;
@@ -734,25 +757,18 @@ skip_format_initialization:
734 } 757 }
735 } 758 }
736 759
737 regmap_debugfs_init(map, config->name);
738
739 ret = regcache_init(map, config); 760 ret = regcache_init(map, config);
740 if (ret != 0) 761 if (ret != 0)
741 goto err_range; 762 goto err_range;
742 763
743 /* Add a devres resource for dev_get_regmap() */ 764 if (dev)
744 m = devres_alloc(dev_get_regmap_release, sizeof(*m), GFP_KERNEL); 765 ret = regmap_attach_dev(dev, map, config);
745 if (!m) { 766 if (ret != 0)
746 ret = -ENOMEM; 767 goto err_regcache;
747 goto err_debugfs;
748 }
749 *m = map;
750 devres_add(dev, m);
751 768
752 return map; 769 return map;
753 770
754err_debugfs: 771err_regcache:
755 regmap_debugfs_exit(map);
756 regcache_exit(map); 772 regcache_exit(map);
757err_range: 773err_range:
758 regmap_range_exit(map); 774 regmap_range_exit(map);
@@ -1520,12 +1536,12 @@ int regmap_bulk_write(struct regmap *map, unsigned int reg, const void *val,
1520 if (reg % map->reg_stride) 1536 if (reg % map->reg_stride)
1521 return -EINVAL; 1537 return -EINVAL;
1522 1538
1523 map->lock(map->lock_arg);
1524 /* 1539 /*
1525 * Some devices don't support bulk write, for 1540 * Some devices don't support bulk write, for
1526 * them we have a series of single write operations. 1541 * them we have a series of single write operations.
1527 */ 1542 */
1528 if (!map->bus || map->use_single_rw) { 1543 if (!map->bus || map->use_single_rw) {
1544 map->lock(map->lock_arg);
1529 for (i = 0; i < val_count; i++) { 1545 for (i = 0; i < val_count; i++) {
1530 unsigned int ival; 1546 unsigned int ival;
1531 1547
@@ -1554,31 +1570,239 @@ int regmap_bulk_write(struct regmap *map, unsigned int reg, const void *val,
1554 if (ret != 0) 1570 if (ret != 0)
1555 goto out; 1571 goto out;
1556 } 1572 }
1573out:
1574 map->unlock(map->lock_arg);
1557 } else { 1575 } else {
1558 void *wval; 1576 void *wval;
1559 1577
1560 wval = kmemdup(val, val_count * val_bytes, GFP_KERNEL); 1578 wval = kmemdup(val, val_count * val_bytes, GFP_KERNEL);
1561 if (!wval) { 1579 if (!wval) {
1562 ret = -ENOMEM;
1563 dev_err(map->dev, "Error in memory allocation\n"); 1580 dev_err(map->dev, "Error in memory allocation\n");
1564 goto out; 1581 return -ENOMEM;
1565 } 1582 }
1566 for (i = 0; i < val_count * val_bytes; i += val_bytes) 1583 for (i = 0; i < val_count * val_bytes; i += val_bytes)
1567 map->format.parse_inplace(wval + i); 1584 map->format.parse_inplace(wval + i);
1568 1585
1586 map->lock(map->lock_arg);
1569 ret = _regmap_raw_write(map, reg, wval, val_bytes * val_count); 1587 ret = _regmap_raw_write(map, reg, wval, val_bytes * val_count);
1588 map->unlock(map->lock_arg);
1570 1589
1571 kfree(wval); 1590 kfree(wval);
1572 } 1591 }
1573out:
1574 map->unlock(map->lock_arg);
1575 return ret; 1592 return ret;
1576} 1593}
1577EXPORT_SYMBOL_GPL(regmap_bulk_write); 1594EXPORT_SYMBOL_GPL(regmap_bulk_write);
1578 1595
1579/* 1596/*
1597 * _regmap_raw_multi_reg_write()
1598 *
1599 * the (register,newvalue) pairs in regs have not been formatted, but
1600 * they are all in the same page and have been changed to being page
1601 * relative. The page register has been written if that was neccessary.
1602 */
1603static int _regmap_raw_multi_reg_write(struct regmap *map,
1604 const struct reg_default *regs,
1605 size_t num_regs)
1606{
1607 int ret;
1608 void *buf;
1609 int i;
1610 u8 *u8;
1611 size_t val_bytes = map->format.val_bytes;
1612 size_t reg_bytes = map->format.reg_bytes;
1613 size_t pad_bytes = map->format.pad_bytes;
1614 size_t pair_size = reg_bytes + pad_bytes + val_bytes;
1615 size_t len = pair_size * num_regs;
1616
1617 buf = kzalloc(len, GFP_KERNEL);
1618 if (!buf)
1619 return -ENOMEM;
1620
1621 /* We have to linearise by hand. */
1622
1623 u8 = buf;
1624
1625 for (i = 0; i < num_regs; i++) {
1626 int reg = regs[i].reg;
1627 int val = regs[i].def;
1628 trace_regmap_hw_write_start(map->dev, reg, 1);
1629 map->format.format_reg(u8, reg, map->reg_shift);
1630 u8 += reg_bytes + pad_bytes;
1631 map->format.format_val(u8, val, 0);
1632 u8 += val_bytes;
1633 }
1634 u8 = buf;
1635 *u8 |= map->write_flag_mask;
1636
1637 ret = map->bus->write(map->bus_context, buf, len);
1638
1639 kfree(buf);
1640
1641 for (i = 0; i < num_regs; i++) {
1642 int reg = regs[i].reg;
1643 trace_regmap_hw_write_done(map->dev, reg, 1);
1644 }
1645 return ret;
1646}
1647
1648static unsigned int _regmap_register_page(struct regmap *map,
1649 unsigned int reg,
1650 struct regmap_range_node *range)
1651{
1652 unsigned int win_page = (reg - range->range_min) / range->window_len;
1653
1654 return win_page;
1655}
1656
1657static int _regmap_range_multi_paged_reg_write(struct regmap *map,
1658 struct reg_default *regs,
1659 size_t num_regs)
1660{
1661 int ret;
1662 int i, n;
1663 struct reg_default *base;
1664 unsigned int this_page;
1665 /*
1666 * the set of registers are not neccessarily in order, but
1667 * since the order of write must be preserved this algorithm
1668 * chops the set each time the page changes
1669 */
1670 base = regs;
1671 for (i = 0, n = 0; i < num_regs; i++, n++) {
1672 unsigned int reg = regs[i].reg;
1673 struct regmap_range_node *range;
1674
1675 range = _regmap_range_lookup(map, reg);
1676 if (range) {
1677 unsigned int win_page = _regmap_register_page(map, reg,
1678 range);
1679
1680 if (i == 0)
1681 this_page = win_page;
1682 if (win_page != this_page) {
1683 this_page = win_page;
1684 ret = _regmap_raw_multi_reg_write(map, base, n);
1685 if (ret != 0)
1686 return ret;
1687 base += n;
1688 n = 0;
1689 }
1690 ret = _regmap_select_page(map, &base[n].reg, range, 1);
1691 if (ret != 0)
1692 return ret;
1693 }
1694 }
1695 if (n > 0)
1696 return _regmap_raw_multi_reg_write(map, base, n);
1697 return 0;
1698}
1699
1700static int _regmap_multi_reg_write(struct regmap *map,
1701 const struct reg_default *regs,
1702 size_t num_regs)
1703{
1704 int i;
1705 int ret;
1706
1707 if (!map->can_multi_write) {
1708 for (i = 0; i < num_regs; i++) {
1709 ret = _regmap_write(map, regs[i].reg, regs[i].def);
1710 if (ret != 0)
1711 return ret;
1712 }
1713 return 0;
1714 }
1715
1716 if (!map->format.parse_inplace)
1717 return -EINVAL;
1718
1719 if (map->writeable_reg)
1720 for (i = 0; i < num_regs; i++) {
1721 int reg = regs[i].reg;
1722 if (!map->writeable_reg(map->dev, reg))
1723 return -EINVAL;
1724 if (reg % map->reg_stride)
1725 return -EINVAL;
1726 }
1727
1728 if (!map->cache_bypass) {
1729 for (i = 0; i < num_regs; i++) {
1730 unsigned int val = regs[i].def;
1731 unsigned int reg = regs[i].reg;
1732 ret = regcache_write(map, reg, val);
1733 if (ret) {
1734 dev_err(map->dev,
1735 "Error in caching of register: %x ret: %d\n",
1736 reg, ret);
1737 return ret;
1738 }
1739 }
1740 if (map->cache_only) {
1741 map->cache_dirty = true;
1742 return 0;
1743 }
1744 }
1745
1746 WARN_ON(!map->bus);
1747
1748 for (i = 0; i < num_regs; i++) {
1749 unsigned int reg = regs[i].reg;
1750 struct regmap_range_node *range;
1751 range = _regmap_range_lookup(map, reg);
1752 if (range) {
1753 size_t len = sizeof(struct reg_default)*num_regs;
1754 struct reg_default *base = kmemdup(regs, len,
1755 GFP_KERNEL);
1756 if (!base)
1757 return -ENOMEM;
1758 ret = _regmap_range_multi_paged_reg_write(map, base,
1759 num_regs);
1760 kfree(base);
1761
1762 return ret;
1763 }
1764 }
1765 return _regmap_raw_multi_reg_write(map, regs, num_regs);
1766}
1767
1768/*
1580 * regmap_multi_reg_write(): Write multiple registers to the device 1769 * regmap_multi_reg_write(): Write multiple registers to the device
1581 * 1770 *
1771 * where the set of register,value pairs are supplied in any order,
1772 * possibly not all in a single range.
1773 *
1774 * @map: Register map to write to
1775 * @regs: Array of structures containing register,value to be written
1776 * @num_regs: Number of registers to write
1777 *
1778 * The 'normal' block write mode will send ultimately send data on the
1779 * target bus as R,V1,V2,V3,..,Vn where successively higer registers are
1780 * addressed. However, this alternative block multi write mode will send
1781 * the data as R1,V1,R2,V2,..,Rn,Vn on the target bus. The target device
1782 * must of course support the mode.
1783 *
1784 * A value of zero will be returned on success, a negative errno will be
1785 * returned in error cases.
1786 */
1787int regmap_multi_reg_write(struct regmap *map, const struct reg_default *regs,
1788 int num_regs)
1789{
1790 int ret;
1791
1792 map->lock(map->lock_arg);
1793
1794 ret = _regmap_multi_reg_write(map, regs, num_regs);
1795
1796 map->unlock(map->lock_arg);
1797
1798 return ret;
1799}
1800EXPORT_SYMBOL_GPL(regmap_multi_reg_write);
1801
1802/*
1803 * regmap_multi_reg_write_bypassed(): Write multiple registers to the
1804 * device but not the cache
1805 *
1582 * where the set of register are supplied in any order 1806 * where the set of register are supplied in any order
1583 * 1807 *
1584 * @map: Register map to write to 1808 * @map: Register map to write to
@@ -1592,30 +1816,27 @@ EXPORT_SYMBOL_GPL(regmap_bulk_write);
1592 * A value of zero will be returned on success, a negative errno will 1816 * A value of zero will be returned on success, a negative errno will
1593 * be returned in error cases. 1817 * be returned in error cases.
1594 */ 1818 */
1595int regmap_multi_reg_write(struct regmap *map, struct reg_default *regs, 1819int regmap_multi_reg_write_bypassed(struct regmap *map,
1596 int num_regs) 1820 const struct reg_default *regs,
1821 int num_regs)
1597{ 1822{
1598 int ret = 0, i; 1823 int ret;
1599 1824 bool bypass;
1600 for (i = 0; i < num_regs; i++) {
1601 int reg = regs[i].reg;
1602 if (reg % map->reg_stride)
1603 return -EINVAL;
1604 }
1605 1825
1606 map->lock(map->lock_arg); 1826 map->lock(map->lock_arg);
1607 1827
1608 for (i = 0; i < num_regs; i++) { 1828 bypass = map->cache_bypass;
1609 ret = _regmap_write(map, regs[i].reg, regs[i].def); 1829 map->cache_bypass = true;
1610 if (ret != 0) 1830
1611 goto out; 1831 ret = _regmap_multi_reg_write(map, regs, num_regs);
1612 } 1832
1613out: 1833 map->cache_bypass = bypass;
1834
1614 map->unlock(map->lock_arg); 1835 map->unlock(map->lock_arg);
1615 1836
1616 return ret; 1837 return ret;
1617} 1838}
1618EXPORT_SYMBOL_GPL(regmap_multi_reg_write); 1839EXPORT_SYMBOL_GPL(regmap_multi_reg_write_bypassed);
1619 1840
1620/** 1841/**
1621 * regmap_raw_write_async(): Write raw values to one or more registers 1842 * regmap_raw_write_async(): Write raw values to one or more registers
@@ -1736,6 +1957,9 @@ static int _regmap_read(struct regmap *map, unsigned int reg,
1736 if (map->cache_only) 1957 if (map->cache_only)
1737 return -EBUSY; 1958 return -EBUSY;
1738 1959
1960 if (!regmap_readable(map, reg))
1961 return -EIO;
1962
1739 ret = map->reg_read(context, reg, val); 1963 ret = map->reg_read(context, reg, val);
1740 if (ret == 0) { 1964 if (ret == 0) {
1741#ifdef LOG_DEVICE 1965#ifdef LOG_DEVICE
@@ -1966,9 +2190,11 @@ static int _regmap_update_bits(struct regmap *map, unsigned int reg,
1966 2190
1967 if (tmp != orig) { 2191 if (tmp != orig) {
1968 ret = _regmap_write(map, reg, tmp); 2192 ret = _regmap_write(map, reg, tmp);
1969 *change = true; 2193 if (change)
2194 *change = true;
1970 } else { 2195 } else {
1971 *change = false; 2196 if (change)
2197 *change = false;
1972 } 2198 }
1973 2199
1974 return ret; 2200 return ret;
@@ -1987,11 +2213,10 @@ static int _regmap_update_bits(struct regmap *map, unsigned int reg,
1987int regmap_update_bits(struct regmap *map, unsigned int reg, 2213int regmap_update_bits(struct regmap *map, unsigned int reg,
1988 unsigned int mask, unsigned int val) 2214 unsigned int mask, unsigned int val)
1989{ 2215{
1990 bool change;
1991 int ret; 2216 int ret;
1992 2217
1993 map->lock(map->lock_arg); 2218 map->lock(map->lock_arg);
1994 ret = _regmap_update_bits(map, reg, mask, val, &change); 2219 ret = _regmap_update_bits(map, reg, mask, val, NULL);
1995 map->unlock(map->lock_arg); 2220 map->unlock(map->lock_arg);
1996 2221
1997 return ret; 2222 return ret;
@@ -2016,14 +2241,13 @@ EXPORT_SYMBOL_GPL(regmap_update_bits);
2016int regmap_update_bits_async(struct regmap *map, unsigned int reg, 2241int regmap_update_bits_async(struct regmap *map, unsigned int reg,
2017 unsigned int mask, unsigned int val) 2242 unsigned int mask, unsigned int val)
2018{ 2243{
2019 bool change;
2020 int ret; 2244 int ret;
2021 2245
2022 map->lock(map->lock_arg); 2246 map->lock(map->lock_arg);
2023 2247
2024 map->async = true; 2248 map->async = true;
2025 2249
2026 ret = _regmap_update_bits(map, reg, mask, val, &change); 2250 ret = _regmap_update_bits(map, reg, mask, val, NULL);
2027 2251
2028 map->async = false; 2252 map->async = false;
2029 2253
@@ -2173,35 +2397,21 @@ EXPORT_SYMBOL_GPL(regmap_async_complete);
2173 * apply them immediately. Typically this is used to apply 2397 * apply them immediately. Typically this is used to apply
2174 * corrections to be applied to the device defaults on startup, such 2398 * corrections to be applied to the device defaults on startup, such
2175 * as the updates some vendors provide to undocumented registers. 2399 * as the updates some vendors provide to undocumented registers.
2400 *
2401 * The caller must ensure that this function cannot be called
2402 * concurrently with either itself or regcache_sync().
2176 */ 2403 */
2177int regmap_register_patch(struct regmap *map, const struct reg_default *regs, 2404int regmap_register_patch(struct regmap *map, const struct reg_default *regs,
2178 int num_regs) 2405 int num_regs)
2179{ 2406{
2180 struct reg_default *p; 2407 struct reg_default *p;
2181 int i, ret; 2408 int ret;
2182 bool bypass; 2409 bool bypass;
2183 2410
2184 if (WARN_ONCE(num_regs <= 0, "invalid registers number (%d)\n", 2411 if (WARN_ONCE(num_regs <= 0, "invalid registers number (%d)\n",
2185 num_regs)) 2412 num_regs))
2186 return 0; 2413 return 0;
2187 2414
2188 map->lock(map->lock_arg);
2189
2190 bypass = map->cache_bypass;
2191
2192 map->cache_bypass = true;
2193 map->async = true;
2194
2195 /* Write out first; it's useful to apply even if we fail later. */
2196 for (i = 0; i < num_regs; i++) {
2197 ret = _regmap_write(map, regs[i].reg, regs[i].def);
2198 if (ret != 0) {
2199 dev_err(map->dev, "Failed to write %x = %x: %d\n",
2200 regs[i].reg, regs[i].def, ret);
2201 goto out;
2202 }
2203 }
2204
2205 p = krealloc(map->patch, 2415 p = krealloc(map->patch,
2206 sizeof(struct reg_default) * (map->patch_regs + num_regs), 2416 sizeof(struct reg_default) * (map->patch_regs + num_regs),
2207 GFP_KERNEL); 2417 GFP_KERNEL);
@@ -2210,9 +2420,20 @@ int regmap_register_patch(struct regmap *map, const struct reg_default *regs,
2210 map->patch = p; 2420 map->patch = p;
2211 map->patch_regs += num_regs; 2421 map->patch_regs += num_regs;
2212 } else { 2422 } else {
2213 ret = -ENOMEM; 2423 return -ENOMEM;
2214 } 2424 }
2215 2425
2426 map->lock(map->lock_arg);
2427
2428 bypass = map->cache_bypass;
2429
2430 map->cache_bypass = true;
2431 map->async = true;
2432
2433 ret = _regmap_multi_reg_write(map, regs, num_regs);
2434 if (ret != 0)
2435 goto out;
2436
2216out: 2437out:
2217 map->async = false; 2438 map->async = false;
2218 map->cache_bypass = bypass; 2439 map->cache_bypass = bypass;
@@ -2240,6 +2461,18 @@ int regmap_get_val_bytes(struct regmap *map)
2240} 2461}
2241EXPORT_SYMBOL_GPL(regmap_get_val_bytes); 2462EXPORT_SYMBOL_GPL(regmap_get_val_bytes);
2242 2463
2464int regmap_parse_val(struct regmap *map, const void *buf,
2465 unsigned int *val)
2466{
2467 if (!map->format.parse_val)
2468 return -EINVAL;
2469
2470 *val = map->format.parse_val(buf);
2471
2472 return 0;
2473}
2474EXPORT_SYMBOL_GPL(regmap_parse_val);
2475
2243static int __init regmap_initcall(void) 2476static int __init regmap_initcall(void)
2244{ 2477{
2245 regmap_debugfs_initcall(); 2478 regmap_debugfs_initcall();
diff --git a/drivers/mfd/arizona-core.c b/drivers/mfd/arizona-core.c
index a45aab9f6bb1..1c3ae57082ed 100644
--- a/drivers/mfd/arizona-core.c
+++ b/drivers/mfd/arizona-core.c
@@ -251,8 +251,6 @@ static int arizona_apply_hardware_patch(struct arizona* arizona)
251 unsigned int fll, sysclk; 251 unsigned int fll, sysclk;
252 int ret, err; 252 int ret, err;
253 253
254 regcache_cache_bypass(arizona->regmap, true);
255
256 /* Cache existing FLL and SYSCLK settings */ 254 /* Cache existing FLL and SYSCLK settings */
257 ret = regmap_read(arizona->regmap, ARIZONA_FLL1_CONTROL_1, &fll); 255 ret = regmap_read(arizona->regmap, ARIZONA_FLL1_CONTROL_1, &fll);
258 if (ret != 0) { 256 if (ret != 0) {
@@ -322,8 +320,6 @@ err_fll:
322 err); 320 err);
323 } 321 }
324 322
325 regcache_cache_bypass(arizona->regmap, false);
326
327 if (ret != 0) 323 if (ret != 0)
328 return ret; 324 return ret;
329 else 325 else
diff --git a/drivers/mfd/wm5102-tables.c b/drivers/mfd/wm5102-tables.c
index 1e9a4b2102f9..bffc584e4a43 100644
--- a/drivers/mfd/wm5102-tables.c
+++ b/drivers/mfd/wm5102-tables.c
@@ -80,8 +80,7 @@ static const struct reg_default wm5102_revb_patch[] = {
80int wm5102_patch(struct arizona *arizona) 80int wm5102_patch(struct arizona *arizona)
81{ 81{
82 const struct reg_default *wm5102_patch; 82 const struct reg_default *wm5102_patch;
83 int ret = 0; 83 int patch_size;
84 int i, patch_size;
85 84
86 switch (arizona->rev) { 85 switch (arizona->rev) {
87 case 0: 86 case 0:
@@ -92,21 +91,9 @@ int wm5102_patch(struct arizona *arizona)
92 patch_size = ARRAY_SIZE(wm5102_revb_patch); 91 patch_size = ARRAY_SIZE(wm5102_revb_patch);
93 } 92 }
94 93
95 regcache_cache_bypass(arizona->regmap, true); 94 return regmap_multi_reg_write_bypassed(arizona->regmap,
96 95 wm5102_patch,
97 for (i = 0; i < patch_size; i++) { 96 patch_size);
98 ret = regmap_write(arizona->regmap, wm5102_patch[i].reg,
99 wm5102_patch[i].def);
100 if (ret != 0) {
101 dev_err(arizona->dev, "Failed to write %x = %x: %d\n",
102 wm5102_patch[i].reg, wm5102_patch[i].def, ret);
103 goto out;
104 }
105 }
106
107out:
108 regcache_cache_bypass(arizona->regmap, false);
109 return ret;
110} 97}
111 98
112static const struct regmap_irq wm5102_aod_irqs[ARIZONA_NUM_IRQ] = { 99static const struct regmap_irq wm5102_aod_irqs[ARIZONA_NUM_IRQ] = {
diff --git a/include/linux/regmap.h b/include/linux/regmap.h
index 4149f1a9b003..5ad86eacef0d 100644
--- a/include/linux/regmap.h
+++ b/include/linux/regmap.h
@@ -164,6 +164,9 @@ typedef void (*regmap_unlock)(void *);
164 * @use_single_rw: If set, converts the bulk read and write operations into 164 * @use_single_rw: If set, converts the bulk read and write operations into
165 * a series of single read and write operations. This is useful 165 * a series of single read and write operations. This is useful
166 * for device that does not support bulk read and write. 166 * for device that does not support bulk read and write.
167 * @can_multi_write: If set, the device supports the multi write mode of bulk
168 * write operations, if clear multi write requests will be
169 * split into individual write operations
167 * 170 *
168 * @cache_type: The actual cache type. 171 * @cache_type: The actual cache type.
169 * @reg_defaults_raw: Power on reset values for registers (for use with 172 * @reg_defaults_raw: Power on reset values for registers (for use with
@@ -215,6 +218,7 @@ struct regmap_config {
215 u8 write_flag_mask; 218 u8 write_flag_mask;
216 219
217 bool use_single_rw; 220 bool use_single_rw;
221 bool can_multi_write;
218 222
219 enum regmap_endian reg_format_endian; 223 enum regmap_endian reg_format_endian;
220 enum regmap_endian val_format_endian; 224 enum regmap_endian val_format_endian;
@@ -317,6 +321,8 @@ struct regmap *regmap_init(struct device *dev,
317 const struct regmap_bus *bus, 321 const struct regmap_bus *bus,
318 void *bus_context, 322 void *bus_context,
319 const struct regmap_config *config); 323 const struct regmap_config *config);
324int regmap_attach_dev(struct device *dev, struct regmap *map,
325 const struct regmap_config *config);
320struct regmap *regmap_init_i2c(struct i2c_client *i2c, 326struct regmap *regmap_init_i2c(struct i2c_client *i2c,
321 const struct regmap_config *config); 327 const struct regmap_config *config);
322struct regmap *regmap_init_spi(struct spi_device *dev, 328struct regmap *regmap_init_spi(struct spi_device *dev,
@@ -386,8 +392,11 @@ int regmap_raw_write(struct regmap *map, unsigned int reg,
386 const void *val, size_t val_len); 392 const void *val, size_t val_len);
387int regmap_bulk_write(struct regmap *map, unsigned int reg, const void *val, 393int regmap_bulk_write(struct regmap *map, unsigned int reg, const void *val,
388 size_t val_count); 394 size_t val_count);
389int regmap_multi_reg_write(struct regmap *map, struct reg_default *regs, 395int regmap_multi_reg_write(struct regmap *map, const struct reg_default *regs,
390 int num_regs); 396 int num_regs);
397int regmap_multi_reg_write_bypassed(struct regmap *map,
398 const struct reg_default *regs,
399 int num_regs);
391int regmap_raw_write_async(struct regmap *map, unsigned int reg, 400int regmap_raw_write_async(struct regmap *map, unsigned int reg,
392 const void *val, size_t val_len); 401 const void *val, size_t val_len);
393int regmap_read(struct regmap *map, unsigned int reg, unsigned int *val); 402int regmap_read(struct regmap *map, unsigned int reg, unsigned int *val);
@@ -423,6 +432,8 @@ bool regmap_check_range_table(struct regmap *map, unsigned int reg,
423 432
424int regmap_register_patch(struct regmap *map, const struct reg_default *regs, 433int regmap_register_patch(struct regmap *map, const struct reg_default *regs,
425 int num_regs); 434 int num_regs);
435int regmap_parse_val(struct regmap *map, const void *buf,
436 unsigned int *val);
426 437
427static inline bool regmap_reg_in_range(unsigned int reg, 438static inline bool regmap_reg_in_range(unsigned int reg,
428 const struct regmap_range *range) 439 const struct regmap_range *range)
@@ -695,6 +706,13 @@ static inline int regmap_register_patch(struct regmap *map,
695 return -EINVAL; 706 return -EINVAL;
696} 707}
697 708
709static inline int regmap_parse_val(struct regmap *map, const void *buf,
710 unsigned int *val)
711{
712 WARN_ONCE(1, "regmap API is disabled");
713 return -EINVAL;
714}
715
698static inline struct regmap *dev_get_regmap(struct device *dev, 716static inline struct regmap *dev_get_regmap(struct device *dev,
699 const char *name) 717 const char *name)
700{ 718{