diff options
author | Mark Brown <broonie@kernel.org> | 2015-10-20 10:40:59 -0400 |
---|---|---|
committer | Mark Brown <broonie@kernel.org> | 2016-01-05 13:32:22 -0500 |
commit | 8da61f24cc4a4a66ecae69aa9b9aa8fd989a8969 (patch) | |
tree | 3dae41e30879cf235f2602647500232fe3ea86ea | |
parent | 8005c49d9aea74d382f474ce11afbbc7d7130bec (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.c | 69 |
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 | ||
400 | static ssize_t regmap_access_read_file(struct file *file, | 400 | static 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 | ||
457 | out: | 423 | static 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 | ||
462 | static const struct file_operations regmap_access_fops = { | 428 | static 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 | ||
468 | static ssize_t regmap_cache_only_write_file(struct file *file, | 435 | static ssize_t regmap_cache_only_write_file(struct file *file, |