forked from Minki/linux
regmap: debugfs: Use seq_file for the access map
Unlike the registers file we don't have any substantial performance concerns rendering the entire file (it involves no device accesses) so just use seq_printf() to simplify the code. Signed-off-by: Mark Brown <broonie@kernel.org>
This commit is contained in:
parent
8005c49d9a
commit
8da61f24cc
@ -397,72 +397,39 @@ static const struct file_operations regmap_reg_ranges_fops = {
|
||||
.llseek = default_llseek,
|
||||
};
|
||||
|
||||
static ssize_t regmap_access_read_file(struct file *file,
|
||||
char __user *user_buf, size_t count,
|
||||
loff_t *ppos)
|
||||
static int regmap_access_show(struct seq_file *s, void *ignored)
|
||||
{
|
||||
int reg_len, tot_len;
|
||||
size_t buf_pos = 0;
|
||||
loff_t p = 0;
|
||||
ssize_t ret;
|
||||
int i;
|
||||
struct regmap *map = file->private_data;
|
||||
char *buf;
|
||||
struct regmap *map = s->private;
|
||||
int i, reg_len;
|
||||
|
||||
if (*ppos < 0 || !count)
|
||||
return -EINVAL;
|
||||
|
||||
buf = kmalloc(count, GFP_KERNEL);
|
||||
if (!buf)
|
||||
return -ENOMEM;
|
||||
|
||||
/* Calculate the length of a fixed format */
|
||||
reg_len = regmap_calc_reg_len(map->max_register);
|
||||
tot_len = reg_len + 10; /* ': R W V P\n' */
|
||||
|
||||
for (i = 0; i <= map->max_register; i += map->reg_stride) {
|
||||
/* Ignore registers which are neither readable nor writable */
|
||||
if (!regmap_readable(map, i) && !regmap_writeable(map, i))
|
||||
continue;
|
||||
|
||||
/* If we're in the region the user is trying to read */
|
||||
if (p >= *ppos) {
|
||||
/* ...but not beyond it */
|
||||
if (buf_pos + tot_len + 1 >= count)
|
||||
break;
|
||||
|
||||
/* Format the register */
|
||||
snprintf(buf + buf_pos, count - buf_pos,
|
||||
"%.*x: %c %c %c %c\n",
|
||||
reg_len, i,
|
||||
seq_printf(s, "%.*x: %c %c %c %c\n", reg_len, i,
|
||||
regmap_readable(map, i) ? 'y' : 'n',
|
||||
regmap_writeable(map, i) ? 'y' : 'n',
|
||||
regmap_volatile(map, i) ? 'y' : 'n',
|
||||
regmap_precious(map, i) ? 'y' : 'n');
|
||||
|
||||
buf_pos += tot_len;
|
||||
}
|
||||
p += tot_len;
|
||||
}
|
||||
|
||||
ret = buf_pos;
|
||||
|
||||
if (copy_to_user(user_buf, buf, buf_pos)) {
|
||||
ret = -EFAULT;
|
||||
goto out;
|
||||
return 0;
|
||||
}
|
||||
|
||||
*ppos += buf_pos;
|
||||
|
||||
out:
|
||||
kfree(buf);
|
||||
return ret;
|
||||
static int access_open(struct inode *inode, struct file *file)
|
||||
{
|
||||
return single_open(file, regmap_access_show, inode->i_private);
|
||||
}
|
||||
|
||||
static const struct file_operations regmap_access_fops = {
|
||||
.open = simple_open,
|
||||
.read = regmap_access_read_file,
|
||||
.llseek = default_llseek,
|
||||
.open = access_open,
|
||||
.read = seq_read,
|
||||
.llseek = seq_lseek,
|
||||
.release = single_release,
|
||||
};
|
||||
|
||||
static ssize_t regmap_cache_only_write_file(struct file *file,
|
||||
|
Loading…
Reference in New Issue
Block a user