diff options
author | Mark Brown <broonie@opensource.wolfsonmicro.com> | 2012-12-09 09:20:10 +0100 |
---|---|---|
committer | Mark Brown <broonie@opensource.wolfsonmicro.com> | 2012-12-10 17:29:47 +0100 |
commit | afab2f7b21b042bcbffb1e82f78243382a122d70 (patch) | |
tree | 9e068db9a9be5a3d99b1bb03202537397c2af2a1 /drivers/base | |
parent | regmap: debugfs: Avoid overflows for very small reads (diff) | |
download | linux-afab2f7b21b042bcbffb1e82f78243382a122d70.tar.xz linux-afab2f7b21b042bcbffb1e82f78243382a122d70.zip |
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 <broonie@opensource.wolfsonmicro.com>
Diffstat (limited to 'drivers/base')
-rw-r--r-- | drivers/base/regmap/regmap-debugfs.c | 39 |
1 files changed, 36 insertions, 3 deletions
diff --git a/drivers/base/regmap/regmap-debugfs.c b/drivers/base/regmap/regmap-debugfs.c index 3df274e06062..749a1dc5bbfb 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; |