]>
Commit | Line | Data |
---|---|---|
14fa5691 LW |
1 | /* |
2 | * Copyright (C) 2007-2009 ST-Ericsson AB | |
3 | * License terms: GNU General Public License (GPL) version 2 | |
4 | * AB3100 core access functions | |
5 | * Author: Linus Walleij <linus.walleij@stericsson.com> | |
fa661258 MW |
6 | * |
7 | * ABX500 core access functions. | |
8 | * The abx500 interface is used for the Analog Baseband chip | |
72fb9220 | 9 | * ab3100 and ab8500. |
fa661258 MW |
10 | * |
11 | * Author: Mattias Wallin <mattias.wallin@stericsson.com> | |
12 | * Author: Mattias Nilsson <mattias.i.nilsson@stericsson.com> | |
13 | * Author: Bengt Jonsson <bengt.g.jonsson@stericsson.com> | |
14 | * Author: Rickard Andersson <rickard.andersson@stericsson.com> | |
14fa5691 LW |
15 | */ |
16 | ||
d619bc14 | 17 | #include <linux/regulator/machine.h> |
14fa5691 | 18 | |
313162d0 PG |
19 | struct device; |
20 | ||
fa661258 MW |
21 | #ifndef MFD_ABX500_H |
22 | #define MFD_ABX500_H | |
14fa5691 | 23 | |
fa661258 MW |
24 | #define AB3100_P1A 0xc0 |
25 | #define AB3100_P1B 0xc1 | |
26 | #define AB3100_P1C 0xc2 | |
27 | #define AB3100_P1D 0xc3 | |
28 | #define AB3100_P1E 0xc4 | |
29 | #define AB3100_P1F 0xc5 | |
30 | #define AB3100_P1G 0xc6 | |
31 | #define AB3100_R2A 0xc7 | |
32 | #define AB3100_R2B 0xc8 | |
14fa5691 LW |
33 | |
34 | /* | |
35 | * AB3100, EVENTA1, A2 and A3 event register flags | |
36 | * these are catenated into a single 32-bit flag in the code | |
37 | * for event notification broadcasts. | |
38 | */ | |
39 | #define AB3100_EVENTA1_ONSWA (0x01<<16) | |
40 | #define AB3100_EVENTA1_ONSWB (0x02<<16) | |
41 | #define AB3100_EVENTA1_ONSWC (0x04<<16) | |
42 | #define AB3100_EVENTA1_DCIO (0x08<<16) | |
43 | #define AB3100_EVENTA1_OVER_TEMP (0x10<<16) | |
44 | #define AB3100_EVENTA1_SIM_OFF (0x20<<16) | |
45 | #define AB3100_EVENTA1_VBUS (0x40<<16) | |
46 | #define AB3100_EVENTA1_VSET_USB (0x80<<16) | |
47 | ||
48 | #define AB3100_EVENTA2_READY_TX (0x01<<8) | |
49 | #define AB3100_EVENTA2_READY_RX (0x02<<8) | |
50 | #define AB3100_EVENTA2_OVERRUN_ERROR (0x04<<8) | |
51 | #define AB3100_EVENTA2_FRAMING_ERROR (0x08<<8) | |
52 | #define AB3100_EVENTA2_CHARG_OVERCURRENT (0x10<<8) | |
53 | #define AB3100_EVENTA2_MIDR (0x20<<8) | |
54 | #define AB3100_EVENTA2_BATTERY_REM (0x40<<8) | |
55 | #define AB3100_EVENTA2_ALARM (0x80<<8) | |
56 | ||
57 | #define AB3100_EVENTA3_ADC_TRIG5 (0x01) | |
58 | #define AB3100_EVENTA3_ADC_TRIG4 (0x02) | |
59 | #define AB3100_EVENTA3_ADC_TRIG3 (0x04) | |
60 | #define AB3100_EVENTA3_ADC_TRIG2 (0x08) | |
61 | #define AB3100_EVENTA3_ADC_TRIGVBAT (0x10) | |
62 | #define AB3100_EVENTA3_ADC_TRIGVTX (0x20) | |
63 | #define AB3100_EVENTA3_ADC_TRIG1 (0x40) | |
64 | #define AB3100_EVENTA3_ADC_TRIG0 (0x80) | |
65 | ||
66 | /* AB3100, STR register flags */ | |
67 | #define AB3100_STR_ONSWA (0x01) | |
68 | #define AB3100_STR_ONSWB (0x02) | |
69 | #define AB3100_STR_ONSWC (0x04) | |
70 | #define AB3100_STR_DCIO (0x08) | |
71 | #define AB3100_STR_BOOT_MODE (0x10) | |
72 | #define AB3100_STR_SIM_OFF (0x20) | |
73 | #define AB3100_STR_BATT_REMOVAL (0x40) | |
74 | #define AB3100_STR_VBUS (0x80) | |
75 | ||
d619bc14 LW |
76 | /* |
77 | * AB3100 contains 8 regulators, one external regulator controller | |
78 | * and a buck converter, further the LDO E and buck converter can | |
79 | * have separate settings if they are in sleep mode, this is | |
80 | * modeled as a separate regulator. | |
81 | */ | |
82 | #define AB3100_NUM_REGULATORS 10 | |
83 | ||
14fa5691 LW |
84 | /** |
85 | * struct ab3100 | |
86 | * @access_mutex: lock out concurrent accesses to the AB3100 registers | |
87 | * @dev: pointer to the containing device | |
88 | * @i2c_client: I2C client for this chip | |
89 | * @testreg_client: secondary client for test registers | |
90 | * @chip_name: name of this chip variant | |
91 | * @chip_id: 8 bit chip ID for this chip variant | |
14fa5691 LW |
92 | * @event_subscribers: event subscribers are listed here |
93 | * @startup_events: a copy of the first reading of the event registers | |
94 | * @startup_events_read: whether the first events have been read | |
95 | * | |
96 | * This struct is PRIVATE and devices using it should NOT | |
97 | * access ANY fields. It is used as a token for calling the | |
98 | * AB3100 functions. | |
99 | */ | |
100 | struct ab3100 { | |
101 | struct mutex access_mutex; | |
102 | struct device *dev; | |
103 | struct i2c_client *i2c_client; | |
104 | struct i2c_client *testreg_client; | |
105 | char chip_name[32]; | |
106 | u8 chip_id; | |
14fa5691 | 107 | struct blocking_notifier_head event_subscribers; |
fa661258 | 108 | u8 startup_events[3]; |
14fa5691 LW |
109 | bool startup_events_read; |
110 | }; | |
111 | ||
d619bc14 LW |
112 | /** |
113 | * struct ab3100_platform_data | |
114 | * Data supplied to initialize board connections to the AB3100 | |
115 | * @reg_constraints: regulator constraints for target board | |
116 | * the order of these constraints are: LDO A, C, D, E, | |
117 | * F, G, H, K, EXT and BUCK. | |
118 | * @reg_initvals: initial values for the regulator registers | |
119 | * plus two sleep settings for LDO E and the BUCK converter. | |
120 | * exactly AB3100_NUM_REGULATORS+2 values must be sent in. | |
121 | * Order: LDO A, C, E, E sleep, F, G, H, K, EXT, BUCK, | |
122 | * BUCK sleep, LDO D. (LDO D need to be initialized last.) | |
123 | * @external_voltage: voltage level of the external regulator. | |
124 | */ | |
125 | struct ab3100_platform_data { | |
126 | struct regulator_init_data reg_constraints[AB3100_NUM_REGULATORS]; | |
127 | u8 reg_initvals[AB3100_NUM_REGULATORS+2]; | |
128 | int external_voltage; | |
129 | }; | |
130 | ||
14fa5691 LW |
131 | int ab3100_event_register(struct ab3100 *ab3100, |
132 | struct notifier_block *nb); | |
133 | int ab3100_event_unregister(struct ab3100 *ab3100, | |
134 | struct notifier_block *nb); | |
14fa5691 | 135 | |
fa661258 MW |
136 | /** |
137 | * struct abx500_init_setting | |
138 | * Initial value of the registers for driver to use during setup. | |
139 | */ | |
140 | struct abx500_init_settings { | |
141 | u8 bank; | |
142 | u8 reg; | |
143 | u8 setting; | |
144 | }; | |
145 | ||
1668f811 AM |
146 | /* Battery driver related data */ |
147 | /* | |
148 | * ADC for the battery thermistor. | |
149 | * When using the ABx500_ADC_THERM_BATCTRL the battery ID resistor is combined | |
150 | * with a NTC resistor to both identify the battery and to measure its | |
151 | * temperature. Different phone manufactures uses different techniques to both | |
152 | * identify the battery and to read its temperature. | |
153 | */ | |
154 | enum abx500_adc_therm { | |
155 | ABx500_ADC_THERM_BATCTRL, | |
156 | ABx500_ADC_THERM_BATTEMP, | |
157 | }; | |
158 | ||
159 | /** | |
160 | * struct abx500_res_to_temp - defines one point in a temp to res curve. To | |
161 | * be used in battery packs that combines the identification resistor with a | |
162 | * NTC resistor. | |
163 | * @temp: battery pack temperature in Celcius | |
164 | * @resist: NTC resistor net total resistance | |
165 | */ | |
166 | struct abx500_res_to_temp { | |
167 | int temp; | |
168 | int resist; | |
169 | }; | |
170 | ||
171 | /** | |
172 | * struct abx500_v_to_cap - Table for translating voltage to capacity | |
173 | * @voltage: Voltage in mV | |
174 | * @capacity: Capacity in percent | |
175 | */ | |
176 | struct abx500_v_to_cap { | |
177 | int voltage; | |
178 | int capacity; | |
179 | }; | |
180 | ||
181 | /* Forward declaration */ | |
182 | struct abx500_fg; | |
183 | ||
184 | /** | |
185 | * struct abx500_fg_parameters - Fuel gauge algorithm parameters, in seconds | |
186 | * if not specified | |
187 | * @recovery_sleep_timer: Time between measurements while recovering | |
188 | * @recovery_total_time: Total recovery time | |
189 | * @init_timer: Measurement interval during startup | |
190 | * @init_discard_time: Time we discard voltage measurement at startup | |
191 | * @init_total_time: Total init time during startup | |
192 | * @high_curr_time: Time current has to be high to go to recovery | |
193 | * @accu_charging: FG accumulation time while charging | |
194 | * @accu_high_curr: FG accumulation time in high current mode | |
195 | * @high_curr_threshold: High current threshold, in mA | |
196 | * @lowbat_threshold: Low battery threshold, in mV | |
197 | * @overbat_threshold: Over battery threshold, in mV | |
198 | * @battok_falling_th_sel0 Threshold in mV for battOk signal sel0 | |
199 | * Resolution in 50 mV step. | |
200 | * @battok_raising_th_sel1 Threshold in mV for battOk signal sel1 | |
201 | * Resolution in 50 mV step. | |
202 | * @user_cap_limit Capacity reported from user must be within this | |
203 | * limit to be considered as sane, in percentage | |
204 | * points. | |
205 | * @maint_thres This is the threshold where we stop reporting | |
206 | * battery full while in maintenance, in per cent | |
207 | */ | |
208 | struct abx500_fg_parameters { | |
209 | int recovery_sleep_timer; | |
210 | int recovery_total_time; | |
211 | int init_timer; | |
212 | int init_discard_time; | |
213 | int init_total_time; | |
214 | int high_curr_time; | |
215 | int accu_charging; | |
216 | int accu_high_curr; | |
217 | int high_curr_threshold; | |
218 | int lowbat_threshold; | |
219 | int overbat_threshold; | |
220 | int battok_falling_th_sel0; | |
221 | int battok_raising_th_sel1; | |
222 | int user_cap_limit; | |
223 | int maint_thres; | |
224 | }; | |
225 | ||
226 | /** | |
227 | * struct abx500_charger_maximization - struct used by the board config. | |
228 | * @use_maxi: Enable maximization for this battery type | |
229 | * @maxi_chg_curr: Maximum charger current allowed | |
230 | * @maxi_wait_cycles: cycles to wait before setting charger current | |
231 | * @charger_curr_step delta between two charger current settings (mA) | |
232 | */ | |
233 | struct abx500_maxim_parameters { | |
234 | bool ena_maxi; | |
235 | int chg_curr; | |
236 | int wait_cycles; | |
237 | int charger_curr_step; | |
238 | }; | |
239 | ||
240 | /** | |
241 | * struct abx500_battery_type - different batteries supported | |
242 | * @name: battery technology | |
243 | * @resis_high: battery upper resistance limit | |
244 | * @resis_low: battery lower resistance limit | |
245 | * @charge_full_design: Maximum battery capacity in mAh | |
246 | * @nominal_voltage: Nominal voltage of the battery in mV | |
247 | * @termination_vol: max voltage upto which battery can be charged | |
248 | * @termination_curr battery charging termination current in mA | |
249 | * @recharge_vol battery voltage limit that will trigger a new | |
250 | * full charging cycle in the case where maintenan- | |
251 | * -ce charging has been disabled | |
252 | * @normal_cur_lvl: charger current in normal state in mA | |
253 | * @normal_vol_lvl: charger voltage in normal state in mV | |
254 | * @maint_a_cur_lvl: charger current in maintenance A state in mA | |
255 | * @maint_a_vol_lvl: charger voltage in maintenance A state in mV | |
256 | * @maint_a_chg_timer_h: charge time in maintenance A state | |
257 | * @maint_b_cur_lvl: charger current in maintenance B state in mA | |
258 | * @maint_b_vol_lvl: charger voltage in maintenance B state in mV | |
259 | * @maint_b_chg_timer_h: charge time in maintenance B state | |
260 | * @low_high_cur_lvl: charger current in temp low/high state in mA | |
261 | * @low_high_vol_lvl: charger voltage in temp low/high state in mV' | |
262 | * @battery_resistance: battery inner resistance in mOhm. | |
263 | * @n_r_t_tbl_elements: number of elements in r_to_t_tbl | |
264 | * @r_to_t_tbl: table containing resistance to temp points | |
265 | * @n_v_cap_tbl_elements: number of elements in v_to_cap_tbl | |
266 | * @v_to_cap_tbl: Voltage to capacity (in %) table | |
267 | * @n_batres_tbl_elements number of elements in the batres_tbl | |
268 | * @batres_tbl battery internal resistance vs temperature table | |
269 | */ | |
270 | struct abx500_battery_type { | |
271 | int name; | |
272 | int resis_high; | |
273 | int resis_low; | |
274 | int charge_full_design; | |
275 | int nominal_voltage; | |
276 | int termination_vol; | |
277 | int termination_curr; | |
278 | int recharge_vol; | |
279 | int normal_cur_lvl; | |
280 | int normal_vol_lvl; | |
281 | int maint_a_cur_lvl; | |
282 | int maint_a_vol_lvl; | |
283 | int maint_a_chg_timer_h; | |
284 | int maint_b_cur_lvl; | |
285 | int maint_b_vol_lvl; | |
286 | int maint_b_chg_timer_h; | |
287 | int low_high_cur_lvl; | |
288 | int low_high_vol_lvl; | |
289 | int battery_resistance; | |
290 | int n_temp_tbl_elements; | |
291 | struct abx500_res_to_temp *r_to_t_tbl; | |
292 | int n_v_cap_tbl_elements; | |
293 | struct abx500_v_to_cap *v_to_cap_tbl; | |
294 | int n_batres_tbl_elements; | |
295 | struct batres_vs_temp *batres_tbl; | |
296 | }; | |
297 | ||
298 | /** | |
299 | * struct abx500_bm_capacity_levels - abx500 capacity level data | |
300 | * @critical: critical capacity level in percent | |
301 | * @low: low capacity level in percent | |
302 | * @normal: normal capacity level in percent | |
303 | * @high: high capacity level in percent | |
304 | * @full: full capacity level in percent | |
305 | */ | |
306 | struct abx500_bm_capacity_levels { | |
307 | int critical; | |
308 | int low; | |
309 | int normal; | |
310 | int high; | |
311 | int full; | |
312 | }; | |
313 | ||
314 | /** | |
315 | * struct abx500_bm_charger_parameters - Charger specific parameters | |
316 | * @usb_volt_max: maximum allowed USB charger voltage in mV | |
317 | * @usb_curr_max: maximum allowed USB charger current in mA | |
318 | * @ac_volt_max: maximum allowed AC charger voltage in mV | |
319 | * @ac_curr_max: maximum allowed AC charger current in mA | |
320 | */ | |
321 | struct abx500_bm_charger_parameters { | |
322 | int usb_volt_max; | |
323 | int usb_curr_max; | |
324 | int ac_volt_max; | |
325 | int ac_curr_max; | |
326 | }; | |
327 | ||
328 | /** | |
329 | * struct abx500_bm_data - abx500 battery management data | |
330 | * @temp_under under this temp, charging is stopped | |
331 | * @temp_low between this temp and temp_under charging is reduced | |
332 | * @temp_high between this temp and temp_over charging is reduced | |
333 | * @temp_over over this temp, charging is stopped | |
334 | * @temp_now present battery temperature | |
335 | * @temp_interval_chg temperature measurement interval in s when charging | |
336 | * @temp_interval_nochg temperature measurement interval in s when not charging | |
337 | * @main_safety_tmr_h safety timer for main charger | |
338 | * @usb_safety_tmr_h safety timer for usb charger | |
339 | * @bkup_bat_v voltage which we charge the backup battery with | |
340 | * @bkup_bat_i current which we charge the backup battery with | |
341 | * @no_maintenance indicates that maintenance charging is disabled | |
342 | * @abx500_adc_therm placement of thermistor, batctrl or battemp adc | |
343 | * @chg_unknown_bat flag to enable charging of unknown batteries | |
344 | * @enable_overshoot flag to enable VBAT overshoot control | |
345 | * @auto_trig flag to enable auto adc trigger | |
346 | * @fg_res resistance of FG resistor in 0.1mOhm | |
347 | * @n_btypes number of elements in array bat_type | |
348 | * @batt_id index of the identified battery in array bat_type | |
349 | * @interval_charging charge alg cycle period time when charging (sec) | |
350 | * @interval_not_charging charge alg cycle period time when not charging (sec) | |
351 | * @temp_hysteresis temperature hysteresis | |
352 | * @gnd_lift_resistance Battery ground to phone ground resistance (mOhm) | |
353 | * @maxi: maximization parameters | |
354 | * @cap_levels capacity in percent for the different capacity levels | |
355 | * @bat_type table of supported battery types | |
356 | * @chg_params charger parameters | |
357 | * @fg_params fuel gauge parameters | |
358 | */ | |
359 | struct abx500_bm_data { | |
360 | int temp_under; | |
361 | int temp_low; | |
362 | int temp_high; | |
363 | int temp_over; | |
364 | int temp_now; | |
365 | int temp_interval_chg; | |
366 | int temp_interval_nochg; | |
367 | int main_safety_tmr_h; | |
368 | int usb_safety_tmr_h; | |
369 | int bkup_bat_v; | |
370 | int bkup_bat_i; | |
371 | bool no_maintenance; | |
372 | bool chg_unknown_bat; | |
373 | bool enable_overshoot; | |
374 | bool auto_trig; | |
375 | enum abx500_adc_therm adc_therm; | |
376 | int fg_res; | |
377 | int n_btypes; | |
378 | int batt_id; | |
379 | int interval_charging; | |
380 | int interval_not_charging; | |
381 | int temp_hysteresis; | |
382 | int gnd_lift_resistance; | |
383 | const struct abx500_maxim_parameters *maxi; | |
384 | const struct abx500_bm_capacity_levels *cap_levels; | |
385 | const struct abx500_battery_type *bat_type; | |
386 | const struct abx500_bm_charger_parameters *chg_params; | |
387 | const struct abx500_fg_parameters *fg_params; | |
388 | }; | |
389 | ||
390 | struct abx500_chargalg_platform_data { | |
391 | char **supplied_to; | |
392 | size_t num_supplicants; | |
393 | }; | |
394 | ||
395 | struct abx500_charger_platform_data { | |
396 | char **supplied_to; | |
397 | size_t num_supplicants; | |
398 | bool autopower_cfg; | |
399 | }; | |
400 | ||
401 | struct abx500_btemp_platform_data { | |
402 | char **supplied_to; | |
403 | size_t num_supplicants; | |
404 | }; | |
405 | ||
406 | struct abx500_fg_platform_data { | |
407 | char **supplied_to; | |
408 | size_t num_supplicants; | |
409 | }; | |
410 | ||
411 | struct abx500_bm_plat_data { | |
412 | struct abx500_bm_data *battery; | |
413 | struct abx500_charger_platform_data *charger; | |
414 | struct abx500_btemp_platform_data *btemp; | |
415 | struct abx500_fg_platform_data *fg; | |
416 | struct abx500_chargalg_platform_data *chargalg; | |
417 | }; | |
418 | ||
fa661258 MW |
419 | int abx500_set_register_interruptible(struct device *dev, u8 bank, u8 reg, |
420 | u8 value); | |
421 | int abx500_get_register_interruptible(struct device *dev, u8 bank, u8 reg, | |
422 | u8 *value); | |
423 | int abx500_get_register_page_interruptible(struct device *dev, u8 bank, | |
424 | u8 first_reg, u8 *regvals, u8 numregs); | |
425 | int abx500_set_register_page_interruptible(struct device *dev, u8 bank, | |
426 | u8 first_reg, u8 *regvals, u8 numregs); | |
427 | /** | |
428 | * abx500_mask_and_set_register_inerruptible() - Modifies selected bits of a | |
429 | * target register | |
430 | * | |
431 | * @dev: The AB sub device. | |
432 | * @bank: The i2c bank number. | |
433 | * @bitmask: The bit mask to use. | |
434 | * @bitvalues: The new bit values. | |
435 | * | |
436 | * Updates the value of an AB register: | |
437 | * value -> ((value & ~bitmask) | (bitvalues & bitmask)) | |
438 | */ | |
439 | int abx500_mask_and_set_register_interruptible(struct device *dev, u8 bank, | |
440 | u8 reg, u8 bitmask, u8 bitvalues); | |
441 | int abx500_get_chip_id(struct device *dev); | |
442 | int abx500_event_registers_startup_state_get(struct device *dev, u8 *event); | |
443 | int abx500_startup_irq_enabled(struct device *dev, unsigned int irq); | |
444 | ||
445 | struct abx500_ops { | |
446 | int (*get_chip_id) (struct device *); | |
447 | int (*get_register) (struct device *, u8, u8, u8 *); | |
448 | int (*set_register) (struct device *, u8, u8, u8); | |
449 | int (*get_register_page) (struct device *, u8, u8, u8 *, u8); | |
450 | int (*set_register_page) (struct device *, u8, u8, u8 *, u8); | |
451 | int (*mask_and_set_register) (struct device *, u8, u8, u8, u8); | |
452 | int (*event_registers_startup_state_get) (struct device *, u8 *); | |
453 | int (*startup_irq_enabled) (struct device *, unsigned int); | |
454 | }; | |
455 | ||
456 | int abx500_register_ops(struct device *core_dev, struct abx500_ops *ops); | |
c6252e9c | 457 | void abx500_remove_ops(struct device *dev); |
14fa5691 | 458 | #endif |