Commit ee436955 authored by Linus Torvalds's avatar Linus Torvalds

Merge tag 'regmap-fix-v5.8-rc5' of...

Merge tag 'regmap-fix-v5.8-rc5' of git://git.kernel.org/pub/scm/linux/kernel/git/broonie/regmap into master

Pull regmap fixes from Mark Brown:
 "A couple of substantial fixes here, one from Doug which fixes the
  debugfs code for MMIO regmaps (fortunately not the common case) and
  one from Marc fixing lookups of multiple regmaps for the same device
  (a very unusual case).

  There's also a fix for Kconfig to ensure we enable SoundWire properly"

* tag 'regmap-fix-v5.8-rc5' of git://git.kernel.org/pub/scm/linux/kernel/git/broonie/regmap:
  regmap: debugfs: Don't sleep while atomic for fast_io regmaps
  regmap: add missing dependency on SoundWire
  regmap: dev_get_regmap_match(): fix string comparison
parents 60541fb6 299632e5
...@@ -4,7 +4,7 @@ ...@@ -4,7 +4,7 @@
# subsystems should select the appropriate symbols. # subsystems should select the appropriate symbols.
config REGMAP config REGMAP
default y if (REGMAP_I2C || REGMAP_SPI || REGMAP_SPMI || REGMAP_W1 || REGMAP_AC97 || REGMAP_MMIO || REGMAP_IRQ || REGMAP_SCCB || REGMAP_I3C) default y if (REGMAP_I2C || REGMAP_SPI || REGMAP_SPMI || REGMAP_W1 || REGMAP_AC97 || REGMAP_MMIO || REGMAP_IRQ || REGMAP_SOUNDWIRE || REGMAP_SCCB || REGMAP_I3C)
select IRQ_DOMAIN if REGMAP_IRQ select IRQ_DOMAIN if REGMAP_IRQ
bool bool
......
...@@ -463,29 +463,31 @@ static ssize_t regmap_cache_only_write_file(struct file *file, ...@@ -463,29 +463,31 @@ static ssize_t regmap_cache_only_write_file(struct file *file,
{ {
struct regmap *map = container_of(file->private_data, struct regmap *map = container_of(file->private_data,
struct regmap, cache_only); struct regmap, cache_only);
ssize_t result; bool new_val, require_sync = false;
bool was_enabled, require_sync = false;
int err; int err;
map->lock(map->lock_arg); err = kstrtobool_from_user(user_buf, count, &new_val);
/* Ignore malforned data like debugfs_write_file_bool() */
if (err)
return count;
was_enabled = map->cache_only; err = debugfs_file_get(file->f_path.dentry);
if (err)
return err;
result = debugfs_write_file_bool(file, user_buf, count, ppos); map->lock(map->lock_arg);
if (result < 0) {
map->unlock(map->lock_arg);
return result;
}
if (map->cache_only && !was_enabled) { if (new_val && !map->cache_only) {
dev_warn(map->dev, "debugfs cache_only=Y forced\n"); dev_warn(map->dev, "debugfs cache_only=Y forced\n");
add_taint(TAINT_USER, LOCKDEP_STILL_OK); add_taint(TAINT_USER, LOCKDEP_STILL_OK);
} else if (!map->cache_only && was_enabled) { } else if (!new_val && map->cache_only) {
dev_warn(map->dev, "debugfs cache_only=N forced: syncing cache\n"); dev_warn(map->dev, "debugfs cache_only=N forced: syncing cache\n");
require_sync = true; require_sync = true;
} }
map->cache_only = new_val;
map->unlock(map->lock_arg); map->unlock(map->lock_arg);
debugfs_file_put(file->f_path.dentry);
if (require_sync) { if (require_sync) {
err = regcache_sync(map); err = regcache_sync(map);
...@@ -493,7 +495,7 @@ static ssize_t regmap_cache_only_write_file(struct file *file, ...@@ -493,7 +495,7 @@ static ssize_t regmap_cache_only_write_file(struct file *file,
dev_err(map->dev, "Failed to sync cache %d\n", err); dev_err(map->dev, "Failed to sync cache %d\n", err);
} }
return result; return count;
} }
static const struct file_operations regmap_cache_only_fops = { static const struct file_operations regmap_cache_only_fops = {
...@@ -508,28 +510,32 @@ static ssize_t regmap_cache_bypass_write_file(struct file *file, ...@@ -508,28 +510,32 @@ static ssize_t regmap_cache_bypass_write_file(struct file *file,
{ {
struct regmap *map = container_of(file->private_data, struct regmap *map = container_of(file->private_data,
struct regmap, cache_bypass); struct regmap, cache_bypass);
ssize_t result; bool new_val;
bool was_enabled; int err;
map->lock(map->lock_arg); err = kstrtobool_from_user(user_buf, count, &new_val);
/* Ignore malforned data like debugfs_write_file_bool() */
if (err)
return count;
was_enabled = map->cache_bypass; err = debugfs_file_get(file->f_path.dentry);
if (err)
return err;
result = debugfs_write_file_bool(file, user_buf, count, ppos); map->lock(map->lock_arg);
if (result < 0)
goto out;
if (map->cache_bypass && !was_enabled) { if (new_val && !map->cache_bypass) {
dev_warn(map->dev, "debugfs cache_bypass=Y forced\n"); dev_warn(map->dev, "debugfs cache_bypass=Y forced\n");
add_taint(TAINT_USER, LOCKDEP_STILL_OK); add_taint(TAINT_USER, LOCKDEP_STILL_OK);
} else if (!map->cache_bypass && was_enabled) { } else if (!new_val && map->cache_bypass) {
dev_warn(map->dev, "debugfs cache_bypass=N forced\n"); dev_warn(map->dev, "debugfs cache_bypass=N forced\n");
} }
map->cache_bypass = new_val;
out:
map->unlock(map->lock_arg); map->unlock(map->lock_arg);
debugfs_file_put(file->f_path.dentry);
return result; return count;
} }
static const struct file_operations regmap_cache_bypass_fops = { static const struct file_operations regmap_cache_bypass_fops = {
......
...@@ -1364,7 +1364,7 @@ static int dev_get_regmap_match(struct device *dev, void *res, void *data) ...@@ -1364,7 +1364,7 @@ static int dev_get_regmap_match(struct device *dev, void *res, void *data)
/* If the user didn't specify a name match any */ /* If the user didn't specify a name match any */
if (data) if (data)
return (*r)->name == data; return !strcmp((*r)->name, data);
else else
return 1; return 1;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment