aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/base
diff options
context:
space:
mode:
authorMark Brown <broonie@opensource.wolfsonmicro.com>2011-11-21 14:44:44 -0500
committerMark Brown <broonie@opensource.wolfsonmicro.com>2011-11-21 14:50:10 -0500
commitbad2ab4b6d938482c2b0bdcf80a8d14dbef4e8f5 (patch)
treed62234f38e52aa3a76bea4d5dc44cc01f6632c28 /drivers/base
parent052d2cd123e7e36ce54558ac5af0360de2343b2b (diff)
regmap: Provide debugfs dump of the rbtree cache data
Show the register ranges we have in each rbtree node in debugfs, plus some statistics on how big each node is and the total number of nodes. It may also be worth collecting data on the ranges of dirty registers to see if there's much mileage in trying to coalesce writes on sync. Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
Diffstat (limited to 'drivers/base')
-rw-r--r--drivers/base/regmap/regcache-rbtree.c49
1 files changed, 49 insertions, 0 deletions
diff --git a/drivers/base/regmap/regcache-rbtree.c b/drivers/base/regmap/regcache-rbtree.c
index e71320f61d18..7767cbb8d15a 100644
--- a/drivers/base/regmap/regcache-rbtree.c
+++ b/drivers/base/regmap/regcache-rbtree.c
@@ -11,7 +11,9 @@
11 */ 11 */
12 12
13#include <linux/slab.h> 13#include <linux/slab.h>
14#include <linux/debugfs.h>
14#include <linux/rbtree.h> 15#include <linux/rbtree.h>
16#include <linux/seq_file.h>
15 17
16#include "internal.h" 18#include "internal.h"
17 19
@@ -125,6 +127,51 @@ static int regcache_rbtree_insert(struct rb_root *root,
125 return 1; 127 return 1;
126} 128}
127 129
130#ifdef CONFIG_DEBUG_FS
131static int rbtree_show(struct seq_file *s, void *ignored)
132{
133 struct regmap *map = s->private;
134 struct regcache_rbtree_ctx *rbtree_ctx = map->cache;
135 struct regcache_rbtree_node *n;
136 struct rb_node *node;
137 unsigned int base, top;
138 int nodes = 0;
139 int registers = 0;
140
141 mutex_lock(&map->lock);
142
143 for (node = rb_first(&rbtree_ctx->root); node != NULL;
144 node = rb_next(node)) {
145 n = container_of(node, struct regcache_rbtree_node, node);
146
147 regcache_rbtree_get_base_top_reg(n, &base, &top);
148 seq_printf(s, "%x-%x (%d)\n", base, top, top - base + 1);
149
150 nodes++;
151 registers += top - base + 1;
152 }
153
154 seq_printf(s, "%d nodes, %d registers, average %d registers\n",
155 nodes, registers, registers / nodes);
156
157 mutex_unlock(&map->lock);
158
159 return 0;
160}
161
162static int rbtree_open(struct inode *inode, struct file *file)
163{
164 return single_open(file, rbtree_show, inode->i_private);
165}
166
167static const struct file_operations rbtree_fops = {
168 .open = rbtree_open,
169 .read = seq_read,
170 .llseek = seq_lseek,
171 .release = single_release,
172};
173#endif
174
128static int regcache_rbtree_init(struct regmap *map) 175static int regcache_rbtree_init(struct regmap *map)
129{ 176{
130 struct regcache_rbtree_ctx *rbtree_ctx; 177 struct regcache_rbtree_ctx *rbtree_ctx;
@@ -147,6 +194,8 @@ static int regcache_rbtree_init(struct regmap *map)
147 goto err; 194 goto err;
148 } 195 }
149 196
197 debugfs_create_file("rbtree", 0400, map->debugfs, map, &rbtree_fops);
198
150 return 0; 199 return 0;
151 200
152err: 201err: