2 * Copyright (C) ST-Ericsson SA 2010
4 * License Terms: GNU General Public License v2
5 * Author: Srinidhi Kasagar <srinidhi.kasagar@stericsson.com>
6 * Author: Rabin Vincent <rabin.vincent@stericsson.com>
7 * Author: Mattias Wallin <mattias.wallin@stericsson.com>
10 #include <linux/kernel.h>
11 #include <linux/slab.h>
12 #include <linux/init.h>
13 #include <linux/irq.h>
14 #include <linux/delay.h>
15 #include <linux/interrupt.h>
16 #include <linux/module.h>
17 #include <linux/platform_device.h>
18 #include <linux/mfd/core.h>
19 #include <linux/mfd/abx500.h>
20 #include <linux/mfd/abx500/ab8500.h>
21 #include <linux/mfd/dbx500-prcmu.h>
22 #include <linux/regulator/ab8500.h>
24 #include <linux/of_device.h>
27 * Interrupt register offsets
30 #define AB8500_IT_SOURCE1_REG 0x00
31 #define AB8500_IT_SOURCE2_REG 0x01
32 #define AB8500_IT_SOURCE3_REG 0x02
33 #define AB8500_IT_SOURCE4_REG 0x03
34 #define AB8500_IT_SOURCE5_REG 0x04
35 #define AB8500_IT_SOURCE6_REG 0x05
36 #define AB8500_IT_SOURCE7_REG 0x06
37 #define AB8500_IT_SOURCE8_REG 0x07
38 #define AB9540_IT_SOURCE13_REG 0x0C
39 #define AB8500_IT_SOURCE19_REG 0x12
40 #define AB8500_IT_SOURCE20_REG 0x13
41 #define AB8500_IT_SOURCE21_REG 0x14
42 #define AB8500_IT_SOURCE22_REG 0x15
43 #define AB8500_IT_SOURCE23_REG 0x16
44 #define AB8500_IT_SOURCE24_REG 0x17
49 #define AB8500_IT_LATCH1_REG 0x20
50 #define AB8500_IT_LATCH2_REG 0x21
51 #define AB8500_IT_LATCH3_REG 0x22
52 #define AB8500_IT_LATCH4_REG 0x23
53 #define AB8500_IT_LATCH5_REG 0x24
54 #define AB8500_IT_LATCH6_REG 0x25
55 #define AB8500_IT_LATCH7_REG 0x26
56 #define AB8500_IT_LATCH8_REG 0x27
57 #define AB8500_IT_LATCH9_REG 0x28
58 #define AB8500_IT_LATCH10_REG 0x29
59 #define AB8500_IT_LATCH12_REG 0x2B
60 #define AB9540_IT_LATCH13_REG 0x2C
61 #define AB8500_IT_LATCH19_REG 0x32
62 #define AB8500_IT_LATCH20_REG 0x33
63 #define AB8500_IT_LATCH21_REG 0x34
64 #define AB8500_IT_LATCH22_REG 0x35
65 #define AB8500_IT_LATCH23_REG 0x36
66 #define AB8500_IT_LATCH24_REG 0x37
72 #define AB8500_IT_MASK1_REG 0x40
73 #define AB8500_IT_MASK2_REG 0x41
74 #define AB8500_IT_MASK3_REG 0x42
75 #define AB8500_IT_MASK4_REG 0x43
76 #define AB8500_IT_MASK5_REG 0x44
77 #define AB8500_IT_MASK6_REG 0x45
78 #define AB8500_IT_MASK7_REG 0x46
79 #define AB8500_IT_MASK8_REG 0x47
80 #define AB8500_IT_MASK9_REG 0x48
81 #define AB8500_IT_MASK10_REG 0x49
82 #define AB8500_IT_MASK11_REG 0x4A
83 #define AB8500_IT_MASK12_REG 0x4B
84 #define AB8500_IT_MASK13_REG 0x4C
85 #define AB8500_IT_MASK14_REG 0x4D
86 #define AB8500_IT_MASK15_REG 0x4E
87 #define AB8500_IT_MASK16_REG 0x4F
88 #define AB8500_IT_MASK17_REG 0x50
89 #define AB8500_IT_MASK18_REG 0x51
90 #define AB8500_IT_MASK19_REG 0x52
91 #define AB8500_IT_MASK20_REG 0x53
92 #define AB8500_IT_MASK21_REG 0x54
93 #define AB8500_IT_MASK22_REG 0x55
94 #define AB8500_IT_MASK23_REG 0x56
95 #define AB8500_IT_MASK24_REG 0x57
98 * latch hierarchy registers
100 #define AB8500_IT_LATCHHIER1_REG 0x60
101 #define AB8500_IT_LATCHHIER2_REG 0x61
102 #define AB8500_IT_LATCHHIER3_REG 0x62
104 #define AB8500_IT_LATCHHIER_NUM 3
106 #define AB8500_REV_REG 0x80
107 #define AB8500_IC_NAME_REG 0x82
108 #define AB8500_SWITCH_OFF_STATUS 0x00
110 #define AB8500_TURN_ON_STATUS 0x00
112 static bool no_bm
; /* No battery management */
113 module_param(no_bm
, bool, S_IRUGO
);
115 #define AB9540_MODEM_CTRL2_REG 0x23
116 #define AB9540_MODEM_CTRL2_SWDBBRSTN_BIT BIT(2)
119 * Map interrupt numbers to the LATCH and MASK register offsets, Interrupt
120 * numbers are indexed into this array with (num / 8). The interupts are
121 * defined in linux/mfd/ab8500.h
123 * This is one off from the register names, i.e. AB8500_IT_MASK1_REG is at
127 static const int ab8500_irq_regoffset
[AB8500_NUM_IRQ_REGS
] = {
128 0, 1, 2, 3, 4, 6, 7, 8, 9, 11, 18, 19, 20, 21,
132 static const int ab9540_irq_regoffset
[AB9540_NUM_IRQ_REGS
] = {
133 0, 1, 2, 3, 4, 6, 7, 8, 9, 11, 18, 19, 20, 21, 12, 13, 24,
136 static const char ab8500_version_str
[][7] = {
137 [AB8500_VERSION_AB8500
] = "AB8500",
138 [AB8500_VERSION_AB8505
] = "AB8505",
139 [AB8500_VERSION_AB9540
] = "AB9540",
140 [AB8500_VERSION_AB8540
] = "AB8540",
143 static int ab8500_i2c_write(struct ab8500
*ab8500
, u16 addr
, u8 data
)
147 ret
= prcmu_abb_write((u8
)(addr
>> 8), (u8
)(addr
& 0xFF), &data
, 1);
149 dev_err(ab8500
->dev
, "prcmu i2c error %d\n", ret
);
153 static int ab8500_i2c_write_masked(struct ab8500
*ab8500
, u16 addr
, u8 mask
,
158 ret
= prcmu_abb_write_masked((u8
)(addr
>> 8), (u8
)(addr
& 0xFF), &data
,
161 dev_err(ab8500
->dev
, "prcmu i2c error %d\n", ret
);
165 static int ab8500_i2c_read(struct ab8500
*ab8500
, u16 addr
)
170 ret
= prcmu_abb_read((u8
)(addr
>> 8), (u8
)(addr
& 0xFF), &data
, 1);
172 dev_err(ab8500
->dev
, "prcmu i2c error %d\n", ret
);
178 static int ab8500_get_chip_id(struct device
*dev
)
180 struct ab8500
*ab8500
;
184 ab8500
= dev_get_drvdata(dev
->parent
);
185 return ab8500
? (int)ab8500
->chip_id
: -EINVAL
;
188 static int set_register_interruptible(struct ab8500
*ab8500
, u8 bank
,
193 * Put the u8 bank and u8 register together into a an u16.
194 * The bank on higher 8 bits and register in lower 8 bits.
196 u16 addr
= ((u16
)bank
) << 8 | reg
;
198 dev_vdbg(ab8500
->dev
, "wr: addr %#x <= %#x\n", addr
, data
);
200 mutex_lock(&ab8500
->lock
);
202 ret
= ab8500
->write(ab8500
, addr
, data
);
204 dev_err(ab8500
->dev
, "failed to write reg %#x: %d\n",
206 mutex_unlock(&ab8500
->lock
);
211 static int ab8500_set_register(struct device
*dev
, u8 bank
,
215 struct ab8500
*ab8500
= dev_get_drvdata(dev
->parent
);
217 atomic_inc(&ab8500
->transfer_ongoing
);
218 ret
= set_register_interruptible(ab8500
, bank
, reg
, value
);
219 atomic_dec(&ab8500
->transfer_ongoing
);
223 static int get_register_interruptible(struct ab8500
*ab8500
, u8 bank
,
227 /* put the u8 bank and u8 reg together into a an u16.
228 * bank on higher 8 bits and reg in lower */
229 u16 addr
= ((u16
)bank
) << 8 | reg
;
231 mutex_lock(&ab8500
->lock
);
233 ret
= ab8500
->read(ab8500
, addr
);
235 dev_err(ab8500
->dev
, "failed to read reg %#x: %d\n",
240 mutex_unlock(&ab8500
->lock
);
241 dev_vdbg(ab8500
->dev
, "rd: addr %#x => data %#x\n", addr
, ret
);
246 static int ab8500_get_register(struct device
*dev
, u8 bank
,
250 struct ab8500
*ab8500
= dev_get_drvdata(dev
->parent
);
252 atomic_inc(&ab8500
->transfer_ongoing
);
253 ret
= get_register_interruptible(ab8500
, bank
, reg
, value
);
254 atomic_dec(&ab8500
->transfer_ongoing
);
258 static int mask_and_set_register_interruptible(struct ab8500
*ab8500
, u8 bank
,
259 u8 reg
, u8 bitmask
, u8 bitvalues
)
262 /* put the u8 bank and u8 reg together into a an u16.
263 * bank on higher 8 bits and reg in lower */
264 u16 addr
= ((u16
)bank
) << 8 | reg
;
266 mutex_lock(&ab8500
->lock
);
268 if (ab8500
->write_masked
== NULL
) {
271 ret
= ab8500
->read(ab8500
, addr
);
273 dev_err(ab8500
->dev
, "failed to read reg %#x: %d\n",
279 data
= (~bitmask
& data
) | (bitmask
& bitvalues
);
281 ret
= ab8500
->write(ab8500
, addr
, data
);
283 dev_err(ab8500
->dev
, "failed to write reg %#x: %d\n",
286 dev_vdbg(ab8500
->dev
, "mask: addr %#x => data %#x\n", addr
,
290 ret
= ab8500
->write_masked(ab8500
, addr
, bitmask
, bitvalues
);
292 dev_err(ab8500
->dev
, "failed to modify reg %#x: %d\n", addr
,
295 mutex_unlock(&ab8500
->lock
);
299 static int ab8500_mask_and_set_register(struct device
*dev
,
300 u8 bank
, u8 reg
, u8 bitmask
, u8 bitvalues
)
303 struct ab8500
*ab8500
= dev_get_drvdata(dev
->parent
);
305 atomic_inc(&ab8500
->transfer_ongoing
);
306 ret
= mask_and_set_register_interruptible(ab8500
, bank
, reg
,
308 atomic_dec(&ab8500
->transfer_ongoing
);
312 static struct abx500_ops ab8500_ops
= {
313 .get_chip_id
= ab8500_get_chip_id
,
314 .get_register
= ab8500_get_register
,
315 .set_register
= ab8500_set_register
,
316 .get_register_page
= NULL
,
317 .set_register_page
= NULL
,
318 .mask_and_set_register
= ab8500_mask_and_set_register
,
319 .event_registers_startup_state_get
= NULL
,
320 .startup_irq_enabled
= NULL
,
323 static void ab8500_irq_lock(struct irq_data
*data
)
325 struct ab8500
*ab8500
= irq_data_get_irq_chip_data(data
);
327 mutex_lock(&ab8500
->irq_lock
);
328 atomic_inc(&ab8500
->transfer_ongoing
);
331 static void ab8500_irq_sync_unlock(struct irq_data
*data
)
333 struct ab8500
*ab8500
= irq_data_get_irq_chip_data(data
);
336 for (i
= 0; i
< ab8500
->mask_size
; i
++) {
337 u8 old
= ab8500
->oldmask
[i
];
338 u8
new = ab8500
->mask
[i
];
345 * Interrupt register 12 doesn't exist prior to AB8500 version
348 if (ab8500
->irq_reg_offset
[i
] == 11 &&
349 is_ab8500_1p1_or_earlier(ab8500
))
352 ab8500
->oldmask
[i
] = new;
354 reg
= AB8500_IT_MASK1_REG
+ ab8500
->irq_reg_offset
[i
];
355 set_register_interruptible(ab8500
, AB8500_INTERRUPT
, reg
, new);
357 atomic_dec(&ab8500
->transfer_ongoing
);
358 mutex_unlock(&ab8500
->irq_lock
);
361 static void ab8500_irq_mask(struct irq_data
*data
)
363 struct ab8500
*ab8500
= irq_data_get_irq_chip_data(data
);
364 int offset
= data
->irq
- ab8500
->irq_base
;
365 int index
= offset
/ 8;
366 int mask
= 1 << (offset
% 8);
368 ab8500
->mask
[index
] |= mask
;
371 static void ab8500_irq_unmask(struct irq_data
*data
)
373 struct ab8500
*ab8500
= irq_data_get_irq_chip_data(data
);
374 int offset
= data
->irq
- ab8500
->irq_base
;
375 int index
= offset
/ 8;
376 int mask
= 1 << (offset
% 8);
378 ab8500
->mask
[index
] &= ~mask
;
381 static struct irq_chip ab8500_irq_chip
= {
383 .irq_bus_lock
= ab8500_irq_lock
,
384 .irq_bus_sync_unlock
= ab8500_irq_sync_unlock
,
385 .irq_mask
= ab8500_irq_mask
,
386 .irq_disable
= ab8500_irq_mask
,
387 .irq_unmask
= ab8500_irq_unmask
,
390 static int ab8500_handle_hierarchical_line(struct ab8500
*ab8500
,
391 int latch_offset
, u8 latch_val
)
393 int int_bit
= __ffs(latch_val
);
397 int_bit
= __ffs(latch_val
);
399 for (i
= 0; i
< ab8500
->mask_size
; i
++)
400 if (ab8500
->irq_reg_offset
[i
] == latch_offset
)
403 if (i
>= ab8500
->mask_size
) {
404 dev_err(ab8500
->dev
, "Register offset 0x%2x not declared\n",
409 line
= (i
<< 3) + int_bit
;
410 latch_val
&= ~(1 << int_bit
);
412 handle_nested_irq(ab8500
->irq_base
+ line
);
418 static int ab8500_handle_hierarchical_latch(struct ab8500
*ab8500
,
419 int hier_offset
, u8 hier_val
)
421 int latch_bit
, status
;
422 u8 latch_offset
, latch_val
;
425 latch_bit
= __ffs(hier_val
);
426 latch_offset
= (hier_offset
<< 3) + latch_bit
;
428 /* Fix inconsistent ITFromLatch25 bit mapping... */
429 if (unlikely(latch_offset
== 17))
432 status
= get_register_interruptible(ab8500
,
434 AB8500_IT_LATCH1_REG
+ latch_offset
,
436 if (status
< 0 || latch_val
== 0)
439 status
= ab8500_handle_hierarchical_line(ab8500
,
440 latch_offset
, latch_val
);
444 hier_val
&= ~(1 << latch_bit
);
450 static irqreturn_t
ab8500_hierarchical_irq(int irq
, void *dev
)
452 struct ab8500
*ab8500
= dev
;
455 dev_vdbg(ab8500
->dev
, "interrupt\n");
457 /* Hierarchical interrupt version */
458 for (i
= 0; i
< AB8500_IT_LATCHHIER_NUM
; i
++) {
462 status
= get_register_interruptible(ab8500
, AB8500_INTERRUPT
,
463 AB8500_IT_LATCHHIER1_REG
+ i
, &hier_val
);
464 if (status
< 0 || hier_val
== 0)
467 status
= ab8500_handle_hierarchical_latch(ab8500
, i
, hier_val
);
474 static irqreturn_t
ab8500_irq(int irq
, void *dev
)
476 struct ab8500
*ab8500
= dev
;
479 dev_vdbg(ab8500
->dev
, "interrupt\n");
481 atomic_inc(&ab8500
->transfer_ongoing
);
483 for (i
= 0; i
< ab8500
->mask_size
; i
++) {
484 int regoffset
= ab8500
->irq_reg_offset
[i
];
489 * Interrupt register 12 doesn't exist prior to AB8500 version
492 if (regoffset
== 11 && is_ab8500_1p1_or_earlier(ab8500
))
495 status
= get_register_interruptible(ab8500
, AB8500_INTERRUPT
,
496 AB8500_IT_LATCH1_REG
+ regoffset
, &value
);
497 if (status
< 0 || value
== 0)
501 int bit
= __ffs(value
);
502 int line
= i
* 8 + bit
;
504 handle_nested_irq(ab8500
->irq_base
+ line
);
505 value
&= ~(1 << bit
);
509 atomic_dec(&ab8500
->transfer_ongoing
);
513 static int ab8500_irq_init(struct ab8500
*ab8500
)
515 int base
= ab8500
->irq_base
;
519 if (is_ab9540(ab8500
))
520 num_irqs
= AB9540_NR_IRQS
;
521 else if (is_ab8505(ab8500
))
522 num_irqs
= AB8505_NR_IRQS
;
524 num_irqs
= AB8500_NR_IRQS
;
526 for (irq
= base
; irq
< base
+ num_irqs
; irq
++) {
527 irq_set_chip_data(irq
, ab8500
);
528 irq_set_chip_and_handler(irq
, &ab8500_irq_chip
,
530 irq_set_nested_thread(irq
, 1);
532 set_irq_flags(irq
, IRQF_VALID
);
534 irq_set_noprobe(irq
);
541 static void ab8500_irq_remove(struct ab8500
*ab8500
)
543 int base
= ab8500
->irq_base
;
547 if (is_ab9540(ab8500
))
548 num_irqs
= AB9540_NR_IRQS
;
549 else if (is_ab8505(ab8500
))
550 num_irqs
= AB8505_NR_IRQS
;
552 num_irqs
= AB8500_NR_IRQS
;
554 for (irq
= base
; irq
< base
+ num_irqs
; irq
++) {
556 set_irq_flags(irq
, 0);
558 irq_set_chip_and_handler(irq
, NULL
, NULL
);
559 irq_set_chip_data(irq
, NULL
);
563 int ab8500_suspend(struct ab8500
*ab8500
)
565 if (atomic_read(&ab8500
->transfer_ongoing
))
571 /* AB8500 GPIO Resources */
572 static struct resource __devinitdata ab8500_gpio_resources
[] = {
575 .start
= AB8500_INT_GPIO6R
,
576 .end
= AB8500_INT_GPIO41F
,
577 .flags
= IORESOURCE_IRQ
,
581 /* AB9540 GPIO Resources */
582 static struct resource __devinitdata ab9540_gpio_resources
[] = {
585 .start
= AB8500_INT_GPIO6R
,
586 .end
= AB8500_INT_GPIO41F
,
587 .flags
= IORESOURCE_IRQ
,
590 .name
= "GPIO_INT14",
591 .start
= AB9540_INT_GPIO50R
,
592 .end
= AB9540_INT_GPIO54R
,
593 .flags
= IORESOURCE_IRQ
,
596 .name
= "GPIO_INT15",
597 .start
= AB9540_INT_GPIO50F
,
598 .end
= AB9540_INT_GPIO54F
,
599 .flags
= IORESOURCE_IRQ
,
603 static struct resource __devinitdata ab8500_gpadc_resources
[] = {
605 .name
= "HW_CONV_END",
606 .start
= AB8500_INT_GP_HW_ADC_CONV_END
,
607 .end
= AB8500_INT_GP_HW_ADC_CONV_END
,
608 .flags
= IORESOURCE_IRQ
,
611 .name
= "SW_CONV_END",
612 .start
= AB8500_INT_GP_SW_ADC_CONV_END
,
613 .end
= AB8500_INT_GP_SW_ADC_CONV_END
,
614 .flags
= IORESOURCE_IRQ
,
618 static struct resource __devinitdata ab8500_rtc_resources
[] = {
621 .start
= AB8500_INT_RTC_60S
,
622 .end
= AB8500_INT_RTC_60S
,
623 .flags
= IORESOURCE_IRQ
,
627 .start
= AB8500_INT_RTC_ALARM
,
628 .end
= AB8500_INT_RTC_ALARM
,
629 .flags
= IORESOURCE_IRQ
,
633 static struct resource __devinitdata ab8500_poweronkey_db_resources
[] = {
636 .start
= AB8500_INT_PON_KEY1DB_F
,
637 .end
= AB8500_INT_PON_KEY1DB_F
,
638 .flags
= IORESOURCE_IRQ
,
642 .start
= AB8500_INT_PON_KEY1DB_R
,
643 .end
= AB8500_INT_PON_KEY1DB_R
,
644 .flags
= IORESOURCE_IRQ
,
648 static struct resource __devinitdata ab8500_av_acc_detect_resources
[] = {
650 .name
= "ACC_DETECT_1DB_F",
651 .start
= AB8500_INT_ACC_DETECT_1DB_F
,
652 .end
= AB8500_INT_ACC_DETECT_1DB_F
,
653 .flags
= IORESOURCE_IRQ
,
656 .name
= "ACC_DETECT_1DB_R",
657 .start
= AB8500_INT_ACC_DETECT_1DB_R
,
658 .end
= AB8500_INT_ACC_DETECT_1DB_R
,
659 .flags
= IORESOURCE_IRQ
,
662 .name
= "ACC_DETECT_21DB_F",
663 .start
= AB8500_INT_ACC_DETECT_21DB_F
,
664 .end
= AB8500_INT_ACC_DETECT_21DB_F
,
665 .flags
= IORESOURCE_IRQ
,
668 .name
= "ACC_DETECT_21DB_R",
669 .start
= AB8500_INT_ACC_DETECT_21DB_R
,
670 .end
= AB8500_INT_ACC_DETECT_21DB_R
,
671 .flags
= IORESOURCE_IRQ
,
674 .name
= "ACC_DETECT_22DB_F",
675 .start
= AB8500_INT_ACC_DETECT_22DB_F
,
676 .end
= AB8500_INT_ACC_DETECT_22DB_F
,
677 .flags
= IORESOURCE_IRQ
,
680 .name
= "ACC_DETECT_22DB_R",
681 .start
= AB8500_INT_ACC_DETECT_22DB_R
,
682 .end
= AB8500_INT_ACC_DETECT_22DB_R
,
683 .flags
= IORESOURCE_IRQ
,
687 static struct resource __devinitdata ab8500_charger_resources
[] = {
689 .name
= "MAIN_CH_UNPLUG_DET",
690 .start
= AB8500_INT_MAIN_CH_UNPLUG_DET
,
691 .end
= AB8500_INT_MAIN_CH_UNPLUG_DET
,
692 .flags
= IORESOURCE_IRQ
,
695 .name
= "MAIN_CHARGE_PLUG_DET",
696 .start
= AB8500_INT_MAIN_CH_PLUG_DET
,
697 .end
= AB8500_INT_MAIN_CH_PLUG_DET
,
698 .flags
= IORESOURCE_IRQ
,
701 .name
= "VBUS_DET_R",
702 .start
= AB8500_INT_VBUS_DET_R
,
703 .end
= AB8500_INT_VBUS_DET_R
,
704 .flags
= IORESOURCE_IRQ
,
707 .name
= "VBUS_DET_F",
708 .start
= AB8500_INT_VBUS_DET_F
,
709 .end
= AB8500_INT_VBUS_DET_F
,
710 .flags
= IORESOURCE_IRQ
,
713 .name
= "USB_LINK_STATUS",
714 .start
= AB8500_INT_USB_LINK_STATUS
,
715 .end
= AB8500_INT_USB_LINK_STATUS
,
716 .flags
= IORESOURCE_IRQ
,
720 .start
= AB8500_INT_VBUS_OVV
,
721 .end
= AB8500_INT_VBUS_OVV
,
722 .flags
= IORESOURCE_IRQ
,
725 .name
= "USB_CH_TH_PROT_R",
726 .start
= AB8500_INT_USB_CH_TH_PROT_R
,
727 .end
= AB8500_INT_USB_CH_TH_PROT_R
,
728 .flags
= IORESOURCE_IRQ
,
731 .name
= "USB_CH_TH_PROT_F",
732 .start
= AB8500_INT_USB_CH_TH_PROT_F
,
733 .end
= AB8500_INT_USB_CH_TH_PROT_F
,
734 .flags
= IORESOURCE_IRQ
,
737 .name
= "MAIN_EXT_CH_NOT_OK",
738 .start
= AB8500_INT_MAIN_EXT_CH_NOT_OK
,
739 .end
= AB8500_INT_MAIN_EXT_CH_NOT_OK
,
740 .flags
= IORESOURCE_IRQ
,
743 .name
= "MAIN_CH_TH_PROT_R",
744 .start
= AB8500_INT_MAIN_CH_TH_PROT_R
,
745 .end
= AB8500_INT_MAIN_CH_TH_PROT_R
,
746 .flags
= IORESOURCE_IRQ
,
749 .name
= "MAIN_CH_TH_PROT_F",
750 .start
= AB8500_INT_MAIN_CH_TH_PROT_F
,
751 .end
= AB8500_INT_MAIN_CH_TH_PROT_F
,
752 .flags
= IORESOURCE_IRQ
,
755 .name
= "USB_CHARGER_NOT_OKR",
756 .start
= AB8500_INT_USB_CHARGER_NOT_OKR
,
757 .end
= AB8500_INT_USB_CHARGER_NOT_OKR
,
758 .flags
= IORESOURCE_IRQ
,
762 .start
= AB8500_INT_CH_WD_EXP
,
763 .end
= AB8500_INT_CH_WD_EXP
,
764 .flags
= IORESOURCE_IRQ
,
768 static struct resource __devinitdata ab8500_btemp_resources
[] = {
770 .name
= "BAT_CTRL_INDB",
771 .start
= AB8500_INT_BAT_CTRL_INDB
,
772 .end
= AB8500_INT_BAT_CTRL_INDB
,
773 .flags
= IORESOURCE_IRQ
,
777 .start
= AB8500_INT_BTEMP_LOW
,
778 .end
= AB8500_INT_BTEMP_LOW
,
779 .flags
= IORESOURCE_IRQ
,
782 .name
= "BTEMP_HIGH",
783 .start
= AB8500_INT_BTEMP_HIGH
,
784 .end
= AB8500_INT_BTEMP_HIGH
,
785 .flags
= IORESOURCE_IRQ
,
788 .name
= "BTEMP_LOW_MEDIUM",
789 .start
= AB8500_INT_BTEMP_LOW_MEDIUM
,
790 .end
= AB8500_INT_BTEMP_LOW_MEDIUM
,
791 .flags
= IORESOURCE_IRQ
,
794 .name
= "BTEMP_MEDIUM_HIGH",
795 .start
= AB8500_INT_BTEMP_MEDIUM_HIGH
,
796 .end
= AB8500_INT_BTEMP_MEDIUM_HIGH
,
797 .flags
= IORESOURCE_IRQ
,
801 static struct resource __devinitdata ab8500_fg_resources
[] = {
803 .name
= "NCONV_ACCU",
804 .start
= AB8500_INT_CCN_CONV_ACC
,
805 .end
= AB8500_INT_CCN_CONV_ACC
,
806 .flags
= IORESOURCE_IRQ
,
810 .start
= AB8500_INT_BATT_OVV
,
811 .end
= AB8500_INT_BATT_OVV
,
812 .flags
= IORESOURCE_IRQ
,
816 .start
= AB8500_INT_LOW_BAT_F
,
817 .end
= AB8500_INT_LOW_BAT_F
,
818 .flags
= IORESOURCE_IRQ
,
822 .start
= AB8500_INT_LOW_BAT_R
,
823 .end
= AB8500_INT_LOW_BAT_R
,
824 .flags
= IORESOURCE_IRQ
,
827 .name
= "CC_INT_CALIB",
828 .start
= AB8500_INT_CC_INT_CALIB
,
829 .end
= AB8500_INT_CC_INT_CALIB
,
830 .flags
= IORESOURCE_IRQ
,
834 .start
= AB8500_INT_CCEOC
,
835 .end
= AB8500_INT_CCEOC
,
836 .flags
= IORESOURCE_IRQ
,
840 static struct resource __devinitdata ab8500_chargalg_resources
[] = {};
842 #ifdef CONFIG_DEBUG_FS
843 static struct resource __devinitdata ab8500_debug_resources
[] = {
846 .start
= AB8500_INT_MAIN_EXT_CH_NOT_OK
,
847 .end
= AB8500_INT_MAIN_EXT_CH_NOT_OK
,
848 .flags
= IORESOURCE_IRQ
,
852 .start
= AB8500_INT_XTAL32K_KO
,
853 .end
= AB8500_INT_XTAL32K_KO
,
854 .flags
= IORESOURCE_IRQ
,
859 static struct resource __devinitdata ab8500_usb_resources
[] = {
861 .name
= "ID_WAKEUP_R",
862 .start
= AB8500_INT_ID_WAKEUP_R
,
863 .end
= AB8500_INT_ID_WAKEUP_R
,
864 .flags
= IORESOURCE_IRQ
,
867 .name
= "ID_WAKEUP_F",
868 .start
= AB8500_INT_ID_WAKEUP_F
,
869 .end
= AB8500_INT_ID_WAKEUP_F
,
870 .flags
= IORESOURCE_IRQ
,
873 .name
= "VBUS_DET_F",
874 .start
= AB8500_INT_VBUS_DET_F
,
875 .end
= AB8500_INT_VBUS_DET_F
,
876 .flags
= IORESOURCE_IRQ
,
879 .name
= "VBUS_DET_R",
880 .start
= AB8500_INT_VBUS_DET_R
,
881 .end
= AB8500_INT_VBUS_DET_R
,
882 .flags
= IORESOURCE_IRQ
,
885 .name
= "USB_LINK_STATUS",
886 .start
= AB8500_INT_USB_LINK_STATUS
,
887 .end
= AB8500_INT_USB_LINK_STATUS
,
888 .flags
= IORESOURCE_IRQ
,
891 .name
= "USB_ADP_PROBE_PLUG",
892 .start
= AB8500_INT_ADP_PROBE_PLUG
,
893 .end
= AB8500_INT_ADP_PROBE_PLUG
,
894 .flags
= IORESOURCE_IRQ
,
897 .name
= "USB_ADP_PROBE_UNPLUG",
898 .start
= AB8500_INT_ADP_PROBE_UNPLUG
,
899 .end
= AB8500_INT_ADP_PROBE_UNPLUG
,
900 .flags
= IORESOURCE_IRQ
,
904 static struct resource __devinitdata ab8505_iddet_resources
[] = {
906 .name
= "KeyDeglitch",
907 .start
= AB8505_INT_KEYDEGLITCH
,
908 .end
= AB8505_INT_KEYDEGLITCH
,
909 .flags
= IORESOURCE_IRQ
,
913 .start
= AB8505_INT_KP
,
914 .end
= AB8505_INT_KP
,
915 .flags
= IORESOURCE_IRQ
,
919 .start
= AB8505_INT_IKP
,
920 .end
= AB8505_INT_IKP
,
921 .flags
= IORESOURCE_IRQ
,
925 .start
= AB8505_INT_IKR
,
926 .end
= AB8505_INT_IKR
,
927 .flags
= IORESOURCE_IRQ
,
931 .start
= AB8505_INT_KEYSTUCK
,
932 .end
= AB8505_INT_KEYSTUCK
,
933 .flags
= IORESOURCE_IRQ
,
937 static struct resource __devinitdata ab8500_temp_resources
[] = {
939 .name
= "AB8500_TEMP_WARM",
940 .start
= AB8500_INT_TEMP_WARM
,
941 .end
= AB8500_INT_TEMP_WARM
,
942 .flags
= IORESOURCE_IRQ
,
946 static struct mfd_cell __devinitdata abx500_common_devs
[] = {
947 #ifdef CONFIG_DEBUG_FS
949 .name
= "ab8500-debug",
950 .num_resources
= ARRAY_SIZE(ab8500_debug_resources
),
951 .resources
= ab8500_debug_resources
,
955 .name
= "ab8500-sysctrl",
958 .name
= "ab8500-regulator",
961 .name
= "ab8500-gpadc",
962 .num_resources
= ARRAY_SIZE(ab8500_gpadc_resources
),
963 .resources
= ab8500_gpadc_resources
,
966 .name
= "ab8500-rtc",
967 .num_resources
= ARRAY_SIZE(ab8500_rtc_resources
),
968 .resources
= ab8500_rtc_resources
,
971 .name
= "ab8500-acc-det",
972 .num_resources
= ARRAY_SIZE(ab8500_av_acc_detect_resources
),
973 .resources
= ab8500_av_acc_detect_resources
,
976 .name
= "ab8500-poweron-key",
977 .num_resources
= ARRAY_SIZE(ab8500_poweronkey_db_resources
),
978 .resources
= ab8500_poweronkey_db_resources
,
981 .name
= "ab8500-pwm",
985 .name
= "ab8500-pwm",
989 .name
= "ab8500-pwm",
992 { .name
= "ab8500-leds", },
994 .name
= "ab8500-denc",
997 .name
= "ab8500-temp",
998 .num_resources
= ARRAY_SIZE(ab8500_temp_resources
),
999 .resources
= ab8500_temp_resources
,
1003 static struct mfd_cell __devinitdata ab8500_bm_devs
[] = {
1005 .name
= "ab8500-charger",
1006 .num_resources
= ARRAY_SIZE(ab8500_charger_resources
),
1007 .resources
= ab8500_charger_resources
,
1010 .name
= "ab8500-btemp",
1011 .num_resources
= ARRAY_SIZE(ab8500_btemp_resources
),
1012 .resources
= ab8500_btemp_resources
,
1015 .name
= "ab8500-fg",
1016 .num_resources
= ARRAY_SIZE(ab8500_fg_resources
),
1017 .resources
= ab8500_fg_resources
,
1020 .name
= "ab8500-chargalg",
1021 .num_resources
= ARRAY_SIZE(ab8500_chargalg_resources
),
1022 .resources
= ab8500_chargalg_resources
,
1026 static struct mfd_cell __devinitdata ab8500_devs
[] = {
1028 .name
= "ab8500-gpio",
1029 .num_resources
= ARRAY_SIZE(ab8500_gpio_resources
),
1030 .resources
= ab8500_gpio_resources
,
1033 .name
= "ab8500-usb",
1034 .num_resources
= ARRAY_SIZE(ab8500_usb_resources
),
1035 .resources
= ab8500_usb_resources
,
1038 .name
= "ab8500-codec",
1042 static struct mfd_cell __devinitdata ab9540_devs
[] = {
1044 .name
= "ab8500-gpio",
1045 .num_resources
= ARRAY_SIZE(ab9540_gpio_resources
),
1046 .resources
= ab9540_gpio_resources
,
1049 .name
= "ab9540-usb",
1050 .num_resources
= ARRAY_SIZE(ab8500_usb_resources
),
1051 .resources
= ab8500_usb_resources
,
1054 .name
= "ab9540-codec",
1058 /* Device list common to ab9540 and ab8505 */
1059 static struct mfd_cell __devinitdata ab9540_ab8505_devs
[] = {
1062 .num_resources
= ARRAY_SIZE(ab8505_iddet_resources
),
1063 .resources
= ab8505_iddet_resources
,
1067 static ssize_t
show_chip_id(struct device
*dev
,
1068 struct device_attribute
*attr
, char *buf
)
1070 struct ab8500
*ab8500
;
1072 ab8500
= dev_get_drvdata(dev
);
1073 return sprintf(buf
, "%#x\n", ab8500
? ab8500
->chip_id
: -EINVAL
);
1077 * ab8500 has switched off due to (SWITCH_OFF_STATUS):
1078 * 0x01 Swoff bit programming
1079 * 0x02 Thermal protection activation
1080 * 0x04 Vbat lower then BattOk falling threshold
1081 * 0x08 Watchdog expired
1082 * 0x10 Non presence of 32kHz clock
1083 * 0x20 Battery level lower than power on reset threshold
1084 * 0x40 Power on key 1 pressed longer than 10 seconds
1085 * 0x80 DB8500 thermal shutdown
1087 static ssize_t
show_switch_off_status(struct device
*dev
,
1088 struct device_attribute
*attr
, char *buf
)
1092 struct ab8500
*ab8500
;
1094 ab8500
= dev_get_drvdata(dev
);
1095 ret
= get_register_interruptible(ab8500
, AB8500_RTC
,
1096 AB8500_SWITCH_OFF_STATUS
, &value
);
1099 return sprintf(buf
, "%#x\n", value
);
1103 * ab8500 has turned on due to (TURN_ON_STATUS):
1113 static ssize_t
show_turn_on_status(struct device
*dev
,
1114 struct device_attribute
*attr
, char *buf
)
1118 struct ab8500
*ab8500
;
1120 ab8500
= dev_get_drvdata(dev
);
1121 ret
= get_register_interruptible(ab8500
, AB8500_SYS_CTRL1_BLOCK
,
1122 AB8500_TURN_ON_STATUS
, &value
);
1125 return sprintf(buf
, "%#x\n", value
);
1128 static ssize_t
show_ab9540_dbbrstn(struct device
*dev
,
1129 struct device_attribute
*attr
, char *buf
)
1131 struct ab8500
*ab8500
;
1135 ab8500
= dev_get_drvdata(dev
);
1137 ret
= get_register_interruptible(ab8500
, AB8500_REGU_CTRL2
,
1138 AB9540_MODEM_CTRL2_REG
, &value
);
1142 return sprintf(buf
, "%d\n",
1143 (value
& AB9540_MODEM_CTRL2_SWDBBRSTN_BIT
) ? 1 : 0);
1146 static ssize_t
store_ab9540_dbbrstn(struct device
*dev
,
1147 struct device_attribute
*attr
, const char *buf
, size_t count
)
1149 struct ab8500
*ab8500
;
1154 ab8500
= dev_get_drvdata(dev
);
1162 bitvalues
= AB9540_MODEM_CTRL2_SWDBBRSTN_BIT
;
1168 err
= mask_and_set_register_interruptible(ab8500
,
1169 AB8500_REGU_CTRL2
, AB9540_MODEM_CTRL2_REG
,
1170 AB9540_MODEM_CTRL2_SWDBBRSTN_BIT
, bitvalues
);
1172 dev_info(ab8500
->dev
,
1173 "Failed to set DBBRSTN %c, err %#x\n",
1181 static DEVICE_ATTR(chip_id
, S_IRUGO
, show_chip_id
, NULL
);
1182 static DEVICE_ATTR(switch_off_status
, S_IRUGO
, show_switch_off_status
, NULL
);
1183 static DEVICE_ATTR(turn_on_status
, S_IRUGO
, show_turn_on_status
, NULL
);
1184 static DEVICE_ATTR(dbbrstn
, S_IRUGO
| S_IWUSR
,
1185 show_ab9540_dbbrstn
, store_ab9540_dbbrstn
);
1187 static struct attribute
*ab8500_sysfs_entries
[] = {
1188 &dev_attr_chip_id
.attr
,
1189 &dev_attr_switch_off_status
.attr
,
1190 &dev_attr_turn_on_status
.attr
,
1194 static struct attribute
*ab9540_sysfs_entries
[] = {
1195 &dev_attr_chip_id
.attr
,
1196 &dev_attr_switch_off_status
.attr
,
1197 &dev_attr_turn_on_status
.attr
,
1198 &dev_attr_dbbrstn
.attr
,
1202 static struct attribute_group ab8500_attr_group
= {
1203 .attrs
= ab8500_sysfs_entries
,
1206 static struct attribute_group ab9540_attr_group
= {
1207 .attrs
= ab9540_sysfs_entries
,
1210 static const struct of_device_id ab8500_match
[] = {
1212 .compatible
= "stericsson,ab8500",
1213 .data
= (void *)AB8500_VERSION_AB8500
,
1218 static int __devinit
ab8500_probe(struct platform_device
*pdev
)
1220 struct ab8500_platform_data
*plat
= dev_get_platdata(&pdev
->dev
);
1221 const struct platform_device_id
*platid
= platform_get_device_id(pdev
);
1222 enum ab8500_version version
= AB8500_VERSION_UNDEFINED
;
1223 struct device_node
*np
= pdev
->dev
.of_node
;
1224 struct ab8500
*ab8500
;
1225 struct resource
*resource
;
1230 ab8500
= kzalloc(sizeof *ab8500
, GFP_KERNEL
);
1235 ab8500
->irq_base
= plat
->irq_base
;
1237 ret
= of_property_read_u32(np
, "stericsson,irq-base", &ab8500
->irq_base
);
1239 if (!ab8500
->irq_base
) {
1240 dev_info(&pdev
->dev
, "couldn't find irq-base\n");
1242 goto out_free_ab8500
;
1245 ab8500
->dev
= &pdev
->dev
;
1247 resource
= platform_get_resource(pdev
, IORESOURCE_IRQ
, 0);
1250 goto out_free_ab8500
;
1253 ab8500
->irq
= resource
->start
;
1255 ab8500
->read
= ab8500_i2c_read
;
1256 ab8500
->write
= ab8500_i2c_write
;
1257 ab8500
->write_masked
= ab8500_i2c_write_masked
;
1259 mutex_init(&ab8500
->lock
);
1260 mutex_init(&ab8500
->irq_lock
);
1261 atomic_set(&ab8500
->transfer_ongoing
, 0);
1263 platform_set_drvdata(pdev
, ab8500
);
1266 version
= platid
->driver_data
;
1268 version
= (unsigned int)
1269 of_match_device(ab8500_match
, &pdev
->dev
)->data
;
1271 if (version
!= AB8500_VERSION_UNDEFINED
)
1272 ab8500
->version
= version
;
1274 ret
= get_register_interruptible(ab8500
, AB8500_MISC
,
1275 AB8500_IC_NAME_REG
, &value
);
1277 goto out_free_ab8500
;
1279 ab8500
->version
= value
;
1282 ret
= get_register_interruptible(ab8500
, AB8500_MISC
,
1283 AB8500_REV_REG
, &value
);
1285 goto out_free_ab8500
;
1287 ab8500
->chip_id
= value
;
1289 dev_info(ab8500
->dev
, "detected chip, %s rev. %1x.%1x\n",
1290 ab8500_version_str
[ab8500
->version
],
1291 ab8500
->chip_id
>> 4,
1292 ab8500
->chip_id
& 0x0F);
1294 /* Configure AB8500 or AB9540 IRQ */
1295 if (is_ab9540(ab8500
) || is_ab8505(ab8500
)) {
1296 ab8500
->mask_size
= AB9540_NUM_IRQ_REGS
;
1297 ab8500
->irq_reg_offset
= ab9540_irq_regoffset
;
1299 ab8500
->mask_size
= AB8500_NUM_IRQ_REGS
;
1300 ab8500
->irq_reg_offset
= ab8500_irq_regoffset
;
1302 ab8500
->mask
= kzalloc(ab8500
->mask_size
, GFP_KERNEL
);
1305 ab8500
->oldmask
= kzalloc(ab8500
->mask_size
, GFP_KERNEL
);
1306 if (!ab8500
->oldmask
) {
1311 * ab8500 has switched off due to (SWITCH_OFF_STATUS):
1312 * 0x01 Swoff bit programming
1313 * 0x02 Thermal protection activation
1314 * 0x04 Vbat lower then BattOk falling threshold
1315 * 0x08 Watchdog expired
1316 * 0x10 Non presence of 32kHz clock
1317 * 0x20 Battery level lower than power on reset threshold
1318 * 0x40 Power on key 1 pressed longer than 10 seconds
1319 * 0x80 DB8500 thermal shutdown
1322 ret
= get_register_interruptible(ab8500
, AB8500_RTC
,
1323 AB8500_SWITCH_OFF_STATUS
, &value
);
1326 dev_info(ab8500
->dev
, "switch off status: %#x", value
);
1328 if (plat
&& plat
->init
)
1331 /* Clear and mask all interrupts */
1332 for (i
= 0; i
< ab8500
->mask_size
; i
++) {
1334 * Interrupt register 12 doesn't exist prior to AB8500 version
1337 if (ab8500
->irq_reg_offset
[i
] == 11 &&
1338 is_ab8500_1p1_or_earlier(ab8500
))
1341 get_register_interruptible(ab8500
, AB8500_INTERRUPT
,
1342 AB8500_IT_LATCH1_REG
+ ab8500
->irq_reg_offset
[i
],
1344 set_register_interruptible(ab8500
, AB8500_INTERRUPT
,
1345 AB8500_IT_MASK1_REG
+ ab8500
->irq_reg_offset
[i
], 0xff);
1348 ret
= abx500_register_ops(ab8500
->dev
, &ab8500_ops
);
1350 goto out_freeoldmask
;
1352 for (i
= 0; i
< ab8500
->mask_size
; i
++)
1353 ab8500
->mask
[i
] = ab8500
->oldmask
[i
] = 0xff;
1355 if (ab8500
->irq_base
) {
1356 ret
= ab8500_irq_init(ab8500
);
1358 goto out_freeoldmask
;
1360 /* Activate this feature only in ab9540 */
1361 /* till tests are done on ab8500 1p2 or later*/
1362 if (is_ab9540(ab8500
))
1363 ret
= request_threaded_irq(ab8500
->irq
, NULL
,
1364 ab8500_hierarchical_irq
,
1365 IRQF_ONESHOT
| IRQF_NO_SUSPEND
,
1368 ret
= request_threaded_irq(ab8500
->irq
, NULL
,
1370 IRQF_ONESHOT
| IRQF_NO_SUSPEND
,
1377 ret
= mfd_add_devices(ab8500
->dev
, 0, abx500_common_devs
,
1378 ARRAY_SIZE(abx500_common_devs
), NULL
,
1384 if (is_ab9540(ab8500
))
1385 ret
= mfd_add_devices(ab8500
->dev
, 0, ab9540_devs
,
1386 ARRAY_SIZE(ab9540_devs
), NULL
,
1389 ret
= mfd_add_devices(ab8500
->dev
, 0, ab8500_devs
,
1390 ARRAY_SIZE(ab8500_devs
), NULL
,
1395 if (is_ab9540(ab8500
) || is_ab8505(ab8500
))
1396 ret
= mfd_add_devices(ab8500
->dev
, 0, ab9540_ab8505_devs
,
1397 ARRAY_SIZE(ab9540_ab8505_devs
), NULL
,
1404 /* Add battery management devices */
1405 ret
= mfd_add_devices(ab8500
->dev
, 0, ab8500_bm_devs
,
1406 ARRAY_SIZE(ab8500_bm_devs
), NULL
,
1409 dev_err(ab8500
->dev
, "error adding bm devices\n");
1412 if (is_ab9540(ab8500
))
1413 ret
= sysfs_create_group(&ab8500
->dev
->kobj
,
1414 &ab9540_attr_group
);
1416 ret
= sysfs_create_group(&ab8500
->dev
->kobj
,
1417 &ab8500_attr_group
);
1419 dev_err(ab8500
->dev
, "error creating sysfs entries\n");
1424 if (ab8500
->irq_base
)
1425 free_irq(ab8500
->irq
, ab8500
);
1427 if (ab8500
->irq_base
)
1428 ab8500_irq_remove(ab8500
);
1430 kfree(ab8500
->oldmask
);
1432 kfree(ab8500
->mask
);
1439 static int __devexit
ab8500_remove(struct platform_device
*pdev
)
1441 struct ab8500
*ab8500
= platform_get_drvdata(pdev
);
1443 if (is_ab9540(ab8500
))
1444 sysfs_remove_group(&ab8500
->dev
->kobj
, &ab9540_attr_group
);
1446 sysfs_remove_group(&ab8500
->dev
->kobj
, &ab8500_attr_group
);
1447 mfd_remove_devices(ab8500
->dev
);
1448 if (ab8500
->irq_base
) {
1449 free_irq(ab8500
->irq
, ab8500
);
1450 ab8500_irq_remove(ab8500
);
1452 kfree(ab8500
->oldmask
);
1453 kfree(ab8500
->mask
);
1459 static const struct platform_device_id ab8500_id
[] = {
1460 { "ab8500-core", AB8500_VERSION_AB8500
},
1461 { "ab8505-i2c", AB8500_VERSION_AB8505
},
1462 { "ab9540-i2c", AB8500_VERSION_AB9540
},
1463 { "ab8540-i2c", AB8500_VERSION_AB8540
},
1467 static struct platform_driver ab8500_core_driver
= {
1469 .name
= "ab8500-core",
1470 .owner
= THIS_MODULE
,
1471 .of_match_table
= ab8500_match
,
1473 .probe
= ab8500_probe
,
1474 .remove
= __devexit_p(ab8500_remove
),
1475 .id_table
= ab8500_id
,
1478 static int __init
ab8500_core_init(void)
1480 return platform_driver_register(&ab8500_core_driver
);
1483 static void __exit
ab8500_core_exit(void)
1485 platform_driver_unregister(&ab8500_core_driver
);
1487 arch_initcall(ab8500_core_init
);
1488 module_exit(ab8500_core_exit
);
1490 MODULE_AUTHOR("Mattias Wallin, Srinidhi Kasagar, Rabin Vincent");
1491 MODULE_DESCRIPTION("AB8500 MFD core");
1492 MODULE_LICENSE("GPL v2");