diff options
author | Lee Jones <lee.jones@linaro.org> | 2013-02-12 09:35:28 -0500 |
---|---|---|
committer | Lee Jones <lee.jones@linaro.org> | 2013-03-06 23:27:31 -0500 |
commit | 5ff9090f3de360578a2a4f53812fcfce761bfaaa (patch) | |
tree | b0ec46c9a931bdbc8c8a620009df7c69c872ca84 | |
parent | cfc0849c66099dc62ed6d879d8128977bd087aa7 (diff) |
mfd: ab8500-debug: Function to save all ABB registers to mem
Dump function that stores all readable ABB registers to a memory
areas where they can be accessed from dump file.
Signed-off-by: Jonas Aaberg <jonas.aberg@stericsson.com>
Signed-off-by: Lee Jones <lee.jones@linaro.org>
Reviewed-by: Mattias WALLIN <mattias.wallin@stericsson.com>
Acked-by: Samuel Ortiz <sameo@linux.intel.com>
-rw-r--r-- | drivers/mfd/ab8500-debugfs.c | 50 |
1 files changed, 50 insertions, 0 deletions
diff --git a/drivers/mfd/ab8500-debugfs.c b/drivers/mfd/ab8500-debugfs.c index 75366b55f16c..7febf171e755 100644 --- a/drivers/mfd/ab8500-debugfs.c +++ b/drivers/mfd/ab8500-debugfs.c | |||
@@ -601,6 +601,56 @@ void ab8500_dump_all_banks(struct device *dev) | |||
601 | } | 601 | } |
602 | } | 602 | } |
603 | 603 | ||
604 | /* Space for 500 registers. */ | ||
605 | #define DUMP_MAX_REGS 700 | ||
606 | struct ab8500_register_dump | ||
607 | { | ||
608 | u8 bank; | ||
609 | u8 reg; | ||
610 | u8 value; | ||
611 | int ret; | ||
612 | } ab8500_complete_register_dump[DUMP_MAX_REGS]; | ||
613 | |||
614 | extern int prcmu_abb_read(u8 slave, u8 reg, u8 *value, u8 size); | ||
615 | |||
616 | /* This shall only be called upon kernel panic! */ | ||
617 | void ab8500_dump_all_banks_to_mem(void) | ||
618 | { | ||
619 | int i, r = 0; | ||
620 | u8 bank; | ||
621 | |||
622 | pr_info("Saving all ABB registers at \"ab8500_complete_register_dump\" " | ||
623 | "for crash analyze.\n"); | ||
624 | |||
625 | for (bank = 1; bank < AB8500_NUM_BANKS; bank++) { | ||
626 | for (i = 0; i < debug_ranges[bank].num_ranges; i++) { | ||
627 | u8 reg; | ||
628 | |||
629 | for (reg = debug_ranges[bank].range[i].first; | ||
630 | reg <= debug_ranges[bank].range[i].last; | ||
631 | reg++) { | ||
632 | u8 value; | ||
633 | int err; | ||
634 | |||
635 | err = prcmu_abb_read(bank, reg, &value, 1); | ||
636 | |||
637 | ab8500_complete_register_dump[r].ret = err; | ||
638 | ab8500_complete_register_dump[r].bank = bank; | ||
639 | ab8500_complete_register_dump[r].reg = reg; | ||
640 | ab8500_complete_register_dump[r].value = value; | ||
641 | |||
642 | r++; | ||
643 | |||
644 | if (r >= DUMP_MAX_REGS) { | ||
645 | pr_err("%s: too many register to dump!\n", | ||
646 | __func__); | ||
647 | return; | ||
648 | } | ||
649 | } | ||
650 | } | ||
651 | } | ||
652 | } | ||
653 | |||
604 | static int ab8500_all_banks_open(struct inode *inode, struct file *file) | 654 | static int ab8500_all_banks_open(struct inode *inode, struct file *file) |
605 | { | 655 | { |
606 | struct seq_file *s; | 656 | struct seq_file *s; |