linux/drivers/power/ab8500_bmdata.c
<<
>>
Prefs
   1#include <linux/export.h>
   2#include <linux/power_supply.h>
   3#include <linux/of.h>
   4#include <linux/mfd/abx500.h>
   5#include <linux/mfd/abx500/ab8500.h>
   6#include <linux/mfd/abx500/ab8500-bm.h>
   7
   8/*
   9 * These are the defined batteries that uses a NTC and ID resistor placed
  10 * inside of the battery pack.
  11 * Note that the res_to_temp table must be strictly sorted by falling resistance
  12 * values to work.
  13 */
  14static struct abx500_res_to_temp temp_tbl_A_thermistor[] = {
  15        {-5, 53407},
  16        { 0, 48594},
  17        { 5, 43804},
  18        {10, 39188},
  19        {15, 34870},
  20        {20, 30933},
  21        {25, 27422},
  22        {30, 24347},
  23        {35, 21694},
  24        {40, 19431},
  25        {45, 17517},
  26        {50, 15908},
  27        {55, 14561},
  28        {60, 13437},
  29        {65, 12500},
  30};
  31
  32static struct abx500_res_to_temp temp_tbl_B_thermistor[] = {
  33        {-5, 200000},
  34        { 0, 159024},
  35        { 5, 151921},
  36        {10, 144300},
  37        {15, 136424},
  38        {20, 128565},
  39        {25, 120978},
  40        {30, 113875},
  41        {35, 107397},
  42        {40, 101629},
  43        {45,  96592},
  44        {50,  92253},
  45        {55,  88569},
  46        {60,  85461},
  47        {65,  82869},
  48};
  49
  50static struct abx500_v_to_cap cap_tbl_A_thermistor[] = {
  51        {4171,  100},
  52        {4114,   95},
  53        {4009,   83},
  54        {3947,   74},
  55        {3907,   67},
  56        {3863,   59},
  57        {3830,   56},
  58        {3813,   53},
  59        {3791,   46},
  60        {3771,   33},
  61        {3754,   25},
  62        {3735,   20},
  63        {3717,   17},
  64        {3681,   13},
  65        {3664,    8},
  66        {3651,    6},
  67        {3635,    5},
  68        {3560,    3},
  69        {3408,    1},
  70        {3247,    0},
  71};
  72
  73static struct abx500_v_to_cap cap_tbl_B_thermistor[] = {
  74        {4161,  100},
  75        {4124,   98},
  76        {4044,   90},
  77        {4003,   85},
  78        {3966,   80},
  79        {3933,   75},
  80        {3888,   67},
  81        {3849,   60},
  82        {3813,   55},
  83        {3787,   47},
  84        {3772,   30},
  85        {3751,   25},
  86        {3718,   20},
  87        {3681,   16},
  88        {3660,   14},
  89        {3589,   10},
  90        {3546,    7},
  91        {3495,    4},
  92        {3404,    2},
  93        {3250,    0},
  94};
  95
  96static struct abx500_v_to_cap cap_tbl[] = {
  97        {4186,  100},
  98        {4163,   99},
  99        {4114,   95},
 100        {4068,   90},
 101        {3990,   80},
 102        {3926,   70},
 103        {3898,   65},
 104        {3866,   60},
 105        {3833,   55},
 106        {3812,   50},
 107        {3787,   40},
 108        {3768,   30},
 109        {3747,   25},
 110        {3730,   20},
 111        {3705,   15},
 112        {3699,   14},
 113        {3684,   12},
 114        {3672,    9},
 115        {3657,    7},
 116        {3638,    6},
 117        {3556,    4},
 118        {3424,    2},
 119        {3317,    1},
 120        {3094,    0},
 121};
 122
 123/*
 124 * Note that the res_to_temp table must be strictly sorted by falling
 125 * resistance values to work.
 126 */
 127static struct abx500_res_to_temp temp_tbl[] = {
 128        {-5, 214834},
 129        { 0, 162943},
 130        { 5, 124820},
 131        {10,  96520},
 132        {15,  75306},
 133        {20,  59254},
 134        {25,  47000},
 135        {30,  37566},
 136        {35,  30245},
 137        {40,  24520},
 138        {45,  20010},
 139        {50,  16432},
 140        {55,  13576},
 141        {60,  11280},
 142        {65,   9425},
 143};
 144
 145/*
 146 * Note that the batres_vs_temp table must be strictly sorted by falling
 147 * temperature values to work.
 148 */
 149static struct batres_vs_temp temp_to_batres_tbl_thermistor[] = {
 150        { 40, 120},
 151        { 30, 135},
 152        { 20, 165},
 153        { 10, 230},
 154        { 00, 325},
 155        {-10, 445},
 156        {-20, 595},
 157};
 158
 159/*
 160 * Note that the batres_vs_temp table must be strictly sorted by falling
 161 * temperature values to work.
 162 */
 163static struct batres_vs_temp temp_to_batres_tbl_ext_thermistor[] = {
 164        { 60, 300},
 165        { 30, 300},
 166        { 20, 300},
 167        { 10, 300},
 168        { 00, 300},
 169        {-10, 300},
 170        {-20, 300},
 171};
 172
 173/* battery resistance table for LI ION 9100 battery */
 174static struct batres_vs_temp temp_to_batres_tbl_9100[] = {
 175        { 60, 180},
 176        { 30, 180},
 177        { 20, 180},
 178        { 10, 180},
 179        { 00, 180},
 180        {-10, 180},
 181        {-20, 180},
 182};
 183
 184static struct abx500_battery_type bat_type_thermistor[] = {
 185[BATTERY_UNKNOWN] = {
 186        /* First element always represent the UNKNOWN battery */
 187        .name = POWER_SUPPLY_TECHNOLOGY_UNKNOWN,
 188        .resis_high = 0,
 189        .resis_low = 0,
 190        .battery_resistance = 300,
 191        .charge_full_design = 612,
 192        .nominal_voltage = 3700,
 193        .termination_vol = 4050,
 194        .termination_curr = 200,
 195        .recharge_vol = 3990,
 196        .normal_cur_lvl = 400,
 197        .normal_vol_lvl = 4100,
 198        .maint_a_cur_lvl = 400,
 199        .maint_a_vol_lvl = 4050,
 200        .maint_a_chg_timer_h = 60,
 201        .maint_b_cur_lvl = 400,
 202        .maint_b_vol_lvl = 4000,
 203        .maint_b_chg_timer_h = 200,
 204        .low_high_cur_lvl = 300,
 205        .low_high_vol_lvl = 4000,
 206        .n_temp_tbl_elements = ARRAY_SIZE(temp_tbl),
 207        .r_to_t_tbl = temp_tbl,
 208        .n_v_cap_tbl_elements = ARRAY_SIZE(cap_tbl),
 209        .v_to_cap_tbl = cap_tbl,
 210        .n_batres_tbl_elements = ARRAY_SIZE(temp_to_batres_tbl_thermistor),
 211        .batres_tbl = temp_to_batres_tbl_thermistor,
 212},
 213{
 214        .name = POWER_SUPPLY_TECHNOLOGY_LIPO,
 215        .resis_high = 53407,
 216        .resis_low = 12500,
 217        .battery_resistance = 300,
 218        .charge_full_design = 900,
 219        .nominal_voltage = 3600,
 220        .termination_vol = 4150,
 221        .termination_curr = 80,
 222        .recharge_vol = 4130,
 223        .normal_cur_lvl = 700,
 224        .normal_vol_lvl = 4200,
 225        .maint_a_cur_lvl = 600,
 226        .maint_a_vol_lvl = 4150,
 227        .maint_a_chg_timer_h = 60,
 228        .maint_b_cur_lvl = 600,
 229        .maint_b_vol_lvl = 4100,
 230        .maint_b_chg_timer_h = 200,
 231        .low_high_cur_lvl = 300,
 232        .low_high_vol_lvl = 4000,
 233        .n_temp_tbl_elements = ARRAY_SIZE(temp_tbl_A_thermistor),
 234        .r_to_t_tbl = temp_tbl_A_thermistor,
 235        .n_v_cap_tbl_elements = ARRAY_SIZE(cap_tbl_A_thermistor),
 236        .v_to_cap_tbl = cap_tbl_A_thermistor,
 237        .n_batres_tbl_elements = ARRAY_SIZE(temp_to_batres_tbl_thermistor),
 238        .batres_tbl = temp_to_batres_tbl_thermistor,
 239
 240},
 241{
 242        .name = POWER_SUPPLY_TECHNOLOGY_LIPO,
 243        .resis_high = 200000,
 244        .resis_low = 82869,
 245        .battery_resistance = 300,
 246        .charge_full_design = 900,
 247        .nominal_voltage = 3600,
 248        .termination_vol = 4150,
 249        .termination_curr = 80,
 250        .recharge_vol = 4130,
 251        .normal_cur_lvl = 700,
 252        .normal_vol_lvl = 4200,
 253        .maint_a_cur_lvl = 600,
 254        .maint_a_vol_lvl = 4150,
 255        .maint_a_chg_timer_h = 60,
 256        .maint_b_cur_lvl = 600,
 257        .maint_b_vol_lvl = 4100,
 258        .maint_b_chg_timer_h = 200,
 259        .low_high_cur_lvl = 300,
 260        .low_high_vol_lvl = 4000,
 261        .n_temp_tbl_elements = ARRAY_SIZE(temp_tbl_B_thermistor),
 262        .r_to_t_tbl = temp_tbl_B_thermistor,
 263        .n_v_cap_tbl_elements = ARRAY_SIZE(cap_tbl_B_thermistor),
 264        .v_to_cap_tbl = cap_tbl_B_thermistor,
 265        .n_batres_tbl_elements = ARRAY_SIZE(temp_to_batres_tbl_thermistor),
 266        .batres_tbl = temp_to_batres_tbl_thermistor,
 267},
 268};
 269
 270static struct abx500_battery_type bat_type_ext_thermistor[] = {
 271[BATTERY_UNKNOWN] = {
 272        /* First element always represent the UNKNOWN battery */
 273        .name = POWER_SUPPLY_TECHNOLOGY_UNKNOWN,
 274        .resis_high = 0,
 275        .resis_low = 0,
 276        .battery_resistance = 300,
 277        .charge_full_design = 612,
 278        .nominal_voltage = 3700,
 279        .termination_vol = 4050,
 280        .termination_curr = 200,
 281        .recharge_vol = 3990,
 282        .normal_cur_lvl = 400,
 283        .normal_vol_lvl = 4100,
 284        .maint_a_cur_lvl = 400,
 285        .maint_a_vol_lvl = 4050,
 286        .maint_a_chg_timer_h = 60,
 287        .maint_b_cur_lvl = 400,
 288        .maint_b_vol_lvl = 4000,
 289        .maint_b_chg_timer_h = 200,
 290        .low_high_cur_lvl = 300,
 291        .low_high_vol_lvl = 4000,
 292        .n_temp_tbl_elements = ARRAY_SIZE(temp_tbl),
 293        .r_to_t_tbl = temp_tbl,
 294        .n_v_cap_tbl_elements = ARRAY_SIZE(cap_tbl),
 295        .v_to_cap_tbl = cap_tbl,
 296        .n_batres_tbl_elements = ARRAY_SIZE(temp_to_batres_tbl_thermistor),
 297        .batres_tbl = temp_to_batres_tbl_thermistor,
 298},
 299/*
 300 * These are the batteries that doesn't have an internal NTC resistor to measure
 301 * its temperature. The temperature in this case is measure with a NTC placed
 302 * near the battery but on the PCB.
 303 */
 304{
 305        .name = POWER_SUPPLY_TECHNOLOGY_LIPO,
 306        .resis_high = 76000,
 307        .resis_low = 53000,
 308        .battery_resistance = 300,
 309        .charge_full_design = 900,
 310        .nominal_voltage = 3700,
 311        .termination_vol = 4150,
 312        .termination_curr = 100,
 313        .recharge_vol = 4130,
 314        .normal_cur_lvl = 700,
 315        .normal_vol_lvl = 4200,
 316        .maint_a_cur_lvl = 600,
 317        .maint_a_vol_lvl = 4150,
 318        .maint_a_chg_timer_h = 60,
 319        .maint_b_cur_lvl = 600,
 320        .maint_b_vol_lvl = 4100,
 321        .maint_b_chg_timer_h = 200,
 322        .low_high_cur_lvl = 300,
 323        .low_high_vol_lvl = 4000,
 324        .n_temp_tbl_elements = ARRAY_SIZE(temp_tbl),
 325        .r_to_t_tbl = temp_tbl,
 326        .n_v_cap_tbl_elements = ARRAY_SIZE(cap_tbl),
 327        .v_to_cap_tbl = cap_tbl,
 328        .n_batres_tbl_elements = ARRAY_SIZE(temp_to_batres_tbl_thermistor),
 329        .batres_tbl = temp_to_batres_tbl_thermistor,
 330},
 331{
 332        .name = POWER_SUPPLY_TECHNOLOGY_LION,
 333        .resis_high = 30000,
 334        .resis_low = 10000,
 335        .battery_resistance = 300,
 336        .charge_full_design = 950,
 337        .nominal_voltage = 3700,
 338        .termination_vol = 4150,
 339        .termination_curr = 100,
 340        .recharge_vol = 4130,
 341        .normal_cur_lvl = 700,
 342        .normal_vol_lvl = 4200,
 343        .maint_a_cur_lvl = 600,
 344        .maint_a_vol_lvl = 4150,
 345        .maint_a_chg_timer_h = 60,
 346        .maint_b_cur_lvl = 600,
 347        .maint_b_vol_lvl = 4100,
 348        .maint_b_chg_timer_h = 200,
 349        .low_high_cur_lvl = 300,
 350        .low_high_vol_lvl = 4000,
 351        .n_temp_tbl_elements = ARRAY_SIZE(temp_tbl),
 352        .r_to_t_tbl = temp_tbl,
 353        .n_v_cap_tbl_elements = ARRAY_SIZE(cap_tbl),
 354        .v_to_cap_tbl = cap_tbl,
 355        .n_batres_tbl_elements = ARRAY_SIZE(temp_to_batres_tbl_thermistor),
 356        .batres_tbl = temp_to_batres_tbl_thermistor,
 357},
 358{
 359        .name = POWER_SUPPLY_TECHNOLOGY_LION,
 360        .resis_high = 95000,
 361        .resis_low = 76001,
 362        .battery_resistance = 300,
 363        .charge_full_design = 950,
 364        .nominal_voltage = 3700,
 365        .termination_vol = 4150,
 366        .termination_curr = 100,
 367        .recharge_vol = 4130,
 368        .normal_cur_lvl = 700,
 369        .normal_vol_lvl = 4200,
 370        .maint_a_cur_lvl = 600,
 371        .maint_a_vol_lvl = 4150,
 372        .maint_a_chg_timer_h = 60,
 373        .maint_b_cur_lvl = 600,
 374        .maint_b_vol_lvl = 4100,
 375        .maint_b_chg_timer_h = 200,
 376        .low_high_cur_lvl = 300,
 377        .low_high_vol_lvl = 4000,
 378        .n_temp_tbl_elements = ARRAY_SIZE(temp_tbl),
 379        .r_to_t_tbl = temp_tbl,
 380        .n_v_cap_tbl_elements = ARRAY_SIZE(cap_tbl),
 381        .v_to_cap_tbl = cap_tbl,
 382        .n_batres_tbl_elements = ARRAY_SIZE(temp_to_batres_tbl_thermistor),
 383        .batres_tbl = temp_to_batres_tbl_thermistor,
 384},
 385};
 386
 387static const struct abx500_bm_capacity_levels cap_levels = {
 388        .critical       = 2,
 389        .low            = 10,
 390        .normal         = 70,
 391        .high           = 95,
 392        .full           = 100,
 393};
 394
 395static const struct abx500_fg_parameters fg = {
 396        .recovery_sleep_timer = 10,
 397        .recovery_total_time = 100,
 398        .init_timer = 1,
 399        .init_discard_time = 5,
 400        .init_total_time = 40,
 401        .high_curr_time = 60,
 402        .accu_charging = 30,
 403        .accu_high_curr = 30,
 404        .high_curr_threshold = 50,
 405        .lowbat_threshold = 3100,
 406        .battok_falling_th_sel0 = 2860,
 407        .battok_raising_th_sel1 = 2860,
 408        .user_cap_limit = 15,
 409        .maint_thres = 97,
 410};
 411
 412static const struct abx500_maxim_parameters maxi_params = {
 413        .ena_maxi = true,
 414        .chg_curr = 910,
 415        .wait_cycles = 10,
 416        .charger_curr_step = 100,
 417};
 418
 419static const struct abx500_bm_charger_parameters chg = {
 420        .usb_volt_max           = 5500,
 421        .usb_curr_max           = 1500,
 422        .ac_volt_max            = 7500,
 423        .ac_curr_max            = 1500,
 424};
 425
 426struct abx500_bm_data ab8500_bm_data = {
 427        .temp_under             = 3,
 428        .temp_low               = 8,
 429        .temp_high              = 43,
 430        .temp_over              = 48,
 431        .main_safety_tmr_h      = 4,
 432        .temp_interval_chg      = 20,
 433        .temp_interval_nochg    = 120,
 434        .usb_safety_tmr_h       = 4,
 435        .bkup_bat_v             = BUP_VCH_SEL_2P6V,
 436        .bkup_bat_i             = BUP_ICH_SEL_150UA,
 437        .no_maintenance         = false,
 438        .adc_therm              = ABx500_ADC_THERM_BATCTRL,
 439        .chg_unknown_bat        = false,
 440        .enable_overshoot       = false,
 441        .fg_res                 = 100,
 442        .cap_levels             = &cap_levels,
 443        .bat_type               = bat_type_thermistor,
 444        .n_btypes               = 3,
 445        .batt_id                = 0,
 446        .interval_charging      = 5,
 447        .interval_not_charging  = 120,
 448        .temp_hysteresis        = 3,
 449        .gnd_lift_resistance    = 34,
 450        .maxi                   = &maxi_params,
 451        .chg_params             = &chg,
 452        .fg_params              = &fg,
 453};
 454
 455int bmdevs_of_probe(struct device *dev, struct device_node *np,
 456                    struct abx500_bm_data **battery)
 457{
 458        struct  abx500_battery_type *btype;
 459        struct  device_node *np_bat_supply;
 460        struct  abx500_bm_data *bat;
 461        const char *btech;
 462        char bat_tech[8];
 463        int i, thermistor;
 464
 465        *battery = &ab8500_bm_data;
 466
 467        /* get phandle to 'battery-info' node */
 468        np_bat_supply = of_parse_phandle(np, "battery", 0);
 469        if (!np_bat_supply) {
 470                dev_err(dev, "missing property battery\n");
 471                return -EINVAL;
 472        }
 473        if (of_property_read_bool(np_bat_supply,
 474                        "thermistor-on-batctrl"))
 475                thermistor = NTC_INTERNAL;
 476        else
 477                thermistor = NTC_EXTERNAL;
 478
 479        bat = *battery;
 480        if (thermistor == NTC_EXTERNAL) {
 481                bat->n_btypes  = 4;
 482                bat->bat_type  = bat_type_ext_thermistor;
 483                bat->adc_therm = ABx500_ADC_THERM_BATTEMP;
 484        }
 485        btech = of_get_property(np_bat_supply,
 486                "stericsson,battery-type", NULL);
 487        if (!btech) {
 488                dev_warn(dev, "missing property battery-name/type\n");
 489                strcpy(bat_tech, "UNKNOWN");
 490        } else {
 491                strcpy(bat_tech, btech);
 492        }
 493
 494        if (strncmp(bat_tech, "LION", 4) == 0) {
 495                bat->no_maintenance  = true;
 496                bat->chg_unknown_bat = true;
 497                bat->bat_type[BATTERY_UNKNOWN].charge_full_design = 2600;
 498                bat->bat_type[BATTERY_UNKNOWN].termination_vol    = 4150;
 499                bat->bat_type[BATTERY_UNKNOWN].recharge_vol       = 4130;
 500                bat->bat_type[BATTERY_UNKNOWN].normal_cur_lvl     = 520;
 501                bat->bat_type[BATTERY_UNKNOWN].normal_vol_lvl     = 4200;
 502        }
 503        /* select the battery resolution table */
 504        for (i = 0; i < bat->n_btypes; ++i) {
 505                btype = (bat->bat_type + i);
 506                if (thermistor == NTC_EXTERNAL) {
 507                        btype->batres_tbl =
 508                                temp_to_batres_tbl_ext_thermistor;
 509                } else if (strncmp(bat_tech, "LION", 4) == 0) {
 510                        btype->batres_tbl =
 511                                temp_to_batres_tbl_9100;
 512                } else {
 513                        btype->batres_tbl =
 514                                temp_to_batres_tbl_thermistor;
 515                }
 516        }
 517        of_node_put(np_bat_supply);
 518        return 0;
 519}
 520
lxr.linux.no kindly hosted by Redpill Linpro AS, provider of Linux consulting and operations services since 1995.