1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
|
/* linux/mfd/max8907c.h
*
* Functions to access MAX8907C power management chip.
*
* Copyright (C) 2010 Gyungoh Yoo <jack.yoo@maxim-ic.com>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation.
*/
#ifndef __LINUX_MFD_MAX8907C_H
#define __LINUX_MFD_MAX8907C_H
/* MAX8907C register map */
#define MAX8907C_REG_SYSENSEL 0x00
#define MAX8907C_REG_ON_OFF_IRQ1 0x01
#define MAX8907C_REG_ON_OFF_IRQ1_MASK 0x02
#define MAX8907C_REG_ON_OFF_STAT 0x03
#define MAX8907C_REG_SDCTL1 0x04
#define MAX8907C_REG_SDSEQCNT1 0x05
#define MAX8907C_REG_SDV1 0x06
#define MAX8907C_REG_SDCTL2 0x07
#define MAX8907C_REG_SDSEQCNT2 0x08
#define MAX8907C_REG_SDV2 0x09
#define MAX8907C_REG_SDCTL3 0x0A
#define MAX8907C_REG_SDSEQCNT3 0x0B
#define MAX8907C_REG_SDV3 0x0C
#define MAX8907C_REG_ON_OFF_IRQ2 0x0D
#define MAX8907C_REG_ON_OFF_IRQ2_MASK 0x0E
#define MAX8907C_REG_RESET_CNFG 0x0F
#define MAX8907C_REG_LDOCTL16 0x10
#define MAX8907C_REG_LDOSEQCNT16 0x11
#define MAX8907C_REG_LDO16VOUT 0x12
#define MAX8907C_REG_SDBYSEQCNT 0x13
#define MAX8907C_REG_LDOCTL17 0x14
#define MAX8907C_REG_LDOSEQCNT17 0x15
#define MAX8907C_REG_LDO17VOUT 0x16
#define MAX8907C_REG_LDOCTL1 0x18
#define MAX8907C_REG_LDOSEQCNT1 0x19
#define MAX8907C_REG_LDO1VOUT 0x1A
#define MAX8907C_REG_LDOCTL2 0x1C
#define MAX8907C_REG_LDOSEQCNT2 0x1D
#define MAX8907C_REG_LDO2VOUT 0x1E
#define MAX8907C_REG_LDOCTL3 0x20
#define MAX8907C_REG_LDOSEQCNT3 0x21
#define MAX8907C_REG_LDO3VOUT 0x22
#define MAX8907C_REG_LDOCTL4 0x24
#define MAX8907C_REG_LDOSEQCNT4 0x25
#define MAX8907C_REG_LDO4VOUT 0x26
#define MAX8907C_REG_LDOCTL5 0x28
#define MAX8907C_REG_LDOSEQCNT5 0x29
#define MAX8907C_REG_LDO5VOUT 0x2A
#define MAX8907C_REG_LDOCTL6 0x2C
#define MAX8907C_REG_LDOSEQCNT6 0x2D
#define MAX8907C_REG_LDO6VOUT 0x2E
#define MAX8907C_REG_LDOCTL7 0x30
#define MAX8907C_REG_LDOSEQCNT7 0x31
#define MAX8907C_REG_LDO7VOUT 0x32
#define MAX8907C_REG_LDOCTL8 0x34
#define MAX8907C_REG_LDOSEQCNT8 0x35
#define MAX8907C_REG_LDO8VOUT 0x36
#define MAX8907C_REG_LDOCTL9 0x38
#define MAX8907C_REG_LDOSEQCNT9 0x39
#define MAX8907C_REG_LDO9VOUT 0x3A
#define MAX8907C_REG_LDOCTL10 0x3C
#define MAX8907C_REG_LDOSEQCNT10 0x3D
#define MAX8907C_REG_LDO10VOUT 0x3E
#define MAX8907C_REG_LDOCTL11 0x40
#define MAX8907C_REG_LDOSEQCNT11 0x41
#define MAX8907C_REG_LDO11VOUT 0x42
#define MAX8907C_REG_LDOCTL12 0x44
#define MAX8907C_REG_LDOSEQCNT12 0x45
#define MAX8907C_REG_LDO12VOUT 0x46
#define MAX8907C_REG_LDOCTL13 0x48
#define MAX8907C_REG_LDOSEQCNT13 0x49
#define MAX8907C_REG_LDO13VOUT 0x4A
#define MAX8907C_REG_LDOCTL14 0x4C
#define MAX8907C_REG_LDOSEQCNT14 0x4D
#define MAX8907C_REG_LDO14VOUT 0x4E
#define MAX8907C_REG_LDOCTL15 0x50
#define MAX8907C_REG_LDOSEQCNT15 0x51
#define MAX8907C_REG_LDO15VOUT 0x52
#define MAX8907C_REG_OUT5VEN 0x54
#define MAX8907C_REG_OUT5VSEQ 0x55
#define MAX8907C_REG_OUT33VEN 0x58
#define MAX8907C_REG_OUT33VSEQ 0x59
#define MAX8907C_REG_LDOCTL19 0x5C
#define MAX8907C_REG_LDOSEQCNT19 0x5D
#define MAX8907C_REG_LDO19VOUT 0x5E
#define MAX8907C_REG_LBCNFG 0x60
#define MAX8907C_REG_SEQ1CNFG 0x64
#define MAX8907C_REG_SEQ2CNFG 0x65
#define MAX8907C_REG_SEQ3CNFG 0x66
#define MAX8907C_REG_SEQ4CNFG 0x67
#define MAX8907C_REG_SEQ5CNFG 0x68
#define MAX8907C_REG_SEQ6CNFG 0x69
#define MAX8907C_REG_SEQ7CNFG 0x6A
#define MAX8907C_REG_LDOCTL18 0x72
#define MAX8907C_REG_LDOSEQCNT18 0x73
#define MAX8907C_REG_LDO18VOUT 0x74
#define MAX8907C_REG_BBAT_CNFG 0x78
#define MAX8907C_REG_CHG_CNTL1 0x7C
#define MAX8907C_REG_CHG_CNTL2 0x7D
#define MAX8907C_REG_CHG_IRQ1 0x7E
#define MAX8907C_REG_CHG_IRQ2 0x7F
#define MAX8907C_REG_CHG_IRQ1_MASK 0x80
#define MAX8907C_REG_CHG_IRQ2_MASK 0x81
#define MAX8907C_REG_CHG_STAT 0x82
#define MAX8907C_REG_WLED_MODE_CNTL 0x84
#define MAX8907C_REG_ILED_CNTL 0x84
#define MAX8907C_REG_II1RR 0x8E
#define MAX8907C_REG_II2RR 0x8F
#define MAX8907C_REG_LDOCTL20 0x9C
#define MAX8907C_REG_LDOSEQCNT20 0x9D
#define MAX8907C_REG_LDO20VOUT 0x9E
/* RTC register */
#define MAX8907C_REG_RTC_SEC 0x00
#define MAX8907C_REG_RTC_MIN 0x01
#define MAX8907C_REG_RTC_HOURS 0x02
#define MAX8907C_REG_RTC_WEEKDAY 0x03
#define MAX8907C_REG_RTC_DATE 0x04
#define MAX8907C_REG_RTC_MONTH 0x05
#define MAX8907C_REG_RTC_YEAR1 0x06
#define MAX8907C_REG_RTC_YEAR2 0x07
#define MAX8907C_REG_ALARM0_SEC 0x08
#define MAX8907C_REG_ALARM0_MIN 0x09
#define MAX8907C_REG_ALARM0_HOURS 0x0A
#define MAX8907C_REG_ALARM0_WEEKDAY 0x0B
#define MAX8907C_REG_ALARM0_DATE 0x0C
#define MAX8907C_REG_ALARM0_MONTH 0x0D
#define MAX8907C_REG_ALARM0_YEAR1 0x0E
#define MAX8907C_REG_ALARM0_YEAR2 0x0F
#define MAX8907C_REG_ALARM1_SEC 0x10
#define MAX8907C_REG_ALARM1_MIN 0x11
#define MAX8907C_REG_ALARM1_HOURS 0x12
#define MAX8907C_REG_ALARM1_WEEKDAY 0x13
#define MAX8907C_REG_ALARM1_DATE 0x14
#define MAX8907C_REG_ALARM1_MONTH 0x15
#define MAX8907C_REG_ALARM1_YEAR1 0x16
#define MAX8907C_REG_ALARM1_YEAR2 0x17
#define MAX8907C_REG_ALARM0_CNTL 0x18
#define MAX8907C_REG_ALARM1_CNTL 0x19
#define MAX8907C_REG_RTC_STATUS 0x1A
#define MAX8907C_REG_RTC_CNTL 0x1B
#define MAX8907C_REG_RTC_IRQ 0x1C
#define MAX8907C_REG_RTC_IRQ_MASK 0x1D
#define MAX8907C_REG_MPL_CNTL 0x1E
/* ADC and Touch Screen Controller register map */
#define MAX8907C_CTL 0
#define MAX8907C_SEQCNT 1
#define MAX8907C_VOUT 2
/* mask bit fields */
#define MAX8907C_MASK_LDO_SEQ 0x1C
#define MAX8907C_MASK_LDO_EN 0x01
#define MAX8907C_MASK_VBBATTCV 0x03
#define MAX8907C_MASK_OUT5V_VINEN 0x10
#define MAX8907C_MASK_OUT5V_ENSRC 0x0E
#define MAX8907C_MASK_OUT5V_EN 0x01
/* Power off bit in RESET_CNFG reg */
#define MAX8907C_MASK_POWER_OFF 0x40
#define MAX8907C_MASK_PWR_EN 0x80
#define MAX8907C_MASK_CTL_SEQ 0x1C
#define MAX8907C_PWR_EN 0x80
#define MAX8907C_CTL_SEQ 0x04
#define MAX8907C_SD_SEQ1 0x02
#define MAX8907C_SD_SEQ2 0x06
#define MAX8907C_DELAY_CNT0 0x00
#define MAX8907C_POWER_UP_DELAY_CNT1 0x10
#define MAX8907C_POWER_UP_DELAY_CNT12 0xC0
#define MAX8907C_POWER_DOWN_DELAY_CNT12 0x0C
#define RTC_I2C_ADDR 0x68
/*
* MAX8907B revision requires s/w WAR to connect PWREN input to
* sequencer 2 because of the bug in the silicon.
*/
#define MAX8907B_II2RR_PWREN_WAR (0x12)
/* Defines common for all supplies PWREN sequencer selection */
#define MAX8907B_SEQSEL_PWREN_LXX 1 /* SEQ2 (PWREN) */
/* IRQ definitions */
enum {
MAX8907C_IRQ_VCHG_DC_OVP,
MAX8907C_IRQ_VCHG_DC_F,
MAX8907C_IRQ_VCHG_DC_R,
MAX8907C_IRQ_VCHG_THM_OK_R,
MAX8907C_IRQ_VCHG_THM_OK_F,
MAX8907C_IRQ_VCHG_MBATTLOW_F,
MAX8907C_IRQ_VCHG_MBATTLOW_R,
MAX8907C_IRQ_VCHG_RST,
MAX8907C_IRQ_VCHG_DONE,
MAX8907C_IRQ_VCHG_TOPOFF,
MAX8907C_IRQ_VCHG_TMR_FAULT,
MAX8907C_IRQ_GPM_RSTIN,
MAX8907C_IRQ_GPM_MPL,
MAX8907C_IRQ_GPM_SW_3SEC,
MAX8907C_IRQ_GPM_EXTON_F,
MAX8907C_IRQ_GPM_EXTON_R,
MAX8907C_IRQ_GPM_SW_1SEC,
MAX8907C_IRQ_GPM_SW_F,
MAX8907C_IRQ_GPM_SW_R,
MAX8907C_IRQ_GPM_SYSCKEN_F,
MAX8907C_IRQ_GPM_SYSCKEN_R,
MAX8907C_IRQ_RTC_ALARM1,
MAX8907C_IRQ_RTC_ALARM0,
MAX8907C_NR_IRQS,
};
struct max8907c {
struct device *dev;
struct mutex io_lock;
struct mutex irq_lock;
struct i2c_client *i2c_power;
struct i2c_client *i2c_rtc;
int irq_base;
int core_irq;
unsigned char cache_chg[2];
unsigned char cache_on[2];
unsigned char cache_rtc;
};
struct max8907c_platform_data {
int num_subdevs;
struct platform_device **subdevs;
int irq_base;
int (*max8907c_setup)(void);
};
int max8907c_reg_read(struct i2c_client *i2c, u8 reg);
int max8907c_reg_bulk_read(struct i2c_client *i2c, u8 reg, u8 count, u8 *val);
int max8907c_reg_write(struct i2c_client *i2c, u8 reg, u8 val);
int max8907c_reg_bulk_write(struct i2c_client *i2c, u8 reg, u8 count, u8 *val);
int max8907c_set_bits(struct i2c_client *i2c, u8 reg, u8 mask, u8 val);
int max8907c_irq_init(struct max8907c *chip, int irq, int irq_base);
void max8907c_irq_free(struct max8907c *chip);
int max8907c_suspend(struct i2c_client *i2c, pm_message_t state);
int max8907c_resume(struct i2c_client *i2c);
int max8907c_power_off(void);
void max8907c_deep_sleep(int enter);
int max8907c_pwr_en_config(void);
int max8907c_pwr_en_attach(void);
#endif
|