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