aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMark Brown <broonie@kernel.org>2015-10-20 10:40:59 -0400
committerMark Brown <broonie@kernel.org>2016-01-05 13:32:22 -0500
commit8da61f24cc4a4a66ecae69aa9b9aa8fd989a8969 (patch)
tree3dae41e30879cf235f2602647500232fe3ea86ea
parent8005c49d9aea74d382f474ce11afbbc7d7130bec (diff)
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>
-rw-r--r--drivers/base/regmap/regmap-debugfs.c69
1 files changed, 18 insertions, 51 deletions
diff --git a/drivers/base/regmap/regmap-debugfs.c b/drivers/base/regmap/regmap-debugfs.c
index 3f0a7e262d69..1ee3d40861c7 100644
--- a/drivers/base/regmap/regmap-debugfs.c
+++ b/drivers/base/regmap/regmap-debugfs.c
@@ -397,72 +397,39 @@ static const struct file_operations regmap_reg_ranges_fops = {
397 .llseek = default_llseek, 397 .llseek = default_llseek,
398}; 398};
399 399
400static ssize_t regmap_access_read_file(struct file *file, 400static int regmap_access_show(struct seq_file *s, void *ignored)
401 char __user *user_buf, size_t count,
402 loff_t *ppos)
403{ 401{
404 int reg_len, tot_len; 402 struct regmap *map = s->private;
405 size_t buf_pos = 0; 403 int i, reg_len;
406 loff_t p = 0;
407 ssize_t ret;
408 int i;
409 struct regmap *map = file->private_data;
410 char *buf;
411
412 if (*ppos < 0 || !count)
413 return -EINVAL;
414 404
415 buf = kmalloc(count, GFP_KERNEL);
416 if (!buf)
417 return -ENOMEM;
418
419 /* Calculate the length of a fixed format */
420 reg_len = regmap_calc_reg_len(map->max_register); 405 reg_len = regmap_calc_reg_len(map->max_register);
421 tot_len = reg_len + 10; /* ': R W V P\n' */
422 406
423 for (i = 0; i <= map->max_register; i += map->reg_stride) { 407 for (i = 0; i <= map->max_register; i += map->reg_stride) {
424 /* Ignore registers which are neither readable nor writable */ 408 /* Ignore registers which are neither readable nor writable */
425 if (!regmap_readable(map, i) && !regmap_writeable(map, i)) 409 if (!regmap_readable(map, i) && !regmap_writeable(map, i))
426 continue; 410 continue;
427 411
428 /* If we're in the region the user is trying to read */ 412 /* Format the register */
429 if (p >= *ppos) { 413 seq_printf(s, "%.*x: %c %c %c %c\n", reg_len, i,
430 /* ...but not beyond it */ 414 regmap_readable(map, i) ? 'y' : 'n',
431 if (buf_pos + tot_len + 1 >= count) 415 regmap_writeable(map, i) ? 'y' : 'n',
432 break; 416 regmap_volatile(map, i) ? 'y' : 'n',
433 417 regmap_precious(map, i) ? 'y' : 'n');
434 /* Format the register */
435 snprintf(buf + buf_pos, count - buf_pos,
436 "%.*x: %c %c %c %c\n",
437 reg_len, i,
438 regmap_readable(map, i) ? 'y' : 'n',
439 regmap_writeable(map, i) ? 'y' : 'n',
440 regmap_volatile(map, i) ? 'y' : 'n',
441 regmap_precious(map, i) ? 'y' : 'n');
442
443 buf_pos += tot_len;
444 }
445 p += tot_len;
446 }
447
448 ret = buf_pos;
449
450 if (copy_to_user(user_buf, buf, buf_pos)) {
451 ret = -EFAULT;
452 goto out;
453 } 418 }
454 419
455 *ppos += buf_pos; 420 return 0;
421}
456 422
457out: 423static int access_open(struct inode *inode, struct file *file)
458 kfree(buf); 424{
459 return ret; 425 return single_open(file, regmap_access_show, inode->i_private);
460} 426}
461 427
462static const struct file_operations regmap_access_fops = { 428static const struct file_operations regmap_access_fops = {
463 .open = simple_open, 429 .open = access_open,
464 .read = regmap_access_read_file, 430 .read = seq_read,
465 .llseek = default_llseek, 431 .llseek = seq_lseek,
432 .release = single_release,
466}; 433};
467 434
468static ssize_t regmap_cache_only_write_file(struct file *file, 435static ssize_t regmap_cache_only_write_file(struct file *file,