2 * Copyright (C) 2007-2011 ST-Ericsson
3 * License terms: GNU General Public License (GPL) version 2
4 * Low-level core for exclusive access to the AB5500 IC on the I2C bus
5 * and some basic chip-configuration.
6 * Author: Bengt Jonsson <bengt.g.jonsson@stericsson.com>
7 * Author: Mattias Nilsson <mattias.i.nilsson@stericsson.com>
8 * Author: Mattias Wallin <mattias.wallin@stericsson.com>
9 * Author: Rickard Andersson <rickard.andersson@stericsson.com>
10 * Author: Karl Komierowski <karl.komierowski@stericsson.com>
11 * Author: Bibek Basu <bibek.basu@stericsson.com>
13 * TODO: Event handling with irq_chip. Waiting for PRCMU fw support.
16 #include <linux/mutex.h>
17 #include <linux/err.h>
18 #include <linux/platform_device.h>
19 #include <linux/slab.h>
20 #include <linux/device.h>
21 #include <linux/irq.h>
22 #include <linux/interrupt.h>
23 #include <linux/random.h>
24 #include <linux/mfd/ab5500/ab5500.h>
25 #include <linux/mfd/abx500.h>
26 #include <linux/list.h>
27 #include <linux/bitops.h>
28 #include <linux/spinlock.h>
29 #include <linux/mfd/core.h>
30 #include <linux/version.h>
31 #include <linux/mfd/db5500-prcmu.h>
33 #include "ab5500-core.h"
34 #include "ab5500-debugfs.h"
36 #define AB5500_NUM_EVENT_REG 23
37 #define AB5500_IT_LATCH0_REG 0x40
38 #define AB5500_IT_MASK0_REG 0x60
41 * Permissible register ranges for reading and writing per device and bank.
43 * The ranges must be listed in increasing address order, and no overlaps are
44 * allowed. It is assumed that write permission implies read permission
45 * (i.e. only RO and RW permissions should be used). Ranges with write
46 * permission must not be split up.
49 #define NO_RANGE {.count = 0, .range = NULL,}
50 static struct ab5500_i2c_banks ab5500_bank_ranges
[AB5500_NUM_DEVICES
] = {
51 [AB5500_DEVID_USB
] = {
53 .bank
= (struct ab5500_i2c_ranges
[]) {
55 .bankid
= AB5500_BANK_USB
,
57 .range
= (struct ab5500_reg_range
[]) {
61 .perm
= AB5500_PERM_RW
,
66 .perm
= AB5500_PERM_RW
,
71 .perm
= AB5500_PERM_RW
,
76 .perm
= AB5500_PERM_RO
,
81 .perm
= AB5500_PERM_RO
,
86 .perm
= AB5500_PERM_RW
,
91 .perm
= AB5500_PERM_RO
,
96 .perm
= AB5500_PERM_RO
,
101 .perm
= AB5500_PERM_RO
,
106 .perm
= AB5500_PERM_RO
,
111 .perm
= AB5500_PERM_RO
,
116 .perm
= AB5500_PERM_RO
,
122 [AB5500_DEVID_ADC
] = {
124 .bank
= (struct ab5500_i2c_ranges
[]) {
126 .bankid
= AB5500_BANK_ADC
,
128 .range
= (struct ab5500_reg_range
[]) {
132 .perm
= AB5500_PERM_RO
,
137 .perm
= AB5500_PERM_RW
,
142 .perm
= AB5500_PERM_RO
,
147 .perm
= AB5500_PERM_RW
,
152 .perm
= AB5500_PERM_RW
,
157 .perm
= AB5500_PERM_RO
,
163 [AB5500_DEVID_LEDS
] = {
165 .bank
= (struct ab5500_i2c_ranges
[]) {
167 .bankid
= AB5500_BANK_LED
,
169 .range
= (struct ab5500_reg_range
[]) {
173 .perm
= AB5500_PERM_RW
,
179 [AB5500_DEVID_VIDEO
] = {
181 .bank
= (struct ab5500_i2c_ranges
[]) {
183 .bankid
= AB5500_BANK_VDENC
,
185 .range
= (struct ab5500_reg_range
[]) {
189 .perm
= AB5500_PERM_RW
,
194 .perm
= AB5500_PERM_RO
,
199 .perm
= AB5500_PERM_RW
,
204 .perm
= AB5500_PERM_RW
,
209 .perm
= AB5500_PERM_RW
,
214 .perm
= AB5500_PERM_RW
,
219 .perm
= AB5500_PERM_RW
,
224 .perm
= AB5500_PERM_RW
,
229 .perm
= AB5500_PERM_RW
,
234 .perm
= AB5500_PERM_RW
,
239 .perm
= AB5500_PERM_RW
,
244 .perm
= AB5500_PERM_RW
,
250 [AB5500_DEVID_REGULATORS
] = {
252 .bank
= (struct ab5500_i2c_ranges
[]) {
254 .bankid
= AB5500_BANK_STARTUP
,
256 .range
= (struct ab5500_reg_range
[]) {
260 .perm
= AB5500_PERM_RW
,
265 .perm
= AB5500_PERM_RW
,
270 .perm
= AB5500_PERM_RO
,
275 .perm
= AB5500_PERM_RW
,
280 .perm
= AB5500_PERM_RW
,
285 .perm
= AB5500_PERM_RW
,
290 .perm
= AB5500_PERM_RW
,
295 .perm
= AB5500_PERM_RW
,
300 .perm
= AB5500_PERM_RW
,
305 .perm
= AB5500_PERM_RW
,
310 .perm
= AB5500_PERM_RW
,
315 .perm
= AB5500_PERM_RW
,
320 .bankid
= AB5500_BANK_SIM_USBSIM
,
322 .range
= (struct ab5500_reg_range
[]) {
326 .perm
= AB5500_PERM_RW
,
332 [AB5500_DEVID_SIM
] = {
334 .bank
= (struct ab5500_i2c_ranges
[]) {
336 .bankid
= AB5500_BANK_SIM_USBSIM
,
338 .range
= (struct ab5500_reg_range
[]) {
342 .perm
= AB5500_PERM_RW
,
348 [AB5500_DEVID_RTC
] = {
350 .bank
= (struct ab5500_i2c_ranges
[]) {
352 .bankid
= AB5500_BANK_RTC
,
354 .range
= (struct ab5500_reg_range
[]) {
358 .perm
= AB5500_PERM_RW
,
363 .perm
= AB5500_PERM_RW
,
369 [AB5500_DEVID_CHARGER
] = {
371 .bank
= (struct ab5500_i2c_ranges
[]) {
373 .bankid
= AB5500_BANK_CHG
,
375 .range
= (struct ab5500_reg_range
[]) {
379 .perm
= AB5500_PERM_RO
,
384 .perm
= AB5500_PERM_RW
,
390 [AB5500_DEVID_FUELGAUGE
] = {
392 .bank
= (struct ab5500_i2c_ranges
[]) {
394 .bankid
= AB5500_BANK_FG_BATTCOM_ACC
,
396 .range
= (struct ab5500_reg_range
[]) {
400 .perm
= AB5500_PERM_RO
,
405 .perm
= AB5500_PERM_RW
,
411 [AB5500_DEVID_VIBRATOR
] = {
413 .bank
= (struct ab5500_i2c_ranges
[]) {
415 .bankid
= AB5500_BANK_VIBRA
,
417 .range
= (struct ab5500_reg_range
[]) {
421 .perm
= AB5500_PERM_RW
,
426 .perm
= AB5500_PERM_RW
,
432 [AB5500_DEVID_CODEC
] = {
434 .bank
= (struct ab5500_i2c_ranges
[]) {
436 .bankid
= AB5500_BANK_AUDIO_HEADSETUSB
,
438 .range
= (struct ab5500_reg_range
[]) {
442 .perm
= AB5500_PERM_RW
,
447 .perm
= AB5500_PERM_RW
,
453 [AB5500_DEVID_POWER
] = {
455 .bank
= (struct ab5500_i2c_ranges
[]) {
457 .bankid
= AB5500_BANK_STARTUP
,
459 .range
= (struct ab5500_reg_range
[]) {
463 .perm
= AB5500_PERM_RW
,
468 .bankid
= AB5500_BANK_VIT_IO_I2C_CLK_TST_OTP
,
470 .range
= (struct ab5500_reg_range
[]) {
474 .perm
= AB5500_PERM_RW
,
482 #define AB5500_IRQ(bank, bit) ((bank) * 8 + (bit))
484 /* I appologize for the resource names beeing a mix of upper case
485 * and lower case but I want them to be exact as the documentation */
486 static struct mfd_cell ab5500_devs
[AB5500_NUM_DEVICES
] = {
487 [AB5500_DEVID_LEDS
] = {
488 .name
= "ab5500-leds",
489 .id
= AB5500_DEVID_LEDS
,
491 [AB5500_DEVID_POWER
] = {
492 .name
= "ab5500-power",
493 .id
= AB5500_DEVID_POWER
,
495 [AB5500_DEVID_REGULATORS
] = {
496 .name
= "ab5500-regulator",
497 .id
= AB5500_DEVID_REGULATORS
,
499 [AB5500_DEVID_SIM
] = {
500 .name
= "ab5500-sim",
501 .id
= AB5500_DEVID_SIM
,
503 .resources
= (struct resource
[]) {
506 .flags
= IORESOURCE_IRQ
,
507 .start
= AB5500_IRQ(2, 0), /*rising*/
508 .end
= AB5500_IRQ(2, 1), /*falling*/
512 [AB5500_DEVID_RTC
] = {
513 .name
= "ab5500-rtc",
514 .id
= AB5500_DEVID_RTC
,
516 .resources
= (struct resource
[]) {
519 .flags
= IORESOURCE_IRQ
,
520 .start
= AB5500_IRQ(1, 7),
521 .end
= AB5500_IRQ(1, 7),
525 [AB5500_DEVID_CHARGER
] = {
526 .name
= "ab5500-charger",
527 .id
= AB5500_DEVID_CHARGER
,
529 [AB5500_DEVID_ADC
] = {
530 .name
= "ab5500-adc",
531 .id
= AB5500_DEVID_ADC
,
533 .resources
= (struct resource
[]) {
536 .flags
= IORESOURCE_IRQ
,
537 .start
= AB5500_IRQ(0, 0),
538 .end
= AB5500_IRQ(0, 0),
542 .flags
= IORESOURCE_IRQ
,
543 .start
= AB5500_IRQ(0, 1),
544 .end
= AB5500_IRQ(0, 1),
548 .flags
= IORESOURCE_IRQ
,
549 .start
= AB5500_IRQ(0, 2),
550 .end
= AB5500_IRQ(0, 2),
554 .flags
= IORESOURCE_IRQ
,
555 .start
= AB5500_IRQ(0, 3),
556 .end
= AB5500_IRQ(0, 3),
560 .flags
= IORESOURCE_IRQ
,
561 .start
= AB5500_IRQ(0, 4),
562 .end
= AB5500_IRQ(0, 4),
566 .flags
= IORESOURCE_IRQ
,
567 .start
= AB5500_IRQ(0, 5),
568 .end
= AB5500_IRQ(0, 5),
572 .flags
= IORESOURCE_IRQ
,
573 .start
= AB5500_IRQ(0, 6),
574 .end
= AB5500_IRQ(0, 6),
578 .flags
= IORESOURCE_IRQ
,
579 .start
= AB5500_IRQ(0, 7),
580 .end
= AB5500_IRQ(0, 7),
583 .name
= "TRIGGER-VBAT",
584 .flags
= IORESOURCE_IRQ
,
585 .start
= AB5500_IRQ(0, 8),
586 .end
= AB5500_IRQ(0, 8),
589 .name
= "TRIGGER-VBAT-TXON",
590 .flags
= IORESOURCE_IRQ
,
591 .start
= AB5500_IRQ(0, 9),
592 .end
= AB5500_IRQ(0, 9),
596 [AB5500_DEVID_FUELGAUGE
] = {
597 .name
= "ab5500-fuelgauge",
598 .id
= AB5500_DEVID_FUELGAUGE
,
600 .resources
= (struct resource
[]) {
602 .name
= "Batt_attach",
603 .flags
= IORESOURCE_IRQ
,
604 .start
= AB5500_IRQ(7, 5),
605 .end
= AB5500_IRQ(7, 5),
608 .name
= "Batt_removal",
609 .flags
= IORESOURCE_IRQ
,
610 .start
= AB5500_IRQ(7, 6),
611 .end
= AB5500_IRQ(7, 6),
614 .name
= "UART_framing",
615 .flags
= IORESOURCE_IRQ
,
616 .start
= AB5500_IRQ(7, 7),
617 .end
= AB5500_IRQ(7, 7),
620 .name
= "UART_overrun",
621 .flags
= IORESOURCE_IRQ
,
622 .start
= AB5500_IRQ(8, 0),
623 .end
= AB5500_IRQ(8, 0),
626 .name
= "UART_Rdy_RX",
627 .flags
= IORESOURCE_IRQ
,
628 .start
= AB5500_IRQ(8, 1),
629 .end
= AB5500_IRQ(8, 1),
632 .name
= "UART_Rdy_TX",
633 .flags
= IORESOURCE_IRQ
,
634 .start
= AB5500_IRQ(8, 2),
635 .end
= AB5500_IRQ(8, 2),
639 [AB5500_DEVID_VIBRATOR
] = {
640 .name
= "ab5500-vibrator",
641 .id
= AB5500_DEVID_VIBRATOR
,
643 [AB5500_DEVID_CODEC
] = {
644 .name
= "ab5500-codec",
645 .id
= AB5500_DEVID_CODEC
,
647 .resources
= (struct resource
[]) {
649 .name
= "audio_spkr1_ovc",
650 .flags
= IORESOURCE_IRQ
,
651 .start
= AB5500_IRQ(9, 5),
652 .end
= AB5500_IRQ(9, 5),
655 .name
= "audio_plllocked",
656 .flags
= IORESOURCE_IRQ
,
657 .start
= AB5500_IRQ(9, 6),
658 .end
= AB5500_IRQ(9, 6),
661 .name
= "audio_spkr2_ovc",
662 .flags
= IORESOURCE_IRQ
,
663 .start
= AB5500_IRQ(17, 4),
664 .end
= AB5500_IRQ(17, 4),
668 [AB5500_DEVID_USB
] = {
669 .name
= "ab5500-usb",
670 .id
= AB5500_DEVID_USB
,
672 .resources
= (struct resource
[]) {
674 .name
= "Link_Update",
675 .flags
= IORESOURCE_IRQ
,
676 .start
= AB5500_IRQ(22, 1),
677 .end
= AB5500_IRQ(22, 1),
681 .flags
= IORESOURCE_IRQ
,
682 .start
= AB5500_IRQ(8, 3),
683 .end
= AB5500_IRQ(8, 4),
687 .flags
= IORESOURCE_IRQ
,
688 .start
= AB5500_IRQ(8, 5),
689 .end
= AB5500_IRQ(8, 5),
693 .flags
= IORESOURCE_IRQ
,
694 .start
= AB5500_IRQ(8, 6),
695 .end
= AB5500_IRQ(8, 6),
698 .name
= "CHGstate_10_PCVBUSchg",
699 .flags
= IORESOURCE_IRQ
,
700 .start
= AB5500_IRQ(8, 7),
701 .end
= AB5500_IRQ(8, 7),
704 .name
= "DCIOreverse_ovc",
705 .flags
= IORESOURCE_IRQ
,
706 .start
= AB5500_IRQ(9, 0),
707 .end
= AB5500_IRQ(9, 0),
710 .name
= "USBCharDetDone",
711 .flags
= IORESOURCE_IRQ
,
712 .start
= AB5500_IRQ(9, 1),
713 .end
= AB5500_IRQ(9, 1),
716 .name
= "DCIO_no_limit",
717 .flags
= IORESOURCE_IRQ
,
718 .start
= AB5500_IRQ(9, 2),
719 .end
= AB5500_IRQ(9, 2),
722 .name
= "USB_suspend",
723 .flags
= IORESOURCE_IRQ
,
724 .start
= AB5500_IRQ(9, 3),
725 .end
= AB5500_IRQ(9, 3),
728 .name
= "DCIOreverse_fwdcurrent",
729 .flags
= IORESOURCE_IRQ
,
730 .start
= AB5500_IRQ(9, 4),
731 .end
= AB5500_IRQ(9, 4),
734 .name
= "Vbus_Imeasmax_change",
735 .flags
= IORESOURCE_IRQ
,
736 .start
= AB5500_IRQ(9, 5),
737 .end
= AB5500_IRQ(9, 6),
741 .flags
= IORESOURCE_IRQ
,
742 .start
= AB5500_IRQ(14, 5),
743 .end
= AB5500_IRQ(14, 5),
746 .name
= "USBcharging_NOTok",
747 .flags
= IORESOURCE_IRQ
,
748 .start
= AB5500_IRQ(15, 3),
749 .end
= AB5500_IRQ(15, 3),
752 .name
= "usb_adp_sensoroff",
753 .flags
= IORESOURCE_IRQ
,
754 .start
= AB5500_IRQ(15, 6),
755 .end
= AB5500_IRQ(15, 6),
758 .name
= "usb_adp_probeplug",
759 .flags
= IORESOURCE_IRQ
,
760 .start
= AB5500_IRQ(15, 7),
761 .end
= AB5500_IRQ(15, 7),
764 .name
= "usb_adp_sinkerror",
765 .flags
= IORESOURCE_IRQ
,
766 .start
= AB5500_IRQ(16, 0),
767 .end
= AB5500_IRQ(16, 6),
770 .name
= "usb_adp_sourceerror",
771 .flags
= IORESOURCE_IRQ
,
772 .start
= AB5500_IRQ(16, 1),
773 .end
= AB5500_IRQ(16, 1),
776 .name
= "usb_idgnd_r",
777 .flags
= IORESOURCE_IRQ
,
778 .start
= AB5500_IRQ(16, 2),
779 .end
= AB5500_IRQ(16, 2),
782 .name
= "usb_idgnd_f",
783 .flags
= IORESOURCE_IRQ
,
784 .start
= AB5500_IRQ(16, 3),
785 .end
= AB5500_IRQ(16, 3),
788 .name
= "usb_iddetR1",
789 .flags
= IORESOURCE_IRQ
,
790 .start
= AB5500_IRQ(16, 4),
791 .end
= AB5500_IRQ(16, 5),
794 .name
= "usb_iddetR2",
795 .flags
= IORESOURCE_IRQ
,
796 .start
= AB5500_IRQ(16, 6),
797 .end
= AB5500_IRQ(16, 7),
800 .name
= "usb_iddetR3",
801 .flags
= IORESOURCE_IRQ
,
802 .start
= AB5500_IRQ(17, 0),
803 .end
= AB5500_IRQ(17, 1),
806 .name
= "usb_iddetR4",
807 .flags
= IORESOURCE_IRQ
,
808 .start
= AB5500_IRQ(17, 2),
809 .end
= AB5500_IRQ(17, 3),
812 .name
= "CharTempWindowOk",
813 .flags
= IORESOURCE_IRQ
,
814 .start
= AB5500_IRQ(17, 7),
815 .end
= AB5500_IRQ(18, 0),
818 .name
= "USB_SprDetect",
819 .flags
= IORESOURCE_IRQ
,
820 .start
= AB5500_IRQ(18, 1),
821 .end
= AB5500_IRQ(18, 1),
824 .name
= "usb_adp_probe_unplug",
825 .flags
= IORESOURCE_IRQ
,
826 .start
= AB5500_IRQ(18, 2),
827 .end
= AB5500_IRQ(18, 2),
830 .name
= "VBUSChDrop",
831 .flags
= IORESOURCE_IRQ
,
832 .start
= AB5500_IRQ(18, 3),
833 .end
= AB5500_IRQ(18, 4),
836 .name
= "dcio_char_rec_done",
837 .flags
= IORESOURCE_IRQ
,
838 .start
= AB5500_IRQ(18, 5),
839 .end
= AB5500_IRQ(18, 5),
842 .name
= "Charging_stopped_by_temp",
843 .flags
= IORESOURCE_IRQ
,
844 .start
= AB5500_IRQ(18, 6),
845 .end
= AB5500_IRQ(18, 6),
848 .name
= "CHGstate_11_SafeModeVBUS",
849 .flags
= IORESOURCE_IRQ
,
850 .start
= AB5500_IRQ(21, 1),
851 .end
= AB5500_IRQ(21, 2),
854 .name
= "CHGstate_12_comletedVBUS",
855 .flags
= IORESOURCE_IRQ
,
856 .start
= AB5500_IRQ(21, 2),
857 .end
= AB5500_IRQ(21, 2),
860 .name
= "CHGstate_13_completedVBUS",
861 .flags
= IORESOURCE_IRQ
,
862 .start
= AB5500_IRQ(21, 3),
863 .end
= AB5500_IRQ(21, 3),
866 .name
= "CHGstate_14_FullChgDCIO",
867 .flags
= IORESOURCE_IRQ
,
868 .start
= AB5500_IRQ(21, 4),
869 .end
= AB5500_IRQ(21, 4),
872 .name
= "CHGstate_15_SafeModeDCIO",
873 .flags
= IORESOURCE_IRQ
,
874 .start
= AB5500_IRQ(21, 5),
875 .end
= AB5500_IRQ(21, 5),
878 .name
= "CHGstate_16_OFFsuspendDCIO",
879 .flags
= IORESOURCE_IRQ
,
880 .start
= AB5500_IRQ(21, 6),
881 .end
= AB5500_IRQ(21, 6),
884 .name
= "CHGstate_17_completedDCIO",
885 .flags
= IORESOURCE_IRQ
,
886 .start
= AB5500_IRQ(21, 7),
887 .end
= AB5500_IRQ(21, 7),
891 [AB5500_DEVID_OTP
] = {
892 .name
= "ab5500-otp",
893 .id
= AB5500_DEVID_OTP
,
895 [AB5500_DEVID_VIDEO
] = {
896 .name
= "ab5500-video",
897 .id
= AB5500_DEVID_VIDEO
,
899 .resources
= (struct resource
[]) {
902 .flags
= IORESOURCE_IRQ
,
903 .start
= AB5500_IRQ(22, 2),
904 .end
= AB5500_IRQ(22, 2),
908 [AB5500_DEVID_DBIECI
] = {
909 .name
= "ab5500-dbieci",
910 .id
= AB5500_DEVID_DBIECI
,
912 .resources
= (struct resource
[]) {
915 .flags
= IORESOURCE_IRQ
,
916 .start
= AB5500_IRQ(14, 0),
917 .end
= AB5500_IRQ(14, 0),
921 .flags
= IORESOURCE_IRQ
,
922 .start
= AB5500_IRQ(14, 1),
923 .end
= AB5500_IRQ(14, 1),
927 .flags
= IORESOURCE_IRQ
,
928 .start
= AB5500_IRQ(14, 2),
929 .end
= AB5500_IRQ(14, 2),
933 .flags
= IORESOURCE_IRQ
,
934 .start
= AB5500_IRQ(14, 3),
935 .end
= AB5500_IRQ(14, 3),
938 .name
= "BSI_indicator",
939 .flags
= IORESOURCE_IRQ
,
940 .start
= AB5500_IRQ(14, 4),
941 .end
= AB5500_IRQ(14, 4),
945 .flags
= IORESOURCE_IRQ
,
946 .start
= AB5500_IRQ(14, 6),
947 .end
= AB5500_IRQ(14, 6),
951 .flags
= IORESOURCE_IRQ
,
952 .start
= AB5500_IRQ(14, 7),
953 .end
= AB5500_IRQ(14, 7),
957 .flags
= IORESOURCE_IRQ
,
958 .start
= AB5500_IRQ(15, 0),
959 .end
= AB5500_IRQ(15, 0),
963 .flags
= IORESOURCE_IRQ
,
964 .start
= AB5500_IRQ(15, 1),
965 .end
= AB5500_IRQ(15, 1),
969 .flags
= IORESOURCE_IRQ
,
970 .start
= AB5500_IRQ(15, 2),
971 .end
= AB5500_IRQ(15, 2),
975 [AB5500_DEVID_ONSWA
] = {
976 .name
= "ab5500-onswa",
977 .id
= AB5500_DEVID_ONSWA
,
979 .resources
= (struct resource
[]) {
981 .name
= "ONSWAn_rising",
982 .flags
= IORESOURCE_IRQ
,
983 .start
= AB5500_IRQ(1, 3),
984 .end
= AB5500_IRQ(1, 3),
987 .name
= "ONSWAn_falling",
988 .flags
= IORESOURCE_IRQ
,
989 .start
= AB5500_IRQ(1, 4),
990 .end
= AB5500_IRQ(1, 4),
997 * Functionality for getting/setting register values.
999 int ab5500_get_register_interruptible_raw(struct ab5500
*ab
,
1005 if (bank
>= AB5500_NUM_BANKS
)
1008 err
= mutex_lock_interruptible(&ab
->access_mutex
);
1011 err
= db5500_prcmu_abb_read(bankinfo
[bank
].slave_addr
, reg
, value
, 1);
1013 mutex_unlock(&ab
->access_mutex
);
1017 static int get_register_page_interruptible(struct ab5500
*ab
, u8 bank
,
1018 u8 first_reg
, u8
*regvals
, u8 numregs
)
1022 if (bank
>= AB5500_NUM_BANKS
)
1025 err
= mutex_lock_interruptible(&ab
->access_mutex
);
1030 /* The hardware limit for get page is 4 */
1031 u8 curnum
= min_t(u8
, numregs
, 4u);
1033 err
= db5500_prcmu_abb_read(bankinfo
[bank
].slave_addr
,
1034 first_reg
, regvals
, curnum
);
1039 first_reg
+= curnum
;
1044 mutex_unlock(&ab
->access_mutex
);
1048 int ab5500_mask_and_set_register_interruptible_raw(struct ab5500
*ab
, u8 bank
,
1049 u8 reg
, u8 bitmask
, u8 bitvalues
)
1053 if (bank
>= AB5500_NUM_BANKS
)
1059 err
= mutex_lock_interruptible(&ab
->access_mutex
);
1063 if (bitmask
== 0xFF) /* No need to read in this case. */
1065 else { /* Read and modify the register value. */
1066 err
= db5500_prcmu_abb_read(bankinfo
[bank
].slave_addr
,
1071 buf
= ((~bitmask
& buf
) | (bitmask
& bitvalues
));
1073 /* Write the new value. */
1074 err
= db5500_prcmu_abb_write(bankinfo
[bank
].slave_addr
, reg
,
1077 mutex_unlock(&ab
->access_mutex
);
1083 set_register_interruptible(struct ab5500
*ab
, u8 bank
, u8 reg
, u8 value
)
1085 return ab5500_mask_and_set_register_interruptible_raw(ab
, bank
, reg
,
1090 * Read/write permission checking functions.
1092 static const struct ab5500_i2c_ranges
*get_bankref(u8 devid
, u8 bank
)
1096 if (devid
< AB5500_NUM_DEVICES
) {
1097 for (i
= 0; i
< ab5500_bank_ranges
[devid
].nbanks
; i
++) {
1098 if (ab5500_bank_ranges
[devid
].bank
[i
].bankid
== bank
)
1099 return &ab5500_bank_ranges
[devid
].bank
[i
];
1105 static bool page_write_allowed(u8 devid
, u8 bank
, u8 first_reg
, u8 last_reg
)
1107 u8 i
; /* range loop index */
1108 const struct ab5500_i2c_ranges
*bankref
;
1110 bankref
= get_bankref(devid
, bank
);
1111 if (bankref
== NULL
|| last_reg
< first_reg
)
1114 for (i
= 0; i
< bankref
->nranges
; i
++) {
1115 if (first_reg
< bankref
->range
[i
].first
)
1117 if ((last_reg
<= bankref
->range
[i
].last
) &&
1118 (bankref
->range
[i
].perm
& AB5500_PERM_WR
))
1124 static bool reg_write_allowed(u8 devid
, u8 bank
, u8 reg
)
1126 return page_write_allowed(devid
, bank
, reg
, reg
);
1129 static bool page_read_allowed(u8 devid
, u8 bank
, u8 first_reg
, u8 last_reg
)
1132 const struct ab5500_i2c_ranges
*bankref
;
1134 bankref
= get_bankref(devid
, bank
);
1135 if (bankref
== NULL
|| last_reg
< first_reg
)
1139 /* Find the range (if it exists in the list) that includes first_reg. */
1140 for (i
= 0; i
< bankref
->nranges
; i
++) {
1141 if (first_reg
< bankref
->range
[i
].first
)
1143 if (first_reg
<= bankref
->range
[i
].last
)
1146 /* Make sure that the entire range up to and including last_reg is
1147 * readable. This may span several of the ranges in the list.
1149 while ((i
< bankref
->nranges
) &&
1150 (bankref
->range
[i
].perm
& AB5500_PERM_RD
)) {
1151 if (last_reg
<= bankref
->range
[i
].last
)
1153 if ((++i
>= bankref
->nranges
) ||
1154 (bankref
->range
[i
].first
!=
1155 (bankref
->range
[i
- 1].last
+ 1))) {
1162 static bool reg_read_allowed(u8 devid
, u8 bank
, u8 reg
)
1164 return page_read_allowed(devid
, bank
, reg
, reg
);
1169 * The exported register access functionality.
1171 static int ab5500_get_chip_id(struct device
*dev
)
1173 struct ab5500
*ab
= dev_get_drvdata(dev
->parent
);
1175 return (int)ab
->chip_id
;
1178 static int ab5500_mask_and_set_register_interruptible(struct device
*dev
,
1179 u8 bank
, u8 reg
, u8 bitmask
, u8 bitvalues
)
1182 struct platform_device
*pdev
= to_platform_device(dev
);
1184 if ((AB5500_NUM_BANKS
<= bank
) ||
1185 !reg_write_allowed(pdev
->id
, bank
, reg
))
1188 ab
= dev_get_drvdata(dev
->parent
);
1189 return ab5500_mask_and_set_register_interruptible_raw(ab
, bank
, reg
,
1190 bitmask
, bitvalues
);
1193 static int ab5500_set_register_interruptible(struct device
*dev
, u8 bank
,
1196 return ab5500_mask_and_set_register_interruptible(dev
, bank
, reg
, 0xFF,
1200 static int ab5500_get_register_interruptible(struct device
*dev
, u8 bank
,
1204 struct platform_device
*pdev
= to_platform_device(dev
);
1206 if ((AB5500_NUM_BANKS
<= bank
) ||
1207 !reg_read_allowed(pdev
->id
, bank
, reg
))
1210 ab
= dev_get_drvdata(dev
->parent
);
1211 return ab5500_get_register_interruptible_raw(ab
, bank
, reg
, value
);
1214 static int ab5500_get_register_page_interruptible(struct device
*dev
, u8 bank
,
1215 u8 first_reg
, u8
*regvals
, u8 numregs
)
1218 struct platform_device
*pdev
= to_platform_device(dev
);
1220 if ((AB5500_NUM_BANKS
<= bank
) ||
1221 !page_read_allowed(pdev
->id
, bank
,
1222 first_reg
, (first_reg
+ numregs
- 1)))
1225 ab
= dev_get_drvdata(dev
->parent
);
1226 return get_register_page_interruptible(ab
, bank
, first_reg
, regvals
,
1231 ab5500_event_registers_startup_state_get(struct device
*dev
, u8
*event
)
1235 ab
= dev_get_drvdata(dev
->parent
);
1236 if (!ab
->startup_events_read
)
1237 return -EAGAIN
; /* Try again later */
1239 memcpy(event
, ab
->startup_events
, AB5500_NUM_EVENT_REG
);
1243 static struct abx500_ops ab5500_ops
= {
1244 .get_chip_id
= ab5500_get_chip_id
,
1245 .get_register
= ab5500_get_register_interruptible
,
1246 .set_register
= ab5500_set_register_interruptible
,
1247 .get_register_page
= ab5500_get_register_page_interruptible
,
1248 .set_register_page
= NULL
,
1249 .mask_and_set_register
= ab5500_mask_and_set_register_interruptible
,
1250 .event_registers_startup_state_get
=
1251 ab5500_event_registers_startup_state_get
,
1252 .startup_irq_enabled
= NULL
,
1256 * ab5500_setup : Basic set-up, datastructure creation/destruction
1257 * and I2C interface.This sets up a default config
1258 * in the AB5500 chip so that it will work as expected.
1259 * @ab : Pointer to ab5500 structure
1260 * @settings : Pointer to struct abx500_init_settings
1261 * @size : Size of init data
1263 static int __init
ab5500_setup(struct ab5500
*ab
,
1264 struct abx500_init_settings
*settings
, unsigned int size
)
1269 for (i
= 0; i
< size
; i
++) {
1270 err
= ab5500_mask_and_set_register_interruptible_raw(ab
,
1273 0xFF, settings
[i
].setting
);
1277 /* If event mask register update the event mask in ab5500 */
1278 if ((settings
[i
].bank
== AB5500_BANK_IT
) &&
1279 (AB5500_MASK_BASE
<= settings
[i
].reg
) &&
1280 (settings
[i
].reg
<= AB5500_MASK_END
)) {
1281 ab
->mask
[settings
[i
].reg
- AB5500_MASK_BASE
] =
1282 settings
[i
].setting
;
1289 struct ab_family_id
{
1294 static const struct ab_family_id ids
[] __initdata
= {
1310 static int __init
ab5500_probe(struct platform_device
*pdev
)
1313 struct ab5500_platform_data
*ab5500_plf_data
=
1314 pdev
->dev
.platform_data
;
1318 ab
= kzalloc(sizeof(struct ab5500
), GFP_KERNEL
);
1321 "could not allocate ab5500 device\n");
1325 /* Initialize data structure */
1326 mutex_init(&ab
->access_mutex
);
1327 mutex_init(&ab
->irq_lock
);
1328 ab
->dev
= &pdev
->dev
;
1330 platform_set_drvdata(pdev
, ab
);
1332 /* Read chip ID register */
1333 err
= ab5500_get_register_interruptible_raw(ab
,
1334 AB5500_BANK_VIT_IO_I2C_CLK_TST_OTP
,
1335 AB5500_CHIP_ID
, &ab
->chip_id
);
1337 dev_err(&pdev
->dev
, "could not communicate with the analog "
1339 goto exit_no_detect
;
1342 for (i
= 0; ids
[i
].id
!= 0x0; i
++) {
1343 if (ids
[i
].id
== ab
->chip_id
) {
1344 snprintf(&ab
->chip_name
[0], sizeof(ab
->chip_name
) - 1,
1345 "AB5500 %s", ids
[i
].name
);
1349 if (ids
[i
].id
== 0x0) {
1350 dev_err(&pdev
->dev
, "unknown analog baseband chip id: 0x%x\n",
1352 dev_err(&pdev
->dev
, "driver not started!\n");
1353 goto exit_no_detect
;
1356 /* Clear and mask all interrupts */
1357 for (i
= 0; i
< AB5500_NUM_IRQ_REGS
; i
++) {
1358 u8 latchreg
= AB5500_IT_LATCH0_REG
+ i
;
1359 u8 maskreg
= AB5500_IT_MASK0_REG
+ i
;
1362 ab5500_get_register_interruptible_raw(ab
, AB5500_BANK_IT
,
1364 set_register_interruptible(ab
, AB5500_BANK_IT
, maskreg
, 0xff);
1365 ab
->mask
[i
] = ab
->oldmask
[i
] = 0xff;
1368 err
= abx500_register_ops(&pdev
->dev
, &ab5500_ops
);
1370 dev_err(&pdev
->dev
, "ab5500_register ops error\n");
1371 goto exit_no_detect
;
1374 /* Set up and register the platform devices. */
1375 for (i
= 0; i
< AB5500_NUM_DEVICES
; i
++) {
1376 ab5500_devs
[i
].platform_data
= ab5500_plf_data
->dev_data
[i
];
1377 ab5500_devs
[i
].pdata_size
=
1378 sizeof(ab5500_plf_data
->dev_data
[i
]);
1381 err
= mfd_add_devices(&pdev
->dev
, 0, ab5500_devs
,
1382 ARRAY_SIZE(ab5500_devs
), NULL
,
1383 ab5500_plf_data
->irq
.base
);
1385 dev_err(&pdev
->dev
, "ab5500_mfd_add_device error\n");
1386 goto exit_no_detect
;
1389 err
= ab5500_setup(ab
, ab5500_plf_data
->init_settings
,
1390 ab5500_plf_data
->init_settings_sz
);
1392 dev_err(&pdev
->dev
, "ab5500_setup error\n");
1393 goto exit_no_detect
;
1396 ab5500_setup_debugfs(ab
);
1398 dev_info(&pdev
->dev
, "detected AB chip: %s\n", &ab
->chip_name
[0]);
1406 static int __exit
ab5500_remove(struct platform_device
*pdev
)
1408 struct ab5500
*ab
= platform_get_drvdata(pdev
);
1410 ab5500_remove_debugfs();
1411 mfd_remove_devices(&pdev
->dev
);
1416 static struct platform_driver ab5500_driver
= {
1418 .name
= "ab5500-core",
1419 .owner
= THIS_MODULE
,
1421 .remove
= __exit_p(ab5500_remove
),
1424 static int __init
ab5500_core_init(void)
1426 return platform_driver_probe(&ab5500_driver
, ab5500_probe
);
1429 static void __exit
ab5500_core_exit(void)
1431 platform_driver_unregister(&ab5500_driver
);
1434 subsys_initcall(ab5500_core_init
);
1435 module_exit(ab5500_core_exit
);
1437 MODULE_AUTHOR("Mattias Wallin <mattias.wallin@stericsson.com>");
1438 MODULE_DESCRIPTION("AB5500 core driver");
1439 MODULE_LICENSE("GPL");