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

Configure Feed

Select the types of activity you want to include in your feed.

at v5.11-rc6 1249 lines 30 kB view raw
1// SPDX-License-Identifier: GPL-2.0-only 2/* 3 * Copyright 2012 ST Ericsson. 4 * 5 * Power supply driver for ST Ericsson pm2xxx_charger charger 6 */ 7 8#include <linux/init.h> 9#include <linux/module.h> 10#include <linux/device.h> 11#include <linux/interrupt.h> 12#include <linux/delay.h> 13#include <linux/slab.h> 14#include <linux/platform_device.h> 15#include <linux/power_supply.h> 16#include <linux/regulator/consumer.h> 17#include <linux/err.h> 18#include <linux/i2c.h> 19#include <linux/workqueue.h> 20#include <linux/mfd/abx500/ab8500.h> 21#include <linux/mfd/abx500/ab8500-bm.h> 22#include <linux/mfd/abx500/ux500_chargalg.h> 23#include <linux/pm2301_charger.h> 24#include <linux/gpio.h> 25#include <linux/pm_runtime.h> 26#include <linux/pm.h> 27 28#include "pm2301_charger.h" 29 30#define to_pm2xxx_charger_ac_device_info(x) container_of((x), \ 31 struct pm2xxx_charger, ac_chg) 32#define SLEEP_MIN 50 33#define SLEEP_MAX 100 34#define PM2XXX_AUTOSUSPEND_DELAY 500 35 36static int pm2xxx_interrupt_registers[] = { 37 PM2XXX_REG_INT1, 38 PM2XXX_REG_INT2, 39 PM2XXX_REG_INT3, 40 PM2XXX_REG_INT4, 41 PM2XXX_REG_INT5, 42 PM2XXX_REG_INT6, 43}; 44 45static enum power_supply_property pm2xxx_charger_ac_props[] = { 46 POWER_SUPPLY_PROP_HEALTH, 47 POWER_SUPPLY_PROP_PRESENT, 48 POWER_SUPPLY_PROP_ONLINE, 49 POWER_SUPPLY_PROP_VOLTAGE_AVG, 50}; 51 52static int pm2xxx_charger_voltage_map[] = { 53 3500, 54 3525, 55 3550, 56 3575, 57 3600, 58 3625, 59 3650, 60 3675, 61 3700, 62 3725, 63 3750, 64 3775, 65 3800, 66 3825, 67 3850, 68 3875, 69 3900, 70 3925, 71 3950, 72 3975, 73 4000, 74 4025, 75 4050, 76 4075, 77 4100, 78 4125, 79 4150, 80 4175, 81 4200, 82 4225, 83 4250, 84 4275, 85 4300, 86}; 87 88static int pm2xxx_charger_current_map[] = { 89 200, 90 200, 91 400, 92 600, 93 800, 94 1000, 95 1200, 96 1400, 97 1600, 98 1800, 99 2000, 100 2200, 101 2400, 102 2600, 103 2800, 104 3000, 105}; 106 107static void set_lpn_pin(struct pm2xxx_charger *pm2) 108{ 109 if (!pm2->ac.charger_connected && gpio_is_valid(pm2->lpn_pin)) { 110 gpio_set_value(pm2->lpn_pin, 1); 111 usleep_range(SLEEP_MIN, SLEEP_MAX); 112 } 113} 114 115static void clear_lpn_pin(struct pm2xxx_charger *pm2) 116{ 117 if (!pm2->ac.charger_connected && gpio_is_valid(pm2->lpn_pin)) 118 gpio_set_value(pm2->lpn_pin, 0); 119} 120 121static int pm2xxx_reg_read(struct pm2xxx_charger *pm2, int reg, u8 *val) 122{ 123 int ret; 124 125 /* wake up the device */ 126 pm_runtime_get_sync(pm2->dev); 127 128 ret = i2c_smbus_read_i2c_block_data(pm2->config.pm2xxx_i2c, reg, 129 1, val); 130 if (ret < 0) 131 dev_err(pm2->dev, "Error reading register at 0x%x\n", reg); 132 else 133 ret = 0; 134 135 pm_runtime_put_sync(pm2->dev); 136 137 return ret; 138} 139 140static int pm2xxx_reg_write(struct pm2xxx_charger *pm2, int reg, u8 val) 141{ 142 int ret; 143 144 /* wake up the device */ 145 pm_runtime_get_sync(pm2->dev); 146 147 ret = i2c_smbus_write_i2c_block_data(pm2->config.pm2xxx_i2c, reg, 148 1, &val); 149 if (ret < 0) 150 dev_err(pm2->dev, "Error writing register at 0x%x\n", reg); 151 else 152 ret = 0; 153 154 pm_runtime_put_sync(pm2->dev); 155 156 return ret; 157} 158 159static int pm2xxx_charging_enable_mngt(struct pm2xxx_charger *pm2) 160{ 161 int ret; 162 163 /* Enable charging */ 164 ret = pm2xxx_reg_write(pm2, PM2XXX_BATT_CTRL_REG2, 165 (PM2XXX_CH_AUTO_RESUME_EN | PM2XXX_CHARGER_ENA)); 166 167 return ret; 168} 169 170static int pm2xxx_charging_disable_mngt(struct pm2xxx_charger *pm2) 171{ 172 int ret; 173 174 /* Disable SW EOC ctrl */ 175 ret = pm2xxx_reg_write(pm2, PM2XXX_SW_CTRL_REG, PM2XXX_SWCTRL_HW); 176 if (ret < 0) { 177 dev_err(pm2->dev, "%s pm2xxx write failed\n", __func__); 178 return ret; 179 } 180 181 /* Disable charging */ 182 ret = pm2xxx_reg_write(pm2, PM2XXX_BATT_CTRL_REG2, 183 (PM2XXX_CH_AUTO_RESUME_DIS | PM2XXX_CHARGER_DIS)); 184 if (ret < 0) { 185 dev_err(pm2->dev, "%s pm2xxx write failed\n", __func__); 186 return ret; 187 } 188 189 return 0; 190} 191 192static int pm2xxx_charger_batt_therm_mngt(struct pm2xxx_charger *pm2, int val) 193{ 194 queue_work(pm2->charger_wq, &pm2->check_main_thermal_prot_work); 195 196 return 0; 197} 198 199 200static int pm2xxx_charger_die_therm_mngt(struct pm2xxx_charger *pm2, int val) 201{ 202 queue_work(pm2->charger_wq, &pm2->check_main_thermal_prot_work); 203 204 return 0; 205} 206 207static int pm2xxx_charger_ovv_mngt(struct pm2xxx_charger *pm2, int val) 208{ 209 dev_err(pm2->dev, "Overvoltage detected\n"); 210 pm2->flags.ovv = true; 211 power_supply_changed(pm2->ac_chg.psy); 212 213 /* Schedule a new HW failure check */ 214 queue_delayed_work(pm2->charger_wq, &pm2->check_hw_failure_work, 0); 215 216 return 0; 217} 218 219static int pm2xxx_charger_wd_exp_mngt(struct pm2xxx_charger *pm2, int val) 220{ 221 dev_dbg(pm2->dev , "20 minutes watchdog expired\n"); 222 223 pm2->ac.wd_expired = true; 224 power_supply_changed(pm2->ac_chg.psy); 225 226 return 0; 227} 228 229static int pm2xxx_charger_vbat_lsig_mngt(struct pm2xxx_charger *pm2, int val) 230{ 231 int ret; 232 233 switch (val) { 234 case PM2XXX_INT1_ITVBATLOWR: 235 dev_dbg(pm2->dev, "VBAT grows above VBAT_LOW level\n"); 236 /* Enable SW EOC ctrl */ 237 ret = pm2xxx_reg_write(pm2, PM2XXX_SW_CTRL_REG, 238 PM2XXX_SWCTRL_SW); 239 if (ret < 0) { 240 dev_err(pm2->dev, "%s pm2xxx write failed\n", __func__); 241 return ret; 242 } 243 break; 244 245 case PM2XXX_INT1_ITVBATLOWF: 246 dev_dbg(pm2->dev, "VBAT drops below VBAT_LOW level\n"); 247 /* Disable SW EOC ctrl */ 248 ret = pm2xxx_reg_write(pm2, PM2XXX_SW_CTRL_REG, 249 PM2XXX_SWCTRL_HW); 250 if (ret < 0) { 251 dev_err(pm2->dev, "%s pm2xxx write failed\n", __func__); 252 return ret; 253 } 254 break; 255 256 default: 257 dev_err(pm2->dev, "Unknown VBAT level\n"); 258 } 259 260 return 0; 261} 262 263static int pm2xxx_charger_bat_disc_mngt(struct pm2xxx_charger *pm2, int val) 264{ 265 dev_dbg(pm2->dev, "battery disconnected\n"); 266 267 return 0; 268} 269 270static int pm2xxx_charger_detection(struct pm2xxx_charger *pm2, u8 *val) 271{ 272 int ret; 273 274 ret = pm2xxx_reg_read(pm2, PM2XXX_SRCE_REG_INT2, val); 275 276 if (ret < 0) { 277 dev_err(pm2->dev, "Charger detection failed\n"); 278 goto out; 279 } 280 281 *val &= (PM2XXX_INT2_S_ITVPWR1PLUG | PM2XXX_INT2_S_ITVPWR2PLUG); 282 283out: 284 return ret; 285} 286 287static int pm2xxx_charger_itv_pwr_plug_mngt(struct pm2xxx_charger *pm2, int val) 288{ 289 290 int ret; 291 u8 read_val; 292 293 /* 294 * Since we can't be sure that the events are received 295 * synchronously, we have the check if the main charger is 296 * connected by reading the interrupt source register. 297 */ 298 ret = pm2xxx_charger_detection(pm2, &read_val); 299 300 if ((ret == 0) && read_val) { 301 pm2->ac.charger_connected = 1; 302 pm2->ac_conn = true; 303 queue_work(pm2->charger_wq, &pm2->ac_work); 304 } 305 306 307 return ret; 308} 309 310static int pm2xxx_charger_itv_pwr_unplug_mngt(struct pm2xxx_charger *pm2, 311 int val) 312{ 313 pm2->ac.charger_connected = 0; 314 queue_work(pm2->charger_wq, &pm2->ac_work); 315 316 return 0; 317} 318 319static int pm2_int_reg0(void *pm2_data, int val) 320{ 321 struct pm2xxx_charger *pm2 = pm2_data; 322 int ret = 0; 323 324 if (val & PM2XXX_INT1_ITVBATLOWR) { 325 ret = pm2xxx_charger_vbat_lsig_mngt(pm2, 326 PM2XXX_INT1_ITVBATLOWR); 327 if (ret < 0) 328 goto out; 329 } 330 331 if (val & PM2XXX_INT1_ITVBATLOWF) { 332 ret = pm2xxx_charger_vbat_lsig_mngt(pm2, 333 PM2XXX_INT1_ITVBATLOWF); 334 if (ret < 0) 335 goto out; 336 } 337 338 if (val & PM2XXX_INT1_ITVBATDISCONNECT) { 339 ret = pm2xxx_charger_bat_disc_mngt(pm2, 340 PM2XXX_INT1_ITVBATDISCONNECT); 341 if (ret < 0) 342 goto out; 343 } 344out: 345 return ret; 346} 347 348static int pm2_int_reg1(void *pm2_data, int val) 349{ 350 struct pm2xxx_charger *pm2 = pm2_data; 351 int ret = 0; 352 353 if (val & (PM2XXX_INT2_ITVPWR1PLUG | PM2XXX_INT2_ITVPWR2PLUG)) { 354 dev_dbg(pm2->dev , "Main charger plugged\n"); 355 ret = pm2xxx_charger_itv_pwr_plug_mngt(pm2, val & 356 (PM2XXX_INT2_ITVPWR1PLUG | PM2XXX_INT2_ITVPWR2PLUG)); 357 } 358 359 if (val & 360 (PM2XXX_INT2_ITVPWR1UNPLUG | PM2XXX_INT2_ITVPWR2UNPLUG)) { 361 dev_dbg(pm2->dev , "Main charger unplugged\n"); 362 ret = pm2xxx_charger_itv_pwr_unplug_mngt(pm2, val & 363 (PM2XXX_INT2_ITVPWR1UNPLUG | 364 PM2XXX_INT2_ITVPWR2UNPLUG)); 365 } 366 367 return ret; 368} 369 370static int pm2_int_reg2(void *pm2_data, int val) 371{ 372 struct pm2xxx_charger *pm2 = pm2_data; 373 int ret = 0; 374 375 if (val & PM2XXX_INT3_ITAUTOTIMEOUTWD) 376 ret = pm2xxx_charger_wd_exp_mngt(pm2, val); 377 378 if (val & (PM2XXX_INT3_ITCHPRECHARGEWD | 379 PM2XXX_INT3_ITCHCCWD | PM2XXX_INT3_ITCHCVWD)) { 380 dev_dbg(pm2->dev, 381 "Watchdog occurred for precharge, CC and CV charge\n"); 382 } 383 384 return ret; 385} 386 387static int pm2_int_reg3(void *pm2_data, int val) 388{ 389 struct pm2xxx_charger *pm2 = pm2_data; 390 int ret = 0; 391 392 if (val & (PM2XXX_INT4_ITCHARGINGON)) { 393 dev_dbg(pm2->dev , 394 "charging operation has started\n"); 395 } 396 397 if (val & (PM2XXX_INT4_ITVRESUME)) { 398 dev_dbg(pm2->dev, 399 "battery discharged down to VResume threshold\n"); 400 } 401 402 if (val & (PM2XXX_INT4_ITBATTFULL)) { 403 dev_dbg(pm2->dev , "battery fully detected\n"); 404 } 405 406 if (val & (PM2XXX_INT4_ITCVPHASE)) { 407 dev_dbg(pm2->dev, "CV phase enter with 0.5C charging\n"); 408 } 409 410 if (val & (PM2XXX_INT4_ITVPWR2OVV | PM2XXX_INT4_ITVPWR1OVV)) { 411 pm2->failure_case = VPWR_OVV; 412 ret = pm2xxx_charger_ovv_mngt(pm2, val & 413 (PM2XXX_INT4_ITVPWR2OVV | PM2XXX_INT4_ITVPWR1OVV)); 414 dev_dbg(pm2->dev, "VPWR/VSYSTEM overvoltage detected\n"); 415 } 416 417 if (val & (PM2XXX_INT4_S_ITBATTEMPCOLD | 418 PM2XXX_INT4_S_ITBATTEMPHOT)) { 419 ret = pm2xxx_charger_batt_therm_mngt(pm2, val & 420 (PM2XXX_INT4_S_ITBATTEMPCOLD | 421 PM2XXX_INT4_S_ITBATTEMPHOT)); 422 dev_dbg(pm2->dev, "BTEMP is too Low/High\n"); 423 } 424 425 return ret; 426} 427 428static int pm2_int_reg4(void *pm2_data, int val) 429{ 430 struct pm2xxx_charger *pm2 = pm2_data; 431 int ret = 0; 432 433 if (val & PM2XXX_INT5_ITVSYSTEMOVV) { 434 pm2->failure_case = VSYSTEM_OVV; 435 ret = pm2xxx_charger_ovv_mngt(pm2, val & 436 PM2XXX_INT5_ITVSYSTEMOVV); 437 dev_dbg(pm2->dev, "VSYSTEM overvoltage detected\n"); 438 } 439 440 if (val & (PM2XXX_INT5_ITTHERMALWARNINGFALL | 441 PM2XXX_INT5_ITTHERMALWARNINGRISE | 442 PM2XXX_INT5_ITTHERMALSHUTDOWNFALL | 443 PM2XXX_INT5_ITTHERMALSHUTDOWNRISE)) { 444 dev_dbg(pm2->dev, "BTEMP die temperature is too Low/High\n"); 445 ret = pm2xxx_charger_die_therm_mngt(pm2, val & 446 (PM2XXX_INT5_ITTHERMALWARNINGFALL | 447 PM2XXX_INT5_ITTHERMALWARNINGRISE | 448 PM2XXX_INT5_ITTHERMALSHUTDOWNFALL | 449 PM2XXX_INT5_ITTHERMALSHUTDOWNRISE)); 450 } 451 452 return ret; 453} 454 455static int pm2_int_reg5(void *pm2_data, int val) 456{ 457 struct pm2xxx_charger *pm2 = pm2_data; 458 459 if (val & (PM2XXX_INT6_ITVPWR2DROP | PM2XXX_INT6_ITVPWR1DROP)) { 460 dev_dbg(pm2->dev, "VMPWR drop to VBAT level\n"); 461 } 462 463 if (val & (PM2XXX_INT6_ITVPWR2VALIDRISE | 464 PM2XXX_INT6_ITVPWR1VALIDRISE | 465 PM2XXX_INT6_ITVPWR2VALIDFALL | 466 PM2XXX_INT6_ITVPWR1VALIDFALL)) { 467 dev_dbg(pm2->dev, "Falling/Rising edge on WPWR1/2\n"); 468 } 469 470 return 0; 471} 472 473static irqreturn_t pm2xxx_irq_int(int irq, void *data) 474{ 475 struct pm2xxx_charger *pm2 = data; 476 struct pm2xxx_interrupts *interrupt = pm2->pm2_int; 477 int i; 478 479 /* wake up the device */ 480 pm_runtime_get_sync(pm2->dev); 481 482 do { 483 for (i = 0; i < PM2XXX_NUM_INT_REG; i++) { 484 pm2xxx_reg_read(pm2, 485 pm2xxx_interrupt_registers[i], 486 &(interrupt->reg[i])); 487 488 if (interrupt->reg[i] > 0) 489 interrupt->handler[i](pm2, interrupt->reg[i]); 490 } 491 } while (gpio_get_value(pm2->pdata->gpio_irq_number) == 0); 492 493 pm_runtime_mark_last_busy(pm2->dev); 494 pm_runtime_put_autosuspend(pm2->dev); 495 496 return IRQ_HANDLED; 497} 498 499static int pm2xxx_charger_get_ac_cv(struct pm2xxx_charger *pm2) 500{ 501 int ret = 0; 502 u8 val; 503 504 if (pm2->ac.charger_connected && pm2->ac.charger_online) { 505 506 ret = pm2xxx_reg_read(pm2, PM2XXX_SRCE_REG_INT4, &val); 507 if (ret < 0) { 508 dev_err(pm2->dev, "%s pm2xxx read failed\n", __func__); 509 goto out; 510 } 511 512 if (val & PM2XXX_INT4_S_ITCVPHASE) 513 ret = PM2XXX_CONST_VOLT; 514 else 515 ret = PM2XXX_CONST_CURR; 516 } 517out: 518 return ret; 519} 520 521static int pm2xxx_current_to_regval(int curr) 522{ 523 int i; 524 525 if (curr < pm2xxx_charger_current_map[0]) 526 return 0; 527 528 for (i = 1; i < ARRAY_SIZE(pm2xxx_charger_current_map); i++) { 529 if (curr < pm2xxx_charger_current_map[i]) 530 return (i - 1); 531 } 532 533 i = ARRAY_SIZE(pm2xxx_charger_current_map) - 1; 534 if (curr == pm2xxx_charger_current_map[i]) 535 return i; 536 else 537 return -EINVAL; 538} 539 540static int pm2xxx_voltage_to_regval(int curr) 541{ 542 int i; 543 544 if (curr < pm2xxx_charger_voltage_map[0]) 545 return 0; 546 547 for (i = 1; i < ARRAY_SIZE(pm2xxx_charger_voltage_map); i++) { 548 if (curr < pm2xxx_charger_voltage_map[i]) 549 return i - 1; 550 } 551 552 i = ARRAY_SIZE(pm2xxx_charger_voltage_map) - 1; 553 if (curr == pm2xxx_charger_voltage_map[i]) 554 return i; 555 else 556 return -EINVAL; 557} 558 559static int pm2xxx_charger_update_charger_current(struct ux500_charger *charger, 560 int ich_out) 561{ 562 int ret; 563 int curr_index; 564 struct pm2xxx_charger *pm2; 565 u8 val; 566 567 if (charger->psy->desc->type == POWER_SUPPLY_TYPE_MAINS) 568 pm2 = to_pm2xxx_charger_ac_device_info(charger); 569 else 570 return -ENXIO; 571 572 curr_index = pm2xxx_current_to_regval(ich_out); 573 if (curr_index < 0) { 574 dev_err(pm2->dev, 575 "Charger current too high, charging not started\n"); 576 return -ENXIO; 577 } 578 579 ret = pm2xxx_reg_read(pm2, PM2XXX_BATT_CTRL_REG6, &val); 580 if (ret >= 0) { 581 val &= ~PM2XXX_DIR_CH_CC_CURRENT_MASK; 582 val |= curr_index; 583 ret = pm2xxx_reg_write(pm2, PM2XXX_BATT_CTRL_REG6, val); 584 if (ret < 0) { 585 dev_err(pm2->dev, 586 "%s write failed\n", __func__); 587 } 588 } 589 else 590 dev_err(pm2->dev, "%s read failed\n", __func__); 591 592 return ret; 593} 594 595static int pm2xxx_charger_ac_get_property(struct power_supply *psy, 596 enum power_supply_property psp, 597 union power_supply_propval *val) 598{ 599 struct pm2xxx_charger *pm2; 600 601 pm2 = to_pm2xxx_charger_ac_device_info(psy_to_ux500_charger(psy)); 602 603 switch (psp) { 604 case POWER_SUPPLY_PROP_HEALTH: 605 if (pm2->flags.mainextchnotok) 606 val->intval = POWER_SUPPLY_HEALTH_UNSPEC_FAILURE; 607 else if (pm2->ac.wd_expired) 608 val->intval = POWER_SUPPLY_HEALTH_DEAD; 609 else if (pm2->flags.main_thermal_prot) 610 val->intval = POWER_SUPPLY_HEALTH_OVERHEAT; 611 else if (pm2->flags.ovv) 612 val->intval = POWER_SUPPLY_HEALTH_OVERVOLTAGE; 613 else 614 val->intval = POWER_SUPPLY_HEALTH_GOOD; 615 break; 616 case POWER_SUPPLY_PROP_ONLINE: 617 val->intval = pm2->ac.charger_online; 618 break; 619 case POWER_SUPPLY_PROP_PRESENT: 620 val->intval = pm2->ac.charger_connected; 621 break; 622 case POWER_SUPPLY_PROP_VOLTAGE_AVG: 623 pm2->ac.cv_active = pm2xxx_charger_get_ac_cv(pm2); 624 val->intval = pm2->ac.cv_active; 625 break; 626 default: 627 return -EINVAL; 628 } 629 return 0; 630} 631 632static int pm2xxx_charging_init(struct pm2xxx_charger *pm2) 633{ 634 int ret = 0; 635 636 /* enable CC and CV watchdog */ 637 ret = pm2xxx_reg_write(pm2, PM2XXX_BATT_CTRL_REG3, 638 (PM2XXX_CH_WD_CV_PHASE_60MIN | PM2XXX_CH_WD_CC_PHASE_60MIN)); 639 if( ret < 0) 640 return ret; 641 642 /* enable precharge watchdog */ 643 ret = pm2xxx_reg_write(pm2, PM2XXX_BATT_CTRL_REG4, 644 PM2XXX_CH_WD_PRECH_PHASE_60MIN); 645 646 /* Disable auto timeout */ 647 ret = pm2xxx_reg_write(pm2, PM2XXX_BATT_CTRL_REG5, 648 PM2XXX_CH_WD_AUTO_TIMEOUT_20MIN); 649 650 /* 651 * EOC current level = 100mA 652 * Precharge current level = 100mA 653 * CC current level = 1000mA 654 */ 655 ret = pm2xxx_reg_write(pm2, PM2XXX_BATT_CTRL_REG6, 656 (PM2XXX_DIR_CH_CC_CURRENT_1000MA | 657 PM2XXX_CH_PRECH_CURRENT_100MA | 658 PM2XXX_CH_EOC_CURRENT_100MA)); 659 660 /* 661 * recharge threshold = 3.8V 662 * Precharge to CC threshold = 2.9V 663 */ 664 ret = pm2xxx_reg_write(pm2, PM2XXX_BATT_CTRL_REG7, 665 (PM2XXX_CH_PRECH_VOL_2_9 | PM2XXX_CH_VRESUME_VOL_3_8)); 666 667 /* float voltage charger level = 4.2V */ 668 ret = pm2xxx_reg_write(pm2, PM2XXX_BATT_CTRL_REG8, 669 PM2XXX_CH_VOLT_4_2); 670 671 /* Voltage drop between VBAT and VSYS in HW charging = 300mV */ 672 ret = pm2xxx_reg_write(pm2, PM2XXX_BATT_CTRL_REG9, 673 (PM2XXX_CH_150MV_DROP_300MV | PM2XXX_CHARCHING_INFO_DIS | 674 PM2XXX_CH_CC_REDUCED_CURRENT_IDENT | 675 PM2XXX_CH_CC_MODEDROP_DIS)); 676 677 /* Input charger level of over voltage = 10V */ 678 ret = pm2xxx_reg_write(pm2, PM2XXX_INP_VOLT_VPWR2, 679 PM2XXX_VPWR2_OVV_10); 680 ret = pm2xxx_reg_write(pm2, PM2XXX_INP_VOLT_VPWR1, 681 PM2XXX_VPWR1_OVV_10); 682 683 /* Input charger drop */ 684 ret = pm2xxx_reg_write(pm2, PM2XXX_INP_DROP_VPWR2, 685 (PM2XXX_VPWR2_HW_OPT_DIS | PM2XXX_VPWR2_VALID_DIS | 686 PM2XXX_VPWR2_DROP_DIS)); 687 ret = pm2xxx_reg_write(pm2, PM2XXX_INP_DROP_VPWR1, 688 (PM2XXX_VPWR1_HW_OPT_DIS | PM2XXX_VPWR1_VALID_DIS | 689 PM2XXX_VPWR1_DROP_DIS)); 690 691 /* Disable battery low monitoring */ 692 ret = pm2xxx_reg_write(pm2, PM2XXX_BATT_LOW_LEV_COMP_REG, 693 PM2XXX_VBAT_LOW_MONITORING_ENA); 694 695 return ret; 696} 697 698static int pm2xxx_charger_ac_en(struct ux500_charger *charger, 699 int enable, int vset, int iset) 700{ 701 int ret; 702 int volt_index; 703 int curr_index; 704 u8 val; 705 706 struct pm2xxx_charger *pm2 = to_pm2xxx_charger_ac_device_info(charger); 707 708 if (enable) { 709 if (!pm2->ac.charger_connected) { 710 dev_dbg(pm2->dev, "AC charger not connected\n"); 711 return -ENXIO; 712 } 713 714 dev_dbg(pm2->dev, "Enable AC: %dmV %dmA\n", vset, iset); 715 if (!pm2->vddadc_en_ac) { 716 ret = regulator_enable(pm2->regu); 717 if (ret) 718 dev_warn(pm2->dev, 719 "Failed to enable vddadc regulator\n"); 720 else 721 pm2->vddadc_en_ac = true; 722 } 723 724 ret = pm2xxx_charging_init(pm2); 725 if (ret < 0) { 726 dev_err(pm2->dev, "%s charging init failed\n", 727 __func__); 728 goto error_occured; 729 } 730 731 volt_index = pm2xxx_voltage_to_regval(vset); 732 curr_index = pm2xxx_current_to_regval(iset); 733 734 if (volt_index < 0 || curr_index < 0) { 735 dev_err(pm2->dev, 736 "Charger voltage or current too high, " 737 "charging not started\n"); 738 return -ENXIO; 739 } 740 741 ret = pm2xxx_reg_read(pm2, PM2XXX_BATT_CTRL_REG8, &val); 742 if (ret < 0) { 743 dev_err(pm2->dev, "%s pm2xxx read failed\n", __func__); 744 goto error_occured; 745 } 746 val &= ~PM2XXX_CH_VOLT_MASK; 747 val |= volt_index; 748 ret = pm2xxx_reg_write(pm2, PM2XXX_BATT_CTRL_REG8, val); 749 if (ret < 0) { 750 dev_err(pm2->dev, "%s pm2xxx write failed\n", __func__); 751 goto error_occured; 752 } 753 754 ret = pm2xxx_reg_read(pm2, PM2XXX_BATT_CTRL_REG6, &val); 755 if (ret < 0) { 756 dev_err(pm2->dev, "%s pm2xxx read failed\n", __func__); 757 goto error_occured; 758 } 759 val &= ~PM2XXX_DIR_CH_CC_CURRENT_MASK; 760 val |= curr_index; 761 ret = pm2xxx_reg_write(pm2, PM2XXX_BATT_CTRL_REG6, val); 762 if (ret < 0) { 763 dev_err(pm2->dev, "%s pm2xxx write failed\n", __func__); 764 goto error_occured; 765 } 766 767 if (!pm2->bat->enable_overshoot) { 768 ret = pm2xxx_reg_read(pm2, PM2XXX_LED_CTRL_REG, &val); 769 if (ret < 0) { 770 dev_err(pm2->dev, "%s pm2xxx read failed\n", 771 __func__); 772 goto error_occured; 773 } 774 val |= PM2XXX_ANTI_OVERSHOOT_EN; 775 ret = pm2xxx_reg_write(pm2, PM2XXX_LED_CTRL_REG, val); 776 if (ret < 0) { 777 dev_err(pm2->dev, "%s pm2xxx write failed\n", 778 __func__); 779 goto error_occured; 780 } 781 } 782 783 ret = pm2xxx_charging_enable_mngt(pm2); 784 if (ret < 0) { 785 dev_err(pm2->dev, "Failed to enable" 786 "pm2xxx ac charger\n"); 787 goto error_occured; 788 } 789 790 pm2->ac.charger_online = 1; 791 } else { 792 pm2->ac.charger_online = 0; 793 pm2->ac.wd_expired = false; 794 795 /* Disable regulator if enabled */ 796 if (pm2->vddadc_en_ac) { 797 regulator_disable(pm2->regu); 798 pm2->vddadc_en_ac = false; 799 } 800 801 ret = pm2xxx_charging_disable_mngt(pm2); 802 if (ret < 0) { 803 dev_err(pm2->dev, "failed to disable" 804 "pm2xxx ac charger\n"); 805 goto error_occured; 806 } 807 808 dev_dbg(pm2->dev, "PM2301: " "Disabled AC charging\n"); 809 } 810 power_supply_changed(pm2->ac_chg.psy); 811 812error_occured: 813 return ret; 814} 815 816static int pm2xxx_charger_watchdog_kick(struct ux500_charger *charger) 817{ 818 int ret; 819 struct pm2xxx_charger *pm2; 820 821 if (charger->psy->desc->type == POWER_SUPPLY_TYPE_MAINS) 822 pm2 = to_pm2xxx_charger_ac_device_info(charger); 823 else 824 return -ENXIO; 825 826 ret = pm2xxx_reg_write(pm2, PM2XXX_BATT_WD_KICK, WD_TIMER); 827 if (ret) 828 dev_err(pm2->dev, "Failed to kick WD!\n"); 829 830 return ret; 831} 832 833static void pm2xxx_charger_ac_work(struct work_struct *work) 834{ 835 struct pm2xxx_charger *pm2 = container_of(work, 836 struct pm2xxx_charger, ac_work); 837 838 839 power_supply_changed(pm2->ac_chg.psy); 840 sysfs_notify(&pm2->ac_chg.psy->dev.kobj, NULL, "present"); 841}; 842 843static void pm2xxx_charger_check_hw_failure_work(struct work_struct *work) 844{ 845 u8 reg_value; 846 847 struct pm2xxx_charger *pm2 = container_of(work, 848 struct pm2xxx_charger, check_hw_failure_work.work); 849 850 if (pm2->flags.ovv) { 851 pm2xxx_reg_read(pm2, PM2XXX_SRCE_REG_INT4, &reg_value); 852 853 if (!(reg_value & (PM2XXX_INT4_S_ITVPWR1OVV | 854 PM2XXX_INT4_S_ITVPWR2OVV))) { 855 pm2->flags.ovv = false; 856 power_supply_changed(pm2->ac_chg.psy); 857 } 858 } 859 860 /* If we still have a failure, schedule a new check */ 861 if (pm2->flags.ovv) { 862 queue_delayed_work(pm2->charger_wq, 863 &pm2->check_hw_failure_work, round_jiffies(HZ)); 864 } 865} 866 867static void pm2xxx_charger_check_main_thermal_prot_work( 868 struct work_struct *work) 869{ 870 int ret; 871 u8 val; 872 873 struct pm2xxx_charger *pm2 = container_of(work, struct pm2xxx_charger, 874 check_main_thermal_prot_work); 875 876 /* Check if die temp warning is still active */ 877 ret = pm2xxx_reg_read(pm2, PM2XXX_SRCE_REG_INT5, &val); 878 if (ret < 0) { 879 dev_err(pm2->dev, "%s pm2xxx read failed\n", __func__); 880 return; 881 } 882 if (val & (PM2XXX_INT5_S_ITTHERMALWARNINGRISE 883 | PM2XXX_INT5_S_ITTHERMALSHUTDOWNRISE)) 884 pm2->flags.main_thermal_prot = true; 885 else if (val & (PM2XXX_INT5_S_ITTHERMALWARNINGFALL 886 | PM2XXX_INT5_S_ITTHERMALSHUTDOWNFALL)) 887 pm2->flags.main_thermal_prot = false; 888 889 power_supply_changed(pm2->ac_chg.psy); 890} 891 892static struct pm2xxx_interrupts pm2xxx_int = { 893 .handler[0] = pm2_int_reg0, 894 .handler[1] = pm2_int_reg1, 895 .handler[2] = pm2_int_reg2, 896 .handler[3] = pm2_int_reg3, 897 .handler[4] = pm2_int_reg4, 898 .handler[5] = pm2_int_reg5, 899}; 900 901static struct pm2xxx_irq pm2xxx_charger_irq[] = { 902 {"PM2XXX_IRQ_INT", pm2xxx_irq_int}, 903}; 904 905static int __maybe_unused pm2xxx_wall_charger_resume(struct device *dev) 906{ 907 struct i2c_client *i2c_client = to_i2c_client(dev); 908 struct pm2xxx_charger *pm2; 909 910 pm2 = (struct pm2xxx_charger *)i2c_get_clientdata(i2c_client); 911 set_lpn_pin(pm2); 912 913 /* If we still have a HW failure, schedule a new check */ 914 if (pm2->flags.ovv) 915 queue_delayed_work(pm2->charger_wq, 916 &pm2->check_hw_failure_work, 0); 917 918 return 0; 919} 920 921static int __maybe_unused pm2xxx_wall_charger_suspend(struct device *dev) 922{ 923 struct i2c_client *i2c_client = to_i2c_client(dev); 924 struct pm2xxx_charger *pm2; 925 926 pm2 = (struct pm2xxx_charger *)i2c_get_clientdata(i2c_client); 927 clear_lpn_pin(pm2); 928 929 /* Cancel any pending HW failure check */ 930 if (delayed_work_pending(&pm2->check_hw_failure_work)) 931 cancel_delayed_work(&pm2->check_hw_failure_work); 932 933 flush_work(&pm2->ac_work); 934 flush_work(&pm2->check_main_thermal_prot_work); 935 936 return 0; 937} 938 939static int __maybe_unused pm2xxx_runtime_suspend(struct device *dev) 940{ 941 struct i2c_client *pm2xxx_i2c_client = to_i2c_client(dev); 942 struct pm2xxx_charger *pm2; 943 944 pm2 = (struct pm2xxx_charger *)i2c_get_clientdata(pm2xxx_i2c_client); 945 clear_lpn_pin(pm2); 946 947 return 0; 948} 949 950static int __maybe_unused pm2xxx_runtime_resume(struct device *dev) 951{ 952 struct i2c_client *pm2xxx_i2c_client = to_i2c_client(dev); 953 struct pm2xxx_charger *pm2; 954 955 pm2 = (struct pm2xxx_charger *)i2c_get_clientdata(pm2xxx_i2c_client); 956 957 if (gpio_is_valid(pm2->lpn_pin) && gpio_get_value(pm2->lpn_pin) == 0) 958 set_lpn_pin(pm2); 959 960 return 0; 961} 962 963static const struct dev_pm_ops pm2xxx_pm_ops __maybe_unused = { 964 SET_SYSTEM_SLEEP_PM_OPS(pm2xxx_wall_charger_suspend, 965 pm2xxx_wall_charger_resume) 966 SET_RUNTIME_PM_OPS(pm2xxx_runtime_suspend, pm2xxx_runtime_resume, NULL) 967}; 968 969static int pm2xxx_wall_charger_probe(struct i2c_client *i2c_client, 970 const struct i2c_device_id *id) 971{ 972 struct pm2xxx_platform_data *pl_data = i2c_client->dev.platform_data; 973 struct power_supply_config psy_cfg = {}; 974 struct pm2xxx_charger *pm2; 975 int ret = 0; 976 u8 val; 977 int i; 978 979 if (!pl_data) { 980 dev_err(&i2c_client->dev, "No platform data supplied\n"); 981 return -EINVAL; 982 } 983 984 pm2 = kzalloc(sizeof(struct pm2xxx_charger), GFP_KERNEL); 985 if (!pm2) { 986 dev_err(&i2c_client->dev, "pm2xxx_charger allocation failed\n"); 987 return -ENOMEM; 988 } 989 990 /* get parent data */ 991 pm2->dev = &i2c_client->dev; 992 993 pm2->pm2_int = &pm2xxx_int; 994 995 /* get charger spcific platform data */ 996 if (!pl_data->wall_charger) { 997 dev_err(pm2->dev, "no charger platform data supplied\n"); 998 ret = -EINVAL; 999 goto free_device_info; 1000 } 1001 1002 pm2->pdata = pl_data->wall_charger; 1003 1004 /* get battery specific platform data */ 1005 if (!pl_data->battery) { 1006 dev_err(pm2->dev, "no battery platform data supplied\n"); 1007 ret = -EINVAL; 1008 goto free_device_info; 1009 } 1010 1011 pm2->bat = pl_data->battery; 1012 1013 if (!i2c_check_functionality(i2c_client->adapter, 1014 I2C_FUNC_SMBUS_BYTE_DATA | 1015 I2C_FUNC_SMBUS_READ_WORD_DATA)) { 1016 ret = -ENODEV; 1017 dev_info(pm2->dev, "pm2301 i2c_check_functionality failed\n"); 1018 goto free_device_info; 1019 } 1020 1021 pm2->config.pm2xxx_i2c = i2c_client; 1022 pm2->config.pm2xxx_id = (struct i2c_device_id *) id; 1023 i2c_set_clientdata(i2c_client, pm2); 1024 1025 /* AC supply */ 1026 /* power_supply base class */ 1027 pm2->ac_chg_desc.name = pm2->pdata->label; 1028 pm2->ac_chg_desc.type = POWER_SUPPLY_TYPE_MAINS; 1029 pm2->ac_chg_desc.properties = pm2xxx_charger_ac_props; 1030 pm2->ac_chg_desc.num_properties = ARRAY_SIZE(pm2xxx_charger_ac_props); 1031 pm2->ac_chg_desc.get_property = pm2xxx_charger_ac_get_property; 1032 1033 psy_cfg.supplied_to = pm2->pdata->supplied_to; 1034 psy_cfg.num_supplicants = pm2->pdata->num_supplicants; 1035 /* pm2xxx_charger sub-class */ 1036 pm2->ac_chg.ops.enable = &pm2xxx_charger_ac_en; 1037 pm2->ac_chg.ops.kick_wd = &pm2xxx_charger_watchdog_kick; 1038 pm2->ac_chg.ops.update_curr = &pm2xxx_charger_update_charger_current; 1039 pm2->ac_chg.max_out_volt = pm2xxx_charger_voltage_map[ 1040 ARRAY_SIZE(pm2xxx_charger_voltage_map) - 1]; 1041 pm2->ac_chg.max_out_curr = pm2xxx_charger_current_map[ 1042 ARRAY_SIZE(pm2xxx_charger_current_map) - 1]; 1043 pm2->ac_chg.wdt_refresh = WD_KICK_INTERVAL; 1044 pm2->ac_chg.enabled = true; 1045 pm2->ac_chg.external = true; 1046 1047 /* Create a work queue for the charger */ 1048 pm2->charger_wq = alloc_ordered_workqueue("pm2xxx_charger_wq", 1049 WQ_MEM_RECLAIM); 1050 if (pm2->charger_wq == NULL) { 1051 ret = -ENOMEM; 1052 dev_err(pm2->dev, "failed to create work queue\n"); 1053 goto free_device_info; 1054 } 1055 1056 /* Init work for charger detection */ 1057 INIT_WORK(&pm2->ac_work, pm2xxx_charger_ac_work); 1058 1059 /* Init work for checking HW status */ 1060 INIT_WORK(&pm2->check_main_thermal_prot_work, 1061 pm2xxx_charger_check_main_thermal_prot_work); 1062 1063 /* Init work for HW failure check */ 1064 INIT_DEFERRABLE_WORK(&pm2->check_hw_failure_work, 1065 pm2xxx_charger_check_hw_failure_work); 1066 1067 /* 1068 * VDD ADC supply needs to be enabled from this driver when there 1069 * is a charger connected to avoid erroneous BTEMP_HIGH/LOW 1070 * interrupts during charging 1071 */ 1072 pm2->regu = regulator_get(pm2->dev, "vddadc"); 1073 if (IS_ERR(pm2->regu)) { 1074 ret = PTR_ERR(pm2->regu); 1075 dev_err(pm2->dev, "failed to get vddadc regulator\n"); 1076 goto free_charger_wq; 1077 } 1078 1079 /* Register AC charger class */ 1080 pm2->ac_chg.psy = power_supply_register(pm2->dev, &pm2->ac_chg_desc, 1081 &psy_cfg); 1082 if (IS_ERR(pm2->ac_chg.psy)) { 1083 dev_err(pm2->dev, "failed to register AC charger\n"); 1084 ret = PTR_ERR(pm2->ac_chg.psy); 1085 goto free_regulator; 1086 } 1087 1088 /* Register interrupts */ 1089 ret = request_threaded_irq(gpio_to_irq(pm2->pdata->gpio_irq_number), 1090 NULL, 1091 pm2xxx_charger_irq[0].isr, 1092 pm2->pdata->irq_type, 1093 pm2xxx_charger_irq[0].name, pm2); 1094 1095 if (ret != 0) { 1096 dev_err(pm2->dev, "failed to request %s IRQ %d: %d\n", 1097 pm2xxx_charger_irq[0].name, 1098 gpio_to_irq(pm2->pdata->gpio_irq_number), ret); 1099 goto unregister_pm2xxx_charger; 1100 } 1101 1102 ret = pm_runtime_set_active(pm2->dev); 1103 if (ret) 1104 dev_err(pm2->dev, "set active Error\n"); 1105 1106 pm_runtime_enable(pm2->dev); 1107 pm_runtime_set_autosuspend_delay(pm2->dev, PM2XXX_AUTOSUSPEND_DELAY); 1108 pm_runtime_use_autosuspend(pm2->dev); 1109 pm_runtime_resume(pm2->dev); 1110 1111 /* pm interrupt can wake up system */ 1112 ret = enable_irq_wake(gpio_to_irq(pm2->pdata->gpio_irq_number)); 1113 if (ret) { 1114 dev_err(pm2->dev, "failed to set irq wake\n"); 1115 goto unregister_pm2xxx_interrupt; 1116 } 1117 1118 mutex_init(&pm2->lock); 1119 1120 if (gpio_is_valid(pm2->pdata->lpn_gpio)) { 1121 /* get lpn GPIO from platform data */ 1122 pm2->lpn_pin = pm2->pdata->lpn_gpio; 1123 1124 /* 1125 * Charger detection mechanism requires pulling up the LPN pin 1126 * while i2c communication if Charger is not connected 1127 * LPN pin of PM2301 is GPIO60 of AB9540 1128 */ 1129 ret = gpio_request(pm2->lpn_pin, "pm2301_lpm_gpio"); 1130 1131 if (ret < 0) { 1132 dev_err(pm2->dev, "pm2301_lpm_gpio request failed\n"); 1133 goto disable_pm2_irq_wake; 1134 } 1135 ret = gpio_direction_output(pm2->lpn_pin, 0); 1136 if (ret < 0) { 1137 dev_err(pm2->dev, "pm2301_lpm_gpio direction failed\n"); 1138 goto free_gpio; 1139 } 1140 set_lpn_pin(pm2); 1141 } 1142 1143 /* read interrupt registers */ 1144 for (i = 0; i < PM2XXX_NUM_INT_REG; i++) 1145 pm2xxx_reg_read(pm2, 1146 pm2xxx_interrupt_registers[i], 1147 &val); 1148 1149 ret = pm2xxx_charger_detection(pm2, &val); 1150 1151 if ((ret == 0) && val) { 1152 pm2->ac.charger_connected = 1; 1153 ab8500_override_turn_on_stat(~AB8500_POW_KEY_1_ON, 1154 AB8500_MAIN_CH_DET); 1155 pm2->ac_conn = true; 1156 power_supply_changed(pm2->ac_chg.psy); 1157 sysfs_notify(&pm2->ac_chg.psy->dev.kobj, NULL, "present"); 1158 } 1159 1160 return 0; 1161 1162free_gpio: 1163 if (gpio_is_valid(pm2->lpn_pin)) 1164 gpio_free(pm2->lpn_pin); 1165disable_pm2_irq_wake: 1166 disable_irq_wake(gpio_to_irq(pm2->pdata->gpio_irq_number)); 1167unregister_pm2xxx_interrupt: 1168 /* disable interrupt */ 1169 free_irq(gpio_to_irq(pm2->pdata->gpio_irq_number), pm2); 1170unregister_pm2xxx_charger: 1171 /* unregister power supply */ 1172 power_supply_unregister(pm2->ac_chg.psy); 1173free_regulator: 1174 /* disable the regulator */ 1175 regulator_put(pm2->regu); 1176free_charger_wq: 1177 destroy_workqueue(pm2->charger_wq); 1178free_device_info: 1179 kfree(pm2); 1180 1181 return ret; 1182} 1183 1184static int pm2xxx_wall_charger_remove(struct i2c_client *i2c_client) 1185{ 1186 struct pm2xxx_charger *pm2 = i2c_get_clientdata(i2c_client); 1187 1188 /* Disable pm_runtime */ 1189 pm_runtime_disable(pm2->dev); 1190 /* Disable AC charging */ 1191 pm2xxx_charger_ac_en(&pm2->ac_chg, false, 0, 0); 1192 1193 /* Disable wake by pm interrupt */ 1194 disable_irq_wake(gpio_to_irq(pm2->pdata->gpio_irq_number)); 1195 1196 /* Disable interrupts */ 1197 free_irq(gpio_to_irq(pm2->pdata->gpio_irq_number), pm2); 1198 1199 /* Delete the work queue */ 1200 destroy_workqueue(pm2->charger_wq); 1201 1202 flush_scheduled_work(); 1203 1204 /* disable the regulator */ 1205 regulator_put(pm2->regu); 1206 1207 power_supply_unregister(pm2->ac_chg.psy); 1208 1209 if (gpio_is_valid(pm2->lpn_pin)) 1210 gpio_free(pm2->lpn_pin); 1211 1212 kfree(pm2); 1213 1214 return 0; 1215} 1216 1217static const struct i2c_device_id pm2xxx_id[] = { 1218 { "pm2301", 0 }, 1219 { } 1220}; 1221 1222MODULE_DEVICE_TABLE(i2c, pm2xxx_id); 1223 1224static struct i2c_driver pm2xxx_charger_driver = { 1225 .probe = pm2xxx_wall_charger_probe, 1226 .remove = pm2xxx_wall_charger_remove, 1227 .driver = { 1228 .name = "pm2xxx-wall_charger", 1229 .pm = IS_ENABLED(CONFIG_PM) ? &pm2xxx_pm_ops : NULL, 1230 }, 1231 .id_table = pm2xxx_id, 1232}; 1233 1234static int __init pm2xxx_charger_init(void) 1235{ 1236 return i2c_add_driver(&pm2xxx_charger_driver); 1237} 1238 1239static void __exit pm2xxx_charger_exit(void) 1240{ 1241 i2c_del_driver(&pm2xxx_charger_driver); 1242} 1243 1244device_initcall_sync(pm2xxx_charger_init); 1245module_exit(pm2xxx_charger_exit); 1246 1247MODULE_LICENSE("GPL v2"); 1248MODULE_AUTHOR("Rajkumar kasirajan, Olivier Launay"); 1249MODULE_DESCRIPTION("PM2xxx charger management driver");