Commit d3c242e1f22f5dfed009296ee45ce896153f0b53

Authored by Stephen Warren
Committed by Mark Brown
1 parent dd775ae254

regmap: allow regmap instances to be named

Some devices have multiple separate register regions. Logically, one
regmap would be created per region. One issue that prevents this is that
each instance will attempt to create the same debugfs files. Avoid this
by allowing regmaps to be named, and use the name to construct the
debugfs directory name.

Signed-off-by: Stephen Warren <swarren@nvidia.com>
Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com>

Showing 4 changed files with 20 additions and 6 deletions Side-by-side Diff

drivers/base/regmap/internal.h
... ... @@ -41,6 +41,7 @@
41 41  
42 42 #ifdef CONFIG_DEBUG_FS
43 43 struct dentry *debugfs;
  44 + const char *debugfs_name;
44 45 #endif
45 46  
46 47 unsigned int max_register;
... ... @@ -101,7 +102,7 @@
101 102  
102 103 #ifdef CONFIG_DEBUG_FS
103 104 extern void regmap_debugfs_initcall(void);
104   -extern void regmap_debugfs_init(struct regmap *map);
  105 +extern void regmap_debugfs_init(struct regmap *map, const char *name);
105 106 extern void regmap_debugfs_exit(struct regmap *map);
106 107 #else
107 108 static inline void regmap_debugfs_initcall(void) { }
drivers/base/regmap/regmap-debugfs.c
... ... @@ -248,10 +248,17 @@
248 248 .llseek = default_llseek,
249 249 };
250 250  
251   -void regmap_debugfs_init(struct regmap *map)
  251 +void regmap_debugfs_init(struct regmap *map, const char *name)
252 252 {
253   - map->debugfs = debugfs_create_dir(dev_name(map->dev),
254   - regmap_debugfs_root);
  253 + if (name) {
  254 + map->debugfs_name = kasprintf(GFP_KERNEL, "%s-%s",
  255 + dev_name(map->dev), name);
  256 + name = map->debugfs_name;
  257 + } else {
  258 + name = dev_name(map->dev);
  259 + }
  260 +
  261 + map->debugfs = debugfs_create_dir(name, regmap_debugfs_root);
255 262 if (!map->debugfs) {
256 263 dev_warn(map->dev, "Failed to create debugfs directory\n");
257 264 return;
... ... @@ -280,6 +287,7 @@
280 287 void regmap_debugfs_exit(struct regmap *map)
281 288 {
282 289 debugfs_remove_recursive(map->debugfs);
  290 + kfree(map->debugfs_name);
283 291 }
284 292  
285 293 void regmap_debugfs_initcall(void)
drivers/base/regmap/regmap.c
... ... @@ -289,7 +289,7 @@
289 289 goto err_map;
290 290 }
291 291  
292   - regmap_debugfs_init(map);
  292 + regmap_debugfs_init(map, config->name);
293 293  
294 294 ret = regcache_init(map, config);
295 295 if (ret < 0)
... ... @@ -372,7 +372,7 @@
372 372 map->precious_reg = config->precious_reg;
373 373 map->cache_type = config->cache_type;
374 374  
375   - regmap_debugfs_init(map);
  375 + regmap_debugfs_init(map, config->name);
376 376  
377 377 map->cache_bypass = false;
378 378 map->cache_only = false;
include/linux/regmap.h
... ... @@ -46,6 +46,9 @@
46 46 /**
47 47 * Configuration for the register map of a device.
48 48 *
  49 + * @name: Optional name of the regmap. Useful when a device has multiple
  50 + * register regions.
  51 + *
49 52 * @reg_bits: Number of bits in a register address, mandatory.
50 53 * @pad_bits: Number of bits of padding between register and value.
51 54 * @val_bits: Number of bits in a register value, mandatory.
... ... @@ -77,6 +80,8 @@
77 80 * @num_reg_defaults_raw: Number of elements in reg_defaults_raw.
78 81 */
79 82 struct regmap_config {
  83 + const char *name;
  84 +
80 85 int reg_bits;
81 86 int pad_bits;
82 87 int val_bits;