CONFIG_HOTPLUG is going away as an option. As a result, the __dev* markings need to be removed. This change removes the use of __devinit, __devexit_p, __devinitconst, and __devexit from these drivers. Based on patches originally written by Bill Pemberton, but redone by me in order to handle some of the coding style issues better, by hand. Cc: Bill Pemberton <wfp5p@virginia.edu> Cc: Anton Vorontsov <cbou@mail.ru> Cc: David Woodhouse <dwmw2@infradead.org> Cc: Andrew Lunn <andrew@lunn.ch> Cc: Jamie Lentin <jm@lentin.co.uk> Cc: Jason Cooper <jason@lakedaemon.net> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
		
			
				
	
	
		
			519 lines
		
	
	
	
		
			12 KiB
			
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			519 lines
		
	
	
	
		
			12 KiB
			
		
	
	
	
		
			C
		
	
	
	
	
	
#include <linux/export.h>
 | 
						|
#include <linux/power_supply.h>
 | 
						|
#include <linux/of.h>
 | 
						|
#include <linux/mfd/abx500.h>
 | 
						|
#include <linux/mfd/abx500/ab8500.h>
 | 
						|
#include <linux/mfd/abx500/ab8500-bm.h>
 | 
						|
 | 
						|
/*
 | 
						|
 * These are the defined batteries that uses a NTC and ID resistor placed
 | 
						|
 * inside of the battery pack.
 | 
						|
 * Note that the res_to_temp table must be strictly sorted by falling resistance
 | 
						|
 * values to work.
 | 
						|
 */
 | 
						|
static struct abx500_res_to_temp temp_tbl_A_thermistor[] = {
 | 
						|
	{-5, 53407},
 | 
						|
	{ 0, 48594},
 | 
						|
	{ 5, 43804},
 | 
						|
	{10, 39188},
 | 
						|
	{15, 34870},
 | 
						|
	{20, 30933},
 | 
						|
	{25, 27422},
 | 
						|
	{30, 24347},
 | 
						|
	{35, 21694},
 | 
						|
	{40, 19431},
 | 
						|
	{45, 17517},
 | 
						|
	{50, 15908},
 | 
						|
	{55, 14561},
 | 
						|
	{60, 13437},
 | 
						|
	{65, 12500},
 | 
						|
};
 | 
						|
 | 
						|
static struct abx500_res_to_temp temp_tbl_B_thermistor[] = {
 | 
						|
	{-5, 200000},
 | 
						|
	{ 0, 159024},
 | 
						|
	{ 5, 151921},
 | 
						|
	{10, 144300},
 | 
						|
	{15, 136424},
 | 
						|
	{20, 128565},
 | 
						|
	{25, 120978},
 | 
						|
	{30, 113875},
 | 
						|
	{35, 107397},
 | 
						|
	{40, 101629},
 | 
						|
	{45,  96592},
 | 
						|
	{50,  92253},
 | 
						|
	{55,  88569},
 | 
						|
	{60,  85461},
 | 
						|
	{65,  82869},
 | 
						|
};
 | 
						|
 | 
						|
static struct abx500_v_to_cap cap_tbl_A_thermistor[] = {
 | 
						|
	{4171,	100},
 | 
						|
	{4114,	 95},
 | 
						|
	{4009,	 83},
 | 
						|
	{3947,	 74},
 | 
						|
	{3907,	 67},
 | 
						|
	{3863,	 59},
 | 
						|
	{3830,	 56},
 | 
						|
	{3813,	 53},
 | 
						|
	{3791,	 46},
 | 
						|
	{3771,	 33},
 | 
						|
	{3754,	 25},
 | 
						|
	{3735,	 20},
 | 
						|
	{3717,	 17},
 | 
						|
	{3681,	 13},
 | 
						|
	{3664,	  8},
 | 
						|
	{3651,	  6},
 | 
						|
	{3635,	  5},
 | 
						|
	{3560,	  3},
 | 
						|
	{3408,    1},
 | 
						|
	{3247,	  0},
 | 
						|
};
 | 
						|
 | 
						|
static struct abx500_v_to_cap cap_tbl_B_thermistor[] = {
 | 
						|
	{4161,	100},
 | 
						|
	{4124,	 98},
 | 
						|
	{4044,	 90},
 | 
						|
	{4003,	 85},
 | 
						|
	{3966,	 80},
 | 
						|
	{3933,	 75},
 | 
						|
	{3888,	 67},
 | 
						|
	{3849,	 60},
 | 
						|
	{3813,	 55},
 | 
						|
	{3787,	 47},
 | 
						|
	{3772,	 30},
 | 
						|
	{3751,	 25},
 | 
						|
	{3718,	 20},
 | 
						|
	{3681,	 16},
 | 
						|
	{3660,	 14},
 | 
						|
	{3589,	 10},
 | 
						|
	{3546,	  7},
 | 
						|
	{3495,	  4},
 | 
						|
	{3404,	  2},
 | 
						|
	{3250,	  0},
 | 
						|
};
 | 
						|
 | 
						|
static struct abx500_v_to_cap cap_tbl[] = {
 | 
						|
	{4186,	100},
 | 
						|
	{4163,	 99},
 | 
						|
	{4114,	 95},
 | 
						|
	{4068,	 90},
 | 
						|
	{3990,	 80},
 | 
						|
	{3926,	 70},
 | 
						|
	{3898,	 65},
 | 
						|
	{3866,	 60},
 | 
						|
	{3833,	 55},
 | 
						|
	{3812,	 50},
 | 
						|
	{3787,	 40},
 | 
						|
	{3768,	 30},
 | 
						|
	{3747,	 25},
 | 
						|
	{3730,	 20},
 | 
						|
	{3705,	 15},
 | 
						|
	{3699,	 14},
 | 
						|
	{3684,	 12},
 | 
						|
	{3672,	  9},
 | 
						|
	{3657,	  7},
 | 
						|
	{3638,	  6},
 | 
						|
	{3556,	  4},
 | 
						|
	{3424,	  2},
 | 
						|
	{3317,	  1},
 | 
						|
	{3094,	  0},
 | 
						|
};
 | 
						|
 | 
						|
/*
 | 
						|
 * Note that the res_to_temp table must be strictly sorted by falling
 | 
						|
 * resistance values to work.
 | 
						|
 */
 | 
						|
static struct abx500_res_to_temp temp_tbl[] = {
 | 
						|
	{-5, 214834},
 | 
						|
	{ 0, 162943},
 | 
						|
	{ 5, 124820},
 | 
						|
	{10,  96520},
 | 
						|
	{15,  75306},
 | 
						|
	{20,  59254},
 | 
						|
	{25,  47000},
 | 
						|
	{30,  37566},
 | 
						|
	{35,  30245},
 | 
						|
	{40,  24520},
 | 
						|
	{45,  20010},
 | 
						|
	{50,  16432},
 | 
						|
	{55,  13576},
 | 
						|
	{60,  11280},
 | 
						|
	{65,   9425},
 | 
						|
};
 | 
						|
 | 
						|
/*
 | 
						|
 * Note that the batres_vs_temp table must be strictly sorted by falling
 | 
						|
 * temperature values to work.
 | 
						|
 */
 | 
						|
static struct batres_vs_temp temp_to_batres_tbl_thermistor[] = {
 | 
						|
	{ 40, 120},
 | 
						|
	{ 30, 135},
 | 
						|
	{ 20, 165},
 | 
						|
	{ 10, 230},
 | 
						|
	{ 00, 325},
 | 
						|
	{-10, 445},
 | 
						|
	{-20, 595},
 | 
						|
};
 | 
						|
 | 
						|
/*
 | 
						|
 * Note that the batres_vs_temp table must be strictly sorted by falling
 | 
						|
 * temperature values to work.
 | 
						|
 */
 | 
						|
static struct batres_vs_temp temp_to_batres_tbl_ext_thermistor[] = {
 | 
						|
	{ 60, 300},
 | 
						|
	{ 30, 300},
 | 
						|
	{ 20, 300},
 | 
						|
	{ 10, 300},
 | 
						|
	{ 00, 300},
 | 
						|
	{-10, 300},
 | 
						|
	{-20, 300},
 | 
						|
};
 | 
						|
 | 
						|
/* battery resistance table for LI ION 9100 battery */
 | 
						|
static struct batres_vs_temp temp_to_batres_tbl_9100[] = {
 | 
						|
	{ 60, 180},
 | 
						|
	{ 30, 180},
 | 
						|
	{ 20, 180},
 | 
						|
	{ 10, 180},
 | 
						|
	{ 00, 180},
 | 
						|
	{-10, 180},
 | 
						|
	{-20, 180},
 | 
						|
};
 | 
						|
 | 
						|
static struct abx500_battery_type bat_type_thermistor[] = {
 | 
						|
[BATTERY_UNKNOWN] = {
 | 
						|
	/* First element always represent the UNKNOWN battery */
 | 
						|
	.name = POWER_SUPPLY_TECHNOLOGY_UNKNOWN,
 | 
						|
	.resis_high = 0,
 | 
						|
	.resis_low = 0,
 | 
						|
	.battery_resistance = 300,
 | 
						|
	.charge_full_design = 612,
 | 
						|
	.nominal_voltage = 3700,
 | 
						|
	.termination_vol = 4050,
 | 
						|
	.termination_curr = 200,
 | 
						|
	.recharge_vol = 3990,
 | 
						|
	.normal_cur_lvl = 400,
 | 
						|
	.normal_vol_lvl = 4100,
 | 
						|
	.maint_a_cur_lvl = 400,
 | 
						|
	.maint_a_vol_lvl = 4050,
 | 
						|
	.maint_a_chg_timer_h = 60,
 | 
						|
	.maint_b_cur_lvl = 400,
 | 
						|
	.maint_b_vol_lvl = 4000,
 | 
						|
	.maint_b_chg_timer_h = 200,
 | 
						|
	.low_high_cur_lvl = 300,
 | 
						|
	.low_high_vol_lvl = 4000,
 | 
						|
	.n_temp_tbl_elements = ARRAY_SIZE(temp_tbl),
 | 
						|
	.r_to_t_tbl = temp_tbl,
 | 
						|
	.n_v_cap_tbl_elements = ARRAY_SIZE(cap_tbl),
 | 
						|
	.v_to_cap_tbl = cap_tbl,
 | 
						|
	.n_batres_tbl_elements = ARRAY_SIZE(temp_to_batres_tbl_thermistor),
 | 
						|
	.batres_tbl = temp_to_batres_tbl_thermistor,
 | 
						|
},
 | 
						|
{
 | 
						|
	.name = POWER_SUPPLY_TECHNOLOGY_LIPO,
 | 
						|
	.resis_high = 53407,
 | 
						|
	.resis_low = 12500,
 | 
						|
	.battery_resistance = 300,
 | 
						|
	.charge_full_design = 900,
 | 
						|
	.nominal_voltage = 3600,
 | 
						|
	.termination_vol = 4150,
 | 
						|
	.termination_curr = 80,
 | 
						|
	.recharge_vol = 4130,
 | 
						|
	.normal_cur_lvl = 700,
 | 
						|
	.normal_vol_lvl = 4200,
 | 
						|
	.maint_a_cur_lvl = 600,
 | 
						|
	.maint_a_vol_lvl = 4150,
 | 
						|
	.maint_a_chg_timer_h = 60,
 | 
						|
	.maint_b_cur_lvl = 600,
 | 
						|
	.maint_b_vol_lvl = 4100,
 | 
						|
	.maint_b_chg_timer_h = 200,
 | 
						|
	.low_high_cur_lvl = 300,
 | 
						|
	.low_high_vol_lvl = 4000,
 | 
						|
	.n_temp_tbl_elements = ARRAY_SIZE(temp_tbl_A_thermistor),
 | 
						|
	.r_to_t_tbl = temp_tbl_A_thermistor,
 | 
						|
	.n_v_cap_tbl_elements = ARRAY_SIZE(cap_tbl_A_thermistor),
 | 
						|
	.v_to_cap_tbl = cap_tbl_A_thermistor,
 | 
						|
	.n_batres_tbl_elements = ARRAY_SIZE(temp_to_batres_tbl_thermistor),
 | 
						|
	.batres_tbl = temp_to_batres_tbl_thermistor,
 | 
						|
 | 
						|
},
 | 
						|
{
 | 
						|
	.name = POWER_SUPPLY_TECHNOLOGY_LIPO,
 | 
						|
	.resis_high = 200000,
 | 
						|
	.resis_low = 82869,
 | 
						|
	.battery_resistance = 300,
 | 
						|
	.charge_full_design = 900,
 | 
						|
	.nominal_voltage = 3600,
 | 
						|
	.termination_vol = 4150,
 | 
						|
	.termination_curr = 80,
 | 
						|
	.recharge_vol = 4130,
 | 
						|
	.normal_cur_lvl = 700,
 | 
						|
	.normal_vol_lvl = 4200,
 | 
						|
	.maint_a_cur_lvl = 600,
 | 
						|
	.maint_a_vol_lvl = 4150,
 | 
						|
	.maint_a_chg_timer_h = 60,
 | 
						|
	.maint_b_cur_lvl = 600,
 | 
						|
	.maint_b_vol_lvl = 4100,
 | 
						|
	.maint_b_chg_timer_h = 200,
 | 
						|
	.low_high_cur_lvl = 300,
 | 
						|
	.low_high_vol_lvl = 4000,
 | 
						|
	.n_temp_tbl_elements = ARRAY_SIZE(temp_tbl_B_thermistor),
 | 
						|
	.r_to_t_tbl = temp_tbl_B_thermistor,
 | 
						|
	.n_v_cap_tbl_elements = ARRAY_SIZE(cap_tbl_B_thermistor),
 | 
						|
	.v_to_cap_tbl = cap_tbl_B_thermistor,
 | 
						|
	.n_batres_tbl_elements = ARRAY_SIZE(temp_to_batres_tbl_thermistor),
 | 
						|
	.batres_tbl = temp_to_batres_tbl_thermistor,
 | 
						|
},
 | 
						|
};
 | 
						|
 | 
						|
static struct abx500_battery_type bat_type_ext_thermistor[] = {
 | 
						|
[BATTERY_UNKNOWN] = {
 | 
						|
	/* First element always represent the UNKNOWN battery */
 | 
						|
	.name = POWER_SUPPLY_TECHNOLOGY_UNKNOWN,
 | 
						|
	.resis_high = 0,
 | 
						|
	.resis_low = 0,
 | 
						|
	.battery_resistance = 300,
 | 
						|
	.charge_full_design = 612,
 | 
						|
	.nominal_voltage = 3700,
 | 
						|
	.termination_vol = 4050,
 | 
						|
	.termination_curr = 200,
 | 
						|
	.recharge_vol = 3990,
 | 
						|
	.normal_cur_lvl = 400,
 | 
						|
	.normal_vol_lvl = 4100,
 | 
						|
	.maint_a_cur_lvl = 400,
 | 
						|
	.maint_a_vol_lvl = 4050,
 | 
						|
	.maint_a_chg_timer_h = 60,
 | 
						|
	.maint_b_cur_lvl = 400,
 | 
						|
	.maint_b_vol_lvl = 4000,
 | 
						|
	.maint_b_chg_timer_h = 200,
 | 
						|
	.low_high_cur_lvl = 300,
 | 
						|
	.low_high_vol_lvl = 4000,
 | 
						|
	.n_temp_tbl_elements = ARRAY_SIZE(temp_tbl),
 | 
						|
	.r_to_t_tbl = temp_tbl,
 | 
						|
	.n_v_cap_tbl_elements = ARRAY_SIZE(cap_tbl),
 | 
						|
	.v_to_cap_tbl = cap_tbl,
 | 
						|
	.n_batres_tbl_elements = ARRAY_SIZE(temp_to_batres_tbl_thermistor),
 | 
						|
	.batres_tbl = temp_to_batres_tbl_thermistor,
 | 
						|
},
 | 
						|
/*
 | 
						|
 * These are the batteries that doesn't have an internal NTC resistor to measure
 | 
						|
 * its temperature. The temperature in this case is measure with a NTC placed
 | 
						|
 * near the battery but on the PCB.
 | 
						|
 */
 | 
						|
{
 | 
						|
	.name = POWER_SUPPLY_TECHNOLOGY_LIPO,
 | 
						|
	.resis_high = 76000,
 | 
						|
	.resis_low = 53000,
 | 
						|
	.battery_resistance = 300,
 | 
						|
	.charge_full_design = 900,
 | 
						|
	.nominal_voltage = 3700,
 | 
						|
	.termination_vol = 4150,
 | 
						|
	.termination_curr = 100,
 | 
						|
	.recharge_vol = 4130,
 | 
						|
	.normal_cur_lvl = 700,
 | 
						|
	.normal_vol_lvl = 4200,
 | 
						|
	.maint_a_cur_lvl = 600,
 | 
						|
	.maint_a_vol_lvl = 4150,
 | 
						|
	.maint_a_chg_timer_h = 60,
 | 
						|
	.maint_b_cur_lvl = 600,
 | 
						|
	.maint_b_vol_lvl = 4100,
 | 
						|
	.maint_b_chg_timer_h = 200,
 | 
						|
	.low_high_cur_lvl = 300,
 | 
						|
	.low_high_vol_lvl = 4000,
 | 
						|
	.n_temp_tbl_elements = ARRAY_SIZE(temp_tbl),
 | 
						|
	.r_to_t_tbl = temp_tbl,
 | 
						|
	.n_v_cap_tbl_elements = ARRAY_SIZE(cap_tbl),
 | 
						|
	.v_to_cap_tbl = cap_tbl,
 | 
						|
	.n_batres_tbl_elements = ARRAY_SIZE(temp_to_batres_tbl_thermistor),
 | 
						|
	.batres_tbl = temp_to_batres_tbl_thermistor,
 | 
						|
},
 | 
						|
{
 | 
						|
	.name = POWER_SUPPLY_TECHNOLOGY_LION,
 | 
						|
	.resis_high = 30000,
 | 
						|
	.resis_low = 10000,
 | 
						|
	.battery_resistance = 300,
 | 
						|
	.charge_full_design = 950,
 | 
						|
	.nominal_voltage = 3700,
 | 
						|
	.termination_vol = 4150,
 | 
						|
	.termination_curr = 100,
 | 
						|
	.recharge_vol = 4130,
 | 
						|
	.normal_cur_lvl = 700,
 | 
						|
	.normal_vol_lvl = 4200,
 | 
						|
	.maint_a_cur_lvl = 600,
 | 
						|
	.maint_a_vol_lvl = 4150,
 | 
						|
	.maint_a_chg_timer_h = 60,
 | 
						|
	.maint_b_cur_lvl = 600,
 | 
						|
	.maint_b_vol_lvl = 4100,
 | 
						|
	.maint_b_chg_timer_h = 200,
 | 
						|
	.low_high_cur_lvl = 300,
 | 
						|
	.low_high_vol_lvl = 4000,
 | 
						|
	.n_temp_tbl_elements = ARRAY_SIZE(temp_tbl),
 | 
						|
	.r_to_t_tbl = temp_tbl,
 | 
						|
	.n_v_cap_tbl_elements = ARRAY_SIZE(cap_tbl),
 | 
						|
	.v_to_cap_tbl = cap_tbl,
 | 
						|
	.n_batres_tbl_elements = ARRAY_SIZE(temp_to_batres_tbl_thermistor),
 | 
						|
	.batres_tbl = temp_to_batres_tbl_thermistor,
 | 
						|
},
 | 
						|
{
 | 
						|
	.name = POWER_SUPPLY_TECHNOLOGY_LION,
 | 
						|
	.resis_high = 95000,
 | 
						|
	.resis_low = 76001,
 | 
						|
	.battery_resistance = 300,
 | 
						|
	.charge_full_design = 950,
 | 
						|
	.nominal_voltage = 3700,
 | 
						|
	.termination_vol = 4150,
 | 
						|
	.termination_curr = 100,
 | 
						|
	.recharge_vol = 4130,
 | 
						|
	.normal_cur_lvl = 700,
 | 
						|
	.normal_vol_lvl = 4200,
 | 
						|
	.maint_a_cur_lvl = 600,
 | 
						|
	.maint_a_vol_lvl = 4150,
 | 
						|
	.maint_a_chg_timer_h = 60,
 | 
						|
	.maint_b_cur_lvl = 600,
 | 
						|
	.maint_b_vol_lvl = 4100,
 | 
						|
	.maint_b_chg_timer_h = 200,
 | 
						|
	.low_high_cur_lvl = 300,
 | 
						|
	.low_high_vol_lvl = 4000,
 | 
						|
	.n_temp_tbl_elements = ARRAY_SIZE(temp_tbl),
 | 
						|
	.r_to_t_tbl = temp_tbl,
 | 
						|
	.n_v_cap_tbl_elements = ARRAY_SIZE(cap_tbl),
 | 
						|
	.v_to_cap_tbl = cap_tbl,
 | 
						|
	.n_batres_tbl_elements = ARRAY_SIZE(temp_to_batres_tbl_thermistor),
 | 
						|
	.batres_tbl = temp_to_batres_tbl_thermistor,
 | 
						|
},
 | 
						|
};
 | 
						|
 | 
						|
static const struct abx500_bm_capacity_levels cap_levels = {
 | 
						|
	.critical	= 2,
 | 
						|
	.low		= 10,
 | 
						|
	.normal		= 70,
 | 
						|
	.high		= 95,
 | 
						|
	.full		= 100,
 | 
						|
};
 | 
						|
 | 
						|
static const struct abx500_fg_parameters fg = {
 | 
						|
	.recovery_sleep_timer = 10,
 | 
						|
	.recovery_total_time = 100,
 | 
						|
	.init_timer = 1,
 | 
						|
	.init_discard_time = 5,
 | 
						|
	.init_total_time = 40,
 | 
						|
	.high_curr_time = 60,
 | 
						|
	.accu_charging = 30,
 | 
						|
	.accu_high_curr = 30,
 | 
						|
	.high_curr_threshold = 50,
 | 
						|
	.lowbat_threshold = 3100,
 | 
						|
	.battok_falling_th_sel0 = 2860,
 | 
						|
	.battok_raising_th_sel1 = 2860,
 | 
						|
	.user_cap_limit = 15,
 | 
						|
	.maint_thres = 97,
 | 
						|
};
 | 
						|
 | 
						|
static const struct abx500_maxim_parameters maxi_params = {
 | 
						|
	.ena_maxi = true,
 | 
						|
	.chg_curr = 910,
 | 
						|
	.wait_cycles = 10,
 | 
						|
	.charger_curr_step = 100,
 | 
						|
};
 | 
						|
 | 
						|
static const struct abx500_bm_charger_parameters chg = {
 | 
						|
	.usb_volt_max		= 5500,
 | 
						|
	.usb_curr_max		= 1500,
 | 
						|
	.ac_volt_max		= 7500,
 | 
						|
	.ac_curr_max		= 1500,
 | 
						|
};
 | 
						|
 | 
						|
struct abx500_bm_data ab8500_bm_data = {
 | 
						|
	.temp_under		= 3,
 | 
						|
	.temp_low		= 8,
 | 
						|
	.temp_high		= 43,
 | 
						|
	.temp_over		= 48,
 | 
						|
	.main_safety_tmr_h	= 4,
 | 
						|
	.temp_interval_chg	= 20,
 | 
						|
	.temp_interval_nochg	= 120,
 | 
						|
	.usb_safety_tmr_h	= 4,
 | 
						|
	.bkup_bat_v		= BUP_VCH_SEL_2P6V,
 | 
						|
	.bkup_bat_i		= BUP_ICH_SEL_150UA,
 | 
						|
	.no_maintenance		= false,
 | 
						|
	.adc_therm		= ABx500_ADC_THERM_BATCTRL,
 | 
						|
	.chg_unknown_bat	= false,
 | 
						|
	.enable_overshoot	= false,
 | 
						|
	.fg_res			= 100,
 | 
						|
	.cap_levels		= &cap_levels,
 | 
						|
	.bat_type		= bat_type_thermistor,
 | 
						|
	.n_btypes		= 3,
 | 
						|
	.batt_id		= 0,
 | 
						|
	.interval_charging	= 5,
 | 
						|
	.interval_not_charging	= 120,
 | 
						|
	.temp_hysteresis	= 3,
 | 
						|
	.gnd_lift_resistance	= 34,
 | 
						|
	.maxi			= &maxi_params,
 | 
						|
	.chg_params		= &chg,
 | 
						|
	.fg_params		= &fg,
 | 
						|
};
 | 
						|
 | 
						|
int bmdevs_of_probe(struct device *dev, struct device_node *np,
 | 
						|
		    struct abx500_bm_data **battery)
 | 
						|
{
 | 
						|
	struct	abx500_battery_type *btype;
 | 
						|
	struct  device_node *np_bat_supply;
 | 
						|
	struct	abx500_bm_data *bat;
 | 
						|
	const char *btech;
 | 
						|
	char bat_tech[8];
 | 
						|
	int i, thermistor;
 | 
						|
 | 
						|
	*battery = &ab8500_bm_data;
 | 
						|
 | 
						|
	/* get phandle to 'battery-info' node */
 | 
						|
	np_bat_supply = of_parse_phandle(np, "battery", 0);
 | 
						|
	if (!np_bat_supply) {
 | 
						|
		dev_err(dev, "missing property battery\n");
 | 
						|
		return -EINVAL;
 | 
						|
	}
 | 
						|
	if (of_property_read_bool(np_bat_supply,
 | 
						|
			"thermistor-on-batctrl"))
 | 
						|
		thermistor = NTC_INTERNAL;
 | 
						|
	else
 | 
						|
		thermistor = NTC_EXTERNAL;
 | 
						|
 | 
						|
	bat = *battery;
 | 
						|
	if (thermistor == NTC_EXTERNAL) {
 | 
						|
		bat->n_btypes  = 4;
 | 
						|
		bat->bat_type  = bat_type_ext_thermistor;
 | 
						|
		bat->adc_therm = ABx500_ADC_THERM_BATTEMP;
 | 
						|
	}
 | 
						|
	btech = of_get_property(np_bat_supply,
 | 
						|
		"stericsson,battery-type", NULL);
 | 
						|
	if (!btech) {
 | 
						|
		dev_warn(dev, "missing property battery-name/type\n");
 | 
						|
		strcpy(bat_tech, "UNKNOWN");
 | 
						|
	} else {
 | 
						|
		strcpy(bat_tech, btech);
 | 
						|
	}
 | 
						|
 | 
						|
	if (strncmp(bat_tech, "LION", 4) == 0) {
 | 
						|
		bat->no_maintenance  = true;
 | 
						|
		bat->chg_unknown_bat = true;
 | 
						|
		bat->bat_type[BATTERY_UNKNOWN].charge_full_design = 2600;
 | 
						|
		bat->bat_type[BATTERY_UNKNOWN].termination_vol    = 4150;
 | 
						|
		bat->bat_type[BATTERY_UNKNOWN].recharge_vol	  = 4130;
 | 
						|
		bat->bat_type[BATTERY_UNKNOWN].normal_cur_lvl	  = 520;
 | 
						|
		bat->bat_type[BATTERY_UNKNOWN].normal_vol_lvl	  = 4200;
 | 
						|
	}
 | 
						|
	/* select the battery resolution table */
 | 
						|
	for (i = 0; i < bat->n_btypes; ++i) {
 | 
						|
		btype = (bat->bat_type + i);
 | 
						|
		if (thermistor == NTC_EXTERNAL) {
 | 
						|
			btype->batres_tbl =
 | 
						|
				temp_to_batres_tbl_ext_thermistor;
 | 
						|
		} else if (strncmp(bat_tech, "LION", 4) == 0) {
 | 
						|
			btype->batres_tbl =
 | 
						|
				temp_to_batres_tbl_9100;
 | 
						|
		} else {
 | 
						|
			btype->batres_tbl =
 | 
						|
				temp_to_batres_tbl_thermistor;
 | 
						|
		}
 | 
						|
	}
 | 
						|
	of_node_put(np_bat_supply);
 | 
						|
	return 0;
 | 
						|
}
 |