diff options
Diffstat (limited to 'fs/debugfs/file.c')
-rw-r--r-- | fs/debugfs/file.c | 90 |
1 files changed, 90 insertions, 0 deletions
diff --git a/fs/debugfs/file.c b/fs/debugfs/file.c index 90f76575c056..f31a27c60fc6 100644 --- a/fs/debugfs/file.c +++ b/fs/debugfs/file.c | |||
@@ -15,6 +15,7 @@ | |||
15 | 15 | ||
16 | #include <linux/module.h> | 16 | #include <linux/module.h> |
17 | #include <linux/fs.h> | 17 | #include <linux/fs.h> |
18 | #include <linux/seq_file.h> | ||
18 | #include <linux/pagemap.h> | 19 | #include <linux/pagemap.h> |
19 | #include <linux/namei.h> | 20 | #include <linux/namei.h> |
20 | #include <linux/debugfs.h> | 21 | #include <linux/debugfs.h> |
@@ -525,3 +526,92 @@ struct dentry *debugfs_create_blob(const char *name, mode_t mode, | |||
525 | return debugfs_create_file(name, mode, parent, blob, &fops_blob); | 526 | return debugfs_create_file(name, mode, parent, blob, &fops_blob); |
526 | } | 527 | } |
527 | EXPORT_SYMBOL_GPL(debugfs_create_blob); | 528 | EXPORT_SYMBOL_GPL(debugfs_create_blob); |
529 | |||
530 | /* | ||
531 | * The regset32 stuff is used to print 32-bit registers using the | ||
532 | * seq_file utilities. We offer printing a register set in an already-opened | ||
533 | * sequential file or create a debugfs file that only prints a regset32. | ||
534 | */ | ||
535 | |||
536 | /** | ||
537 | * debugfs_print_regs32 - use seq_print to describe a set of registers | ||
538 | * @s: the seq_file structure being used to generate output | ||
539 | * @regs: an array if struct debugfs_reg32 structures | ||
540 | * @mregs: the length of the above array | ||
541 | * @base: the base address to be used in reading the registers | ||
542 | * @prefix: a string to be prefixed to every output line | ||
543 | * | ||
544 | * This function outputs a text block describing the current values of | ||
545 | * some 32-bit hardware registers. It is meant to be used within debugfs | ||
546 | * files based on seq_file that need to show registers, intermixed with other | ||
547 | * information. The prefix argument may be used to specify a leading string, | ||
548 | * because some peripherals have several blocks of identical registers, | ||
549 | * for example configuration of dma channels | ||
550 | */ | ||
551 | int debugfs_print_regs32(struct seq_file *s, struct debugfs_reg32 *regs, | ||
552 | int nregs, void __iomem *base, char *prefix) | ||
553 | { | ||
554 | int i, ret = 0; | ||
555 | |||
556 | for (i = 0; i < nregs; i++, regs++) { | ||
557 | if (prefix) | ||
558 | ret += seq_printf(s, "%s", prefix); | ||
559 | ret += seq_printf(s, "%s = 0x%08x\n", regs->name, | ||
560 | readl((void *)(base + regs->offset))); | ||
561 | } | ||
562 | return ret; | ||
563 | } | ||
564 | EXPORT_SYMBOL_GPL(debugfs_print_regs32); | ||
565 | |||
566 | static int debugfs_show_regset32(struct seq_file *s, void *data) | ||
567 | { | ||
568 | struct debugfs_regset32 *regset = s->private; | ||
569 | |||
570 | debugfs_print_regs32(s, regset->regs, regset->nregs, regset->base, ""); | ||
571 | return 0; | ||
572 | } | ||
573 | |||
574 | static int debugfs_open_regset32(struct inode *inode, struct file *file) | ||
575 | { | ||
576 | return single_open(file, debugfs_show_regset32, inode->i_private); | ||
577 | } | ||
578 | |||
579 | static const struct file_operations fops_regset32 = { | ||
580 | .open = debugfs_open_regset32, | ||
581 | .read = seq_read, | ||
582 | .llseek = seq_lseek, | ||
583 | .release = single_release, | ||
584 | }; | ||
585 | |||
586 | /** | ||
587 | * debugfs_create_regset32 - create a debugfs file that returns register values | ||
588 | * @name: a pointer to a string containing the name of the file to create. | ||
589 | * @mode: the permission that the file should have | ||
590 | * @parent: a pointer to the parent dentry for this file. This should be a | ||
591 | * directory dentry if set. If this parameter is %NULL, then the | ||
592 | * file will be created in the root of the debugfs filesystem. | ||
593 | * @regset: a pointer to a struct debugfs_regset32, which contains a pointer | ||
594 | * to an array of register definitions, the array size and the base | ||
595 | * address where the register bank is to be found. | ||
596 | * | ||
597 | * This function creates a file in debugfs with the given name that reports | ||
598 | * the names and values of a set of 32-bit registers. If the @mode variable | ||
599 | * is so set it can be read from. Writing is not supported. | ||
600 | * | ||
601 | * This function will return a pointer to a dentry if it succeeds. This | ||
602 | * pointer must be passed to the debugfs_remove() function when the file is | ||
603 | * to be removed (no automatic cleanup happens if your module is unloaded, | ||
604 | * you are responsible here.) If an error occurs, %NULL will be returned. | ||
605 | * | ||
606 | * If debugfs is not enabled in the kernel, the value -%ENODEV will be | ||
607 | * returned. It is not wise to check for this value, but rather, check for | ||
608 | * %NULL or !%NULL instead as to eliminate the need for #ifdef in the calling | ||
609 | * code. | ||
610 | */ | ||
611 | struct dentry *debugfs_create_regset32(const char *name, mode_t mode, | ||
612 | struct dentry *parent, | ||
613 | struct debugfs_regset32 *regset) | ||
614 | { | ||
615 | return debugfs_create_file(name, mode, parent, regset, &fops_regset32); | ||
616 | } | ||
617 | EXPORT_SYMBOL_GPL(debugfs_create_regset32); | ||