diff options
author | Mark Brown <broonie@kernel.org> | 2017-12-13 11:46:37 -0500 |
---|---|---|
committer | Mark Brown <broonie@kernel.org> | 2017-12-13 11:46:37 -0500 |
commit | 4045559c099998642e35d1444251c3bf042c7a4f (patch) | |
tree | 6a5cf332ae8f37382c8f31acf9a66a8a6fa78114 | |
parent | a1a68fcaf165a6ed202d8e29a692c559e10106c4 (diff) | |
parent | 72465736adf2aade263a9475a1d42007fd49e703 (diff) |
Merge branches 'topic/hwspinlock' and 'topic/nolock' of https://git.kernel.org/pub/scm/linux/kernel/git/broonie/regmap into regmap-const
-rw-r--r-- | drivers/base/regmap/internal.h | 8 | ||||
-rw-r--r-- | drivers/base/regmap/regmap-debugfs.c | 3 | ||||
-rw-r--r-- | drivers/base/regmap/regmap.c | 10 | ||||
-rw-r--r-- | include/linux/regmap.h | 5 |
4 files changed, 25 insertions, 1 deletions
diff --git a/drivers/base/regmap/internal.h b/drivers/base/regmap/internal.h index 8641183cac2f..53785e0e297a 100644 --- a/drivers/base/regmap/internal.h +++ b/drivers/base/regmap/internal.h | |||
@@ -77,6 +77,7 @@ struct regmap { | |||
77 | int async_ret; | 77 | int async_ret; |
78 | 78 | ||
79 | #ifdef CONFIG_DEBUG_FS | 79 | #ifdef CONFIG_DEBUG_FS |
80 | bool debugfs_disable; | ||
80 | struct dentry *debugfs; | 81 | struct dentry *debugfs; |
81 | const char *debugfs_name; | 82 | const char *debugfs_name; |
82 | 83 | ||
@@ -215,10 +216,17 @@ struct regmap_field { | |||
215 | extern void regmap_debugfs_initcall(void); | 216 | extern void regmap_debugfs_initcall(void); |
216 | extern void regmap_debugfs_init(struct regmap *map, const char *name); | 217 | extern void regmap_debugfs_init(struct regmap *map, const char *name); |
217 | extern void regmap_debugfs_exit(struct regmap *map); | 218 | extern void regmap_debugfs_exit(struct regmap *map); |
219 | |||
220 | static inline void regmap_debugfs_disable(struct regmap *map) | ||
221 | { | ||
222 | map->debugfs_disable = true; | ||
223 | } | ||
224 | |||
218 | #else | 225 | #else |
219 | static inline void regmap_debugfs_initcall(void) { } | 226 | static inline void regmap_debugfs_initcall(void) { } |
220 | static inline void regmap_debugfs_init(struct regmap *map, const char *name) { } | 227 | static inline void regmap_debugfs_init(struct regmap *map, const char *name) { } |
221 | static inline void regmap_debugfs_exit(struct regmap *map) { } | 228 | static inline void regmap_debugfs_exit(struct regmap *map) { } |
229 | static inline void regmap_debugfs_disable(struct regmap *map) { } | ||
222 | #endif | 230 | #endif |
223 | 231 | ||
224 | /* regcache core declarations */ | 232 | /* regcache core declarations */ |
diff --git a/drivers/base/regmap/regmap-debugfs.c b/drivers/base/regmap/regmap-debugfs.c index 36ce3511c733..c8ecefd75d6f 100644 --- a/drivers/base/regmap/regmap-debugfs.c +++ b/drivers/base/regmap/regmap-debugfs.c | |||
@@ -529,6 +529,9 @@ void regmap_debugfs_init(struct regmap *map, const char *name) | |||
529 | struct regmap_range_node *range_node; | 529 | struct regmap_range_node *range_node; |
530 | const char *devname = "dummy"; | 530 | const char *devname = "dummy"; |
531 | 531 | ||
532 | if (map->debugfs_disable) | ||
533 | return; | ||
534 | |||
532 | /* If we don't have the debugfs root yet, postpone init */ | 535 | /* If we don't have the debugfs root yet, postpone init */ |
533 | if (!regmap_debugfs_root) { | 536 | if (!regmap_debugfs_root) { |
534 | struct regmap_debugfs_node *node; | 537 | struct regmap_debugfs_node *node; |
diff --git a/drivers/base/regmap/regmap.c b/drivers/base/regmap/regmap.c index f25ab18ca057..496da7bc5e77 100644 --- a/drivers/base/regmap/regmap.c +++ b/drivers/base/regmap/regmap.c | |||
@@ -457,6 +457,11 @@ static void regmap_unlock_hwlock_irqrestore(void *__map) | |||
457 | hwspin_unlock_irqrestore(map->hwlock, &map->spinlock_flags); | 457 | hwspin_unlock_irqrestore(map->hwlock, &map->spinlock_flags); |
458 | } | 458 | } |
459 | 459 | ||
460 | static void regmap_lock_unlock_none(void *__map) | ||
461 | { | ||
462 | |||
463 | } | ||
464 | |||
460 | static void regmap_lock_mutex(void *__map) | 465 | static void regmap_lock_mutex(void *__map) |
461 | { | 466 | { |
462 | struct regmap *map = __map; | 467 | struct regmap *map = __map; |
@@ -667,7 +672,10 @@ struct regmap *__regmap_init(struct device *dev, | |||
667 | goto err; | 672 | goto err; |
668 | } | 673 | } |
669 | 674 | ||
670 | if (config->lock && config->unlock) { | 675 | if (config->disable_locking) { |
676 | map->lock = map->unlock = regmap_lock_unlock_none; | ||
677 | regmap_debugfs_disable(map); | ||
678 | } else if (config->lock && config->unlock) { | ||
671 | map->lock = config->lock; | 679 | map->lock = config->lock; |
672 | map->unlock = config->unlock; | 680 | map->unlock = config->unlock; |
673 | map->lock_arg = config->lock_arg; | 681 | map->lock_arg = config->lock_arg; |
diff --git a/include/linux/regmap.h b/include/linux/regmap.h index 15eddc1353ba..072a90229e34 100644 --- a/include/linux/regmap.h +++ b/include/linux/regmap.h | |||
@@ -264,6 +264,9 @@ typedef void (*regmap_unlock)(void *); | |||
264 | * field is NULL but precious_table (see below) is not, the | 264 | * field is NULL but precious_table (see below) is not, the |
265 | * check is performed on such table (a register is precious if | 265 | * check is performed on such table (a register is precious if |
266 | * it belongs to one of the ranges specified by precious_table). | 266 | * it belongs to one of the ranges specified by precious_table). |
267 | * @disable_locking: This regmap is either protected by external means or | ||
268 | * is guaranteed not be be accessed from multiple threads. | ||
269 | * Don't use any locking mechanisms. | ||
267 | * @lock: Optional lock callback (overrides regmap's default lock | 270 | * @lock: Optional lock callback (overrides regmap's default lock |
268 | * function, based on spinlock or mutex). | 271 | * function, based on spinlock or mutex). |
269 | * @unlock: As above for unlocking. | 272 | * @unlock: As above for unlocking. |
@@ -333,6 +336,8 @@ struct regmap_config { | |||
333 | bool (*readable_reg)(struct device *dev, unsigned int reg); | 336 | bool (*readable_reg)(struct device *dev, unsigned int reg); |
334 | bool (*volatile_reg)(struct device *dev, unsigned int reg); | 337 | bool (*volatile_reg)(struct device *dev, unsigned int reg); |
335 | bool (*precious_reg)(struct device *dev, unsigned int reg); | 338 | bool (*precious_reg)(struct device *dev, unsigned int reg); |
339 | |||
340 | bool disable_locking; | ||
336 | regmap_lock lock; | 341 | regmap_lock lock; |
337 | regmap_unlock unlock; | 342 | regmap_unlock unlock; |
338 | void *lock_arg; | 343 | void *lock_arg; |