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