diff options
Diffstat (limited to 'drivers/mfd/ab8500-debugfs.c')
-rw-r--r-- | drivers/mfd/ab8500-debugfs.c | 1741 |
1 files changed, 1597 insertions, 144 deletions
diff --git a/drivers/mfd/ab8500-debugfs.c b/drivers/mfd/ab8500-debugfs.c index 45fe3c50eb03..b88bbbc15f1e 100644 --- a/drivers/mfd/ab8500-debugfs.c +++ b/drivers/mfd/ab8500-debugfs.c | |||
@@ -80,6 +80,7 @@ | |||
80 | #include <linux/interrupt.h> | 80 | #include <linux/interrupt.h> |
81 | #include <linux/kobject.h> | 81 | #include <linux/kobject.h> |
82 | #include <linux/slab.h> | 82 | #include <linux/slab.h> |
83 | #include <linux/irq.h> | ||
83 | 84 | ||
84 | #include <linux/mfd/abx500.h> | 85 | #include <linux/mfd/abx500.h> |
85 | #include <linux/mfd/abx500/ab8500.h> | 86 | #include <linux/mfd/abx500/ab8500.h> |
@@ -90,6 +91,9 @@ | |||
90 | #include <linux/ctype.h> | 91 | #include <linux/ctype.h> |
91 | #endif | 92 | #endif |
92 | 93 | ||
94 | /* TODO: this file should not reference IRQ_DB8500_AB8500! */ | ||
95 | #include <mach/irqs.h> | ||
96 | |||
93 | static u32 debug_bank; | 97 | static u32 debug_bank; |
94 | static u32 debug_address; | 98 | static u32 debug_address; |
95 | 99 | ||
@@ -101,6 +105,11 @@ static int num_irqs; | |||
101 | static struct device_attribute **dev_attr; | 105 | static struct device_attribute **dev_attr; |
102 | static char **event_name; | 106 | static char **event_name; |
103 | 107 | ||
108 | static u8 avg_sample = SAMPLE_16; | ||
109 | static u8 trig_edge = RISING_EDGE; | ||
110 | static u8 conv_type = ADC_SW; | ||
111 | static u8 trig_timer; | ||
112 | |||
104 | /** | 113 | /** |
105 | * struct ab8500_reg_range | 114 | * struct ab8500_reg_range |
106 | * @first: the first address of the range | 115 | * @first: the first address of the range |
@@ -150,7 +159,9 @@ static struct hwreg_cfg hwreg_cfg = { | |||
150 | 159 | ||
151 | #define AB8500_REV_REG 0x80 | 160 | #define AB8500_REV_REG 0x80 |
152 | 161 | ||
153 | static struct ab8500_prcmu_ranges debug_ranges[AB8500_NUM_BANKS] = { | 162 | static struct ab8500_prcmu_ranges *debug_ranges; |
163 | |||
164 | struct ab8500_prcmu_ranges ab8500_debug_ranges[AB8500_NUM_BANKS] = { | ||
154 | [0x0] = { | 165 | [0x0] = { |
155 | .num_ranges = 0, | 166 | .num_ranges = 0, |
156 | .range = NULL, | 167 | .range = NULL, |
@@ -354,7 +365,7 @@ static struct ab8500_prcmu_ranges debug_ranges[AB8500_NUM_BANKS] = { | |||
354 | }, | 365 | }, |
355 | { | 366 | { |
356 | .first = 0xf5, | 367 | .first = 0xf5, |
357 | .last = 0xf6, | 368 | .last = 0xf6, |
358 | }, | 369 | }, |
359 | }, | 370 | }, |
360 | }, | 371 | }, |
@@ -479,6 +490,781 @@ static struct ab8500_prcmu_ranges debug_ranges[AB8500_NUM_BANKS] = { | |||
479 | }, | 490 | }, |
480 | }; | 491 | }; |
481 | 492 | ||
493 | struct ab8500_prcmu_ranges ab8505_debug_ranges[AB8500_NUM_BANKS] = { | ||
494 | [0x0] = { | ||
495 | .num_ranges = 0, | ||
496 | .range = NULL, | ||
497 | }, | ||
498 | [AB8500_SYS_CTRL1_BLOCK] = { | ||
499 | .num_ranges = 5, | ||
500 | .range = (struct ab8500_reg_range[]) { | ||
501 | { | ||
502 | .first = 0x00, | ||
503 | .last = 0x04, | ||
504 | }, | ||
505 | { | ||
506 | .first = 0x42, | ||
507 | .last = 0x42, | ||
508 | }, | ||
509 | { | ||
510 | .first = 0x52, | ||
511 | .last = 0x52, | ||
512 | }, | ||
513 | { | ||
514 | .first = 0x54, | ||
515 | .last = 0x57, | ||
516 | }, | ||
517 | { | ||
518 | .first = 0x80, | ||
519 | .last = 0x83, | ||
520 | }, | ||
521 | }, | ||
522 | }, | ||
523 | [AB8500_SYS_CTRL2_BLOCK] = { | ||
524 | .num_ranges = 5, | ||
525 | .range = (struct ab8500_reg_range[]) { | ||
526 | { | ||
527 | .first = 0x00, | ||
528 | .last = 0x0D, | ||
529 | }, | ||
530 | { | ||
531 | .first = 0x0F, | ||
532 | .last = 0x17, | ||
533 | }, | ||
534 | { | ||
535 | .first = 0x20, | ||
536 | .last = 0x20, | ||
537 | }, | ||
538 | { | ||
539 | .first = 0x30, | ||
540 | .last = 0x30, | ||
541 | }, | ||
542 | { | ||
543 | .first = 0x32, | ||
544 | .last = 0x3A, | ||
545 | }, | ||
546 | }, | ||
547 | }, | ||
548 | [AB8500_REGU_CTRL1] = { | ||
549 | .num_ranges = 3, | ||
550 | .range = (struct ab8500_reg_range[]) { | ||
551 | { | ||
552 | .first = 0x00, | ||
553 | .last = 0x00, | ||
554 | }, | ||
555 | { | ||
556 | .first = 0x03, | ||
557 | .last = 0x11, | ||
558 | }, | ||
559 | { | ||
560 | .first = 0x80, | ||
561 | .last = 0x86, | ||
562 | }, | ||
563 | }, | ||
564 | }, | ||
565 | [AB8500_REGU_CTRL2] = { | ||
566 | .num_ranges = 6, | ||
567 | .range = (struct ab8500_reg_range[]) { | ||
568 | { | ||
569 | .first = 0x00, | ||
570 | .last = 0x06, | ||
571 | }, | ||
572 | { | ||
573 | .first = 0x08, | ||
574 | .last = 0x15, | ||
575 | }, | ||
576 | { | ||
577 | .first = 0x17, | ||
578 | .last = 0x19, | ||
579 | }, | ||
580 | { | ||
581 | .first = 0x1B, | ||
582 | .last = 0x1D, | ||
583 | }, | ||
584 | { | ||
585 | .first = 0x1F, | ||
586 | .last = 0x30, | ||
587 | }, | ||
588 | { | ||
589 | .first = 0x40, | ||
590 | .last = 0x48, | ||
591 | }, | ||
592 | /* 0x80-0x8B is SIM registers and should | ||
593 | * not be accessed from here */ | ||
594 | }, | ||
595 | }, | ||
596 | [AB8500_USB] = { | ||
597 | .num_ranges = 3, | ||
598 | .range = (struct ab8500_reg_range[]) { | ||
599 | { | ||
600 | .first = 0x80, | ||
601 | .last = 0x83, | ||
602 | }, | ||
603 | { | ||
604 | .first = 0x87, | ||
605 | .last = 0x8A, | ||
606 | }, | ||
607 | { | ||
608 | .first = 0x91, | ||
609 | .last = 0x94, | ||
610 | }, | ||
611 | }, | ||
612 | }, | ||
613 | [AB8500_TVOUT] = { | ||
614 | .num_ranges = 0, | ||
615 | .range = NULL, | ||
616 | }, | ||
617 | [AB8500_DBI] = { | ||
618 | .num_ranges = 0, | ||
619 | .range = NULL, | ||
620 | }, | ||
621 | [AB8500_ECI_AV_ACC] = { | ||
622 | .num_ranges = 1, | ||
623 | .range = (struct ab8500_reg_range[]) { | ||
624 | { | ||
625 | .first = 0x80, | ||
626 | .last = 0x82, | ||
627 | }, | ||
628 | }, | ||
629 | }, | ||
630 | [AB8500_RESERVED] = { | ||
631 | .num_ranges = 0, | ||
632 | .range = NULL, | ||
633 | }, | ||
634 | [AB8500_GPADC] = { | ||
635 | .num_ranges = 1, | ||
636 | .range = (struct ab8500_reg_range[]) { | ||
637 | { | ||
638 | .first = 0x00, | ||
639 | .last = 0x08, | ||
640 | }, | ||
641 | }, | ||
642 | }, | ||
643 | [AB8500_CHARGER] = { | ||
644 | .num_ranges = 9, | ||
645 | .range = (struct ab8500_reg_range[]) { | ||
646 | { | ||
647 | .first = 0x02, | ||
648 | .last = 0x03, | ||
649 | }, | ||
650 | { | ||
651 | .first = 0x05, | ||
652 | .last = 0x05, | ||
653 | }, | ||
654 | { | ||
655 | .first = 0x40, | ||
656 | .last = 0x44, | ||
657 | }, | ||
658 | { | ||
659 | .first = 0x50, | ||
660 | .last = 0x57, | ||
661 | }, | ||
662 | { | ||
663 | .first = 0x60, | ||
664 | .last = 0x60, | ||
665 | }, | ||
666 | { | ||
667 | .first = 0xA0, | ||
668 | .last = 0xA7, | ||
669 | }, | ||
670 | { | ||
671 | .first = 0xAF, | ||
672 | .last = 0xB2, | ||
673 | }, | ||
674 | { | ||
675 | .first = 0xC0, | ||
676 | .last = 0xC2, | ||
677 | }, | ||
678 | { | ||
679 | .first = 0xF5, | ||
680 | .last = 0xF5, | ||
681 | }, | ||
682 | }, | ||
683 | }, | ||
684 | [AB8500_GAS_GAUGE] = { | ||
685 | .num_ranges = 3, | ||
686 | .range = (struct ab8500_reg_range[]) { | ||
687 | { | ||
688 | .first = 0x00, | ||
689 | .last = 0x00, | ||
690 | }, | ||
691 | { | ||
692 | .first = 0x07, | ||
693 | .last = 0x0A, | ||
694 | }, | ||
695 | { | ||
696 | .first = 0x10, | ||
697 | .last = 0x14, | ||
698 | }, | ||
699 | }, | ||
700 | }, | ||
701 | [AB8500_AUDIO] = { | ||
702 | .num_ranges = 1, | ||
703 | .range = (struct ab8500_reg_range[]) { | ||
704 | { | ||
705 | .first = 0x00, | ||
706 | .last = 0x83, | ||
707 | }, | ||
708 | }, | ||
709 | }, | ||
710 | [AB8500_INTERRUPT] = { | ||
711 | .num_ranges = 11, | ||
712 | .range = (struct ab8500_reg_range[]) { | ||
713 | { | ||
714 | .first = 0x00, | ||
715 | .last = 0x04, | ||
716 | }, | ||
717 | { | ||
718 | .first = 0x06, | ||
719 | .last = 0x07, | ||
720 | }, | ||
721 | { | ||
722 | .first = 0x09, | ||
723 | .last = 0x09, | ||
724 | }, | ||
725 | { | ||
726 | .first = 0x0B, | ||
727 | .last = 0x0C, | ||
728 | }, | ||
729 | { | ||
730 | .first = 0x12, | ||
731 | .last = 0x15, | ||
732 | }, | ||
733 | { | ||
734 | .first = 0x18, | ||
735 | .last = 0x18, | ||
736 | }, | ||
737 | /* Latch registers should not be read here */ | ||
738 | { | ||
739 | .first = 0x40, | ||
740 | .last = 0x44, | ||
741 | }, | ||
742 | { | ||
743 | .first = 0x46, | ||
744 | .last = 0x49, | ||
745 | }, | ||
746 | { | ||
747 | .first = 0x4B, | ||
748 | .last = 0x4D, | ||
749 | }, | ||
750 | { | ||
751 | .first = 0x52, | ||
752 | .last = 0x55, | ||
753 | }, | ||
754 | { | ||
755 | .first = 0x58, | ||
756 | .last = 0x58, | ||
757 | }, | ||
758 | /* LatchHier registers should not be read here */ | ||
759 | }, | ||
760 | }, | ||
761 | [AB8500_RTC] = { | ||
762 | .num_ranges = 2, | ||
763 | .range = (struct ab8500_reg_range[]) { | ||
764 | { | ||
765 | .first = 0x00, | ||
766 | .last = 0x14, | ||
767 | }, | ||
768 | { | ||
769 | .first = 0x16, | ||
770 | .last = 0x17, | ||
771 | }, | ||
772 | }, | ||
773 | }, | ||
774 | [AB8500_MISC] = { | ||
775 | .num_ranges = 8, | ||
776 | .range = (struct ab8500_reg_range[]) { | ||
777 | { | ||
778 | .first = 0x00, | ||
779 | .last = 0x06, | ||
780 | }, | ||
781 | { | ||
782 | .first = 0x10, | ||
783 | .last = 0x16, | ||
784 | }, | ||
785 | { | ||
786 | .first = 0x20, | ||
787 | .last = 0x26, | ||
788 | }, | ||
789 | { | ||
790 | .first = 0x30, | ||
791 | .last = 0x36, | ||
792 | }, | ||
793 | { | ||
794 | .first = 0x40, | ||
795 | .last = 0x46, | ||
796 | }, | ||
797 | { | ||
798 | .first = 0x50, | ||
799 | .last = 0x50, | ||
800 | }, | ||
801 | { | ||
802 | .first = 0x60, | ||
803 | .last = 0x6B, | ||
804 | }, | ||
805 | { | ||
806 | .first = 0x80, | ||
807 | .last = 0x82, | ||
808 | }, | ||
809 | }, | ||
810 | }, | ||
811 | [AB8500_DEVELOPMENT] = { | ||
812 | .num_ranges = 2, | ||
813 | .range = (struct ab8500_reg_range[]) { | ||
814 | { | ||
815 | .first = 0x00, | ||
816 | .last = 0x00, | ||
817 | }, | ||
818 | { | ||
819 | .first = 0x05, | ||
820 | .last = 0x05, | ||
821 | }, | ||
822 | }, | ||
823 | }, | ||
824 | [AB8500_DEBUG] = { | ||
825 | .num_ranges = 1, | ||
826 | .range = (struct ab8500_reg_range[]) { | ||
827 | { | ||
828 | .first = 0x05, | ||
829 | .last = 0x07, | ||
830 | }, | ||
831 | }, | ||
832 | }, | ||
833 | [AB8500_PROD_TEST] = { | ||
834 | .num_ranges = 0, | ||
835 | .range = NULL, | ||
836 | }, | ||
837 | [AB8500_STE_TEST] = { | ||
838 | .num_ranges = 0, | ||
839 | .range = NULL, | ||
840 | }, | ||
841 | [AB8500_OTP_EMUL] = { | ||
842 | .num_ranges = 1, | ||
843 | .range = (struct ab8500_reg_range[]) { | ||
844 | { | ||
845 | .first = 0x01, | ||
846 | .last = 0x15, | ||
847 | }, | ||
848 | }, | ||
849 | }, | ||
850 | }; | ||
851 | |||
852 | struct ab8500_prcmu_ranges ab8540_debug_ranges[AB8500_NUM_BANKS] = { | ||
853 | [AB8500_M_FSM_RANK] = { | ||
854 | .num_ranges = 1, | ||
855 | .range = (struct ab8500_reg_range[]) { | ||
856 | { | ||
857 | .first = 0x00, | ||
858 | .last = 0x0B, | ||
859 | }, | ||
860 | }, | ||
861 | }, | ||
862 | [AB8500_SYS_CTRL1_BLOCK] = { | ||
863 | .num_ranges = 6, | ||
864 | .range = (struct ab8500_reg_range[]) { | ||
865 | { | ||
866 | .first = 0x00, | ||
867 | .last = 0x04, | ||
868 | }, | ||
869 | { | ||
870 | .first = 0x42, | ||
871 | .last = 0x42, | ||
872 | }, | ||
873 | { | ||
874 | .first = 0x50, | ||
875 | .last = 0x54, | ||
876 | }, | ||
877 | { | ||
878 | .first = 0x57, | ||
879 | .last = 0x57, | ||
880 | }, | ||
881 | { | ||
882 | .first = 0x80, | ||
883 | .last = 0x83, | ||
884 | }, | ||
885 | { | ||
886 | .first = 0x90, | ||
887 | .last = 0x90, | ||
888 | }, | ||
889 | }, | ||
890 | }, | ||
891 | [AB8500_SYS_CTRL2_BLOCK] = { | ||
892 | .num_ranges = 5, | ||
893 | .range = (struct ab8500_reg_range[]) { | ||
894 | { | ||
895 | .first = 0x00, | ||
896 | .last = 0x0D, | ||
897 | }, | ||
898 | { | ||
899 | .first = 0x0F, | ||
900 | .last = 0x10, | ||
901 | }, | ||
902 | { | ||
903 | .first = 0x20, | ||
904 | .last = 0x21, | ||
905 | }, | ||
906 | { | ||
907 | .first = 0x32, | ||
908 | .last = 0x3C, | ||
909 | }, | ||
910 | { | ||
911 | .first = 0x40, | ||
912 | .last = 0x42, | ||
913 | }, | ||
914 | }, | ||
915 | }, | ||
916 | [AB8500_REGU_CTRL1] = { | ||
917 | .num_ranges = 4, | ||
918 | .range = (struct ab8500_reg_range[]) { | ||
919 | { | ||
920 | .first = 0x03, | ||
921 | .last = 0x15, | ||
922 | }, | ||
923 | { | ||
924 | .first = 0x20, | ||
925 | .last = 0x20, | ||
926 | }, | ||
927 | { | ||
928 | .first = 0x80, | ||
929 | .last = 0x85, | ||
930 | }, | ||
931 | { | ||
932 | .first = 0x87, | ||
933 | .last = 0x88, | ||
934 | }, | ||
935 | }, | ||
936 | }, | ||
937 | [AB8500_REGU_CTRL2] = { | ||
938 | .num_ranges = 8, | ||
939 | .range = (struct ab8500_reg_range[]) { | ||
940 | { | ||
941 | .first = 0x00, | ||
942 | .last = 0x06, | ||
943 | }, | ||
944 | { | ||
945 | .first = 0x08, | ||
946 | .last = 0x15, | ||
947 | }, | ||
948 | { | ||
949 | .first = 0x17, | ||
950 | .last = 0x19, | ||
951 | }, | ||
952 | { | ||
953 | .first = 0x1B, | ||
954 | .last = 0x1D, | ||
955 | }, | ||
956 | { | ||
957 | .first = 0x1F, | ||
958 | .last = 0x2F, | ||
959 | }, | ||
960 | { | ||
961 | .first = 0x31, | ||
962 | .last = 0x3A, | ||
963 | }, | ||
964 | { | ||
965 | .first = 0x43, | ||
966 | .last = 0x44, | ||
967 | }, | ||
968 | { | ||
969 | .first = 0x48, | ||
970 | .last = 0x49, | ||
971 | }, | ||
972 | }, | ||
973 | }, | ||
974 | [AB8500_USB] = { | ||
975 | .num_ranges = 3, | ||
976 | .range = (struct ab8500_reg_range[]) { | ||
977 | { | ||
978 | .first = 0x80, | ||
979 | .last = 0x83, | ||
980 | }, | ||
981 | { | ||
982 | .first = 0x87, | ||
983 | .last = 0x8A, | ||
984 | }, | ||
985 | { | ||
986 | .first = 0x91, | ||
987 | .last = 0x94, | ||
988 | }, | ||
989 | }, | ||
990 | }, | ||
991 | [AB8500_TVOUT] = { | ||
992 | .num_ranges = 0, | ||
993 | .range = NULL | ||
994 | }, | ||
995 | [AB8500_DBI] = { | ||
996 | .num_ranges = 4, | ||
997 | .range = (struct ab8500_reg_range[]) { | ||
998 | { | ||
999 | .first = 0x00, | ||
1000 | .last = 0x07, | ||
1001 | }, | ||
1002 | { | ||
1003 | .first = 0x10, | ||
1004 | .last = 0x11, | ||
1005 | }, | ||
1006 | { | ||
1007 | .first = 0x20, | ||
1008 | .last = 0x21, | ||
1009 | }, | ||
1010 | { | ||
1011 | .first = 0x30, | ||
1012 | .last = 0x43, | ||
1013 | }, | ||
1014 | }, | ||
1015 | }, | ||
1016 | [AB8500_ECI_AV_ACC] = { | ||
1017 | .num_ranges = 2, | ||
1018 | .range = (struct ab8500_reg_range[]) { | ||
1019 | { | ||
1020 | .first = 0x00, | ||
1021 | .last = 0x03, | ||
1022 | }, | ||
1023 | { | ||
1024 | .first = 0x80, | ||
1025 | .last = 0x82, | ||
1026 | }, | ||
1027 | }, | ||
1028 | }, | ||
1029 | [AB8500_RESERVED] = { | ||
1030 | .num_ranges = 0, | ||
1031 | .range = NULL, | ||
1032 | }, | ||
1033 | [AB8500_GPADC] = { | ||
1034 | .num_ranges = 4, | ||
1035 | .range = (struct ab8500_reg_range[]) { | ||
1036 | { | ||
1037 | .first = 0x00, | ||
1038 | .last = 0x01, | ||
1039 | }, | ||
1040 | { | ||
1041 | .first = 0x04, | ||
1042 | .last = 0x06, | ||
1043 | }, | ||
1044 | { | ||
1045 | .first = 0x09, | ||
1046 | .last = 0x0A, | ||
1047 | }, | ||
1048 | { | ||
1049 | .first = 0x10, | ||
1050 | .last = 0x14, | ||
1051 | }, | ||
1052 | }, | ||
1053 | }, | ||
1054 | [AB8500_CHARGER] = { | ||
1055 | .num_ranges = 10, | ||
1056 | .range = (struct ab8500_reg_range[]) { | ||
1057 | { | ||
1058 | .first = 0x00, | ||
1059 | .last = 0x00, | ||
1060 | }, | ||
1061 | { | ||
1062 | .first = 0x02, | ||
1063 | .last = 0x05, | ||
1064 | }, | ||
1065 | { | ||
1066 | .first = 0x40, | ||
1067 | .last = 0x44, | ||
1068 | }, | ||
1069 | { | ||
1070 | .first = 0x50, | ||
1071 | .last = 0x57, | ||
1072 | }, | ||
1073 | { | ||
1074 | .first = 0x60, | ||
1075 | .last = 0x60, | ||
1076 | }, | ||
1077 | { | ||
1078 | .first = 0x70, | ||
1079 | .last = 0x70, | ||
1080 | }, | ||
1081 | { | ||
1082 | .first = 0xA0, | ||
1083 | .last = 0xA9, | ||
1084 | }, | ||
1085 | { | ||
1086 | .first = 0xAF, | ||
1087 | .last = 0xB2, | ||
1088 | }, | ||
1089 | { | ||
1090 | .first = 0xC0, | ||
1091 | .last = 0xC6, | ||
1092 | }, | ||
1093 | { | ||
1094 | .first = 0xF5, | ||
1095 | .last = 0xF5, | ||
1096 | }, | ||
1097 | }, | ||
1098 | }, | ||
1099 | [AB8500_GAS_GAUGE] = { | ||
1100 | .num_ranges = 3, | ||
1101 | .range = (struct ab8500_reg_range[]) { | ||
1102 | { | ||
1103 | .first = 0x00, | ||
1104 | .last = 0x00, | ||
1105 | }, | ||
1106 | { | ||
1107 | .first = 0x07, | ||
1108 | .last = 0x0A, | ||
1109 | }, | ||
1110 | { | ||
1111 | .first = 0x10, | ||
1112 | .last = 0x14, | ||
1113 | }, | ||
1114 | }, | ||
1115 | }, | ||
1116 | [AB8500_AUDIO] = { | ||
1117 | .num_ranges = 1, | ||
1118 | .range = (struct ab8500_reg_range[]) { | ||
1119 | { | ||
1120 | .first = 0x00, | ||
1121 | .last = 0x9f, | ||
1122 | }, | ||
1123 | }, | ||
1124 | }, | ||
1125 | [AB8500_INTERRUPT] = { | ||
1126 | .num_ranges = 6, | ||
1127 | .range = (struct ab8500_reg_range[]) { | ||
1128 | { | ||
1129 | .first = 0x00, | ||
1130 | .last = 0x05, | ||
1131 | }, | ||
1132 | { | ||
1133 | .first = 0x0B, | ||
1134 | .last = 0x0D, | ||
1135 | }, | ||
1136 | { | ||
1137 | .first = 0x12, | ||
1138 | .last = 0x20, | ||
1139 | }, | ||
1140 | /* Latch registers should not be read here */ | ||
1141 | { | ||
1142 | .first = 0x40, | ||
1143 | .last = 0x45, | ||
1144 | }, | ||
1145 | { | ||
1146 | .first = 0x4B, | ||
1147 | .last = 0x4D, | ||
1148 | }, | ||
1149 | { | ||
1150 | .first = 0x52, | ||
1151 | .last = 0x60, | ||
1152 | }, | ||
1153 | /* LatchHier registers should not be read here */ | ||
1154 | }, | ||
1155 | }, | ||
1156 | [AB8500_RTC] = { | ||
1157 | .num_ranges = 3, | ||
1158 | .range = (struct ab8500_reg_range[]) { | ||
1159 | { | ||
1160 | .first = 0x00, | ||
1161 | .last = 0x07, | ||
1162 | }, | ||
1163 | { | ||
1164 | .first = 0x0B, | ||
1165 | .last = 0x18, | ||
1166 | }, | ||
1167 | { | ||
1168 | .first = 0x20, | ||
1169 | .last = 0x25, | ||
1170 | }, | ||
1171 | }, | ||
1172 | }, | ||
1173 | [AB8500_MISC] = { | ||
1174 | .num_ranges = 9, | ||
1175 | .range = (struct ab8500_reg_range[]) { | ||
1176 | { | ||
1177 | .first = 0x00, | ||
1178 | .last = 0x06, | ||
1179 | }, | ||
1180 | { | ||
1181 | .first = 0x10, | ||
1182 | .last = 0x16, | ||
1183 | }, | ||
1184 | { | ||
1185 | .first = 0x20, | ||
1186 | .last = 0x26, | ||
1187 | }, | ||
1188 | { | ||
1189 | .first = 0x30, | ||
1190 | .last = 0x36, | ||
1191 | }, | ||
1192 | { | ||
1193 | .first = 0x40, | ||
1194 | .last = 0x49, | ||
1195 | }, | ||
1196 | { | ||
1197 | .first = 0x50, | ||
1198 | .last = 0x50, | ||
1199 | }, | ||
1200 | { | ||
1201 | .first = 0x60, | ||
1202 | .last = 0x6B, | ||
1203 | }, | ||
1204 | { | ||
1205 | .first = 0x70, | ||
1206 | .last = 0x74, | ||
1207 | }, | ||
1208 | { | ||
1209 | .first = 0x80, | ||
1210 | .last = 0x82, | ||
1211 | }, | ||
1212 | }, | ||
1213 | }, | ||
1214 | [AB8500_DEVELOPMENT] = { | ||
1215 | .num_ranges = 3, | ||
1216 | .range = (struct ab8500_reg_range[]) { | ||
1217 | { | ||
1218 | .first = 0x00, | ||
1219 | .last = 0x01, | ||
1220 | }, | ||
1221 | { | ||
1222 | .first = 0x06, | ||
1223 | .last = 0x06, | ||
1224 | }, | ||
1225 | { | ||
1226 | .first = 0x10, | ||
1227 | .last = 0x21, | ||
1228 | }, | ||
1229 | }, | ||
1230 | }, | ||
1231 | [AB8500_DEBUG] = { | ||
1232 | .num_ranges = 3, | ||
1233 | .range = (struct ab8500_reg_range[]) { | ||
1234 | { | ||
1235 | .first = 0x01, | ||
1236 | .last = 0x0C, | ||
1237 | }, | ||
1238 | { | ||
1239 | .first = 0x0E, | ||
1240 | .last = 0x11, | ||
1241 | }, | ||
1242 | { | ||
1243 | .first = 0x80, | ||
1244 | .last = 0x81, | ||
1245 | }, | ||
1246 | }, | ||
1247 | }, | ||
1248 | [AB8500_PROD_TEST] = { | ||
1249 | .num_ranges = 0, | ||
1250 | .range = NULL, | ||
1251 | }, | ||
1252 | [AB8500_STE_TEST] = { | ||
1253 | .num_ranges = 0, | ||
1254 | .range = NULL, | ||
1255 | }, | ||
1256 | [AB8500_OTP_EMUL] = { | ||
1257 | .num_ranges = 1, | ||
1258 | .range = (struct ab8500_reg_range[]) { | ||
1259 | { | ||
1260 | .first = 0x00, | ||
1261 | .last = 0x3F, | ||
1262 | }, | ||
1263 | }, | ||
1264 | }, | ||
1265 | }; | ||
1266 | |||
1267 | |||
482 | static irqreturn_t ab8500_debug_handler(int irq, void *data) | 1268 | static irqreturn_t ab8500_debug_handler(int irq, void *data) |
483 | { | 1269 | { |
484 | char buf[16]; | 1270 | char buf[16]; |
@@ -520,19 +1306,16 @@ static int ab8500_registers_print(struct device *dev, u32 bank, | |||
520 | } | 1306 | } |
521 | 1307 | ||
522 | if (s) { | 1308 | if (s) { |
523 | err = seq_printf(s, " [%u/0x%02X]: 0x%02X\n", | 1309 | err = seq_printf(s, " [0x%02X/0x%02X]: 0x%02X\n", |
524 | bank, reg, value); | 1310 | bank, reg, value); |
525 | if (err < 0) { | 1311 | if (err < 0) { |
526 | dev_err(dev, | ||
527 | "seq_printf overflow bank=%d reg=%d\n", | ||
528 | bank, reg); | ||
529 | /* Error is not returned here since | 1312 | /* Error is not returned here since |
530 | * the output is wanted in any case */ | 1313 | * the output is wanted in any case */ |
531 | return 0; | 1314 | return 0; |
532 | } | 1315 | } |
533 | } else { | 1316 | } else { |
534 | printk(KERN_INFO" [%u/0x%02X]: 0x%02X\n", bank, | 1317 | printk(KERN_INFO" [0x%02X/0x%02X]: 0x%02X\n", |
535 | reg, value); | 1318 | bank, reg, value); |
536 | } | 1319 | } |
537 | } | 1320 | } |
538 | } | 1321 | } |
@@ -546,7 +1329,7 @@ static int ab8500_print_bank_registers(struct seq_file *s, void *p) | |||
546 | 1329 | ||
547 | seq_printf(s, AB8500_NAME_STRING " register values:\n"); | 1330 | seq_printf(s, AB8500_NAME_STRING " register values:\n"); |
548 | 1331 | ||
549 | seq_printf(s, " bank %u:\n", bank); | 1332 | seq_printf(s, " bank 0x%02X:\n", bank); |
550 | 1333 | ||
551 | ab8500_registers_print(dev, bank, s); | 1334 | ab8500_registers_print(dev, bank, s); |
552 | return 0; | 1335 | return 0; |
@@ -573,10 +1356,8 @@ static int ab8500_print_all_banks(struct seq_file *s, void *p) | |||
573 | 1356 | ||
574 | seq_printf(s, AB8500_NAME_STRING " register values:\n"); | 1357 | seq_printf(s, AB8500_NAME_STRING " register values:\n"); |
575 | 1358 | ||
576 | for (i = 1; i < AB8500_NUM_BANKS; i++) { | 1359 | for (i = 0; i < AB8500_NUM_BANKS; i++) { |
577 | err = seq_printf(s, " bank %u:\n", i); | 1360 | err = seq_printf(s, " bank 0x%02X:\n", i); |
578 | if (err < 0) | ||
579 | dev_err(dev, "seq_printf overflow, bank=%d\n", i); | ||
580 | 1361 | ||
581 | ab8500_registers_print(dev, i, s); | 1362 | ab8500_registers_print(dev, i, s); |
582 | } | 1363 | } |
@@ -591,11 +1372,68 @@ void ab8500_dump_all_banks(struct device *dev) | |||
591 | printk(KERN_INFO"ab8500 register values:\n"); | 1372 | printk(KERN_INFO"ab8500 register values:\n"); |
592 | 1373 | ||
593 | for (i = 1; i < AB8500_NUM_BANKS; i++) { | 1374 | for (i = 1; i < AB8500_NUM_BANKS; i++) { |
594 | printk(KERN_INFO" bank %u:\n", i); | 1375 | printk(KERN_INFO" bank 0x%02X:\n", i); |
595 | ab8500_registers_print(dev, i, NULL); | 1376 | ab8500_registers_print(dev, i, NULL); |
596 | } | 1377 | } |
597 | } | 1378 | } |
598 | 1379 | ||
1380 | /* Space for 500 registers. */ | ||
1381 | #define DUMP_MAX_REGS 700 | ||
1382 | struct ab8500_register_dump | ||
1383 | { | ||
1384 | u8 bank; | ||
1385 | u8 reg; | ||
1386 | u8 value; | ||
1387 | } ab8500_complete_register_dump[DUMP_MAX_REGS]; | ||
1388 | |||
1389 | extern int prcmu_abb_read(u8 slave, u8 reg, u8 *value, u8 size); | ||
1390 | |||
1391 | /* This shall only be called upon kernel panic! */ | ||
1392 | void ab8500_dump_all_banks_to_mem(void) | ||
1393 | { | ||
1394 | int i, r = 0; | ||
1395 | u8 bank; | ||
1396 | int err = 0; | ||
1397 | |||
1398 | pr_info("Saving all ABB registers at \"ab8500_complete_register_dump\" " | ||
1399 | "for crash analyze.\n"); | ||
1400 | |||
1401 | for (bank = 0; bank < AB8500_NUM_BANKS; bank++) { | ||
1402 | for (i = 0; i < debug_ranges[bank].num_ranges; i++) { | ||
1403 | u8 reg; | ||
1404 | |||
1405 | for (reg = debug_ranges[bank].range[i].first; | ||
1406 | reg <= debug_ranges[bank].range[i].last; | ||
1407 | reg++) { | ||
1408 | u8 value; | ||
1409 | |||
1410 | err = prcmu_abb_read(bank, reg, &value, 1); | ||
1411 | |||
1412 | if (err < 0) | ||
1413 | goto out; | ||
1414 | |||
1415 | ab8500_complete_register_dump[r].bank = bank; | ||
1416 | ab8500_complete_register_dump[r].reg = reg; | ||
1417 | ab8500_complete_register_dump[r].value = value; | ||
1418 | |||
1419 | r++; | ||
1420 | |||
1421 | if (r >= DUMP_MAX_REGS) { | ||
1422 | pr_err("%s: too many register to dump!\n", | ||
1423 | __func__); | ||
1424 | err = -EINVAL; | ||
1425 | goto out; | ||
1426 | } | ||
1427 | } | ||
1428 | } | ||
1429 | } | ||
1430 | out: | ||
1431 | if (err >= 0) | ||
1432 | pr_info("Saved all ABB registers.\n"); | ||
1433 | else | ||
1434 | pr_info("Failed to save all ABB registers.\n"); | ||
1435 | } | ||
1436 | |||
599 | static int ab8500_all_banks_open(struct inode *inode, struct file *file) | 1437 | static int ab8500_all_banks_open(struct inode *inode, struct file *file) |
600 | { | 1438 | { |
601 | struct seq_file *s; | 1439 | struct seq_file *s; |
@@ -625,7 +1463,7 @@ static const struct file_operations ab8500_all_banks_fops = { | |||
625 | 1463 | ||
626 | static int ab8500_bank_print(struct seq_file *s, void *p) | 1464 | static int ab8500_bank_print(struct seq_file *s, void *p) |
627 | { | 1465 | { |
628 | return seq_printf(s, "%d\n", debug_bank); | 1466 | return seq_printf(s, "0x%02X\n", debug_bank); |
629 | } | 1467 | } |
630 | 1468 | ||
631 | static int ab8500_bank_open(struct inode *inode, struct file *file) | 1469 | static int ab8500_bank_open(struct inode *inode, struct file *file) |
@@ -641,7 +1479,6 @@ static ssize_t ab8500_bank_write(struct file *file, | |||
641 | unsigned long user_bank; | 1479 | unsigned long user_bank; |
642 | int err; | 1480 | int err; |
643 | 1481 | ||
644 | /* Get userspace string and assure termination */ | ||
645 | err = kstrtoul_from_user(user_buf, count, 0, &user_bank); | 1482 | err = kstrtoul_from_user(user_buf, count, 0, &user_bank); |
646 | if (err) | 1483 | if (err) |
647 | return err; | 1484 | return err; |
@@ -667,14 +1504,13 @@ static int ab8500_address_open(struct inode *inode, struct file *file) | |||
667 | } | 1504 | } |
668 | 1505 | ||
669 | static ssize_t ab8500_address_write(struct file *file, | 1506 | static ssize_t ab8500_address_write(struct file *file, |
670 | const char __user *user_buf, | 1507 | const char __user *user_buf, |
671 | size_t count, loff_t *ppos) | 1508 | size_t count, loff_t *ppos) |
672 | { | 1509 | { |
673 | struct device *dev = ((struct seq_file *)(file->private_data))->private; | 1510 | struct device *dev = ((struct seq_file *)(file->private_data))->private; |
674 | unsigned long user_address; | 1511 | unsigned long user_address; |
675 | int err; | 1512 | int err; |
676 | 1513 | ||
677 | /* Get userspace string and assure termination */ | ||
678 | err = kstrtoul_from_user(user_buf, count, 0, &user_address); | 1514 | err = kstrtoul_from_user(user_buf, count, 0, &user_address); |
679 | if (err) | 1515 | if (err) |
680 | return err; | 1516 | return err; |
@@ -684,6 +1520,7 @@ static ssize_t ab8500_address_write(struct file *file, | |||
684 | return -EINVAL; | 1520 | return -EINVAL; |
685 | } | 1521 | } |
686 | debug_address = user_address; | 1522 | debug_address = user_address; |
1523 | |||
687 | return count; | 1524 | return count; |
688 | } | 1525 | } |
689 | 1526 | ||
@@ -711,14 +1548,13 @@ static int ab8500_val_open(struct inode *inode, struct file *file) | |||
711 | } | 1548 | } |
712 | 1549 | ||
713 | static ssize_t ab8500_val_write(struct file *file, | 1550 | static ssize_t ab8500_val_write(struct file *file, |
714 | const char __user *user_buf, | 1551 | const char __user *user_buf, |
715 | size_t count, loff_t *ppos) | 1552 | size_t count, loff_t *ppos) |
716 | { | 1553 | { |
717 | struct device *dev = ((struct seq_file *)(file->private_data))->private; | 1554 | struct device *dev = ((struct seq_file *)(file->private_data))->private; |
718 | unsigned long user_val; | 1555 | unsigned long user_val; |
719 | int err; | 1556 | int err; |
720 | 1557 | ||
721 | /* Get userspace string and assure termination */ | ||
722 | err = kstrtoul_from_user(user_buf, count, 0, &user_val); | 1558 | err = kstrtoul_from_user(user_buf, count, 0, &user_val); |
723 | if (err) | 1559 | if (err) |
724 | return err; | 1560 | return err; |
@@ -741,22 +1577,46 @@ static ssize_t ab8500_val_write(struct file *file, | |||
741 | * Interrupt status | 1577 | * Interrupt status |
742 | */ | 1578 | */ |
743 | static u32 num_interrupts[AB8500_MAX_NR_IRQS]; | 1579 | static u32 num_interrupts[AB8500_MAX_NR_IRQS]; |
1580 | static u32 num_wake_interrupts[AB8500_MAX_NR_IRQS]; | ||
744 | static int num_interrupt_lines; | 1581 | static int num_interrupt_lines; |
745 | 1582 | ||
1583 | bool __attribute__((weak)) suspend_test_wake_cause_interrupt_is_mine(u32 my_int) | ||
1584 | { | ||
1585 | return false; | ||
1586 | } | ||
1587 | |||
746 | void ab8500_debug_register_interrupt(int line) | 1588 | void ab8500_debug_register_interrupt(int line) |
747 | { | 1589 | { |
748 | if (line < num_interrupt_lines) | 1590 | if (line < num_interrupt_lines) { |
749 | num_interrupts[line]++; | 1591 | num_interrupts[line]++; |
1592 | if (suspend_test_wake_cause_interrupt_is_mine(IRQ_DB8500_AB8500)) | ||
1593 | num_wake_interrupts[line]++; | ||
1594 | } | ||
750 | } | 1595 | } |
751 | 1596 | ||
752 | static int ab8500_interrupts_print(struct seq_file *s, void *p) | 1597 | static int ab8500_interrupts_print(struct seq_file *s, void *p) |
753 | { | 1598 | { |
754 | int line; | 1599 | int line; |
755 | 1600 | ||
756 | seq_printf(s, "irq: number of\n"); | 1601 | seq_printf(s, "name: number: number of: wake:\n"); |
757 | 1602 | ||
758 | for (line = 0; line < num_interrupt_lines; line++) | 1603 | for (line = 0; line < num_interrupt_lines; line++) { |
759 | seq_printf(s, "%3i: %6i\n", line, num_interrupts[line]); | 1604 | struct irq_desc *desc = irq_to_desc(line + irq_first); |
1605 | struct irqaction *action = desc->action; | ||
1606 | |||
1607 | seq_printf(s, "%3i: %6i %4i", line, | ||
1608 | num_interrupts[line], | ||
1609 | num_wake_interrupts[line]); | ||
1610 | |||
1611 | if (desc && desc->name) | ||
1612 | seq_printf(s, "-%-8s", desc->name); | ||
1613 | if (action) { | ||
1614 | seq_printf(s, " %s", action->name); | ||
1615 | while ((action = action->next) != NULL) | ||
1616 | seq_printf(s, ", %s", action->name); | ||
1617 | } | ||
1618 | seq_putc(s, '\n'); | ||
1619 | } | ||
760 | 1620 | ||
761 | return 0; | 1621 | return 0; |
762 | } | 1622 | } |
@@ -801,6 +1661,79 @@ static int ab8500_hwreg_open(struct inode *inode, struct file *file) | |||
801 | return single_open(file, ab8500_hwreg_print, inode->i_private); | 1661 | return single_open(file, ab8500_hwreg_print, inode->i_private); |
802 | } | 1662 | } |
803 | 1663 | ||
1664 | #define AB8500_SUPPLY_CONTROL_CONFIG_1 0x01 | ||
1665 | #define AB8500_SUPPLY_CONTROL_REG 0x00 | ||
1666 | #define AB8500_FIRST_SIM_REG 0x80 | ||
1667 | #define AB8500_LAST_SIM_REG 0x8B | ||
1668 | #define AB8505_LAST_SIM_REG 0x8C | ||
1669 | |||
1670 | static int ab8500_print_modem_registers(struct seq_file *s, void *p) | ||
1671 | { | ||
1672 | struct device *dev = s->private; | ||
1673 | struct ab8500 *ab8500; | ||
1674 | int err; | ||
1675 | u8 value; | ||
1676 | u8 orig_value; | ||
1677 | u32 bank = AB8500_REGU_CTRL2; | ||
1678 | u32 last_sim_reg = AB8500_LAST_SIM_REG; | ||
1679 | u32 reg; | ||
1680 | |||
1681 | ab8500 = dev_get_drvdata(dev->parent); | ||
1682 | dev_warn(dev, "WARNING! This operation can interfer with modem side\n" | ||
1683 | "and should only be done with care\n"); | ||
1684 | |||
1685 | err = abx500_get_register_interruptible(dev, | ||
1686 | AB8500_REGU_CTRL1, AB8500_SUPPLY_CONTROL_REG, &orig_value); | ||
1687 | if (err < 0) { | ||
1688 | dev_err(dev, "ab->read fail %d\n", err); | ||
1689 | return err; | ||
1690 | } | ||
1691 | /* Config 1 will allow APE side to read SIM registers */ | ||
1692 | err = abx500_set_register_interruptible(dev, | ||
1693 | AB8500_REGU_CTRL1, AB8500_SUPPLY_CONTROL_REG, | ||
1694 | AB8500_SUPPLY_CONTROL_CONFIG_1); | ||
1695 | if (err < 0) { | ||
1696 | dev_err(dev, "ab->write fail %d\n", err); | ||
1697 | return err; | ||
1698 | } | ||
1699 | |||
1700 | seq_printf(s, " bank 0x%02X:\n", bank); | ||
1701 | |||
1702 | if (is_ab9540(ab8500) || is_ab8505(ab8500)) | ||
1703 | last_sim_reg = AB8505_LAST_SIM_REG; | ||
1704 | |||
1705 | for (reg = AB8500_FIRST_SIM_REG; reg <= last_sim_reg; reg++) { | ||
1706 | err = abx500_get_register_interruptible(dev, | ||
1707 | bank, reg, &value); | ||
1708 | if (err < 0) { | ||
1709 | dev_err(dev, "ab->read fail %d\n", err); | ||
1710 | return err; | ||
1711 | } | ||
1712 | err = seq_printf(s, " [0x%02X/0x%02X]: 0x%02X\n", | ||
1713 | bank, reg, value); | ||
1714 | } | ||
1715 | err = abx500_set_register_interruptible(dev, | ||
1716 | AB8500_REGU_CTRL1, AB8500_SUPPLY_CONTROL_REG, orig_value); | ||
1717 | if (err < 0) { | ||
1718 | dev_err(dev, "ab->write fail %d\n", err); | ||
1719 | return err; | ||
1720 | } | ||
1721 | return 0; | ||
1722 | } | ||
1723 | |||
1724 | static int ab8500_modem_open(struct inode *inode, struct file *file) | ||
1725 | { | ||
1726 | return single_open(file, ab8500_print_modem_registers, inode->i_private); | ||
1727 | } | ||
1728 | |||
1729 | static const struct file_operations ab8500_modem_fops = { | ||
1730 | .open = ab8500_modem_open, | ||
1731 | .read = seq_read, | ||
1732 | .llseek = seq_lseek, | ||
1733 | .release = single_release, | ||
1734 | .owner = THIS_MODULE, | ||
1735 | }; | ||
1736 | |||
804 | static int ab8500_gpadc_bat_ctrl_print(struct seq_file *s, void *p) | 1737 | static int ab8500_gpadc_bat_ctrl_print(struct seq_file *s, void *p) |
805 | { | 1738 | { |
806 | int bat_ctrl_raw; | 1739 | int bat_ctrl_raw; |
@@ -808,12 +1741,13 @@ static int ab8500_gpadc_bat_ctrl_print(struct seq_file *s, void *p) | |||
808 | struct ab8500_gpadc *gpadc; | 1741 | struct ab8500_gpadc *gpadc; |
809 | 1742 | ||
810 | gpadc = ab8500_gpadc_get("ab8500-gpadc.0"); | 1743 | gpadc = ab8500_gpadc_get("ab8500-gpadc.0"); |
811 | bat_ctrl_raw = ab8500_gpadc_read_raw(gpadc, BAT_CTRL); | 1744 | bat_ctrl_raw = ab8500_gpadc_read_raw(gpadc, BAT_CTRL, |
1745 | avg_sample, trig_edge, trig_timer, conv_type); | ||
812 | bat_ctrl_convert = ab8500_gpadc_ad_to_voltage(gpadc, | 1746 | bat_ctrl_convert = ab8500_gpadc_ad_to_voltage(gpadc, |
813 | BAT_CTRL, bat_ctrl_raw); | 1747 | BAT_CTRL, bat_ctrl_raw); |
814 | 1748 | ||
815 | return seq_printf(s, "%d,0x%X\n", | 1749 | return seq_printf(s, "%d,0x%X\n", |
816 | bat_ctrl_convert, bat_ctrl_raw); | 1750 | bat_ctrl_convert, bat_ctrl_raw); |
817 | } | 1751 | } |
818 | 1752 | ||
819 | static int ab8500_gpadc_bat_ctrl_open(struct inode *inode, struct file *file) | 1753 | static int ab8500_gpadc_bat_ctrl_open(struct inode *inode, struct file *file) |
@@ -836,16 +1770,17 @@ static int ab8500_gpadc_btemp_ball_print(struct seq_file *s, void *p) | |||
836 | struct ab8500_gpadc *gpadc; | 1770 | struct ab8500_gpadc *gpadc; |
837 | 1771 | ||
838 | gpadc = ab8500_gpadc_get("ab8500-gpadc.0"); | 1772 | gpadc = ab8500_gpadc_get("ab8500-gpadc.0"); |
839 | btemp_ball_raw = ab8500_gpadc_read_raw(gpadc, BTEMP_BALL); | 1773 | btemp_ball_raw = ab8500_gpadc_read_raw(gpadc, BTEMP_BALL, |
1774 | avg_sample, trig_edge, trig_timer, conv_type); | ||
840 | btemp_ball_convert = ab8500_gpadc_ad_to_voltage(gpadc, BTEMP_BALL, | 1775 | btemp_ball_convert = ab8500_gpadc_ad_to_voltage(gpadc, BTEMP_BALL, |
841 | btemp_ball_raw); | 1776 | btemp_ball_raw); |
842 | 1777 | ||
843 | return seq_printf(s, | 1778 | return seq_printf(s, |
844 | "%d,0x%X\n", btemp_ball_convert, btemp_ball_raw); | 1779 | "%d,0x%X\n", btemp_ball_convert, btemp_ball_raw); |
845 | } | 1780 | } |
846 | 1781 | ||
847 | static int ab8500_gpadc_btemp_ball_open(struct inode *inode, | 1782 | static int ab8500_gpadc_btemp_ball_open(struct inode *inode, |
848 | struct file *file) | 1783 | struct file *file) |
849 | { | 1784 | { |
850 | return single_open(file, ab8500_gpadc_btemp_ball_print, inode->i_private); | 1785 | return single_open(file, ab8500_gpadc_btemp_ball_print, inode->i_private); |
851 | } | 1786 | } |
@@ -865,19 +1800,20 @@ static int ab8500_gpadc_main_charger_v_print(struct seq_file *s, void *p) | |||
865 | struct ab8500_gpadc *gpadc; | 1800 | struct ab8500_gpadc *gpadc; |
866 | 1801 | ||
867 | gpadc = ab8500_gpadc_get("ab8500-gpadc.0"); | 1802 | gpadc = ab8500_gpadc_get("ab8500-gpadc.0"); |
868 | main_charger_v_raw = ab8500_gpadc_read_raw(gpadc, MAIN_CHARGER_V); | 1803 | main_charger_v_raw = ab8500_gpadc_read_raw(gpadc, MAIN_CHARGER_V, |
1804 | avg_sample, trig_edge, trig_timer, conv_type); | ||
869 | main_charger_v_convert = ab8500_gpadc_ad_to_voltage(gpadc, | 1805 | main_charger_v_convert = ab8500_gpadc_ad_to_voltage(gpadc, |
870 | MAIN_CHARGER_V, main_charger_v_raw); | 1806 | MAIN_CHARGER_V, main_charger_v_raw); |
871 | 1807 | ||
872 | return seq_printf(s, "%d,0x%X\n", | 1808 | return seq_printf(s, "%d,0x%X\n", |
873 | main_charger_v_convert, main_charger_v_raw); | 1809 | main_charger_v_convert, main_charger_v_raw); |
874 | } | 1810 | } |
875 | 1811 | ||
876 | static int ab8500_gpadc_main_charger_v_open(struct inode *inode, | 1812 | static int ab8500_gpadc_main_charger_v_open(struct inode *inode, |
877 | struct file *file) | 1813 | struct file *file) |
878 | { | 1814 | { |
879 | return single_open(file, ab8500_gpadc_main_charger_v_print, | 1815 | return single_open(file, ab8500_gpadc_main_charger_v_print, |
880 | inode->i_private); | 1816 | inode->i_private); |
881 | } | 1817 | } |
882 | 1818 | ||
883 | static const struct file_operations ab8500_gpadc_main_charger_v_fops = { | 1819 | static const struct file_operations ab8500_gpadc_main_charger_v_fops = { |
@@ -895,19 +1831,20 @@ static int ab8500_gpadc_acc_detect1_print(struct seq_file *s, void *p) | |||
895 | struct ab8500_gpadc *gpadc; | 1831 | struct ab8500_gpadc *gpadc; |
896 | 1832 | ||
897 | gpadc = ab8500_gpadc_get("ab8500-gpadc.0"); | 1833 | gpadc = ab8500_gpadc_get("ab8500-gpadc.0"); |
898 | acc_detect1_raw = ab8500_gpadc_read_raw(gpadc, ACC_DETECT1); | 1834 | acc_detect1_raw = ab8500_gpadc_read_raw(gpadc, ACC_DETECT1, |
1835 | avg_sample, trig_edge, trig_timer, conv_type); | ||
899 | acc_detect1_convert = ab8500_gpadc_ad_to_voltage(gpadc, ACC_DETECT1, | 1836 | acc_detect1_convert = ab8500_gpadc_ad_to_voltage(gpadc, ACC_DETECT1, |
900 | acc_detect1_raw); | 1837 | acc_detect1_raw); |
901 | 1838 | ||
902 | return seq_printf(s, "%d,0x%X\n", | 1839 | return seq_printf(s, "%d,0x%X\n", |
903 | acc_detect1_convert, acc_detect1_raw); | 1840 | acc_detect1_convert, acc_detect1_raw); |
904 | } | 1841 | } |
905 | 1842 | ||
906 | static int ab8500_gpadc_acc_detect1_open(struct inode *inode, | 1843 | static int ab8500_gpadc_acc_detect1_open(struct inode *inode, |
907 | struct file *file) | 1844 | struct file *file) |
908 | { | 1845 | { |
909 | return single_open(file, ab8500_gpadc_acc_detect1_print, | 1846 | return single_open(file, ab8500_gpadc_acc_detect1_print, |
910 | inode->i_private); | 1847 | inode->i_private); |
911 | } | 1848 | } |
912 | 1849 | ||
913 | static const struct file_operations ab8500_gpadc_acc_detect1_fops = { | 1850 | static const struct file_operations ab8500_gpadc_acc_detect1_fops = { |
@@ -925,19 +1862,20 @@ static int ab8500_gpadc_acc_detect2_print(struct seq_file *s, void *p) | |||
925 | struct ab8500_gpadc *gpadc; | 1862 | struct ab8500_gpadc *gpadc; |
926 | 1863 | ||
927 | gpadc = ab8500_gpadc_get("ab8500-gpadc.0"); | 1864 | gpadc = ab8500_gpadc_get("ab8500-gpadc.0"); |
928 | acc_detect2_raw = ab8500_gpadc_read_raw(gpadc, ACC_DETECT2); | 1865 | acc_detect2_raw = ab8500_gpadc_read_raw(gpadc, ACC_DETECT2, |
1866 | avg_sample, trig_edge, trig_timer, conv_type); | ||
929 | acc_detect2_convert = ab8500_gpadc_ad_to_voltage(gpadc, | 1867 | acc_detect2_convert = ab8500_gpadc_ad_to_voltage(gpadc, |
930 | ACC_DETECT2, acc_detect2_raw); | 1868 | ACC_DETECT2, acc_detect2_raw); |
931 | 1869 | ||
932 | return seq_printf(s, "%d,0x%X\n", | 1870 | return seq_printf(s, "%d,0x%X\n", |
933 | acc_detect2_convert, acc_detect2_raw); | 1871 | acc_detect2_convert, acc_detect2_raw); |
934 | } | 1872 | } |
935 | 1873 | ||
936 | static int ab8500_gpadc_acc_detect2_open(struct inode *inode, | 1874 | static int ab8500_gpadc_acc_detect2_open(struct inode *inode, |
937 | struct file *file) | 1875 | struct file *file) |
938 | { | 1876 | { |
939 | return single_open(file, ab8500_gpadc_acc_detect2_print, | 1877 | return single_open(file, ab8500_gpadc_acc_detect2_print, |
940 | inode->i_private); | 1878 | inode->i_private); |
941 | } | 1879 | } |
942 | 1880 | ||
943 | static const struct file_operations ab8500_gpadc_acc_detect2_fops = { | 1881 | static const struct file_operations ab8500_gpadc_acc_detect2_fops = { |
@@ -955,12 +1893,13 @@ static int ab8500_gpadc_aux1_print(struct seq_file *s, void *p) | |||
955 | struct ab8500_gpadc *gpadc; | 1893 | struct ab8500_gpadc *gpadc; |
956 | 1894 | ||
957 | gpadc = ab8500_gpadc_get("ab8500-gpadc.0"); | 1895 | gpadc = ab8500_gpadc_get("ab8500-gpadc.0"); |
958 | aux1_raw = ab8500_gpadc_read_raw(gpadc, ADC_AUX1); | 1896 | aux1_raw = ab8500_gpadc_read_raw(gpadc, ADC_AUX1, |
1897 | avg_sample, trig_edge, trig_timer, conv_type); | ||
959 | aux1_convert = ab8500_gpadc_ad_to_voltage(gpadc, ADC_AUX1, | 1898 | aux1_convert = ab8500_gpadc_ad_to_voltage(gpadc, ADC_AUX1, |
960 | aux1_raw); | 1899 | aux1_raw); |
961 | 1900 | ||
962 | return seq_printf(s, "%d,0x%X\n", | 1901 | return seq_printf(s, "%d,0x%X\n", |
963 | aux1_convert, aux1_raw); | 1902 | aux1_convert, aux1_raw); |
964 | } | 1903 | } |
965 | 1904 | ||
966 | static int ab8500_gpadc_aux1_open(struct inode *inode, struct file *file) | 1905 | static int ab8500_gpadc_aux1_open(struct inode *inode, struct file *file) |
@@ -983,9 +1922,10 @@ static int ab8500_gpadc_aux2_print(struct seq_file *s, void *p) | |||
983 | struct ab8500_gpadc *gpadc; | 1922 | struct ab8500_gpadc *gpadc; |
984 | 1923 | ||
985 | gpadc = ab8500_gpadc_get("ab8500-gpadc.0"); | 1924 | gpadc = ab8500_gpadc_get("ab8500-gpadc.0"); |
986 | aux2_raw = ab8500_gpadc_read_raw(gpadc, ADC_AUX2); | 1925 | aux2_raw = ab8500_gpadc_read_raw(gpadc, ADC_AUX2, |
1926 | avg_sample, trig_edge, trig_timer, conv_type); | ||
987 | aux2_convert = ab8500_gpadc_ad_to_voltage(gpadc, ADC_AUX2, | 1927 | aux2_convert = ab8500_gpadc_ad_to_voltage(gpadc, ADC_AUX2, |
988 | aux2_raw); | 1928 | aux2_raw); |
989 | 1929 | ||
990 | return seq_printf(s, "%d,0x%X\n", | 1930 | return seq_printf(s, "%d,0x%X\n", |
991 | aux2_convert, aux2_raw); | 1931 | aux2_convert, aux2_raw); |
@@ -1011,16 +1951,17 @@ static int ab8500_gpadc_main_bat_v_print(struct seq_file *s, void *p) | |||
1011 | struct ab8500_gpadc *gpadc; | 1951 | struct ab8500_gpadc *gpadc; |
1012 | 1952 | ||
1013 | gpadc = ab8500_gpadc_get("ab8500-gpadc.0"); | 1953 | gpadc = ab8500_gpadc_get("ab8500-gpadc.0"); |
1014 | main_bat_v_raw = ab8500_gpadc_read_raw(gpadc, MAIN_BAT_V); | 1954 | main_bat_v_raw = ab8500_gpadc_read_raw(gpadc, MAIN_BAT_V, |
1955 | avg_sample, trig_edge, trig_timer, conv_type); | ||
1015 | main_bat_v_convert = ab8500_gpadc_ad_to_voltage(gpadc, MAIN_BAT_V, | 1956 | main_bat_v_convert = ab8500_gpadc_ad_to_voltage(gpadc, MAIN_BAT_V, |
1016 | main_bat_v_raw); | 1957 | main_bat_v_raw); |
1017 | 1958 | ||
1018 | return seq_printf(s, "%d,0x%X\n", | 1959 | return seq_printf(s, "%d,0x%X\n", |
1019 | main_bat_v_convert, main_bat_v_raw); | 1960 | main_bat_v_convert, main_bat_v_raw); |
1020 | } | 1961 | } |
1021 | 1962 | ||
1022 | static int ab8500_gpadc_main_bat_v_open(struct inode *inode, | 1963 | static int ab8500_gpadc_main_bat_v_open(struct inode *inode, |
1023 | struct file *file) | 1964 | struct file *file) |
1024 | { | 1965 | { |
1025 | return single_open(file, ab8500_gpadc_main_bat_v_print, inode->i_private); | 1966 | return single_open(file, ab8500_gpadc_main_bat_v_print, inode->i_private); |
1026 | } | 1967 | } |
@@ -1040,12 +1981,13 @@ static int ab8500_gpadc_vbus_v_print(struct seq_file *s, void *p) | |||
1040 | struct ab8500_gpadc *gpadc; | 1981 | struct ab8500_gpadc *gpadc; |
1041 | 1982 | ||
1042 | gpadc = ab8500_gpadc_get("ab8500-gpadc.0"); | 1983 | gpadc = ab8500_gpadc_get("ab8500-gpadc.0"); |
1043 | vbus_v_raw = ab8500_gpadc_read_raw(gpadc, VBUS_V); | 1984 | vbus_v_raw = ab8500_gpadc_read_raw(gpadc, VBUS_V, |
1985 | avg_sample, trig_edge, trig_timer, conv_type); | ||
1044 | vbus_v_convert = ab8500_gpadc_ad_to_voltage(gpadc, VBUS_V, | 1986 | vbus_v_convert = ab8500_gpadc_ad_to_voltage(gpadc, VBUS_V, |
1045 | vbus_v_raw); | 1987 | vbus_v_raw); |
1046 | 1988 | ||
1047 | return seq_printf(s, "%d,0x%X\n", | 1989 | return seq_printf(s, "%d,0x%X\n", |
1048 | vbus_v_convert, vbus_v_raw); | 1990 | vbus_v_convert, vbus_v_raw); |
1049 | } | 1991 | } |
1050 | 1992 | ||
1051 | static int ab8500_gpadc_vbus_v_open(struct inode *inode, struct file *file) | 1993 | static int ab8500_gpadc_vbus_v_open(struct inode *inode, struct file *file) |
@@ -1068,19 +2010,20 @@ static int ab8500_gpadc_main_charger_c_print(struct seq_file *s, void *p) | |||
1068 | struct ab8500_gpadc *gpadc; | 2010 | struct ab8500_gpadc *gpadc; |
1069 | 2011 | ||
1070 | gpadc = ab8500_gpadc_get("ab8500-gpadc.0"); | 2012 | gpadc = ab8500_gpadc_get("ab8500-gpadc.0"); |
1071 | main_charger_c_raw = ab8500_gpadc_read_raw(gpadc, MAIN_CHARGER_C); | 2013 | main_charger_c_raw = ab8500_gpadc_read_raw(gpadc, MAIN_CHARGER_C, |
2014 | avg_sample, trig_edge, trig_timer, conv_type); | ||
1072 | main_charger_c_convert = ab8500_gpadc_ad_to_voltage(gpadc, | 2015 | main_charger_c_convert = ab8500_gpadc_ad_to_voltage(gpadc, |
1073 | MAIN_CHARGER_C, main_charger_c_raw); | 2016 | MAIN_CHARGER_C, main_charger_c_raw); |
1074 | 2017 | ||
1075 | return seq_printf(s, "%d,0x%X\n", | 2018 | return seq_printf(s, "%d,0x%X\n", |
1076 | main_charger_c_convert, main_charger_c_raw); | 2019 | main_charger_c_convert, main_charger_c_raw); |
1077 | } | 2020 | } |
1078 | 2021 | ||
1079 | static int ab8500_gpadc_main_charger_c_open(struct inode *inode, | 2022 | static int ab8500_gpadc_main_charger_c_open(struct inode *inode, |
1080 | struct file *file) | 2023 | struct file *file) |
1081 | { | 2024 | { |
1082 | return single_open(file, ab8500_gpadc_main_charger_c_print, | 2025 | return single_open(file, ab8500_gpadc_main_charger_c_print, |
1083 | inode->i_private); | 2026 | inode->i_private); |
1084 | } | 2027 | } |
1085 | 2028 | ||
1086 | static const struct file_operations ab8500_gpadc_main_charger_c_fops = { | 2029 | static const struct file_operations ab8500_gpadc_main_charger_c_fops = { |
@@ -1098,19 +2041,20 @@ static int ab8500_gpadc_usb_charger_c_print(struct seq_file *s, void *p) | |||
1098 | struct ab8500_gpadc *gpadc; | 2041 | struct ab8500_gpadc *gpadc; |
1099 | 2042 | ||
1100 | gpadc = ab8500_gpadc_get("ab8500-gpadc.0"); | 2043 | gpadc = ab8500_gpadc_get("ab8500-gpadc.0"); |
1101 | usb_charger_c_raw = ab8500_gpadc_read_raw(gpadc, USB_CHARGER_C); | 2044 | usb_charger_c_raw = ab8500_gpadc_read_raw(gpadc, USB_CHARGER_C, |
2045 | avg_sample, trig_edge, trig_timer, conv_type); | ||
1102 | usb_charger_c_convert = ab8500_gpadc_ad_to_voltage(gpadc, | 2046 | usb_charger_c_convert = ab8500_gpadc_ad_to_voltage(gpadc, |
1103 | USB_CHARGER_C, usb_charger_c_raw); | 2047 | USB_CHARGER_C, usb_charger_c_raw); |
1104 | 2048 | ||
1105 | return seq_printf(s, "%d,0x%X\n", | 2049 | return seq_printf(s, "%d,0x%X\n", |
1106 | usb_charger_c_convert, usb_charger_c_raw); | 2050 | usb_charger_c_convert, usb_charger_c_raw); |
1107 | } | 2051 | } |
1108 | 2052 | ||
1109 | static int ab8500_gpadc_usb_charger_c_open(struct inode *inode, | 2053 | static int ab8500_gpadc_usb_charger_c_open(struct inode *inode, |
1110 | struct file *file) | 2054 | struct file *file) |
1111 | { | 2055 | { |
1112 | return single_open(file, ab8500_gpadc_usb_charger_c_print, | 2056 | return single_open(file, ab8500_gpadc_usb_charger_c_print, |
1113 | inode->i_private); | 2057 | inode->i_private); |
1114 | } | 2058 | } |
1115 | 2059 | ||
1116 | static const struct file_operations ab8500_gpadc_usb_charger_c_fops = { | 2060 | static const struct file_operations ab8500_gpadc_usb_charger_c_fops = { |
@@ -1128,12 +2072,13 @@ static int ab8500_gpadc_bk_bat_v_print(struct seq_file *s, void *p) | |||
1128 | struct ab8500_gpadc *gpadc; | 2072 | struct ab8500_gpadc *gpadc; |
1129 | 2073 | ||
1130 | gpadc = ab8500_gpadc_get("ab8500-gpadc.0"); | 2074 | gpadc = ab8500_gpadc_get("ab8500-gpadc.0"); |
1131 | bk_bat_v_raw = ab8500_gpadc_read_raw(gpadc, BK_BAT_V); | 2075 | bk_bat_v_raw = ab8500_gpadc_read_raw(gpadc, BK_BAT_V, |
2076 | avg_sample, trig_edge, trig_timer, conv_type); | ||
1132 | bk_bat_v_convert = ab8500_gpadc_ad_to_voltage(gpadc, | 2077 | bk_bat_v_convert = ab8500_gpadc_ad_to_voltage(gpadc, |
1133 | BK_BAT_V, bk_bat_v_raw); | 2078 | BK_BAT_V, bk_bat_v_raw); |
1134 | 2079 | ||
1135 | return seq_printf(s, "%d,0x%X\n", | 2080 | return seq_printf(s, "%d,0x%X\n", |
1136 | bk_bat_v_convert, bk_bat_v_raw); | 2081 | bk_bat_v_convert, bk_bat_v_raw); |
1137 | } | 2082 | } |
1138 | 2083 | ||
1139 | static int ab8500_gpadc_bk_bat_v_open(struct inode *inode, struct file *file) | 2084 | static int ab8500_gpadc_bk_bat_v_open(struct inode *inode, struct file *file) |
@@ -1156,12 +2101,13 @@ static int ab8500_gpadc_die_temp_print(struct seq_file *s, void *p) | |||
1156 | struct ab8500_gpadc *gpadc; | 2101 | struct ab8500_gpadc *gpadc; |
1157 | 2102 | ||
1158 | gpadc = ab8500_gpadc_get("ab8500-gpadc.0"); | 2103 | gpadc = ab8500_gpadc_get("ab8500-gpadc.0"); |
1159 | die_temp_raw = ab8500_gpadc_read_raw(gpadc, DIE_TEMP); | 2104 | die_temp_raw = ab8500_gpadc_read_raw(gpadc, DIE_TEMP, |
2105 | avg_sample, trig_edge, trig_timer, conv_type); | ||
1160 | die_temp_convert = ab8500_gpadc_ad_to_voltage(gpadc, DIE_TEMP, | 2106 | die_temp_convert = ab8500_gpadc_ad_to_voltage(gpadc, DIE_TEMP, |
1161 | die_temp_raw); | 2107 | die_temp_raw); |
1162 | 2108 | ||
1163 | return seq_printf(s, "%d,0x%X\n", | 2109 | return seq_printf(s, "%d,0x%X\n", |
1164 | die_temp_convert, die_temp_raw); | 2110 | die_temp_convert, die_temp_raw); |
1165 | } | 2111 | } |
1166 | 2112 | ||
1167 | static int ab8500_gpadc_die_temp_open(struct inode *inode, struct file *file) | 2113 | static int ab8500_gpadc_die_temp_open(struct inode *inode, struct file *file) |
@@ -1177,6 +2123,453 @@ static const struct file_operations ab8500_gpadc_die_temp_fops = { | |||
1177 | .owner = THIS_MODULE, | 2123 | .owner = THIS_MODULE, |
1178 | }; | 2124 | }; |
1179 | 2125 | ||
2126 | static int ab8500_gpadc_usb_id_print(struct seq_file *s, void *p) | ||
2127 | { | ||
2128 | int usb_id_raw; | ||
2129 | int usb_id_convert; | ||
2130 | struct ab8500_gpadc *gpadc; | ||
2131 | |||
2132 | gpadc = ab8500_gpadc_get("ab8500-gpadc.0"); | ||
2133 | usb_id_raw = ab8500_gpadc_read_raw(gpadc, USB_ID, | ||
2134 | avg_sample, trig_edge, trig_timer, conv_type); | ||
2135 | usb_id_convert = ab8500_gpadc_ad_to_voltage(gpadc, USB_ID, | ||
2136 | usb_id_raw); | ||
2137 | |||
2138 | return seq_printf(s, "%d,0x%X\n", | ||
2139 | usb_id_convert, usb_id_raw); | ||
2140 | } | ||
2141 | |||
2142 | static int ab8500_gpadc_usb_id_open(struct inode *inode, struct file *file) | ||
2143 | { | ||
2144 | return single_open(file, ab8500_gpadc_usb_id_print, inode->i_private); | ||
2145 | } | ||
2146 | |||
2147 | static const struct file_operations ab8500_gpadc_usb_id_fops = { | ||
2148 | .open = ab8500_gpadc_usb_id_open, | ||
2149 | .read = seq_read, | ||
2150 | .llseek = seq_lseek, | ||
2151 | .release = single_release, | ||
2152 | .owner = THIS_MODULE, | ||
2153 | }; | ||
2154 | |||
2155 | static int ab8540_gpadc_xtal_temp_print(struct seq_file *s, void *p) | ||
2156 | { | ||
2157 | int xtal_temp_raw; | ||
2158 | int xtal_temp_convert; | ||
2159 | struct ab8500_gpadc *gpadc; | ||
2160 | |||
2161 | gpadc = ab8500_gpadc_get("ab8500-gpadc.0"); | ||
2162 | xtal_temp_raw = ab8500_gpadc_read_raw(gpadc, XTAL_TEMP, | ||
2163 | avg_sample, trig_edge, trig_timer, conv_type); | ||
2164 | xtal_temp_convert = ab8500_gpadc_ad_to_voltage(gpadc, XTAL_TEMP, | ||
2165 | xtal_temp_raw); | ||
2166 | |||
2167 | return seq_printf(s, "%d,0x%X\n", | ||
2168 | xtal_temp_convert, xtal_temp_raw); | ||
2169 | } | ||
2170 | |||
2171 | static int ab8540_gpadc_xtal_temp_open(struct inode *inode, struct file *file) | ||
2172 | { | ||
2173 | return single_open(file, ab8540_gpadc_xtal_temp_print, | ||
2174 | inode->i_private); | ||
2175 | } | ||
2176 | |||
2177 | static const struct file_operations ab8540_gpadc_xtal_temp_fops = { | ||
2178 | .open = ab8540_gpadc_xtal_temp_open, | ||
2179 | .read = seq_read, | ||
2180 | .llseek = seq_lseek, | ||
2181 | .release = single_release, | ||
2182 | .owner = THIS_MODULE, | ||
2183 | }; | ||
2184 | |||
2185 | static int ab8540_gpadc_vbat_true_meas_print(struct seq_file *s, void *p) | ||
2186 | { | ||
2187 | int vbat_true_meas_raw; | ||
2188 | int vbat_true_meas_convert; | ||
2189 | struct ab8500_gpadc *gpadc; | ||
2190 | |||
2191 | gpadc = ab8500_gpadc_get("ab8500-gpadc.0"); | ||
2192 | vbat_true_meas_raw = ab8500_gpadc_read_raw(gpadc, VBAT_TRUE_MEAS, | ||
2193 | avg_sample, trig_edge, trig_timer, conv_type); | ||
2194 | vbat_true_meas_convert = ab8500_gpadc_ad_to_voltage(gpadc, VBAT_TRUE_MEAS, | ||
2195 | vbat_true_meas_raw); | ||
2196 | |||
2197 | return seq_printf(s, "%d,0x%X\n", | ||
2198 | vbat_true_meas_convert, vbat_true_meas_raw); | ||
2199 | } | ||
2200 | |||
2201 | static int ab8540_gpadc_vbat_true_meas_open(struct inode *inode, | ||
2202 | struct file *file) | ||
2203 | { | ||
2204 | return single_open(file, ab8540_gpadc_vbat_true_meas_print, | ||
2205 | inode->i_private); | ||
2206 | } | ||
2207 | |||
2208 | static const struct file_operations ab8540_gpadc_vbat_true_meas_fops = { | ||
2209 | .open = ab8540_gpadc_vbat_true_meas_open, | ||
2210 | .read = seq_read, | ||
2211 | .llseek = seq_lseek, | ||
2212 | .release = single_release, | ||
2213 | .owner = THIS_MODULE, | ||
2214 | }; | ||
2215 | |||
2216 | static int ab8540_gpadc_bat_ctrl_and_ibat_print(struct seq_file *s, void *p) | ||
2217 | { | ||
2218 | int bat_ctrl_raw; | ||
2219 | int bat_ctrl_convert; | ||
2220 | int ibat_raw; | ||
2221 | int ibat_convert; | ||
2222 | struct ab8500_gpadc *gpadc; | ||
2223 | |||
2224 | gpadc = ab8500_gpadc_get("ab8500-gpadc.0"); | ||
2225 | bat_ctrl_raw = ab8500_gpadc_double_read_raw(gpadc, BAT_CTRL_AND_IBAT, | ||
2226 | avg_sample, trig_edge, trig_timer, conv_type, &ibat_raw); | ||
2227 | |||
2228 | bat_ctrl_convert = ab8500_gpadc_ad_to_voltage(gpadc, BAT_CTRL, | ||
2229 | bat_ctrl_raw); | ||
2230 | ibat_convert = ab8500_gpadc_ad_to_voltage(gpadc, IBAT_VIRTUAL_CHANNEL, | ||
2231 | ibat_raw); | ||
2232 | |||
2233 | return seq_printf(s, "%d,0x%X\n" "%d,0x%X\n", | ||
2234 | bat_ctrl_convert, bat_ctrl_raw, | ||
2235 | ibat_convert, ibat_raw); | ||
2236 | } | ||
2237 | |||
2238 | static int ab8540_gpadc_bat_ctrl_and_ibat_open(struct inode *inode, | ||
2239 | struct file *file) | ||
2240 | { | ||
2241 | return single_open(file, ab8540_gpadc_bat_ctrl_and_ibat_print, | ||
2242 | inode->i_private); | ||
2243 | } | ||
2244 | |||
2245 | static const struct file_operations ab8540_gpadc_bat_ctrl_and_ibat_fops = { | ||
2246 | .open = ab8540_gpadc_bat_ctrl_and_ibat_open, | ||
2247 | .read = seq_read, | ||
2248 | .llseek = seq_lseek, | ||
2249 | .release = single_release, | ||
2250 | .owner = THIS_MODULE, | ||
2251 | }; | ||
2252 | |||
2253 | static int ab8540_gpadc_vbat_meas_and_ibat_print(struct seq_file *s, void *p) | ||
2254 | { | ||
2255 | int vbat_meas_raw; | ||
2256 | int vbat_meas_convert; | ||
2257 | int ibat_raw; | ||
2258 | int ibat_convert; | ||
2259 | struct ab8500_gpadc *gpadc; | ||
2260 | |||
2261 | gpadc = ab8500_gpadc_get("ab8500-gpadc.0"); | ||
2262 | vbat_meas_raw = ab8500_gpadc_double_read_raw(gpadc, VBAT_MEAS_AND_IBAT, | ||
2263 | avg_sample, trig_edge, trig_timer, conv_type, &ibat_raw); | ||
2264 | vbat_meas_convert = ab8500_gpadc_ad_to_voltage(gpadc, MAIN_BAT_V, | ||
2265 | vbat_meas_raw); | ||
2266 | ibat_convert = ab8500_gpadc_ad_to_voltage(gpadc, IBAT_VIRTUAL_CHANNEL, | ||
2267 | ibat_raw); | ||
2268 | |||
2269 | return seq_printf(s, "%d,0x%X\n" "%d,0x%X\n", | ||
2270 | vbat_meas_convert, vbat_meas_raw, | ||
2271 | ibat_convert, ibat_raw); | ||
2272 | } | ||
2273 | |||
2274 | static int ab8540_gpadc_vbat_meas_and_ibat_open(struct inode *inode, | ||
2275 | struct file *file) | ||
2276 | { | ||
2277 | return single_open(file, ab8540_gpadc_vbat_meas_and_ibat_print, | ||
2278 | inode->i_private); | ||
2279 | } | ||
2280 | |||
2281 | static const struct file_operations ab8540_gpadc_vbat_meas_and_ibat_fops = { | ||
2282 | .open = ab8540_gpadc_vbat_meas_and_ibat_open, | ||
2283 | .read = seq_read, | ||
2284 | .llseek = seq_lseek, | ||
2285 | .release = single_release, | ||
2286 | .owner = THIS_MODULE, | ||
2287 | }; | ||
2288 | |||
2289 | static int ab8540_gpadc_vbat_true_meas_and_ibat_print(struct seq_file *s, void *p) | ||
2290 | { | ||
2291 | int vbat_true_meas_raw; | ||
2292 | int vbat_true_meas_convert; | ||
2293 | int ibat_raw; | ||
2294 | int ibat_convert; | ||
2295 | struct ab8500_gpadc *gpadc; | ||
2296 | |||
2297 | gpadc = ab8500_gpadc_get("ab8500-gpadc.0"); | ||
2298 | vbat_true_meas_raw = ab8500_gpadc_double_read_raw(gpadc, | ||
2299 | VBAT_TRUE_MEAS_AND_IBAT, avg_sample, trig_edge, | ||
2300 | trig_timer, conv_type, &ibat_raw); | ||
2301 | vbat_true_meas_convert = ab8500_gpadc_ad_to_voltage(gpadc, | ||
2302 | VBAT_TRUE_MEAS, vbat_true_meas_raw); | ||
2303 | ibat_convert = ab8500_gpadc_ad_to_voltage(gpadc, IBAT_VIRTUAL_CHANNEL, | ||
2304 | ibat_raw); | ||
2305 | |||
2306 | return seq_printf(s, "%d,0x%X\n" "%d,0x%X\n", | ||
2307 | vbat_true_meas_convert, vbat_true_meas_raw, | ||
2308 | ibat_convert, ibat_raw); | ||
2309 | } | ||
2310 | |||
2311 | static int ab8540_gpadc_vbat_true_meas_and_ibat_open(struct inode *inode, | ||
2312 | struct file *file) | ||
2313 | { | ||
2314 | return single_open(file, ab8540_gpadc_vbat_true_meas_and_ibat_print, | ||
2315 | inode->i_private); | ||
2316 | } | ||
2317 | |||
2318 | static const struct file_operations ab8540_gpadc_vbat_true_meas_and_ibat_fops = { | ||
2319 | .open = ab8540_gpadc_vbat_true_meas_and_ibat_open, | ||
2320 | .read = seq_read, | ||
2321 | .llseek = seq_lseek, | ||
2322 | .release = single_release, | ||
2323 | .owner = THIS_MODULE, | ||
2324 | }; | ||
2325 | |||
2326 | static int ab8540_gpadc_bat_temp_and_ibat_print(struct seq_file *s, void *p) | ||
2327 | { | ||
2328 | int bat_temp_raw; | ||
2329 | int bat_temp_convert; | ||
2330 | int ibat_raw; | ||
2331 | int ibat_convert; | ||
2332 | struct ab8500_gpadc *gpadc; | ||
2333 | |||
2334 | gpadc = ab8500_gpadc_get("ab8500-gpadc.0"); | ||
2335 | bat_temp_raw = ab8500_gpadc_double_read_raw(gpadc, BAT_TEMP_AND_IBAT, | ||
2336 | avg_sample, trig_edge, trig_timer, conv_type, &ibat_raw); | ||
2337 | bat_temp_convert = ab8500_gpadc_ad_to_voltage(gpadc, BTEMP_BALL, | ||
2338 | bat_temp_raw); | ||
2339 | ibat_convert = ab8500_gpadc_ad_to_voltage(gpadc, IBAT_VIRTUAL_CHANNEL, | ||
2340 | ibat_raw); | ||
2341 | |||
2342 | return seq_printf(s, "%d,0x%X\n" "%d,0x%X\n", | ||
2343 | bat_temp_convert, bat_temp_raw, | ||
2344 | ibat_convert, ibat_raw); | ||
2345 | } | ||
2346 | |||
2347 | static int ab8540_gpadc_bat_temp_and_ibat_open(struct inode *inode, | ||
2348 | struct file *file) | ||
2349 | { | ||
2350 | return single_open(file, ab8540_gpadc_bat_temp_and_ibat_print, | ||
2351 | inode->i_private); | ||
2352 | } | ||
2353 | |||
2354 | static const struct file_operations ab8540_gpadc_bat_temp_and_ibat_fops = { | ||
2355 | .open = ab8540_gpadc_bat_temp_and_ibat_open, | ||
2356 | .read = seq_read, | ||
2357 | .llseek = seq_lseek, | ||
2358 | .release = single_release, | ||
2359 | .owner = THIS_MODULE, | ||
2360 | }; | ||
2361 | |||
2362 | static int ab8540_gpadc_otp_cal_print(struct seq_file *s, void *p) | ||
2363 | { | ||
2364 | struct ab8500_gpadc *gpadc; | ||
2365 | u16 vmain_l, vmain_h, btemp_l, btemp_h; | ||
2366 | u16 vbat_l, vbat_h, ibat_l, ibat_h; | ||
2367 | |||
2368 | gpadc = ab8500_gpadc_get("ab8500-gpadc.0"); | ||
2369 | ab8540_gpadc_get_otp(gpadc, &vmain_l, &vmain_h, &btemp_l, &btemp_h, | ||
2370 | &vbat_l, &vbat_h, &ibat_l, &ibat_h); | ||
2371 | return seq_printf(s, "VMAIN_L:0x%X\n" | ||
2372 | "VMAIN_H:0x%X\n" | ||
2373 | "BTEMP_L:0x%X\n" | ||
2374 | "BTEMP_H:0x%X\n" | ||
2375 | "VBAT_L:0x%X\n" | ||
2376 | "VBAT_H:0x%X\n" | ||
2377 | "IBAT_L:0x%X\n" | ||
2378 | "IBAT_H:0x%X\n", | ||
2379 | vmain_l, vmain_h, btemp_l, btemp_h, vbat_l, vbat_h, ibat_l, ibat_h); | ||
2380 | } | ||
2381 | |||
2382 | static int ab8540_gpadc_otp_cal_open(struct inode *inode, struct file *file) | ||
2383 | { | ||
2384 | return single_open(file, ab8540_gpadc_otp_cal_print, inode->i_private); | ||
2385 | } | ||
2386 | |||
2387 | static const struct file_operations ab8540_gpadc_otp_calib_fops = { | ||
2388 | .open = ab8540_gpadc_otp_cal_open, | ||
2389 | .read = seq_read, | ||
2390 | .llseek = seq_lseek, | ||
2391 | .release = single_release, | ||
2392 | .owner = THIS_MODULE, | ||
2393 | }; | ||
2394 | |||
2395 | static int ab8500_gpadc_avg_sample_print(struct seq_file *s, void *p) | ||
2396 | { | ||
2397 | return seq_printf(s, "%d\n", avg_sample); | ||
2398 | } | ||
2399 | |||
2400 | static int ab8500_gpadc_avg_sample_open(struct inode *inode, struct file *file) | ||
2401 | { | ||
2402 | return single_open(file, ab8500_gpadc_avg_sample_print, | ||
2403 | inode->i_private); | ||
2404 | } | ||
2405 | |||
2406 | static ssize_t ab8500_gpadc_avg_sample_write(struct file *file, | ||
2407 | const char __user *user_buf, | ||
2408 | size_t count, loff_t *ppos) | ||
2409 | { | ||
2410 | struct device *dev = ((struct seq_file *)(file->private_data))->private; | ||
2411 | unsigned long user_avg_sample; | ||
2412 | int err; | ||
2413 | |||
2414 | err = kstrtoul_from_user(user_buf, count, 0, &user_avg_sample); | ||
2415 | if (err) | ||
2416 | return err; | ||
2417 | |||
2418 | if ((user_avg_sample == SAMPLE_1) || (user_avg_sample == SAMPLE_4) | ||
2419 | || (user_avg_sample == SAMPLE_8) | ||
2420 | || (user_avg_sample == SAMPLE_16)) { | ||
2421 | avg_sample = (u8) user_avg_sample; | ||
2422 | } else { | ||
2423 | dev_err(dev, "debugfs error input: " | ||
2424 | "should be egal to 1, 4, 8 or 16\n"); | ||
2425 | return -EINVAL; | ||
2426 | } | ||
2427 | |||
2428 | return count; | ||
2429 | } | ||
2430 | |||
2431 | static const struct file_operations ab8500_gpadc_avg_sample_fops = { | ||
2432 | .open = ab8500_gpadc_avg_sample_open, | ||
2433 | .read = seq_read, | ||
2434 | .write = ab8500_gpadc_avg_sample_write, | ||
2435 | .llseek = seq_lseek, | ||
2436 | .release = single_release, | ||
2437 | .owner = THIS_MODULE, | ||
2438 | }; | ||
2439 | |||
2440 | static int ab8500_gpadc_trig_edge_print(struct seq_file *s, void *p) | ||
2441 | { | ||
2442 | return seq_printf(s, "%d\n", trig_edge); | ||
2443 | } | ||
2444 | |||
2445 | static int ab8500_gpadc_trig_edge_open(struct inode *inode, struct file *file) | ||
2446 | { | ||
2447 | return single_open(file, ab8500_gpadc_trig_edge_print, | ||
2448 | inode->i_private); | ||
2449 | } | ||
2450 | |||
2451 | static ssize_t ab8500_gpadc_trig_edge_write(struct file *file, | ||
2452 | const char __user *user_buf, | ||
2453 | size_t count, loff_t *ppos) | ||
2454 | { | ||
2455 | struct device *dev = ((struct seq_file *)(file->private_data))->private; | ||
2456 | unsigned long user_trig_edge; | ||
2457 | int err; | ||
2458 | |||
2459 | err = kstrtoul_from_user(user_buf, count, 0, &user_trig_edge); | ||
2460 | if (err) | ||
2461 | return err; | ||
2462 | |||
2463 | if ((user_trig_edge == RISING_EDGE) | ||
2464 | || (user_trig_edge == FALLING_EDGE)) { | ||
2465 | trig_edge = (u8) user_trig_edge; | ||
2466 | } else { | ||
2467 | dev_err(dev, "Wrong input:\n" | ||
2468 | "Enter 0. Rising edge\n" | ||
2469 | "Enter 1. Falling edge\n"); | ||
2470 | return -EINVAL; | ||
2471 | } | ||
2472 | |||
2473 | return count; | ||
2474 | } | ||
2475 | |||
2476 | static const struct file_operations ab8500_gpadc_trig_edge_fops = { | ||
2477 | .open = ab8500_gpadc_trig_edge_open, | ||
2478 | .read = seq_read, | ||
2479 | .write = ab8500_gpadc_trig_edge_write, | ||
2480 | .llseek = seq_lseek, | ||
2481 | .release = single_release, | ||
2482 | .owner = THIS_MODULE, | ||
2483 | }; | ||
2484 | |||
2485 | static int ab8500_gpadc_trig_timer_print(struct seq_file *s, void *p) | ||
2486 | { | ||
2487 | return seq_printf(s, "%d\n", trig_timer); | ||
2488 | } | ||
2489 | |||
2490 | static int ab8500_gpadc_trig_timer_open(struct inode *inode, struct file *file) | ||
2491 | { | ||
2492 | return single_open(file, ab8500_gpadc_trig_timer_print, | ||
2493 | inode->i_private); | ||
2494 | } | ||
2495 | |||
2496 | static ssize_t ab8500_gpadc_trig_timer_write(struct file *file, | ||
2497 | const char __user *user_buf, | ||
2498 | size_t count, loff_t *ppos) | ||
2499 | { | ||
2500 | struct device *dev = ((struct seq_file *)(file->private_data))->private; | ||
2501 | unsigned long user_trig_timer; | ||
2502 | int err; | ||
2503 | |||
2504 | err = kstrtoul_from_user(user_buf, count, 0, &user_trig_timer); | ||
2505 | if (err) | ||
2506 | return err; | ||
2507 | |||
2508 | if ((user_trig_timer >= 0) && (user_trig_timer <= 255)) { | ||
2509 | trig_timer = (u8) user_trig_timer; | ||
2510 | } else { | ||
2511 | dev_err(dev, "debugfs error input: " | ||
2512 | "should be beetween 0 to 255\n"); | ||
2513 | return -EINVAL; | ||
2514 | } | ||
2515 | |||
2516 | return count; | ||
2517 | } | ||
2518 | |||
2519 | static const struct file_operations ab8500_gpadc_trig_timer_fops = { | ||
2520 | .open = ab8500_gpadc_trig_timer_open, | ||
2521 | .read = seq_read, | ||
2522 | .write = ab8500_gpadc_trig_timer_write, | ||
2523 | .llseek = seq_lseek, | ||
2524 | .release = single_release, | ||
2525 | .owner = THIS_MODULE, | ||
2526 | }; | ||
2527 | |||
2528 | static int ab8500_gpadc_conv_type_print(struct seq_file *s, void *p) | ||
2529 | { | ||
2530 | return seq_printf(s, "%d\n", conv_type); | ||
2531 | } | ||
2532 | |||
2533 | static int ab8500_gpadc_conv_type_open(struct inode *inode, struct file *file) | ||
2534 | { | ||
2535 | return single_open(file, ab8500_gpadc_conv_type_print, | ||
2536 | inode->i_private); | ||
2537 | } | ||
2538 | |||
2539 | static ssize_t ab8500_gpadc_conv_type_write(struct file *file, | ||
2540 | const char __user *user_buf, | ||
2541 | size_t count, loff_t *ppos) | ||
2542 | { | ||
2543 | struct device *dev = ((struct seq_file *)(file->private_data))->private; | ||
2544 | unsigned long user_conv_type; | ||
2545 | int err; | ||
2546 | |||
2547 | err = kstrtoul_from_user(user_buf, count, 0, &user_conv_type); | ||
2548 | if (err) | ||
2549 | return err; | ||
2550 | |||
2551 | if ((user_conv_type == ADC_SW) | ||
2552 | || (user_conv_type == ADC_HW)) { | ||
2553 | conv_type = (u8) user_conv_type; | ||
2554 | } else { | ||
2555 | dev_err(dev, "Wrong input:\n" | ||
2556 | "Enter 0. ADC SW conversion\n" | ||
2557 | "Enter 1. ADC HW conversion\n"); | ||
2558 | return -EINVAL; | ||
2559 | } | ||
2560 | |||
2561 | return count; | ||
2562 | } | ||
2563 | |||
2564 | static const struct file_operations ab8500_gpadc_conv_type_fops = { | ||
2565 | .open = ab8500_gpadc_conv_type_open, | ||
2566 | .read = seq_read, | ||
2567 | .write = ab8500_gpadc_conv_type_write, | ||
2568 | .llseek = seq_lseek, | ||
2569 | .release = single_release, | ||
2570 | .owner = THIS_MODULE, | ||
2571 | }; | ||
2572 | |||
1180 | /* | 2573 | /* |
1181 | * return length of an ASCII numerical value, 0 is string is not a | 2574 | * return length of an ASCII numerical value, 0 is string is not a |
1182 | * numerical value. | 2575 | * numerical value. |
@@ -1352,7 +2745,7 @@ static int ab8500_subscribe_unsubscribe_open(struct inode *inode, | |||
1352 | struct file *file) | 2745 | struct file *file) |
1353 | { | 2746 | { |
1354 | return single_open(file, ab8500_subscribe_unsubscribe_print, | 2747 | return single_open(file, ab8500_subscribe_unsubscribe_print, |
1355 | inode->i_private); | 2748 | inode->i_private); |
1356 | } | 2749 | } |
1357 | 2750 | ||
1358 | /* | 2751 | /* |
@@ -1382,21 +2775,14 @@ static ssize_t ab8500_subscribe_write(struct file *file, | |||
1382 | size_t count, loff_t *ppos) | 2775 | size_t count, loff_t *ppos) |
1383 | { | 2776 | { |
1384 | struct device *dev = ((struct seq_file *)(file->private_data))->private; | 2777 | struct device *dev = ((struct seq_file *)(file->private_data))->private; |
1385 | char buf[32]; | ||
1386 | int buf_size; | ||
1387 | unsigned long user_val; | 2778 | unsigned long user_val; |
1388 | int err; | 2779 | int err; |
1389 | unsigned int irq_index; | 2780 | unsigned int irq_index; |
1390 | 2781 | ||
1391 | /* Get userspace string and assure termination */ | 2782 | err = kstrtoul_from_user(user_buf, count, 0, &user_val); |
1392 | buf_size = min(count, (sizeof(buf)-1)); | ||
1393 | if (copy_from_user(buf, user_buf, buf_size)) | ||
1394 | return -EFAULT; | ||
1395 | buf[buf_size] = 0; | ||
1396 | |||
1397 | err = strict_strtoul(buf, 0, &user_val); | ||
1398 | if (err) | 2783 | if (err) |
1399 | return -EINVAL; | 2784 | return err; |
2785 | |||
1400 | if (user_val < irq_first) { | 2786 | if (user_val < irq_first) { |
1401 | dev_err(dev, "debugfs error input < %d\n", irq_first); | 2787 | dev_err(dev, "debugfs error input < %d\n", irq_first); |
1402 | return -EINVAL; | 2788 | return -EINVAL; |
@@ -1416,7 +2802,7 @@ static ssize_t ab8500_subscribe_write(struct file *file, | |||
1416 | */ | 2802 | */ |
1417 | dev_attr[irq_index] = kmalloc(sizeof(struct device_attribute), | 2803 | dev_attr[irq_index] = kmalloc(sizeof(struct device_attribute), |
1418 | GFP_KERNEL); | 2804 | GFP_KERNEL); |
1419 | event_name[irq_index] = kmalloc(buf_size, GFP_KERNEL); | 2805 | event_name[irq_index] = kmalloc(count, GFP_KERNEL); |
1420 | sprintf(event_name[irq_index], "%lu", user_val); | 2806 | sprintf(event_name[irq_index], "%lu", user_val); |
1421 | dev_attr[irq_index]->show = show_irq; | 2807 | dev_attr[irq_index]->show = show_irq; |
1422 | dev_attr[irq_index]->store = NULL; | 2808 | dev_attr[irq_index]->store = NULL; |
@@ -1438,7 +2824,7 @@ static ssize_t ab8500_subscribe_write(struct file *file, | |||
1438 | return err; | 2824 | return err; |
1439 | } | 2825 | } |
1440 | 2826 | ||
1441 | return buf_size; | 2827 | return count; |
1442 | } | 2828 | } |
1443 | 2829 | ||
1444 | static ssize_t ab8500_unsubscribe_write(struct file *file, | 2830 | static ssize_t ab8500_unsubscribe_write(struct file *file, |
@@ -1446,21 +2832,14 @@ static ssize_t ab8500_unsubscribe_write(struct file *file, | |||
1446 | size_t count, loff_t *ppos) | 2832 | size_t count, loff_t *ppos) |
1447 | { | 2833 | { |
1448 | struct device *dev = ((struct seq_file *)(file->private_data))->private; | 2834 | struct device *dev = ((struct seq_file *)(file->private_data))->private; |
1449 | char buf[32]; | ||
1450 | int buf_size; | ||
1451 | unsigned long user_val; | 2835 | unsigned long user_val; |
1452 | int err; | 2836 | int err; |
1453 | unsigned int irq_index; | 2837 | unsigned int irq_index; |
1454 | 2838 | ||
1455 | /* Get userspace string and assure termination */ | 2839 | err = kstrtoul_from_user(user_buf, count, 0, &user_val); |
1456 | buf_size = min(count, (sizeof(buf)-1)); | ||
1457 | if (copy_from_user(buf, user_buf, buf_size)) | ||
1458 | return -EFAULT; | ||
1459 | buf[buf_size] = 0; | ||
1460 | |||
1461 | err = strict_strtoul(buf, 0, &user_val); | ||
1462 | if (err) | 2840 | if (err) |
1463 | return -EINVAL; | 2841 | return err; |
2842 | |||
1464 | if (user_val < irq_first) { | 2843 | if (user_val < irq_first) { |
1465 | dev_err(dev, "debugfs error input < %d\n", irq_first); | 2844 | dev_err(dev, "debugfs error input < %d\n", irq_first); |
1466 | return -EINVAL; | 2845 | return -EINVAL; |
@@ -1485,7 +2864,7 @@ static ssize_t ab8500_unsubscribe_write(struct file *file, | |||
1485 | kfree(event_name[irq_index]); | 2864 | kfree(event_name[irq_index]); |
1486 | kfree(dev_attr[irq_index]); | 2865 | kfree(dev_attr[irq_index]); |
1487 | 2866 | ||
1488 | return buf_size; | 2867 | return count; |
1489 | } | 2868 | } |
1490 | 2869 | ||
1491 | /* | 2870 | /* |
@@ -1583,7 +2962,7 @@ static int ab8500_debug_probe(struct platform_device *plf) | |||
1583 | irq_first = platform_get_irq_byname(plf, "IRQ_FIRST"); | 2962 | irq_first = platform_get_irq_byname(plf, "IRQ_FIRST"); |
1584 | if (irq_first < 0) { | 2963 | if (irq_first < 0) { |
1585 | dev_err(&plf->dev, "First irq not found, err %d\n", | 2964 | dev_err(&plf->dev, "First irq not found, err %d\n", |
1586 | irq_first); | 2965 | irq_first); |
1587 | ret = irq_first; | 2966 | ret = irq_first; |
1588 | goto out_freeevent_name; | 2967 | goto out_freeevent_name; |
1589 | } | 2968 | } |
@@ -1591,9 +2970,9 @@ static int ab8500_debug_probe(struct platform_device *plf) | |||
1591 | irq_last = platform_get_irq_byname(plf, "IRQ_LAST"); | 2970 | irq_last = platform_get_irq_byname(plf, "IRQ_LAST"); |
1592 | if (irq_last < 0) { | 2971 | if (irq_last < 0) { |
1593 | dev_err(&plf->dev, "Last irq not found, err %d\n", | 2972 | dev_err(&plf->dev, "Last irq not found, err %d\n", |
1594 | irq_last); | 2973 | irq_last); |
1595 | ret = irq_last; | 2974 | ret = irq_last; |
1596 | goto out_freeevent_name; | 2975 | goto out_freeevent_name; |
1597 | } | 2976 | } |
1598 | 2977 | ||
1599 | ab8500_dir = debugfs_create_dir(AB8500_NAME_STRING, NULL); | 2978 | ab8500_dir = debugfs_create_dir(AB8500_NAME_STRING, NULL); |
@@ -1601,124 +2980,198 @@ static int ab8500_debug_probe(struct platform_device *plf) | |||
1601 | goto err; | 2980 | goto err; |
1602 | 2981 | ||
1603 | ab8500_gpadc_dir = debugfs_create_dir(AB8500_ADC_NAME_STRING, | 2982 | ab8500_gpadc_dir = debugfs_create_dir(AB8500_ADC_NAME_STRING, |
1604 | ab8500_dir); | 2983 | ab8500_dir); |
1605 | if (!ab8500_gpadc_dir) | 2984 | if (!ab8500_gpadc_dir) |
1606 | goto err; | 2985 | goto err; |
1607 | 2986 | ||
1608 | file = debugfs_create_file("all-bank-registers", S_IRUGO, | 2987 | file = debugfs_create_file("all-bank-registers", S_IRUGO, |
1609 | ab8500_dir, &plf->dev, &ab8500_registers_fops); | 2988 | ab8500_dir, &plf->dev, &ab8500_registers_fops); |
1610 | if (!file) | 2989 | if (!file) |
1611 | goto err; | 2990 | goto err; |
1612 | 2991 | ||
1613 | file = debugfs_create_file("all-banks", S_IRUGO, | 2992 | file = debugfs_create_file("all-banks", S_IRUGO, |
1614 | ab8500_dir, &plf->dev, &ab8500_all_banks_fops); | 2993 | ab8500_dir, &plf->dev, &ab8500_all_banks_fops); |
1615 | if (!file) | 2994 | if (!file) |
1616 | goto err; | 2995 | goto err; |
1617 | 2996 | ||
1618 | file = debugfs_create_file("register-bank", (S_IRUGO | S_IWUSR), | 2997 | file = debugfs_create_file("register-bank", (S_IRUGO | S_IWUSR | S_IWGRP), |
1619 | ab8500_dir, &plf->dev, &ab8500_bank_fops); | 2998 | ab8500_dir, &plf->dev, &ab8500_bank_fops); |
1620 | if (!file) | 2999 | if (!file) |
1621 | goto err; | 3000 | goto err; |
1622 | 3001 | ||
1623 | file = debugfs_create_file("register-address", (S_IRUGO | S_IWUSR), | 3002 | file = debugfs_create_file("register-address", (S_IRUGO | S_IWUSR | S_IWGRP), |
1624 | ab8500_dir, &plf->dev, &ab8500_address_fops); | 3003 | ab8500_dir, &plf->dev, &ab8500_address_fops); |
1625 | if (!file) | 3004 | if (!file) |
1626 | goto err; | 3005 | goto err; |
1627 | 3006 | ||
1628 | file = debugfs_create_file("register-value", (S_IRUGO | S_IWUSR), | 3007 | file = debugfs_create_file("register-value", (S_IRUGO | S_IWUSR | S_IWGRP), |
1629 | ab8500_dir, &plf->dev, &ab8500_val_fops); | 3008 | ab8500_dir, &plf->dev, &ab8500_val_fops); |
1630 | if (!file) | 3009 | if (!file) |
1631 | goto err; | 3010 | goto err; |
1632 | 3011 | ||
1633 | file = debugfs_create_file("irq-subscribe", (S_IRUGO | S_IWUSR), | 3012 | file = debugfs_create_file("irq-subscribe", (S_IRUGO | S_IWUSR | S_IWGRP), |
1634 | ab8500_dir, &plf->dev, &ab8500_subscribe_fops); | 3013 | ab8500_dir, &plf->dev, &ab8500_subscribe_fops); |
1635 | if (!file) | 3014 | if (!file) |
1636 | goto err; | 3015 | goto err; |
1637 | 3016 | ||
1638 | if (is_ab8500(ab8500)) | 3017 | if (is_ab8500(ab8500)) { |
3018 | debug_ranges = ab8500_debug_ranges; | ||
1639 | num_interrupt_lines = AB8500_NR_IRQS; | 3019 | num_interrupt_lines = AB8500_NR_IRQS; |
1640 | else if (is_ab8505(ab8500)) | 3020 | } else if (is_ab8505(ab8500)) { |
3021 | debug_ranges = ab8505_debug_ranges; | ||
1641 | num_interrupt_lines = AB8505_NR_IRQS; | 3022 | num_interrupt_lines = AB8505_NR_IRQS; |
1642 | else if (is_ab9540(ab8500)) | 3023 | } else if (is_ab9540(ab8500)) { |
3024 | debug_ranges = ab8505_debug_ranges; | ||
1643 | num_interrupt_lines = AB9540_NR_IRQS; | 3025 | num_interrupt_lines = AB9540_NR_IRQS; |
3026 | } else if (is_ab8540(ab8500)) { | ||
3027 | debug_ranges = ab8540_debug_ranges; | ||
3028 | num_interrupt_lines = AB8540_NR_IRQS; | ||
3029 | } | ||
1644 | 3030 | ||
1645 | file = debugfs_create_file("interrupts", (S_IRUGO), | 3031 | file = debugfs_create_file("interrupts", (S_IRUGO), |
1646 | ab8500_dir, &plf->dev, &ab8500_interrupts_fops); | 3032 | ab8500_dir, &plf->dev, &ab8500_interrupts_fops); |
1647 | if (!file) | 3033 | if (!file) |
1648 | goto err; | 3034 | goto err; |
1649 | 3035 | ||
1650 | file = debugfs_create_file("irq-unsubscribe", (S_IRUGO | S_IWUSR), | 3036 | file = debugfs_create_file("irq-unsubscribe", (S_IRUGO | S_IWUSR | S_IWGRP), |
1651 | ab8500_dir, &plf->dev, &ab8500_unsubscribe_fops); | 3037 | ab8500_dir, &plf->dev, &ab8500_unsubscribe_fops); |
1652 | if (!file) | 3038 | if (!file) |
1653 | goto err; | 3039 | goto err; |
1654 | 3040 | ||
1655 | file = debugfs_create_file("hwreg", (S_IRUGO | S_IWUSR), | 3041 | file = debugfs_create_file("hwreg", (S_IRUGO | S_IWUSR | S_IWGRP), |
1656 | ab8500_dir, &plf->dev, &ab8500_hwreg_fops); | 3042 | ab8500_dir, &plf->dev, &ab8500_hwreg_fops); |
1657 | if (!file) | 3043 | if (!file) |
1658 | goto err; | 3044 | goto err; |
1659 | 3045 | ||
1660 | file = debugfs_create_file("bat_ctrl", (S_IRUGO | S_IWUSR), | 3046 | file = debugfs_create_file("all-modem-registers", (S_IRUGO | S_IWUSR | S_IWGRP), |
1661 | ab8500_gpadc_dir, &plf->dev, &ab8500_gpadc_bat_ctrl_fops); | 3047 | ab8500_dir, &plf->dev, &ab8500_modem_fops); |
1662 | if (!file) | 3048 | if (!file) |
1663 | goto err; | 3049 | goto err; |
1664 | 3050 | ||
1665 | file = debugfs_create_file("btemp_ball", (S_IRUGO | S_IWUSR), | 3051 | file = debugfs_create_file("bat_ctrl", (S_IRUGO | S_IWUSR | S_IWGRP), |
1666 | ab8500_gpadc_dir, &plf->dev, &ab8500_gpadc_btemp_ball_fops); | 3052 | ab8500_gpadc_dir, &plf->dev, &ab8500_gpadc_bat_ctrl_fops); |
1667 | if (!file) | 3053 | if (!file) |
1668 | goto err; | 3054 | goto err; |
1669 | 3055 | ||
1670 | file = debugfs_create_file("main_charger_v", (S_IRUGO | S_IWUSR), | 3056 | file = debugfs_create_file("btemp_ball", (S_IRUGO | S_IWUSR | S_IWGRP), |
1671 | ab8500_gpadc_dir, &plf->dev, &ab8500_gpadc_main_charger_v_fops); | 3057 | ab8500_gpadc_dir, &plf->dev, &ab8500_gpadc_btemp_ball_fops); |
1672 | if (!file) | 3058 | if (!file) |
1673 | goto err; | 3059 | goto err; |
1674 | 3060 | ||
1675 | file = debugfs_create_file("acc_detect1", (S_IRUGO | S_IWUSR), | 3061 | file = debugfs_create_file("main_charger_v", (S_IRUGO | S_IWUSR | S_IWGRP), |
1676 | ab8500_gpadc_dir, &plf->dev, &ab8500_gpadc_acc_detect1_fops); | 3062 | ab8500_gpadc_dir, &plf->dev, &ab8500_gpadc_main_charger_v_fops); |
1677 | if (!file) | 3063 | if (!file) |
1678 | goto err; | 3064 | goto err; |
1679 | 3065 | ||
1680 | file = debugfs_create_file("acc_detect2", (S_IRUGO | S_IWUSR), | 3066 | file = debugfs_create_file("acc_detect1", (S_IRUGO | S_IWUSR | S_IWGRP), |
1681 | ab8500_gpadc_dir, &plf->dev, &ab8500_gpadc_acc_detect2_fops); | 3067 | ab8500_gpadc_dir, &plf->dev, &ab8500_gpadc_acc_detect1_fops); |
1682 | if (!file) | 3068 | if (!file) |
1683 | goto err; | 3069 | goto err; |
1684 | 3070 | ||
1685 | file = debugfs_create_file("adc_aux1", (S_IRUGO | S_IWUSR), | 3071 | file = debugfs_create_file("acc_detect2", (S_IRUGO | S_IWUSR | S_IWGRP), |
1686 | ab8500_gpadc_dir, &plf->dev, &ab8500_gpadc_aux1_fops); | 3072 | ab8500_gpadc_dir, &plf->dev, &ab8500_gpadc_acc_detect2_fops); |
1687 | if (!file) | 3073 | if (!file) |
1688 | goto err; | 3074 | goto err; |
1689 | 3075 | ||
1690 | file = debugfs_create_file("adc_aux2", (S_IRUGO | S_IWUSR), | 3076 | file = debugfs_create_file("adc_aux1", (S_IRUGO | S_IWUSR | S_IWGRP), |
1691 | ab8500_gpadc_dir, &plf->dev, &ab8500_gpadc_aux2_fops); | 3077 | ab8500_gpadc_dir, &plf->dev, &ab8500_gpadc_aux1_fops); |
1692 | if (!file) | 3078 | if (!file) |
1693 | goto err; | 3079 | goto err; |
1694 | 3080 | ||
1695 | file = debugfs_create_file("main_bat_v", (S_IRUGO | S_IWUSR), | 3081 | file = debugfs_create_file("adc_aux2", (S_IRUGO | S_IWUSR | S_IWGRP), |
1696 | ab8500_gpadc_dir, &plf->dev, &ab8500_gpadc_main_bat_v_fops); | 3082 | ab8500_gpadc_dir, &plf->dev, &ab8500_gpadc_aux2_fops); |
1697 | if (!file) | 3083 | if (!file) |
1698 | goto err; | 3084 | goto err; |
1699 | 3085 | ||
1700 | file = debugfs_create_file("vbus_v", (S_IRUGO | S_IWUSR), | 3086 | file = debugfs_create_file("main_bat_v", (S_IRUGO | S_IWUSR | S_IWGRP), |
1701 | ab8500_gpadc_dir, &plf->dev, &ab8500_gpadc_vbus_v_fops); | 3087 | ab8500_gpadc_dir, &plf->dev, &ab8500_gpadc_main_bat_v_fops); |
1702 | if (!file) | 3088 | if (!file) |
1703 | goto err; | 3089 | goto err; |
1704 | 3090 | ||
1705 | file = debugfs_create_file("main_charger_c", (S_IRUGO | S_IWUSR), | 3091 | file = debugfs_create_file("vbus_v", (S_IRUGO | S_IWUSR | S_IWGRP), |
1706 | ab8500_gpadc_dir, &plf->dev, &ab8500_gpadc_main_charger_c_fops); | 3092 | ab8500_gpadc_dir, &plf->dev, &ab8500_gpadc_vbus_v_fops); |
3093 | if (!file) | ||
3094 | goto err; | ||
3095 | |||
3096 | file = debugfs_create_file("main_charger_c", (S_IRUGO | S_IWUSR | S_IWGRP), | ||
3097 | ab8500_gpadc_dir, &plf->dev, &ab8500_gpadc_main_charger_c_fops); | ||
3098 | if (!file) | ||
3099 | goto err; | ||
3100 | |||
3101 | file = debugfs_create_file("usb_charger_c", (S_IRUGO | S_IWUSR | S_IWGRP), | ||
3102 | ab8500_gpadc_dir, &plf->dev, &ab8500_gpadc_usb_charger_c_fops); | ||
3103 | if (!file) | ||
3104 | goto err; | ||
3105 | |||
3106 | file = debugfs_create_file("bk_bat_v", (S_IRUGO | S_IWUSR | S_IWGRP), | ||
3107 | ab8500_gpadc_dir, &plf->dev, &ab8500_gpadc_bk_bat_v_fops); | ||
3108 | if (!file) | ||
3109 | goto err; | ||
3110 | |||
3111 | file = debugfs_create_file("die_temp", (S_IRUGO | S_IWUSR | S_IWGRP), | ||
3112 | ab8500_gpadc_dir, &plf->dev, &ab8500_gpadc_die_temp_fops); | ||
3113 | if (!file) | ||
3114 | goto err; | ||
3115 | |||
3116 | file = debugfs_create_file("usb_id", (S_IRUGO | S_IWUSR | S_IWGRP), | ||
3117 | ab8500_gpadc_dir, &plf->dev, &ab8500_gpadc_usb_id_fops); | ||
3118 | if (!file) | ||
3119 | goto err; | ||
3120 | |||
3121 | if (is_ab8540(ab8500)) { | ||
3122 | file = debugfs_create_file("xtal_temp", (S_IRUGO | S_IWUSR | S_IWGRP), | ||
3123 | ab8500_gpadc_dir, &plf->dev, &ab8540_gpadc_xtal_temp_fops); | ||
3124 | if (!file) | ||
3125 | goto err; | ||
3126 | file = debugfs_create_file("vbattruemeas", (S_IRUGO | S_IWUSR | S_IWGRP), | ||
3127 | ab8500_gpadc_dir, &plf->dev, | ||
3128 | &ab8540_gpadc_vbat_true_meas_fops); | ||
3129 | if (!file) | ||
3130 | goto err; | ||
3131 | file = debugfs_create_file("batctrl_and_ibat", | ||
3132 | (S_IRUGO | S_IWUGO), ab8500_gpadc_dir, | ||
3133 | &plf->dev, &ab8540_gpadc_bat_ctrl_and_ibat_fops); | ||
3134 | if (!file) | ||
3135 | goto err; | ||
3136 | file = debugfs_create_file("vbatmeas_and_ibat", | ||
3137 | (S_IRUGO | S_IWUGO), ab8500_gpadc_dir, | ||
3138 | &plf->dev, | ||
3139 | &ab8540_gpadc_vbat_meas_and_ibat_fops); | ||
3140 | if (!file) | ||
3141 | goto err; | ||
3142 | file = debugfs_create_file("vbattruemeas_and_ibat", | ||
3143 | (S_IRUGO | S_IWUGO), ab8500_gpadc_dir, | ||
3144 | &plf->dev, | ||
3145 | &ab8540_gpadc_vbat_true_meas_and_ibat_fops); | ||
3146 | if (!file) | ||
3147 | goto err; | ||
3148 | file = debugfs_create_file("battemp_and_ibat", | ||
3149 | (S_IRUGO | S_IWUGO), ab8500_gpadc_dir, | ||
3150 | &plf->dev, &ab8540_gpadc_bat_temp_and_ibat_fops); | ||
3151 | if (!file) | ||
3152 | goto err; | ||
3153 | file = debugfs_create_file("otp_calib", (S_IRUGO | S_IWUSR | S_IWGRP), | ||
3154 | ab8500_gpadc_dir, &plf->dev, &ab8540_gpadc_otp_calib_fops); | ||
3155 | if (!file) | ||
3156 | goto err; | ||
3157 | } | ||
3158 | file = debugfs_create_file("avg_sample", (S_IRUGO | S_IWUSR | S_IWGRP), | ||
3159 | ab8500_gpadc_dir, &plf->dev, &ab8500_gpadc_avg_sample_fops); | ||
1707 | if (!file) | 3160 | if (!file) |
1708 | goto err; | 3161 | goto err; |
1709 | 3162 | ||
1710 | file = debugfs_create_file("usb_charger_c", (S_IRUGO | S_IWUSR), | 3163 | file = debugfs_create_file("trig_edge", (S_IRUGO | S_IWUSR | S_IWGRP), |
1711 | ab8500_gpadc_dir, &plf->dev, &ab8500_gpadc_usb_charger_c_fops); | 3164 | ab8500_gpadc_dir, &plf->dev, &ab8500_gpadc_trig_edge_fops); |
1712 | if (!file) | 3165 | if (!file) |
1713 | goto err; | 3166 | goto err; |
1714 | 3167 | ||
1715 | file = debugfs_create_file("bk_bat_v", (S_IRUGO | S_IWUSR), | 3168 | file = debugfs_create_file("trig_timer", (S_IRUGO | S_IWUSR | S_IWGRP), |
1716 | ab8500_gpadc_dir, &plf->dev, &ab8500_gpadc_bk_bat_v_fops); | 3169 | ab8500_gpadc_dir, &plf->dev, &ab8500_gpadc_trig_timer_fops); |
1717 | if (!file) | 3170 | if (!file) |
1718 | goto err; | 3171 | goto err; |
1719 | 3172 | ||
1720 | file = debugfs_create_file("die_temp", (S_IRUGO | S_IWUSR), | 3173 | file = debugfs_create_file("conv_type", (S_IRUGO | S_IWUSR | S_IWGRP), |
1721 | ab8500_gpadc_dir, &plf->dev, &ab8500_gpadc_die_temp_fops); | 3174 | ab8500_gpadc_dir, &plf->dev, &ab8500_gpadc_conv_type_fops); |
1722 | if (!file) | 3175 | if (!file) |
1723 | goto err; | 3176 | goto err; |
1724 | 3177 | ||