regmap: debugfs: Use seq_file for the access map
authorMark Brown <broonie@kernel.org>
Tue, 20 Oct 2015 14:40:59 +0000 (15:40 +0100)
committerMark Brown <broonie@kernel.org>
Tue, 5 Jan 2016 18:32:22 +0000 (18:32 +0000)
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>
drivers/base/regmap/regmap-debugfs.c

index 3f0a7e262d6982c63dcaf3e81f058b0c471d2880..1ee3d40861c7ee77b819e9ae0118fb5f774bb215 100644 (file)
@@ -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,