]>
Commit | Line | Data |
---|---|---|
eea6b7cc MK |
1 | /* |
2 | * TI LP8788 MFD Device | |
3 | * | |
4 | * Copyright 2012 Texas Instruments | |
5 | * | |
6 | * Author: Milo(Woogyom) Kim <milo.kim@ti.com> | |
7 | * | |
8 | * This program is free software; you can redistribute it and/or modify | |
9 | * it under the terms of the GNU General Public License version 2 as | |
10 | * published by the Free Software Foundation. | |
11 | * | |
12 | */ | |
13 | ||
14 | #ifndef __MFD_LP8788_H__ | |
15 | #define __MFD_LP8788_H__ | |
16 | ||
17 | #include <linux/gpio.h> | |
18 | #include <linux/irqdomain.h> | |
c5a51053 | 19 | #include <linux/pwm.h> |
eea6b7cc MK |
20 | #include <linux/regmap.h> |
21 | ||
22 | #define LP8788_DEV_BUCK "lp8788-buck" | |
23 | #define LP8788_DEV_DLDO "lp8788-dldo" | |
24 | #define LP8788_DEV_ALDO "lp8788-aldo" | |
25 | #define LP8788_DEV_CHARGER "lp8788-charger" | |
26 | #define LP8788_DEV_RTC "lp8788-rtc" | |
27 | #define LP8788_DEV_BACKLIGHT "lp8788-backlight" | |
28 | #define LP8788_DEV_VIBRATOR "lp8788-vibrator" | |
29 | #define LP8788_DEV_KEYLED "lp8788-keyled" | |
30 | #define LP8788_DEV_ADC "lp8788-adc" | |
31 | ||
32 | #define LP8788_NUM_BUCKS 4 | |
33 | #define LP8788_NUM_DLDOS 12 | |
34 | #define LP8788_NUM_ALDOS 10 | |
35 | #define LP8788_NUM_BUCK2_DVS 2 | |
36 | ||
37 | #define LP8788_CHG_IRQ "CHG_IRQ" | |
38 | #define LP8788_PRSW_IRQ "PRSW_IRQ" | |
39 | #define LP8788_BATT_IRQ "BATT_IRQ" | |
40 | #define LP8788_ALM_IRQ "ALARM_IRQ" | |
41 | ||
42 | enum lp8788_int_id { | |
43 | /* interrup register 1 : Addr 00h */ | |
44 | LP8788_INT_TSDL, | |
45 | LP8788_INT_TSDH, | |
46 | LP8788_INT_UVLO, | |
47 | LP8788_INT_FLAGMON, | |
48 | LP8788_INT_PWRON_TIME, | |
49 | LP8788_INT_PWRON, | |
50 | LP8788_INT_COMP1, | |
51 | LP8788_INT_COMP2, | |
52 | ||
53 | /* interrupt register 2 : Addr 01h */ | |
54 | LP8788_INT_CHG_INPUT_STATE, | |
55 | LP8788_INT_CHG_STATE, | |
56 | LP8788_INT_EOC, | |
57 | LP8788_INT_CHG_RESTART, | |
58 | LP8788_INT_RESTART_TIMEOUT, | |
59 | LP8788_INT_FULLCHG_TIMEOUT, | |
60 | LP8788_INT_PRECHG_TIMEOUT, | |
61 | ||
62 | /* interrupt register 3 : Addr 02h */ | |
63 | LP8788_INT_RTC_ALARM1 = 17, | |
64 | LP8788_INT_RTC_ALARM2, | |
65 | LP8788_INT_ENTER_SYS_SUPPORT, | |
66 | LP8788_INT_EXIT_SYS_SUPPORT, | |
67 | LP8788_INT_BATT_LOW, | |
68 | LP8788_INT_NO_BATT, | |
69 | ||
70 | LP8788_INT_MAX = 24, | |
71 | }; | |
72 | ||
73 | enum lp8788_dvs_sel { | |
74 | DVS_SEL_V0, | |
75 | DVS_SEL_V1, | |
76 | DVS_SEL_V2, | |
77 | DVS_SEL_V3, | |
78 | }; | |
79 | ||
80 | enum lp8788_ext_ldo_en_id { | |
81 | EN_ALDO1, | |
82 | EN_ALDO234, | |
83 | EN_ALDO5, | |
84 | EN_ALDO7, | |
85 | EN_DLDO7, | |
86 | EN_DLDO911, | |
87 | EN_LDOS_MAX, | |
88 | }; | |
89 | ||
90 | enum lp8788_charger_event { | |
91 | NO_CHARGER, | |
92 | CHARGER_DETECTED, | |
93 | }; | |
94 | ||
95 | enum lp8788_bl_ctrl_mode { | |
96 | LP8788_BL_REGISTER_ONLY, | |
97 | LP8788_BL_COMB_PWM_BASED, /* PWM + I2C, changed by PWM input */ | |
98 | LP8788_BL_COMB_REGISTER_BASED, /* PWM + I2C, changed by I2C */ | |
99 | }; | |
100 | ||
101 | enum lp8788_bl_dim_mode { | |
102 | LP8788_DIM_EXPONENTIAL, | |
103 | LP8788_DIM_LINEAR, | |
104 | }; | |
105 | ||
106 | enum lp8788_bl_full_scale_current { | |
107 | LP8788_FULLSCALE_5000uA, | |
108 | LP8788_FULLSCALE_8500uA, | |
109 | LP8788_FULLSCALE_1200uA, | |
110 | LP8788_FULLSCALE_1550uA, | |
111 | LP8788_FULLSCALE_1900uA, | |
112 | LP8788_FULLSCALE_2250uA, | |
113 | LP8788_FULLSCALE_2600uA, | |
114 | LP8788_FULLSCALE_2950uA, | |
115 | }; | |
116 | ||
117 | enum lp8788_bl_ramp_step { | |
118 | LP8788_RAMP_8us, | |
119 | LP8788_RAMP_1024us, | |
120 | LP8788_RAMP_2048us, | |
121 | LP8788_RAMP_4096us, | |
122 | LP8788_RAMP_8192us, | |
123 | LP8788_RAMP_16384us, | |
124 | LP8788_RAMP_32768us, | |
125 | LP8788_RAMP_65538us, | |
126 | }; | |
127 | ||
eea6b7cc MK |
128 | enum lp8788_isink_scale { |
129 | LP8788_ISINK_SCALE_100mA, | |
130 | LP8788_ISINK_SCALE_120mA, | |
131 | }; | |
132 | ||
133 | enum lp8788_isink_number { | |
134 | LP8788_ISINK_1, | |
135 | LP8788_ISINK_2, | |
136 | LP8788_ISINK_3, | |
137 | }; | |
138 | ||
139 | enum lp8788_alarm_sel { | |
140 | LP8788_ALARM_1, | |
141 | LP8788_ALARM_2, | |
142 | LP8788_ALARM_MAX, | |
143 | }; | |
144 | ||
145 | enum lp8788_adc_id { | |
146 | LPADC_VBATT_5P5, | |
147 | LPADC_VIN_CHG, | |
148 | LPADC_IBATT, | |
149 | LPADC_IC_TEMP, | |
150 | LPADC_VBATT_6P0, | |
151 | LPADC_VBATT_5P0, | |
152 | LPADC_ADC1, | |
153 | LPADC_ADC2, | |
154 | LPADC_VDD, | |
155 | LPADC_VCOIN, | |
156 | LPADC_VDD_LDO, | |
157 | LPADC_ADC3, | |
158 | LPADC_ADC4, | |
159 | LPADC_MAX, | |
160 | }; | |
161 | ||
162 | struct lp8788; | |
163 | ||
164 | /* | |
165 | * lp8788_buck1_dvs | |
166 | * @gpio : gpio pin number for dvs control | |
167 | * @vsel : dvs selector for buck v1 register | |
168 | */ | |
169 | struct lp8788_buck1_dvs { | |
170 | int gpio; | |
171 | enum lp8788_dvs_sel vsel; | |
172 | }; | |
173 | ||
174 | /* | |
175 | * lp8788_buck2_dvs | |
176 | * @gpio : two gpio pin numbers are used for dvs | |
177 | * @vsel : dvs selector for buck v2 register | |
178 | */ | |
179 | struct lp8788_buck2_dvs { | |
180 | int gpio[LP8788_NUM_BUCK2_DVS]; | |
181 | enum lp8788_dvs_sel vsel; | |
182 | }; | |
183 | ||
184 | /* | |
185 | * struct lp8788_ldo_enable_pin | |
186 | * | |
187 | * Basically, all LDOs are enabled through the I2C commands. | |
188 | * But ALDO 1 ~ 5, 7, DLDO 7, 9, 11 can be enabled by external gpio pins. | |
189 | * | |
190 | * @gpio : gpio number which is used for enabling ldos | |
191 | * @init_state : initial gpio state (ex. GPIOF_OUT_INIT_LOW) | |
192 | */ | |
193 | struct lp8788_ldo_enable_pin { | |
194 | int gpio; | |
195 | int init_state; | |
196 | }; | |
197 | ||
198 | /* | |
199 | * struct lp8788_chg_param | |
200 | * @addr : charging control register address (range : 0x11 ~ 0x1C) | |
201 | * @val : charging parameter value | |
202 | */ | |
203 | struct lp8788_chg_param { | |
204 | u8 addr; | |
205 | u8 val; | |
206 | }; | |
207 | ||
208 | /* | |
209 | * struct lp8788_charger_platform_data | |
08d816b8 KM |
210 | * @adc_vbatt : adc channel name for battery voltage |
211 | * @adc_batt_temp : adc channel name for battery temperature | |
eea6b7cc MK |
212 | * @max_vbatt_mv : used for calculating battery capacity |
213 | * @chg_params : initial charging parameters | |
214 | * @num_chg_params : numbers of charging parameters | |
215 | * @charger_event : the charger event can be reported to the platform side | |
216 | */ | |
217 | struct lp8788_charger_platform_data { | |
08d816b8 KM |
218 | const char *adc_vbatt; |
219 | const char *adc_batt_temp; | |
eea6b7cc MK |
220 | unsigned int max_vbatt_mv; |
221 | struct lp8788_chg_param *chg_params; | |
222 | int num_chg_params; | |
223 | void (*charger_event) (struct lp8788 *lp, | |
224 | enum lp8788_charger_event event); | |
225 | }; | |
226 | ||
eea6b7cc MK |
227 | /* |
228 | * struct lp8788_backlight_platform_data | |
229 | * @name : backlight driver name. (default: "lcd-backlight") | |
230 | * @initial_brightness : initial value of backlight brightness | |
231 | * @bl_mode : brightness control by pwm or lp8788 register | |
232 | * @dim_mode : dimming mode selection | |
233 | * @full_scale : full scale current setting | |
234 | * @rise_time : brightness ramp up step time | |
235 | * @fall_time : brightness ramp down step time | |
236 | * @pwm_pol : pwm polarity setting when bl_mode is pwm based | |
c5a51053 KM |
237 | * @period_ns : platform specific pwm period value. unit is nano. |
238 | Only valid when bl_mode is LP8788_BL_COMB_PWM_BASED | |
eea6b7cc MK |
239 | */ |
240 | struct lp8788_backlight_platform_data { | |
241 | char *name; | |
242 | int initial_brightness; | |
243 | enum lp8788_bl_ctrl_mode bl_mode; | |
244 | enum lp8788_bl_dim_mode dim_mode; | |
245 | enum lp8788_bl_full_scale_current full_scale; | |
246 | enum lp8788_bl_ramp_step rise_time; | |
247 | enum lp8788_bl_ramp_step fall_time; | |
c5a51053 KM |
248 | enum pwm_polarity pwm_pol; |
249 | unsigned int period_ns; | |
eea6b7cc MK |
250 | }; |
251 | ||
252 | /* | |
253 | * struct lp8788_led_platform_data | |
254 | * @name : led driver name. (default: "keyboard-backlight") | |
255 | * @scale : current scale | |
256 | * @num : current sink number | |
257 | * @iout_code : current output value (Addr 9Ah ~ 9Bh) | |
258 | */ | |
259 | struct lp8788_led_platform_data { | |
260 | char *name; | |
261 | enum lp8788_isink_scale scale; | |
262 | enum lp8788_isink_number num; | |
263 | int iout_code; | |
264 | }; | |
265 | ||
266 | /* | |
267 | * struct lp8788_vib_platform_data | |
268 | * @name : vibrator driver name | |
269 | * @scale : current scale | |
270 | * @num : current sink number | |
271 | * @iout_code : current output value (Addr 9Ah ~ 9Bh) | |
272 | * @pwm_code : PWM code value (Addr 9Ch ~ 9Eh) | |
273 | */ | |
274 | struct lp8788_vib_platform_data { | |
275 | char *name; | |
276 | enum lp8788_isink_scale scale; | |
277 | enum lp8788_isink_number num; | |
278 | int iout_code; | |
279 | int pwm_code; | |
280 | }; | |
281 | ||
282 | /* | |
283 | * struct lp8788_platform_data | |
284 | * @init_func : used for initializing registers | |
285 | * before mfd driver is registered | |
286 | * @buck_data : regulator initial data for buck | |
287 | * @dldo_data : regulator initial data for digital ldo | |
288 | * @aldo_data : regulator initial data for analog ldo | |
289 | * @buck1_dvs : gpio configurations for buck1 dvs | |
290 | * @buck2_dvs : gpio configurations for buck2 dvs | |
291 | * @ldo_pin : gpio configurations for enabling LDOs | |
292 | * @chg_pdata : platform data for charger driver | |
293 | * @alarm_sel : rtc alarm selection (1 or 2) | |
294 | * @bl_pdata : configurable data for backlight driver | |
295 | * @led_pdata : configurable data for led driver | |
296 | * @vib_pdata : configurable data for vibrator driver | |
297 | * @adc_pdata : iio map data for adc driver | |
298 | */ | |
299 | struct lp8788_platform_data { | |
300 | /* general system information */ | |
301 | int (*init_func) (struct lp8788 *lp); | |
302 | ||
303 | /* regulators */ | |
304 | struct regulator_init_data *buck_data[LP8788_NUM_BUCKS]; | |
305 | struct regulator_init_data *dldo_data[LP8788_NUM_DLDOS]; | |
306 | struct regulator_init_data *aldo_data[LP8788_NUM_ALDOS]; | |
307 | struct lp8788_buck1_dvs *buck1_dvs; | |
308 | struct lp8788_buck2_dvs *buck2_dvs; | |
309 | struct lp8788_ldo_enable_pin *ldo_pin[EN_LDOS_MAX]; | |
310 | ||
311 | /* charger */ | |
312 | struct lp8788_charger_platform_data *chg_pdata; | |
313 | ||
314 | /* rtc alarm */ | |
315 | enum lp8788_alarm_sel alarm_sel; | |
316 | ||
317 | /* backlight */ | |
318 | struct lp8788_backlight_platform_data *bl_pdata; | |
319 | ||
320 | /* current sinks */ | |
321 | struct lp8788_led_platform_data *led_pdata; | |
322 | struct lp8788_vib_platform_data *vib_pdata; | |
323 | ||
324 | /* adc iio map data */ | |
325 | struct iio_map *adc_pdata; | |
326 | }; | |
327 | ||
328 | /* | |
329 | * struct lp8788 | |
330 | * @dev : parent device pointer | |
331 | * @regmap : used for i2c communcation on accessing registers | |
332 | * @irqdm : interrupt domain for handling nested interrupt | |
333 | * @irq : pin number of IRQ_N | |
334 | * @pdata : lp8788 platform specific data | |
335 | */ | |
336 | struct lp8788 { | |
337 | struct device *dev; | |
338 | struct regmap *regmap; | |
339 | struct irq_domain *irqdm; | |
340 | int irq; | |
341 | struct lp8788_platform_data *pdata; | |
342 | }; | |
343 | ||
344 | int lp8788_irq_init(struct lp8788 *lp, int chip_irq); | |
345 | void lp8788_irq_exit(struct lp8788 *lp); | |
346 | int lp8788_read_byte(struct lp8788 *lp, u8 reg, u8 *data); | |
347 | int lp8788_read_multi_bytes(struct lp8788 *lp, u8 reg, u8 *data, size_t count); | |
348 | int lp8788_write_byte(struct lp8788 *lp, u8 reg, u8 data); | |
349 | int lp8788_update_bits(struct lp8788 *lp, u8 reg, u8 mask, u8 data); | |
350 | #endif |