aboutsummaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
Diffstat (limited to 'drivers')
-rw-r--r--drivers/base/regmap/Kconfig3
-rw-r--r--drivers/base/regmap/internal.h6
-rw-r--r--drivers/base/regmap/regcache.c13
-rw-r--r--drivers/base/regmap/regmap-debugfs.c8
-rw-r--r--drivers/base/regmap/regmap-i2c.c2
-rw-r--r--drivers/base/regmap/regmap-spi.c2
-rw-r--r--drivers/base/regmap/regmap.c86
7 files changed, 101 insertions, 19 deletions
diff --git a/drivers/base/regmap/Kconfig b/drivers/base/regmap/Kconfig
index 4251570610c9..8a3f51f7b1b9 100644
--- a/drivers/base/regmap/Kconfig
+++ b/drivers/base/regmap/Kconfig
@@ -11,12 +11,15 @@ config REGMAP
11 11
12config REGMAP_I2C 12config REGMAP_I2C
13 tristate 13 tristate
14 depends on I2C
14 15
15config REGMAP_SPI 16config REGMAP_SPI
16 tristate 17 tristate
18 depends on SPI
17 19
18config REGMAP_SPMI 20config REGMAP_SPMI
19 tristate 21 tristate
22 depends on SPMI
20 23
21config REGMAP_MMIO 24config REGMAP_MMIO
22 tristate 25 tristate
diff --git a/drivers/base/regmap/internal.h b/drivers/base/regmap/internal.h
index bfc90b8547f2..0da5865df5b1 100644
--- a/drivers/base/regmap/internal.h
+++ b/drivers/base/regmap/internal.h
@@ -49,8 +49,10 @@ struct regmap_async {
49}; 49};
50 50
51struct regmap { 51struct regmap {
52 struct mutex mutex; 52 union {
53 spinlock_t spinlock; 53 struct mutex mutex;
54 spinlock_t spinlock;
55 };
54 unsigned long spinlock_flags; 56 unsigned long spinlock_flags;
55 regmap_lock lock; 57 regmap_lock lock;
56 regmap_unlock unlock; 58 regmap_unlock unlock;
diff --git a/drivers/base/regmap/regcache.c b/drivers/base/regmap/regcache.c
index 5617da6dc898..f1280dc356d0 100644
--- a/drivers/base/regmap/regcache.c
+++ b/drivers/base/regmap/regcache.c
@@ -269,8 +269,11 @@ static int regcache_default_sync(struct regmap *map, unsigned int min,
269 map->cache_bypass = 1; 269 map->cache_bypass = 1;
270 ret = _regmap_write(map, reg, val); 270 ret = _regmap_write(map, reg, val);
271 map->cache_bypass = 0; 271 map->cache_bypass = 0;
272 if (ret) 272 if (ret) {
273 dev_err(map->dev, "Unable to sync register %#x. %d\n",
274 reg, ret);
273 return ret; 275 return ret;
276 }
274 dev_dbg(map->dev, "Synced register %#x, value %#x\n", reg, val); 277 dev_dbg(map->dev, "Synced register %#x, value %#x\n", reg, val);
275 } 278 }
276 279
@@ -615,8 +618,11 @@ static int regcache_sync_block_single(struct regmap *map, void *block,
615 ret = _regmap_write(map, regtmp, val); 618 ret = _regmap_write(map, regtmp, val);
616 619
617 map->cache_bypass = 0; 620 map->cache_bypass = 0;
618 if (ret != 0) 621 if (ret != 0) {
622 dev_err(map->dev, "Unable to sync register %#x. %d\n",
623 regtmp, ret);
619 return ret; 624 return ret;
625 }
620 dev_dbg(map->dev, "Synced register %#x, value %#x\n", 626 dev_dbg(map->dev, "Synced register %#x, value %#x\n",
621 regtmp, val); 627 regtmp, val);
622 } 628 }
@@ -641,6 +647,9 @@ static int regcache_sync_block_raw_flush(struct regmap *map, const void **data,
641 map->cache_bypass = 1; 647 map->cache_bypass = 1;
642 648
643 ret = _regmap_raw_write(map, base, *data, count * val_bytes); 649 ret = _regmap_raw_write(map, base, *data, count * val_bytes);
650 if (ret)
651 dev_err(map->dev, "Unable to sync registers %#x-%#x. %d\n",
652 base, cur - map->reg_stride, ret);
644 653
645 map->cache_bypass = 0; 654 map->cache_bypass = 0;
646 655
diff --git a/drivers/base/regmap/regmap-debugfs.c b/drivers/base/regmap/regmap-debugfs.c
index 0c94b661c16f..5799a0b9e6cc 100644
--- a/drivers/base/regmap/regmap-debugfs.c
+++ b/drivers/base/regmap/regmap-debugfs.c
@@ -473,6 +473,7 @@ void regmap_debugfs_init(struct regmap *map, const char *name)
473{ 473{
474 struct rb_node *next; 474 struct rb_node *next;
475 struct regmap_range_node *range_node; 475 struct regmap_range_node *range_node;
476 const char *devname = "dummy";
476 477
477 /* If we don't have the debugfs root yet, postpone init */ 478 /* If we don't have the debugfs root yet, postpone init */
478 if (!regmap_debugfs_root) { 479 if (!regmap_debugfs_root) {
@@ -491,12 +492,15 @@ void regmap_debugfs_init(struct regmap *map, const char *name)
491 INIT_LIST_HEAD(&map->debugfs_off_cache); 492 INIT_LIST_HEAD(&map->debugfs_off_cache);
492 mutex_init(&map->cache_lock); 493 mutex_init(&map->cache_lock);
493 494
495 if (map->dev)
496 devname = dev_name(map->dev);
497
494 if (name) { 498 if (name) {
495 map->debugfs_name = kasprintf(GFP_KERNEL, "%s-%s", 499 map->debugfs_name = kasprintf(GFP_KERNEL, "%s-%s",
496 dev_name(map->dev), name); 500 devname, name);
497 name = map->debugfs_name; 501 name = map->debugfs_name;
498 } else { 502 } else {
499 name = dev_name(map->dev); 503 name = devname;
500 } 504 }
501 505
502 map->debugfs = debugfs_create_dir(name, regmap_debugfs_root); 506 map->debugfs = debugfs_create_dir(name, regmap_debugfs_root);
diff --git a/drivers/base/regmap/regmap-i2c.c b/drivers/base/regmap/regmap-i2c.c
index ca193d1ef47c..053150a7f9f2 100644
--- a/drivers/base/regmap/regmap-i2c.c
+++ b/drivers/base/regmap/regmap-i2c.c
@@ -168,6 +168,8 @@ static struct regmap_bus regmap_i2c = {
168 .write = regmap_i2c_write, 168 .write = regmap_i2c_write,
169 .gather_write = regmap_i2c_gather_write, 169 .gather_write = regmap_i2c_gather_write,
170 .read = regmap_i2c_read, 170 .read = regmap_i2c_read,
171 .reg_format_endian_default = REGMAP_ENDIAN_BIG,
172 .val_format_endian_default = REGMAP_ENDIAN_BIG,
171}; 173};
172 174
173static const struct regmap_bus *regmap_get_i2c_bus(struct i2c_client *i2c, 175static const struct regmap_bus *regmap_get_i2c_bus(struct i2c_client *i2c,
diff --git a/drivers/base/regmap/regmap-spi.c b/drivers/base/regmap/regmap-spi.c
index 0eb3097c0d76..53d1148e80a0 100644
--- a/drivers/base/regmap/regmap-spi.c
+++ b/drivers/base/regmap/regmap-spi.c
@@ -109,6 +109,8 @@ static struct regmap_bus regmap_spi = {
109 .async_alloc = regmap_spi_async_alloc, 109 .async_alloc = regmap_spi_async_alloc,
110 .read = regmap_spi_read, 110 .read = regmap_spi_read,
111 .read_flag_mask = 0x80, 111 .read_flag_mask = 0x80,
112 .reg_format_endian_default = REGMAP_ENDIAN_BIG,
113 .val_format_endian_default = REGMAP_ENDIAN_BIG,
112}; 114};
113 115
114/** 116/**
diff --git a/drivers/base/regmap/regmap.c b/drivers/base/regmap/regmap.c
index 1cf427bc0d4a..d2f8a818d200 100644
--- a/drivers/base/regmap/regmap.c
+++ b/drivers/base/regmap/regmap.c
@@ -15,6 +15,7 @@
15#include <linux/export.h> 15#include <linux/export.h>
16#include <linux/mutex.h> 16#include <linux/mutex.h>
17#include <linux/err.h> 17#include <linux/err.h>
18#include <linux/of.h>
18#include <linux/rbtree.h> 19#include <linux/rbtree.h>
19#include <linux/sched.h> 20#include <linux/sched.h>
20 21
@@ -448,6 +449,71 @@ int regmap_attach_dev(struct device *dev, struct regmap *map,
448} 449}
449EXPORT_SYMBOL_GPL(regmap_attach_dev); 450EXPORT_SYMBOL_GPL(regmap_attach_dev);
450 451
452static enum regmap_endian regmap_get_reg_endian(const struct regmap_bus *bus,
453 const struct regmap_config *config)
454{
455 enum regmap_endian endian;
456
457 /* Retrieve the endianness specification from the regmap config */
458 endian = config->reg_format_endian;
459
460 /* If the regmap config specified a non-default value, use that */
461 if (endian != REGMAP_ENDIAN_DEFAULT)
462 return endian;
463
464 /* Retrieve the endianness specification from the bus config */
465 if (bus && bus->reg_format_endian_default)
466 endian = bus->reg_format_endian_default;
467
468 /* If the bus specified a non-default value, use that */
469 if (endian != REGMAP_ENDIAN_DEFAULT)
470 return endian;
471
472 /* Use this if no other value was found */
473 return REGMAP_ENDIAN_BIG;
474}
475
476static enum regmap_endian regmap_get_val_endian(struct device *dev,
477 const struct regmap_bus *bus,
478 const struct regmap_config *config)
479{
480 struct device_node *np;
481 enum regmap_endian endian;
482
483 /* Retrieve the endianness specification from the regmap config */
484 endian = config->val_format_endian;
485
486 /* If the regmap config specified a non-default value, use that */
487 if (endian != REGMAP_ENDIAN_DEFAULT)
488 return endian;
489
490 /* If the dev and dev->of_node exist try to get endianness from DT */
491 if (dev && dev->of_node) {
492 np = dev->of_node;
493
494 /* Parse the device's DT node for an endianness specification */
495 if (of_property_read_bool(np, "big-endian"))
496 endian = REGMAP_ENDIAN_BIG;
497 else if (of_property_read_bool(np, "little-endian"))
498 endian = REGMAP_ENDIAN_LITTLE;
499
500 /* If the endianness was specified in DT, use that */
501 if (endian != REGMAP_ENDIAN_DEFAULT)
502 return endian;
503 }
504
505 /* Retrieve the endianness specification from the bus config */
506 if (bus && bus->val_format_endian_default)
507 endian = bus->val_format_endian_default;
508
509 /* If the bus specified a non-default value, use that */
510 if (endian != REGMAP_ENDIAN_DEFAULT)
511 return endian;
512
513 /* Use this if no other value was found */
514 return REGMAP_ENDIAN_BIG;
515}
516
451/** 517/**
452 * regmap_init(): Initialise register map 518 * regmap_init(): Initialise register map
453 * 519 *
@@ -551,17 +617,8 @@ struct regmap *regmap_init(struct device *dev,
551 map->reg_read = _regmap_bus_read; 617 map->reg_read = _regmap_bus_read;
552 } 618 }
553 619
554 reg_endian = config->reg_format_endian; 620 reg_endian = regmap_get_reg_endian(bus, config);
555 if (reg_endian == REGMAP_ENDIAN_DEFAULT) 621 val_endian = regmap_get_val_endian(dev, bus, config);
556 reg_endian = bus->reg_format_endian_default;
557 if (reg_endian == REGMAP_ENDIAN_DEFAULT)
558 reg_endian = REGMAP_ENDIAN_BIG;
559
560 val_endian = config->val_format_endian;
561 if (val_endian == REGMAP_ENDIAN_DEFAULT)
562 val_endian = bus->val_format_endian_default;
563 if (val_endian == REGMAP_ENDIAN_DEFAULT)
564 val_endian = REGMAP_ENDIAN_BIG;
565 622
566 switch (config->reg_bits + map->reg_shift) { 623 switch (config->reg_bits + map->reg_shift) {
567 case 2: 624 case 2:
@@ -1408,7 +1465,7 @@ int _regmap_write(struct regmap *map, unsigned int reg,
1408 } 1465 }
1409 1466
1410#ifdef LOG_DEVICE 1467#ifdef LOG_DEVICE
1411 if (strcmp(dev_name(map->dev), LOG_DEVICE) == 0) 1468 if (map->dev && strcmp(dev_name(map->dev), LOG_DEVICE) == 0)
1412 dev_info(map->dev, "%x <= %x\n", reg, val); 1469 dev_info(map->dev, "%x <= %x\n", reg, val);
1413#endif 1470#endif
1414 1471
@@ -1659,6 +1716,9 @@ out:
1659 } else { 1716 } else {
1660 void *wval; 1717 void *wval;
1661 1718
1719 if (!val_count)
1720 return -EINVAL;
1721
1662 wval = kmemdup(val, val_count * val_bytes, GFP_KERNEL); 1722 wval = kmemdup(val, val_count * val_bytes, GFP_KERNEL);
1663 if (!wval) { 1723 if (!wval) {
1664 dev_err(map->dev, "Error in memory allocation\n"); 1724 dev_err(map->dev, "Error in memory allocation\n");
@@ -2058,7 +2118,7 @@ static int _regmap_read(struct regmap *map, unsigned int reg,
2058 ret = map->reg_read(context, reg, val); 2118 ret = map->reg_read(context, reg, val);
2059 if (ret == 0) { 2119 if (ret == 0) {
2060#ifdef LOG_DEVICE 2120#ifdef LOG_DEVICE
2061 if (strcmp(dev_name(map->dev), LOG_DEVICE) == 0) 2121 if (map->dev && strcmp(dev_name(map->dev), LOG_DEVICE) == 0)
2062 dev_info(map->dev, "%x => %x\n", reg, *val); 2122 dev_info(map->dev, "%x => %x\n", reg, *val);
2063#endif 2123#endif
2064 2124