|
@@ -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;
|
|
|
-
|
|
|
- if (*ppos < 0 || !count)
|
|
|
- return -EINVAL;
|
|
|
+ struct regmap *map = s->private;
|
|
|
+ int i, reg_len;
|
|
|
|
|
|
- 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,
|
|
|
- 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;
|
|
|
+ /* Format the register */
|
|
|
+ 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');
|
|
|
}
|
|
|
|
|
|
- *ppos += buf_pos;
|
|
|
+ return 0;
|
|
|
+}
|
|
|
|
|
|
-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,
|