regmap: regcache: Fixup locking for custom lock callbacks

The parameter passed to the regmap lock/unlock callbacks needs to be
map->lock_arg, regcache passes just map. This works fine in the case that no
custom locking callbacks are used since in this case map->lock_arg equals map,
but will break when custom locking callbacks are used. The issue was introduced
in commit 0d4529c5("regmap: make lock/unlock functions customizable") and is
fixed by this patch.

Signed-off-by: Lars-Peter Clausen <lars@metafoo.de>
Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
This commit is contained in:
Lars-Peter Clausen 2013-05-23 17:23:49 +02:00 committed by Mark Brown
parent c7788792a5
commit f20c783c3a
2 changed files with 12 additions and 12 deletions

View File

@ -143,7 +143,7 @@ static int rbtree_show(struct seq_file *s, void *ignored)
int registers = 0; int registers = 0;
int this_registers, average; int this_registers, average;
map->lock(map); map->lock(map->lock_arg);
mem_size = sizeof(*rbtree_ctx); mem_size = sizeof(*rbtree_ctx);
mem_size += BITS_TO_LONGS(map->cache_present_nbits) * sizeof(long); mem_size += BITS_TO_LONGS(map->cache_present_nbits) * sizeof(long);
@ -170,7 +170,7 @@ static int rbtree_show(struct seq_file *s, void *ignored)
seq_printf(s, "%d nodes, %d registers, average %d registers, used %zu bytes\n", seq_printf(s, "%d nodes, %d registers, average %d registers, used %zu bytes\n",
nodes, registers, average, mem_size); nodes, registers, average, mem_size);
map->unlock(map); map->unlock(map->lock_arg);
return 0; return 0;
} }

View File

@ -270,7 +270,7 @@ int regcache_sync(struct regmap *map)
BUG_ON(!map->cache_ops || !map->cache_ops->sync); BUG_ON(!map->cache_ops || !map->cache_ops->sync);
map->lock(map); map->lock(map->lock_arg);
/* Remember the initial bypass state */ /* Remember the initial bypass state */
bypass = map->cache_bypass; bypass = map->cache_bypass;
dev_dbg(map->dev, "Syncing %s cache\n", dev_dbg(map->dev, "Syncing %s cache\n",
@ -306,7 +306,7 @@ out:
trace_regcache_sync(map->dev, name, "stop"); trace_regcache_sync(map->dev, name, "stop");
/* Restore the bypass state */ /* Restore the bypass state */
map->cache_bypass = bypass; map->cache_bypass = bypass;
map->unlock(map); map->unlock(map->lock_arg);
return ret; return ret;
} }
@ -333,7 +333,7 @@ int regcache_sync_region(struct regmap *map, unsigned int min,
BUG_ON(!map->cache_ops || !map->cache_ops->sync); BUG_ON(!map->cache_ops || !map->cache_ops->sync);
map->lock(map); map->lock(map->lock_arg);
/* Remember the initial bypass state */ /* Remember the initial bypass state */
bypass = map->cache_bypass; bypass = map->cache_bypass;
@ -352,7 +352,7 @@ out:
trace_regcache_sync(map->dev, name, "stop region"); trace_regcache_sync(map->dev, name, "stop region");
/* Restore the bypass state */ /* Restore the bypass state */
map->cache_bypass = bypass; map->cache_bypass = bypass;
map->unlock(map); map->unlock(map->lock_arg);
return ret; return ret;
} }
@ -372,11 +372,11 @@ EXPORT_SYMBOL_GPL(regcache_sync_region);
*/ */
void regcache_cache_only(struct regmap *map, bool enable) void regcache_cache_only(struct regmap *map, bool enable)
{ {
map->lock(map); map->lock(map->lock_arg);
WARN_ON(map->cache_bypass && enable); WARN_ON(map->cache_bypass && enable);
map->cache_only = enable; map->cache_only = enable;
trace_regmap_cache_only(map->dev, enable); trace_regmap_cache_only(map->dev, enable);
map->unlock(map); map->unlock(map->lock_arg);
} }
EXPORT_SYMBOL_GPL(regcache_cache_only); EXPORT_SYMBOL_GPL(regcache_cache_only);
@ -391,9 +391,9 @@ EXPORT_SYMBOL_GPL(regcache_cache_only);
*/ */
void regcache_mark_dirty(struct regmap *map) void regcache_mark_dirty(struct regmap *map)
{ {
map->lock(map); map->lock(map->lock_arg);
map->cache_dirty = true; map->cache_dirty = true;
map->unlock(map); map->unlock(map->lock_arg);
} }
EXPORT_SYMBOL_GPL(regcache_mark_dirty); EXPORT_SYMBOL_GPL(regcache_mark_dirty);
@ -410,11 +410,11 @@ EXPORT_SYMBOL_GPL(regcache_mark_dirty);
*/ */
void regcache_cache_bypass(struct regmap *map, bool enable) void regcache_cache_bypass(struct regmap *map, bool enable)
{ {
map->lock(map); map->lock(map->lock_arg);
WARN_ON(map->cache_only && enable); WARN_ON(map->cache_only && enable);
map->cache_bypass = enable; map->cache_bypass = enable;
trace_regmap_cache_bypass(map->dev, enable); trace_regmap_cache_bypass(map->dev, enable);
map->unlock(map); map->unlock(map->lock_arg);
} }
EXPORT_SYMBOL_GPL(regcache_cache_bypass); EXPORT_SYMBOL_GPL(regcache_cache_bypass);