1/* 2 * Summit Microelectronics SMB347 Battery Charger Driver 3 * 4 * Copyright (C) 2011, Intel Corporation 5 * 6 * Authors: Bruce E. Robertson <bruce.e.robertson@intel.com> 7 * Mika Westerberg <mika.westerberg@linux.intel.com> 8 * 9 * This program is free software; you can redistribute it and/or modify 10 * it under the terms of the GNU General Public License version 2 as 11 * published by the Free Software Foundation. 12 */ 13 14#include <linux/err.h> 15#include <linux/gpio.h> 16#include <linux/kernel.h> 17#include <linux/module.h> 18#include <linux/init.h> 19#include <linux/interrupt.h> 20#include <linux/i2c.h> 21#include <linux/mutex.h> 22#include <linux/power_supply.h> 23#include <linux/power/smb347-charger.h> 24#include <linux/regmap.h> 25 26/* 27 * Configuration registers. These are mirrored to volatile RAM and can be 28 * written once %CMD_A_ALLOW_WRITE is set in %CMD_A register. They will be 29 * reloaded from non-volatile registers after POR. 30 */ 31#define CFG_CHARGE_CURRENT 0x00 32#define CFG_CHARGE_CURRENT_FCC_MASK 0xe0 33#define CFG_CHARGE_CURRENT_FCC_SHIFT 5 34#define CFG_CHARGE_CURRENT_PCC_MASK 0x18 35#define CFG_CHARGE_CURRENT_PCC_SHIFT 3 36#define CFG_CHARGE_CURRENT_TC_MASK 0x07 37#define CFG_CURRENT_LIMIT 0x01 38#define CFG_CURRENT_LIMIT_DC_MASK 0xf0 39#define CFG_CURRENT_LIMIT_DC_SHIFT 4 40#define CFG_CURRENT_LIMIT_USB_MASK 0x0f 41#define CFG_FLOAT_VOLTAGE 0x03 42#define CFG_FLOAT_VOLTAGE_FLOAT_MASK 0x3f 43#define CFG_FLOAT_VOLTAGE_THRESHOLD_MASK 0xc0 44#define CFG_FLOAT_VOLTAGE_THRESHOLD_SHIFT 6 45#define CFG_STAT 0x05 46#define CFG_STAT_DISABLED BIT(5) 47#define CFG_STAT_ACTIVE_HIGH BIT(7) 48#define CFG_PIN 0x06 49#define CFG_PIN_EN_CTRL_MASK 0x60 50#define CFG_PIN_EN_CTRL_ACTIVE_HIGH 0x40 51#define CFG_PIN_EN_CTRL_ACTIVE_LOW 0x60 52#define CFG_PIN_EN_APSD_IRQ BIT(1) 53#define CFG_PIN_EN_CHARGER_ERROR BIT(2) 54#define CFG_THERM 0x07 55#define CFG_THERM_SOFT_HOT_COMPENSATION_MASK 0x03 56#define CFG_THERM_SOFT_HOT_COMPENSATION_SHIFT 0 57#define CFG_THERM_SOFT_COLD_COMPENSATION_MASK 0x0c 58#define CFG_THERM_SOFT_COLD_COMPENSATION_SHIFT 2 59#define CFG_THERM_MONITOR_DISABLED BIT(4) 60#define CFG_SYSOK 0x08 61#define CFG_SYSOK_SUSPEND_HARD_LIMIT_DISABLED BIT(2) 62#define CFG_OTHER 0x09 63#define CFG_OTHER_RID_MASK 0xc0 64#define CFG_OTHER_RID_ENABLED_AUTO_OTG 0xc0 65#define CFG_OTG 0x0a 66#define CFG_OTG_TEMP_THRESHOLD_MASK 0x30 67#define CFG_OTG_TEMP_THRESHOLD_SHIFT 4 68#define CFG_OTG_CC_COMPENSATION_MASK 0xc0 69#define CFG_OTG_CC_COMPENSATION_SHIFT 6 70#define CFG_TEMP_LIMIT 0x0b 71#define CFG_TEMP_LIMIT_SOFT_HOT_MASK 0x03 72#define CFG_TEMP_LIMIT_SOFT_HOT_SHIFT 0 73#define CFG_TEMP_LIMIT_SOFT_COLD_MASK 0x0c 74#define CFG_TEMP_LIMIT_SOFT_COLD_SHIFT 2 75#define CFG_TEMP_LIMIT_HARD_HOT_MASK 0x30 76#define CFG_TEMP_LIMIT_HARD_HOT_SHIFT 4 77#define CFG_TEMP_LIMIT_HARD_COLD_MASK 0xc0 78#define CFG_TEMP_LIMIT_HARD_COLD_SHIFT 6 79#define CFG_FAULT_IRQ 0x0c 80#define CFG_FAULT_IRQ_DCIN_UV BIT(2) 81#define CFG_STATUS_IRQ 0x0d 82#define CFG_STATUS_IRQ_TERMINATION_OR_TAPER BIT(4) 83#define CFG_STATUS_IRQ_CHARGE_TIMEOUT BIT(7) 84#define CFG_ADDRESS 0x0e 85 86/* Command registers */ 87#define CMD_A 0x30 88#define CMD_A_CHG_ENABLED BIT(1) 89#define CMD_A_SUSPEND_ENABLED BIT(2) 90#define CMD_A_ALLOW_WRITE BIT(7) 91#define CMD_B 0x31 92#define CMD_C 0x33 93 94/* Interrupt Status registers */ 95#define IRQSTAT_A 0x35 96#define IRQSTAT_C 0x37 97#define IRQSTAT_C_TERMINATION_STAT BIT(0) 98#define IRQSTAT_C_TERMINATION_IRQ BIT(1) 99#define IRQSTAT_C_TAPER_IRQ BIT(3) 100#define IRQSTAT_D 0x38 101#define IRQSTAT_D_CHARGE_TIMEOUT_STAT BIT(2) 102#define IRQSTAT_D_CHARGE_TIMEOUT_IRQ BIT(3) 103#define IRQSTAT_E 0x39 104#define IRQSTAT_E_USBIN_UV_STAT BIT(0) 105#define IRQSTAT_E_USBIN_UV_IRQ BIT(1) 106#define IRQSTAT_E_DCIN_UV_STAT BIT(4) 107#define IRQSTAT_E_DCIN_UV_IRQ BIT(5) 108#define IRQSTAT_F 0x3a 109 110/* Status registers */ 111#define STAT_A 0x3b 112#define STAT_A_FLOAT_VOLTAGE_MASK 0x3f 113#define STAT_B 0x3c 114#define STAT_C 0x3d 115#define STAT_C_CHG_ENABLED BIT(0) 116#define STAT_C_HOLDOFF_STAT BIT(3) 117#define STAT_C_CHG_MASK 0x06 118#define STAT_C_CHG_SHIFT 1 119#define STAT_C_CHG_TERM BIT(5) 120#define STAT_C_CHARGER_ERROR BIT(6) 121#define STAT_E 0x3f 122 123#define SMB347_MAX_REGISTER 0x3f 124 125/** 126 * struct smb347_charger - smb347 charger instance 127 * @lock: protects concurrent access to online variables 128 * @dev: pointer to device 129 * @regmap: pointer to driver regmap 130 * @mains: power_supply instance for AC/DC power 131 * @usb: power_supply instance for USB power 132 * @battery: power_supply instance for battery 133 * @mains_online: is AC/DC input connected 134 * @usb_online: is USB input connected 135 * @charging_enabled: is charging enabled 136 * @pdata: pointer to platform data 137 */ 138struct smb347_charger { 139 struct mutex lock; 140 struct device *dev; 141 struct regmap *regmap; 142 struct power_supply *mains; 143 struct power_supply *usb; 144 struct power_supply *battery; 145 bool mains_online; 146 bool usb_online; 147 bool charging_enabled; 148 const struct smb347_charger_platform_data *pdata; 149}; 150 151/* Fast charge current in uA */ 152static const unsigned int fcc_tbl[] = { 153 700000, 154 900000, 155 1200000, 156 1500000, 157 1800000, 158 2000000, 159 2200000, 160 2500000, 161}; 162 163/* Pre-charge current in uA */ 164static const unsigned int pcc_tbl[] = { 165 100000, 166 150000, 167 200000, 168 250000, 169}; 170 171/* Termination current in uA */ 172static const unsigned int tc_tbl[] = { 173 37500, 174 50000, 175 100000, 176 150000, 177 200000, 178 250000, 179 500000, 180 600000, 181}; 182 183/* Input current limit in uA */ 184static const unsigned int icl_tbl[] = { 185 300000, 186 500000, 187 700000, 188 900000, 189 1200000, 190 1500000, 191 1800000, 192 2000000, 193 2200000, 194 2500000, 195}; 196 197/* Charge current compensation in uA */ 198static const unsigned int ccc_tbl[] = { 199 250000, 200 700000, 201 900000, 202 1200000, 203}; 204 205/* Convert register value to current using lookup table */ 206static int hw_to_current(const unsigned int *tbl, size_t size, unsigned int val) 207{ 208 if (val >= size) 209 return -EINVAL; 210 return tbl[val]; 211} 212 213/* Convert current to register value using lookup table */ 214static int current_to_hw(const unsigned int *tbl, size_t size, unsigned int val) 215{ 216 size_t i; 217 218 for (i = 0; i < size; i++) 219 if (val < tbl[i]) 220 break; 221 return i > 0 ? i - 1 : -EINVAL; 222} 223 224/** 225 * smb347_update_ps_status - refreshes the power source status 226 * @smb: pointer to smb347 charger instance 227 * 228 * Function checks whether any power source is connected to the charger and 229 * updates internal state accordingly. If there is a change to previous state 230 * function returns %1, otherwise %0 and negative errno in case of errror. 231 */ 232static int smb347_update_ps_status(struct smb347_charger *smb) 233{ 234 bool usb = false; 235 bool dc = false; 236 unsigned int val; 237 int ret; 238 239 ret = regmap_read(smb->regmap, IRQSTAT_E, &val); 240 if (ret < 0) 241 return ret; 242 243 /* 244 * Dc and usb are set depending on whether they are enabled in 245 * platform data _and_ whether corresponding undervoltage is set. 246 */ 247 if (smb->pdata->use_mains) 248 dc = !(val & IRQSTAT_E_DCIN_UV_STAT); 249 if (smb->pdata->use_usb) 250 usb = !(val & IRQSTAT_E_USBIN_UV_STAT); 251 252 mutex_lock(&smb->lock); 253 ret = smb->mains_online != dc || smb->usb_online != usb; 254 smb->mains_online = dc; 255 smb->usb_online = usb; 256 mutex_unlock(&smb->lock); 257 258 return ret; 259} 260 261/* 262 * smb347_is_ps_online - returns whether input power source is connected 263 * @smb: pointer to smb347 charger instance 264 * 265 * Returns %true if input power source is connected. Note that this is 266 * dependent on what platform has configured for usable power sources. For 267 * example if USB is disabled, this will return %false even if the USB cable 268 * is connected. 269 */ 270static bool smb347_is_ps_online(struct smb347_charger *smb) 271{ 272 bool ret; 273 274 mutex_lock(&smb->lock); 275 ret = smb->usb_online || smb->mains_online; 276 mutex_unlock(&smb->lock); 277 278 return ret; 279} 280 281/** 282 * smb347_charging_status - returns status of charging 283 * @smb: pointer to smb347 charger instance 284 * 285 * Function returns charging status. %0 means no charging is in progress, 286 * %1 means pre-charging, %2 fast-charging and %3 taper-charging. 287 */ 288static int smb347_charging_status(struct smb347_charger *smb) 289{ 290 unsigned int val; 291 int ret; 292 293 if (!smb347_is_ps_online(smb)) 294 return 0; 295 296 ret = regmap_read(smb->regmap, STAT_C, &val); 297 if (ret < 0) 298 return 0; 299 300 return (val & STAT_C_CHG_MASK) >> STAT_C_CHG_SHIFT; 301} 302 303static int smb347_charging_set(struct smb347_charger *smb, bool enable) 304{ 305 int ret = 0; 306 307 if (smb->pdata->enable_control != SMB347_CHG_ENABLE_SW) { 308 dev_dbg(smb->dev, "charging enable/disable in SW disabled\n"); 309 return 0; 310 } 311 312 mutex_lock(&smb->lock); 313 if (smb->charging_enabled != enable) { 314 ret = regmap_update_bits(smb->regmap, CMD_A, CMD_A_CHG_ENABLED, 315 enable ? CMD_A_CHG_ENABLED : 0); 316 if (!ret) 317 smb->charging_enabled = enable; 318 } 319 mutex_unlock(&smb->lock); 320 return ret; 321} 322 323static inline int smb347_charging_enable(struct smb347_charger *smb) 324{ 325 return smb347_charging_set(smb, true); 326} 327 328static inline int smb347_charging_disable(struct smb347_charger *smb) 329{ 330 return smb347_charging_set(smb, false); 331} 332 333static int smb347_start_stop_charging(struct smb347_charger *smb) 334{ 335 int ret; 336 337 /* 338 * Depending on whether valid power source is connected or not, we 339 * disable or enable the charging. We do it manually because it 340 * depends on how the platform has configured the valid inputs. 341 */ 342 if (smb347_is_ps_online(smb)) { 343 ret = smb347_charging_enable(smb); 344 if (ret < 0) 345 dev_err(smb->dev, "failed to enable charging\n"); 346 } else { 347 ret = smb347_charging_disable(smb); 348 if (ret < 0) 349 dev_err(smb->dev, "failed to disable charging\n"); 350 } 351 352 return ret; 353} 354 355static int smb347_set_charge_current(struct smb347_charger *smb) 356{ 357 int ret; 358 359 if (smb->pdata->max_charge_current) { 360 ret = current_to_hw(fcc_tbl, ARRAY_SIZE(fcc_tbl), 361 smb->pdata->max_charge_current); 362 if (ret < 0) 363 return ret; 364 365 ret = regmap_update_bits(smb->regmap, CFG_CHARGE_CURRENT, 366 CFG_CHARGE_CURRENT_FCC_MASK, 367 ret << CFG_CHARGE_CURRENT_FCC_SHIFT); 368 if (ret < 0) 369 return ret; 370 } 371 372 if (smb->pdata->pre_charge_current) { 373 ret = current_to_hw(pcc_tbl, ARRAY_SIZE(pcc_tbl), 374 smb->pdata->pre_charge_current); 375 if (ret < 0) 376 return ret; 377 378 ret = regmap_update_bits(smb->regmap, CFG_CHARGE_CURRENT, 379 CFG_CHARGE_CURRENT_PCC_MASK, 380 ret << CFG_CHARGE_CURRENT_PCC_SHIFT); 381 if (ret < 0) 382 return ret; 383 } 384 385 if (smb->pdata->termination_current) { 386 ret = current_to_hw(tc_tbl, ARRAY_SIZE(tc_tbl), 387 smb->pdata->termination_current); 388 if (ret < 0) 389 return ret; 390 391 ret = regmap_update_bits(smb->regmap, CFG_CHARGE_CURRENT, 392 CFG_CHARGE_CURRENT_TC_MASK, ret); 393 if (ret < 0) 394 return ret; 395 } 396 397 return 0; 398} 399 400static int smb347_set_current_limits(struct smb347_charger *smb) 401{ 402 int ret; 403 404 if (smb->pdata->mains_current_limit) { 405 ret = current_to_hw(icl_tbl, ARRAY_SIZE(icl_tbl), 406 smb->pdata->mains_current_limit); 407 if (ret < 0) 408 return ret; 409 410 ret = regmap_update_bits(smb->regmap, CFG_CURRENT_LIMIT, 411 CFG_CURRENT_LIMIT_DC_MASK, 412 ret << CFG_CURRENT_LIMIT_DC_SHIFT); 413 if (ret < 0) 414 return ret; 415 } 416 417 if (smb->pdata->usb_hc_current_limit) { 418 ret = current_to_hw(icl_tbl, ARRAY_SIZE(icl_tbl), 419 smb->pdata->usb_hc_current_limit); 420 if (ret < 0) 421 return ret; 422 423 ret = regmap_update_bits(smb->regmap, CFG_CURRENT_LIMIT, 424 CFG_CURRENT_LIMIT_USB_MASK, ret); 425 if (ret < 0) 426 return ret; 427 } 428 429 return 0; 430} 431 432static int smb347_set_voltage_limits(struct smb347_charger *smb) 433{ 434 int ret; 435 436 if (smb->pdata->pre_to_fast_voltage) { 437 ret = smb->pdata->pre_to_fast_voltage; 438 439 /* uV */ 440 ret = clamp_val(ret, 2400000, 3000000) - 2400000; 441 ret /= 200000; 442 443 ret = regmap_update_bits(smb->regmap, CFG_FLOAT_VOLTAGE, 444 CFG_FLOAT_VOLTAGE_THRESHOLD_MASK, 445 ret << CFG_FLOAT_VOLTAGE_THRESHOLD_SHIFT); 446 if (ret < 0) 447 return ret; 448 } 449 450 if (smb->pdata->max_charge_voltage) { 451 ret = smb->pdata->max_charge_voltage; 452 453 /* uV */ 454 ret = clamp_val(ret, 3500000, 4500000) - 3500000; 455 ret /= 20000; 456 457 ret = regmap_update_bits(smb->regmap, CFG_FLOAT_VOLTAGE, 458 CFG_FLOAT_VOLTAGE_FLOAT_MASK, ret); 459 if (ret < 0) 460 return ret; 461 } 462 463 return 0; 464} 465 466static int smb347_set_temp_limits(struct smb347_charger *smb) 467{ 468 bool enable_therm_monitor = false; 469 int ret = 0; 470 int val; 471 472 if (smb->pdata->chip_temp_threshold) { 473 val = smb->pdata->chip_temp_threshold; 474 475 /* degree C */ 476 val = clamp_val(val, 100, 130) - 100; 477 val /= 10; 478 479 ret = regmap_update_bits(smb->regmap, CFG_OTG, 480 CFG_OTG_TEMP_THRESHOLD_MASK, 481 val << CFG_OTG_TEMP_THRESHOLD_SHIFT); 482 if (ret < 0) 483 return ret; 484 } 485 486 if (smb->pdata->soft_cold_temp_limit != SMB347_TEMP_USE_DEFAULT) { 487 val = smb->pdata->soft_cold_temp_limit; 488 489 val = clamp_val(val, 0, 15); 490 val /= 5; 491 /* this goes from higher to lower so invert the value */ 492 val = ~val & 0x3; 493 494 ret = regmap_update_bits(smb->regmap, CFG_TEMP_LIMIT, 495 CFG_TEMP_LIMIT_SOFT_COLD_MASK, 496 val << CFG_TEMP_LIMIT_SOFT_COLD_SHIFT); 497 if (ret < 0) 498 return ret; 499 500 enable_therm_monitor = true; 501 } 502 503 if (smb->pdata->soft_hot_temp_limit != SMB347_TEMP_USE_DEFAULT) { 504 val = smb->pdata->soft_hot_temp_limit; 505 506 val = clamp_val(val, 40, 55) - 40; 507 val /= 5; 508 509 ret = regmap_update_bits(smb->regmap, CFG_TEMP_LIMIT, 510 CFG_TEMP_LIMIT_SOFT_HOT_MASK, 511 val << CFG_TEMP_LIMIT_SOFT_HOT_SHIFT); 512 if (ret < 0) 513 return ret; 514 515 enable_therm_monitor = true; 516 } 517 518 if (smb->pdata->hard_cold_temp_limit != SMB347_TEMP_USE_DEFAULT) { 519 val = smb->pdata->hard_cold_temp_limit; 520 521 val = clamp_val(val, -5, 10) + 5; 522 val /= 5; 523 /* this goes from higher to lower so invert the value */ 524 val = ~val & 0x3; 525 526 ret = regmap_update_bits(smb->regmap, CFG_TEMP_LIMIT, 527 CFG_TEMP_LIMIT_HARD_COLD_MASK, 528 val << CFG_TEMP_LIMIT_HARD_COLD_SHIFT); 529 if (ret < 0) 530 return ret; 531 532 enable_therm_monitor = true; 533 } 534 535 if (smb->pdata->hard_hot_temp_limit != SMB347_TEMP_USE_DEFAULT) { 536 val = smb->pdata->hard_hot_temp_limit; 537 538 val = clamp_val(val, 50, 65) - 50; 539 val /= 5; 540 541 ret = regmap_update_bits(smb->regmap, CFG_TEMP_LIMIT, 542 CFG_TEMP_LIMIT_HARD_HOT_MASK, 543 val << CFG_TEMP_LIMIT_HARD_HOT_SHIFT); 544 if (ret < 0) 545 return ret; 546 547 enable_therm_monitor = true; 548 } 549 550 /* 551 * If any of the temperature limits are set, we also enable the 552 * thermistor monitoring. 553 * 554 * When soft limits are hit, the device will start to compensate 555 * current and/or voltage depending on the configuration. 556 * 557 * When hard limit is hit, the device will suspend charging 558 * depending on the configuration. 559 */ 560 if (enable_therm_monitor) { 561 ret = regmap_update_bits(smb->regmap, CFG_THERM, 562 CFG_THERM_MONITOR_DISABLED, 0); 563 if (ret < 0) 564 return ret; 565 } 566 567 if (smb->pdata->suspend_on_hard_temp_limit) { 568 ret = regmap_update_bits(smb->regmap, CFG_SYSOK, 569 CFG_SYSOK_SUSPEND_HARD_LIMIT_DISABLED, 0); 570 if (ret < 0) 571 return ret; 572 } 573 574 if (smb->pdata->soft_temp_limit_compensation != 575 SMB347_SOFT_TEMP_COMPENSATE_DEFAULT) { 576 val = smb->pdata->soft_temp_limit_compensation & 0x3; 577 578 ret = regmap_update_bits(smb->regmap, CFG_THERM, 579 CFG_THERM_SOFT_HOT_COMPENSATION_MASK, 580 val << CFG_THERM_SOFT_HOT_COMPENSATION_SHIFT); 581 if (ret < 0) 582 return ret; 583 584 ret = regmap_update_bits(smb->regmap, CFG_THERM, 585 CFG_THERM_SOFT_COLD_COMPENSATION_MASK, 586 val << CFG_THERM_SOFT_COLD_COMPENSATION_SHIFT); 587 if (ret < 0) 588 return ret; 589 } 590 591 if (smb->pdata->charge_current_compensation) { 592 val = current_to_hw(ccc_tbl, ARRAY_SIZE(ccc_tbl), 593 smb->pdata->charge_current_compensation); 594 if (val < 0) 595 return val; 596 597 ret = regmap_update_bits(smb->regmap, CFG_OTG, 598 CFG_OTG_CC_COMPENSATION_MASK, 599 (val & 0x3) << CFG_OTG_CC_COMPENSATION_SHIFT); 600 if (ret < 0) 601 return ret; 602 } 603 604 return ret; 605} 606 607/* 608 * smb347_set_writable - enables/disables writing to non-volatile registers 609 * @smb: pointer to smb347 charger instance 610 * 611 * You can enable/disable writing to the non-volatile configuration 612 * registers by calling this function. 613 * 614 * Returns %0 on success and negative errno in case of failure. 615 */ 616static int smb347_set_writable(struct smb347_charger *smb, bool writable) 617{ 618 return regmap_update_bits(smb->regmap, CMD_A, CMD_A_ALLOW_WRITE, 619 writable ? CMD_A_ALLOW_WRITE : 0); 620} 621 622static int smb347_hw_init(struct smb347_charger *smb) 623{ 624 unsigned int val; 625 int ret; 626 627 ret = smb347_set_writable(smb, true); 628 if (ret < 0) 629 return ret; 630 631 /* 632 * Program the platform specific configuration values to the device 633 * first. 634 */ 635 ret = smb347_set_charge_current(smb); 636 if (ret < 0) 637 goto fail; 638 639 ret = smb347_set_current_limits(smb); 640 if (ret < 0) 641 goto fail; 642 643 ret = smb347_set_voltage_limits(smb); 644 if (ret < 0) 645 goto fail; 646 647 ret = smb347_set_temp_limits(smb); 648 if (ret < 0) 649 goto fail; 650 651 /* If USB charging is disabled we put the USB in suspend mode */ 652 if (!smb->pdata->use_usb) { 653 ret = regmap_update_bits(smb->regmap, CMD_A, 654 CMD_A_SUSPEND_ENABLED, 655 CMD_A_SUSPEND_ENABLED); 656 if (ret < 0) 657 goto fail; 658 } 659 660 /* 661 * If configured by platform data, we enable hardware Auto-OTG 662 * support for driving VBUS. Otherwise we disable it. 663 */ 664 ret = regmap_update_bits(smb->regmap, CFG_OTHER, CFG_OTHER_RID_MASK, 665 smb->pdata->use_usb_otg ? CFG_OTHER_RID_ENABLED_AUTO_OTG : 0); 666 if (ret < 0) 667 goto fail; 668 669 /* 670 * Make the charging functionality controllable by a write to the 671 * command register unless pin control is specified in the platform 672 * data. 673 */ 674 switch (smb->pdata->enable_control) { 675 case SMB347_CHG_ENABLE_PIN_ACTIVE_LOW: 676 val = CFG_PIN_EN_CTRL_ACTIVE_LOW; 677 break; 678 case SMB347_CHG_ENABLE_PIN_ACTIVE_HIGH: 679 val = CFG_PIN_EN_CTRL_ACTIVE_HIGH; 680 break; 681 default: 682 val = 0; 683 break; 684 } 685 686 ret = regmap_update_bits(smb->regmap, CFG_PIN, CFG_PIN_EN_CTRL_MASK, 687 val); 688 if (ret < 0) 689 goto fail; 690 691 /* Disable Automatic Power Source Detection (APSD) interrupt. */ 692 ret = regmap_update_bits(smb->regmap, CFG_PIN, CFG_PIN_EN_APSD_IRQ, 0); 693 if (ret < 0) 694 goto fail; 695 696 ret = smb347_update_ps_status(smb); 697 if (ret < 0) 698 goto fail; 699 700 ret = smb347_start_stop_charging(smb); 701 702fail: 703 smb347_set_writable(smb, false); 704 return ret; 705} 706 707static irqreturn_t smb347_interrupt(int irq, void *data) 708{ 709 struct smb347_charger *smb = data; 710 unsigned int stat_c, irqstat_c, irqstat_d, irqstat_e; 711 bool handled = false; 712 int ret; 713 714 ret = regmap_read(smb->regmap, STAT_C, &stat_c); 715 if (ret < 0) { 716 dev_warn(smb->dev, "reading STAT_C failed\n"); 717 return IRQ_NONE; 718 } 719 720 ret = regmap_read(smb->regmap, IRQSTAT_C, &irqstat_c); 721 if (ret < 0) { 722 dev_warn(smb->dev, "reading IRQSTAT_C failed\n"); 723 return IRQ_NONE; 724 } 725 726 ret = regmap_read(smb->regmap, IRQSTAT_D, &irqstat_d); 727 if (ret < 0) { 728 dev_warn(smb->dev, "reading IRQSTAT_D failed\n"); 729 return IRQ_NONE; 730 } 731 732 ret = regmap_read(smb->regmap, IRQSTAT_E, &irqstat_e); 733 if (ret < 0) { 734 dev_warn(smb->dev, "reading IRQSTAT_E failed\n"); 735 return IRQ_NONE; 736 } 737 738 /* 739 * If we get charger error we report the error back to user. 740 * If the error is recovered charging will resume again. 741 */ 742 if (stat_c & STAT_C_CHARGER_ERROR) { 743 dev_err(smb->dev, "charging stopped due to charger error\n"); 744 power_supply_changed(smb->battery); 745 handled = true; 746 } 747 748 /* 749 * If we reached the termination current the battery is charged and 750 * we can update the status now. Charging is automatically 751 * disabled by the hardware. 752 */ 753 if (irqstat_c & (IRQSTAT_C_TERMINATION_IRQ | IRQSTAT_C_TAPER_IRQ)) { 754 if (irqstat_c & IRQSTAT_C_TERMINATION_STAT) 755 power_supply_changed(smb->battery); 756 dev_dbg(smb->dev, "going to HW maintenance mode\n"); 757 handled = true; 758 } 759 760 /* 761 * If we got a charger timeout INT that means the charge 762 * full is not detected with in charge timeout value. 763 */ 764 if (irqstat_d & IRQSTAT_D_CHARGE_TIMEOUT_IRQ) { 765 dev_dbg(smb->dev, "total Charge Timeout INT received\n"); 766 767 if (irqstat_d & IRQSTAT_D_CHARGE_TIMEOUT_STAT) 768 dev_warn(smb->dev, "charging stopped due to timeout\n"); 769 power_supply_changed(smb->battery); 770 handled = true; 771 } 772 773 /* 774 * If we got an under voltage interrupt it means that AC/USB input 775 * was connected or disconnected. 776 */ 777 if (irqstat_e & (IRQSTAT_E_USBIN_UV_IRQ | IRQSTAT_E_DCIN_UV_IRQ)) { 778 if (smb347_update_ps_status(smb) > 0) { 779 smb347_start_stop_charging(smb); 780 if (smb->pdata->use_mains) 781 power_supply_changed(smb->mains); 782 if (smb->pdata->use_usb) 783 power_supply_changed(smb->usb); 784 } 785 handled = true; 786 } 787 788 return handled ? IRQ_HANDLED : IRQ_NONE; 789} 790 791static int smb347_irq_set(struct smb347_charger *smb, bool enable) 792{ 793 int ret; 794 795 ret = smb347_set_writable(smb, true); 796 if (ret < 0) 797 return ret; 798 799 /* 800 * Enable/disable interrupts for: 801 * - under voltage 802 * - termination current reached 803 * - charger timeout 804 * - charger error 805 */ 806 ret = regmap_update_bits(smb->regmap, CFG_FAULT_IRQ, 0xff, 807 enable ? CFG_FAULT_IRQ_DCIN_UV : 0); 808 if (ret < 0) 809 goto fail; 810 811 ret = regmap_update_bits(smb->regmap, CFG_STATUS_IRQ, 0xff, 812 enable ? (CFG_STATUS_IRQ_TERMINATION_OR_TAPER | 813 CFG_STATUS_IRQ_CHARGE_TIMEOUT) : 0); 814 if (ret < 0) 815 goto fail; 816 817 ret = regmap_update_bits(smb->regmap, CFG_PIN, CFG_PIN_EN_CHARGER_ERROR, 818 enable ? CFG_PIN_EN_CHARGER_ERROR : 0); 819fail: 820 smb347_set_writable(smb, false); 821 return ret; 822} 823 824static inline int smb347_irq_enable(struct smb347_charger *smb) 825{ 826 return smb347_irq_set(smb, true); 827} 828 829static inline int smb347_irq_disable(struct smb347_charger *smb) 830{ 831 return smb347_irq_set(smb, false); 832} 833 834static int smb347_irq_init(struct smb347_charger *smb, 835 struct i2c_client *client) 836{ 837 const struct smb347_charger_platform_data *pdata = smb->pdata; 838 int ret, irq = gpio_to_irq(pdata->irq_gpio); 839 840 ret = gpio_request_one(pdata->irq_gpio, GPIOF_IN, client->name); 841 if (ret < 0) 842 goto fail; 843 844 ret = request_threaded_irq(irq, NULL, smb347_interrupt, 845 IRQF_TRIGGER_FALLING | IRQF_ONESHOT, 846 client->name, smb); 847 if (ret < 0) 848 goto fail_gpio; 849 850 ret = smb347_set_writable(smb, true); 851 if (ret < 0) 852 goto fail_irq; 853 854 /* 855 * Configure the STAT output to be suitable for interrupts: disable 856 * all other output (except interrupts) and make it active low. 857 */ 858 ret = regmap_update_bits(smb->regmap, CFG_STAT, 859 CFG_STAT_ACTIVE_HIGH | CFG_STAT_DISABLED, 860 CFG_STAT_DISABLED); 861 if (ret < 0) 862 goto fail_readonly; 863 864 smb347_set_writable(smb, false); 865 client->irq = irq; 866 return 0; 867 868fail_readonly: 869 smb347_set_writable(smb, false); 870fail_irq: 871 free_irq(irq, smb); 872fail_gpio: 873 gpio_free(pdata->irq_gpio); 874fail: 875 client->irq = 0; 876 return ret; 877} 878 879/* 880 * Returns the constant charge current programmed 881 * into the charger in uA. 882 */ 883static int get_const_charge_current(struct smb347_charger *smb) 884{ 885 int ret, intval; 886 unsigned int v; 887 888 if (!smb347_is_ps_online(smb)) 889 return -ENODATA; 890 891 ret = regmap_read(smb->regmap, STAT_B, &v); 892 if (ret < 0) 893 return ret; 894 895 /* 896 * The current value is composition of FCC and PCC values 897 * and we can detect which table to use from bit 5. 898 */ 899 if (v & 0x20) { 900 intval = hw_to_current(fcc_tbl, ARRAY_SIZE(fcc_tbl), v & 7); 901 } else { 902 v >>= 3; 903 intval = hw_to_current(pcc_tbl, ARRAY_SIZE(pcc_tbl), v & 7); 904 } 905 906 return intval; 907} 908 909/* 910 * Returns the constant charge voltage programmed 911 * into the charger in uV. 912 */ 913static int get_const_charge_voltage(struct smb347_charger *smb) 914{ 915 int ret, intval; 916 unsigned int v; 917 918 if (!smb347_is_ps_online(smb)) 919 return -ENODATA; 920 921 ret = regmap_read(smb->regmap, STAT_A, &v); 922 if (ret < 0) 923 return ret; 924 925 v &= STAT_A_FLOAT_VOLTAGE_MASK; 926 if (v > 0x3d) 927 v = 0x3d; 928 929 intval = 3500000 + v * 20000; 930 931 return intval; 932} 933 934static int smb347_mains_get_property(struct power_supply *psy, 935 enum power_supply_property prop, 936 union power_supply_propval *val) 937{ 938 struct smb347_charger *smb = power_supply_get_drvdata(psy); 939 int ret; 940 941 switch (prop) { 942 case POWER_SUPPLY_PROP_ONLINE: 943 val->intval = smb->mains_online; 944 break; 945 946 case POWER_SUPPLY_PROP_CONSTANT_CHARGE_VOLTAGE: 947 ret = get_const_charge_voltage(smb); 948 if (ret < 0) 949 return ret; 950 else 951 val->intval = ret; 952 break; 953 954 case POWER_SUPPLY_PROP_CONSTANT_CHARGE_CURRENT: 955 ret = get_const_charge_current(smb); 956 if (ret < 0) 957 return ret; 958 else 959 val->intval = ret; 960 break; 961 962 default: 963 return -EINVAL; 964 } 965 966 return 0; 967} 968 969static enum power_supply_property smb347_mains_properties[] = { 970 POWER_SUPPLY_PROP_ONLINE, 971 POWER_SUPPLY_PROP_CONSTANT_CHARGE_CURRENT, 972 POWER_SUPPLY_PROP_CONSTANT_CHARGE_VOLTAGE, 973}; 974 975static int smb347_usb_get_property(struct power_supply *psy, 976 enum power_supply_property prop, 977 union power_supply_propval *val) 978{ 979 struct smb347_charger *smb = power_supply_get_drvdata(psy); 980 int ret; 981 982 switch (prop) { 983 case POWER_SUPPLY_PROP_ONLINE: 984 val->intval = smb->usb_online; 985 break; 986 987 case POWER_SUPPLY_PROP_CONSTANT_CHARGE_VOLTAGE: 988 ret = get_const_charge_voltage(smb); 989 if (ret < 0) 990 return ret; 991 else 992 val->intval = ret; 993 break; 994 995 case POWER_SUPPLY_PROP_CONSTANT_CHARGE_CURRENT: 996 ret = get_const_charge_current(smb); 997 if (ret < 0) 998 return ret; 999 else 1000 val->intval = ret; 1001 break; 1002 1003 default: 1004 return -EINVAL; 1005 } 1006 1007 return 0; 1008} 1009 1010static enum power_supply_property smb347_usb_properties[] = { 1011 POWER_SUPPLY_PROP_ONLINE, 1012 POWER_SUPPLY_PROP_CONSTANT_CHARGE_CURRENT, 1013 POWER_SUPPLY_PROP_CONSTANT_CHARGE_VOLTAGE, 1014}; 1015 1016static int smb347_get_charging_status(struct smb347_charger *smb) 1017{ 1018 int ret, status; 1019 unsigned int val; 1020 1021 if (!smb347_is_ps_online(smb)) 1022 return POWER_SUPPLY_STATUS_DISCHARGING; 1023 1024 ret = regmap_read(smb->regmap, STAT_C, &val); 1025 if (ret < 0) 1026 return ret; 1027 1028 if ((val & STAT_C_CHARGER_ERROR) || 1029 (val & STAT_C_HOLDOFF_STAT)) { 1030 /* 1031 * set to NOT CHARGING upon charger error 1032 * or charging has stopped. 1033 */ 1034 status = POWER_SUPPLY_STATUS_NOT_CHARGING; 1035 } else { 1036 if ((val & STAT_C_CHG_MASK) >> STAT_C_CHG_SHIFT) { 1037 /* 1038 * set to charging if battery is in pre-charge, 1039 * fast charge or taper charging mode. 1040 */ 1041 status = POWER_SUPPLY_STATUS_CHARGING; 1042 } else if (val & STAT_C_CHG_TERM) { 1043 /* 1044 * set the status to FULL if battery is not in pre 1045 * charge, fast charge or taper charging mode AND 1046 * charging is terminated at least once. 1047 */ 1048 status = POWER_SUPPLY_STATUS_FULL; 1049 } else { 1050 /* 1051 * in this case no charger error or termination 1052 * occured but charging is not in progress!!! 1053 */ 1054 status = POWER_SUPPLY_STATUS_NOT_CHARGING; 1055 } 1056 } 1057 1058 return status; 1059} 1060 1061static int smb347_battery_get_property(struct power_supply *psy, 1062 enum power_supply_property prop, 1063 union power_supply_propval *val) 1064{ 1065 struct smb347_charger *smb = power_supply_get_drvdata(psy); 1066 const struct smb347_charger_platform_data *pdata = smb->pdata; 1067 int ret; 1068 1069 ret = smb347_update_ps_status(smb); 1070 if (ret < 0) 1071 return ret; 1072 1073 switch (prop) { 1074 case POWER_SUPPLY_PROP_STATUS: 1075 ret = smb347_get_charging_status(smb); 1076 if (ret < 0) 1077 return ret; 1078 val->intval = ret; 1079 break; 1080 1081 case POWER_SUPPLY_PROP_CHARGE_TYPE: 1082 if (!smb347_is_ps_online(smb)) 1083 return -ENODATA; 1084 1085 /* 1086 * We handle trickle and pre-charging the same, and taper 1087 * and none the same. 1088 */ 1089 switch (smb347_charging_status(smb)) { 1090 case 1: 1091 val->intval = POWER_SUPPLY_CHARGE_TYPE_TRICKLE; 1092 break; 1093 case 2: 1094 val->intval = POWER_SUPPLY_CHARGE_TYPE_FAST; 1095 break; 1096 default: 1097 val->intval = POWER_SUPPLY_CHARGE_TYPE_NONE; 1098 break; 1099 } 1100 break; 1101 1102 case POWER_SUPPLY_PROP_TECHNOLOGY: 1103 val->intval = pdata->battery_info.technology; 1104 break; 1105 1106 case POWER_SUPPLY_PROP_VOLTAGE_MIN_DESIGN: 1107 val->intval = pdata->battery_info.voltage_min_design; 1108 break; 1109 1110 case POWER_SUPPLY_PROP_VOLTAGE_MAX_DESIGN: 1111 val->intval = pdata->battery_info.voltage_max_design; 1112 break; 1113 1114 case POWER_SUPPLY_PROP_CHARGE_FULL_DESIGN: 1115 val->intval = pdata->battery_info.charge_full_design; 1116 break; 1117 1118 case POWER_SUPPLY_PROP_MODEL_NAME: 1119 val->strval = pdata->battery_info.name; 1120 break; 1121 1122 default: 1123 return -EINVAL; 1124 } 1125 1126 return 0; 1127} 1128 1129static enum power_supply_property smb347_battery_properties[] = { 1130 POWER_SUPPLY_PROP_STATUS, 1131 POWER_SUPPLY_PROP_CHARGE_TYPE, 1132 POWER_SUPPLY_PROP_TECHNOLOGY, 1133 POWER_SUPPLY_PROP_VOLTAGE_MIN_DESIGN, 1134 POWER_SUPPLY_PROP_VOLTAGE_MAX_DESIGN, 1135 POWER_SUPPLY_PROP_CHARGE_FULL_DESIGN, 1136 POWER_SUPPLY_PROP_MODEL_NAME, 1137}; 1138 1139static bool smb347_volatile_reg(struct device *dev, unsigned int reg) 1140{ 1141 switch (reg) { 1142 case IRQSTAT_A: 1143 case IRQSTAT_C: 1144 case IRQSTAT_E: 1145 case IRQSTAT_F: 1146 case STAT_A: 1147 case STAT_B: 1148 case STAT_C: 1149 case STAT_E: 1150 return true; 1151 } 1152 1153 return false; 1154} 1155 1156static bool smb347_readable_reg(struct device *dev, unsigned int reg) 1157{ 1158 switch (reg) { 1159 case CFG_CHARGE_CURRENT: 1160 case CFG_CURRENT_LIMIT: 1161 case CFG_FLOAT_VOLTAGE: 1162 case CFG_STAT: 1163 case CFG_PIN: 1164 case CFG_THERM: 1165 case CFG_SYSOK: 1166 case CFG_OTHER: 1167 case CFG_OTG: 1168 case CFG_TEMP_LIMIT: 1169 case CFG_FAULT_IRQ: 1170 case CFG_STATUS_IRQ: 1171 case CFG_ADDRESS: 1172 case CMD_A: 1173 case CMD_B: 1174 case CMD_C: 1175 return true; 1176 } 1177 1178 return smb347_volatile_reg(dev, reg); 1179} 1180 1181static const struct regmap_config smb347_regmap = { 1182 .reg_bits = 8, 1183 .val_bits = 8, 1184 .max_register = SMB347_MAX_REGISTER, 1185 .volatile_reg = smb347_volatile_reg, 1186 .readable_reg = smb347_readable_reg, 1187}; 1188 1189static const struct power_supply_desc smb347_mains_desc = { 1190 .name = "smb347-mains", 1191 .type = POWER_SUPPLY_TYPE_MAINS, 1192 .get_property = smb347_mains_get_property, 1193 .properties = smb347_mains_properties, 1194 .num_properties = ARRAY_SIZE(smb347_mains_properties), 1195}; 1196 1197static const struct power_supply_desc smb347_usb_desc = { 1198 .name = "smb347-usb", 1199 .type = POWER_SUPPLY_TYPE_USB, 1200 .get_property = smb347_usb_get_property, 1201 .properties = smb347_usb_properties, 1202 .num_properties = ARRAY_SIZE(smb347_usb_properties), 1203}; 1204 1205static const struct power_supply_desc smb347_battery_desc = { 1206 .name = "smb347-battery", 1207 .type = POWER_SUPPLY_TYPE_BATTERY, 1208 .get_property = smb347_battery_get_property, 1209 .properties = smb347_battery_properties, 1210 .num_properties = ARRAY_SIZE(smb347_battery_properties), 1211}; 1212 1213static int smb347_probe(struct i2c_client *client, 1214 const struct i2c_device_id *id) 1215{ 1216 static char *battery[] = { "smb347-battery" }; 1217 const struct smb347_charger_platform_data *pdata; 1218 struct power_supply_config mains_usb_cfg = {}, battery_cfg = {}; 1219 struct device *dev = &client->dev; 1220 struct smb347_charger *smb; 1221 int ret; 1222 1223 pdata = dev->platform_data; 1224 if (!pdata) 1225 return -EINVAL; 1226 1227 if (!pdata->use_mains && !pdata->use_usb) 1228 return -EINVAL; 1229 1230 smb = devm_kzalloc(dev, sizeof(*smb), GFP_KERNEL); 1231 if (!smb) 1232 return -ENOMEM; 1233 1234 i2c_set_clientdata(client, smb); 1235 1236 mutex_init(&smb->lock); 1237 smb->dev = &client->dev; 1238 smb->pdata = pdata; 1239 1240 smb->regmap = devm_regmap_init_i2c(client, &smb347_regmap); 1241 if (IS_ERR(smb->regmap)) 1242 return PTR_ERR(smb->regmap); 1243 1244 ret = smb347_hw_init(smb); 1245 if (ret < 0) 1246 return ret; 1247 1248 mains_usb_cfg.supplied_to = battery; 1249 mains_usb_cfg.num_supplicants = ARRAY_SIZE(battery); 1250 mains_usb_cfg.drv_data = smb; 1251 if (smb->pdata->use_mains) { 1252 smb->mains = power_supply_register(dev, &smb347_mains_desc, 1253 &mains_usb_cfg); 1254 if (IS_ERR(smb->mains)) 1255 return PTR_ERR(smb->mains); 1256 } 1257 1258 if (smb->pdata->use_usb) { 1259 smb->usb = power_supply_register(dev, &smb347_usb_desc, 1260 &mains_usb_cfg); 1261 if (IS_ERR(smb->usb)) { 1262 if (smb->pdata->use_mains) 1263 power_supply_unregister(smb->mains); 1264 return PTR_ERR(smb->usb); 1265 } 1266 } 1267 1268 battery_cfg.drv_data = smb; 1269 smb->battery = power_supply_register(dev, &smb347_battery_desc, 1270 &battery_cfg); 1271 if (IS_ERR(smb->battery)) { 1272 if (smb->pdata->use_usb) 1273 power_supply_unregister(smb->usb); 1274 if (smb->pdata->use_mains) 1275 power_supply_unregister(smb->mains); 1276 return PTR_ERR(smb->battery); 1277 } 1278 1279 /* 1280 * Interrupt pin is optional. If it is connected, we setup the 1281 * interrupt support here. 1282 */ 1283 if (pdata->irq_gpio >= 0) { 1284 ret = smb347_irq_init(smb, client); 1285 if (ret < 0) { 1286 dev_warn(dev, "failed to initialize IRQ: %d\n", ret); 1287 dev_warn(dev, "disabling IRQ support\n"); 1288 } else { 1289 smb347_irq_enable(smb); 1290 } 1291 } 1292 1293 return 0; 1294} 1295 1296static int smb347_remove(struct i2c_client *client) 1297{ 1298 struct smb347_charger *smb = i2c_get_clientdata(client); 1299 1300 if (client->irq) { 1301 smb347_irq_disable(smb); 1302 free_irq(client->irq, smb); 1303 gpio_free(smb->pdata->irq_gpio); 1304 } 1305 1306 power_supply_unregister(smb->battery); 1307 if (smb->pdata->use_usb) 1308 power_supply_unregister(smb->usb); 1309 if (smb->pdata->use_mains) 1310 power_supply_unregister(smb->mains); 1311 return 0; 1312} 1313 1314static const struct i2c_device_id smb347_id[] = { 1315 { "smb347", 0 }, 1316 { } 1317}; 1318MODULE_DEVICE_TABLE(i2c, smb347_id); 1319 1320static struct i2c_driver smb347_driver = { 1321 .driver = { 1322 .name = "smb347", 1323 }, 1324 .probe = smb347_probe, 1325 .remove = smb347_remove, 1326 .id_table = smb347_id, 1327}; 1328 1329module_i2c_driver(smb347_driver); 1330 1331MODULE_AUTHOR("Bruce E. Robertson <bruce.e.robertson@intel.com>"); 1332MODULE_AUTHOR("Mika Westerberg <mika.westerberg@linux.intel.com>"); 1333MODULE_DESCRIPTION("SMB347 battery charger driver"); 1334MODULE_LICENSE("GPL"); 1335MODULE_ALIAS("i2c:smb347"); 1336