Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

power: supply: Support ROHM bd99954 charger

The ROHM BD99954 is a Battery Management LSI for 1-4 cell Lithium-Ion
secondary battery intended to be used in space-constraint equipment such
as Low profile Notebook PC, Tablets and other applications. BD99954
provides a Dual-source Battery Charger, two port BC1.2 detection and a
Battery Monitor.

Support ROHM BD99954 Charger IC.

Signed-off-by: Matti Vaittinen <matti.vaittinen@fi.rohmeurope.com>
Reviewed-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
Signed-off-by: Sebastian Reichel <sebastian.reichel@collabora.com>

authored by

Matti Vaittinen and committed by
Sebastian Reichel
0902f836 2a75c8a4

+2227
+9
drivers/power/supply/Kconfig
··· 713 713 information and altering charger configurations from charger 714 714 block of the ROHM BD70528 Power Management IC. 715 715 716 + config CHARGER_BD99954 717 + tristate "ROHM bd99954 charger driver" 718 + depends on I2C 719 + select LINEAR_RANGES 720 + help 721 + Say Y here to enable support for getting battery and charger 722 + information and altering charger configurations from the ROHM 723 + BD99954 charger IC. 724 + 716 725 config CHARGER_WILCO 717 726 tristate "Wilco EC based charger for ChromeOS" 718 727 depends on WILCO_EC
+1
drivers/power/supply/Makefile
··· 92 92 obj-$(CONFIG_FUEL_GAUGE_SC27XX) += sc27xx_fuel_gauge.o 93 93 obj-$(CONFIG_CHARGER_UCS1002) += ucs1002_power.o 94 94 obj-$(CONFIG_CHARGER_BD70528) += bd70528-charger.o 95 + obj-$(CONFIG_CHARGER_BD99954) += bd99954-charger.o 95 96 obj-$(CONFIG_CHARGER_WILCO) += wilco-charger.o
+1142
drivers/power/supply/bd99954-charger.c
··· 1 + // SPDX-License-Identifier: GPL-2.0-only 2 + /* 3 + * ROHM BD99954 charger driver 4 + * 5 + * Copyright (C) 2020 Rohm Semiconductors 6 + * Originally written by: 7 + * Mikko Mutanen <mikko.mutanen@fi.rohmeurope.com> 8 + * Markus Laine <markus.laine@fi.rohmeurope.com> 9 + * Bugs added by: 10 + * Matti Vaittinen <matti.vaittinen@fi.rohmeurope.com> 11 + */ 12 + 13 + /* 14 + * The battery charging profile of BD99954. 15 + * 16 + * Curve (1) represents charging current. 17 + * Curve (2) represents battery voltage. 18 + * 19 + * The BD99954 data sheet divides charging to three phases. 20 + * a) Trickle-charge with constant current (8). 21 + * b) pre-charge with constant current (6) 22 + * c) fast-charge, first with constant current (5) phase. After 23 + * the battery voltage has reached target level (4) we have constant 24 + * voltage phase until charging current has dropped to termination 25 + * level (7) 26 + * 27 + * V ^ ^ I 28 + * . . 29 + * . . 30 + *(4)` `.` ` ` ` ` ` ` ` ` ` ` ` ` ` ----------------------------. 31 + * . :/ . 32 + * . o----+/:/ ` ` ` ` ` ` ` ` ` ` ` ` `.` ` (5) 33 + * . + :: + . 34 + * . + /- -- . 35 + * . +`/- + . 36 + * . o/- -: . 37 + * . .s. +` . 38 + * . .--+ `/ . 39 + * . ..`` + .: . 40 + * . -` + -- . 41 + * . (2) ...`` + :- . 42 + * . ...`` + -: . 43 + *(3)` `.`."" ` ` ` `+-------- ` ` ` ` ` ` `.:` ` ` ` ` ` ` ` ` .` ` (6) 44 + * . + `:. . 45 + * . + -: . 46 + * . + -:. . 47 + * . + .--. . 48 + * . (1) + `.+` ` ` `.` ` (7) 49 + * -..............` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` + ` ` ` .` ` (8) 50 + * . + - 51 + * -------------------------------------------------+++++++++--> 52 + * | trickle | pre | fast | 53 + * 54 + * Details of DT properties for different limits can be found from BD99954 55 + * device tree binding documentation. 56 + */ 57 + 58 + #include <linux/delay.h> 59 + #include <linux/gpio/consumer.h> 60 + #include <linux/interrupt.h> 61 + #include <linux/i2c.h> 62 + #include <linux/kernel.h> 63 + #include <linux/linear_range.h> 64 + #include <linux/module.h> 65 + #include <linux/mod_devicetable.h> 66 + #include <linux/power_supply.h> 67 + #include <linux/property.h> 68 + #include <linux/regmap.h> 69 + #include <linux/types.h> 70 + 71 + #include "bd99954-charger.h" 72 + 73 + struct battery_data { 74 + u16 precharge_current; /* Trickle-charge Current */ 75 + u16 fc_reg_voltage; /* Fast Charging Regulation Voltage */ 76 + u16 voltage_min; 77 + u16 voltage_max; 78 + }; 79 + 80 + /* Initial field values, converted to initial register values */ 81 + struct bd9995x_init_data { 82 + u16 vsysreg_set; /* VSYS Regulation Setting */ 83 + u16 ibus_lim_set; /* VBUS input current limitation */ 84 + u16 icc_lim_set; /* VCC/VACP Input Current Limit Setting */ 85 + u16 itrich_set; /* Trickle-charge Current Setting */ 86 + u16 iprech_set; /* Pre-Charge Current Setting */ 87 + u16 ichg_set; /* Fast-Charge constant current */ 88 + u16 vfastchg_reg_set1; /* Fast Charging Regulation Voltage */ 89 + u16 vprechg_th_set; /* Pre-charge Voltage Threshold Setting */ 90 + u16 vrechg_set; /* Re-charge Battery Voltage Setting */ 91 + u16 vbatovp_set; /* Battery Over Voltage Threshold Setting */ 92 + u16 iterm_set; /* Charging termination current */ 93 + }; 94 + 95 + struct bd9995x_state { 96 + u8 online; 97 + u16 chgstm_status; 98 + u16 vbat_vsys_status; 99 + u16 vbus_vcc_status; 100 + }; 101 + 102 + struct bd9995x_device { 103 + struct i2c_client *client; 104 + struct device *dev; 105 + struct power_supply *charger; 106 + 107 + struct regmap *rmap; 108 + struct regmap_field *rmap_fields[F_MAX_FIELDS]; 109 + 110 + int chip_id; 111 + int chip_rev; 112 + struct bd9995x_init_data init_data; 113 + struct bd9995x_state state; 114 + 115 + struct mutex lock; /* Protect state data */ 116 + }; 117 + 118 + static const struct regmap_range bd9995x_readonly_reg_ranges[] = { 119 + regmap_reg_range(CHGSTM_STATUS, SEL_ILIM_VAL), 120 + regmap_reg_range(IOUT_DACIN_VAL, IOUT_DACIN_VAL), 121 + regmap_reg_range(VCC_UCD_STATUS, VCC_IDD_STATUS), 122 + regmap_reg_range(VBUS_UCD_STATUS, VBUS_IDD_STATUS), 123 + regmap_reg_range(CHIP_ID, CHIP_REV), 124 + regmap_reg_range(SYSTEM_STATUS, SYSTEM_STATUS), 125 + regmap_reg_range(IBATP_VAL, VBAT_AVE_VAL), 126 + regmap_reg_range(VTH_VAL, EXTIADP_AVE_VAL), 127 + }; 128 + 129 + static const struct regmap_access_table bd9995x_writeable_regs = { 130 + .no_ranges = bd9995x_readonly_reg_ranges, 131 + .n_no_ranges = ARRAY_SIZE(bd9995x_readonly_reg_ranges), 132 + }; 133 + 134 + static const struct regmap_range bd9995x_volatile_reg_ranges[] = { 135 + regmap_reg_range(CHGSTM_STATUS, WDT_STATUS), 136 + regmap_reg_range(VCC_UCD_STATUS, VCC_IDD_STATUS), 137 + regmap_reg_range(VBUS_UCD_STATUS, VBUS_IDD_STATUS), 138 + regmap_reg_range(INT0_STATUS, INT7_STATUS), 139 + regmap_reg_range(SYSTEM_STATUS, SYSTEM_CTRL_SET), 140 + regmap_reg_range(IBATP_VAL, EXTIADP_AVE_VAL), /* Measurement regs */ 141 + }; 142 + 143 + static const struct regmap_access_table bd9995x_volatile_regs = { 144 + .yes_ranges = bd9995x_volatile_reg_ranges, 145 + .n_yes_ranges = ARRAY_SIZE(bd9995x_volatile_reg_ranges), 146 + }; 147 + 148 + static const struct regmap_range_cfg regmap_range_cfg[] = { 149 + { 150 + .selector_reg = MAP_SET, 151 + .selector_mask = 0xFFFF, 152 + .selector_shift = 0, 153 + .window_start = 0, 154 + .window_len = 0x100, 155 + .range_min = 0 * 0x100, 156 + .range_max = 3 * 0x100, 157 + }, 158 + }; 159 + 160 + static const struct regmap_config bd9995x_regmap_config = { 161 + .reg_bits = 8, 162 + .val_bits = 16, 163 + .reg_stride = 1, 164 + 165 + .max_register = 3 * 0x100, 166 + .cache_type = REGCACHE_RBTREE, 167 + 168 + .ranges = regmap_range_cfg, 169 + .num_ranges = ARRAY_SIZE(regmap_range_cfg), 170 + .val_format_endian = REGMAP_ENDIAN_LITTLE, 171 + .wr_table = &bd9995x_writeable_regs, 172 + .volatile_table = &bd9995x_volatile_regs, 173 + }; 174 + 175 + enum bd9995x_chrg_fault { 176 + CHRG_FAULT_NORMAL, 177 + CHRG_FAULT_INPUT, 178 + CHRG_FAULT_THERMAL_SHUTDOWN, 179 + CHRG_FAULT_TIMER_EXPIRED, 180 + }; 181 + 182 + static int bd9995x_get_prop_batt_health(struct bd9995x_device *bd) 183 + { 184 + int ret, tmp; 185 + 186 + ret = regmap_field_read(bd->rmap_fields[F_BATTEMP], &tmp); 187 + if (ret) 188 + return POWER_SUPPLY_HEALTH_UNKNOWN; 189 + 190 + /* TODO: Check these against datasheet page 34 */ 191 + 192 + switch (tmp) { 193 + case ROOM: 194 + return POWER_SUPPLY_HEALTH_GOOD; 195 + case HOT1: 196 + case HOT2: 197 + case HOT3: 198 + return POWER_SUPPLY_HEALTH_OVERHEAT; 199 + case COLD1: 200 + case COLD2: 201 + return POWER_SUPPLY_HEALTH_COLD; 202 + case TEMP_DIS: 203 + case BATT_OPEN: 204 + default: 205 + return POWER_SUPPLY_HEALTH_UNKNOWN; 206 + } 207 + } 208 + 209 + static int bd9995x_get_prop_charge_type(struct bd9995x_device *bd) 210 + { 211 + int ret, tmp; 212 + 213 + ret = regmap_field_read(bd->rmap_fields[F_CHGSTM_STATE], &tmp); 214 + if (ret) 215 + return POWER_SUPPLY_CHARGE_TYPE_UNKNOWN; 216 + 217 + switch (tmp) { 218 + case CHGSTM_TRICKLE_CHARGE: 219 + case CHGSTM_PRE_CHARGE: 220 + return POWER_SUPPLY_CHARGE_TYPE_TRICKLE; 221 + case CHGSTM_FAST_CHARGE: 222 + return POWER_SUPPLY_CHARGE_TYPE_FAST; 223 + case CHGSTM_TOP_OFF: 224 + case CHGSTM_DONE: 225 + case CHGSTM_SUSPEND: 226 + return POWER_SUPPLY_CHARGE_TYPE_NONE; 227 + default: /* Rest of the states are error related, no charging */ 228 + return POWER_SUPPLY_CHARGE_TYPE_NONE; 229 + } 230 + } 231 + 232 + static bool bd9995x_get_prop_batt_present(struct bd9995x_device *bd) 233 + { 234 + int ret, tmp; 235 + 236 + ret = regmap_field_read(bd->rmap_fields[F_BATTEMP], &tmp); 237 + if (ret) 238 + return false; 239 + 240 + return tmp != BATT_OPEN; 241 + } 242 + 243 + static int bd9995x_get_prop_batt_voltage(struct bd9995x_device *bd) 244 + { 245 + int ret, tmp; 246 + 247 + ret = regmap_field_read(bd->rmap_fields[F_VBAT_VAL], &tmp); 248 + if (ret) 249 + return 0; 250 + 251 + tmp = min(tmp, 19200); 252 + 253 + return tmp * 1000; 254 + } 255 + 256 + static int bd9995x_get_prop_batt_current(struct bd9995x_device *bd) 257 + { 258 + int ret, tmp; 259 + 260 + ret = regmap_field_read(bd->rmap_fields[F_IBATP_VAL], &tmp); 261 + if (ret) 262 + return 0; 263 + 264 + return tmp * 1000; 265 + } 266 + 267 + #define DEFAULT_BATTERY_TEMPERATURE 250 268 + 269 + static int bd9995x_get_prop_batt_temp(struct bd9995x_device *bd) 270 + { 271 + int ret, tmp; 272 + 273 + ret = regmap_field_read(bd->rmap_fields[F_THERM_VAL], &tmp); 274 + if (ret) 275 + return DEFAULT_BATTERY_TEMPERATURE; 276 + 277 + return (200 - tmp) * 10; 278 + } 279 + 280 + static int bd9995x_power_supply_get_property(struct power_supply *psy, 281 + enum power_supply_property psp, 282 + union power_supply_propval *val) 283 + { 284 + int ret, tmp; 285 + struct bd9995x_device *bd = power_supply_get_drvdata(psy); 286 + struct bd9995x_state state; 287 + 288 + mutex_lock(&bd->lock); 289 + state = bd->state; 290 + mutex_unlock(&bd->lock); 291 + 292 + switch (psp) { 293 + case POWER_SUPPLY_PROP_STATUS: 294 + switch (state.chgstm_status) { 295 + case CHGSTM_TRICKLE_CHARGE: 296 + case CHGSTM_PRE_CHARGE: 297 + case CHGSTM_FAST_CHARGE: 298 + case CHGSTM_TOP_OFF: 299 + val->intval = POWER_SUPPLY_STATUS_CHARGING; 300 + break; 301 + 302 + case CHGSTM_DONE: 303 + val->intval = POWER_SUPPLY_STATUS_FULL; 304 + break; 305 + 306 + case CHGSTM_SUSPEND: 307 + case CHGSTM_TEMPERATURE_ERROR_1: 308 + case CHGSTM_TEMPERATURE_ERROR_2: 309 + case CHGSTM_TEMPERATURE_ERROR_3: 310 + case CHGSTM_TEMPERATURE_ERROR_4: 311 + case CHGSTM_TEMPERATURE_ERROR_5: 312 + case CHGSTM_TEMPERATURE_ERROR_6: 313 + case CHGSTM_TEMPERATURE_ERROR_7: 314 + case CHGSTM_THERMAL_SHUT_DOWN_1: 315 + case CHGSTM_THERMAL_SHUT_DOWN_2: 316 + case CHGSTM_THERMAL_SHUT_DOWN_3: 317 + case CHGSTM_THERMAL_SHUT_DOWN_4: 318 + case CHGSTM_THERMAL_SHUT_DOWN_5: 319 + case CHGSTM_THERMAL_SHUT_DOWN_6: 320 + case CHGSTM_THERMAL_SHUT_DOWN_7: 321 + case CHGSTM_BATTERY_ERROR: 322 + val->intval = POWER_SUPPLY_STATUS_NOT_CHARGING; 323 + break; 324 + 325 + default: 326 + val->intval = POWER_SUPPLY_STATUS_UNKNOWN; 327 + break; 328 + } 329 + break; 330 + 331 + case POWER_SUPPLY_PROP_MANUFACTURER: 332 + val->strval = BD9995X_MANUFACTURER; 333 + break; 334 + 335 + case POWER_SUPPLY_PROP_ONLINE: 336 + val->intval = state.online; 337 + break; 338 + 339 + case POWER_SUPPLY_PROP_CONSTANT_CHARGE_CURRENT: 340 + ret = regmap_field_read(bd->rmap_fields[F_IBATP_VAL], &tmp); 341 + if (ret) 342 + return ret; 343 + val->intval = tmp * 1000; 344 + break; 345 + 346 + case POWER_SUPPLY_PROP_CHARGE_AVG: 347 + ret = regmap_field_read(bd->rmap_fields[F_IBATP_AVE_VAL], &tmp); 348 + if (ret) 349 + return ret; 350 + val->intval = tmp * 1000; 351 + break; 352 + 353 + case POWER_SUPPLY_PROP_CONSTANT_CHARGE_CURRENT_MAX: 354 + /* 355 + * Currently the DT uses this property to give the 356 + * target current for fast-charging constant current phase. 357 + * I think it is correct in a sense. 358 + * 359 + * Yet, this prop we read and return here is the programmed 360 + * safety limit for combined input currents. This feels 361 + * also correct in a sense. 362 + * 363 + * However, this results a mismatch to DT value and value 364 + * read from sysfs. 365 + */ 366 + ret = regmap_field_read(bd->rmap_fields[F_SEL_ILIM_VAL], &tmp); 367 + if (ret) 368 + return ret; 369 + val->intval = tmp * 1000; 370 + break; 371 + 372 + case POWER_SUPPLY_PROP_CONSTANT_CHARGE_VOLTAGE: 373 + if (!state.online) { 374 + val->intval = 0; 375 + break; 376 + } 377 + 378 + ret = regmap_field_read(bd->rmap_fields[F_VFASTCHG_REG_SET1], 379 + &tmp); 380 + if (ret) 381 + return ret; 382 + 383 + /* 384 + * The actual range : 2560 to 19200 mV. No matter what the 385 + * register says 386 + */ 387 + val->intval = clamp_val(tmp << 4, 2560, 19200); 388 + val->intval *= 1000; 389 + break; 390 + 391 + case POWER_SUPPLY_PROP_CHARGE_TERM_CURRENT: 392 + ret = regmap_field_read(bd->rmap_fields[F_ITERM_SET], &tmp); 393 + if (ret) 394 + return ret; 395 + /* Start step is 64 mA */ 396 + val->intval = tmp << 6; 397 + /* Maximum is 1024 mA - no matter what register says */ 398 + val->intval = min(val->intval, 1024); 399 + val->intval *= 1000; 400 + break; 401 + 402 + /* Battery properties which we access through charger */ 403 + case POWER_SUPPLY_PROP_PRESENT: 404 + val->intval = bd9995x_get_prop_batt_present(bd); 405 + break; 406 + 407 + case POWER_SUPPLY_PROP_VOLTAGE_NOW: 408 + val->intval = bd9995x_get_prop_batt_voltage(bd); 409 + break; 410 + 411 + case POWER_SUPPLY_PROP_CURRENT_NOW: 412 + val->intval = bd9995x_get_prop_batt_current(bd); 413 + break; 414 + 415 + case POWER_SUPPLY_PROP_CHARGE_TYPE: 416 + val->intval = bd9995x_get_prop_charge_type(bd); 417 + break; 418 + 419 + case POWER_SUPPLY_PROP_HEALTH: 420 + val->intval = bd9995x_get_prop_batt_health(bd); 421 + break; 422 + 423 + case POWER_SUPPLY_PROP_TEMP: 424 + val->intval = bd9995x_get_prop_batt_temp(bd); 425 + break; 426 + 427 + case POWER_SUPPLY_PROP_TECHNOLOGY: 428 + val->intval = POWER_SUPPLY_TECHNOLOGY_LION; 429 + break; 430 + 431 + case POWER_SUPPLY_PROP_MODEL_NAME: 432 + val->strval = "bd99954"; 433 + break; 434 + 435 + default: 436 + return -EINVAL; 437 + 438 + } 439 + 440 + return 0; 441 + } 442 + 443 + static int bd9995x_get_chip_state(struct bd9995x_device *bd, 444 + struct bd9995x_state *state) 445 + { 446 + int i, ret, tmp; 447 + struct { 448 + struct regmap_field *id; 449 + u16 *data; 450 + } state_fields[] = { 451 + { 452 + bd->rmap_fields[F_CHGSTM_STATE], &state->chgstm_status, 453 + }, { 454 + bd->rmap_fields[F_VBAT_VSYS_STATUS], 455 + &state->vbat_vsys_status, 456 + }, { 457 + bd->rmap_fields[F_VBUS_VCC_STATUS], 458 + &state->vbus_vcc_status, 459 + }, 460 + }; 461 + 462 + 463 + for (i = 0; i < ARRAY_SIZE(state_fields); i++) { 464 + ret = regmap_field_read(state_fields[i].id, &tmp); 465 + if (ret) 466 + return ret; 467 + 468 + *state_fields[i].data = tmp; 469 + } 470 + 471 + if (state->vbus_vcc_status & STATUS_VCC_DET || 472 + state->vbus_vcc_status & STATUS_VBUS_DET) 473 + state->online = 1; 474 + else 475 + state->online = 0; 476 + 477 + return 0; 478 + } 479 + 480 + static irqreturn_t bd9995x_irq_handler_thread(int irq, void *private) 481 + { 482 + struct bd9995x_device *bd = private; 483 + int ret, status, mask, i; 484 + unsigned long tmp; 485 + struct bd9995x_state state; 486 + 487 + /* 488 + * The bd9995x does not seem to generate big amount of interrupts. 489 + * The logic regarding which interrupts can cause relevant 490 + * status changes seem to be pretty complex. 491 + * 492 + * So lets implement really simple and hopefully bullet-proof handler: 493 + * It does not really matter which IRQ we handle, we just go and 494 + * re-read all interesting statuses + give the framework a nudge. 495 + * 496 + * Other option would be building a _complex_ and error prone logic 497 + * trying to decide what could have been changed (resulting this IRQ 498 + * we are now handling). During the normal operation the BD99954 does 499 + * not seem to be generating much of interrupts so benefit from such 500 + * logic would probably be minimal. 501 + */ 502 + 503 + ret = regmap_read(bd->rmap, INT0_STATUS, &status); 504 + if (ret) { 505 + dev_err(bd->dev, "Failed to read IRQ status\n"); 506 + return IRQ_NONE; 507 + } 508 + 509 + ret = regmap_field_read(bd->rmap_fields[F_INT0_SET], &mask); 510 + if (ret) { 511 + dev_err(bd->dev, "Failed to read IRQ mask\n"); 512 + return IRQ_NONE; 513 + } 514 + 515 + /* Handle only IRQs that are not masked */ 516 + status &= mask; 517 + tmp = status; 518 + 519 + /* Lowest bit does not represent any sub-registers */ 520 + tmp >>= 1; 521 + 522 + /* 523 + * Mask and ack IRQs we will handle (+ the idiot bit) 524 + */ 525 + ret = regmap_field_write(bd->rmap_fields[F_INT0_SET], 0); 526 + if (ret) { 527 + dev_err(bd->dev, "Failed to mask F_INT0\n"); 528 + return IRQ_NONE; 529 + } 530 + 531 + ret = regmap_write(bd->rmap, INT0_STATUS, status); 532 + if (ret) { 533 + dev_err(bd->dev, "Failed to ack F_INT0\n"); 534 + goto err_umask; 535 + } 536 + 537 + for_each_set_bit(i, &tmp, 7) { 538 + int sub_status, sub_mask; 539 + int sub_status_reg[] = { 540 + INT1_STATUS, INT2_STATUS, INT3_STATUS, INT4_STATUS, 541 + INT5_STATUS, INT6_STATUS, INT7_STATUS, 542 + }; 543 + struct regmap_field *sub_mask_f[] = { 544 + bd->rmap_fields[F_INT1_SET], 545 + bd->rmap_fields[F_INT2_SET], 546 + bd->rmap_fields[F_INT3_SET], 547 + bd->rmap_fields[F_INT4_SET], 548 + bd->rmap_fields[F_INT5_SET], 549 + bd->rmap_fields[F_INT6_SET], 550 + bd->rmap_fields[F_INT7_SET], 551 + }; 552 + 553 + /* Clear sub IRQs */ 554 + ret = regmap_read(bd->rmap, sub_status_reg[i], &sub_status); 555 + if (ret) { 556 + dev_err(bd->dev, "Failed to read IRQ sub-status\n"); 557 + goto err_umask; 558 + } 559 + 560 + ret = regmap_field_read(sub_mask_f[i], &sub_mask); 561 + if (ret) { 562 + dev_err(bd->dev, "Failed to read IRQ sub-mask\n"); 563 + goto err_umask; 564 + } 565 + 566 + /* Ack active sub-statuses */ 567 + sub_status &= sub_mask; 568 + 569 + ret = regmap_write(bd->rmap, sub_status_reg[i], sub_status); 570 + if (ret) { 571 + dev_err(bd->dev, "Failed to ack sub-IRQ\n"); 572 + goto err_umask; 573 + } 574 + } 575 + 576 + ret = regmap_field_write(bd->rmap_fields[F_INT0_SET], mask); 577 + if (ret) 578 + /* May as well retry once */ 579 + goto err_umask; 580 + 581 + /* Read whole chip state */ 582 + ret = bd9995x_get_chip_state(bd, &state); 583 + if (ret < 0) { 584 + dev_err(bd->dev, "Failed to read chip state\n"); 585 + } else { 586 + mutex_lock(&bd->lock); 587 + bd->state = state; 588 + mutex_unlock(&bd->lock); 589 + 590 + power_supply_changed(bd->charger); 591 + } 592 + 593 + return IRQ_HANDLED; 594 + 595 + err_umask: 596 + ret = regmap_field_write(bd->rmap_fields[F_INT0_SET], mask); 597 + if (ret) 598 + dev_err(bd->dev, 599 + "Failed to un-mask F_INT0 - IRQ permanently disabled\n"); 600 + 601 + return IRQ_NONE; 602 + } 603 + 604 + static int __bd9995x_chip_reset(struct bd9995x_device *bd) 605 + { 606 + int ret, state; 607 + int rst_check_counter = 10; 608 + u16 tmp = ALLRST | OTPLD; 609 + 610 + ret = regmap_raw_write(bd->rmap, SYSTEM_CTRL_SET, &tmp, 2); 611 + if (ret < 0) 612 + return ret; 613 + 614 + do { 615 + ret = regmap_field_read(bd->rmap_fields[F_OTPLD_STATE], &state); 616 + if (ret) 617 + return ret; 618 + 619 + msleep(10); 620 + } while (state == 0 && --rst_check_counter); 621 + 622 + if (!rst_check_counter) { 623 + dev_err(bd->dev, "chip reset not completed\n"); 624 + return -ETIMEDOUT; 625 + } 626 + 627 + tmp = 0; 628 + ret = regmap_raw_write(bd->rmap, SYSTEM_CTRL_SET, &tmp, 2); 629 + 630 + return ret; 631 + } 632 + 633 + static int bd9995x_hw_init(struct bd9995x_device *bd) 634 + { 635 + int ret; 636 + int i; 637 + struct bd9995x_state state; 638 + struct bd9995x_init_data *id = &bd->init_data; 639 + 640 + const struct { 641 + enum bd9995x_fields id; 642 + u16 value; 643 + } init_data[] = { 644 + /* Enable the charging trigger after SDP charger attached */ 645 + {F_SDP_CHG_TRIG_EN, 1}, 646 + /* Enable charging trigger after SDP charger attached */ 647 + {F_SDP_CHG_TRIG, 1}, 648 + /* Disable charging trigger by BC1.2 detection */ 649 + {F_VBUS_BC_DISEN, 1}, 650 + /* Disable charging trigger by BC1.2 detection */ 651 + {F_VCC_BC_DISEN, 1}, 652 + /* Disable automatic limitation of the input current */ 653 + {F_ILIM_AUTO_DISEN, 1}, 654 + /* Select current limitation when SDP charger attached*/ 655 + {F_SDP_500_SEL, 1}, 656 + /* Select current limitation when DCP charger attached */ 657 + {F_DCP_2500_SEL, 1}, 658 + {F_VSYSREG_SET, id->vsysreg_set}, 659 + /* Activate USB charging and DC/DC converter */ 660 + {F_USB_SUS, 0}, 661 + /* DCDC clock: 1200 kHz*/ 662 + {F_DCDC_CLK_SEL, 3}, 663 + /* Enable charging */ 664 + {F_CHG_EN, 1}, 665 + /* Disable Input current Limit setting voltage measurement */ 666 + {F_EXTIADPEN, 0}, 667 + /* Disable input current limiting */ 668 + {F_VSYS_PRIORITY, 1}, 669 + {F_IBUS_LIM_SET, id->ibus_lim_set}, 670 + {F_ICC_LIM_SET, id->icc_lim_set}, 671 + /* Charge Termination Current Setting to 0*/ 672 + {F_ITERM_SET, id->iterm_set}, 673 + /* Trickle-charge Current Setting */ 674 + {F_ITRICH_SET, id->itrich_set}, 675 + /* Pre-charge Current setting */ 676 + {F_IPRECH_SET, id->iprech_set}, 677 + /* Fast Charge Current for constant current phase */ 678 + {F_ICHG_SET, id->ichg_set}, 679 + /* Fast Charge Voltage Regulation Setting */ 680 + {F_VFASTCHG_REG_SET1, id->vfastchg_reg_set1}, 681 + /* Set Pre-charge Voltage Threshold for trickle charging. */ 682 + {F_VPRECHG_TH_SET, id->vprechg_th_set}, 683 + {F_VRECHG_SET, id->vrechg_set}, 684 + {F_VBATOVP_SET, id->vbatovp_set}, 685 + /* Reverse buck boost voltage Setting */ 686 + {F_VRBOOST_SET, 0}, 687 + /* Disable fast-charging watchdog */ 688 + {F_WDT_FST, 0}, 689 + /* Disable pre-charging watchdog */ 690 + {F_WDT_PRE, 0}, 691 + /* Power save off */ 692 + {F_POWER_SAVE_MODE, 0}, 693 + {F_INT1_SET, INT1_ALL}, 694 + {F_INT2_SET, INT2_ALL}, 695 + {F_INT3_SET, INT3_ALL}, 696 + {F_INT4_SET, INT4_ALL}, 697 + {F_INT5_SET, INT5_ALL}, 698 + {F_INT6_SET, INT6_ALL}, 699 + {F_INT7_SET, INT7_ALL}, 700 + }; 701 + 702 + /* 703 + * Currently we initialize charger to a known state at startup. 704 + * If we want to allow for example the boot code to initialize 705 + * charger we should get rid of this. 706 + */ 707 + ret = __bd9995x_chip_reset(bd); 708 + if (ret < 0) 709 + return ret; 710 + 711 + /* Initialize currents/voltages and other parameters */ 712 + for (i = 0; i < ARRAY_SIZE(init_data); i++) { 713 + ret = regmap_field_write(bd->rmap_fields[init_data[i].id], 714 + init_data[i].value); 715 + if (ret) { 716 + dev_err(bd->dev, "failed to initialize charger (%d)\n", 717 + ret); 718 + return ret; 719 + } 720 + } 721 + 722 + ret = bd9995x_get_chip_state(bd, &state); 723 + if (ret < 0) 724 + return ret; 725 + 726 + mutex_lock(&bd->lock); 727 + bd->state = state; 728 + mutex_unlock(&bd->lock); 729 + 730 + return 0; 731 + } 732 + 733 + static enum power_supply_property bd9995x_power_supply_props[] = { 734 + POWER_SUPPLY_PROP_MANUFACTURER, 735 + POWER_SUPPLY_PROP_STATUS, 736 + POWER_SUPPLY_PROP_ONLINE, 737 + POWER_SUPPLY_PROP_CONSTANT_CHARGE_CURRENT, 738 + POWER_SUPPLY_PROP_CHARGE_AVG, 739 + POWER_SUPPLY_PROP_CONSTANT_CHARGE_CURRENT_MAX, 740 + POWER_SUPPLY_PROP_CONSTANT_CHARGE_VOLTAGE, 741 + POWER_SUPPLY_PROP_CHARGE_TERM_CURRENT, 742 + /* Battery props we access through charger */ 743 + POWER_SUPPLY_PROP_PRESENT, 744 + POWER_SUPPLY_PROP_VOLTAGE_NOW, 745 + POWER_SUPPLY_PROP_CURRENT_NOW, 746 + POWER_SUPPLY_PROP_CHARGE_TYPE, 747 + POWER_SUPPLY_PROP_HEALTH, 748 + POWER_SUPPLY_PROP_TEMP, 749 + POWER_SUPPLY_PROP_TECHNOLOGY, 750 + POWER_SUPPLY_PROP_MODEL_NAME, 751 + }; 752 + 753 + static const struct power_supply_desc bd9995x_power_supply_desc = { 754 + .name = "bd9995x-charger", 755 + .type = POWER_SUPPLY_TYPE_USB, 756 + .properties = bd9995x_power_supply_props, 757 + .num_properties = ARRAY_SIZE(bd9995x_power_supply_props), 758 + .get_property = bd9995x_power_supply_get_property, 759 + }; 760 + 761 + /* 762 + * Limit configurations for vbus-input-current and vcc-vacp-input-current 763 + * Minimum limit is 0 uA. Max is 511 * 32000 uA = 16352000 uA. This is 764 + * configured by writing a register so that each increment in register 765 + * value equals to 32000 uA limit increment. 766 + * 767 + * Eg, value 0x0 is limit 0, value 0x1 is limit 32000, ... 768 + * Describe the setting in linear_range table. 769 + */ 770 + static const struct linear_range input_current_limit_ranges[] = { 771 + { 772 + .min = 0, 773 + .step = 32000, 774 + .min_sel = 0x0, 775 + .max_sel = 0x1ff, 776 + }, 777 + }; 778 + 779 + /* Possible trickle, pre-charging and termination current values */ 780 + static const struct linear_range charging_current_ranges[] = { 781 + { 782 + .min = 0, 783 + .step = 64000, 784 + .min_sel = 0x0, 785 + .max_sel = 0x10, 786 + }, { 787 + .min = 1024000, 788 + .step = 0, 789 + .min_sel = 0x11, 790 + .max_sel = 0x1f, 791 + }, 792 + }; 793 + 794 + /* 795 + * Fast charging voltage regulation, starting re-charging limit 796 + * and battery over voltage protection have same possible values 797 + */ 798 + static const struct linear_range charge_voltage_regulation_ranges[] = { 799 + { 800 + .min = 2560000, 801 + .step = 0, 802 + .min_sel = 0, 803 + .max_sel = 0xA0, 804 + }, { 805 + .min = 2560000, 806 + .step = 16000, 807 + .min_sel = 0xA0, 808 + .max_sel = 0x4B0, 809 + }, { 810 + .min = 19200000, 811 + .step = 0, 812 + .min_sel = 0x4B0, 813 + .max_sel = 0x7FF, 814 + }, 815 + }; 816 + 817 + /* Possible VSYS voltage regulation values */ 818 + static const struct linear_range vsys_voltage_regulation_ranges[] = { 819 + { 820 + .min = 2560000, 821 + .step = 0, 822 + .min_sel = 0, 823 + .max_sel = 0x28, 824 + }, { 825 + .min = 2560000, 826 + .step = 64000, 827 + .min_sel = 0x28, 828 + .max_sel = 0x12C, 829 + }, { 830 + .min = 19200000, 831 + .step = 0, 832 + .min_sel = 0x12C, 833 + .max_sel = 0x1FF, 834 + }, 835 + }; 836 + 837 + /* Possible settings for switching from trickle to pre-charging limits */ 838 + static const struct linear_range trickle_to_pre_threshold_ranges[] = { 839 + { 840 + .min = 2048000, 841 + .step = 0, 842 + .min_sel = 0, 843 + .max_sel = 0x20, 844 + }, { 845 + .min = 2048000, 846 + .step = 64000, 847 + .min_sel = 0x20, 848 + .max_sel = 0x12C, 849 + }, { 850 + .min = 19200000, 851 + .step = 0, 852 + .min_sel = 0x12C, 853 + .max_sel = 0x1FF 854 + } 855 + }; 856 + 857 + /* Possible current values for fast-charging constant current phase */ 858 + static const struct linear_range fast_charge_current_ranges[] = { 859 + { 860 + .min = 0, 861 + .step = 64000, 862 + .min_sel = 0, 863 + .max_sel = 0xFF, 864 + } 865 + }; 866 + 867 + struct battery_init { 868 + const char *name; 869 + int *info_data; 870 + const struct linear_range *range; 871 + int ranges; 872 + u16 *data; 873 + }; 874 + 875 + struct dt_init { 876 + char *prop; 877 + const struct linear_range *range; 878 + int ranges; 879 + u16 *data; 880 + }; 881 + 882 + static int bd9995x_fw_probe(struct bd9995x_device *bd) 883 + { 884 + int ret; 885 + struct power_supply_battery_info info; 886 + u32 property; 887 + int i; 888 + int regval; 889 + bool found; 890 + struct bd9995x_init_data *init = &bd->init_data; 891 + struct battery_init battery_inits[] = { 892 + { 893 + .name = "trickle-charging current", 894 + .info_data = &info.tricklecharge_current_ua, 895 + .range = &charging_current_ranges[0], 896 + .ranges = 2, 897 + .data = &init->itrich_set, 898 + }, { 899 + .name = "pre-charging current", 900 + .info_data = &info.precharge_current_ua, 901 + .range = &charging_current_ranges[0], 902 + .ranges = 2, 903 + .data = &init->iprech_set, 904 + }, { 905 + .name = "pre-to-trickle charge voltage threshold", 906 + .info_data = &info.precharge_voltage_max_uv, 907 + .range = &trickle_to_pre_threshold_ranges[0], 908 + .ranges = 2, 909 + .data = &init->vprechg_th_set, 910 + }, { 911 + .name = "charging termination current", 912 + .info_data = &info.charge_term_current_ua, 913 + .range = &charging_current_ranges[0], 914 + .ranges = 2, 915 + .data = &init->iterm_set, 916 + }, { 917 + .name = "charging re-start voltage", 918 + .info_data = &info.charge_restart_voltage_uv, 919 + .range = &charge_voltage_regulation_ranges[0], 920 + .ranges = 2, 921 + .data = &init->vrechg_set, 922 + }, { 923 + .name = "battery overvoltage limit", 924 + .info_data = &info.overvoltage_limit_uv, 925 + .range = &charge_voltage_regulation_ranges[0], 926 + .ranges = 2, 927 + .data = &init->vbatovp_set, 928 + }, { 929 + .name = "fast-charging max current", 930 + .info_data = &info.constant_charge_current_max_ua, 931 + .range = &fast_charge_current_ranges[0], 932 + .ranges = 1, 933 + .data = &init->ichg_set, 934 + }, { 935 + .name = "fast-charging voltage", 936 + .info_data = &info.constant_charge_voltage_max_uv, 937 + .range = &charge_voltage_regulation_ranges[0], 938 + .ranges = 2, 939 + .data = &init->vfastchg_reg_set1, 940 + }, 941 + }; 942 + struct dt_init props[] = { 943 + { 944 + .prop = "rohm,vsys-regulation-microvolt", 945 + .range = &vsys_voltage_regulation_ranges[0], 946 + .ranges = 2, 947 + .data = &init->vsysreg_set, 948 + }, { 949 + .prop = "rohm,vbus-input-current-limit-microamp", 950 + .range = &input_current_limit_ranges[0], 951 + .ranges = 1, 952 + .data = &init->ibus_lim_set, 953 + }, { 954 + .prop = "rohm,vcc-input-current-limit-microamp", 955 + .range = &input_current_limit_ranges[0], 956 + .ranges = 1, 957 + .data = &init->icc_lim_set, 958 + }, 959 + }; 960 + 961 + /* 962 + * The power_supply_get_battery_info() does not support getting values 963 + * from ACPI. Let's fix it if ACPI is required here. 964 + */ 965 + ret = power_supply_get_battery_info(bd->charger, &info); 966 + if (ret < 0) 967 + return ret; 968 + 969 + for (i = 0; i < ARRAY_SIZE(battery_inits); i++) { 970 + int val = *battery_inits[i].info_data; 971 + const struct linear_range *range = battery_inits[i].range; 972 + int ranges = battery_inits[i].ranges; 973 + 974 + if (val == -EINVAL) 975 + continue; 976 + 977 + ret = linear_range_get_selector_low_array(range, ranges, val, 978 + &regval, &found); 979 + if (ret) { 980 + dev_err(bd->dev, "Unsupported value for %s\n", 981 + battery_inits[i].name); 982 + 983 + power_supply_put_battery_info(bd->charger, &info); 984 + return -EINVAL; 985 + } 986 + if (!found) { 987 + dev_warn(bd->dev, 988 + "Unsupported value for %s - using smaller\n", 989 + battery_inits[i].name); 990 + } 991 + *(battery_inits[i].data) = regval; 992 + } 993 + 994 + power_supply_put_battery_info(bd->charger, &info); 995 + 996 + for (i = 0; i < ARRAY_SIZE(props); i++) { 997 + ret = device_property_read_u32(bd->dev, props[i].prop, 998 + &property); 999 + if (ret < 0) { 1000 + dev_err(bd->dev, "failed to read %s", props[i].prop); 1001 + 1002 + return ret; 1003 + } 1004 + 1005 + ret = linear_range_get_selector_low_array(props[i].range, 1006 + props[i].ranges, 1007 + property, &regval, 1008 + &found); 1009 + if (ret) { 1010 + dev_err(bd->dev, "Unsupported value for '%s'\n", 1011 + props[i].prop); 1012 + 1013 + return -EINVAL; 1014 + } 1015 + 1016 + if (!found) { 1017 + dev_warn(bd->dev, 1018 + "Unsupported value for '%s' - using smaller\n", 1019 + props[i].prop); 1020 + } 1021 + 1022 + *(props[i].data) = regval; 1023 + } 1024 + 1025 + return 0; 1026 + } 1027 + 1028 + void bd9995x_chip_reset(void *bd) 1029 + { 1030 + __bd9995x_chip_reset(bd); 1031 + } 1032 + 1033 + static int bd9995x_probe(struct i2c_client *client) 1034 + { 1035 + struct device *dev = &client->dev; 1036 + struct bd9995x_device *bd; 1037 + struct power_supply_config psy_cfg = {}; 1038 + int ret; 1039 + int i; 1040 + 1041 + bd = devm_kzalloc(dev, sizeof(*bd), GFP_KERNEL); 1042 + if (!bd) 1043 + return -ENOMEM; 1044 + 1045 + bd->client = client; 1046 + bd->dev = dev; 1047 + psy_cfg.drv_data = bd; 1048 + psy_cfg.of_node = dev->of_node; 1049 + 1050 + mutex_init(&bd->lock); 1051 + 1052 + bd->rmap = devm_regmap_init_i2c(client, &bd9995x_regmap_config); 1053 + if (IS_ERR(bd->rmap)) { 1054 + dev_err(dev, "Failed to setup register access via i2c\n"); 1055 + return PTR_ERR(bd->rmap); 1056 + } 1057 + 1058 + for (i = 0; i < ARRAY_SIZE(bd9995x_reg_fields); i++) { 1059 + const struct reg_field *reg_fields = bd9995x_reg_fields; 1060 + 1061 + bd->rmap_fields[i] = devm_regmap_field_alloc(dev, bd->rmap, 1062 + reg_fields[i]); 1063 + if (IS_ERR(bd->rmap_fields[i])) { 1064 + dev_err(dev, "cannot allocate regmap field\n"); 1065 + return PTR_ERR(bd->rmap_fields[i]); 1066 + } 1067 + } 1068 + 1069 + i2c_set_clientdata(client, bd); 1070 + 1071 + ret = regmap_field_read(bd->rmap_fields[F_CHIP_ID], &bd->chip_id); 1072 + if (ret) { 1073 + dev_err(dev, "Cannot read chip ID.\n"); 1074 + return ret; 1075 + } 1076 + 1077 + if (bd->chip_id != BD99954_ID) { 1078 + dev_err(dev, "Chip with ID=0x%x, not supported!\n", 1079 + bd->chip_id); 1080 + return -ENODEV; 1081 + } 1082 + 1083 + ret = regmap_field_read(bd->rmap_fields[F_CHIP_REV], &bd->chip_rev); 1084 + if (ret) { 1085 + dev_err(dev, "Cannot read revision.\n"); 1086 + return ret; 1087 + } 1088 + 1089 + dev_info(bd->dev, "Found BD99954 chip rev %d\n", bd->chip_rev); 1090 + 1091 + /* 1092 + * We need to init the psy before we can call 1093 + * power_supply_get_battery_info() for it 1094 + */ 1095 + bd->charger = devm_power_supply_register(bd->dev, 1096 + &bd9995x_power_supply_desc, 1097 + &psy_cfg); 1098 + if (IS_ERR(bd->charger)) { 1099 + dev_err(dev, "Failed to register power supply\n"); 1100 + return PTR_ERR(bd->charger); 1101 + } 1102 + 1103 + ret = bd9995x_fw_probe(bd); 1104 + if (ret < 0) { 1105 + dev_err(dev, "Cannot read device properties.\n"); 1106 + return ret; 1107 + } 1108 + 1109 + ret = bd9995x_hw_init(bd); 1110 + if (ret < 0) { 1111 + dev_err(dev, "Cannot initialize the chip.\n"); 1112 + return ret; 1113 + } 1114 + 1115 + ret = devm_add_action_or_reset(dev, bd9995x_chip_reset, bd); 1116 + if (ret) 1117 + return ret; 1118 + 1119 + return devm_request_threaded_irq(dev, client->irq, NULL, 1120 + bd9995x_irq_handler_thread, 1121 + IRQF_TRIGGER_LOW | IRQF_ONESHOT, 1122 + BD9995X_IRQ_PIN, bd); 1123 + } 1124 + 1125 + static const struct of_device_id bd9995x_of_match[] = { 1126 + { .compatible = "rohm,bd99954", }, 1127 + { } 1128 + }; 1129 + MODULE_DEVICE_TABLE(of, bd9995x_of_match); 1130 + 1131 + static struct i2c_driver bd9995x_driver = { 1132 + .driver = { 1133 + .name = "bd9995x-charger", 1134 + .of_match_table = bd9995x_of_match, 1135 + }, 1136 + .probe_new = bd9995x_probe, 1137 + }; 1138 + module_i2c_driver(bd9995x_driver); 1139 + 1140 + MODULE_AUTHOR("Laine Markus <markus.laine@fi.rohmeurope.com>"); 1141 + MODULE_DESCRIPTION("ROHM BD99954 charger driver"); 1142 + MODULE_LICENSE("GPL");
+1075
drivers/power/supply/bd99954-charger.h
··· 1 + /* SPDX-License-Identifier: GPL-2.0-only */ 2 + /* Copyright (C) 2020 ROHM Semiconductors */ 3 + #ifndef BD99954_CHARGER_H 4 + #define BD99954_CHARGER_H 5 + 6 + #include <linux/regmap.h> 7 + 8 + #define BD9995X_MANUFACTURER "Rohm Semiconductor" 9 + #define BD9995X_IRQ_PIN "bd9995x_irq" 10 + 11 + #define BD9995X_VSYS_PRECHARGE_OFFSET_MV 200 12 + 13 + #define BD99954_ID 0x346 14 + #define BD99955_ID 0x221 15 + #define BD99956_ID 0x331 16 + 17 + /* Battery Charger Commands */ 18 + #define CHARGING_CURRENT 0x14 19 + #define CHARGING_VOLTAGE 0x15 20 + #define PROTECT_SET 0x3E 21 + #define MAP_SET 0x3F 22 + 23 + /* Extended commands */ 24 + #define CHGSTM_STATUS 0x100 25 + #define VBAT_VSYS_STATUS 0x101 26 + #define VBUS_VCC_STATUS 0x102 27 + #define CHGOP_STATUS 0x103 28 + #define WDT_STATUS 0x104 29 + #define CUR_ILIM_VAL 0x105 30 + #define SEL_ILIM_VAL 0x106 31 + #define IBUS_LIM_SET 0x107 32 + #define ICC_LIM_SET 0x108 33 + #define IOTG_LIM_SET 0x109 34 + #define VIN_CTRL_SET 0x10A 35 + #define CHGOP_SET1 0x10B 36 + #define CHGOP_SET2 0x10C 37 + #define VBUSCLPS_TH_SET 0x10D 38 + #define VCCCLPS_TH_SET 0x10E 39 + #define CHGWDT_SET 0x10F 40 + #define BATTWDT_SET 0x110 41 + #define VSYSREG_SET 0x111 42 + #define VSYSVAL_THH_SET 0x112 43 + #define VSYSVAL_THL_SET 0x113 44 + #define ITRICH_SET 0x114 45 + #define IPRECH_SET 0x115 46 + #define ICHG_SET 0x116 47 + #define ITERM_SET 0x117 48 + #define VPRECHG_TH_SET 0x118 49 + #define VRBOOST_SET 0x119 50 + #define VFASTCHG_REG_SET1 0x11A 51 + #define VFASTCHG_REG_SET2 0x11B 52 + #define VFASTCHG_REG_SET3 0x11C 53 + #define VRECHG_SET 0x11D 54 + #define VBATOVP_SET 0x11E 55 + #define IBATSHORT_SET 0x11F 56 + #define PROCHOT_CTRL_SET 0x120 57 + #define PROCHOT_ICRIT_SET 0x121 58 + #define PROCHOT_INORM_SET 0x122 59 + #define PROCHOT_IDCHG_SET 0x123 60 + #define PROCHOT_VSYS_SET 0x124 61 + #define PMON_IOUT_CTRL_SET 0x125 62 + #define PMON_DACIN_VAL 0x126 63 + #define IOUT_DACIN_VAL 0x127 64 + #define VCC_UCD_SET 0x128 65 + #define VCC_UCD_STATUS 0x129 66 + #define VCC_IDD_STATUS 0x12A 67 + #define VCC_UCD_FCTRL_SET 0x12B 68 + #define VCC_UCD_FCTRL_EN 0x12C 69 + #define VBUS_UCD_SET 0x130 70 + #define VBUS_UCD_STATUS 0x131 71 + #define VBUS_IDD_STATUS 0x132 72 + #define VBUS_UCD_FCTRL_SET 0x133 73 + #define VBUS_UCD_FCTRL_EN 0x134 74 + #define CHIP_ID 0x138 75 + #define CHIP_REV 0x139 76 + #define IC_SET1 0x13A 77 + #define IC_SET2 0x13B 78 + #define SYSTEM_STATUS 0x13C 79 + #define SYSTEM_CTRL_SET 0x13D 80 + #define VM_CTRL_SET 0x140 81 + #define THERM_WINDOW_SET1 0x141 82 + #define THERM_WINDOW_SET2 0x142 83 + #define THERM_WINDOW_SET3 0x143 84 + #define THERM_WINDOW_SET4 0x144 85 + #define THERM_WINDOW_SET5 0x145 86 + #define IBATP_TH_SET 0x146 87 + #define IBATM_TH_SET 0x147 88 + #define VBAT_TH_SET 0x148 89 + #define THERM_TH_SET 0x149 90 + #define IACP_TH_SET 0x14A 91 + #define VACP_TH_SET 0x14B 92 + #define VBUS_TH_SET 0x14C 93 + #define VCC_TH_SET 0x14D 94 + #define VSYS_TH_SET 0x14E 95 + #define EXTIADP_TH_SET 0x14F 96 + #define IBATP_VAL 0x150 97 + #define IBATP_AVE_VAL 0x151 98 + #define IBATM_VAL 0x152 99 + #define IBATM_AVE_VAL 0x153 100 + #define VBAT_VAL 0x154 101 + #define VBAT_AVE_VAL 0x155 102 + #define THERM_VAL 0x156 103 + #define VTH_VAL 0x157 104 + #define IACP_VAL 0x158 105 + #define IACP_AVE_VAL 0x159 106 + #define VACP_VAL 0x15A 107 + #define VACP_AVE_VAL 0x15B 108 + #define VBUS_VAL 0x15C 109 + #define VBUS_AVE_VAL 0x15D 110 + #define VCC_VAL 0x15E 111 + #define VCC_AVE_VAL 0x15F 112 + #define VSYS_VAL 0x160 113 + #define VSYS_AVE_VAL 0x161 114 + #define EXTIADP_VAL 0x162 115 + #define EXTIADP_AVE_VAL 0x163 116 + #define VACPCLPS_TH_SET 0x164 117 + #define INT0_SET 0x168 118 + #define INT1_SET 0x169 119 + #define INT2_SET 0x16A 120 + #define INT3_SET 0x16B 121 + #define INT4_SET 0x16C 122 + #define INT5_SET 0x16D 123 + #define INT6_SET 0x16E 124 + #define INT7_SET 0x16F 125 + #define INT0_STATUS 0x170 126 + #define INT1_STATUS 0x171 127 + #define INT2_STATUS 0x172 128 + #define INT3_STATUS 0x173 129 + #define INT4_STATUS 0x174 130 + #define INT5_STATUS 0x175 131 + #define INT6_STATUS 0x176 132 + #define INT7_STATUS 0x177 133 + #define OTPREG0 0x17A 134 + #define OTPREG1 0x17B 135 + #define SMBREG 0x17C 136 + #define DEBUG_MODE_SET 0x17F 137 + #define DEBUG0x14 0x214 138 + #define DEBUG0x1A 0x21A 139 + 140 + enum bd9995x_fields { 141 + F_PREV_CHGSTM_STATE, F_CHGSTM_STATE, 142 + F_VBAT_VSYS_STATUS, 143 + F_VBUS_VCC_STATUS, 144 + F_BATTEMP, F_VRECHG_DET, F_RBOOST_UV, F_RBOOSTS, 145 + F_THERMWDT_VAL, F_CHGWDT_VAL, 146 + F_CUR_ILIM_VAL, 147 + F_SEL_ILIM_VAL, 148 + F_IBUS_LIM_SET, 149 + F_ICC_LIM_SET, 150 + F_IOTG_LIM_SET, 151 + F_OTG_BOTH_EN, 152 + F_VRBOOST_TRIG, 153 + F_VRBOOST_EN, 154 + F_PP_BOTH_THRU, 155 + F_VIN_ORD, 156 + F_VBUS_EN, 157 + F_VCC_EN, 158 + F_VSYS_PRIORITY, 159 + F_PPC_SUB_CAP, 160 + F_PPC_CAP, 161 + F_DCP_2500_SEL, 162 + F_SDP_500_SEL, 163 + F_ILIM_AUTO_DISEN, 164 + F_VCC_BC_DISEN, 165 + F_VBUS_BC_DISEN, 166 + F_SDP_CHG_TRIG_EN, 167 + F_SDP_CHG_TRIG, 168 + F_AUTO_TOF, 169 + F_AUTO_FST, 170 + F_AUTO_RECH, 171 + F_ILIM_RESET_EN, 172 + F_DCDC_1MS_SEL, 173 + F_SEL_ILIM_DIV, 174 + F_BATT_LEARN, 175 + F_CHG_EN, 176 + F_USB_SUS, 177 + F_CHOP_SS_INIT, 178 + F_CHOP_ALL_INIT, 179 + F_DCDC_CLK_SEL, 180 + F_CHOP_SS, 181 + F_CHOP_ALL, 182 + F_VBUSCLPS_TH_SET, 183 + F_VCCCLPS_TH_SET, 184 + F_WDT_FST, 185 + F_WDT_PRE, 186 + F_WDT_IBAT_SHORT, 187 + F_WDT_THERM, 188 + F_VSYSREG_SET, 189 + F_VSYSVAL_THH_SET, 190 + F_VSYSVAL_THL_SET, 191 + F_ITRICH_SET, 192 + F_IPRECH_SET, 193 + F_ICHG_SET, 194 + F_ITERM_SET, 195 + F_VPRECHG_TH_SET, 196 + F_VRBOOST_SET, 197 + F_VFASTCHG_REG_SET1, 198 + F_VFASTCHG_REG_SET2, 199 + F_VFASTCHG_REG_SET3, 200 + F_VRECHG_SET, 201 + F_VBATOVP_SET, 202 + F_IBATM_SHORT_SET, 203 + F_PROCHOT_DG_SET, 204 + F_PROCHOT_ICRIT_DG_SET, 205 + F_PROCHOT_IDCHG_DG_SET, 206 + F_PROCHOT_EN, 207 + F_PROCHOT_ICRIT_SET, 208 + F_PROCHOT_INORM_SET, 209 + F_PROCHOT_IDCHG_SET, 210 + F_PROCHOT_VSYS_SET, 211 + F_IMON_INSEL, 212 + F_PMON_INSEL, 213 + F_IOUT_OUT_EN, 214 + F_IOUT_SOURCE_SEL, 215 + F_IOUT_GAIN_SET, 216 + F_PMON_OUT_EN, 217 + F_PMON_GAIN_SET, 218 + F_PMON_DACIN_VAL, 219 + F_IOUT_DACIN_VAL, 220 + F_VCC_BCSRETRY, 221 + F_VCC_ADCRTRY, 222 + F_VCC_USBDETEN, 223 + F_VCC_IDRDETEN, 224 + F_VCC_ENUMRDY, 225 + F_VCC_ADCPOLEN, 226 + F_VCC_DCDMODE, 227 + F_VCC_USB_SW_EN, 228 + F_VCC_USB_SW, 229 + F_VCC_DCDFAIL, 230 + F_VCC_CHGPORT, 231 + F_VCC_PUPDET, 232 + F_VCC_VBUS_VLD, 233 + F_VCC_CHGDET, 234 + F_VCC_OTGDET, 235 + F_VCC_VBINOP, 236 + F_VCC_EXTID, 237 + F_VCC_IDRDET, 238 + F_VCC_INDO, 239 + F_VCC_UCDSWEN, 240 + F_VCC_RREF_EN, 241 + F_VCC_DPPU_EN, 242 + F_VCC_DPREF_EN, 243 + F_VCC_DMREF_EN, 244 + F_VCC_DPDET_EN, 245 + F_VCC_DMDET_EN, 246 + F_VCC_DPSINK_EN, 247 + F_VCC_DMSINK_EN, 248 + F_VCC_DP_BUFF_EN, 249 + F_VCC_DM_BUFF_EN, 250 + F_VCC_EXTCLKENBL, 251 + F_VCC_PLSTESTEN, 252 + F_VCC_UCDSWEN_TSTENB, 253 + F_VCC_RREF_EN_TSTENB, 254 + F_VCC_DPPU_EN_TSTENB, 255 + F_VCC_DPREF_EN_TSTENB, 256 + F_VCC_DMREF_EN_TSTENB, 257 + F_VCC_DPDET_EN_TSTENB, 258 + F_VCC_DMDET_EN_TSTENB, 259 + F_VCC_DPSINK_EN_TSTENB, 260 + F_VCC_DMSINK_EN_TSTENB, 261 + F_VCC_DP_BUFF_EN_TSTENB, 262 + F_VCC_DM_BUFF_EN_TSTENB, 263 + F_VBUS_BCSRETRY, 264 + F_VBUS_ADCRTRY, 265 + F_VBUS_USBDETEN, 266 + F_VBUS_IDRDETEN, 267 + F_VBUS_ENUMRDY, 268 + F_VBUS_ADCPOLEN, 269 + F_VBUS_DCDMODE, 270 + F_VBUS_USB_SW_EN, 271 + F_VBUS_USB_SW, 272 + F_VBUS_DCDFAIL, 273 + F_VBUS_CHGPORT, 274 + F_VBUS_PUPDET, 275 + F_VBUS_VBUS_VLD, 276 + F_VBUS_CHGDET, 277 + F_VBUS_OTGDET, 278 + F_VBUS_VBINOP, 279 + F_VBUS_EXTID, 280 + F_VBUS_IDRDET, 281 + F_VBUS_INDO, 282 + F_VBUS_UCDSWEN, 283 + F_VBUS_RREF_EN, 284 + F_VBUS_DPPU_EN, 285 + F_VBUS_DPREF_EN, 286 + F_VBUS_DMREF_EN, 287 + F_VBUS_DPDET_EN, 288 + F_VBUS_DMDET_EN, 289 + F_VBUS_DPSINK_EN, 290 + F_VBUS_DMSINK_EN, 291 + F_VBUS_DP_BUFF_EN, 292 + F_VBUS_DM_BUFF_EN, 293 + F_VBUS_EXTCLKENBL, 294 + F_VBUS_PLSTESTEN, 295 + F_VBUS_UCDSWEN_TSTENB, 296 + F_VBUS_RREF_EN_TSTENB, 297 + F_VBUS_DPPU_EN_TSTENB, 298 + F_VBUS_DPREF_EN_TSTENB, 299 + F_VBUS_DMREF_EN_TSTENB, 300 + F_VBUS_DPDET_EN_TSTENB, 301 + F_VBUS_DMDET_EN_TSTENB, 302 + F_VBUS_DPSINK_EN_TSTENB, 303 + F_VBUS_DMSINK_EN_TSTENB, 304 + F_VBUS_DP_BUFF_EN_TSTENB, 305 + F_VBUS_DM_BUFF_EN_TSTENB, 306 + F_CHIP_ID, 307 + F_CHIP_REV, 308 + F_ONE_CELL_MODE, 309 + F_cell, 310 + F_VACP_AUTO_DISCHG, 311 + F_VACP_LOAD, 312 + F_ACOK_POL, 313 + F_ACOK_DISEN, 314 + F_DEBUG_SET1, 315 + F_DEBUG_SET0, 316 + F_MONRST_STATE, 317 + F_ALMRST_STATE, 318 + F_CHGRST_STATE, 319 + F_OTPLD_STATE, 320 + F_ALLRST_STATE, 321 + F_PROTECT_SET, 322 + F_MAP_SET, 323 + F_ADCINTERVAL, 324 + F_ADCMOD, 325 + F_ADCTMOD, 326 + F_EXTIADPEN, 327 + F_VSYSENB, 328 + F_VCCENB, 329 + F_VBUSENB, 330 + F_VACPENB, 331 + F_IACPENB, 332 + F_THERMENB, 333 + F_VBATENB, 334 + F_IBATMENB, 335 + F_IBATPENB, 336 + F_TMPTHR1B, 337 + F_TMPTHR1A, 338 + F_TMPTHR2B, 339 + F_TMPTHR2A, 340 + F_TMPTHR3B, 341 + F_TMPTHR3A, 342 + F_TMPTHR4B, 343 + F_TMPTHR4A, 344 + F_TMPTHR5B, 345 + F_TMPTHR5A, 346 + F_IBATP_TH_SET, 347 + F_IBATM_TH_SET, 348 + F_VBAT_TH_SET, 349 + F_THERM_TH_SET, 350 + F_IACP_TH_SET, 351 + F_VACP_TH_SET, 352 + F_VBUS_TH_SET, 353 + F_VCC_TH_SET, 354 + F_VSYS_TH_SET, 355 + F_EXTIADP_TH_SET, 356 + F_IBATP_VAL, 357 + F_IBATP_AVE_VAL, 358 + F_IBATM_VAL, 359 + F_IBATM_AVE_VAL, 360 + F_VBAT_VAL, 361 + F_VBAT_AVE_VAL, 362 + F_THERM_VAL, 363 + F_VTH_VAL, 364 + F_IACP_VAL, 365 + F_IACP_AVE_VAL, 366 + F_VACP_VAL, 367 + F_VACP_AVE_VAL, 368 + F_VBUS_VAL, 369 + F_VBUS_AVE_VAL, 370 + F_VCC_VAL, 371 + F_VCC_AVE_VAL, 372 + F_VSYS_VAL, 373 + F_VSYS_AVE_VAL, 374 + F_EXTIADP_VAL, 375 + F_EXTIADP_AVE_VAL, 376 + F_VACPCLPS_TH_SET, 377 + F_INT7_SET, 378 + F_INT6_SET, 379 + F_INT5_SET, 380 + F_INT4_SET, 381 + F_INT3_SET, 382 + F_INT2_SET, 383 + F_INT1_SET, 384 + F_INT0_SET, 385 + F_VBUS_RBUV_DET, 386 + F_VBUS_RBUV_RES, 387 + F_VBUS_TH_DET, 388 + F_VBUS_TH_RES, 389 + F_VBUS_IIN_MOD, 390 + F_VBUS_OV_DET, 391 + F_VBUS_OV_RES, 392 + F_VBUS_CLPS_DET, 393 + F_VBUS_CLPS, 394 + F_VBUS_DET, 395 + F_VBUS_RES, 396 + F_VCC_RBUV_DET, 397 + F_VCC_RBUV_RES, 398 + F_VCC_TH_DET, 399 + F_VCC_TH_RES, 400 + F_VCC_IIN_MOD, 401 + F_VCC_OVP_DET, 402 + F_VCC_OVP_RES, 403 + F_VCC_CLPS_DET, 404 + F_VCC_CLPS_RES, 405 + F_VCC_DET, 406 + F_VCC_RES, 407 + F_TH_DET, 408 + F_TH_RMV, 409 + F_TMP_OUT_DET, 410 + F_TMP_OUT_RES, 411 + F_VBAT_TH_DET, 412 + F_VBAT_TH_RES, 413 + F_IBAT_SHORT_DET, 414 + F_IBAT_SHORT_RES, 415 + F_VBAT_OV_DET, 416 + F_VBAT_OV_RES, 417 + F_BAT_ASSIST_DET, 418 + F_BAT_ASSIST_RES, 419 + F_VSYS_TH_DET, 420 + F_VSYS_TH_RES, 421 + F_VSYS_OV_DET, 422 + F_VSYS_OV_RES, 423 + F_VSYS_SHT_DET, 424 + F_VSYS_SHT_RES, 425 + F_VSYS_UV_DET, 426 + F_VSYS_UV_RES, 427 + F_OTP_LOAD_DONE, 428 + F_PWR_ON, 429 + F_EXTIADP_TRNS, 430 + F_EXTIADP_TH_DET, 431 + F_EXIADP_TH_RES, 432 + F_BAT_MNT_DET, 433 + F_BAT_MNT_RES, 434 + F_TSD_DET, 435 + F_TSD_RES, 436 + F_CHGWDT_EXP, 437 + F_THERMWDT_EXP, 438 + F_TMP_TRNS, 439 + F_CHG_TRNS, 440 + F_VBUS_UCD_PORT_DET, 441 + F_VBUS_UCD_UCHG_DET, 442 + F_VBUS_UCD_URID_RMV, 443 + F_VBUS_UCD_OTG_DET, 444 + F_VBUS_UCD_URID_MOD, 445 + F_VCC_UCD_PORT_DET, 446 + F_VCC_UCD_UCHG_DET, 447 + F_VCC_UCD_URID_RMV, 448 + F_VCC_UCD_OTG_DET, 449 + F_VCC_UCD_URID_MOD, 450 + F_PROCHOT_DET, 451 + F_PROCHOT_RES, 452 + F_VACP_DET, 453 + F_VACP_RES, 454 + F_VACP_TH_DET, 455 + F_VACP_TH_RES, 456 + F_IACP_TH_DET, 457 + F_IACP_THE_RES, 458 + F_THERM_TH_DET, 459 + F_THERM_TH_RES, 460 + F_IBATM_TH_DET, 461 + F_IBATM_TH_RES, 462 + F_IBATP_TH_DET, 463 + F_IBATP_TH_RES, 464 + F_INT7_STATUS, 465 + F_INT6_STATUS, 466 + F_INT5_STATUS, 467 + F_INT4_STATUS, 468 + F_INT3_STATUS, 469 + F_INT2_STATUS, 470 + F_INT1_STATUS, 471 + F_INT0_STATUS, 472 + F_ILIM_DECREASE, 473 + F_RESERVE_OTPREG1, 474 + F_POWER_SAVE_MODE, 475 + F_DEBUG_MODE_SET, 476 + F_DEBUG0x14, 477 + F_DEBUG0x1A, 478 + F_MAX_FIELDS 479 + }; 480 + 481 + static const struct reg_field bd9995x_reg_fields[] = { 482 + [F_PREV_CHGSTM_STATE] = REG_FIELD(CHGSTM_STATUS, 8, 14), 483 + [F_CHGSTM_STATE] = REG_FIELD(CHGSTM_STATUS, 0, 6), 484 + [F_VBAT_VSYS_STATUS] = REG_FIELD(VBAT_VSYS_STATUS, 0, 15), 485 + [F_VBUS_VCC_STATUS] = REG_FIELD(VBUS_VCC_STATUS, 0, 12), 486 + [F_BATTEMP] = REG_FIELD(CHGOP_STATUS, 8, 10), 487 + [F_VRECHG_DET] = REG_FIELD(CHGOP_STATUS, 6, 6), 488 + [F_RBOOST_UV] = REG_FIELD(CHGOP_STATUS, 1, 1), 489 + [F_RBOOSTS] = REG_FIELD(CHGOP_STATUS, 0, 0), 490 + [F_THERMWDT_VAL] = REG_FIELD(WDT_STATUS, 8, 15), 491 + [F_CHGWDT_VAL] = REG_FIELD(WDT_STATUS, 0, 7), 492 + [F_CUR_ILIM_VAL] = REG_FIELD(CUR_ILIM_VAL, 0, 13), 493 + [F_SEL_ILIM_VAL] = REG_FIELD(SEL_ILIM_VAL, 0, 13), 494 + [F_IBUS_LIM_SET] = REG_FIELD(IBUS_LIM_SET, 5, 13), 495 + [F_ICC_LIM_SET] = REG_FIELD(ICC_LIM_SET, 5, 13), 496 + [F_IOTG_LIM_SET] = REG_FIELD(IOTG_LIM_SET, 5, 13), 497 + [F_OTG_BOTH_EN] = REG_FIELD(VIN_CTRL_SET, 15, 15), 498 + [F_VRBOOST_TRIG] = REG_FIELD(VIN_CTRL_SET, 14, 14), 499 + [F_VRBOOST_EN] = REG_FIELD(VIN_CTRL_SET, 12, 13), 500 + [F_PP_BOTH_THRU] = REG_FIELD(VIN_CTRL_SET, 11, 11), 501 + [F_VIN_ORD] = REG_FIELD(VIN_CTRL_SET, 7, 7), 502 + [F_VBUS_EN] = REG_FIELD(VIN_CTRL_SET, 6, 6), 503 + [F_VCC_EN] = REG_FIELD(VIN_CTRL_SET, 5, 5), 504 + [F_VSYS_PRIORITY] = REG_FIELD(VIN_CTRL_SET, 4, 4), 505 + [F_PPC_SUB_CAP] = REG_FIELD(VIN_CTRL_SET, 2, 3), 506 + [F_PPC_CAP] = REG_FIELD(VIN_CTRL_SET, 0, 1), 507 + [F_DCP_2500_SEL] = REG_FIELD(CHGOP_SET1, 15, 15), 508 + [F_SDP_500_SEL] = REG_FIELD(CHGOP_SET1, 14, 14), 509 + [F_ILIM_AUTO_DISEN] = REG_FIELD(CHGOP_SET1, 13, 13), 510 + [F_VCC_BC_DISEN] = REG_FIELD(CHGOP_SET1, 11, 11), 511 + [F_VBUS_BC_DISEN] = REG_FIELD(CHGOP_SET1, 10, 10), 512 + [F_SDP_CHG_TRIG_EN] = REG_FIELD(CHGOP_SET1, 9, 9), 513 + [F_SDP_CHG_TRIG] = REG_FIELD(CHGOP_SET1, 8, 8), 514 + [F_AUTO_TOF] = REG_FIELD(CHGOP_SET1, 6, 6), 515 + [F_AUTO_FST] = REG_FIELD(CHGOP_SET1, 5, 5), 516 + [F_AUTO_RECH] = REG_FIELD(CHGOP_SET1, 3, 3), 517 + [F_ILIM_RESET_EN] = REG_FIELD(CHGOP_SET2, 14, 14), 518 + [F_DCDC_1MS_SEL] = REG_FIELD(CHGOP_SET2, 12, 13), 519 + [F_SEL_ILIM_DIV] = REG_FIELD(CHGOP_SET2, 10, 10), 520 + [F_BATT_LEARN] = REG_FIELD(CHGOP_SET2, 8, 8), 521 + [F_CHG_EN] = REG_FIELD(CHGOP_SET2, 7, 7), 522 + [F_USB_SUS] = REG_FIELD(CHGOP_SET2, 6, 6), 523 + [F_CHOP_SS_INIT] = REG_FIELD(CHGOP_SET2, 5, 5), 524 + [F_CHOP_ALL_INIT] = REG_FIELD(CHGOP_SET2, 4, 4), 525 + [F_DCDC_CLK_SEL] = REG_FIELD(CHGOP_SET2, 2, 3), 526 + [F_CHOP_SS] = REG_FIELD(CHGOP_SET2, 1, 1), 527 + [F_CHOP_ALL] = REG_FIELD(CHGOP_SET2, 0, 0), 528 + [F_VBUSCLPS_TH_SET] = REG_FIELD(VBUSCLPS_TH_SET, 7, 14), 529 + [F_VCCCLPS_TH_SET] = REG_FIELD(VCCCLPS_TH_SET, 7, 14), 530 + [F_WDT_FST] = REG_FIELD(CHGWDT_SET, 8, 15), 531 + [F_WDT_PRE] = REG_FIELD(CHGWDT_SET, 0, 7), 532 + [F_WDT_IBAT_SHORT] = REG_FIELD(BATTWDT_SET, 8, 15), 533 + [F_WDT_THERM] = REG_FIELD(BATTWDT_SET, 0, 7), 534 + [F_VSYSREG_SET] = REG_FIELD(VSYSREG_SET, 6, 14), 535 + [F_VSYSVAL_THH_SET] = REG_FIELD(VSYSVAL_THH_SET, 6, 14), 536 + [F_VSYSVAL_THL_SET] = REG_FIELD(VSYSVAL_THL_SET, 6, 14), 537 + [F_ITRICH_SET] = REG_FIELD(ITRICH_SET, 6, 10), 538 + [F_IPRECH_SET] = REG_FIELD(IPRECH_SET, 6, 10), 539 + [F_ICHG_SET] = REG_FIELD(ICHG_SET, 6, 13), 540 + [F_ITERM_SET] = REG_FIELD(ITERM_SET, 6, 10), 541 + [F_VPRECHG_TH_SET] = REG_FIELD(VPRECHG_TH_SET, 6, 14), 542 + [F_VRBOOST_SET] = REG_FIELD(VRBOOST_SET, 6, 14), 543 + [F_VFASTCHG_REG_SET1] = REG_FIELD(VFASTCHG_REG_SET1, 4, 14), 544 + [F_VFASTCHG_REG_SET2] = REG_FIELD(VFASTCHG_REG_SET2, 4, 14), 545 + [F_VFASTCHG_REG_SET3] = REG_FIELD(VFASTCHG_REG_SET3, 4, 14), 546 + [F_VRECHG_SET] = REG_FIELD(VRECHG_SET, 4, 14), 547 + [F_VBATOVP_SET] = REG_FIELD(VBATOVP_SET, 4, 14), 548 + [F_IBATM_SHORT_SET] = REG_FIELD(IBATSHORT_SET, 0, 14), 549 + [F_PROCHOT_DG_SET] = REG_FIELD(PROCHOT_CTRL_SET, 14, 15), 550 + [F_PROCHOT_ICRIT_DG_SET] = REG_FIELD(PROCHOT_CTRL_SET, 10, 11), 551 + [F_PROCHOT_IDCHG_DG_SET] = REG_FIELD(PROCHOT_CTRL_SET, 8, 9), 552 + [F_PROCHOT_EN] = REG_FIELD(PROCHOT_CTRL_SET, 0, 4), 553 + [F_PROCHOT_ICRIT_SET] = REG_FIELD(PROCHOT_ICRIT_SET, 0, 14), 554 + [F_PROCHOT_INORM_SET] = REG_FIELD(PROCHOT_INORM_SET, 0, 14), 555 + [F_PROCHOT_IDCHG_SET] = REG_FIELD(PROCHOT_IDCHG_SET, 0, 14), 556 + [F_PROCHOT_VSYS_SET] = REG_FIELD(PROCHOT_VSYS_SET, 0, 14), 557 + [F_IMON_INSEL] = REG_FIELD(PMON_IOUT_CTRL_SET, 9, 9), 558 + [F_PMON_INSEL] = REG_FIELD(PMON_IOUT_CTRL_SET, 8, 8), 559 + [F_IOUT_OUT_EN] = REG_FIELD(PMON_IOUT_CTRL_SET, 7, 7), 560 + [F_IOUT_SOURCE_SEL] = REG_FIELD(PMON_IOUT_CTRL_SET, 6, 6), 561 + [F_IOUT_GAIN_SET] = REG_FIELD(PMON_IOUT_CTRL_SET, 4, 5), 562 + [F_PMON_OUT_EN] = REG_FIELD(PMON_IOUT_CTRL_SET, 3, 3), 563 + [F_PMON_GAIN_SET] = REG_FIELD(PMON_IOUT_CTRL_SET, 0, 2), 564 + [F_PMON_DACIN_VAL] = REG_FIELD(PMON_DACIN_VAL, 0, 9), 565 + [F_IOUT_DACIN_VAL] = REG_FIELD(IOUT_DACIN_VAL, 0, 11), 566 + [F_VCC_BCSRETRY] = REG_FIELD(VCC_UCD_SET, 12, 12), 567 + [F_VCC_ADCRTRY] = REG_FIELD(VCC_UCD_SET, 8, 8), 568 + [F_VCC_USBDETEN] = REG_FIELD(VCC_UCD_SET, 7, 7), 569 + [F_VCC_IDRDETEN] = REG_FIELD(VCC_UCD_SET, 6, 6), 570 + [F_VCC_ENUMRDY] = REG_FIELD(VCC_UCD_SET, 5, 5), 571 + [F_VCC_ADCPOLEN] = REG_FIELD(VCC_UCD_SET, 4, 4), 572 + [F_VCC_DCDMODE] = REG_FIELD(VCC_UCD_SET, 3, 3), 573 + [F_VCC_USB_SW_EN] = REG_FIELD(VCC_UCD_SET, 1, 1), 574 + [F_VCC_USB_SW] = REG_FIELD(VCC_UCD_SET, 0, 0), 575 + [F_VCC_DCDFAIL] = REG_FIELD(VCC_UCD_STATUS, 15, 15), 576 + [F_VCC_CHGPORT] = REG_FIELD(VCC_UCD_STATUS, 12, 13), 577 + [F_VCC_PUPDET] = REG_FIELD(VCC_UCD_STATUS, 11, 11), 578 + [F_VCC_VBUS_VLD] = REG_FIELD(VCC_UCD_STATUS, 7, 7), 579 + [F_VCC_CHGDET] = REG_FIELD(VCC_UCD_STATUS, 6, 6), 580 + [F_VCC_OTGDET] = REG_FIELD(VCC_UCD_STATUS, 3, 3), 581 + [F_VCC_VBINOP] = REG_FIELD(VCC_IDD_STATUS, 6, 6), 582 + [F_VCC_EXTID] = REG_FIELD(VCC_IDD_STATUS, 5, 5), 583 + [F_VCC_IDRDET] = REG_FIELD(VCC_IDD_STATUS, 4, 4), 584 + [F_VCC_INDO] = REG_FIELD(VCC_IDD_STATUS, 0, 3), 585 + [F_VCC_UCDSWEN] = REG_FIELD(VCC_UCD_FCTRL_SET, 10, 10), 586 + [F_VCC_RREF_EN] = REG_FIELD(VCC_UCD_FCTRL_SET, 9, 9), 587 + [F_VCC_DPPU_EN] = REG_FIELD(VCC_UCD_FCTRL_SET, 8, 8), 588 + [F_VCC_DPREF_EN] = REG_FIELD(VCC_UCD_FCTRL_SET, 7, 7), 589 + [F_VCC_DMREF_EN] = REG_FIELD(VCC_UCD_FCTRL_SET, 6, 6), 590 + [F_VCC_DPDET_EN] = REG_FIELD(VCC_UCD_FCTRL_SET, 5, 5), 591 + [F_VCC_DMDET_EN] = REG_FIELD(VCC_UCD_FCTRL_SET, 4, 4), 592 + [F_VCC_DPSINK_EN] = REG_FIELD(VCC_UCD_FCTRL_SET, 3, 3), 593 + [F_VCC_DMSINK_EN] = REG_FIELD(VCC_UCD_FCTRL_SET, 2, 2), 594 + [F_VCC_DP_BUFF_EN] = REG_FIELD(VCC_UCD_FCTRL_SET, 1, 1), 595 + [F_VCC_DM_BUFF_EN] = REG_FIELD(VCC_UCD_FCTRL_SET, 0, 0), 596 + [F_VCC_EXTCLKENBL] = REG_FIELD(VCC_UCD_FCTRL_EN, 15, 15), 597 + [F_VCC_PLSTESTEN] = REG_FIELD(VCC_UCD_FCTRL_EN, 14, 14), 598 + [F_VCC_UCDSWEN_TSTENB] = REG_FIELD(VCC_UCD_FCTRL_EN, 10, 10), 599 + [F_VCC_RREF_EN_TSTENB] = REG_FIELD(VCC_UCD_FCTRL_EN, 9, 9), 600 + [F_VCC_DPPU_EN_TSTENB] = REG_FIELD(VCC_UCD_FCTRL_EN, 8, 8), 601 + [F_VCC_DPREF_EN_TSTENB] = REG_FIELD(VCC_UCD_FCTRL_EN, 7, 7), 602 + [F_VCC_DMREF_EN_TSTENB] = REG_FIELD(VCC_UCD_FCTRL_EN, 6, 6), 603 + [F_VCC_DPDET_EN_TSTENB] = REG_FIELD(VCC_UCD_FCTRL_EN, 5, 5), 604 + [F_VCC_DMDET_EN_TSTENB] = REG_FIELD(VCC_UCD_FCTRL_EN, 4, 4), 605 + [F_VCC_DPSINK_EN_TSTENB] = REG_FIELD(VCC_UCD_FCTRL_EN, 3, 3), 606 + [F_VCC_DMSINK_EN_TSTENB] = REG_FIELD(VCC_UCD_FCTRL_EN, 2, 2), 607 + [F_VCC_DP_BUFF_EN_TSTENB] = REG_FIELD(VCC_UCD_FCTRL_EN, 1, 1), 608 + [F_VCC_DM_BUFF_EN_TSTENB] = REG_FIELD(VCC_UCD_FCTRL_EN, 0, 0), 609 + 610 + [F_VBUS_BCSRETRY] = REG_FIELD(VBUS_UCD_SET, 12, 12), 611 + [F_VBUS_ADCRTRY] = REG_FIELD(VBUS_UCD_SET, 8, 8), 612 + [F_VBUS_USBDETEN] = REG_FIELD(VBUS_UCD_SET, 7, 7), 613 + [F_VBUS_IDRDETEN] = REG_FIELD(VBUS_UCD_SET, 6, 6), 614 + [F_VBUS_ENUMRDY] = REG_FIELD(VBUS_UCD_SET, 5, 5), 615 + [F_VBUS_ADCPOLEN] = REG_FIELD(VBUS_UCD_SET, 4, 4), 616 + [F_VBUS_DCDMODE] = REG_FIELD(VBUS_UCD_SET, 3, 3), 617 + [F_VBUS_USB_SW_EN] = REG_FIELD(VBUS_UCD_SET, 1, 1), 618 + [F_VBUS_USB_SW] = REG_FIELD(VBUS_UCD_SET, 0, 0), 619 + [F_VBUS_DCDFAIL] = REG_FIELD(VBUS_UCD_STATUS, 15, 15), 620 + [F_VBUS_CHGPORT] = REG_FIELD(VBUS_UCD_STATUS, 12, 13), 621 + [F_VBUS_PUPDET] = REG_FIELD(VBUS_UCD_STATUS, 11, 11), 622 + [F_VBUS_VBUS_VLD] = REG_FIELD(VBUS_UCD_STATUS, 7, 7), 623 + [F_VBUS_CHGDET] = REG_FIELD(VBUS_UCD_STATUS, 6, 6), 624 + [F_VBUS_OTGDET] = REG_FIELD(VBUS_UCD_STATUS, 3, 3), 625 + [F_VBUS_VBINOP] = REG_FIELD(VBUS_IDD_STATUS, 6, 6), 626 + [F_VBUS_EXTID] = REG_FIELD(VBUS_IDD_STATUS, 5, 5), 627 + [F_VBUS_IDRDET] = REG_FIELD(VBUS_IDD_STATUS, 4, 4), 628 + [F_VBUS_INDO] = REG_FIELD(VBUS_IDD_STATUS, 0, 3), 629 + [F_VBUS_UCDSWEN] = REG_FIELD(VCC_UCD_FCTRL_SET, 10, 10), 630 + [F_VBUS_RREF_EN] = REG_FIELD(VCC_UCD_FCTRL_SET, 9, 9), 631 + [F_VBUS_DPPU_EN] = REG_FIELD(VCC_UCD_FCTRL_SET, 8, 8), 632 + [F_VBUS_DPREF_EN] = REG_FIELD(VCC_UCD_FCTRL_SET, 7, 7), 633 + [F_VBUS_DMREF_EN] = REG_FIELD(VCC_UCD_FCTRL_SET, 6, 6), 634 + [F_VBUS_DPDET_EN] = REG_FIELD(VCC_UCD_FCTRL_SET, 5, 5), 635 + [F_VBUS_DMDET_EN] = REG_FIELD(VCC_UCD_FCTRL_SET, 4, 4), 636 + [F_VBUS_DPSINK_EN] = REG_FIELD(VCC_UCD_FCTRL_SET, 3, 3), 637 + [F_VBUS_DMSINK_EN] = REG_FIELD(VCC_UCD_FCTRL_SET, 2, 2), 638 + [F_VBUS_DP_BUFF_EN] = REG_FIELD(VCC_UCD_FCTRL_SET, 1, 1), 639 + [F_VBUS_DM_BUFF_EN] = REG_FIELD(VCC_UCD_FCTRL_SET, 0, 0), 640 + 641 + [F_VBUS_EXTCLKENBL] = REG_FIELD(VBUS_UCD_FCTRL_EN, 15, 15), 642 + [F_VBUS_PLSTESTEN] = REG_FIELD(VBUS_UCD_FCTRL_EN, 14, 14), 643 + [F_VBUS_UCDSWEN_TSTENB] = REG_FIELD(VBUS_UCD_FCTRL_EN, 10, 10), 644 + [F_VBUS_RREF_EN_TSTENB] = REG_FIELD(VBUS_UCD_FCTRL_EN, 9, 9), 645 + [F_VBUS_DPPU_EN_TSTENB] = REG_FIELD(VBUS_UCD_FCTRL_EN, 8, 8), 646 + [F_VBUS_DPREF_EN_TSTENB] = REG_FIELD(VBUS_UCD_FCTRL_EN, 7, 7), 647 + [F_VBUS_DMREF_EN_TSTENB] = REG_FIELD(VBUS_UCD_FCTRL_EN, 6, 6), 648 + [F_VBUS_DPDET_EN_TSTENB] = REG_FIELD(VBUS_UCD_FCTRL_EN, 5, 5), 649 + [F_VBUS_DMDET_EN_TSTENB] = REG_FIELD(VBUS_UCD_FCTRL_EN, 4, 4), 650 + [F_VBUS_DPSINK_EN_TSTENB] = REG_FIELD(VBUS_UCD_FCTRL_EN, 3, 3), 651 + [F_VBUS_DMSINK_EN_TSTENB] = REG_FIELD(VBUS_UCD_FCTRL_EN, 2, 2), 652 + [F_VBUS_DP_BUFF_EN_TSTENB] = REG_FIELD(VBUS_UCD_FCTRL_EN, 1, 1), 653 + [F_VBUS_DM_BUFF_EN_TSTENB] = REG_FIELD(VBUS_UCD_FCTRL_EN, 0, 0), 654 + 655 + [F_CHIP_ID] = REG_FIELD(CHIP_ID, 0, 15), 656 + [F_CHIP_REV] = REG_FIELD(CHIP_REV, 0, 15), 657 + [F_ONE_CELL_MODE] = REG_FIELD(IC_SET1, 11, 11), 658 + [F_cell] = REG_FIELD(IC_SET1, 1, 1), 659 + [F_VACP_AUTO_DISCHG] = REG_FIELD(IC_SET1, 9, 9), 660 + [F_VACP_LOAD] = REG_FIELD(IC_SET1, 8, 8), 661 + [F_ACOK_POL] = REG_FIELD(IC_SET1, 1, 1), 662 + [F_ACOK_DISEN] = REG_FIELD(IC_SET1, 0, 0), 663 + [F_DEBUG_SET1] = REG_FIELD(IC_SET2, 4, 8), 664 + [F_DEBUG_SET0] = REG_FIELD(IC_SET2, 0, 0), 665 + [F_MONRST_STATE] = REG_FIELD(SYSTEM_STATUS, 6, 6), 666 + [F_ALMRST_STATE] = REG_FIELD(SYSTEM_STATUS, 5, 5), 667 + [F_CHGRST_STATE] = REG_FIELD(SYSTEM_STATUS, 4, 4), 668 + [F_OTPLD_STATE] = REG_FIELD(SYSTEM_STATUS, 1, 1), 669 + [F_ALLRST_STATE] = REG_FIELD(SYSTEM_STATUS, 0, 0), 670 + [F_PROTECT_SET] = REG_FIELD(PROTECT_SET, 0, 15), 671 + [F_MAP_SET] = REG_FIELD(MAP_SET, 0, 15), 672 + [F_ADCINTERVAL] = REG_FIELD(VM_CTRL_SET, 14, 15), 673 + [F_ADCMOD] = REG_FIELD(VM_CTRL_SET, 12, 13), 674 + [F_ADCTMOD] = REG_FIELD(VM_CTRL_SET, 10, 11), 675 + [F_EXTIADPEN] = REG_FIELD(VM_CTRL_SET, 9, 9), 676 + [F_VSYSENB] = REG_FIELD(VM_CTRL_SET, 8, 8), 677 + [F_VCCENB] = REG_FIELD(VM_CTRL_SET, 7, 7), 678 + [F_VBUSENB] = REG_FIELD(VM_CTRL_SET, 6, 6), 679 + [F_VACPENB] = REG_FIELD(VM_CTRL_SET, 5, 5), 680 + [F_IACPENB] = REG_FIELD(VM_CTRL_SET, 4, 4), 681 + [F_THERMENB] = REG_FIELD(VM_CTRL_SET, 3, 3), 682 + [F_VBATENB] = REG_FIELD(VM_CTRL_SET, 2, 2), 683 + [F_IBATMENB] = REG_FIELD(VM_CTRL_SET, 1, 1), 684 + [F_IBATPENB] = REG_FIELD(VM_CTRL_SET, 0, 0), 685 + [F_TMPTHR1B] = REG_FIELD(THERM_WINDOW_SET1, 8, 15), 686 + [F_TMPTHR1A] = REG_FIELD(THERM_WINDOW_SET1, 0, 7), 687 + [F_TMPTHR2B] = REG_FIELD(THERM_WINDOW_SET2, 8, 15), 688 + [F_TMPTHR2A] = REG_FIELD(THERM_WINDOW_SET2, 0, 7), 689 + [F_TMPTHR3B] = REG_FIELD(THERM_WINDOW_SET3, 8, 15), 690 + [F_TMPTHR3A] = REG_FIELD(THERM_WINDOW_SET3, 0, 7), 691 + [F_TMPTHR4B] = REG_FIELD(THERM_WINDOW_SET4, 8, 15), 692 + [F_TMPTHR4A] = REG_FIELD(THERM_WINDOW_SET4, 0, 7), 693 + [F_TMPTHR5B] = REG_FIELD(THERM_WINDOW_SET5, 8, 15), 694 + [F_TMPTHR5A] = REG_FIELD(THERM_WINDOW_SET5, 0, 7), 695 + [F_IBATP_TH_SET] = REG_FIELD(IBATP_TH_SET, 0, 14), 696 + [F_IBATM_TH_SET] = REG_FIELD(IBATM_TH_SET, 0, 14), 697 + [F_VBAT_TH_SET] = REG_FIELD(VBAT_TH_SET, 0, 14), 698 + [F_THERM_TH_SET] = REG_FIELD(THERM_TH_SET, 0, 7), 699 + [F_IACP_TH_SET] = REG_FIELD(IACP_TH_SET, 0, 14), 700 + [F_VACP_TH_SET] = REG_FIELD(VACP_TH_SET, 0, 14), 701 + [F_VBUS_TH_SET] = REG_FIELD(VBUS_TH_SET, 0, 14), 702 + [F_VCC_TH_SET] = REG_FIELD(VCC_TH_SET, 0, 14), 703 + [F_VSYS_TH_SET] = REG_FIELD(VSYS_TH_SET, 0, 14), 704 + [F_EXTIADP_TH_SET] = REG_FIELD(EXTIADP_TH_SET, 0, 11), 705 + [F_IBATP_VAL] = REG_FIELD(IBATP_VAL, 0, 14), 706 + [F_IBATP_AVE_VAL] = REG_FIELD(IBATP_AVE_VAL, 0, 14), 707 + [F_IBATM_VAL] = REG_FIELD(IBATM_VAL, 0, 14), 708 + [F_IBATM_AVE_VAL] = REG_FIELD(IBATM_AVE_VAL, 0, 14), 709 + [F_VBAT_VAL] = REG_FIELD(VBAT_VAL, 0, 14), 710 + [F_VBAT_AVE_VAL] = REG_FIELD(VBAT_AVE_VAL, 0, 14), 711 + [F_THERM_VAL] = REG_FIELD(THERM_VAL, 0, 7), 712 + [F_VTH_VAL] = REG_FIELD(VTH_VAL, 0, 11), 713 + [F_IACP_VAL] = REG_FIELD(IACP_VAL, 0, 14), 714 + [F_IACP_AVE_VAL] = REG_FIELD(IACP_AVE_VAL, 0, 14), 715 + [F_VACP_VAL] = REG_FIELD(VACP_VAL, 0, 14), 716 + [F_VACP_AVE_VAL] = REG_FIELD(VACP_AVE_VAL, 0, 14), 717 + [F_VBUS_VAL] = REG_FIELD(VBUS_VAL, 0, 14), 718 + [F_VBUS_AVE_VAL] = REG_FIELD(VBUS_AVE_VAL, 0, 14), 719 + [F_VCC_VAL] = REG_FIELD(VCC_VAL, 0, 14), 720 + [F_VCC_AVE_VAL] = REG_FIELD(VCC_AVE_VAL, 0, 14), 721 + [F_VSYS_VAL] = REG_FIELD(VSYS_VAL, 0, 14), 722 + [F_VSYS_AVE_VAL] = REG_FIELD(VSYS_AVE_VAL, 0, 14), 723 + [F_EXTIADP_VAL] = REG_FIELD(EXTIADP_VAL, 0, 11), 724 + [F_EXTIADP_AVE_VAL] = REG_FIELD(EXTIADP_AVE_VAL, 0, 11), 725 + [F_VACPCLPS_TH_SET] = REG_FIELD(VACPCLPS_TH_SET, 7, 14), 726 + [F_INT7_SET] = REG_FIELD(INT7_SET, 0, 15), 727 + [F_INT6_SET] = REG_FIELD(INT6_SET, 0, 13), 728 + [F_INT5_SET] = REG_FIELD(INT5_SET, 0, 13), 729 + [F_INT4_SET] = REG_FIELD(INT4_SET, 0, 9), 730 + [F_INT3_SET] = REG_FIELD(INT3_SET, 0, 15), 731 + [F_INT2_SET] = REG_FIELD(INT2_SET, 0, 15), 732 + [F_INT1_SET] = REG_FIELD(INT1_SET, 0, 15), 733 + [F_INT0_SET] = REG_FIELD(INT0_SET, 0, 7), 734 + [F_VBUS_RBUV_DET] = REG_FIELD(INT1_SET, 15, 15), 735 + [F_VBUS_RBUV_RES] = REG_FIELD(INT1_SET, 14, 14), 736 + [F_VBUS_TH_DET] = REG_FIELD(INT1_SET, 9, 9), 737 + [F_VBUS_TH_RES] = REG_FIELD(INT1_SET, 8, 8), 738 + [F_VBUS_IIN_MOD] = REG_FIELD(INT1_SET, 6, 6), 739 + [F_VBUS_OV_DET] = REG_FIELD(INT1_SET, 5, 5), 740 + [F_VBUS_OV_RES] = REG_FIELD(INT1_SET, 4, 4), 741 + [F_VBUS_CLPS_DET] = REG_FIELD(INT1_SET, 3, 3), 742 + [F_VBUS_CLPS] = REG_FIELD(INT1_SET, 2, 2), 743 + [F_VBUS_DET] = REG_FIELD(INT1_SET, 1, 1), 744 + [F_VBUS_RES] = REG_FIELD(INT1_SET, 0, 0), 745 + [F_VCC_RBUV_DET] = REG_FIELD(INT2_SET, 15, 15), 746 + [F_VCC_RBUV_RES] = REG_FIELD(INT2_SET, 14, 14), 747 + [F_VCC_TH_DET] = REG_FIELD(INT2_SET, 9, 9), 748 + [F_VCC_TH_RES] = REG_FIELD(INT2_SET, 8, 8), 749 + [F_VCC_IIN_MOD] = REG_FIELD(INT2_SET, 6, 6), 750 + [F_VCC_OVP_DET] = REG_FIELD(INT2_SET, 5, 5), 751 + [F_VCC_OVP_RES] = REG_FIELD(INT2_SET, 4, 4), 752 + [F_VCC_CLPS_DET] = REG_FIELD(INT2_SET, 3, 3), 753 + [F_VCC_CLPS_RES] = REG_FIELD(INT2_SET, 2, 2), 754 + [F_VCC_DET] = REG_FIELD(INT2_SET, 1, 1), 755 + [F_VCC_RES] = REG_FIELD(INT2_SET, 0, 0), 756 + [F_TH_DET] = REG_FIELD(INT3_SET, 15, 15), 757 + [F_TH_RMV] = REG_FIELD(INT3_SET, 14, 14), 758 + [F_TMP_OUT_DET] = REG_FIELD(INT3_SET, 11, 11), 759 + [F_TMP_OUT_RES] = REG_FIELD(INT3_SET, 10, 10), 760 + [F_VBAT_TH_DET] = REG_FIELD(INT3_SET, 9, 9), 761 + [F_VBAT_TH_RES] = REG_FIELD(INT3_SET, 8, 8), 762 + [F_IBAT_SHORT_DET] = REG_FIELD(INT3_SET, 7, 7), 763 + [F_IBAT_SHORT_RES] = REG_FIELD(INT3_SET, 6, 6), 764 + [F_VBAT_OV_DET] = REG_FIELD(INT3_SET, 5, 5), 765 + [F_VBAT_OV_RES] = REG_FIELD(INT3_SET, 4, 4), 766 + [F_BAT_ASSIST_DET] = REG_FIELD(INT3_SET, 3, 3), 767 + [F_BAT_ASSIST_RES] = REG_FIELD(INT3_SET, 2, 2), 768 + [F_VSYS_TH_DET] = REG_FIELD(INT4_SET, 9, 9), 769 + [F_VSYS_TH_RES] = REG_FIELD(INT4_SET, 8, 8), 770 + [F_VSYS_OV_DET] = REG_FIELD(INT4_SET, 5, 5), 771 + [F_VSYS_OV_RES] = REG_FIELD(INT4_SET, 4, 4), 772 + [F_VSYS_SHT_DET] = REG_FIELD(INT4_SET, 3, 3), 773 + [F_VSYS_SHT_RES] = REG_FIELD(INT4_SET, 2, 2), 774 + [F_VSYS_UV_DET] = REG_FIELD(INT4_SET, 1, 1), 775 + [F_VSYS_UV_RES] = REG_FIELD(INT4_SET, 0, 0), 776 + [F_OTP_LOAD_DONE] = REG_FIELD(INT5_SET, 13, 13), 777 + [F_PWR_ON] = REG_FIELD(INT5_SET, 12, 12), 778 + [F_EXTIADP_TRNS] = REG_FIELD(INT5_SET, 11, 11), 779 + [F_EXTIADP_TH_DET] = REG_FIELD(INT5_SET, 9, 9), 780 + [F_EXIADP_TH_RES] = REG_FIELD(INT5_SET, 8, 8), 781 + [F_BAT_MNT_DET] = REG_FIELD(INT5_SET, 7, 7), 782 + [F_BAT_MNT_RES] = REG_FIELD(INT5_SET, 6, 6), 783 + [F_TSD_DET] = REG_FIELD(INT5_SET, 5, 5), 784 + [F_TSD_RES] = REG_FIELD(INT5_SET, 4, 4), 785 + [F_CHGWDT_EXP] = REG_FIELD(INT5_SET, 3, 3), 786 + [F_THERMWDT_EXP] = REG_FIELD(INT5_SET, 2, 2), 787 + [F_TMP_TRNS] = REG_FIELD(INT5_SET, 1, 1), 788 + [F_CHG_TRNS] = REG_FIELD(INT5_SET, 0, 0), 789 + [F_VBUS_UCD_PORT_DET] = REG_FIELD(INT6_SET, 13, 13), 790 + [F_VBUS_UCD_UCHG_DET] = REG_FIELD(INT6_SET, 12, 12), 791 + [F_VBUS_UCD_URID_RMV] = REG_FIELD(INT6_SET, 11, 11), 792 + [F_VBUS_UCD_OTG_DET] = REG_FIELD(INT6_SET, 10, 10), 793 + [F_VBUS_UCD_URID_MOD] = REG_FIELD(INT6_SET, 8, 8), 794 + [F_VCC_UCD_PORT_DET] = REG_FIELD(INT6_SET, 5, 5), 795 + [F_VCC_UCD_UCHG_DET] = REG_FIELD(INT6_SET, 4, 4), 796 + [F_VCC_UCD_URID_RMV] = REG_FIELD(INT6_SET, 3, 3), 797 + [F_VCC_UCD_OTG_DET] = REG_FIELD(INT6_SET, 2, 2), 798 + [F_VCC_UCD_URID_MOD] = REG_FIELD(INT6_SET, 0, 0), 799 + [F_PROCHOT_DET] = REG_FIELD(INT7_SET, 15, 15), 800 + [F_PROCHOT_RES] = REG_FIELD(INT7_SET, 14, 14), 801 + [F_VACP_DET] = REG_FIELD(INT7_SET, 11, 11), 802 + [F_VACP_RES] = REG_FIELD(INT7_SET, 10, 10), 803 + [F_VACP_TH_DET] = REG_FIELD(INT7_SET, 9, 9), 804 + [F_VACP_TH_RES] = REG_FIELD(INT7_SET, 8, 8), 805 + [F_IACP_TH_DET] = REG_FIELD(INT7_SET, 7, 7), 806 + [F_IACP_THE_RES] = REG_FIELD(INT7_SET, 6, 6), 807 + [F_THERM_TH_DET] = REG_FIELD(INT7_SET, 5, 5), 808 + [F_THERM_TH_RES] = REG_FIELD(INT7_SET, 4, 4), 809 + [F_IBATM_TH_DET] = REG_FIELD(INT7_SET, 3, 3), 810 + [F_IBATM_TH_RES] = REG_FIELD(INT7_SET, 2, 2), 811 + [F_IBATP_TH_DET] = REG_FIELD(INT7_SET, 1, 1), 812 + [F_IBATP_TH_RES] = REG_FIELD(INT7_SET, 0, 0), 813 + [F_INT7_STATUS] = REG_FIELD(INT7_STATUS, 0, 15), 814 + [F_INT6_STATUS] = REG_FIELD(INT6_STATUS, 0, 13), 815 + [F_INT5_STATUS] = REG_FIELD(INT5_STATUS, 0, 13), 816 + [F_INT4_STATUS] = REG_FIELD(INT4_STATUS, 0, 9), 817 + [F_INT3_STATUS] = REG_FIELD(INT3_STATUS, 0, 15), 818 + [F_INT2_STATUS] = REG_FIELD(INT2_STATUS, 0, 15), 819 + [F_INT1_STATUS] = REG_FIELD(INT1_STATUS, 0, 15), 820 + [F_INT0_STATUS] = REG_FIELD(INT0_STATUS, 0, 7), 821 + [F_ILIM_DECREASE] = REG_FIELD(OTPREG0, 0, 15), 822 + [F_RESERVE_OTPREG1] = REG_FIELD(OTPREG1, 0, 15), 823 + [F_POWER_SAVE_MODE] = REG_FIELD(SMBREG, 0, 15), 824 + [F_DEBUG_MODE_SET] = REG_FIELD(DEBUG_MODE_SET, 0, 15), 825 + [F_DEBUG0x14] = REG_FIELD(DEBUG0x14, 0, 15), 826 + [F_DEBUG0x1A] = REG_FIELD(DEBUG0x1A, 0, 15), 827 + }; 828 + 829 + /* CHGSTM_STATEs */ 830 + #define CHGSTM_SUSPEND 0x00 831 + #define CHGSTM_TRICKLE_CHARGE 0x01 832 + #define CHGSTM_PRE_CHARGE 0x02 833 + #define CHGSTM_FAST_CHARGE 0x03 834 + #define CHGSTM_TOP_OFF 0x04 835 + #define CHGSTM_DONE 0x05 836 + #define CHGSTM_OTG 0x08 837 + #define CHGSTM_OTG_DONE 0x09 838 + #define CHGSTM_TEMPERATURE_ERROR_1 0x10 839 + #define CHGSTM_TEMPERATURE_ERROR_2 0x11 840 + #define CHGSTM_TEMPERATURE_ERROR_3 0x12 841 + #define CHGSTM_TEMPERATURE_ERROR_4 0x13 842 + #define CHGSTM_TEMPERATURE_ERROR_5 0x14 843 + #define CHGSTM_TEMPERATURE_ERROR_6 0x15 844 + #define CHGSTM_TEMPERATURE_ERROR_7 0x18 845 + #define CHGSTM_THERMAL_SHUT_DOWN_1 0x20 846 + #define CHGSTM_THERMAL_SHUT_DOWN_2 0x21 847 + #define CHGSTM_THERMAL_SHUT_DOWN_3 0x22 848 + #define CHGSTM_THERMAL_SHUT_DOWN_4 0x23 849 + #define CHGSTM_THERMAL_SHUT_DOWN_5 0x24 850 + #define CHGSTM_THERMAL_SHUT_DOWN_6 0x25 851 + #define CHGSTM_THERMAL_SHUT_DOWN_7 0x28 852 + #define CHGSTM_BATTERY_ERROR 0x40 853 + 854 + /* VBAT_VSYS_STATUS */ 855 + #define STATUS_VSYS_OV BIT(15) 856 + #define STATUS_VSYS_SSD BIT(14) 857 + #define STATUS_VSYS_SCP BIT(13) 858 + #define STATUS_VSYS_UVN BIT(12) 859 + #define STATUS_IBAT_SHORT BIT(6) 860 + #define STATUS_VBAT_OV BIT(3) 861 + #define STATUS_DEAD_BAT BIT(0) 862 + 863 + /* VBUS_VCC_STATUS */ 864 + #define STATUS_VACP_DET BIT(12) 865 + #define STATUS_VCC_OVP BIT(11) 866 + #define STATUS_ILIM_VCC_MOD BIT(10) 867 + #define STATUS_VCC_CLPS BIT(9) 868 + #define STATUS_VCC_DET BIT(8) 869 + #define STATUS_VBUS_OVP BIT(3) 870 + #define STATUS_ILIM_VBUS_MOD BIT(2) 871 + #define STATUS_VBUS_CLPS BIT(1) 872 + #define STATUS_VBUS_DET BIT(0) 873 + 874 + /* Interrupt set/status definitions */ 875 + 876 + /* INT 0 */ 877 + #define INT0_INT7_STATUS BIT(7) 878 + #define INT0_INT6_STATUS BIT(6) 879 + #define INT0_INT5_STATUS BIT(5) 880 + #define INT0_INT4_STATUS BIT(4) 881 + #define INT0_INT3_STATUS BIT(3) 882 + #define INT0_INT2_STATUS BIT(2) 883 + #define INT0_INT1_STATUS BIT(1) 884 + #define INT0_INT0_STATUS BIT(0) 885 + #define INT0_ALL 0xff 886 + 887 + /* INT 1 */ 888 + #define VBUS_RBUV_DET BIT(15) 889 + #define VBUS_RBUV_RES BIT(14) 890 + #define VBUS_TH_DET BIT(9) 891 + #define VBUS_TH_RES BIT(8) 892 + #define VBUS_IIN_MOD BIT(6) 893 + #define VBUS_OV_DET BIT(5) 894 + #define VBUS_OV_RES BIT(4) 895 + #define VBUS_CLPS_DET BIT(3) 896 + #define VBUS_CLPS BIT(2) 897 + #define VBUS_DET BIT(1) 898 + #define VBUS_RES BIT(0) 899 + #define INT1_ALL (VBUS_RBUV_DET|\ 900 + VBUS_RBUV_RES|\ 901 + VBUS_TH_DET |\ 902 + VBUS_TH_RES |\ 903 + VBUS_IIN_MOD|\ 904 + VBUS_OV_DET |\ 905 + VBUS_OV_RES |\ 906 + VBUS_CLPS_DET |\ 907 + VBUS_CLPS |\ 908 + VBUS_DET |\ 909 + VBUS_RES) 910 + 911 + /* INT 2 */ 912 + #define VCC_RBUV_DET BIT(15) 913 + #define VCC_RBUV_RES BIT(14) 914 + #define VCC_TH_DET BIT(9) 915 + #define VCC_TH_RES BIT(8) 916 + #define VCC_IIN_MOD BIT(6) 917 + #define VCC_OVP_DET BIT(5) 918 + #define VCC_OVP_RES BIT(4) 919 + #define VCC_CLPS_DET BIT(3) 920 + #define VCC_CLPS_RES BIT(2) 921 + #define VCC_DET BIT(1) 922 + #define VCC_RES BIT(0) 923 + #define INT2_ALL (VCC_RBUV_DET |\ 924 + VCC_RBUV_RES |\ 925 + VCC_TH_DET |\ 926 + VCC_TH_RES |\ 927 + VCC_IIN_MOD |\ 928 + VCC_OVP_DET |\ 929 + VCC_OVP_RES |\ 930 + VCC_CLPS_DET |\ 931 + VCC_CLPS_RES |\ 932 + VCC_DET |\ 933 + VCC_RES) 934 + /* INT 3 */ 935 + #define TH_DET BIT(15) 936 + #define TH_RMV BIT(14) 937 + #define TMP_OUT_DET BIT(11) 938 + #define TMP_OUT_RES BIT(10) 939 + #define VBAT_TH_DET BIT(9) 940 + #define VBAT_TH_RES BIT(8) 941 + #define IBAT_SHORT_DET BIT(7) 942 + #define IBAT_SHORT_RES BIT(6) 943 + #define VBAT_OV_DET BIT(5) 944 + #define VBAT_OV_RES BIT(4) 945 + #define BAT_ASSIST_DET BIT(3) 946 + #define BAT_ASSIST_RES BIT(2) 947 + #define INT3_ALL (TH_DET |\ 948 + TH_RMV |\ 949 + TMP_OUT_DET |\ 950 + TMP_OUT_RES |\ 951 + VBAT_TH_DET |\ 952 + VBAT_TH_RES |\ 953 + IBAT_SHORT_DET |\ 954 + IBAT_SHORT_RES |\ 955 + VBAT_OV_DET |\ 956 + VBAT_OV_RES |\ 957 + BAT_ASSIST_DET |\ 958 + BAT_ASSIST_RES) 959 + 960 + /* INT 4 */ 961 + #define VSYS_TH_DET BIT(9) 962 + #define VSYS_TH_RES BIT(8) 963 + #define VSYS_OV_DET BIT(5) 964 + #define VSYS_OV_RES BIT(4) 965 + #define VSYS_SHT_DET BIT(3) 966 + #define VSYS_SHT_RES BIT(2) 967 + #define VSYS_UV_DET BIT(1) 968 + #define VSYS_UV_RES BIT(0) 969 + #define INT4_ALL (VSYS_TH_DET |\ 970 + VSYS_TH_RES |\ 971 + VSYS_OV_DET |\ 972 + VSYS_OV_RES |\ 973 + VSYS_SHT_DET |\ 974 + VSYS_SHT_RES |\ 975 + VSYS_UV_DET |\ 976 + VSYS_UV_RES) 977 + 978 + /* INT 5*/ 979 + #define OTP_LOAD_DONE BIT(13) 980 + #define PWR_ON BIT(12) 981 + #define EXTIADP_TRNS BIT(11) 982 + #define EXTIADP_TH_DET BIT(9) 983 + #define EXIADP_TH_RES BIT(8) 984 + #define BAT_MNT_DET BIT(7) 985 + #define BAT_MNT_RES BIT(6) 986 + #define TSD_DET BIT(5) 987 + #define TSD_RES BIT(4) 988 + #define CHGWDT_EXP BIT(3) 989 + #define THERMWDT_EXP BIT(2) 990 + #define TMP_TRNS BIT(1) 991 + #define CHG_TRNS BIT(0) 992 + #define INT5_ALL (OTP_LOAD_DONE |\ 993 + PWR_ON |\ 994 + EXTIADP_TRNS |\ 995 + EXTIADP_TH_DET |\ 996 + EXIADP_TH_RES |\ 997 + BAT_MNT_DET |\ 998 + BAT_MNT_RES |\ 999 + TSD_DET |\ 1000 + TSD_RES |\ 1001 + CHGWDT_EXP |\ 1002 + THERMWDT_EXP |\ 1003 + TMP_TRNS |\ 1004 + CHG_TRNS) 1005 + 1006 + /* INT 6*/ 1007 + #define VBUS_UCD_PORT_DET BIT(13) 1008 + #define VBUS_UCD_UCHG_DET BIT(12) 1009 + #define VBUS_UCD_URID_RMV BIT(11) 1010 + #define VBUS_UCD_OTG_DET BIT(10) 1011 + #define VBUS_UCD_URID_MOD BIT(8) 1012 + #define VCC_UCD_PORT_DET BIT(5) 1013 + #define VCC_UCD_UCHG_DET BIT(4) 1014 + #define VCC_UCD_URID_RMV BIT(3) 1015 + #define VCC_UCD_OTG_DET BIT(2) 1016 + #define VCC_UCD_URID_MOD BIT(0) 1017 + #define INT6_ALL (VBUS_UCD_PORT_DET |\ 1018 + VBUS_UCD_UCHG_DET |\ 1019 + VBUS_UCD_URID_RMV |\ 1020 + VBUS_UCD_OTG_DET |\ 1021 + VBUS_UCD_URID_MOD |\ 1022 + VCC_UCD_PORT_DET |\ 1023 + VCC_UCD_UCHG_DET |\ 1024 + VCC_UCD_URID_RMV |\ 1025 + VCC_UCD_OTG_DET |\ 1026 + VCC_UCD_URID_MOD) 1027 + 1028 + /* INT 7 */ 1029 + #define PROCHOT_DET BIT(15) 1030 + #define PROCHOT_RES BIT(14) 1031 + #define VACP_DET BIT(11) 1032 + #define VACP_RES BIT(10) 1033 + #define VACP_TH_DET BIT(9) 1034 + #define VACP_TH_RES BIT(8) 1035 + #define IACP_TH_DET BIT(7) 1036 + #define IACP_THE_RES BIT(6) 1037 + #define THERM_TH_DET BIT(5) 1038 + #define THERM_TH_RES BIT(4) 1039 + #define IBATM_TH_DET BIT(3) 1040 + #define IBATM_TH_RES BIT(2) 1041 + #define IBATP_TH_DET BIT(1) 1042 + #define IBATP_TH_RES BIT(0) 1043 + #define INT7_ALL (PROCHOT_DET |\ 1044 + PROCHOT_RES |\ 1045 + VACP_DET |\ 1046 + VACP_RES |\ 1047 + VACP_TH_DET |\ 1048 + VACP_TH_RES |\ 1049 + IACP_TH_DET |\ 1050 + IACP_THE_RES |\ 1051 + THERM_TH_DET |\ 1052 + THERM_TH_RES |\ 1053 + IBATM_TH_DET |\ 1054 + IBATM_TH_RES |\ 1055 + IBATP_TH_DET |\ 1056 + IBATP_TH_RES) 1057 + 1058 + /* SYSTEM_CTRL_SET*/ 1059 + #define MONRST BIT(6) 1060 + #define ALMRST BIT(5) 1061 + #define CHGRST BIT(4) 1062 + #define OTPLD BIT(1) 1063 + #define ALLRST BIT(0) 1064 + 1065 + /* F_BATTEMP */ 1066 + #define ROOM 0x0 1067 + #define HOT1 0x1 1068 + #define HOT2 0x2 1069 + #define HOT3 0x3 1070 + #define COLD1 0x4 1071 + #define COLD2 0x5 1072 + #define TEMP_DIS 0x6 1073 + #define BATT_OPEN 0x7 1074 + 1075 + #endif