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>
This commit is contained in:
Mark Brown 2012-12-09 17:20:10 +09:00
parent db04328c16
commit afab2f7b21

View File

@ -56,16 +56,46 @@ static const struct file_operations regmap_name_fops = {
.llseek = default_llseek, .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, static ssize_t regmap_read_debugfs(struct regmap *map, unsigned int from,
unsigned int to, char __user *user_buf, unsigned int to, char __user *user_buf,
size_t count, loff_t *ppos) size_t count, loff_t *ppos)
{ {
size_t buf_pos = 0; size_t buf_pos = 0;
loff_t p = 0; loff_t p = *ppos;
ssize_t ret; ssize_t ret;
int i; int i;
char *buf; char *buf;
unsigned int val; unsigned int val, start_reg;
if (*ppos < 0 || !count) if (*ppos < 0 || !count)
return -EINVAL; return -EINVAL;
@ -83,7 +113,10 @@ static ssize_t regmap_read_debugfs(struct regmap *map, unsigned int from,
map->debugfs_val_len + 3; /* : \n */ 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)) if (!regmap_readable(map, i))
continue; continue;