1 /*
2  * Copyright ST-Ericsson 2012.
3  *
4  * Author: Arun Murthy <arun.murthy@stericsson.com>
5  * Licensed under GPLv2.
6  */
7 
8 #ifndef _AB8500_BM_H
9 #define _AB8500_BM_H
10 
11 #include <linux/kernel.h>
12 #include <linux/mfd/abx500.h>
13 
14 /*
15  * System control 2 register offsets.
16  * bank = 0x02
17  */
18 #define AB8500_MAIN_WDOG_CTRL_REG	0x01
19 #define AB8500_LOW_BAT_REG		0x03
20 #define AB8500_BATT_OK_REG		0x04
21 /*
22  * USB/ULPI register offsets
23  * Bank : 0x5
24  */
25 #define AB8500_USB_LINE_STAT_REG	0x80
26 
27 /*
28  * Charger / status register offfsets
29  * Bank : 0x0B
30  */
31 #define AB8500_CH_STATUS1_REG		0x00
32 #define AB8500_CH_STATUS2_REG		0x01
33 #define AB8500_CH_USBCH_STAT1_REG	0x02
34 #define AB8500_CH_USBCH_STAT2_REG	0x03
35 #define AB8500_CH_FSM_STAT_REG		0x04
36 #define AB8500_CH_STAT_REG		0x05
37 
38 /*
39  * Charger / control register offfsets
40  * Bank : 0x0B
41  */
42 #define AB8500_CH_VOLT_LVL_REG		0x40
43 #define AB8500_CH_VOLT_LVL_MAX_REG	0x41  /*Only in Cut2.0*/
44 #define AB8500_CH_OPT_CRNTLVL_REG	0x42
45 #define AB8500_CH_OPT_CRNTLVL_MAX_REG	0x43  /*Only in Cut2.0*/
46 #define AB8500_CH_WD_TIMER_REG		0x50
47 #define AB8500_CHARG_WD_CTRL		0x51
48 #define AB8500_BTEMP_HIGH_TH		0x52
49 #define AB8500_LED_INDICATOR_PWM_CTRL	0x53
50 #define AB8500_LED_INDICATOR_PWM_DUTY	0x54
51 #define AB8500_BATT_OVV			0x55
52 #define AB8500_CHARGER_CTRL		0x56
53 #define AB8500_BAT_CTRL_CURRENT_SOURCE	0x60  /*Only in Cut2.0*/
54 
55 /*
56  * Charger / main control register offsets
57  * Bank : 0x0B
58  */
59 #define AB8500_MCH_CTRL1		0x80
60 #define AB8500_MCH_CTRL2		0x81
61 #define AB8500_MCH_IPT_CURLVL_REG	0x82
62 #define AB8500_CH_WD_REG		0x83
63 
64 /*
65  * Charger / USB control register offsets
66  * Bank : 0x0B
67  */
68 #define AB8500_USBCH_CTRL1_REG		0xC0
69 #define AB8500_USBCH_CTRL2_REG		0xC1
70 #define AB8500_USBCH_IPT_CRNTLVL_REG	0xC2
71 
72 /*
73  * Gas Gauge register offsets
74  * Bank : 0x0C
75  */
76 #define AB8500_GASG_CC_CTRL_REG		0x00
77 #define AB8500_GASG_CC_ACCU1_REG	0x01
78 #define AB8500_GASG_CC_ACCU2_REG	0x02
79 #define AB8500_GASG_CC_ACCU3_REG	0x03
80 #define AB8500_GASG_CC_ACCU4_REG	0x04
81 #define AB8500_GASG_CC_SMPL_CNTRL_REG	0x05
82 #define AB8500_GASG_CC_SMPL_CNTRH_REG	0x06
83 #define AB8500_GASG_CC_SMPL_CNVL_REG	0x07
84 #define AB8500_GASG_CC_SMPL_CNVH_REG	0x08
85 #define AB8500_GASG_CC_CNTR_AVGOFF_REG	0x09
86 #define AB8500_GASG_CC_OFFSET_REG	0x0A
87 #define AB8500_GASG_CC_NCOV_ACCU	0x10
88 #define AB8500_GASG_CC_NCOV_ACCU_CTRL	0x11
89 #define AB8500_GASG_CC_NCOV_ACCU_LOW	0x12
90 #define AB8500_GASG_CC_NCOV_ACCU_MED	0x13
91 #define AB8500_GASG_CC_NCOV_ACCU_HIGH	0x14
92 
93 /*
94  * Interrupt register offsets
95  * Bank : 0x0E
96  */
97 #define AB8500_IT_SOURCE2_REG		0x01
98 #define AB8500_IT_SOURCE21_REG		0x14
99 
100 /*
101  * RTC register offsets
102  * Bank: 0x0F
103  */
104 #define AB8500_RTC_BACKUP_CHG_REG	0x0C
105 #define AB8500_RTC_CC_CONF_REG		0x01
106 #define AB8500_RTC_CTRL_REG		0x0B
107 
108 /*
109  * OTP register offsets
110  * Bank : 0x15
111  */
112 #define AB8500_OTP_CONF_15		0x0E
113 
114 /* GPADC constants from AB8500 spec, UM0836 */
115 #define ADC_RESOLUTION			1024
116 #define ADC_CH_MAIN_MIN			0
117 #define ADC_CH_MAIN_MAX			20030
118 #define ADC_CH_VBUS_MIN			0
119 #define ADC_CH_VBUS_MAX			20030
120 #define ADC_CH_VBAT_MIN			2300
121 #define ADC_CH_VBAT_MAX			4800
122 #define ADC_CH_BKBAT_MIN		0
123 #define ADC_CH_BKBAT_MAX		3200
124 
125 /* Main charge i/p current */
126 #define MAIN_CH_IP_CUR_0P9A		0x80
127 #define MAIN_CH_IP_CUR_1P0A		0x90
128 #define MAIN_CH_IP_CUR_1P1A		0xA0
129 #define MAIN_CH_IP_CUR_1P2A		0xB0
130 #define MAIN_CH_IP_CUR_1P3A		0xC0
131 #define MAIN_CH_IP_CUR_1P4A		0xD0
132 #define MAIN_CH_IP_CUR_1P5A		0xE0
133 
134 /* ChVoltLevel */
135 #define CH_VOL_LVL_3P5			0x00
136 #define CH_VOL_LVL_4P0			0x14
137 #define CH_VOL_LVL_4P05			0x16
138 #define CH_VOL_LVL_4P1			0x1B
139 #define CH_VOL_LVL_4P15			0x20
140 #define CH_VOL_LVL_4P2			0x25
141 #define CH_VOL_LVL_4P6			0x4D
142 
143 /* ChOutputCurrentLevel */
144 #define CH_OP_CUR_LVL_0P1		0x00
145 #define CH_OP_CUR_LVL_0P2		0x01
146 #define CH_OP_CUR_LVL_0P3		0x02
147 #define CH_OP_CUR_LVL_0P4		0x03
148 #define CH_OP_CUR_LVL_0P5		0x04
149 #define CH_OP_CUR_LVL_0P6		0x05
150 #define CH_OP_CUR_LVL_0P7		0x06
151 #define CH_OP_CUR_LVL_0P8		0x07
152 #define CH_OP_CUR_LVL_0P9		0x08
153 #define CH_OP_CUR_LVL_1P4		0x0D
154 #define CH_OP_CUR_LVL_1P5		0x0E
155 #define CH_OP_CUR_LVL_1P6		0x0F
156 
157 /* BTEMP High thermal limits */
158 #define BTEMP_HIGH_TH_57_0		0x00
159 #define BTEMP_HIGH_TH_52		0x01
160 #define BTEMP_HIGH_TH_57_1		0x02
161 #define BTEMP_HIGH_TH_62		0x03
162 
163 /* current is mA */
164 #define USB_0P1A			100
165 #define USB_0P2A			200
166 #define USB_0P3A			300
167 #define USB_0P4A			400
168 #define USB_0P5A			500
169 
170 #define LOW_BAT_3P1V			0x20
171 #define LOW_BAT_2P3V			0x00
172 #define LOW_BAT_RESET			0x01
173 #define LOW_BAT_ENABLE			0x01
174 
175 /* Backup battery constants */
176 #define BUP_ICH_SEL_50UA		0x00
177 #define BUP_ICH_SEL_150UA		0x04
178 #define BUP_ICH_SEL_300UA		0x08
179 #define BUP_ICH_SEL_700UA		0x0C
180 
181 #define BUP_VCH_SEL_2P5V		0x00
182 #define BUP_VCH_SEL_2P6V		0x01
183 #define BUP_VCH_SEL_2P8V		0x02
184 #define BUP_VCH_SEL_3P1V		0x03
185 
186 /* Battery OVV constants */
187 #define BATT_OVV_ENA			0x02
188 #define BATT_OVV_TH_3P7			0x00
189 #define BATT_OVV_TH_4P75		0x01
190 
191 /* A value to indicate over voltage */
192 #define BATT_OVV_VALUE			4750
193 
194 /* VBUS OVV constants */
195 #define VBUS_OVV_SELECT_MASK		0x78
196 #define VBUS_OVV_SELECT_5P6V		0x00
197 #define VBUS_OVV_SELECT_5P7V		0x08
198 #define VBUS_OVV_SELECT_5P8V		0x10
199 #define VBUS_OVV_SELECT_5P9V		0x18
200 #define VBUS_OVV_SELECT_6P0V		0x20
201 #define VBUS_OVV_SELECT_6P1V		0x28
202 #define VBUS_OVV_SELECT_6P2V		0x30
203 #define VBUS_OVV_SELECT_6P3V		0x38
204 
205 #define VBUS_AUTO_IN_CURR_LIM_ENA	0x04
206 
207 /* Fuel Gauge constants */
208 #define RESET_ACCU			0x02
209 #define READ_REQ			0x01
210 #define CC_DEEP_SLEEP_ENA		0x02
211 #define CC_PWR_UP_ENA			0x01
212 #define CC_SAMPLES_40			0x28
213 #define RD_NCONV_ACCU_REQ		0x01
214 #define CC_CALIB			0x08
215 #define CC_INTAVGOFFSET_ENA		0x10
216 #define CC_MUXOFFSET			0x80
217 #define CC_INT_CAL_N_AVG_MASK		0x60
218 #define CC_INT_CAL_SAMPLES_16		0x40
219 #define CC_INT_CAL_SAMPLES_8		0x20
220 #define CC_INT_CAL_SAMPLES_4		0x00
221 
222 /* RTC constants */
223 #define RTC_BUP_CH_ENA			0x10
224 
225 /* BatCtrl Current Source Constants */
226 #define BAT_CTRL_7U_ENA			0x01
227 #define BAT_CTRL_20U_ENA		0x02
228 #define BAT_CTRL_CMP_ENA		0x04
229 #define FORCE_BAT_CTRL_CMP_HIGH		0x08
230 #define BAT_CTRL_PULL_UP_ENA		0x10
231 
232 /* Battery type */
233 #define BATTERY_UNKNOWN			00
234 
235 /**
236  * struct res_to_temp - defines one point in a temp to res curve. To
237  * be used in battery packs that combines the identification resistor with a
238  * NTC resistor.
239  * @temp:			battery pack temperature in Celcius
240  * @resist:			NTC resistor net total resistance
241  */
242 struct res_to_temp {
243 	int temp;
244 	int resist;
245 };
246 
247 /**
248  * struct batres_vs_temp - defines one point in a temp vs battery internal
249  * resistance curve.
250  * @temp:			battery pack temperature in Celcius
251  * @resist:			battery internal reistance in mOhm
252  */
253 struct batres_vs_temp {
254 	int temp;
255 	int resist;
256 };
257 
258 /* Forward declaration */
259 struct ab8500_fg;
260 
261 /**
262  * struct ab8500_fg_parameters - Fuel gauge algorithm parameters, in seconds
263  * if not specified
264  * @recovery_sleep_timer:	Time between measurements while recovering
265  * @recovery_total_time:	Total recovery time
266  * @init_timer:			Measurement interval during startup
267  * @init_discard_time:		Time we discard voltage measurement at startup
268  * @init_total_time:		Total init time during startup
269  * @high_curr_time:		Time current has to be high to go to recovery
270  * @accu_charging:		FG accumulation time while charging
271  * @accu_high_curr:		FG accumulation time in high current mode
272  * @high_curr_threshold:	High current threshold, in mA
273  * @lowbat_threshold:		Low battery threshold, in mV
274  * @battok_falling_th_sel0	Threshold in mV for battOk signal sel0
275  *				Resolution in 50 mV step.
276  * @battok_raising_th_sel1	Threshold in mV for battOk signal sel1
277  *				Resolution in 50 mV step.
278  * @user_cap_limit		Capacity reported from user must be within this
279  *				limit to be considered as sane, in percentage
280  *				points.
281  * @maint_thres			This is the threshold where we stop reporting
282  *				battery full while in maintenance, in per cent
283  */
284 struct ab8500_fg_parameters {
285 	int recovery_sleep_timer;
286 	int recovery_total_time;
287 	int init_timer;
288 	int init_discard_time;
289 	int init_total_time;
290 	int high_curr_time;
291 	int accu_charging;
292 	int accu_high_curr;
293 	int high_curr_threshold;
294 	int lowbat_threshold;
295 	int battok_falling_th_sel0;
296 	int battok_raising_th_sel1;
297 	int user_cap_limit;
298 	int maint_thres;
299 };
300 
301 /**
302  * struct ab8500_charger_maximization - struct used by the board config.
303  * @use_maxi:		Enable maximization for this battery type
304  * @maxi_chg_curr:	Maximum charger current allowed
305  * @maxi_wait_cycles:	cycles to wait before setting charger current
306  * @charger_curr_step	delta between two charger current settings (mA)
307  */
308 struct ab8500_maxim_parameters {
309 	bool ena_maxi;
310 	int chg_curr;
311 	int wait_cycles;
312 	int charger_curr_step;
313 };
314 
315 /**
316  * struct ab8500_bm_capacity_levels - ab8500 capacity level data
317  * @critical:		critical capacity level in percent
318  * @low:		low capacity level in percent
319  * @normal:		normal capacity level in percent
320  * @high:		high capacity level in percent
321  * @full:		full capacity level in percent
322  */
323 struct ab8500_bm_capacity_levels {
324 	int critical;
325 	int low;
326 	int normal;
327 	int high;
328 	int full;
329 };
330 
331 /**
332  * struct ab8500_bm_charger_parameters - Charger specific parameters
333  * @usb_volt_max:	maximum allowed USB charger voltage in mV
334  * @usb_curr_max:	maximum allowed USB charger current in mA
335  * @ac_volt_max:	maximum allowed AC charger voltage in mV
336  * @ac_curr_max:	maximum allowed AC charger current in mA
337  */
338 struct ab8500_bm_charger_parameters {
339 	int usb_volt_max;
340 	int usb_curr_max;
341 	int ac_volt_max;
342 	int ac_curr_max;
343 };
344 
345 /**
346  * struct ab8500_bm_data - ab8500 battery management data
347  * @temp_under		under this temp, charging is stopped
348  * @temp_low		between this temp and temp_under charging is reduced
349  * @temp_high		between this temp and temp_over charging is reduced
350  * @temp_over		over this temp, charging is stopped
351  * @temp_interval_chg	temperature measurement interval in s when charging
352  * @temp_interval_nochg	temperature measurement interval in s when not charging
353  * @main_safety_tmr_h	safety timer for main charger
354  * @usb_safety_tmr_h	safety timer for usb charger
355  * @bkup_bat_v		voltage which we charge the backup battery with
356  * @bkup_bat_i		current which we charge the backup battery with
357  * @no_maintenance	indicates that maintenance charging is disabled
358  * @adc_therm		placement of thermistor, batctrl or battemp adc
359  * @chg_unknown_bat	flag to enable charging of unknown batteries
360  * @enable_overshoot	flag to enable VBAT overshoot control
361  * @fg_res		resistance of FG resistor in 0.1mOhm
362  * @n_btypes		number of elements in array bat_type
363  * @batt_id		index of the identified battery in array bat_type
364  * @interval_charging	charge alg cycle period time when charging (sec)
365  * @interval_not_charging charge alg cycle period time when not charging (sec)
366  * @temp_hysteresis	temperature hysteresis
367  * @gnd_lift_resistance	Battery ground to phone ground resistance (mOhm)
368  * @maxi:		maximization parameters
369  * @cap_levels		capacity in percent for the different capacity levels
370  * @bat_type		table of supported battery types
371  * @chg_params		charger parameters
372  * @fg_params		fuel gauge parameters
373  */
374 struct ab8500_bm_data {
375 	int temp_under;
376 	int temp_low;
377 	int temp_high;
378 	int temp_over;
379 	int temp_interval_chg;
380 	int temp_interval_nochg;
381 	int main_safety_tmr_h;
382 	int usb_safety_tmr_h;
383 	int bkup_bat_v;
384 	int bkup_bat_i;
385 	bool no_maintenance;
386 	bool chg_unknown_bat;
387 	bool enable_overshoot;
388 	enum abx500_adc_therm adc_therm;
389 	int fg_res;
390 	int n_btypes;
391 	int batt_id;
392 	int interval_charging;
393 	int interval_not_charging;
394 	int temp_hysteresis;
395 	int gnd_lift_resistance;
396 	const struct ab8500_maxim_parameters *maxi;
397 	const struct ab8500_bm_capacity_levels *cap_levels;
398 	const struct ab8500_bm_charger_parameters *chg_params;
399 	const struct ab8500_fg_parameters *fg_params;
400 };
401 
402 struct ab8500_charger_platform_data {
403 	char **supplied_to;
404 	size_t num_supplicants;
405 	bool autopower_cfg;
406 };
407 
408 struct ab8500_btemp_platform_data {
409 	char **supplied_to;
410 	size_t num_supplicants;
411 };
412 
413 struct ab8500_fg_platform_data {
414 	char **supplied_to;
415 	size_t num_supplicants;
416 };
417 
418 struct ab8500_chargalg_platform_data {
419 	char **supplied_to;
420 	size_t num_supplicants;
421 };
422 struct ab8500_btemp;
423 struct ab8500_gpadc;
424 struct ab8500_fg;
425 #ifdef CONFIG_AB8500_BM
426 void ab8500_fg_reinit(void);
427 void ab8500_charger_usb_state_changed(u8 bm_usb_state, u16 mA);
428 struct ab8500_btemp *ab8500_btemp_get(void);
429 int ab8500_btemp_get_batctrl_temp(struct ab8500_btemp *btemp);
430 struct ab8500_fg *ab8500_fg_get(void);
431 int ab8500_fg_inst_curr_blocking(struct ab8500_fg *dev);
432 int ab8500_fg_inst_curr_start(struct ab8500_fg *di);
433 int ab8500_fg_inst_curr_finalize(struct ab8500_fg *di, int *res);
434 int ab8500_fg_inst_curr_done(struct ab8500_fg *di);
435 
436 #else
ab8500_fg_inst_curr_done(struct ab8500_fg * di)437 int ab8500_fg_inst_curr_done(struct ab8500_fg *di)
438 {
439 }
ab8500_fg_reinit(void)440 static void ab8500_fg_reinit(void)
441 {
442 }
ab8500_charger_usb_state_changed(u8 bm_usb_state,u16 mA)443 static void ab8500_charger_usb_state_changed(u8 bm_usb_state, u16 mA)
444 {
445 }
ab8500_btemp_get(void)446 static struct ab8500_btemp *ab8500_btemp_get(void)
447 {
448 	return NULL;
449 }
ab8500_btemp_get_batctrl_temp(struct ab8500_btemp * btemp)450 static int ab8500_btemp_get_batctrl_temp(struct ab8500_btemp *btemp)
451 {
452 	return 0;
453 }
ab8500_fg_get(void)454 struct ab8500_fg *ab8500_fg_get(void)
455 {
456 	return NULL;
457 }
ab8500_fg_inst_curr_blocking(struct ab8500_fg * dev)458 static int ab8500_fg_inst_curr_blocking(struct ab8500_fg *dev)
459 {
460 	return -ENODEV;
461 }
462 
ab8500_fg_inst_curr_start(struct ab8500_fg * di)463 static inline int ab8500_fg_inst_curr_start(struct ab8500_fg *di)
464 {
465 	return -ENODEV;
466 }
467 
ab8500_fg_inst_curr_finalize(struct ab8500_fg * di,int * res)468 static inline int ab8500_fg_inst_curr_finalize(struct ab8500_fg *di, int *res)
469 {
470 	return -ENODEV;
471 }
472 
473 #endif
474 #endif /* _AB8500_BM_H */
475