diff options
| -rw-r--r-- | drivers/base/regmap/regcache-rbtree.c | 49 |
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 | ||
| 131 | static 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 | |||
| 162 | static int rbtree_open(struct inode *inode, struct file *file) | ||
| 163 | { | ||
| 164 | return single_open(file, rbtree_show, inode->i_private); | ||
| 165 | } | ||
| 166 | |||
| 167 | static 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 | |||
| 128 | static int regcache_rbtree_init(struct regmap *map) | 175 | static 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 | ||
| 152 | err: | 201 | err: |
