aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/mfd/ab8500-debugfs.c
diff options
context:
space:
mode:
authorLee Jones <lee.jones@linaro.org>2012-07-06 10:11:50 -0400
committerLee Jones <lee.jones@linaro.org>2013-03-06 23:28:12 -0500
commit9581ae39de8833a7affaef24caadef2830603fef (patch)
tree28577cb81e3104b888e0d5bb431e73793ceee1d6 /drivers/mfd/ab8500-debugfs.c
parente436ddff5748c459853bb3fb97550a9b8b647b8d (diff)
mfd: ab8500-debug: Add support for ab8505 and ab9540
Make it possible to dump all registers in ab8505 and ab9540. Signed-off-by: Lee Jones <lee.jones@linaro.org> Acked-by: Samuel Ortiz <sameo@linux.intel.com>
Diffstat (limited to 'drivers/mfd/ab8500-debugfs.c')
-rw-r--r--drivers/mfd/ab8500-debugfs.c383
1 files changed, 372 insertions, 11 deletions
diff --git a/drivers/mfd/ab8500-debugfs.c b/drivers/mfd/ab8500-debugfs.c
index 969e43db8485..074eea9e4bfd 100644
--- a/drivers/mfd/ab8500-debugfs.c
+++ b/drivers/mfd/ab8500-debugfs.c
@@ -156,7 +156,9 @@ static struct hwreg_cfg hwreg_cfg = {
156 156
157#define AB8500_REV_REG 0x80 157#define AB8500_REV_REG 0x80
158 158
159static struct ab8500_prcmu_ranges debug_ranges[AB8500_NUM_BANKS] = { 159static struct ab8500_prcmu_ranges *debug_ranges;
160
161struct ab8500_prcmu_ranges ab8500_debug_ranges[AB8500_NUM_BANKS] = {
160 [0x0] = { 162 [0x0] = {
161 .num_ranges = 0, 163 .num_ranges = 0,
162 .range = NULL, 164 .range = NULL,
@@ -360,7 +362,7 @@ static struct ab8500_prcmu_ranges debug_ranges[AB8500_NUM_BANKS] = {
360 }, 362 },
361 { 363 {
362 .first = 0xf5, 364 .first = 0xf5,
363 .last = 0xf6, 365 .last = 0xf6,
364 }, 366 },
365 }, 367 },
366 }, 368 },
@@ -485,6 +487,365 @@ static struct ab8500_prcmu_ranges debug_ranges[AB8500_NUM_BANKS] = {
485 }, 487 },
486}; 488};
487 489
490struct ab8500_prcmu_ranges ab8505_debug_ranges[AB8500_NUM_BANKS] = {
491 [0x0] = {
492 .num_ranges = 0,
493 .range = NULL,
494 },
495 [AB8500_SYS_CTRL1_BLOCK] = {
496 .num_ranges = 5,
497 .range = (struct ab8500_reg_range[]) {
498 {
499 .first = 0x00,
500 .last = 0x04,
501 },
502 {
503 .first = 0x42,
504 .last = 0x42,
505 },
506 {
507 .first = 0x52,
508 .last = 0x52,
509 },
510 {
511 .first = 0x54,
512 .last = 0x57,
513 },
514 {
515 .first = 0x80,
516 .last = 0x83,
517 },
518 },
519 },
520 [AB8500_SYS_CTRL2_BLOCK] = {
521 .num_ranges = 5,
522 .range = (struct ab8500_reg_range[]) {
523 {
524 .first = 0x00,
525 .last = 0x0D,
526 },
527 {
528 .first = 0x0F,
529 .last = 0x17,
530 },
531 {
532 .first = 0x20,
533 .last = 0x20,
534 },
535 {
536 .first = 0x30,
537 .last = 0x30,
538 },
539 {
540 .first = 0x32,
541 .last = 0x3A,
542 },
543 },
544 },
545 [AB8500_REGU_CTRL1] = {
546 .num_ranges = 3,
547 .range = (struct ab8500_reg_range[]) {
548 {
549 .first = 0x00,
550 .last = 0x00,
551 },
552 {
553 .first = 0x03,
554 .last = 0x11,
555 },
556 {
557 .first = 0x80,
558 .last = 0x86,
559 },
560 },
561 },
562 [AB8500_REGU_CTRL2] = {
563 .num_ranges = 6,
564 .range = (struct ab8500_reg_range[]) {
565 {
566 .first = 0x00,
567 .last = 0x06,
568 },
569 {
570 .first = 0x08,
571 .last = 0x15,
572 },
573 {
574 .first = 0x17,
575 .last = 0x19,
576 },
577 {
578 .first = 0x1B,
579 .last = 0x1D,
580 },
581 {
582 .first = 0x1F,
583 .last = 0x30,
584 },
585 {
586 .first = 0x40,
587 .last = 0x48,
588 },
589 /* 0x80-0x8B is SIM registers and should
590 * not be accessed from here */
591 },
592 },
593 [AB8500_USB] = {
594 .num_ranges = 3,
595 .range = (struct ab8500_reg_range[]) {
596 {
597 .first = 0x80,
598 .last = 0x83,
599 },
600 {
601 .first = 0x87,
602 .last = 0x8A,
603 },
604 {
605 .first = 0x91,
606 .last = 0x94,
607 },
608 },
609 },
610 [AB8500_TVOUT] = {
611 .num_ranges = 0,
612 .range = NULL,
613 },
614 [AB8500_DBI] = {
615 .num_ranges = 0,
616 .range = NULL,
617 },
618 [AB8500_ECI_AV_ACC] = {
619 .num_ranges = 1,
620 .range = (struct ab8500_reg_range[]) {
621 {
622 .first = 0x80,
623 .last = 0x82,
624 },
625 },
626 },
627 [AB8500_RESERVED] = {
628 .num_ranges = 0,
629 .range = NULL,
630 },
631 [AB8500_GPADC] = {
632 .num_ranges = 1,
633 .range = (struct ab8500_reg_range[]) {
634 {
635 .first = 0x00,
636 .last = 0x08,
637 },
638 },
639 },
640 [AB8500_CHARGER] = {
641 .num_ranges = 9,
642 .range = (struct ab8500_reg_range[]) {
643 {
644 .first = 0x02,
645 .last = 0x03,
646 },
647 {
648 .first = 0x05,
649 .last = 0x05,
650 },
651 {
652 .first = 0x40,
653 .last = 0x44,
654 },
655 {
656 .first = 0x50,
657 .last = 0x57,
658 },
659 {
660 .first = 0x60,
661 .last = 0x60,
662 },
663 {
664 .first = 0xA0,
665 .last = 0xA7,
666 },
667 {
668 .first = 0xAF,
669 .last = 0xB2,
670 },
671 {
672 .first = 0xC0,
673 .last = 0xC2,
674 },
675 {
676 .first = 0xF5,
677 .last = 0xF5,
678 },
679 },
680 },
681 [AB8500_GAS_GAUGE] = {
682 .num_ranges = 3,
683 .range = (struct ab8500_reg_range[]) {
684 {
685 .first = 0x00,
686 .last = 0x00,
687 },
688 {
689 .first = 0x07,
690 .last = 0x0A,
691 },
692 {
693 .first = 0x10,
694 .last = 0x14,
695 },
696 },
697 },
698 [AB8500_AUDIO] = {
699 .num_ranges = 1,
700 .range = (struct ab8500_reg_range[]) {
701 {
702 .first = 0x00,
703 .last = 0x83,
704 },
705 },
706 },
707 [AB8500_INTERRUPT] = {
708 .num_ranges = 11,
709 .range = (struct ab8500_reg_range[]) {
710 {
711 .first = 0x00,
712 .last = 0x04,
713 },
714 {
715 .first = 0x06,
716 .last = 0x07,
717 },
718 {
719 .first = 0x09,
720 .last = 0x09,
721 },
722 {
723 .first = 0x0B,
724 .last = 0x0C,
725 },
726 {
727 .first = 0x12,
728 .last = 0x15,
729 },
730 {
731 .first = 0x18,
732 .last = 0x18,
733 },
734 /* Latch registers should not be read here */
735 {
736 .first = 0x40,
737 .last = 0x44,
738 },
739 {
740 .first = 0x46,
741 .last = 0x49,
742 },
743 {
744 .first = 0x4B,
745 .last = 0x4D,
746 },
747 {
748 .first = 0x52,
749 .last = 0x55,
750 },
751 {
752 .first = 0x58,
753 .last = 0x58,
754 },
755 /* LatchHier registers should not be read here */
756 },
757 },
758 [AB8500_RTC] = {
759 .num_ranges = 2,
760 .range = (struct ab8500_reg_range[]) {
761 {
762 .first = 0x00,
763 .last = 0x14,
764 },
765 {
766 .first = 0x16,
767 .last = 0x17,
768 },
769 },
770 },
771 [AB8500_MISC] = {
772 .num_ranges = 8,
773 .range = (struct ab8500_reg_range[]) {
774 {
775 .first = 0x00,
776 .last = 0x06,
777 },
778 {
779 .first = 0x10,
780 .last = 0x16,
781 },
782 {
783 .first = 0x20,
784 .last = 0x26,
785 },
786 {
787 .first = 0x30,
788 .last = 0x36,
789 },
790 {
791 .first = 0x40,
792 .last = 0x46,
793 },
794 {
795 .first = 0x50,
796 .last = 0x50,
797 },
798 {
799 .first = 0x60,
800 .last = 0x6B,
801 },
802 {
803 .first = 0x80,
804 .last = 0x82,
805 },
806 },
807 },
808 [AB8500_DEVELOPMENT] = {
809 .num_ranges = 2,
810 .range = (struct ab8500_reg_range[]) {
811 {
812 .first = 0x00,
813 .last = 0x00,
814 },
815 {
816 .first = 0x05,
817 .last = 0x05,
818 },
819 },
820 },
821 [AB8500_DEBUG] = {
822 .num_ranges = 1,
823 .range = (struct ab8500_reg_range[]) {
824 {
825 .first = 0x05,
826 .last = 0x07,
827 },
828 },
829 },
830 [AB8500_PROD_TEST] = {
831 .num_ranges = 0,
832 .range = NULL,
833 },
834 [AB8500_STE_TEST] = {
835 .num_ranges = 0,
836 .range = NULL,
837 },
838 [AB8500_OTP_EMUL] = {
839 .num_ranges = 1,
840 .range = (struct ab8500_reg_range[]) {
841 {
842 .first = 0x01,
843 .last = 0x15,
844 },
845 },
846 },
847};
848
488static irqreturn_t ab8500_debug_handler(int irq, void *data) 849static irqreturn_t ab8500_debug_handler(int irq, void *data)
489{ 850{
490 char buf[16]; 851 char buf[16];
@@ -529,9 +890,6 @@ static int ab8500_registers_print(struct device *dev, u32 bank,
529 err = seq_printf(s, " [0x%02X/0x%02X]: 0x%02X\n", 890 err = seq_printf(s, " [0x%02X/0x%02X]: 0x%02X\n",
530 bank, reg, value); 891 bank, reg, value);
531 if (err < 0) { 892 if (err < 0) {
532 dev_err(dev,
533 "seq_printf overflow bank=0x%02X reg=0x%02X\n",
534 bank, reg);
535 /* Error is not returned here since 893 /* Error is not returned here since
536 * the output is wanted in any case */ 894 * the output is wanted in any case */
537 return 0; 895 return 0;
@@ -581,8 +939,6 @@ static int ab8500_print_all_banks(struct seq_file *s, void *p)
581 939
582 for (i = 1; i < AB8500_NUM_BANKS; i++) { 940 for (i = 1; i < AB8500_NUM_BANKS; i++) {
583 err = seq_printf(s, " bank 0x%02X:\n", i); 941 err = seq_printf(s, " bank 0x%02X:\n", i);
584 if (err < 0)
585 dev_err(dev, "seq_printf overflow, bank=0x%02X\n", i);
586 942
587 ab8500_registers_print(dev, i, s); 943 ab8500_registers_print(dev, i, s);
588 } 944 }
@@ -1937,14 +2293,19 @@ static int ab8500_debug_probe(struct platform_device *plf)
1937 if (!file) 2293 if (!file)
1938 goto err; 2294 goto err;
1939 2295
1940 if (is_ab8500(ab8500)) 2296 if (is_ab8500(ab8500)) {
2297 debug_ranges = ab8500_debug_ranges;
1941 num_interrupt_lines = AB8500_NR_IRQS; 2298 num_interrupt_lines = AB8500_NR_IRQS;
1942 else if (is_ab8505(ab8500)) 2299 } else if (is_ab8505(ab8500)) {
2300 debug_ranges = ab8505_debug_ranges;
1943 num_interrupt_lines = AB8505_NR_IRQS; 2301 num_interrupt_lines = AB8505_NR_IRQS;
1944 else if (is_ab9540(ab8500)) 2302 } else if (is_ab9540(ab8500)) {
2303 debug_ranges = ab8505_debug_ranges;
1945 num_interrupt_lines = AB9540_NR_IRQS; 2304 num_interrupt_lines = AB9540_NR_IRQS;
1946 else if (is_ab8540(ab8500)) 2305 } else if (is_ab8540(ab8500)) {
2306 debug_ranges = ab8505_debug_ranges;
1947 num_interrupt_lines = AB8540_NR_IRQS; 2307 num_interrupt_lines = AB8540_NR_IRQS;
2308 }
1948 2309
1949 file = debugfs_create_file("interrupts", (S_IRUGO), 2310 file = debugfs_create_file("interrupts", (S_IRUGO),
1950 ab8500_dir, &plf->dev, &ab8500_interrupts_fops); 2311 ab8500_dir, &plf->dev, &ab8500_interrupts_fops);