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

power: supply: bq25980: Add support for the BQ259xx family

Add support for the BQ25980, BQ25975 and BQ25960 family of flash
chargers.

Signed-off-by: Dan Murphy <dmurphy@ti.com>
Signed-off-by: Sebastian Reichel <sebastian.reichel@collabora.com>

authored by

Dan Murphy and committed by
Sebastian Reichel
5069185f 6d3dd362

+1504
+9
drivers/power/supply/Kconfig
··· 636 636 help 637 637 Say Y to enable support for the TI BQ25890 battery charger. 638 638 639 + config CHARGER_BQ25980 640 + tristate "TI BQ25980 battery charger driver" 641 + depends on I2C 642 + depends on GPIOLIB || COMPILE_TEST 643 + select REGMAP_I2C 644 + help 645 + Say Y to enable support for the TI BQ25980, BQ25975 and BQ25960 646 + series of fast battery chargers. 647 + 639 648 config CHARGER_SMB347 640 649 tristate "Summit Microelectronics SMB3XX Battery Charger" 641 650 depends on I2C
+1
drivers/power/supply/Makefile
··· 84 84 obj-$(CONFIG_CHARGER_BQ24735) += bq24735-charger.o 85 85 obj-$(CONFIG_CHARGER_BQ2515X) += bq2515x_charger.o 86 86 obj-$(CONFIG_CHARGER_BQ25890) += bq25890_charger.o 87 + obj-$(CONFIG_CHARGER_BQ25980) += bq25980_charger.o 87 88 obj-$(CONFIG_CHARGER_SMB347) += smb347-charger.o 88 89 obj-$(CONFIG_CHARGER_TPS65090) += tps65090-charger.o 89 90 obj-$(CONFIG_CHARGER_TPS65217) += tps65217_charger.o
+1316
drivers/power/supply/bq25980_charger.c
··· 1 + // SPDX-License-Identifier: GPL-2.0 2 + // BQ25980 Battery Charger Driver 3 + // Copyright (C) 2020 Texas Instruments Incorporated - http://www.ti.com/ 4 + 5 + #include <linux/err.h> 6 + #include <linux/i2c.h> 7 + #include <linux/init.h> 8 + #include <linux/interrupt.h> 9 + #include <linux/kernel.h> 10 + #include <linux/module.h> 11 + #include <linux/gpio/consumer.h> 12 + #include <linux/power_supply.h> 13 + #include <linux/regmap.h> 14 + #include <linux/types.h> 15 + #include <linux/delay.h> 16 + #include <linux/device.h> 17 + #include <linux/moduleparam.h> 18 + #include <linux/slab.h> 19 + 20 + #include "bq25980_charger.h" 21 + 22 + struct bq25980_state { 23 + bool dischg; 24 + bool ovp; 25 + bool ocp; 26 + bool wdt; 27 + bool tflt; 28 + bool online; 29 + bool ce; 30 + bool hiz; 31 + bool bypass; 32 + 33 + u32 vbat_adc; 34 + u32 vsys_adc; 35 + u32 ibat_adc; 36 + }; 37 + 38 + enum bq25980_id { 39 + BQ25980, 40 + BQ25975, 41 + BQ25960, 42 + }; 43 + 44 + struct bq25980_chip_info { 45 + 46 + int model_id; 47 + 48 + const struct regmap_config *regmap_config; 49 + 50 + int busocp_def; 51 + int busocp_sc_max; 52 + int busocp_byp_max; 53 + int busocp_sc_min; 54 + int busocp_byp_min; 55 + 56 + int busovp_sc_def; 57 + int busovp_byp_def; 58 + int busovp_sc_step; 59 + 60 + int busovp_sc_offset; 61 + int busovp_byp_step; 62 + int busovp_byp_offset; 63 + int busovp_sc_min; 64 + int busovp_sc_max; 65 + int busovp_byp_min; 66 + int busovp_byp_max; 67 + 68 + int batovp_def; 69 + int batovp_max; 70 + int batovp_min; 71 + int batovp_step; 72 + int batovp_offset; 73 + 74 + int batocp_def; 75 + int batocp_max; 76 + }; 77 + 78 + struct bq25980_init_data { 79 + u32 ichg; 80 + u32 bypass_ilim; 81 + u32 sc_ilim; 82 + u32 vreg; 83 + u32 iterm; 84 + u32 iprechg; 85 + u32 bypass_vlim; 86 + u32 sc_vlim; 87 + u32 ichg_max; 88 + u32 vreg_max; 89 + }; 90 + 91 + struct bq25980_device { 92 + struct i2c_client *client; 93 + struct device *dev; 94 + struct power_supply *charger; 95 + struct power_supply *battery; 96 + struct mutex lock; 97 + struct regmap *regmap; 98 + 99 + char model_name[I2C_NAME_SIZE]; 100 + 101 + struct bq25980_init_data init_data; 102 + const struct bq25980_chip_info *chip_info; 103 + struct bq25980_state state; 104 + int watchdog_timer; 105 + }; 106 + 107 + static struct reg_default bq25980_reg_defs[] = { 108 + {BQ25980_BATOVP, 0x5A}, 109 + {BQ25980_BATOVP_ALM, 0x46}, 110 + {BQ25980_BATOCP, 0x51}, 111 + {BQ25980_BATOCP_ALM, 0x50}, 112 + {BQ25980_BATUCP_ALM, 0x28}, 113 + {BQ25980_CHRGR_CTRL_1, 0x0}, 114 + {BQ25980_BUSOVP, 0x26}, 115 + {BQ25980_BUSOVP_ALM, 0x22}, 116 + {BQ25980_BUSOCP, 0xD}, 117 + {BQ25980_BUSOCP_ALM, 0xC}, 118 + {BQ25980_TEMP_CONTROL, 0x30}, 119 + {BQ25980_TDIE_ALM, 0xC8}, 120 + {BQ25980_TSBUS_FLT, 0x15}, 121 + {BQ25980_TSBAT_FLG, 0x15}, 122 + {BQ25980_VAC_CONTROL, 0x0}, 123 + {BQ25980_CHRGR_CTRL_2, 0x0}, 124 + {BQ25980_CHRGR_CTRL_3, 0x20}, 125 + {BQ25980_CHRGR_CTRL_4, 0x1D}, 126 + {BQ25980_CHRGR_CTRL_5, 0x18}, 127 + {BQ25980_STAT1, 0x0}, 128 + {BQ25980_STAT2, 0x0}, 129 + {BQ25980_STAT3, 0x0}, 130 + {BQ25980_STAT4, 0x0}, 131 + {BQ25980_STAT5, 0x0}, 132 + {BQ25980_FLAG1, 0x0}, 133 + {BQ25980_FLAG2, 0x0}, 134 + {BQ25980_FLAG3, 0x0}, 135 + {BQ25980_FLAG4, 0x0}, 136 + {BQ25980_FLAG5, 0x0}, 137 + {BQ25980_MASK1, 0x0}, 138 + {BQ25980_MASK2, 0x0}, 139 + {BQ25980_MASK3, 0x0}, 140 + {BQ25980_MASK4, 0x0}, 141 + {BQ25980_MASK5, 0x0}, 142 + {BQ25980_DEVICE_INFO, 0x8}, 143 + {BQ25980_ADC_CONTROL1, 0x0}, 144 + {BQ25980_ADC_CONTROL2, 0x0}, 145 + {BQ25980_IBUS_ADC_LSB, 0x0}, 146 + {BQ25980_IBUS_ADC_MSB, 0x0}, 147 + {BQ25980_VBUS_ADC_LSB, 0x0}, 148 + {BQ25980_VBUS_ADC_MSB, 0x0}, 149 + {BQ25980_VAC1_ADC_LSB, 0x0}, 150 + {BQ25980_VAC2_ADC_LSB, 0x0}, 151 + {BQ25980_VOUT_ADC_LSB, 0x0}, 152 + {BQ25980_VBAT_ADC_LSB, 0x0}, 153 + {BQ25980_IBAT_ADC_MSB, 0x0}, 154 + {BQ25980_IBAT_ADC_LSB, 0x0}, 155 + {BQ25980_TSBUS_ADC_LSB, 0x0}, 156 + {BQ25980_TSBAT_ADC_LSB, 0x0}, 157 + {BQ25980_TDIE_ADC_LSB, 0x0}, 158 + {BQ25980_DEGLITCH_TIME, 0x0}, 159 + {BQ25980_CHRGR_CTRL_6, 0x0}, 160 + }; 161 + 162 + static struct reg_default bq25975_reg_defs[] = { 163 + {BQ25980_BATOVP, 0x5A}, 164 + {BQ25980_BATOVP_ALM, 0x46}, 165 + {BQ25980_BATOCP, 0x51}, 166 + {BQ25980_BATOCP_ALM, 0x50}, 167 + {BQ25980_BATUCP_ALM, 0x28}, 168 + {BQ25980_CHRGR_CTRL_1, 0x0}, 169 + {BQ25980_BUSOVP, 0x26}, 170 + {BQ25980_BUSOVP_ALM, 0x22}, 171 + {BQ25980_BUSOCP, 0xD}, 172 + {BQ25980_BUSOCP_ALM, 0xC}, 173 + {BQ25980_TEMP_CONTROL, 0x30}, 174 + {BQ25980_TDIE_ALM, 0xC8}, 175 + {BQ25980_TSBUS_FLT, 0x15}, 176 + {BQ25980_TSBAT_FLG, 0x15}, 177 + {BQ25980_VAC_CONTROL, 0x0}, 178 + {BQ25980_CHRGR_CTRL_2, 0x0}, 179 + {BQ25980_CHRGR_CTRL_3, 0x20}, 180 + {BQ25980_CHRGR_CTRL_4, 0x1D}, 181 + {BQ25980_CHRGR_CTRL_5, 0x18}, 182 + {BQ25980_STAT1, 0x0}, 183 + {BQ25980_STAT2, 0x0}, 184 + {BQ25980_STAT3, 0x0}, 185 + {BQ25980_STAT4, 0x0}, 186 + {BQ25980_STAT5, 0x0}, 187 + {BQ25980_FLAG1, 0x0}, 188 + {BQ25980_FLAG2, 0x0}, 189 + {BQ25980_FLAG3, 0x0}, 190 + {BQ25980_FLAG4, 0x0}, 191 + {BQ25980_FLAG5, 0x0}, 192 + {BQ25980_MASK1, 0x0}, 193 + {BQ25980_MASK2, 0x0}, 194 + {BQ25980_MASK3, 0x0}, 195 + {BQ25980_MASK4, 0x0}, 196 + {BQ25980_MASK5, 0x0}, 197 + {BQ25980_DEVICE_INFO, 0x8}, 198 + {BQ25980_ADC_CONTROL1, 0x0}, 199 + {BQ25980_ADC_CONTROL2, 0x0}, 200 + {BQ25980_IBUS_ADC_LSB, 0x0}, 201 + {BQ25980_IBUS_ADC_MSB, 0x0}, 202 + {BQ25980_VBUS_ADC_LSB, 0x0}, 203 + {BQ25980_VBUS_ADC_MSB, 0x0}, 204 + {BQ25980_VAC1_ADC_LSB, 0x0}, 205 + {BQ25980_VAC2_ADC_LSB, 0x0}, 206 + {BQ25980_VOUT_ADC_LSB, 0x0}, 207 + {BQ25980_VBAT_ADC_LSB, 0x0}, 208 + {BQ25980_IBAT_ADC_MSB, 0x0}, 209 + {BQ25980_IBAT_ADC_LSB, 0x0}, 210 + {BQ25980_TSBUS_ADC_LSB, 0x0}, 211 + {BQ25980_TSBAT_ADC_LSB, 0x0}, 212 + {BQ25980_TDIE_ADC_LSB, 0x0}, 213 + {BQ25980_DEGLITCH_TIME, 0x0}, 214 + {BQ25980_CHRGR_CTRL_6, 0x0}, 215 + }; 216 + 217 + static struct reg_default bq25960_reg_defs[] = { 218 + {BQ25980_BATOVP, 0x5A}, 219 + {BQ25980_BATOVP_ALM, 0x46}, 220 + {BQ25980_BATOCP, 0x51}, 221 + {BQ25980_BATOCP_ALM, 0x50}, 222 + {BQ25980_BATUCP_ALM, 0x28}, 223 + {BQ25980_CHRGR_CTRL_1, 0x0}, 224 + {BQ25980_BUSOVP, 0x26}, 225 + {BQ25980_BUSOVP_ALM, 0x22}, 226 + {BQ25980_BUSOCP, 0xD}, 227 + {BQ25980_BUSOCP_ALM, 0xC}, 228 + {BQ25980_TEMP_CONTROL, 0x30}, 229 + {BQ25980_TDIE_ALM, 0xC8}, 230 + {BQ25980_TSBUS_FLT, 0x15}, 231 + {BQ25980_TSBAT_FLG, 0x15}, 232 + {BQ25980_VAC_CONTROL, 0x0}, 233 + {BQ25980_CHRGR_CTRL_2, 0x0}, 234 + {BQ25980_CHRGR_CTRL_3, 0x20}, 235 + {BQ25980_CHRGR_CTRL_4, 0x1D}, 236 + {BQ25980_CHRGR_CTRL_5, 0x18}, 237 + {BQ25980_STAT1, 0x0}, 238 + {BQ25980_STAT2, 0x0}, 239 + {BQ25980_STAT3, 0x0}, 240 + {BQ25980_STAT4, 0x0}, 241 + {BQ25980_STAT5, 0x0}, 242 + {BQ25980_FLAG1, 0x0}, 243 + {BQ25980_FLAG2, 0x0}, 244 + {BQ25980_FLAG3, 0x0}, 245 + {BQ25980_FLAG4, 0x0}, 246 + {BQ25980_FLAG5, 0x0}, 247 + {BQ25980_MASK1, 0x0}, 248 + {BQ25980_MASK2, 0x0}, 249 + {BQ25980_MASK3, 0x0}, 250 + {BQ25980_MASK4, 0x0}, 251 + {BQ25980_MASK5, 0x0}, 252 + {BQ25980_DEVICE_INFO, 0x8}, 253 + {BQ25980_ADC_CONTROL1, 0x0}, 254 + {BQ25980_ADC_CONTROL2, 0x0}, 255 + {BQ25980_IBUS_ADC_LSB, 0x0}, 256 + {BQ25980_IBUS_ADC_MSB, 0x0}, 257 + {BQ25980_VBUS_ADC_LSB, 0x0}, 258 + {BQ25980_VBUS_ADC_MSB, 0x0}, 259 + {BQ25980_VAC1_ADC_LSB, 0x0}, 260 + {BQ25980_VAC2_ADC_LSB, 0x0}, 261 + {BQ25980_VOUT_ADC_LSB, 0x0}, 262 + {BQ25980_VBAT_ADC_LSB, 0x0}, 263 + {BQ25980_IBAT_ADC_MSB, 0x0}, 264 + {BQ25980_IBAT_ADC_LSB, 0x0}, 265 + {BQ25980_TSBUS_ADC_LSB, 0x0}, 266 + {BQ25980_TSBAT_ADC_LSB, 0x0}, 267 + {BQ25980_TDIE_ADC_LSB, 0x0}, 268 + {BQ25980_DEGLITCH_TIME, 0x0}, 269 + {BQ25980_CHRGR_CTRL_6, 0x0}, 270 + }; 271 + 272 + static int bq25980_watchdog_time[BQ25980_NUM_WD_VAL] = {5000, 10000, 50000, 273 + 300000}; 274 + 275 + static int bq25980_get_input_curr_lim(struct bq25980_device *bq) 276 + { 277 + unsigned int busocp_reg_code; 278 + int ret; 279 + 280 + ret = regmap_read(bq->regmap, BQ25980_BUSOCP, &busocp_reg_code); 281 + if (ret) 282 + return ret; 283 + 284 + return (busocp_reg_code * BQ25980_BUSOCP_STEP_uA) + BQ25980_BUSOCP_OFFSET_uA; 285 + } 286 + 287 + static int bq25980_set_hiz(struct bq25980_device *bq, int setting) 288 + { 289 + return regmap_update_bits(bq->regmap, BQ25980_CHRGR_CTRL_2, 290 + BQ25980_EN_HIZ, setting); 291 + } 292 + 293 + static int bq25980_set_input_curr_lim(struct bq25980_device *bq, int busocp) 294 + { 295 + unsigned int busocp_reg_code; 296 + int ret; 297 + 298 + if (!busocp) 299 + return bq25980_set_hiz(bq, BQ25980_ENABLE_HIZ); 300 + 301 + bq25980_set_hiz(bq, BQ25980_DISABLE_HIZ); 302 + 303 + if (busocp < BQ25980_BUSOCP_MIN_uA) 304 + busocp = BQ25980_BUSOCP_MIN_uA; 305 + 306 + if (bq->state.bypass) 307 + busocp = min(busocp, bq->chip_info->busocp_sc_max); 308 + else 309 + busocp = min(busocp, bq->chip_info->busocp_byp_max); 310 + 311 + busocp_reg_code = (busocp - BQ25980_BUSOCP_OFFSET_uA) 312 + / BQ25980_BUSOCP_STEP_uA; 313 + 314 + ret = regmap_write(bq->regmap, BQ25980_BUSOCP, busocp_reg_code); 315 + if (ret) 316 + return ret; 317 + 318 + return regmap_write(bq->regmap, BQ25980_BUSOCP_ALM, busocp_reg_code); 319 + } 320 + 321 + static int bq25980_get_input_volt_lim(struct bq25980_device *bq) 322 + { 323 + unsigned int busovp_reg_code; 324 + unsigned int busovp_offset; 325 + unsigned int busovp_step; 326 + int ret; 327 + 328 + if (bq->state.bypass) { 329 + busovp_step = bq->chip_info->busovp_byp_step; 330 + busovp_offset = bq->chip_info->busovp_byp_offset; 331 + } else { 332 + busovp_step = bq->chip_info->busovp_sc_step; 333 + busovp_offset = bq->chip_info->busovp_sc_offset; 334 + } 335 + 336 + ret = regmap_read(bq->regmap, BQ25980_BUSOVP, &busovp_reg_code); 337 + if (ret) 338 + return ret; 339 + 340 + return (busovp_reg_code * busovp_step) + busovp_offset; 341 + } 342 + 343 + static int bq25980_set_input_volt_lim(struct bq25980_device *bq, int busovp) 344 + { 345 + unsigned int busovp_reg_code; 346 + unsigned int busovp_step; 347 + unsigned int busovp_offset; 348 + int ret; 349 + 350 + if (bq->state.bypass) { 351 + busovp_step = bq->chip_info->busovp_byp_step; 352 + busovp_offset = bq->chip_info->busovp_byp_offset; 353 + if (busovp > bq->chip_info->busovp_byp_max) 354 + busovp = bq->chip_info->busovp_byp_max; 355 + else if (busovp < bq->chip_info->busovp_byp_min) 356 + busovp = bq->chip_info->busovp_byp_min; 357 + } else { 358 + busovp_step = bq->chip_info->busovp_sc_step; 359 + busovp_offset = bq->chip_info->busovp_sc_offset; 360 + if (busovp > bq->chip_info->busovp_sc_max) 361 + busovp = bq->chip_info->busovp_sc_max; 362 + else if (busovp < bq->chip_info->busovp_sc_min) 363 + busovp = bq->chip_info->busovp_sc_min; 364 + } 365 + 366 + busovp_reg_code = (busovp - busovp_offset) / busovp_step; 367 + 368 + ret = regmap_write(bq->regmap, BQ25980_BUSOVP, busovp_reg_code); 369 + if (ret) 370 + return ret; 371 + 372 + return regmap_write(bq->regmap, BQ25980_BUSOVP_ALM, busovp_reg_code); 373 + } 374 + 375 + static int bq25980_get_const_charge_curr(struct bq25980_device *bq) 376 + { 377 + unsigned int batocp_reg_code; 378 + int ret; 379 + 380 + ret = regmap_read(bq->regmap, BQ25980_BATOCP, &batocp_reg_code); 381 + if (ret) 382 + return ret; 383 + 384 + return (batocp_reg_code & BQ25980_BATOCP_MASK) * 385 + BQ25980_BATOCP_STEP_uA; 386 + } 387 + 388 + static int bq25980_set_const_charge_curr(struct bq25980_device *bq, int batocp) 389 + { 390 + unsigned int batocp_reg_code; 391 + int ret; 392 + 393 + batocp = max(batocp, BQ25980_BATOCP_MIN_uA); 394 + batocp = min(batocp, bq->chip_info->batocp_max); 395 + 396 + batocp_reg_code = batocp / BQ25980_BATOCP_STEP_uA; 397 + 398 + ret = regmap_update_bits(bq->regmap, BQ25980_BATOCP, 399 + BQ25980_BATOCP_MASK, batocp_reg_code); 400 + if (ret) 401 + return ret; 402 + 403 + return regmap_update_bits(bq->regmap, BQ25980_BATOCP_ALM, 404 + BQ25980_BATOCP_MASK, batocp_reg_code); 405 + } 406 + 407 + static int bq25980_get_const_charge_volt(struct bq25980_device *bq) 408 + { 409 + unsigned int batovp_reg_code; 410 + int ret; 411 + 412 + ret = regmap_read(bq->regmap, BQ25980_BATOVP, &batovp_reg_code); 413 + if (ret) 414 + return ret; 415 + 416 + return ((batovp_reg_code * bq->chip_info->batovp_step) + 417 + bq->chip_info->batovp_offset); 418 + } 419 + 420 + static int bq25980_set_const_charge_volt(struct bq25980_device *bq, int batovp) 421 + { 422 + unsigned int batovp_reg_code; 423 + int ret; 424 + 425 + if (batovp < bq->chip_info->batovp_min) 426 + batovp = bq->chip_info->batovp_min; 427 + 428 + if (batovp > bq->chip_info->batovp_max) 429 + batovp = bq->chip_info->batovp_max; 430 + 431 + batovp_reg_code = (batovp - bq->chip_info->batovp_offset) / 432 + bq->chip_info->batovp_step; 433 + 434 + ret = regmap_write(bq->regmap, BQ25980_BATOVP, batovp_reg_code); 435 + if (ret) 436 + return ret; 437 + 438 + return regmap_write(bq->regmap, BQ25980_BATOVP_ALM, batovp_reg_code); 439 + } 440 + 441 + static int bq25980_set_bypass(struct bq25980_device *bq, bool en_bypass) 442 + { 443 + int ret; 444 + 445 + if (en_bypass) 446 + ret = regmap_update_bits(bq->regmap, BQ25980_CHRGR_CTRL_2, 447 + BQ25980_EN_BYPASS, BQ25980_EN_BYPASS); 448 + else 449 + ret = regmap_update_bits(bq->regmap, BQ25980_CHRGR_CTRL_2, 450 + BQ25980_EN_BYPASS, en_bypass); 451 + if (ret) 452 + return ret; 453 + 454 + bq->state.bypass = en_bypass; 455 + 456 + return bq->state.bypass; 457 + } 458 + 459 + static int bq25980_set_chg_en(struct bq25980_device *bq, bool en_chg) 460 + { 461 + int ret; 462 + 463 + if (en_chg) 464 + ret = regmap_update_bits(bq->regmap, BQ25980_CHRGR_CTRL_2, 465 + BQ25980_CHG_EN, BQ25980_CHG_EN); 466 + else 467 + ret = regmap_update_bits(bq->regmap, BQ25980_CHRGR_CTRL_2, 468 + BQ25980_CHG_EN, en_chg); 469 + if (ret) 470 + return ret; 471 + 472 + bq->state.ce = en_chg; 473 + 474 + return 0; 475 + } 476 + 477 + static int bq25980_get_adc_ibus(struct bq25980_device *bq) 478 + { 479 + int ibus_adc_lsb, ibus_adc_msb; 480 + u16 ibus_adc; 481 + int ret; 482 + 483 + ret = regmap_read(bq->regmap, BQ25980_IBUS_ADC_MSB, &ibus_adc_msb); 484 + if (ret) 485 + return ret; 486 + 487 + ret = regmap_read(bq->regmap, BQ25980_IBUS_ADC_LSB, &ibus_adc_lsb); 488 + if (ret) 489 + return ret; 490 + 491 + ibus_adc = (ibus_adc_msb << 8) | ibus_adc_lsb; 492 + 493 + if (ibus_adc_msb & BQ25980_ADC_POLARITY_BIT) 494 + return ((ibus_adc ^ 0xffff) + 1) * BQ25980_ADC_CURR_STEP_uA; 495 + 496 + return ibus_adc * BQ25980_ADC_CURR_STEP_uA; 497 + } 498 + 499 + static int bq25980_get_adc_vbus(struct bq25980_device *bq) 500 + { 501 + int vbus_adc_lsb, vbus_adc_msb; 502 + u16 vbus_adc; 503 + int ret; 504 + 505 + ret = regmap_read(bq->regmap, BQ25980_VBUS_ADC_MSB, &vbus_adc_msb); 506 + if (ret) 507 + return ret; 508 + 509 + ret = regmap_read(bq->regmap, BQ25980_VBUS_ADC_LSB, &vbus_adc_lsb); 510 + if (ret) 511 + return ret; 512 + 513 + vbus_adc = (vbus_adc_msb << 8) | vbus_adc_lsb; 514 + 515 + return vbus_adc * BQ25980_ADC_VOLT_STEP_uV; 516 + } 517 + 518 + static int bq25980_get_ibat_adc(struct bq25980_device *bq) 519 + { 520 + int ret; 521 + int ibat_adc_lsb, ibat_adc_msb; 522 + int ibat_adc; 523 + 524 + ret = regmap_read(bq->regmap, BQ25980_IBAT_ADC_MSB, &ibat_adc_msb); 525 + if (ret) 526 + return ret; 527 + 528 + ret = regmap_read(bq->regmap, BQ25980_IBAT_ADC_LSB, &ibat_adc_lsb); 529 + if (ret) 530 + return ret; 531 + 532 + ibat_adc = (ibat_adc_msb << 8) | ibat_adc_lsb; 533 + 534 + if (ibat_adc_msb & BQ25980_ADC_POLARITY_BIT) 535 + return ((ibat_adc ^ 0xffff) + 1) * BQ25980_ADC_CURR_STEP_uA; 536 + 537 + return ibat_adc * BQ25980_ADC_CURR_STEP_uA; 538 + } 539 + 540 + static int bq25980_get_adc_vbat(struct bq25980_device *bq) 541 + { 542 + int vsys_adc_lsb, vsys_adc_msb; 543 + u16 vsys_adc; 544 + int ret; 545 + 546 + ret = regmap_read(bq->regmap, BQ25980_VBAT_ADC_MSB, &vsys_adc_msb); 547 + if (ret) 548 + return ret; 549 + 550 + ret = regmap_read(bq->regmap, BQ25980_VBAT_ADC_LSB, &vsys_adc_lsb); 551 + if (ret) 552 + return ret; 553 + 554 + vsys_adc = (vsys_adc_msb << 8) | vsys_adc_lsb; 555 + 556 + return vsys_adc * BQ25980_ADC_VOLT_STEP_uV; 557 + } 558 + 559 + static int bq25980_get_state(struct bq25980_device *bq, 560 + struct bq25980_state *state) 561 + { 562 + unsigned int chg_ctrl_2; 563 + unsigned int stat1; 564 + unsigned int stat2; 565 + unsigned int stat3; 566 + unsigned int stat4; 567 + unsigned int ibat_adc_msb; 568 + int ret; 569 + 570 + ret = regmap_read(bq->regmap, BQ25980_STAT1, &stat1); 571 + if (ret) 572 + return ret; 573 + 574 + ret = regmap_read(bq->regmap, BQ25980_STAT2, &stat2); 575 + if (ret) 576 + return ret; 577 + 578 + ret = regmap_read(bq->regmap, BQ25980_STAT3, &stat3); 579 + if (ret) 580 + return ret; 581 + 582 + ret = regmap_read(bq->regmap, BQ25980_STAT4, &stat4); 583 + if (ret) 584 + return ret; 585 + 586 + ret = regmap_read(bq->regmap, BQ25980_CHRGR_CTRL_2, &chg_ctrl_2); 587 + if (ret) 588 + return ret; 589 + 590 + ret = regmap_read(bq->regmap, BQ25980_IBAT_ADC_MSB, &ibat_adc_msb); 591 + if (ret) 592 + return ret; 593 + 594 + state->dischg = ibat_adc_msb & BQ25980_ADC_POLARITY_BIT; 595 + state->ovp = (stat1 & BQ25980_STAT1_OVP_MASK) | 596 + (stat3 & BQ25980_STAT3_OVP_MASK); 597 + state->ocp = (stat1 & BQ25980_STAT1_OCP_MASK) | 598 + (stat2 & BQ25980_STAT2_OCP_MASK); 599 + state->tflt = stat4 & BQ25980_STAT4_TFLT_MASK; 600 + state->wdt = stat4 & BQ25980_WD_STAT; 601 + state->online = stat3 & BQ25980_PRESENT_MASK; 602 + state->ce = chg_ctrl_2 & BQ25980_CHG_EN; 603 + state->hiz = chg_ctrl_2 & BQ25980_EN_HIZ; 604 + state->bypass = chg_ctrl_2 & BQ25980_EN_BYPASS; 605 + 606 + return 0; 607 + } 608 + 609 + static int bq25980_set_battery_property(struct power_supply *psy, 610 + enum power_supply_property psp, 611 + const union power_supply_propval *val) 612 + { 613 + struct bq25980_device *bq = power_supply_get_drvdata(psy); 614 + int ret = 0; 615 + 616 + if (ret) 617 + return ret; 618 + 619 + switch (psp) { 620 + case POWER_SUPPLY_PROP_CONSTANT_CHARGE_CURRENT: 621 + ret = bq25980_set_const_charge_curr(bq, val->intval); 622 + if (ret) 623 + return ret; 624 + break; 625 + 626 + case POWER_SUPPLY_PROP_CONSTANT_CHARGE_VOLTAGE: 627 + ret = bq25980_set_const_charge_volt(bq, val->intval); 628 + if (ret) 629 + return ret; 630 + break; 631 + 632 + default: 633 + return -EINVAL; 634 + } 635 + 636 + return ret; 637 + } 638 + 639 + static int bq25980_get_battery_property(struct power_supply *psy, 640 + enum power_supply_property psp, 641 + union power_supply_propval *val) 642 + { 643 + struct bq25980_device *bq = power_supply_get_drvdata(psy); 644 + int ret = 0; 645 + 646 + switch (psp) { 647 + case POWER_SUPPLY_PROP_CONSTANT_CHARGE_CURRENT_MAX: 648 + val->intval = bq->init_data.ichg_max; 649 + break; 650 + 651 + case POWER_SUPPLY_PROP_CONSTANT_CHARGE_VOLTAGE_MAX: 652 + val->intval = bq->init_data.vreg_max; 653 + break; 654 + 655 + case POWER_SUPPLY_PROP_CURRENT_NOW: 656 + ret = bq25980_get_ibat_adc(bq); 657 + val->intval = ret; 658 + break; 659 + 660 + case POWER_SUPPLY_PROP_VOLTAGE_NOW: 661 + ret = bq25980_get_adc_vbat(bq); 662 + if (ret < 0) 663 + return ret; 664 + 665 + val->intval = ret; 666 + break; 667 + 668 + default: 669 + return -EINVAL; 670 + } 671 + 672 + return ret; 673 + } 674 + 675 + static int bq25980_set_charger_property(struct power_supply *psy, 676 + enum power_supply_property prop, 677 + const union power_supply_propval *val) 678 + { 679 + struct bq25980_device *bq = power_supply_get_drvdata(psy); 680 + int ret = -EINVAL; 681 + 682 + switch (prop) { 683 + case POWER_SUPPLY_PROP_INPUT_CURRENT_LIMIT: 684 + ret = bq25980_set_input_curr_lim(bq, val->intval); 685 + if (ret) 686 + return ret; 687 + break; 688 + 689 + case POWER_SUPPLY_PROP_INPUT_VOLTAGE_LIMIT: 690 + ret = bq25980_set_input_volt_lim(bq, val->intval); 691 + if (ret) 692 + return ret; 693 + break; 694 + 695 + case POWER_SUPPLY_PROP_CHARGE_TYPE: 696 + ret = bq25980_set_bypass(bq, val->intval); 697 + if (ret) 698 + return ret; 699 + break; 700 + 701 + case POWER_SUPPLY_PROP_STATUS: 702 + ret = bq25980_set_chg_en(bq, val->intval); 703 + if (ret) 704 + return ret; 705 + break; 706 + 707 + default: 708 + return -EINVAL; 709 + } 710 + 711 + return ret; 712 + } 713 + 714 + static int bq25980_get_charger_property(struct power_supply *psy, 715 + enum power_supply_property psp, 716 + union power_supply_propval *val) 717 + { 718 + struct bq25980_device *bq = power_supply_get_drvdata(psy); 719 + struct bq25980_state state; 720 + int ret = 0; 721 + 722 + mutex_lock(&bq->lock); 723 + ret = bq25980_get_state(bq, &state); 724 + mutex_unlock(&bq->lock); 725 + if (ret) 726 + return ret; 727 + 728 + switch (psp) { 729 + case POWER_SUPPLY_PROP_MANUFACTURER: 730 + val->strval = BQ25980_MANUFACTURER; 731 + break; 732 + case POWER_SUPPLY_PROP_MODEL_NAME: 733 + val->strval = bq->model_name; 734 + break; 735 + case POWER_SUPPLY_PROP_ONLINE: 736 + val->intval = state.online; 737 + break; 738 + 739 + case POWER_SUPPLY_PROP_INPUT_VOLTAGE_LIMIT: 740 + ret = bq25980_get_input_volt_lim(bq); 741 + if (ret < 0) 742 + return ret; 743 + val->intval = ret; 744 + break; 745 + 746 + case POWER_SUPPLY_PROP_INPUT_CURRENT_LIMIT: 747 + ret = bq25980_get_input_curr_lim(bq); 748 + if (ret < 0) 749 + return ret; 750 + 751 + val->intval = ret; 752 + break; 753 + 754 + case POWER_SUPPLY_PROP_HEALTH: 755 + val->intval = POWER_SUPPLY_HEALTH_GOOD; 756 + 757 + if (state.tflt) 758 + val->intval = POWER_SUPPLY_HEALTH_OVERHEAT; 759 + else if (state.ovp) 760 + val->intval = POWER_SUPPLY_HEALTH_OVERVOLTAGE; 761 + else if (state.ocp) 762 + val->intval = POWER_SUPPLY_HEALTH_OVERCURRENT; 763 + else if (state.wdt) 764 + val->intval = 765 + POWER_SUPPLY_HEALTH_WATCHDOG_TIMER_EXPIRE; 766 + break; 767 + 768 + case POWER_SUPPLY_PROP_STATUS: 769 + val->intval = POWER_SUPPLY_STATUS_UNKNOWN; 770 + 771 + if ((state.ce) && (!state.hiz)) 772 + val->intval = POWER_SUPPLY_STATUS_CHARGING; 773 + else if (state.dischg) 774 + val->intval = POWER_SUPPLY_STATUS_DISCHARGING; 775 + else if (!state.ce) 776 + val->intval = POWER_SUPPLY_STATUS_NOT_CHARGING; 777 + break; 778 + 779 + case POWER_SUPPLY_PROP_CHARGE_TYPE: 780 + val->intval = POWER_SUPPLY_CHARGE_TYPE_UNKNOWN; 781 + 782 + if (!state.ce) 783 + val->intval = POWER_SUPPLY_CHARGE_TYPE_NONE; 784 + else if (state.bypass) 785 + val->intval = POWER_SUPPLY_CHARGE_TYPE_FAST; 786 + else if (!state.bypass) 787 + val->intval = POWER_SUPPLY_CHARGE_TYPE_STANDARD; 788 + break; 789 + 790 + case POWER_SUPPLY_PROP_CURRENT_NOW: 791 + ret = bq25980_get_adc_ibus(bq); 792 + if (ret < 0) 793 + return ret; 794 + 795 + val->intval = ret; 796 + break; 797 + 798 + case POWER_SUPPLY_PROP_VOLTAGE_NOW: 799 + ret = bq25980_get_adc_vbus(bq); 800 + if (ret < 0) 801 + return ret; 802 + 803 + val->intval = ret; 804 + break; 805 + 806 + case POWER_SUPPLY_PROP_CONSTANT_CHARGE_CURRENT: 807 + ret = bq25980_get_const_charge_curr(bq); 808 + if (ret < 0) 809 + return ret; 810 + 811 + val->intval = ret; 812 + break; 813 + 814 + case POWER_SUPPLY_PROP_CONSTANT_CHARGE_VOLTAGE: 815 + ret = bq25980_get_const_charge_volt(bq); 816 + if (ret < 0) 817 + return ret; 818 + 819 + val->intval = ret; 820 + break; 821 + 822 + default: 823 + return -EINVAL; 824 + } 825 + 826 + return ret; 827 + } 828 + 829 + static bool bq25980_state_changed(struct bq25980_device *bq, 830 + struct bq25980_state *new_state) 831 + { 832 + struct bq25980_state old_state; 833 + 834 + mutex_lock(&bq->lock); 835 + old_state = bq->state; 836 + mutex_unlock(&bq->lock); 837 + 838 + return (old_state.dischg != new_state->dischg || 839 + old_state.ovp != new_state->ovp || 840 + old_state.ocp != new_state->ocp || 841 + old_state.online != new_state->online || 842 + old_state.wdt != new_state->wdt || 843 + old_state.tflt != new_state->tflt || 844 + old_state.ce != new_state->ce || 845 + old_state.hiz != new_state->hiz || 846 + old_state.bypass != new_state->bypass); 847 + } 848 + 849 + static irqreturn_t bq25980_irq_handler_thread(int irq, void *private) 850 + { 851 + struct bq25980_device *bq = private; 852 + struct bq25980_state state; 853 + int ret; 854 + 855 + ret = bq25980_get_state(bq, &state); 856 + if (ret < 0) 857 + goto irq_out; 858 + 859 + if (!bq25980_state_changed(bq, &state)) 860 + goto irq_out; 861 + 862 + mutex_lock(&bq->lock); 863 + bq->state = state; 864 + mutex_unlock(&bq->lock); 865 + 866 + power_supply_changed(bq->charger); 867 + 868 + irq_out: 869 + return IRQ_HANDLED; 870 + } 871 + 872 + static enum power_supply_property bq25980_power_supply_props[] = { 873 + POWER_SUPPLY_PROP_MANUFACTURER, 874 + POWER_SUPPLY_PROP_MODEL_NAME, 875 + POWER_SUPPLY_PROP_STATUS, 876 + POWER_SUPPLY_PROP_ONLINE, 877 + POWER_SUPPLY_PROP_HEALTH, 878 + POWER_SUPPLY_PROP_INPUT_VOLTAGE_LIMIT, 879 + POWER_SUPPLY_PROP_INPUT_CURRENT_LIMIT, 880 + POWER_SUPPLY_PROP_CHARGE_TYPE, 881 + POWER_SUPPLY_PROP_CONSTANT_CHARGE_CURRENT, 882 + POWER_SUPPLY_PROP_CONSTANT_CHARGE_VOLTAGE, 883 + POWER_SUPPLY_PROP_CURRENT_NOW, 884 + POWER_SUPPLY_PROP_VOLTAGE_NOW, 885 + }; 886 + 887 + static enum power_supply_property bq25980_battery_props[] = { 888 + POWER_SUPPLY_PROP_CONSTANT_CHARGE_CURRENT_MAX, 889 + POWER_SUPPLY_PROP_CONSTANT_CHARGE_VOLTAGE_MAX, 890 + POWER_SUPPLY_PROP_CURRENT_NOW, 891 + POWER_SUPPLY_PROP_VOLTAGE_NOW, 892 + }; 893 + 894 + static char *bq25980_charger_supplied_to[] = { 895 + "main-battery", 896 + }; 897 + 898 + static int bq25980_property_is_writeable(struct power_supply *psy, 899 + enum power_supply_property prop) 900 + { 901 + switch (prop) { 902 + case POWER_SUPPLY_PROP_INPUT_CURRENT_LIMIT: 903 + case POWER_SUPPLY_PROP_CONSTANT_CHARGE_VOLTAGE: 904 + case POWER_SUPPLY_PROP_CONSTANT_CHARGE_CURRENT: 905 + case POWER_SUPPLY_PROP_CHARGE_TYPE: 906 + case POWER_SUPPLY_PROP_STATUS: 907 + case POWER_SUPPLY_PROP_INPUT_VOLTAGE_LIMIT: 908 + return true; 909 + default: 910 + return false; 911 + } 912 + } 913 + 914 + static const struct power_supply_desc bq25980_power_supply_desc = { 915 + .name = "bq25980-charger", 916 + .type = POWER_SUPPLY_TYPE_MAINS, 917 + .properties = bq25980_power_supply_props, 918 + .num_properties = ARRAY_SIZE(bq25980_power_supply_props), 919 + .get_property = bq25980_get_charger_property, 920 + .set_property = bq25980_set_charger_property, 921 + .property_is_writeable = bq25980_property_is_writeable, 922 + }; 923 + 924 + static struct power_supply_desc bq25980_battery_desc = { 925 + .name = "bq25980-battery", 926 + .type = POWER_SUPPLY_TYPE_BATTERY, 927 + .get_property = bq25980_get_battery_property, 928 + .set_property = bq25980_set_battery_property, 929 + .properties = bq25980_battery_props, 930 + .num_properties = ARRAY_SIZE(bq25980_battery_props), 931 + .property_is_writeable = bq25980_property_is_writeable, 932 + }; 933 + 934 + 935 + static bool bq25980_is_volatile_reg(struct device *dev, unsigned int reg) 936 + { 937 + switch (reg) { 938 + case BQ25980_CHRGR_CTRL_2: 939 + case BQ25980_STAT1...BQ25980_FLAG5: 940 + case BQ25980_ADC_CONTROL1...BQ25980_TDIE_ADC_LSB: 941 + return true; 942 + default: 943 + return false; 944 + } 945 + } 946 + 947 + static const struct regmap_config bq25980_regmap_config = { 948 + .reg_bits = 8, 949 + .val_bits = 8, 950 + 951 + .max_register = BQ25980_CHRGR_CTRL_6, 952 + .reg_defaults = bq25980_reg_defs, 953 + .num_reg_defaults = ARRAY_SIZE(bq25980_reg_defs), 954 + .cache_type = REGCACHE_RBTREE, 955 + .volatile_reg = bq25980_is_volatile_reg, 956 + }; 957 + 958 + static const struct regmap_config bq25975_regmap_config = { 959 + .reg_bits = 8, 960 + .val_bits = 8, 961 + 962 + .max_register = BQ25980_CHRGR_CTRL_6, 963 + .reg_defaults = bq25975_reg_defs, 964 + .num_reg_defaults = ARRAY_SIZE(bq25975_reg_defs), 965 + .cache_type = REGCACHE_RBTREE, 966 + .volatile_reg = bq25980_is_volatile_reg, 967 + }; 968 + 969 + static const struct regmap_config bq25960_regmap_config = { 970 + .reg_bits = 8, 971 + .val_bits = 8, 972 + 973 + .max_register = BQ25980_CHRGR_CTRL_6, 974 + .reg_defaults = bq25960_reg_defs, 975 + .num_reg_defaults = ARRAY_SIZE(bq25960_reg_defs), 976 + .cache_type = REGCACHE_RBTREE, 977 + .volatile_reg = bq25980_is_volatile_reg, 978 + }; 979 + 980 + static const struct bq25980_chip_info bq25980_chip_info_tbl[] = { 981 + [BQ25980] = { 982 + .model_id = BQ25980, 983 + .regmap_config = &bq25980_regmap_config, 984 + 985 + .busocp_def = BQ25980_BUSOCP_DFLT_uA, 986 + .busocp_sc_min = BQ25960_BUSOCP_SC_MAX_uA, 987 + .busocp_sc_max = BQ25980_BUSOCP_SC_MAX_uA, 988 + .busocp_byp_max = BQ25980_BUSOCP_BYP_MAX_uA, 989 + .busocp_byp_min = BQ25980_BUSOCP_MIN_uA, 990 + 991 + .busovp_sc_def = BQ25980_BUSOVP_DFLT_uV, 992 + .busovp_byp_def = BQ25980_BUSOVP_BYPASS_DFLT_uV, 993 + .busovp_sc_step = BQ25980_BUSOVP_SC_STEP_uV, 994 + .busovp_sc_offset = BQ25980_BUSOVP_SC_OFFSET_uV, 995 + .busovp_byp_step = BQ25980_BUSOVP_BYP_STEP_uV, 996 + .busovp_byp_offset = BQ25980_BUSOVP_BYP_OFFSET_uV, 997 + .busovp_sc_min = BQ25980_BUSOVP_SC_MIN_uV, 998 + .busovp_sc_max = BQ25980_BUSOVP_SC_MAX_uV, 999 + .busovp_byp_min = BQ25980_BUSOVP_BYP_MIN_uV, 1000 + .busovp_byp_max = BQ25980_BUSOVP_BYP_MAX_uV, 1001 + 1002 + .batovp_def = BQ25980_BATOVP_DFLT_uV, 1003 + .batovp_max = BQ25980_BATOVP_MAX_uV, 1004 + .batovp_min = BQ25980_BATOVP_MIN_uV, 1005 + .batovp_step = BQ25980_BATOVP_STEP_uV, 1006 + .batovp_offset = BQ25980_BATOVP_OFFSET_uV, 1007 + 1008 + .batocp_def = BQ25980_BATOCP_DFLT_uA, 1009 + .batocp_max = BQ25980_BATOCP_MAX_uA, 1010 + }, 1011 + 1012 + [BQ25975] = { 1013 + .model_id = BQ25975, 1014 + .regmap_config = &bq25975_regmap_config, 1015 + 1016 + .busocp_def = BQ25975_BUSOCP_DFLT_uA, 1017 + .busocp_sc_min = BQ25975_BUSOCP_SC_MAX_uA, 1018 + .busocp_sc_max = BQ25975_BUSOCP_SC_MAX_uA, 1019 + .busocp_byp_min = BQ25980_BUSOCP_MIN_uA, 1020 + .busocp_byp_max = BQ25975_BUSOCP_BYP_MAX_uA, 1021 + 1022 + .busovp_sc_def = BQ25975_BUSOVP_DFLT_uV, 1023 + .busovp_byp_def = BQ25975_BUSOVP_BYPASS_DFLT_uV, 1024 + .busovp_sc_step = BQ25975_BUSOVP_SC_STEP_uV, 1025 + .busovp_sc_offset = BQ25975_BUSOVP_SC_OFFSET_uV, 1026 + .busovp_byp_step = BQ25975_BUSOVP_BYP_STEP_uV, 1027 + .busovp_byp_offset = BQ25975_BUSOVP_BYP_OFFSET_uV, 1028 + .busovp_sc_min = BQ25975_BUSOVP_SC_MIN_uV, 1029 + .busovp_sc_max = BQ25975_BUSOVP_SC_MAX_uV, 1030 + .busovp_byp_min = BQ25975_BUSOVP_BYP_MIN_uV, 1031 + .busovp_byp_max = BQ25975_BUSOVP_BYP_MAX_uV, 1032 + 1033 + .batovp_def = BQ25975_BATOVP_DFLT_uV, 1034 + .batovp_max = BQ25975_BATOVP_MAX_uV, 1035 + .batovp_min = BQ25975_BATOVP_MIN_uV, 1036 + .batovp_step = BQ25975_BATOVP_STEP_uV, 1037 + .batovp_offset = BQ25975_BATOVP_OFFSET_uV, 1038 + 1039 + .batocp_def = BQ25980_BATOCP_DFLT_uA, 1040 + .batocp_max = BQ25980_BATOCP_MAX_uA, 1041 + }, 1042 + 1043 + [BQ25960] = { 1044 + .model_id = BQ25960, 1045 + .regmap_config = &bq25960_regmap_config, 1046 + 1047 + .busocp_def = BQ25960_BUSOCP_DFLT_uA, 1048 + .busocp_sc_min = BQ25960_BUSOCP_SC_MAX_uA, 1049 + .busocp_sc_max = BQ25960_BUSOCP_SC_MAX_uA, 1050 + .busocp_byp_min = BQ25960_BUSOCP_SC_MAX_uA, 1051 + .busocp_byp_max = BQ25960_BUSOCP_BYP_MAX_uA, 1052 + 1053 + .busovp_sc_def = BQ25975_BUSOVP_DFLT_uV, 1054 + .busovp_byp_def = BQ25975_BUSOVP_BYPASS_DFLT_uV, 1055 + .busovp_sc_step = BQ25960_BUSOVP_SC_STEP_uV, 1056 + .busovp_sc_offset = BQ25960_BUSOVP_SC_OFFSET_uV, 1057 + .busovp_byp_step = BQ25960_BUSOVP_BYP_STEP_uV, 1058 + .busovp_byp_offset = BQ25960_BUSOVP_BYP_OFFSET_uV, 1059 + .busovp_sc_min = BQ25960_BUSOVP_SC_MIN_uV, 1060 + .busovp_sc_max = BQ25960_BUSOVP_SC_MAX_uV, 1061 + .busovp_byp_min = BQ25960_BUSOVP_BYP_MIN_uV, 1062 + .busovp_byp_max = BQ25960_BUSOVP_BYP_MAX_uV, 1063 + 1064 + .batovp_def = BQ25960_BATOVP_DFLT_uV, 1065 + .batovp_max = BQ25960_BATOVP_MAX_uV, 1066 + .batovp_min = BQ25960_BATOVP_MIN_uV, 1067 + .batovp_step = BQ25960_BATOVP_STEP_uV, 1068 + .batovp_offset = BQ25960_BATOVP_OFFSET_uV, 1069 + 1070 + .batocp_def = BQ25960_BATOCP_DFLT_uA, 1071 + .batocp_max = BQ25960_BATOCP_MAX_uA, 1072 + }, 1073 + }; 1074 + 1075 + static int bq25980_power_supply_init(struct bq25980_device *bq, 1076 + struct device *dev) 1077 + { 1078 + struct power_supply_config psy_cfg = { .drv_data = bq, 1079 + .of_node = dev->of_node, }; 1080 + 1081 + psy_cfg.supplied_to = bq25980_charger_supplied_to; 1082 + psy_cfg.num_supplicants = ARRAY_SIZE(bq25980_charger_supplied_to); 1083 + 1084 + bq->charger = devm_power_supply_register(bq->dev, 1085 + &bq25980_power_supply_desc, 1086 + &psy_cfg); 1087 + if (IS_ERR(bq->charger)) 1088 + return -EINVAL; 1089 + 1090 + bq->battery = devm_power_supply_register(bq->dev, 1091 + &bq25980_battery_desc, 1092 + &psy_cfg); 1093 + if (IS_ERR(bq->battery)) 1094 + return -EINVAL; 1095 + 1096 + return 0; 1097 + } 1098 + 1099 + static int bq25980_hw_init(struct bq25980_device *bq) 1100 + { 1101 + struct power_supply_battery_info bat_info = { }; 1102 + int wd_reg_val; 1103 + int ret = 0; 1104 + int curr_val; 1105 + int volt_val; 1106 + int i; 1107 + 1108 + if (!bq->watchdog_timer) { 1109 + ret = regmap_update_bits(bq->regmap, BQ25980_CHRGR_CTRL_3, 1110 + BQ25980_WATCHDOG_DIS, 1111 + BQ25980_WATCHDOG_DIS); 1112 + } else { 1113 + for (i = 0; i < BQ25980_NUM_WD_VAL; i++) { 1114 + if (bq->watchdog_timer > bq25980_watchdog_time[i] && 1115 + bq->watchdog_timer < bq25980_watchdog_time[i + 1]) { 1116 + wd_reg_val = i; 1117 + break; 1118 + } 1119 + } 1120 + 1121 + ret = regmap_update_bits(bq->regmap, BQ25980_CHRGR_CTRL_3, 1122 + BQ25980_WATCHDOG_MASK, wd_reg_val); 1123 + } 1124 + if (ret) 1125 + return ret; 1126 + 1127 + ret = power_supply_get_battery_info(bq->charger, &bat_info); 1128 + if (ret) { 1129 + dev_warn(bq->dev, "battery info missing\n"); 1130 + return -EINVAL; 1131 + } 1132 + 1133 + bq->init_data.ichg_max = bat_info.constant_charge_current_max_ua; 1134 + bq->init_data.vreg_max = bat_info.constant_charge_voltage_max_uv; 1135 + 1136 + if (bq->state.bypass) { 1137 + ret = regmap_update_bits(bq->regmap, BQ25980_CHRGR_CTRL_2, 1138 + BQ25980_EN_BYPASS, BQ25980_EN_BYPASS); 1139 + if (ret) 1140 + return ret; 1141 + 1142 + curr_val = bq->init_data.bypass_ilim; 1143 + volt_val = bq->init_data.bypass_vlim; 1144 + } else { 1145 + curr_val = bq->init_data.sc_ilim; 1146 + volt_val = bq->init_data.sc_vlim; 1147 + } 1148 + 1149 + ret = bq25980_set_input_curr_lim(bq, curr_val); 1150 + if (ret) 1151 + return ret; 1152 + 1153 + ret = bq25980_set_input_volt_lim(bq, volt_val); 1154 + if (ret) 1155 + return ret; 1156 + 1157 + return regmap_update_bits(bq->regmap, BQ25980_ADC_CONTROL1, 1158 + BQ25980_ADC_EN, BQ25980_ADC_EN); 1159 + } 1160 + 1161 + static int bq25980_parse_dt(struct bq25980_device *bq) 1162 + { 1163 + int ret; 1164 + 1165 + ret = device_property_read_u32(bq->dev, "ti,watchdog-timeout-ms", 1166 + &bq->watchdog_timer); 1167 + if (ret) 1168 + bq->watchdog_timer = BQ25980_WATCHDOG_MIN; 1169 + 1170 + if (bq->watchdog_timer > BQ25980_WATCHDOG_MAX || 1171 + bq->watchdog_timer < BQ25980_WATCHDOG_MIN) 1172 + return -EINVAL; 1173 + 1174 + ret = device_property_read_u32(bq->dev, 1175 + "ti,sc-ovp-limit-microvolt", 1176 + &bq->init_data.sc_vlim); 1177 + if (ret) 1178 + bq->init_data.sc_vlim = bq->chip_info->busovp_sc_def; 1179 + 1180 + if (bq->init_data.sc_vlim > bq->chip_info->busovp_sc_max || 1181 + bq->init_data.sc_vlim < bq->chip_info->busovp_sc_min) { 1182 + dev_err(bq->dev, "SC ovp limit is out of range\n"); 1183 + return -EINVAL; 1184 + } 1185 + 1186 + ret = device_property_read_u32(bq->dev, 1187 + "ti,sc-ocp-limit-microamp", 1188 + &bq->init_data.sc_ilim); 1189 + if (ret) 1190 + bq->init_data.sc_ilim = bq->chip_info->busocp_def; 1191 + 1192 + if (bq->init_data.sc_ilim > bq->chip_info->busocp_sc_max || 1193 + bq->init_data.sc_ilim < bq->chip_info->busocp_sc_min) { 1194 + dev_err(bq->dev, "SC ocp limit is out of range\n"); 1195 + return -EINVAL; 1196 + } 1197 + 1198 + ret = device_property_read_u32(bq->dev, 1199 + "ti,bypass-ovp-limit-microvolt", 1200 + &bq->init_data.bypass_vlim); 1201 + if (ret) 1202 + bq->init_data.bypass_vlim = bq->chip_info->busovp_byp_def; 1203 + 1204 + if (bq->init_data.bypass_vlim > bq->chip_info->busovp_byp_max || 1205 + bq->init_data.bypass_vlim < bq->chip_info->busovp_byp_min) { 1206 + dev_err(bq->dev, "Bypass ovp limit is out of range\n"); 1207 + return -EINVAL; 1208 + } 1209 + 1210 + ret = device_property_read_u32(bq->dev, 1211 + "ti,bypass-ocp-limit-microamp", 1212 + &bq->init_data.bypass_ilim); 1213 + if (ret) 1214 + bq->init_data.bypass_ilim = bq->chip_info->busocp_def; 1215 + 1216 + if (bq->init_data.bypass_ilim > bq->chip_info->busocp_byp_max || 1217 + bq->init_data.bypass_ilim < bq->chip_info->busocp_byp_min) { 1218 + dev_err(bq->dev, "Bypass ocp limit is out of range\n"); 1219 + return -EINVAL; 1220 + } 1221 + 1222 + 1223 + bq->state.bypass = device_property_read_bool(bq->dev, 1224 + "ti,bypass-enable"); 1225 + return 0; 1226 + } 1227 + 1228 + static int bq25980_probe(struct i2c_client *client, 1229 + const struct i2c_device_id *id) 1230 + { 1231 + struct device *dev = &client->dev; 1232 + struct bq25980_device *bq; 1233 + int ret; 1234 + 1235 + bq = devm_kzalloc(dev, sizeof(*bq), GFP_KERNEL); 1236 + if (!bq) 1237 + return -ENOMEM; 1238 + 1239 + bq->client = client; 1240 + bq->dev = dev; 1241 + 1242 + mutex_init(&bq->lock); 1243 + 1244 + strncpy(bq->model_name, id->name, I2C_NAME_SIZE); 1245 + bq->chip_info = &bq25980_chip_info_tbl[id->driver_data]; 1246 + 1247 + bq->regmap = devm_regmap_init_i2c(client, 1248 + bq->chip_info->regmap_config); 1249 + if (IS_ERR(bq->regmap)) { 1250 + dev_err(dev, "Failed to allocate register map\n"); 1251 + return PTR_ERR(bq->regmap); 1252 + } 1253 + 1254 + i2c_set_clientdata(client, bq); 1255 + 1256 + ret = bq25980_parse_dt(bq); 1257 + if (ret) { 1258 + dev_err(dev, "Failed to read device tree properties%d\n", ret); 1259 + return ret; 1260 + } 1261 + 1262 + if (client->irq) { 1263 + ret = devm_request_threaded_irq(dev, client->irq, NULL, 1264 + bq25980_irq_handler_thread, 1265 + IRQF_TRIGGER_FALLING | 1266 + IRQF_ONESHOT, 1267 + dev_name(&client->dev), bq); 1268 + if (ret) 1269 + return ret; 1270 + } 1271 + 1272 + ret = bq25980_power_supply_init(bq, dev); 1273 + if (ret) { 1274 + dev_err(dev, "Failed to register power supply\n"); 1275 + return ret; 1276 + } 1277 + 1278 + ret = bq25980_hw_init(bq); 1279 + if (ret) { 1280 + dev_err(dev, "Cannot initialize the chip.\n"); 1281 + return ret; 1282 + } 1283 + 1284 + return 0; 1285 + } 1286 + 1287 + static const struct i2c_device_id bq25980_i2c_ids[] = { 1288 + { "bq25980", BQ25980 }, 1289 + { "bq25975", BQ25975 }, 1290 + { "bq25975", BQ25975 }, 1291 + {}, 1292 + }; 1293 + MODULE_DEVICE_TABLE(i2c, bq25980_i2c_ids); 1294 + 1295 + static const struct of_device_id bq25980_of_match[] = { 1296 + { .compatible = "ti,bq25980", .data = (void *)BQ25980 }, 1297 + { .compatible = "ti,bq25975", .data = (void *)BQ25975 }, 1298 + { .compatible = "ti,bq25960", .data = (void *)BQ25960 }, 1299 + { }, 1300 + }; 1301 + MODULE_DEVICE_TABLE(of, bq25980_of_match); 1302 + 1303 + static struct i2c_driver bq25980_driver = { 1304 + .driver = { 1305 + .name = "bq25980-charger", 1306 + .of_match_table = bq25980_of_match, 1307 + }, 1308 + .probe = bq25980_probe, 1309 + .id_table = bq25980_i2c_ids, 1310 + }; 1311 + module_i2c_driver(bq25980_driver); 1312 + 1313 + MODULE_AUTHOR("Dan Murphy <dmurphy@ti.com>"); 1314 + MODULE_AUTHOR("Ricardo Rivera-Matos <r-rivera-matos@ti.com>"); 1315 + MODULE_DESCRIPTION("bq25980 charger driver"); 1316 + MODULE_LICENSE("GPL v2");
+178
drivers/power/supply/bq25980_charger.h
··· 1 + /* SPDX-License-Identifier: GPL-2.0-only */ 2 + /* Copyright (C) 2020 Texas Instruments Incorporated - http://www.ti.com/ */ 3 + 4 + #ifndef BQ25980_CHARGER_H 5 + #define BQ25980_CHARGER_H 6 + 7 + #define BQ25980_MANUFACTURER "Texas Instruments" 8 + 9 + #define BQ25980_BATOVP 0x0 10 + #define BQ25980_BATOVP_ALM 0x1 11 + #define BQ25980_BATOCP 0x2 12 + #define BQ25980_BATOCP_ALM 0x3 13 + #define BQ25980_BATUCP_ALM 0x4 14 + #define BQ25980_CHRGR_CTRL_1 0x5 15 + #define BQ25980_BUSOVP 0x6 16 + #define BQ25980_BUSOVP_ALM 0x7 17 + #define BQ25980_BUSOCP 0x8 18 + #define BQ25980_BUSOCP_ALM 0x9 19 + #define BQ25980_TEMP_CONTROL 0xA 20 + #define BQ25980_TDIE_ALM 0xB 21 + #define BQ25980_TSBUS_FLT 0xC 22 + #define BQ25980_TSBAT_FLG 0xD 23 + #define BQ25980_VAC_CONTROL 0xE 24 + #define BQ25980_CHRGR_CTRL_2 0xF 25 + #define BQ25980_CHRGR_CTRL_3 0x10 26 + #define BQ25980_CHRGR_CTRL_4 0x11 27 + #define BQ25980_CHRGR_CTRL_5 0x12 28 + #define BQ25980_STAT1 0x13 29 + #define BQ25980_STAT2 0x14 30 + #define BQ25980_STAT3 0x15 31 + #define BQ25980_STAT4 0x16 32 + #define BQ25980_STAT5 0x17 33 + #define BQ25980_FLAG1 0x18 34 + #define BQ25980_FLAG2 0x19 35 + #define BQ25980_FLAG3 0x1A 36 + #define BQ25980_FLAG4 0x1B 37 + #define BQ25980_FLAG5 0x1C 38 + #define BQ25980_MASK1 0x1D 39 + #define BQ25980_MASK2 0x1E 40 + #define BQ25980_MASK3 0x1F 41 + #define BQ25980_MASK4 0x20 42 + #define BQ25980_MASK5 0x21 43 + #define BQ25980_DEVICE_INFO 0x22 44 + #define BQ25980_ADC_CONTROL1 0x23 45 + #define BQ25980_ADC_CONTROL2 0x24 46 + #define BQ25980_IBUS_ADC_MSB 0x25 47 + #define BQ25980_IBUS_ADC_LSB 0x26 48 + #define BQ25980_VBUS_ADC_MSB 0x27 49 + #define BQ25980_VBUS_ADC_LSB 0x28 50 + #define BQ25980_VAC1_ADC_MSB 0x29 51 + #define BQ25980_VAC1_ADC_LSB 0x2A 52 + #define BQ25980_VAC2_ADC_MSB 0x2B 53 + #define BQ25980_VAC2_ADC_LSB 0x2C 54 + #define BQ25980_VOUT_ADC_MSB 0x2D 55 + #define BQ25980_VOUT_ADC_LSB 0x2E 56 + #define BQ25980_VBAT_ADC_MSB 0x2F 57 + #define BQ25980_VBAT_ADC_LSB 0x30 58 + #define BQ25980_IBAT_ADC_MSB 0x31 59 + #define BQ25980_IBAT_ADC_LSB 0x32 60 + #define BQ25980_TSBUS_ADC_MSB 0x33 61 + #define BQ25980_TSBUS_ADC_LSB 0x34 62 + #define BQ25980_TSBAT_ADC_MSB 0x35 63 + #define BQ25980_TSBAT_ADC_LSB 0x36 64 + #define BQ25980_TDIE_ADC_MSB 0x37 65 + #define BQ25980_TDIE_ADC_LSB 0x38 66 + #define BQ25980_DEGLITCH_TIME 0x39 67 + #define BQ25980_CHRGR_CTRL_6 0x3A 68 + 69 + #define BQ25980_BUSOCP_STEP_uA 250000 70 + #define BQ25980_BUSOCP_OFFSET_uA 1000000 71 + 72 + #define BQ25980_BUSOCP_DFLT_uA 4250000 73 + #define BQ25975_BUSOCP_DFLT_uA 4250000 74 + #define BQ25960_BUSOCP_DFLT_uA 3250000 75 + 76 + #define BQ25980_BUSOCP_MIN_uA 1000000 77 + 78 + #define BQ25980_BUSOCP_SC_MAX_uA 5750000 79 + #define BQ25975_BUSOCP_SC_MAX_uA 5750000 80 + #define BQ25960_BUSOCP_SC_MAX_uA 3750000 81 + 82 + #define BQ25980_BUSOCP_BYP_MAX_uA 8500000 83 + #define BQ25975_BUSOCP_BYP_MAX_uA 8500000 84 + #define BQ25960_BUSOCP_BYP_MAX_uA 5750000 85 + 86 + #define BQ25980_BUSOVP_SC_STEP_uV 100000 87 + #define BQ25975_BUSOVP_SC_STEP_uV 50000 88 + #define BQ25960_BUSOVP_SC_STEP_uV 50000 89 + #define BQ25980_BUSOVP_SC_OFFSET_uV 14000000 90 + #define BQ25975_BUSOVP_SC_OFFSET_uV 7000000 91 + #define BQ25960_BUSOVP_SC_OFFSET_uV 7000000 92 + 93 + #define BQ25980_BUSOVP_BYP_STEP_uV 50000 94 + #define BQ25975_BUSOVP_BYP_STEP_uV 25000 95 + #define BQ25960_BUSOVP_BYP_STEP_uV 25000 96 + #define BQ25980_BUSOVP_BYP_OFFSET_uV 7000000 97 + #define BQ25975_BUSOVP_BYP_OFFSET_uV 3500000 98 + #define BQ25960_BUSOVP_BYP_OFFSET_uV 3500000 99 + 100 + #define BQ25980_BUSOVP_DFLT_uV 17800000 101 + #define BQ25980_BUSOVP_BYPASS_DFLT_uV 8900000 102 + #define BQ25975_BUSOVP_DFLT_uV 8900000 103 + #define BQ25975_BUSOVP_BYPASS_DFLT_uV 4450000 104 + #define BQ25960_BUSOVP_DFLT_uV 8900000 105 + 106 + #define BQ25980_BUSOVP_SC_MIN_uV 14000000 107 + #define BQ25975_BUSOVP_SC_MIN_uV 7000000 108 + #define BQ25960_BUSOVP_SC_MIN_uV 7000000 109 + #define BQ25980_BUSOVP_BYP_MIN_uV 7000000 110 + #define BQ25975_BUSOVP_BYP_MIN_uV 3500000 111 + #define BQ25960_BUSOVP_BYP_MIN_uV 3500000 112 + 113 + #define BQ25980_BUSOVP_SC_MAX_uV 22000000 114 + #define BQ25975_BUSOVP_SC_MAX_uV 12750000 115 + #define BQ25960_BUSOVP_SC_MAX_uV 12750000 116 + 117 + #define BQ25980_BUSOVP_BYP_MAX_uV 12750000 118 + #define BQ25975_BUSOVP_BYP_MAX_uV 6500000 119 + #define BQ25960_BUSOVP_BYP_MAX_uV 6500000 120 + 121 + #define BQ25980_BATOVP_STEP_uV 20000 122 + #define BQ25975_BATOVP_STEP_uV 10000 123 + #define BQ25960_BATOVP_STEP_uV 10000 124 + 125 + #define BQ25980_BATOVP_OFFSET_uV 7000000 126 + #define BQ25975_BATOVP_OFFSET_uV 3500000 127 + #define BQ25960_BATOVP_OFFSET_uV 3500000 128 + 129 + #define BQ25980_BATOVP_DFLT_uV 14000000 130 + #define BQ25975_BATOVP_DFLT_uV 8900000 131 + #define BQ25960_BATOVP_DFLT_uV 8900000 132 + 133 + #define BQ25980_BATOVP_MIN_uV 7000000 134 + #define BQ25975_BATOVP_MIN_uV 3500000 135 + #define BQ25960_BATOVP_MIN_uV 3500000 136 + 137 + #define BQ25980_BATOVP_MAX_uV 9540000 138 + #define BQ25975_BATOVP_MAX_uV 4770000 139 + #define BQ25960_BATOVP_MAX_uV 4770000 140 + 141 + #define BQ25980_BATOCP_STEP_uA 100000 142 + 143 + #define BQ25980_BATOCP_MASK GENMASK(6, 0) 144 + 145 + #define BQ25980_BATOCP_DFLT_uA 8100000 146 + #define BQ25960_BATOCP_DFLT_uA 6100000 147 + 148 + #define BQ25980_BATOCP_MIN_uA 2000000 149 + 150 + #define BQ25980_BATOCP_MAX_uA 11000000 151 + #define BQ25975_BATOCP_MAX_uA 11000000 152 + #define BQ25960_BATOCP_MAX_uA 7000000 153 + 154 + #define BQ25980_ENABLE_HIZ 0xff 155 + #define BQ25980_DISABLE_HIZ 0x0 156 + #define BQ25980_EN_BYPASS BIT(3) 157 + #define BQ25980_STAT1_OVP_MASK (BIT(6) | BIT(5) | BIT(0)) 158 + #define BQ25980_STAT3_OVP_MASK (BIT(7) | BIT(6)) 159 + #define BQ25980_STAT1_OCP_MASK BIT(3) 160 + #define BQ25980_STAT2_OCP_MASK (BIT(6) | BIT(1)) 161 + #define BQ25980_STAT4_TFLT_MASK GENMASK(5, 1) 162 + #define BQ25980_WD_STAT BIT(0) 163 + #define BQ25980_PRESENT_MASK GENMASK(4, 2) 164 + #define BQ25980_CHG_EN BIT(4) 165 + #define BQ25980_EN_HIZ BIT(6) 166 + #define BQ25980_ADC_EN BIT(7) 167 + 168 + #define BQ25980_ADC_VOLT_STEP_uV 1000 169 + #define BQ25980_ADC_CURR_STEP_uA 1000 170 + #define BQ25980_ADC_POLARITY_BIT BIT(7) 171 + 172 + #define BQ25980_WATCHDOG_MASK GENMASK(4, 3) 173 + #define BQ25980_WATCHDOG_DIS BIT(2) 174 + #define BQ25980_WATCHDOG_MAX 300000 175 + #define BQ25980_WATCHDOG_MIN 0 176 + #define BQ25980_NUM_WD_VAL 4 177 + 178 + #endif /* BQ25980_CHARGER_H */