From afab2f7b21b042bcbffb1e82f78243382a122d70 Mon Sep 17 00:00:00 2001 From: Mark Brown Date: Sun, 9 Dec 2012 17:20:10 +0900 Subject: regmap: debugfs: Factor out initial seek In preparation for doing things a bit more quickly than a linear scan factor out the initial seek from the debugfs register dump. Signed-off-by: Mark Brown --- drivers/base/regmap/regmap-debugfs.c | 39 +++++++++++++++++++++++++++++++++--- 1 file changed, 36 insertions(+), 3 deletions(-) (limited to 'drivers/base') diff --git a/drivers/base/regmap/regmap-debugfs.c b/drivers/base/regmap/regmap-debugfs.c index 3df274e0606..749a1dc5bbf 100644 --- a/drivers/base/regmap/regmap-debugfs.c +++ b/drivers/base/regmap/regmap-debugfs.c @@ -56,16 +56,46 @@ static const struct file_operations regmap_name_fops = { .llseek = default_llseek, }; +/* + * Work out where the start offset maps into register numbers, bearing + * in mind that we suppress hidden registers. + */ +static unsigned int regmap_debugfs_get_dump_start(struct regmap *map, + unsigned int base, + loff_t from, + loff_t *pos) +{ + loff_t p = *pos; + unsigned int i; + + for (i = base; i <= map->max_register; i += map->reg_stride) { + if (!regmap_readable(map, i)) + continue; + + if (regmap_precious(map, i)) + continue; + + if (i >= from) { + *pos = p; + return i; + } + + p += map->debugfs_tot_len; + } + + return base; +} + static ssize_t regmap_read_debugfs(struct regmap *map, unsigned int from, unsigned int to, char __user *user_buf, size_t count, loff_t *ppos) { size_t buf_pos = 0; - loff_t p = 0; + loff_t p = *ppos; ssize_t ret; int i; char *buf; - unsigned int val; + unsigned int val, start_reg; if (*ppos < 0 || !count) return -EINVAL; @@ -83,7 +113,10 @@ static ssize_t regmap_read_debugfs(struct regmap *map, unsigned int from, map->debugfs_val_len + 3; /* : \n */ } - for (i = from; i <= to; i += map->reg_stride) { + /* Work out which register we're starting at */ + start_reg = regmap_debugfs_get_dump_start(map, from, *ppos, &p); + + for (i = start_reg; i <= to; i += map->reg_stride) { if (!regmap_readable(map, i)) continue; -- cgit v1.2.3-70-g09d2