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/debugfs.h>
25 #include <linux/seq_file.h>
26 #include <linux/uaccess.h>
27 #include <linux/mfd/ab5500/ab5500.h>
28 #include <linux/mfd/abx500.h>
29 #include <linux/list.h>
30 #include <linux/bitops.h>
31 #include <linux/spinlock.h>
32 #include <linux/mfd/core.h>
33 #include <linux/version.h>
34 #include <linux/mfd/db5500-prcmu.h>
36 #define AB5500_NUM_EVENT_REG 23
37 #define AB5500_IT_LATCH0_REG 0x40
38 #define AB5500_IT_MASK0_REG 0x60
40 /* Read/write operation values. */
41 #define AB5500_PERM_RD (0x01)
42 #define AB5500_PERM_WR (0x02)
44 /* Read/write permissions. */
45 #define AB5500_PERM_RO (AB5500_PERM_RD)
46 #define AB5500_PERM_RW (AB5500_PERM_RD | AB5500_PERM_WR)
48 #define AB5500_MASK_BASE (0x60)
49 #define AB5500_MASK_END (0x79)
50 #define AB5500_CHIP_ID (0x20)
54 * @slave_addr: I2C slave_addr found in AB5500 specification
55 * @name: Documentation name of the bank. For reference
62 static const struct ab5500_bank bankinfo[AB5500_NUM_BANKS] = {
63 [AB5500_BANK_VIT_IO_I2C_CLK_TST_OTP] = {
64 AB5500_ADDR_VIT_IO_I2C_CLK_TST_OTP, "VIT_IO_I2C_CLK_TST_OTP"},
65 [AB5500_BANK_VDDDIG_IO_I2C_CLK_TST] = {
66 AB5500_ADDR_VDDDIG_IO_I2C_CLK_TST, "VDDDIG_IO_I2C_CLK_TST"},
67 [AB5500_BANK_VDENC] = {AB5500_ADDR_VDENC, "VDENC"},
68 [AB5500_BANK_SIM_USBSIM] = {AB5500_ADDR_SIM_USBSIM, "SIM_USBSIM"},
69 [AB5500_BANK_LED] = {AB5500_ADDR_LED, "LED"},
70 [AB5500_BANK_ADC] = {AB5500_ADDR_ADC, "ADC"},
71 [AB5500_BANK_RTC] = {AB5500_ADDR_RTC, "RTC"},
72 [AB5500_BANK_STARTUP] = {AB5500_ADDR_STARTUP, "STARTUP"},
73 [AB5500_BANK_DBI_ECI] = {AB5500_ADDR_DBI_ECI, "DBI-ECI"},
74 [AB5500_BANK_CHG] = {AB5500_ADDR_CHG, "CHG"},
75 [AB5500_BANK_FG_BATTCOM_ACC] = {
76 AB5500_ADDR_FG_BATTCOM_ACC, "FG_BATCOM_ACC"},
77 [AB5500_BANK_USB] = {AB5500_ADDR_USB, "USB"},
78 [AB5500_BANK_IT] = {AB5500_ADDR_IT, "IT"},
79 [AB5500_BANK_VIBRA] = {AB5500_ADDR_VIBRA, "VIBRA"},
80 [AB5500_BANK_AUDIO_HEADSETUSB] = {
81 AB5500_ADDR_AUDIO_HEADSETUSB, "AUDIO_HEADSETUSB"},
85 * struct ab5500_reg_range
86 * @first: the first address of the range
87 * @last: the last address of the range
88 * @perm: access permissions for the range
90 struct ab5500_reg_range {
97 * struct ab5500_i2c_ranges
98 * @count: the number of ranges in the list
99 * @range: the list of register ranges
101 struct ab5500_i2c_ranges {
104 const struct ab5500_reg_range *range;
108 * struct ab5500_i2c_banks
109 * @count: the number of ranges in the list
110 * @range: the list of register ranges
112 struct ab5500_i2c_banks {
114 const struct ab5500_i2c_ranges *bank;
118 * Permissible register ranges for reading and writing per device and bank.
120 * The ranges must be listed in increasing address order, and no overlaps are
121 * allowed. It is assumed that write permission implies read permission
122 * (i.e. only RO and RW permissions should be used). Ranges with write
123 * permission must not be split up.
126 #define NO_RANGE {.count = 0, .range = NULL,}
127 static struct ab5500_i2c_banks ab5500_bank_ranges[AB5500_NUM_DEVICES] = {
128 [AB5500_DEVID_USB] = {
130 .bank = (struct ab5500_i2c_ranges []) {
132 .bankid = AB5500_BANK_USB,
134 .range = (struct ab5500_reg_range[]) {
138 .perm = AB5500_PERM_RW,
143 .perm = AB5500_PERM_RW,
148 .perm = AB5500_PERM_RW,
153 .perm = AB5500_PERM_RO,
158 .perm = AB5500_PERM_RO,
163 .perm = AB5500_PERM_RW,
168 .perm = AB5500_PERM_RO,
173 .perm = AB5500_PERM_RO,
178 .perm = AB5500_PERM_RO,
183 .perm = AB5500_PERM_RO,
188 .perm = AB5500_PERM_RO,
193 .perm = AB5500_PERM_RO,
199 [AB5500_DEVID_ADC] = {
201 .bank = (struct ab5500_i2c_ranges []) {
203 .bankid = AB5500_BANK_ADC,
205 .range = (struct ab5500_reg_range[]) {
209 .perm = AB5500_PERM_RO,
214 .perm = AB5500_PERM_RW,
219 .perm = AB5500_PERM_RO,
224 .perm = AB5500_PERM_RW,
229 .perm = AB5500_PERM_RW,
234 .perm = AB5500_PERM_RO,
240 [AB5500_DEVID_LEDS] = {
242 .bank = (struct ab5500_i2c_ranges []) {
244 .bankid = AB5500_BANK_LED,
246 .range = (struct ab5500_reg_range[]) {
250 .perm = AB5500_PERM_RW,
256 [AB5500_DEVID_VIDEO] = {
258 .bank = (struct ab5500_i2c_ranges []) {
260 .bankid = AB5500_BANK_VDENC,
262 .range = (struct ab5500_reg_range[]) {
266 .perm = AB5500_PERM_RW,
271 .perm = AB5500_PERM_RO,
276 .perm = AB5500_PERM_RW,
281 .perm = AB5500_PERM_RW,
286 .perm = AB5500_PERM_RW,
291 .perm = AB5500_PERM_RW,
296 .perm = AB5500_PERM_RW,
301 .perm = AB5500_PERM_RW,
306 .perm = AB5500_PERM_RW,
311 .perm = AB5500_PERM_RW,
316 .perm = AB5500_PERM_RW,
321 .perm = AB5500_PERM_RW,
327 [AB5500_DEVID_REGULATORS] = {
329 .bank = (struct ab5500_i2c_ranges []) {
331 .bankid = AB5500_BANK_STARTUP,
333 .range = (struct ab5500_reg_range[]) {
337 .perm = AB5500_PERM_RW,
342 .perm = AB5500_PERM_RW,
347 .perm = AB5500_PERM_RO,
352 .perm = AB5500_PERM_RW,
357 .perm = AB5500_PERM_RW,
362 .perm = AB5500_PERM_RW,
367 .perm = AB5500_PERM_RW,
372 .perm = AB5500_PERM_RW,
377 .perm = AB5500_PERM_RW,
382 .perm = AB5500_PERM_RW,
387 .perm = AB5500_PERM_RW,
392 .perm = AB5500_PERM_RW,
397 .bankid = AB5500_BANK_SIM_USBSIM,
399 .range = (struct ab5500_reg_range[]) {
403 .perm = AB5500_PERM_RW,
409 [AB5500_DEVID_SIM] = {
411 .bank = (struct ab5500_i2c_ranges []) {
413 .bankid = AB5500_BANK_SIM_USBSIM,
415 .range = (struct ab5500_reg_range[]) {
419 .perm = AB5500_PERM_RW,
425 [AB5500_DEVID_RTC] = {
427 .bank = (struct ab5500_i2c_ranges []) {
429 .bankid = AB5500_BANK_RTC,
431 .range = (struct ab5500_reg_range[]) {
435 .perm = AB5500_PERM_RW,
440 .perm = AB5500_PERM_RW,
446 [AB5500_DEVID_CHARGER] = {
448 .bank = (struct ab5500_i2c_ranges []) {
450 .bankid = AB5500_BANK_CHG,
452 .range = (struct ab5500_reg_range[]) {
456 .perm = AB5500_PERM_RO,
461 .perm = AB5500_PERM_RW,
467 [AB5500_DEVID_FUELGAUGE] = {
469 .bank = (struct ab5500_i2c_ranges []) {
471 .bankid = AB5500_BANK_FG_BATTCOM_ACC,
473 .range = (struct ab5500_reg_range[]) {
477 .perm = AB5500_PERM_RO,
482 .perm = AB5500_PERM_RW,
488 [AB5500_DEVID_VIBRATOR] = {
490 .bank = (struct ab5500_i2c_ranges []) {
492 .bankid = AB5500_BANK_VIBRA,
494 .range = (struct ab5500_reg_range[]) {
498 .perm = AB5500_PERM_RW,
503 .perm = AB5500_PERM_RW,
509 [AB5500_DEVID_CODEC] = {
511 .bank = (struct ab5500_i2c_ranges []) {
513 .bankid = AB5500_BANK_AUDIO_HEADSETUSB,
515 .range = (struct ab5500_reg_range[]) {
519 .perm = AB5500_PERM_RW,
524 .perm = AB5500_PERM_RW,
530 [AB5500_DEVID_POWER] = {
532 .bank = (struct ab5500_i2c_ranges []) {
534 .bankid = AB5500_BANK_STARTUP,
536 .range = (struct ab5500_reg_range[]) {
540 .perm = AB5500_PERM_RW,
545 .bankid = AB5500_BANK_VIT_IO_I2C_CLK_TST_OTP,
547 .range = (struct ab5500_reg_range[]) {
551 .perm = AB5500_PERM_RW,
559 #define AB5500_IRQ(bank, bit) ((bank) * 8 + (bit))
561 /* I appologize for the resource names beeing a mix of upper case
562 * and lower case but I want them to be exact as the documentation */
563 static struct mfd_cell ab5500_devs[AB5500_NUM_DEVICES] = {
564 [AB5500_DEVID_LEDS] = {
565 .name = "ab5500-leds",
566 .id = AB5500_DEVID_LEDS,
568 [AB5500_DEVID_POWER] = {
569 .name = "ab5500-power",
570 .id = AB5500_DEVID_POWER,
572 [AB5500_DEVID_REGULATORS] = {
573 .name = "ab5500-regulator",
574 .id = AB5500_DEVID_REGULATORS,
576 [AB5500_DEVID_SIM] = {
577 .name = "ab5500-sim",
578 .id = AB5500_DEVID_SIM,
580 .resources = (struct resource[]) {
583 .flags = IORESOURCE_IRQ,
584 .start = AB5500_IRQ(2, 0), /*rising*/
585 .end = AB5500_IRQ(2, 1), /*falling*/
589 [AB5500_DEVID_RTC] = {
590 .name = "ab5500-rtc",
591 .id = AB5500_DEVID_RTC,
593 .resources = (struct resource[]) {
596 .flags = IORESOURCE_IRQ,
597 .start = AB5500_IRQ(1, 7),
598 .end = AB5500_IRQ(1, 7),
602 [AB5500_DEVID_CHARGER] = {
603 .name = "ab5500-charger",
604 .id = AB5500_DEVID_CHARGER,
606 [AB5500_DEVID_ADC] = {
607 .name = "ab5500-adc",
608 .id = AB5500_DEVID_ADC,
610 .resources = (struct resource[]) {
613 .flags = IORESOURCE_IRQ,
614 .start = AB5500_IRQ(0, 0),
615 .end = AB5500_IRQ(0, 0),
619 .flags = IORESOURCE_IRQ,
620 .start = AB5500_IRQ(0, 1),
621 .end = AB5500_IRQ(0, 1),
625 .flags = IORESOURCE_IRQ,
626 .start = AB5500_IRQ(0, 2),
627 .end = AB5500_IRQ(0, 2),
631 .flags = IORESOURCE_IRQ,
632 .start = AB5500_IRQ(0, 3),
633 .end = AB5500_IRQ(0, 3),
637 .flags = IORESOURCE_IRQ,
638 .start = AB5500_IRQ(0, 4),
639 .end = AB5500_IRQ(0, 4),
643 .flags = IORESOURCE_IRQ,
644 .start = AB5500_IRQ(0, 5),
645 .end = AB5500_IRQ(0, 5),
649 .flags = IORESOURCE_IRQ,
650 .start = AB5500_IRQ(0, 6),
651 .end = AB5500_IRQ(0, 6),
655 .flags = IORESOURCE_IRQ,
656 .start = AB5500_IRQ(0, 7),
657 .end = AB5500_IRQ(0, 7),
660 .name = "TRIGGER-VBAT",
661 .flags = IORESOURCE_IRQ,
662 .start = AB5500_IRQ(0, 8),
663 .end = AB5500_IRQ(0, 8),
666 .name = "TRIGGER-VBAT-TXON",
667 .flags = IORESOURCE_IRQ,
668 .start = AB5500_IRQ(0, 9),
669 .end = AB5500_IRQ(0, 9),
673 [AB5500_DEVID_FUELGAUGE] = {
674 .name = "ab5500-fuelgauge",
675 .id = AB5500_DEVID_FUELGAUGE,
677 .resources = (struct resource[]) {
679 .name = "Batt_attach",
680 .flags = IORESOURCE_IRQ,
681 .start = AB5500_IRQ(7, 5),
682 .end = AB5500_IRQ(7, 5),
685 .name = "Batt_removal",
686 .flags = IORESOURCE_IRQ,
687 .start = AB5500_IRQ(7, 6),
688 .end = AB5500_IRQ(7, 6),
691 .name = "UART_framing",
692 .flags = IORESOURCE_IRQ,
693 .start = AB5500_IRQ(7, 7),
694 .end = AB5500_IRQ(7, 7),
697 .name = "UART_overrun",
698 .flags = IORESOURCE_IRQ,
699 .start = AB5500_IRQ(8, 0),
700 .end = AB5500_IRQ(8, 0),
703 .name = "UART_Rdy_RX",
704 .flags = IORESOURCE_IRQ,
705 .start = AB5500_IRQ(8, 1),
706 .end = AB5500_IRQ(8, 1),
709 .name = "UART_Rdy_TX",
710 .flags = IORESOURCE_IRQ,
711 .start = AB5500_IRQ(8, 2),
712 .end = AB5500_IRQ(8, 2),
716 [AB5500_DEVID_VIBRATOR] = {
717 .name = "ab5500-vibrator",
718 .id = AB5500_DEVID_VIBRATOR,
720 [AB5500_DEVID_CODEC] = {
721 .name = "ab5500-codec",
722 .id = AB5500_DEVID_CODEC,
724 .resources = (struct resource[]) {
726 .name = "audio_spkr1_ovc",
727 .flags = IORESOURCE_IRQ,
728 .start = AB5500_IRQ(9, 5),
729 .end = AB5500_IRQ(9, 5),
732 .name = "audio_plllocked",
733 .flags = IORESOURCE_IRQ,
734 .start = AB5500_IRQ(9, 6),
735 .end = AB5500_IRQ(9, 6),
738 .name = "audio_spkr2_ovc",
739 .flags = IORESOURCE_IRQ,
740 .start = AB5500_IRQ(17, 4),
741 .end = AB5500_IRQ(17, 4),
745 [AB5500_DEVID_USB] = {
746 .name = "ab5500-usb",
747 .id = AB5500_DEVID_USB,
749 .resources = (struct resource[]) {
751 .name = "Link_Update",
752 .flags = IORESOURCE_IRQ,
753 .start = AB5500_IRQ(22, 1),
754 .end = AB5500_IRQ(22, 1),
758 .flags = IORESOURCE_IRQ,
759 .start = AB5500_IRQ(8, 3),
760 .end = AB5500_IRQ(8, 4),
764 .flags = IORESOURCE_IRQ,
765 .start = AB5500_IRQ(8, 5),
766 .end = AB5500_IRQ(8, 5),
770 .flags = IORESOURCE_IRQ,
771 .start = AB5500_IRQ(8, 6),
772 .end = AB5500_IRQ(8, 6),
775 .name = "CHGstate_10_PCVBUSchg",
776 .flags = IORESOURCE_IRQ,
777 .start = AB5500_IRQ(8, 7),
778 .end = AB5500_IRQ(8, 7),
781 .name = "DCIOreverse_ovc",
782 .flags = IORESOURCE_IRQ,
783 .start = AB5500_IRQ(9, 0),
784 .end = AB5500_IRQ(9, 0),
787 .name = "USBCharDetDone",
788 .flags = IORESOURCE_IRQ,
789 .start = AB5500_IRQ(9, 1),
790 .end = AB5500_IRQ(9, 1),
793 .name = "DCIO_no_limit",
794 .flags = IORESOURCE_IRQ,
795 .start = AB5500_IRQ(9, 2),
796 .end = AB5500_IRQ(9, 2),
799 .name = "USB_suspend",
800 .flags = IORESOURCE_IRQ,
801 .start = AB5500_IRQ(9, 3),
802 .end = AB5500_IRQ(9, 3),
805 .name = "DCIOreverse_fwdcurrent",
806 .flags = IORESOURCE_IRQ,
807 .start = AB5500_IRQ(9, 4),
808 .end = AB5500_IRQ(9, 4),
811 .name = "Vbus_Imeasmax_change",
812 .flags = IORESOURCE_IRQ,
813 .start = AB5500_IRQ(9, 5),
814 .end = AB5500_IRQ(9, 6),
818 .flags = IORESOURCE_IRQ,
819 .start = AB5500_IRQ(14, 5),
820 .end = AB5500_IRQ(14, 5),
823 .name = "USBcharging_NOTok",
824 .flags = IORESOURCE_IRQ,
825 .start = AB5500_IRQ(15, 3),
826 .end = AB5500_IRQ(15, 3),
829 .name = "usb_adp_sensoroff",
830 .flags = IORESOURCE_IRQ,
831 .start = AB5500_IRQ(15, 6),
832 .end = AB5500_IRQ(15, 6),
835 .name = "usb_adp_probeplug",
836 .flags = IORESOURCE_IRQ,
837 .start = AB5500_IRQ(15, 7),
838 .end = AB5500_IRQ(15, 7),
841 .name = "usb_adp_sinkerror",
842 .flags = IORESOURCE_IRQ,
843 .start = AB5500_IRQ(16, 0),
844 .end = AB5500_IRQ(16, 6),
847 .name = "usb_adp_sourceerror",
848 .flags = IORESOURCE_IRQ,
849 .start = AB5500_IRQ(16, 1),
850 .end = AB5500_IRQ(16, 1),
853 .name = "usb_idgnd_r",
854 .flags = IORESOURCE_IRQ,
855 .start = AB5500_IRQ(16, 2),
856 .end = AB5500_IRQ(16, 2),
859 .name = "usb_idgnd_f",
860 .flags = IORESOURCE_IRQ,
861 .start = AB5500_IRQ(16, 3),
862 .end = AB5500_IRQ(16, 3),
865 .name = "usb_iddetR1",
866 .flags = IORESOURCE_IRQ,
867 .start = AB5500_IRQ(16, 4),
868 .end = AB5500_IRQ(16, 5),
871 .name = "usb_iddetR2",
872 .flags = IORESOURCE_IRQ,
873 .start = AB5500_IRQ(16, 6),
874 .end = AB5500_IRQ(16, 7),
877 .name = "usb_iddetR3",
878 .flags = IORESOURCE_IRQ,
879 .start = AB5500_IRQ(17, 0),
880 .end = AB5500_IRQ(17, 1),
883 .name = "usb_iddetR4",
884 .flags = IORESOURCE_IRQ,
885 .start = AB5500_IRQ(17, 2),
886 .end = AB5500_IRQ(17, 3),
889 .name = "CharTempWindowOk",
890 .flags = IORESOURCE_IRQ,
891 .start = AB5500_IRQ(17, 7),
892 .end = AB5500_IRQ(18, 0),
895 .name = "USB_SprDetect",
896 .flags = IORESOURCE_IRQ,
897 .start = AB5500_IRQ(18, 1),
898 .end = AB5500_IRQ(18, 1),
901 .name = "usb_adp_probe_unplug",
902 .flags = IORESOURCE_IRQ,
903 .start = AB5500_IRQ(18, 2),
904 .end = AB5500_IRQ(18, 2),
907 .name = "VBUSChDrop",
908 .flags = IORESOURCE_IRQ,
909 .start = AB5500_IRQ(18, 3),
910 .end = AB5500_IRQ(18, 4),
913 .name = "dcio_char_rec_done",
914 .flags = IORESOURCE_IRQ,
915 .start = AB5500_IRQ(18, 5),
916 .end = AB5500_IRQ(18, 5),
919 .name = "Charging_stopped_by_temp",
920 .flags = IORESOURCE_IRQ,
921 .start = AB5500_IRQ(18, 6),
922 .end = AB5500_IRQ(18, 6),
925 .name = "CHGstate_11_SafeModeVBUS",
926 .flags = IORESOURCE_IRQ,
927 .start = AB5500_IRQ(21, 1),
928 .end = AB5500_IRQ(21, 2),
931 .name = "CHGstate_12_comletedVBUS",
932 .flags = IORESOURCE_IRQ,
933 .start = AB5500_IRQ(21, 2),
934 .end = AB5500_IRQ(21, 2),
937 .name = "CHGstate_13_completedVBUS",
938 .flags = IORESOURCE_IRQ,
939 .start = AB5500_IRQ(21, 3),
940 .end = AB5500_IRQ(21, 3),
943 .name = "CHGstate_14_FullChgDCIO",
944 .flags = IORESOURCE_IRQ,
945 .start = AB5500_IRQ(21, 4),
946 .end = AB5500_IRQ(21, 4),
949 .name = "CHGstate_15_SafeModeDCIO",
950 .flags = IORESOURCE_IRQ,
951 .start = AB5500_IRQ(21, 5),
952 .end = AB5500_IRQ(21, 5),
955 .name = "CHGstate_16_OFFsuspendDCIO",
956 .flags = IORESOURCE_IRQ,
957 .start = AB5500_IRQ(21, 6),
958 .end = AB5500_IRQ(21, 6),
961 .name = "CHGstate_17_completedDCIO",
962 .flags = IORESOURCE_IRQ,
963 .start = AB5500_IRQ(21, 7),
964 .end = AB5500_IRQ(21, 7),
968 [AB5500_DEVID_OTP] = {
969 .name = "ab5500-otp",
970 .id = AB5500_DEVID_OTP,
972 [AB5500_DEVID_VIDEO] = {
973 .name = "ab5500-video",
974 .id = AB5500_DEVID_VIDEO,
976 .resources = (struct resource[]) {
979 .flags = IORESOURCE_IRQ,
980 .start = AB5500_IRQ(22, 2),
981 .end = AB5500_IRQ(22, 2),
985 [AB5500_DEVID_DBIECI] = {
986 .name = "ab5500-dbieci",
987 .id = AB5500_DEVID_DBIECI,
989 .resources = (struct resource[]) {
992 .flags = IORESOURCE_IRQ,
993 .start = AB5500_IRQ(14, 0),
994 .end = AB5500_IRQ(14, 0),
998 .flags = IORESOURCE_IRQ,
999 .start = AB5500_IRQ(14, 1),
1000 .end = AB5500_IRQ(14, 1),
1004 .flags = IORESOURCE_IRQ,
1005 .start = AB5500_IRQ(14, 2),
1006 .end = AB5500_IRQ(14, 2),
1010 .flags = IORESOURCE_IRQ,
1011 .start = AB5500_IRQ(14, 3),
1012 .end = AB5500_IRQ(14, 3),
1015 .name = "BSI_indicator",
1016 .flags = IORESOURCE_IRQ,
1017 .start = AB5500_IRQ(14, 4),
1018 .end = AB5500_IRQ(14, 4),
1022 .flags = IORESOURCE_IRQ,
1023 .start = AB5500_IRQ(14, 6),
1024 .end = AB5500_IRQ(14, 6),
1028 .flags = IORESOURCE_IRQ,
1029 .start = AB5500_IRQ(14, 7),
1030 .end = AB5500_IRQ(14, 7),
1034 .flags = IORESOURCE_IRQ,
1035 .start = AB5500_IRQ(15, 0),
1036 .end = AB5500_IRQ(15, 0),
1040 .flags = IORESOURCE_IRQ,
1041 .start = AB5500_IRQ(15, 1),
1042 .end = AB5500_IRQ(15, 1),
1046 .flags = IORESOURCE_IRQ,
1047 .start = AB5500_IRQ(15, 2),
1048 .end = AB5500_IRQ(15, 2),
1052 [AB5500_DEVID_ONSWA] = {
1053 .name = "ab5500-onswa",
1054 .id = AB5500_DEVID_ONSWA,
1056 .resources = (struct resource[]) {
1058 .name = "ONSWAn_rising",
1059 .flags = IORESOURCE_IRQ,
1060 .start = AB5500_IRQ(1, 3),
1061 .end = AB5500_IRQ(1, 3),
1064 .name = "ONSWAn_falling",
1065 .flags = IORESOURCE_IRQ,
1066 .start = AB5500_IRQ(1, 4),
1067 .end = AB5500_IRQ(1, 4),
1074 * Functionality for getting/setting register values.
1076 static int get_register_interruptible(struct ab5500 *ab, u8 bank, u8 reg,
1081 if (bank >= AB5500_NUM_BANKS)
1084 err = mutex_lock_interruptible(&ab->access_mutex);
1087 err = db5500_prcmu_abb_read(bankinfo[bank].slave_addr, reg, value, 1);
1089 mutex_unlock(&ab->access_mutex);
1093 static int get_register_page_interruptible(struct ab5500 *ab, u8 bank,
1094 u8 first_reg, u8 *regvals, u8 numregs)
1098 if (bank >= AB5500_NUM_BANKS)
1101 err = mutex_lock_interruptible(&ab->access_mutex);
1106 /* The hardware limit for get page is 4 */
1107 u8 curnum = min_t(u8, numregs, 4u);
1109 err = db5500_prcmu_abb_read(bankinfo[bank].slave_addr,
1110 first_reg, regvals, curnum);
1115 first_reg += curnum;
1120 mutex_unlock(&ab->access_mutex);
1124 static int mask_and_set_register_interruptible(struct ab5500 *ab, u8 bank,
1125 u8 reg, u8 bitmask, u8 bitvalues)
1129 if (bank >= AB5500_NUM_BANKS)
1135 err = mutex_lock_interruptible(&ab->access_mutex);
1139 if (bitmask == 0xFF) /* No need to read in this case. */
1141 else { /* Read and modify the register value. */
1142 err = db5500_prcmu_abb_read(bankinfo[bank].slave_addr,
1147 buf = ((~bitmask & buf) | (bitmask & bitvalues));
1149 /* Write the new value. */
1150 err = db5500_prcmu_abb_write(bankinfo[bank].slave_addr, reg,
1153 mutex_unlock(&ab->access_mutex);
1159 set_register_interruptible(struct ab5500 *ab, u8 bank, u8 reg, u8 value)
1161 return mask_and_set_register_interruptible(ab, bank, reg, 0xff, value);
1165 * Read/write permission checking functions.
1167 static const struct ab5500_i2c_ranges *get_bankref(u8 devid, u8 bank)
1171 if (devid < AB5500_NUM_DEVICES) {
1172 for (i = 0; i < ab5500_bank_ranges[devid].nbanks; i++) {
1173 if (ab5500_bank_ranges[devid].bank[i].bankid == bank)
1174 return &ab5500_bank_ranges[devid].bank[i];
1180 static bool page_write_allowed(u8 devid, u8 bank, u8 first_reg, u8 last_reg)
1182 u8 i; /* range loop index */
1183 const struct ab5500_i2c_ranges *bankref;
1185 bankref = get_bankref(devid, bank);
1186 if (bankref == NULL || last_reg < first_reg)
1189 for (i = 0; i < bankref->nranges; i++) {
1190 if (first_reg < bankref->range[i].first)
1192 if ((last_reg <= bankref->range[i].last) &&
1193 (bankref->range[i].perm & AB5500_PERM_WR))
1199 static bool reg_write_allowed(u8 devid, u8 bank, u8 reg)
1201 return page_write_allowed(devid, bank, reg, reg);
1204 static bool page_read_allowed(u8 devid, u8 bank, u8 first_reg, u8 last_reg)
1207 const struct ab5500_i2c_ranges *bankref;
1209 bankref = get_bankref(devid, bank);
1210 if (bankref == NULL || last_reg < first_reg)
1214 /* Find the range (if it exists in the list) that includes first_reg. */
1215 for (i = 0; i < bankref->nranges; i++) {
1216 if (first_reg < bankref->range[i].first)
1218 if (first_reg <= bankref->range[i].last)
1221 /* Make sure that the entire range up to and including last_reg is
1222 * readable. This may span several of the ranges in the list.
1224 while ((i < bankref->nranges) &&
1225 (bankref->range[i].perm & AB5500_PERM_RD)) {
1226 if (last_reg <= bankref->range[i].last)
1228 if ((++i >= bankref->nranges) ||
1229 (bankref->range[i].first !=
1230 (bankref->range[i - 1].last + 1))) {
1237 static bool reg_read_allowed(u8 devid, u8 bank, u8 reg)
1239 return page_read_allowed(devid, bank, reg, reg);
1244 * The exported register access functionality.
1246 static int ab5500_get_chip_id(struct device *dev)
1248 struct ab5500 *ab = dev_get_drvdata(dev->parent);
1250 return (int)ab->chip_id;
1253 static int ab5500_mask_and_set_register_interruptible(struct device *dev,
1254 u8 bank, u8 reg, u8 bitmask, u8 bitvalues)
1257 struct platform_device *pdev = to_platform_device(dev);
1259 if ((AB5500_NUM_BANKS <= bank) ||
1260 !reg_write_allowed(pdev->id, bank, reg))
1263 ab = dev_get_drvdata(dev->parent);
1264 return mask_and_set_register_interruptible(ab, bank, reg,
1265 bitmask, bitvalues);
1268 static int ab5500_set_register_interruptible(struct device *dev, u8 bank,
1271 return ab5500_mask_and_set_register_interruptible(dev, bank, reg, 0xFF,
1275 static int ab5500_get_register_interruptible(struct device *dev, u8 bank,
1279 struct platform_device *pdev = to_platform_device(dev);
1281 if ((AB5500_NUM_BANKS <= bank) ||
1282 !reg_read_allowed(pdev->id, bank, reg))
1285 ab = dev_get_drvdata(dev->parent);
1286 return get_register_interruptible(ab, bank, reg, value);
1289 static int ab5500_get_register_page_interruptible(struct device *dev, u8 bank,
1290 u8 first_reg, u8 *regvals, u8 numregs)
1293 struct platform_device *pdev = to_platform_device(dev);
1295 if ((AB5500_NUM_BANKS <= bank) ||
1296 !page_read_allowed(pdev->id, bank,
1297 first_reg, (first_reg + numregs - 1)))
1300 ab = dev_get_drvdata(dev->parent);
1301 return get_register_page_interruptible(ab, bank, first_reg, regvals,
1306 ab5500_event_registers_startup_state_get(struct device *dev, u8 *event)
1310 ab = dev_get_drvdata(dev->parent);
1311 if (!ab->startup_events_read)
1312 return -EAGAIN; /* Try again later */
1314 memcpy(event, ab->startup_events, AB5500_NUM_EVENT_REG);
1318 static struct abx500_ops ab5500_ops = {
1319 .get_chip_id = ab5500_get_chip_id,
1320 .get_register = ab5500_get_register_interruptible,
1321 .set_register = ab5500_set_register_interruptible,
1322 .get_register_page = ab5500_get_register_page_interruptible,
1323 .set_register_page = NULL,
1324 .mask_and_set_register = ab5500_mask_and_set_register_interruptible,
1325 .event_registers_startup_state_get =
1326 ab5500_event_registers_startup_state_get,
1327 .startup_irq_enabled = NULL,
1330 #ifdef CONFIG_DEBUG_FS
1331 static struct ab5500_i2c_ranges ab5500_reg_ranges[AB5500_NUM_BANKS] = {
1332 [AB5500_BANK_LED] = {
1333 .bankid = AB5500_BANK_LED,
1335 .range = (struct ab5500_reg_range[]) {
1339 .perm = AB5500_PERM_RW,
1343 [AB5500_BANK_ADC] = {
1344 .bankid = AB5500_BANK_ADC,
1346 .range = (struct ab5500_reg_range[]) {
1350 .perm = AB5500_PERM_RO,
1355 .perm = AB5500_PERM_RW,
1360 .perm = AB5500_PERM_RO,
1365 .perm = AB5500_PERM_RW,
1370 .perm = AB5500_PERM_RW,
1375 .perm = AB5500_PERM_RO,
1379 [AB5500_BANK_RTC] = {
1380 .bankid = AB5500_BANK_RTC,
1382 .range = (struct ab5500_reg_range[]) {
1386 .perm = AB5500_PERM_RW,
1391 .perm = AB5500_PERM_RW,
1395 [AB5500_BANK_STARTUP] = {
1396 .bankid = AB5500_BANK_STARTUP,
1398 .range = (struct ab5500_reg_range[]) {
1402 .perm = AB5500_PERM_RW,
1407 .perm = AB5500_PERM_RW,
1412 .perm = AB5500_PERM_RO,
1417 .perm = AB5500_PERM_RW,
1422 .perm = AB5500_PERM_RW,
1427 .perm = AB5500_PERM_RW,
1432 .perm = AB5500_PERM_RW,
1437 .perm = AB5500_PERM_RW,
1442 .perm = AB5500_PERM_RW,
1447 .perm = AB5500_PERM_RW,
1452 .perm = AB5500_PERM_RW,
1457 .perm = AB5500_PERM_RW,
1461 [AB5500_BANK_DBI_ECI] = {
1462 .bankid = AB5500_BANK_DBI_ECI,
1464 .range = (struct ab5500_reg_range[]) {
1468 .perm = AB5500_PERM_RW,
1473 .perm = AB5500_PERM_RW,
1478 .perm = AB5500_PERM_RW,
1482 [AB5500_BANK_CHG] = {
1483 .bankid = AB5500_BANK_CHG,
1485 .range = (struct ab5500_reg_range[]) {
1489 .perm = AB5500_PERM_RO,
1494 .perm = AB5500_PERM_RW,
1498 [AB5500_BANK_FG_BATTCOM_ACC] = {
1499 .bankid = AB5500_BANK_FG_BATTCOM_ACC,
1501 .range = (struct ab5500_reg_range[]) {
1505 .perm = AB5500_PERM_RO,
1510 .perm = AB5500_PERM_RW,
1514 [AB5500_BANK_USB] = {
1515 .bankid = AB5500_BANK_USB,
1517 .range = (struct ab5500_reg_range[]) {
1521 .perm = AB5500_PERM_RW,
1526 .perm = AB5500_PERM_RW,
1531 .perm = AB5500_PERM_RW,
1536 .perm = AB5500_PERM_RO,
1541 .perm = AB5500_PERM_RO,
1546 .perm = AB5500_PERM_RW,
1551 .perm = AB5500_PERM_RO,
1556 .perm = AB5500_PERM_RO,
1561 .perm = AB5500_PERM_RO,
1566 .perm = AB5500_PERM_RO,
1571 .perm = AB5500_PERM_RO,
1576 .perm = AB5500_PERM_RO,
1580 [AB5500_BANK_IT] = {
1581 .bankid = AB5500_BANK_IT,
1583 .range = (struct ab5500_reg_range[]) {
1587 .perm = AB5500_PERM_RO,
1592 .perm = AB5500_PERM_RO,
1597 .perm = AB5500_PERM_RO,
1602 .perm = AB5500_PERM_RO,
1606 [AB5500_BANK_VDDDIG_IO_I2C_CLK_TST] = {
1607 .bankid = AB5500_BANK_VDDDIG_IO_I2C_CLK_TST,
1609 .range = (struct ab5500_reg_range[]) {
1613 .perm = AB5500_PERM_RW,
1618 .perm = AB5500_PERM_RW,
1623 .perm = AB5500_PERM_RW,
1628 .perm = AB5500_PERM_RW,
1633 .perm = AB5500_PERM_RW,
1638 .perm = AB5500_PERM_RW,
1643 .perm = AB5500_PERM_RW,
1647 [AB5500_BANK_VIT_IO_I2C_CLK_TST_OTP] = {
1648 .bankid = AB5500_BANK_VIT_IO_I2C_CLK_TST_OTP,
1650 .range = (struct ab5500_reg_range[]) {
1654 .perm = AB5500_PERM_RW,
1659 .perm = AB5500_PERM_RO,
1664 .perm = AB5500_PERM_RW,
1669 .perm = AB5500_PERM_RW,
1674 .perm = AB5500_PERM_RW,
1679 .perm = AB5500_PERM_RW,
1684 .perm = AB5500_PERM_RW,
1689 .perm = AB5500_PERM_RW,
1694 .perm = AB5500_PERM_RW,
1699 .perm = AB5500_PERM_RW,
1704 .perm = AB5500_PERM_RW,
1709 .perm = AB5500_PERM_RW,
1714 .perm = AB5500_PERM_RW,
1718 [AB5500_BANK_VIBRA] = {
1719 .bankid = AB5500_BANK_VIBRA,
1721 .range = (struct ab5500_reg_range[]) {
1725 .perm = AB5500_PERM_RW,
1730 .perm = AB5500_PERM_RW,
1734 [AB5500_BANK_AUDIO_HEADSETUSB] = {
1735 .bankid = AB5500_BANK_AUDIO_HEADSETUSB,
1737 .range = (struct ab5500_reg_range[]) {
1741 .perm = AB5500_PERM_RW,
1746 .perm = AB5500_PERM_RW,
1750 [AB5500_BANK_SIM_USBSIM] = {
1751 .bankid = AB5500_BANK_SIM_USBSIM,
1753 .range = (struct ab5500_reg_range[]) {
1757 .perm = AB5500_PERM_RW,
1761 [AB5500_BANK_VDENC] = {
1762 .bankid = AB5500_BANK_VDENC,
1764 .range = (struct ab5500_reg_range[]) {
1768 .perm = AB5500_PERM_RW,
1773 .perm = AB5500_PERM_RO,
1778 .perm = AB5500_PERM_RW,
1783 .perm = AB5500_PERM_RW,
1788 .perm = AB5500_PERM_RW,
1793 .perm = AB5500_PERM_RW,
1798 .perm = AB5500_PERM_RW,
1803 .perm = AB5500_PERM_RW,
1808 .perm = AB5500_PERM_RW,
1813 .perm = AB5500_PERM_RW,
1818 .perm = AB5500_PERM_RW,
1823 .perm = AB5500_PERM_RW,
1828 static int ab5500_registers_print(struct seq_file *s, void *p)
1830 struct ab5500 *ab = s->private;
1832 u8 bank = (u8)ab->debug_bank;
1834 seq_printf(s, "ab5500 register values:\n");
1835 for (bank = 0; bank < AB5500_NUM_BANKS; bank++) {
1836 seq_printf(s, " bank %u, %s (0x%x):\n", bank,
1837 bankinfo[bank].name,
1838 bankinfo[bank].slave_addr);
1839 for (i = 0; i < ab5500_reg_ranges[bank].nranges; i++) {
1843 for (reg = ab5500_reg_ranges[bank].range[i].first;
1844 reg <= ab5500_reg_ranges[bank].range[i].last;
1848 err = get_register_interruptible(ab, bank, reg,
1851 dev_err(ab->dev, "get_reg failed %d"
1852 "bank 0x%x reg 0x%x\n",
1857 err = seq_printf(s, "[%d/0x%02X]: 0x%02X\n",
1861 "seq_printf overflow\n");
1863 * Error is not returned here since
1864 * the output is wanted in any case
1874 static int ab5500_registers_open(struct inode *inode, struct file *file)
1876 return single_open(file, ab5500_registers_print, inode->i_private);
1879 static const struct file_operations ab5500_registers_fops = {
1880 .open = ab5500_registers_open,
1882 .llseek = seq_lseek,
1883 .release = single_release,
1884 .owner = THIS_MODULE,
1887 static int ab5500_bank_print(struct seq_file *s, void *p)
1889 struct ab5500 *ab = s->private;
1891 seq_printf(s, "%d\n", ab->debug_bank);
1895 static int ab5500_bank_open(struct inode *inode, struct file *file)
1897 return single_open(file, ab5500_bank_print, inode->i_private);
1900 static ssize_t ab5500_bank_write(struct file *file,
1901 const char __user *user_buf,
1902 size_t count, loff_t *ppos)
1904 struct ab5500 *ab = ((struct seq_file *)(file->private_data))->private;
1907 unsigned long user_bank;
1910 /* Get userspace string and assure termination */
1911 buf_size = min(count, (sizeof(buf) - 1));
1912 if (copy_from_user(buf, user_buf, buf_size))
1916 err = strict_strtoul(buf, 0, &user_bank);
1920 if (user_bank >= AB5500_NUM_BANKS) {
1922 "debugfs error input > number of banks\n");
1926 ab->debug_bank = user_bank;
1931 static int ab5500_address_print(struct seq_file *s, void *p)
1933 struct ab5500 *ab = s->private;
1935 seq_printf(s, "0x%02X\n", ab->debug_address);
1939 static int ab5500_address_open(struct inode *inode, struct file *file)
1941 return single_open(file, ab5500_address_print, inode->i_private);
1944 static ssize_t ab5500_address_write(struct file *file,
1945 const char __user *user_buf,
1946 size_t count, loff_t *ppos)
1948 struct ab5500 *ab = ((struct seq_file *)(file->private_data))->private;
1951 unsigned long user_address;
1954 /* Get userspace string and assure termination */
1955 buf_size = min(count, (sizeof(buf) - 1));
1956 if (copy_from_user(buf, user_buf, buf_size))
1960 err = strict_strtoul(buf, 0, &user_address);
1963 if (user_address > 0xff) {
1965 "debugfs error input > 0xff\n");
1968 ab->debug_address = user_address;
1972 static int ab5500_val_print(struct seq_file *s, void *p)
1974 struct ab5500 *ab = s->private;
1978 err = get_register_interruptible(ab, (u8)ab->debug_bank,
1979 (u8)ab->debug_address, ®value);
1981 dev_err(ab->dev, "get_reg failed %d, bank 0x%x"
1982 ", reg 0x%x\n", err, ab->debug_bank,
1986 seq_printf(s, "0x%02X\n", regvalue);
1991 static int ab5500_val_open(struct inode *inode, struct file *file)
1993 return single_open(file, ab5500_val_print, inode->i_private);
1996 static ssize_t ab5500_val_write(struct file *file,
1997 const char __user *user_buf,
1998 size_t count, loff_t *ppos)
2000 struct ab5500 *ab = ((struct seq_file *)(file->private_data))->private;
2003 unsigned long user_val;
2007 /* Get userspace string and assure termination */
2008 buf_size = min(count, (sizeof(buf)-1));
2009 if (copy_from_user(buf, user_buf, buf_size))
2013 err = strict_strtoul(buf, 0, &user_val);
2016 if (user_val > 0xff) {
2018 "debugfs error input > 0xff\n");
2021 err = mask_and_set_register_interruptible(
2022 ab, (u8)ab->debug_bank,
2023 (u8)ab->debug_address, 0xFF, (u8)user_val);
2027 get_register_interruptible(ab, (u8)ab->debug_bank,
2028 (u8)ab->debug_address, ®value);
2035 static const struct file_operations ab5500_bank_fops = {
2036 .open = ab5500_bank_open,
2037 .write = ab5500_bank_write,
2039 .llseek = seq_lseek,
2040 .release = single_release,
2041 .owner = THIS_MODULE,
2044 static const struct file_operations ab5500_address_fops = {
2045 .open = ab5500_address_open,
2046 .write = ab5500_address_write,
2048 .llseek = seq_lseek,
2049 .release = single_release,
2050 .owner = THIS_MODULE,
2053 static const struct file_operations ab5500_val_fops = {
2054 .open = ab5500_val_open,
2055 .write = ab5500_val_write,
2057 .llseek = seq_lseek,
2058 .release = single_release,
2059 .owner = THIS_MODULE,
2062 static struct dentry *ab5500_dir;
2063 static struct dentry *ab5500_reg_file;
2064 static struct dentry *ab5500_bank_file;
2065 static struct dentry *ab5500_address_file;
2066 static struct dentry *ab5500_val_file;
2068 static inline void ab5500_setup_debugfs(struct ab5500 *ab)
2070 ab->debug_bank = AB5500_BANK_VIT_IO_I2C_CLK_TST_OTP;
2071 ab->debug_address = AB5500_CHIP_ID;
2073 ab5500_dir = debugfs_create_dir("ab5500", NULL);
2075 goto exit_no_debugfs;
2077 ab5500_reg_file = debugfs_create_file("all-bank-registers",
2078 S_IRUGO, ab5500_dir, ab, &ab5500_registers_fops);
2079 if (!ab5500_reg_file)
2080 goto exit_destroy_dir;
2082 ab5500_bank_file = debugfs_create_file("register-bank",
2083 (S_IRUGO | S_IWUGO), ab5500_dir, ab, &ab5500_bank_fops);
2084 if (!ab5500_bank_file)
2085 goto exit_destroy_reg;
2087 ab5500_address_file = debugfs_create_file("register-address",
2088 (S_IRUGO | S_IWUGO), ab5500_dir, ab, &ab5500_address_fops);
2089 if (!ab5500_address_file)
2090 goto exit_destroy_bank;
2092 ab5500_val_file = debugfs_create_file("register-value",
2093 (S_IRUGO | S_IWUGO), ab5500_dir, ab, &ab5500_val_fops);
2094 if (!ab5500_val_file)
2095 goto exit_destroy_address;
2099 exit_destroy_address:
2100 debugfs_remove(ab5500_address_file);
2102 debugfs_remove(ab5500_bank_file);
2104 debugfs_remove(ab5500_reg_file);
2106 debugfs_remove(ab5500_dir);
2108 dev_err(ab->dev, "failed to create debugfs entries.\n");
2112 static inline void ab5500_remove_debugfs(void)
2114 debugfs_remove(ab5500_val_file);
2115 debugfs_remove(ab5500_address_file);
2116 debugfs_remove(ab5500_bank_file);
2117 debugfs_remove(ab5500_reg_file);
2118 debugfs_remove(ab5500_dir);
2121 #else /* !CONFIG_DEBUG_FS */
2122 static inline void ab5500_setup_debugfs(struct ab5500 *ab)
2125 static inline void ab5500_remove_debugfs(void)
2131 * ab5500_setup : Basic set-up, datastructure creation/destruction
2132 * and I2C interface.This sets up a default config
2133 * in the AB5500 chip so that it will work as expected.
2134 * @ab : Pointer to ab5500 structure
2135 * @settings : Pointer to struct abx500_init_settings
2136 * @size : Size of init data
2138 static int __init ab5500_setup(struct ab5500 *ab,
2139 struct abx500_init_settings *settings, unsigned int size)
2144 for (i = 0; i < size; i++) {
2145 err = mask_and_set_register_interruptible(ab,
2148 0xFF, settings[i].setting);
2152 /* If event mask register update the event mask in ab5500 */
2153 if ((settings[i].bank == AB5500_BANK_IT) &&
2154 (AB5500_MASK_BASE <= settings[i].reg) &&
2155 (settings[i].reg <= AB5500_MASK_END)) {
2156 ab->mask[settings[i].reg - AB5500_MASK_BASE] =
2157 settings[i].setting;
2164 struct ab_family_id {
2169 static const struct ab_family_id ids[] __initdata = {
2185 static int __init ab5500_probe(struct platform_device *pdev)
2188 struct ab5500_platform_data *ab5500_plf_data =
2189 pdev->dev.platform_data;
2193 ab = kzalloc(sizeof(struct ab5500), GFP_KERNEL);
2196 "could not allocate ab5500 device\n");
2200 /* Initialize data structure */
2201 mutex_init(&ab->access_mutex);
2202 mutex_init(&ab->irq_lock);
2203 ab->dev = &pdev->dev;
2205 platform_set_drvdata(pdev, ab);
2207 /* Read chip ID register */
2208 err = get_register_interruptible(ab, AB5500_BANK_VIT_IO_I2C_CLK_TST_OTP,
2209 AB5500_CHIP_ID, &ab->chip_id);
2211 dev_err(&pdev->dev, "could not communicate with the analog "
2213 goto exit_no_detect;
2216 for (i = 0; ids[i].id != 0x0; i++) {
2217 if (ids[i].id == ab->chip_id) {
2218 snprintf(&ab->chip_name[0], sizeof(ab->chip_name) - 1,
2219 "AB5500 %s", ids[i].name);
2223 if (ids[i].id == 0x0) {
2224 dev_err(&pdev->dev, "unknown analog baseband chip id: 0x%x\n",
2226 dev_err(&pdev->dev, "driver not started!\n");
2227 goto exit_no_detect;
2230 /* Clear and mask all interrupts */
2231 for (i = 0; i < AB5500_NUM_IRQ_REGS; i++) {
2232 u8 latchreg = AB5500_IT_LATCH0_REG + i;
2233 u8 maskreg = AB5500_IT_MASK0_REG + i;
2236 get_register_interruptible(ab, AB5500_BANK_IT, latchreg, &val);
2237 set_register_interruptible(ab, AB5500_BANK_IT, maskreg, 0xff);
2238 ab->mask[i] = ab->oldmask[i] = 0xff;
2241 err = abx500_register_ops(&pdev->dev, &ab5500_ops);
2243 dev_err(&pdev->dev, "ab5500_register ops error\n");
2244 goto exit_no_detect;
2247 /* Set up and register the platform devices. */
2248 for (i = 0; i < AB5500_NUM_DEVICES; i++) {
2249 ab5500_devs[i].platform_data = ab5500_plf_data->dev_data[i];
2250 ab5500_devs[i].pdata_size =
2251 sizeof(ab5500_plf_data->dev_data[i]);
2254 err = mfd_add_devices(&pdev->dev, 0, ab5500_devs,
2255 ARRAY_SIZE(ab5500_devs), NULL,
2256 ab5500_plf_data->irq.base);
2258 dev_err(&pdev->dev, "ab5500_mfd_add_device error\n");
2259 goto exit_no_detect;
2262 err = ab5500_setup(ab, ab5500_plf_data->init_settings,
2263 ab5500_plf_data->init_settings_sz);
2265 dev_err(&pdev->dev, "ab5500_setup error\n");
2266 goto exit_no_detect;
2269 ab5500_setup_debugfs(ab);
2271 dev_info(&pdev->dev, "detected AB chip: %s\n", &ab->chip_name[0]);
2279 static int __exit ab5500_remove(struct platform_device *pdev)
2281 struct ab5500 *ab = platform_get_drvdata(pdev);
2283 ab5500_remove_debugfs();
2284 mfd_remove_devices(&pdev->dev);
2289 static struct platform_driver ab5500_driver = {
2291 .name = "ab5500-core",
2292 .owner = THIS_MODULE,
2294 .remove = __exit_p(ab5500_remove),
2297 static int __init ab5500_core_init(void)
2299 return platform_driver_probe(&ab5500_driver, ab5500_probe);
2302 static void __exit ab5500_core_exit(void)
2304 platform_driver_unregister(&ab5500_driver);
2307 subsys_initcall(ab5500_core_init);
2308 module_exit(ab5500_core_exit);
2310 MODULE_AUTHOR("Mattias Wallin <mattias.wallin@stericsson.com>");
2311 MODULE_DESCRIPTION("AB5500 core driver");
2312 MODULE_LICENSE("GPL");