1 // SPDX-License-Identifier: GPL-2.0 2 /* 3 * Based on max77650-charger.c 4 * 5 * Copyright (C) 2025 Dzmitry Sankouski <dsankouski@gmail.org> 6 * 7 * Battery charger driver for MAXIM 77705 charger/power-supply. 8 */ 9 10 #include <linux/devm-helpers.h> 11 #include <linux/i2c.h> 12 #include <linux/interrupt.h> 13 #include <linux/mfd/max77693-common.h> 14 #include <linux/mfd/max77705-private.h> 15 #include <linux/power/max77705_charger.h> 16 #include <linux/module.h> 17 #include <linux/platform_device.h> 18 #include <linux/power_supply.h> 19 #include <linux/regmap.h> 20 21 static const char *max77705_charger_model = "max77705"; 22 static const char *max77705_charger_manufacturer = "Maxim Integrated"; 23 24 static const struct regmap_config max77705_chg_regmap_config = { 25 .reg_base = MAX77705_CHG_REG_BASE, 26 .reg_bits = 8, 27 .val_bits = 8, 28 .max_register = MAX77705_CHG_REG_SAFEOUT_CTRL, 29 }; 30 31 static enum power_supply_property max77705_charger_props[] = { 32 POWER_SUPPLY_PROP_ONLINE, 33 POWER_SUPPLY_PROP_PRESENT, 34 POWER_SUPPLY_PROP_STATUS, 35 POWER_SUPPLY_PROP_CHARGE_TYPE, 36 POWER_SUPPLY_PROP_HEALTH, 37 POWER_SUPPLY_PROP_VOLTAGE_MAX_DESIGN, 38 POWER_SUPPLY_PROP_CONSTANT_CHARGE_VOLTAGE, 39 POWER_SUPPLY_PROP_CONSTANT_CHARGE_CURRENT, 40 POWER_SUPPLY_PROP_INPUT_CURRENT_LIMIT, 41 }; 42 43 static irqreturn_t max77705_chgin_irq(int irq, void *irq_drv_data) 44 { 45 struct max77705_charger_data *chg = irq_drv_data; 46 47 queue_work(chg->wqueue, &chg->chgin_work); 48 49 return IRQ_HANDLED; 50 } 51 52 static const struct regmap_irq max77705_charger_irqs[] = { 53 REGMAP_IRQ_REG_LINE(MAX77705_BYP_I, BITS_PER_BYTE), 54 REGMAP_IRQ_REG_LINE(MAX77705_INP_LIMIT_I, BITS_PER_BYTE), 55 REGMAP_IRQ_REG_LINE(MAX77705_BATP_I, BITS_PER_BYTE), 56 REGMAP_IRQ_REG_LINE(MAX77705_BAT_I, BITS_PER_BYTE), 57 REGMAP_IRQ_REG_LINE(MAX77705_CHG_I, BITS_PER_BYTE), 58 REGMAP_IRQ_REG_LINE(MAX77705_WCIN_I, BITS_PER_BYTE), 59 REGMAP_IRQ_REG_LINE(MAX77705_CHGIN_I, BITS_PER_BYTE), 60 REGMAP_IRQ_REG_LINE(MAX77705_AICL_I, BITS_PER_BYTE), 61 }; 62 63 static struct regmap_irq_chip max77705_charger_irq_chip = { 64 .name = "max77705-charger", 65 .status_base = MAX77705_CHG_REG_INT, 66 .mask_base = MAX77705_CHG_REG_INT_MASK, 67 .num_regs = 1, 68 .irqs = max77705_charger_irqs, 69 .num_irqs = ARRAY_SIZE(max77705_charger_irqs), 70 }; 71 72 static int max77705_charger_enable(struct max77705_charger_data *chg) 73 { 74 int rv; 75 76 rv = regmap_field_write(chg->rfield[MAX77705_CHG_EN], 1); 77 if (rv) 78 dev_err(chg->dev, "unable to enable the charger: %d\n", rv); 79 80 return rv; 81 } 82 83 static void max77705_charger_disable(void *data) 84 { 85 struct max77705_charger_data *chg = data; 86 int rv; 87 88 rv = regmap_field_write(chg->rfield[MAX77705_CHG_EN], MAX77705_CHG_DISABLE); 89 if (rv) 90 dev_err(chg->dev, "unable to disable the charger: %d\n", rv); 91 } 92 93 static int max77705_get_online(struct regmap *regmap, int *val) 94 { 95 unsigned int data; 96 int ret; 97 98 ret = regmap_read(regmap, MAX77705_CHG_REG_INT_OK, &data); 99 if (ret < 0) 100 return ret; 101 102 *val = !!(data & MAX77705_CHGIN_OK); 103 104 return 0; 105 } 106 107 static int max77705_set_integer(struct max77705_charger_data *chg, enum max77705_field_idx fidx, 108 unsigned int clamp_min, unsigned int clamp_max, 109 unsigned int div, int val) 110 { 111 unsigned int regval; 112 113 regval = clamp_val(val, clamp_min, clamp_max) / div; 114 115 return regmap_field_write(chg->rfield[fidx], regval); 116 } 117 118 static int max77705_check_battery(struct max77705_charger_data *chg, int *val) 119 { 120 unsigned int reg_data; 121 unsigned int reg_data2; 122 struct regmap *regmap = chg->regmap; 123 124 regmap_read(regmap, MAX77705_CHG_REG_INT_OK, ®_data); 125 126 dev_dbg(chg->dev, "CHG_INT_OK(0x%x)\n", reg_data); 127 128 regmap_read(regmap, MAX77705_CHG_REG_DETAILS_00, ®_data2); 129 130 dev_dbg(chg->dev, "CHG_DETAILS00(0x%x)\n", reg_data2); 131 132 if ((reg_data & MAX77705_BATP_OK) || !(reg_data2 & MAX77705_BATP_DTLS)) 133 *val = true; 134 else 135 *val = false; 136 137 return 0; 138 } 139 140 static int max77705_get_charge_type(struct max77705_charger_data *chg, int *val) 141 { 142 struct regmap *regmap = chg->regmap; 143 unsigned int reg_data, chg_en; 144 145 regmap_field_read(chg->rfield[MAX77705_CHG_EN], &chg_en); 146 if (!chg_en) { 147 *val = POWER_SUPPLY_CHARGE_TYPE_NONE; 148 return 0; 149 } 150 151 regmap_read(regmap, MAX77705_CHG_REG_DETAILS_01, ®_data); 152 reg_data &= MAX77705_CHG_DTLS; 153 154 switch (reg_data) { 155 case 0x0: 156 case MAX77705_CHARGER_CONSTANT_CURRENT: 157 case MAX77705_CHARGER_CONSTANT_VOLTAGE: 158 *val = POWER_SUPPLY_CHARGE_TYPE_FAST; 159 return 0; 160 default: 161 *val = POWER_SUPPLY_CHARGE_TYPE_NONE; 162 return 0; 163 } 164 165 return 0; 166 } 167 168 static int max77705_get_status(struct max77705_charger_data *chg, int *val) 169 { 170 struct regmap *regmap = chg->regmap; 171 unsigned int reg_data, chg_en; 172 173 regmap_field_read(chg->rfield[MAX77705_CHG_EN], &chg_en); 174 if (!chg_en) { 175 *val = POWER_SUPPLY_CHARGE_TYPE_NONE; 176 return 0; 177 } 178 179 regmap_read(regmap, MAX77705_CHG_REG_DETAILS_01, ®_data); 180 reg_data &= MAX77705_CHG_DTLS; 181 182 switch (reg_data) { 183 case 0x0: 184 case MAX77705_CHARGER_CONSTANT_CURRENT: 185 case MAX77705_CHARGER_CONSTANT_VOLTAGE: 186 *val = POWER_SUPPLY_STATUS_CHARGING; 187 return 0; 188 case MAX77705_CHARGER_END_OF_CHARGE: 189 case MAX77705_CHARGER_DONE: 190 *val = POWER_SUPPLY_STATUS_FULL; 191 return 0; 192 /* those values hard coded as in vendor kernel, because of */ 193 /* failure to determine it's actual meaning. */ 194 case 0x05: 195 case 0x06: 196 case 0x07: 197 *val = POWER_SUPPLY_STATUS_NOT_CHARGING; 198 return 0; 199 case 0x08: 200 case 0xA: 201 case 0xB: 202 *val = POWER_SUPPLY_STATUS_DISCHARGING; 203 return 0; 204 default: 205 *val = POWER_SUPPLY_STATUS_UNKNOWN; 206 return 0; 207 } 208 209 return 0; 210 } 211 212 static int max77705_get_vbus_state(struct regmap *regmap, int *value) 213 { 214 int ret; 215 unsigned int charge_dtls; 216 217 ret = regmap_read(regmap, MAX77705_CHG_REG_DETAILS_00, &charge_dtls); 218 if (ret) 219 return ret; 220 221 charge_dtls = ((charge_dtls & MAX77705_CHGIN_DTLS) >> 222 MAX77705_CHGIN_DTLS_SHIFT); 223 224 switch (charge_dtls) { 225 case 0x00: 226 *value = POWER_SUPPLY_HEALTH_UNDERVOLTAGE; 227 break; 228 case 0x01: 229 *value = POWER_SUPPLY_HEALTH_UNDERVOLTAGE; 230 break; 231 case 0x02: 232 *value = POWER_SUPPLY_HEALTH_OVERVOLTAGE; 233 break; 234 case 0x03: 235 *value = POWER_SUPPLY_HEALTH_GOOD; 236 break; 237 default: 238 return 0; 239 } 240 return 0; 241 } 242 243 static int max77705_get_battery_health(struct max77705_charger_data *chg, 244 int *value) 245 { 246 struct regmap *regmap = chg->regmap; 247 unsigned int bat_dtls; 248 249 regmap_read(regmap, MAX77705_CHG_REG_DETAILS_01, &bat_dtls); 250 bat_dtls = ((bat_dtls & MAX77705_BAT_DTLS) >> MAX77705_BAT_DTLS_SHIFT); 251 252 switch (bat_dtls) { 253 case MAX77705_BATTERY_NOBAT: 254 dev_dbg(chg->dev, "%s: No battery and the chg is suspended\n", 255 __func__); 256 *value = POWER_SUPPLY_HEALTH_NO_BATTERY; 257 break; 258 case MAX77705_BATTERY_PREQUALIFICATION: 259 dev_dbg(chg->dev, "%s: battery is okay but its voltage is low(~VPQLB)\n", 260 __func__); 261 break; 262 case MAX77705_BATTERY_DEAD: 263 dev_dbg(chg->dev, "%s: battery dead\n", __func__); 264 *value = POWER_SUPPLY_HEALTH_DEAD; 265 break; 266 case MAX77705_BATTERY_GOOD: 267 case MAX77705_BATTERY_LOWVOLTAGE: 268 *value = POWER_SUPPLY_HEALTH_GOOD; 269 break; 270 case MAX77705_BATTERY_OVERVOLTAGE: 271 dev_dbg(chg->dev, "%s: battery ovp\n", __func__); 272 *value = POWER_SUPPLY_HEALTH_OVERVOLTAGE; 273 break; 274 default: 275 dev_dbg(chg->dev, "%s: battery unknown\n", __func__); 276 *value = POWER_SUPPLY_HEALTH_UNSPEC_FAILURE; 277 break; 278 } 279 280 return 0; 281 } 282 283 static int max77705_get_health(struct max77705_charger_data *chg, int *val) 284 { 285 struct regmap *regmap = chg->regmap; 286 int ret, is_online = 0; 287 288 ret = max77705_get_online(regmap, &is_online); 289 if (ret) 290 return ret; 291 if (is_online) { 292 ret = max77705_get_vbus_state(regmap, val); 293 if (ret || (*val != POWER_SUPPLY_HEALTH_GOOD)) 294 return ret; 295 } 296 return max77705_get_battery_health(chg, val); 297 } 298 299 static int max77705_get_input_current(struct max77705_charger_data *chg, 300 int *val) 301 { 302 unsigned int reg_data; 303 int get_current = 0; 304 305 regmap_field_read(chg->rfield[MAX77705_CHG_CHGIN_LIM], ®_data); 306 307 if (reg_data <= 3) 308 get_current = MAX77705_CURRENT_CHGIN_MIN; 309 else 310 get_current = (reg_data + 1) * MAX77705_CURRENT_CHGIN_STEP; 311 312 *val = get_current; 313 314 return 0; 315 } 316 317 static int max77705_get_charge_current(struct max77705_charger_data *chg, 318 int *val) 319 { 320 unsigned int reg_data; 321 322 regmap_field_read(chg->rfield[MAX77705_CHG_CC_LIM], ®_data); 323 324 *val = reg_data <= 0x2 ? MAX77705_CURRENT_CHGIN_MIN : reg_data * MAX77705_CURRENT_CHG_STEP; 325 326 return 0; 327 } 328 329 static int max77705_set_float_voltage(struct max77705_charger_data *chg, 330 int float_voltage) 331 { 332 int float_voltage_mv; 333 unsigned int reg_data = 0; 334 335 float_voltage_mv = float_voltage / 1000; 336 reg_data = float_voltage_mv <= 4000 ? 0x0 : 337 float_voltage_mv >= 4500 ? 0x23 : 338 (float_voltage_mv <= 4200) ? (float_voltage_mv - 4000) / 50 : 339 (((float_voltage_mv - 4200) / 10) + 0x04); 340 341 return regmap_field_write(chg->rfield[MAX77705_CHG_CV_PRM], reg_data); 342 } 343 344 static int max77705_get_float_voltage(struct max77705_charger_data *chg, 345 int *val) 346 { 347 unsigned int reg_data = 0; 348 int voltage_mv; 349 350 regmap_field_read(chg->rfield[MAX77705_CHG_CV_PRM], ®_data); 351 voltage_mv = reg_data <= 0x04 ? reg_data * 50 + 4000 : 352 (reg_data - 4) * 10 + 4200; 353 *val = voltage_mv * 1000; 354 355 return 0; 356 } 357 358 static int max77705_chg_get_property(struct power_supply *psy, 359 enum power_supply_property psp, 360 union power_supply_propval *val) 361 { 362 struct max77705_charger_data *chg = power_supply_get_drvdata(psy); 363 struct regmap *regmap = chg->regmap; 364 365 switch (psp) { 366 case POWER_SUPPLY_PROP_ONLINE: 367 return max77705_get_online(regmap, &val->intval); 368 case POWER_SUPPLY_PROP_PRESENT: 369 return max77705_check_battery(chg, &val->intval); 370 case POWER_SUPPLY_PROP_STATUS: 371 return max77705_get_status(chg, &val->intval); 372 case POWER_SUPPLY_PROP_CHARGE_TYPE: 373 return max77705_get_charge_type(chg, &val->intval); 374 case POWER_SUPPLY_PROP_HEALTH: 375 return max77705_get_health(chg, &val->intval); 376 case POWER_SUPPLY_PROP_INPUT_CURRENT_LIMIT: 377 return max77705_get_input_current(chg, &val->intval); 378 case POWER_SUPPLY_PROP_CONSTANT_CHARGE_CURRENT: 379 return max77705_get_charge_current(chg, &val->intval); 380 case POWER_SUPPLY_PROP_CONSTANT_CHARGE_VOLTAGE: 381 return max77705_get_float_voltage(chg, &val->intval); 382 case POWER_SUPPLY_PROP_VOLTAGE_MAX_DESIGN: 383 val->intval = chg->bat_info->voltage_max_design_uv; 384 break; 385 case POWER_SUPPLY_PROP_MODEL_NAME: 386 val->strval = max77705_charger_model; 387 break; 388 case POWER_SUPPLY_PROP_MANUFACTURER: 389 val->strval = max77705_charger_manufacturer; 390 break; 391 default: 392 return -EINVAL; 393 } 394 return 0; 395 } 396 397 static int max77705_set_property(struct power_supply *psy, 398 enum power_supply_property psp, 399 const union power_supply_propval *val) 400 { 401 struct max77705_charger_data *chg = power_supply_get_drvdata(psy); 402 int err = 0; 403 404 switch (psp) { 405 case POWER_SUPPLY_PROP_CONSTANT_CHARGE_CURRENT: 406 err = max77705_set_integer(chg, MAX77705_CHG_CC_LIM, 407 MAX77705_CURRENT_CHGIN_MIN, 408 MAX77705_CURRENT_CHGIN_MAX, 409 MAX77705_CURRENT_CHG_STEP, 410 val->intval); 411 break; 412 case POWER_SUPPLY_PROP_INPUT_CURRENT_LIMIT: 413 err = max77705_set_integer(chg, MAX77705_CHG_CHGIN_LIM, 414 MAX77705_CURRENT_CHGIN_MIN, 415 MAX77705_CURRENT_CHGIN_MAX, 416 MAX77705_CURRENT_CHGIN_STEP, 417 val->intval); 418 break; 419 default: 420 err = -EINVAL; 421 } 422 423 return err; 424 }; 425 426 static int max77705_property_is_writeable(struct power_supply *psy, 427 enum power_supply_property psp) 428 { 429 switch (psp) { 430 case POWER_SUPPLY_PROP_CONSTANT_CHARGE_CURRENT: 431 case POWER_SUPPLY_PROP_INPUT_CURRENT_LIMIT: 432 return true; 433 default: 434 return false; 435 } 436 } 437 438 static const struct power_supply_desc max77705_charger_psy_desc = { 439 .name = "max77705-charger", 440 .type = POWER_SUPPLY_TYPE_USB, 441 .properties = max77705_charger_props, 442 .property_is_writeable = max77705_property_is_writeable, 443 .num_properties = ARRAY_SIZE(max77705_charger_props), 444 .get_property = max77705_chg_get_property, 445 .set_property = max77705_set_property, 446 }; 447 448 static void max77705_chgin_isr_work(struct work_struct *work) 449 { 450 struct max77705_charger_data *chg = 451 container_of(work, struct max77705_charger_data, chgin_work); 452 453 power_supply_changed(chg->psy_chg); 454 } 455 456 static int max77705_charger_initialize(struct max77705_charger_data *chg) 457 { 458 struct power_supply_battery_info *info; 459 struct regmap *regmap = chg->regmap; 460 int err; 461 462 err = power_supply_get_battery_info(chg->psy_chg, &info); 463 if (err) 464 return dev_err_probe(chg->dev, err, "error on getting battery info"); 465 466 chg->bat_info = info; 467 468 /* unlock charger setting protect */ 469 /* slowest LX slope */ 470 err = regmap_field_write(chg->rfield[MAX77705_CHGPROT], MAX77705_CHGPROT_UNLOCKED); 471 if (err) 472 goto err; 473 474 err = regmap_field_write(chg->rfield[MAX77705_LX_SLOPE], MAX77705_SLOWEST_LX_SLOPE); 475 if (err) 476 goto err; 477 478 /* fast charge timer disable */ 479 /* restart threshold disable */ 480 /* pre-qual charge disable */ 481 err = regmap_field_write(chg->rfield[MAX77705_FCHGTIME], MAX77705_FCHGTIME_DISABLE); 482 if (err) 483 goto err; 484 485 err = regmap_field_write(chg->rfield[MAX77705_CHG_RSTRT], MAX77705_CHG_RSTRT_DISABLE); 486 if (err) 487 goto err; 488 489 err = regmap_field_write(chg->rfield[MAX77705_CHG_PQEN], MAX77705_CHG_PQEN_DISABLE); 490 if (err) 491 goto err; 492 493 err = regmap_field_write(chg->rfield[MAX77705_MODE], 494 MAX77705_CHG_MASK | MAX77705_BUCK_MASK); 495 if (err) 496 goto err; 497 498 /* charge current 450mA(default) */ 499 /* otg current limit 900mA */ 500 err = regmap_field_write(chg->rfield[MAX77705_OTG_ILIM], MAX77705_OTG_ILIM_900); 501 if (err) 502 goto err; 503 504 /* BAT to SYS OCP 4.80A */ 505 err = regmap_field_write(chg->rfield[MAX77705_REG_B2SOVRC], MAX77705_B2SOVRC_4_8A); 506 if (err) 507 goto err; 508 509 /* top off current 150mA */ 510 /* top off timer 30min */ 511 err = regmap_field_write(chg->rfield[MAX77705_TO], MAX77705_TO_ITH_150MA); 512 if (err) 513 goto err; 514 515 err = regmap_field_write(chg->rfield[MAX77705_TO_TIME], MAX77705_TO_TIME_30M); 516 if (err) 517 goto err; 518 519 err = regmap_field_write(chg->rfield[MAX77705_SYS_TRACK], MAX77705_SYS_TRACK_DISABLE); 520 if (err) 521 goto err; 522 523 /* cv voltage 4.2V or 4.35V */ 524 /* MINVSYS 3.6V(default) */ 525 if (info->voltage_max_design_uv < 0) { 526 dev_warn(chg->dev, "missing battery:voltage-max-design-microvolt\n"); 527 max77705_set_float_voltage(chg, 4200000); 528 } else { 529 max77705_set_float_voltage(chg, info->voltage_max_design_uv); 530 } 531 532 err = regmap_field_write(chg->rfield[MAX77705_VCHGIN], MAX77705_VCHGIN_4_5); 533 if (err) 534 goto err; 535 536 err = regmap_field_write(chg->rfield[MAX77705_WCIN], MAX77705_WCIN_4_5); 537 if (err) 538 goto err; 539 540 /* Watchdog timer */ 541 regmap_update_bits(regmap, MAX77705_CHG_REG_CNFG_00, 542 MAX77705_WDTEN_MASK, 0); 543 544 /* VBYPSET=5.0V */ 545 err = regmap_field_write(chg->rfield[MAX77705_VBYPSET], 0); 546 if (err) 547 goto err; 548 549 /* Switching Frequency : 1.5MHz */ 550 err = regmap_field_write(chg->rfield[MAX77705_REG_FSW], MAX77705_CHG_FSW_1_5MHz); 551 if (err) 552 goto err; 553 554 /* Auto skip mode */ 555 err = regmap_field_write(chg->rfield[MAX77705_REG_DISKIP], MAX77705_AUTO_SKIP); 556 if (err) 557 goto err; 558 559 return 0; 560 561 err: 562 return dev_err_probe(chg->dev, err, "error while configuring"); 563 564 } 565 566 static int max77705_charger_probe(struct i2c_client *i2c) 567 { 568 struct power_supply_config pscfg = {}; 569 struct max77705_charger_data *chg; 570 struct device *dev; 571 struct regmap_irq_chip_data *irq_data; 572 int ret; 573 574 dev = &i2c->dev; 575 576 chg = devm_kzalloc(dev, sizeof(*chg), GFP_KERNEL); 577 if (!chg) 578 return -ENOMEM; 579 580 chg->dev = dev; 581 i2c_set_clientdata(i2c, chg); 582 583 chg->regmap = devm_regmap_init_i2c(i2c, &max77705_chg_regmap_config); 584 if (IS_ERR(chg->regmap)) 585 return PTR_ERR(chg->regmap); 586 587 for (int i = 0; i < MAX77705_N_REGMAP_FIELDS; i++) { 588 chg->rfield[i] = devm_regmap_field_alloc(dev, chg->regmap, 589 max77705_reg_field[i]); 590 if (IS_ERR(chg->rfield[i])) 591 return dev_err_probe(dev, PTR_ERR(chg->rfield[i]), 592 "cannot allocate regmap field\n"); 593 } 594 595 pscfg.fwnode = dev_fwnode(dev); 596 pscfg.drv_data = chg; 597 598 chg->psy_chg = devm_power_supply_register(dev, &max77705_charger_psy_desc, &pscfg); 599 if (IS_ERR(chg->psy_chg)) 600 return PTR_ERR(chg->psy_chg); 601 602 max77705_charger_irq_chip.irq_drv_data = chg; 603 ret = devm_regmap_add_irq_chip(chg->dev, chg->regmap, i2c->irq, 604 IRQF_ONESHOT, 0, 605 &max77705_charger_irq_chip, 606 &irq_data); 607 if (ret) 608 return dev_err_probe(dev, ret, "failed to add irq chip\n"); 609 610 chg->wqueue = create_singlethread_workqueue(dev_name(dev)); 611 if (!chg->wqueue) 612 return -ENOMEM; 613 614 ret = devm_work_autocancel(dev, &chg->chgin_work, max77705_chgin_isr_work); 615 if (ret) { 616 dev_err_probe(dev, ret, "failed to initialize interrupt work\n"); 617 goto destroy_wq; 618 } 619 620 ret = max77705_charger_initialize(chg); 621 if (ret) { 622 dev_err_probe(dev, ret, "failed to initialize charger IC\n"); 623 goto destroy_wq; 624 } 625 626 ret = devm_request_threaded_irq(dev, regmap_irq_get_virq(irq_data, MAX77705_CHGIN_I), 627 NULL, max77705_chgin_irq, 628 IRQF_TRIGGER_NONE, 629 "chgin-irq", chg); 630 if (ret) { 631 dev_err_probe(dev, ret, "Failed to Request chgin IRQ\n"); 632 goto destroy_wq; 633 } 634 635 ret = max77705_charger_enable(chg); 636 if (ret) { 637 dev_err_probe(dev, ret, "failed to enable charge\n"); 638 goto destroy_wq; 639 } 640 641 return devm_add_action_or_reset(dev, max77705_charger_disable, chg); 642 643 destroy_wq: 644 destroy_workqueue(chg->wqueue); 645 return ret; 646 } 647 648 static const struct of_device_id max77705_charger_of_match[] = { 649 { .compatible = "maxim,max77705-charger" }, 650 { } 651 }; 652 MODULE_DEVICE_TABLE(of, max77705_charger_of_match); 653 654 static struct i2c_driver max77705_charger_driver = { 655 .driver = { 656 .name = "max77705-charger", 657 .of_match_table = max77705_charger_of_match, 658 }, 659 .probe = max77705_charger_probe, 660 }; 661 module_i2c_driver(max77705_charger_driver); 662 663 MODULE_AUTHOR("Dzmitry Sankouski <dsankouski@gmail.com>"); 664 MODULE_DESCRIPTION("Maxim MAX77705 charger driver"); 665 MODULE_LICENSE("GPL"); 666