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 v3.7-rc8 1921 lines 55 kB view raw
1/* 2 * Copyright (C) ST-Ericsson SA 2012 3 * 4 * Charging algorithm driver for abx500 variants 5 * 6 * License Terms: GNU General Public License v2 7 * Authors: 8 * Johan Palsson <johan.palsson@stericsson.com> 9 * Karl Komierowski <karl.komierowski@stericsson.com> 10 * Arun R Murthy <arun.murthy@stericsson.com> 11 */ 12 13#include <linux/init.h> 14#include <linux/module.h> 15#include <linux/device.h> 16#include <linux/interrupt.h> 17#include <linux/delay.h> 18#include <linux/slab.h> 19#include <linux/platform_device.h> 20#include <linux/power_supply.h> 21#include <linux/completion.h> 22#include <linux/workqueue.h> 23#include <linux/kobject.h> 24#include <linux/mfd/abx500.h> 25#include <linux/mfd/abx500/ux500_chargalg.h> 26#include <linux/mfd/abx500/ab8500-bm.h> 27 28/* Watchdog kick interval */ 29#define CHG_WD_INTERVAL (6 * HZ) 30 31/* End-of-charge criteria counter */ 32#define EOC_COND_CNT 10 33 34/* Recharge criteria counter */ 35#define RCH_COND_CNT 3 36 37#define to_abx500_chargalg_device_info(x) container_of((x), \ 38 struct abx500_chargalg, chargalg_psy); 39 40enum abx500_chargers { 41 NO_CHG, 42 AC_CHG, 43 USB_CHG, 44}; 45 46struct abx500_chargalg_charger_info { 47 enum abx500_chargers conn_chg; 48 enum abx500_chargers prev_conn_chg; 49 enum abx500_chargers online_chg; 50 enum abx500_chargers prev_online_chg; 51 enum abx500_chargers charger_type; 52 bool usb_chg_ok; 53 bool ac_chg_ok; 54 int usb_volt; 55 int usb_curr; 56 int ac_volt; 57 int ac_curr; 58 int usb_vset; 59 int usb_iset; 60 int ac_vset; 61 int ac_iset; 62}; 63 64struct abx500_chargalg_suspension_status { 65 bool suspended_change; 66 bool ac_suspended; 67 bool usb_suspended; 68}; 69 70struct abx500_chargalg_battery_data { 71 int temp; 72 int volt; 73 int avg_curr; 74 int inst_curr; 75 int percent; 76}; 77 78enum abx500_chargalg_states { 79 STATE_HANDHELD_INIT, 80 STATE_HANDHELD, 81 STATE_CHG_NOT_OK_INIT, 82 STATE_CHG_NOT_OK, 83 STATE_HW_TEMP_PROTECT_INIT, 84 STATE_HW_TEMP_PROTECT, 85 STATE_NORMAL_INIT, 86 STATE_NORMAL, 87 STATE_WAIT_FOR_RECHARGE_INIT, 88 STATE_WAIT_FOR_RECHARGE, 89 STATE_MAINTENANCE_A_INIT, 90 STATE_MAINTENANCE_A, 91 STATE_MAINTENANCE_B_INIT, 92 STATE_MAINTENANCE_B, 93 STATE_TEMP_UNDEROVER_INIT, 94 STATE_TEMP_UNDEROVER, 95 STATE_TEMP_LOWHIGH_INIT, 96 STATE_TEMP_LOWHIGH, 97 STATE_SUSPENDED_INIT, 98 STATE_SUSPENDED, 99 STATE_OVV_PROTECT_INIT, 100 STATE_OVV_PROTECT, 101 STATE_SAFETY_TIMER_EXPIRED_INIT, 102 STATE_SAFETY_TIMER_EXPIRED, 103 STATE_BATT_REMOVED_INIT, 104 STATE_BATT_REMOVED, 105 STATE_WD_EXPIRED_INIT, 106 STATE_WD_EXPIRED, 107}; 108 109static const char *states[] = { 110 "HANDHELD_INIT", 111 "HANDHELD", 112 "CHG_NOT_OK_INIT", 113 "CHG_NOT_OK", 114 "HW_TEMP_PROTECT_INIT", 115 "HW_TEMP_PROTECT", 116 "NORMAL_INIT", 117 "NORMAL", 118 "WAIT_FOR_RECHARGE_INIT", 119 "WAIT_FOR_RECHARGE", 120 "MAINTENANCE_A_INIT", 121 "MAINTENANCE_A", 122 "MAINTENANCE_B_INIT", 123 "MAINTENANCE_B", 124 "TEMP_UNDEROVER_INIT", 125 "TEMP_UNDEROVER", 126 "TEMP_LOWHIGH_INIT", 127 "TEMP_LOWHIGH", 128 "SUSPENDED_INIT", 129 "SUSPENDED", 130 "OVV_PROTECT_INIT", 131 "OVV_PROTECT", 132 "SAFETY_TIMER_EXPIRED_INIT", 133 "SAFETY_TIMER_EXPIRED", 134 "BATT_REMOVED_INIT", 135 "BATT_REMOVED", 136 "WD_EXPIRED_INIT", 137 "WD_EXPIRED", 138}; 139 140struct abx500_chargalg_events { 141 bool batt_unknown; 142 bool mainextchnotok; 143 bool batt_ovv; 144 bool batt_rem; 145 bool btemp_underover; 146 bool btemp_lowhigh; 147 bool main_thermal_prot; 148 bool usb_thermal_prot; 149 bool main_ovv; 150 bool vbus_ovv; 151 bool usbchargernotok; 152 bool safety_timer_expired; 153 bool maintenance_timer_expired; 154 bool ac_wd_expired; 155 bool usb_wd_expired; 156 bool ac_cv_active; 157 bool usb_cv_active; 158 bool vbus_collapsed; 159}; 160 161/** 162 * struct abx500_charge_curr_maximization - Charger maximization parameters 163 * @original_iset: the non optimized/maximised charger current 164 * @current_iset: the charging current used at this moment 165 * @test_delta_i: the delta between the current we want to charge and the 166 current that is really going into the battery 167 * @condition_cnt: number of iterations needed before a new charger current 168 is set 169 * @max_current: maximum charger current 170 * @wait_cnt: to avoid too fast current step down in case of charger 171 * voltage collapse, we insert this delay between step 172 * down 173 * @level: tells in how many steps the charging current has been 174 increased 175 */ 176struct abx500_charge_curr_maximization { 177 int original_iset; 178 int current_iset; 179 int test_delta_i; 180 int condition_cnt; 181 int max_current; 182 int wait_cnt; 183 u8 level; 184}; 185 186enum maxim_ret { 187 MAXIM_RET_NOACTION, 188 MAXIM_RET_CHANGE, 189 MAXIM_RET_IBAT_TOO_HIGH, 190}; 191 192/** 193 * struct abx500_chargalg - abx500 Charging algorithm device information 194 * @dev: pointer to the structure device 195 * @charge_status: battery operating status 196 * @eoc_cnt: counter used to determine end-of_charge 197 * @rch_cnt: counter used to determine start of recharge 198 * @maintenance_chg: indicate if maintenance charge is active 199 * @t_hyst_norm temperature hysteresis when the temperature has been 200 * over or under normal limits 201 * @t_hyst_lowhigh temperature hysteresis when the temperature has been 202 * over or under the high or low limits 203 * @charge_state: current state of the charging algorithm 204 * @ccm charging current maximization parameters 205 * @chg_info: information about connected charger types 206 * @batt_data: data of the battery 207 * @susp_status: current charger suspension status 208 * @pdata: pointer to the abx500_chargalg platform data 209 * @bat: pointer to the abx500_bm platform data 210 * @chargalg_psy: structure that holds the battery properties exposed by 211 * the charging algorithm 212 * @events: structure for information about events triggered 213 * @chargalg_wq: work queue for running the charging algorithm 214 * @chargalg_periodic_work: work to run the charging algorithm periodically 215 * @chargalg_wd_work: work to kick the charger watchdog periodically 216 * @chargalg_work: work to run the charging algorithm instantly 217 * @safety_timer: charging safety timer 218 * @maintenance_timer: maintenance charging timer 219 * @chargalg_kobject: structure of type kobject 220 */ 221struct abx500_chargalg { 222 struct device *dev; 223 int charge_status; 224 int eoc_cnt; 225 int rch_cnt; 226 bool maintenance_chg; 227 int t_hyst_norm; 228 int t_hyst_lowhigh; 229 enum abx500_chargalg_states charge_state; 230 struct abx500_charge_curr_maximization ccm; 231 struct abx500_chargalg_charger_info chg_info; 232 struct abx500_chargalg_battery_data batt_data; 233 struct abx500_chargalg_suspension_status susp_status; 234 struct abx500_chargalg_platform_data *pdata; 235 struct abx500_bm_data *bat; 236 struct power_supply chargalg_psy; 237 struct ux500_charger *ac_chg; 238 struct ux500_charger *usb_chg; 239 struct abx500_chargalg_events events; 240 struct workqueue_struct *chargalg_wq; 241 struct delayed_work chargalg_periodic_work; 242 struct delayed_work chargalg_wd_work; 243 struct work_struct chargalg_work; 244 struct timer_list safety_timer; 245 struct timer_list maintenance_timer; 246 struct kobject chargalg_kobject; 247}; 248 249/* Main battery properties */ 250static enum power_supply_property abx500_chargalg_props[] = { 251 POWER_SUPPLY_PROP_STATUS, 252 POWER_SUPPLY_PROP_HEALTH, 253}; 254 255/** 256 * abx500_chargalg_safety_timer_expired() - Expiration of the safety timer 257 * @data: pointer to the abx500_chargalg structure 258 * 259 * This function gets called when the safety timer for the charger 260 * expires 261 */ 262static void abx500_chargalg_safety_timer_expired(unsigned long data) 263{ 264 struct abx500_chargalg *di = (struct abx500_chargalg *) data; 265 dev_err(di->dev, "Safety timer expired\n"); 266 di->events.safety_timer_expired = true; 267 268 /* Trigger execution of the algorithm instantly */ 269 queue_work(di->chargalg_wq, &di->chargalg_work); 270} 271 272/** 273 * abx500_chargalg_maintenance_timer_expired() - Expiration of 274 * the maintenance timer 275 * @i: pointer to the abx500_chargalg structure 276 * 277 * This function gets called when the maintenence timer 278 * expires 279 */ 280static void abx500_chargalg_maintenance_timer_expired(unsigned long data) 281{ 282 283 struct abx500_chargalg *di = (struct abx500_chargalg *) data; 284 dev_dbg(di->dev, "Maintenance timer expired\n"); 285 di->events.maintenance_timer_expired = true; 286 287 /* Trigger execution of the algorithm instantly */ 288 queue_work(di->chargalg_wq, &di->chargalg_work); 289} 290 291/** 292 * abx500_chargalg_state_to() - Change charge state 293 * @di: pointer to the abx500_chargalg structure 294 * 295 * This function gets called when a charge state change should occur 296 */ 297static void abx500_chargalg_state_to(struct abx500_chargalg *di, 298 enum abx500_chargalg_states state) 299{ 300 dev_dbg(di->dev, 301 "State changed: %s (From state: [%d] %s =to=> [%d] %s )\n", 302 di->charge_state == state ? "NO" : "YES", 303 di->charge_state, 304 states[di->charge_state], 305 state, 306 states[state]); 307 308 di->charge_state = state; 309} 310 311/** 312 * abx500_chargalg_check_charger_connection() - Check charger connection change 313 * @di: pointer to the abx500_chargalg structure 314 * 315 * This function will check if there is a change in the charger connection 316 * and change charge state accordingly. AC has precedence over USB. 317 */ 318static int abx500_chargalg_check_charger_connection(struct abx500_chargalg *di) 319{ 320 if (di->chg_info.conn_chg != di->chg_info.prev_conn_chg || 321 di->susp_status.suspended_change) { 322 /* 323 * Charger state changed or suspension 324 * has changed since last update 325 */ 326 if ((di->chg_info.conn_chg & AC_CHG) && 327 !di->susp_status.ac_suspended) { 328 dev_dbg(di->dev, "Charging source is AC\n"); 329 if (di->chg_info.charger_type != AC_CHG) { 330 di->chg_info.charger_type = AC_CHG; 331 abx500_chargalg_state_to(di, STATE_NORMAL_INIT); 332 } 333 } else if ((di->chg_info.conn_chg & USB_CHG) && 334 !di->susp_status.usb_suspended) { 335 dev_dbg(di->dev, "Charging source is USB\n"); 336 di->chg_info.charger_type = USB_CHG; 337 abx500_chargalg_state_to(di, STATE_NORMAL_INIT); 338 } else if (di->chg_info.conn_chg && 339 (di->susp_status.ac_suspended || 340 di->susp_status.usb_suspended)) { 341 dev_dbg(di->dev, "Charging is suspended\n"); 342 di->chg_info.charger_type = NO_CHG; 343 abx500_chargalg_state_to(di, STATE_SUSPENDED_INIT); 344 } else { 345 dev_dbg(di->dev, "Charging source is OFF\n"); 346 di->chg_info.charger_type = NO_CHG; 347 abx500_chargalg_state_to(di, STATE_HANDHELD_INIT); 348 } 349 di->chg_info.prev_conn_chg = di->chg_info.conn_chg; 350 di->susp_status.suspended_change = false; 351 } 352 return di->chg_info.conn_chg; 353} 354 355/** 356 * abx500_chargalg_start_safety_timer() - Start charging safety timer 357 * @di: pointer to the abx500_chargalg structure 358 * 359 * The safety timer is used to avoid overcharging of old or bad batteries. 360 * There are different timers for AC and USB 361 */ 362static void abx500_chargalg_start_safety_timer(struct abx500_chargalg *di) 363{ 364 unsigned long timer_expiration = 0; 365 366 switch (di->chg_info.charger_type) { 367 case AC_CHG: 368 timer_expiration = 369 round_jiffies(jiffies + 370 (di->bat->main_safety_tmr_h * 3600 * HZ)); 371 break; 372 373 case USB_CHG: 374 timer_expiration = 375 round_jiffies(jiffies + 376 (di->bat->usb_safety_tmr_h * 3600 * HZ)); 377 break; 378 379 default: 380 dev_err(di->dev, "Unknown charger to charge from\n"); 381 break; 382 } 383 384 di->events.safety_timer_expired = false; 385 di->safety_timer.expires = timer_expiration; 386 if (!timer_pending(&di->safety_timer)) 387 add_timer(&di->safety_timer); 388 else 389 mod_timer(&di->safety_timer, timer_expiration); 390} 391 392/** 393 * abx500_chargalg_stop_safety_timer() - Stop charging safety timer 394 * @di: pointer to the abx500_chargalg structure 395 * 396 * The safety timer is stopped whenever the NORMAL state is exited 397 */ 398static void abx500_chargalg_stop_safety_timer(struct abx500_chargalg *di) 399{ 400 di->events.safety_timer_expired = false; 401 del_timer(&di->safety_timer); 402} 403 404/** 405 * abx500_chargalg_start_maintenance_timer() - Start charging maintenance timer 406 * @di: pointer to the abx500_chargalg structure 407 * @duration: duration of ther maintenance timer in hours 408 * 409 * The maintenance timer is used to maintain the charge in the battery once 410 * the battery is considered full. These timers are chosen to match the 411 * discharge curve of the battery 412 */ 413static void abx500_chargalg_start_maintenance_timer(struct abx500_chargalg *di, 414 int duration) 415{ 416 unsigned long timer_expiration; 417 418 /* Convert from hours to jiffies */ 419 timer_expiration = round_jiffies(jiffies + (duration * 3600 * HZ)); 420 421 di->events.maintenance_timer_expired = false; 422 di->maintenance_timer.expires = timer_expiration; 423 if (!timer_pending(&di->maintenance_timer)) 424 add_timer(&di->maintenance_timer); 425 else 426 mod_timer(&di->maintenance_timer, timer_expiration); 427} 428 429/** 430 * abx500_chargalg_stop_maintenance_timer() - Stop maintenance timer 431 * @di: pointer to the abx500_chargalg structure 432 * 433 * The maintenance timer is stopped whenever maintenance ends or when another 434 * state is entered 435 */ 436static void abx500_chargalg_stop_maintenance_timer(struct abx500_chargalg *di) 437{ 438 di->events.maintenance_timer_expired = false; 439 del_timer(&di->maintenance_timer); 440} 441 442/** 443 * abx500_chargalg_kick_watchdog() - Kick charger watchdog 444 * @di: pointer to the abx500_chargalg structure 445 * 446 * The charger watchdog have to be kicked periodically whenever the charger is 447 * on, else the ABB will reset the system 448 */ 449static int abx500_chargalg_kick_watchdog(struct abx500_chargalg *di) 450{ 451 /* Check if charger exists and kick watchdog if charging */ 452 if (di->ac_chg && di->ac_chg->ops.kick_wd && 453 di->chg_info.online_chg & AC_CHG) 454 return di->ac_chg->ops.kick_wd(di->ac_chg); 455 else if (di->usb_chg && di->usb_chg->ops.kick_wd && 456 di->chg_info.online_chg & USB_CHG) 457 return di->usb_chg->ops.kick_wd(di->usb_chg); 458 459 return -ENXIO; 460} 461 462/** 463 * abx500_chargalg_ac_en() - Turn on/off the AC charger 464 * @di: pointer to the abx500_chargalg structure 465 * @enable: charger on/off 466 * @vset: requested charger output voltage 467 * @iset: requested charger output current 468 * 469 * The AC charger will be turned on/off with the requested charge voltage and 470 * current 471 */ 472static int abx500_chargalg_ac_en(struct abx500_chargalg *di, int enable, 473 int vset, int iset) 474{ 475 if (!di->ac_chg || !di->ac_chg->ops.enable) 476 return -ENXIO; 477 478 /* Select maximum of what both the charger and the battery supports */ 479 if (di->ac_chg->max_out_volt) 480 vset = min(vset, di->ac_chg->max_out_volt); 481 if (di->ac_chg->max_out_curr) 482 iset = min(iset, di->ac_chg->max_out_curr); 483 484 di->chg_info.ac_iset = iset; 485 di->chg_info.ac_vset = vset; 486 487 return di->ac_chg->ops.enable(di->ac_chg, enable, vset, iset); 488} 489 490/** 491 * abx500_chargalg_usb_en() - Turn on/off the USB charger 492 * @di: pointer to the abx500_chargalg structure 493 * @enable: charger on/off 494 * @vset: requested charger output voltage 495 * @iset: requested charger output current 496 * 497 * The USB charger will be turned on/off with the requested charge voltage and 498 * current 499 */ 500static int abx500_chargalg_usb_en(struct abx500_chargalg *di, int enable, 501 int vset, int iset) 502{ 503 if (!di->usb_chg || !di->usb_chg->ops.enable) 504 return -ENXIO; 505 506 /* Select maximum of what both the charger and the battery supports */ 507 if (di->usb_chg->max_out_volt) 508 vset = min(vset, di->usb_chg->max_out_volt); 509 if (di->usb_chg->max_out_curr) 510 iset = min(iset, di->usb_chg->max_out_curr); 511 512 di->chg_info.usb_iset = iset; 513 di->chg_info.usb_vset = vset; 514 515 return di->usb_chg->ops.enable(di->usb_chg, enable, vset, iset); 516} 517 518/** 519 * abx500_chargalg_update_chg_curr() - Update charger current 520 * @di: pointer to the abx500_chargalg structure 521 * @iset: requested charger output current 522 * 523 * The charger output current will be updated for the charger 524 * that is currently in use 525 */ 526static int abx500_chargalg_update_chg_curr(struct abx500_chargalg *di, 527 int iset) 528{ 529 /* Check if charger exists and update current if charging */ 530 if (di->ac_chg && di->ac_chg->ops.update_curr && 531 di->chg_info.charger_type & AC_CHG) { 532 /* 533 * Select maximum of what both the charger 534 * and the battery supports 535 */ 536 if (di->ac_chg->max_out_curr) 537 iset = min(iset, di->ac_chg->max_out_curr); 538 539 di->chg_info.ac_iset = iset; 540 541 return di->ac_chg->ops.update_curr(di->ac_chg, iset); 542 } else if (di->usb_chg && di->usb_chg->ops.update_curr && 543 di->chg_info.charger_type & USB_CHG) { 544 /* 545 * Select maximum of what both the charger 546 * and the battery supports 547 */ 548 if (di->usb_chg->max_out_curr) 549 iset = min(iset, di->usb_chg->max_out_curr); 550 551 di->chg_info.usb_iset = iset; 552 553 return di->usb_chg->ops.update_curr(di->usb_chg, iset); 554 } 555 556 return -ENXIO; 557} 558 559/** 560 * abx500_chargalg_stop_charging() - Stop charging 561 * @di: pointer to the abx500_chargalg structure 562 * 563 * This function is called from any state where charging should be stopped. 564 * All charging is disabled and all status parameters and timers are changed 565 * accordingly 566 */ 567static void abx500_chargalg_stop_charging(struct abx500_chargalg *di) 568{ 569 abx500_chargalg_ac_en(di, false, 0, 0); 570 abx500_chargalg_usb_en(di, false, 0, 0); 571 abx500_chargalg_stop_safety_timer(di); 572 abx500_chargalg_stop_maintenance_timer(di); 573 di->charge_status = POWER_SUPPLY_STATUS_NOT_CHARGING; 574 di->maintenance_chg = false; 575 cancel_delayed_work(&di->chargalg_wd_work); 576 power_supply_changed(&di->chargalg_psy); 577} 578 579/** 580 * abx500_chargalg_hold_charging() - Pauses charging 581 * @di: pointer to the abx500_chargalg structure 582 * 583 * This function is called in the case where maintenance charging has been 584 * disabled and instead a battery voltage mode is entered to check when the 585 * battery voltage has reached a certain recharge voltage 586 */ 587static void abx500_chargalg_hold_charging(struct abx500_chargalg *di) 588{ 589 abx500_chargalg_ac_en(di, false, 0, 0); 590 abx500_chargalg_usb_en(di, false, 0, 0); 591 abx500_chargalg_stop_safety_timer(di); 592 abx500_chargalg_stop_maintenance_timer(di); 593 di->charge_status = POWER_SUPPLY_STATUS_CHARGING; 594 di->maintenance_chg = false; 595 cancel_delayed_work(&di->chargalg_wd_work); 596 power_supply_changed(&di->chargalg_psy); 597} 598 599/** 600 * abx500_chargalg_start_charging() - Start the charger 601 * @di: pointer to the abx500_chargalg structure 602 * @vset: requested charger output voltage 603 * @iset: requested charger output current 604 * 605 * A charger will be enabled depending on the requested charger type that was 606 * detected previously. 607 */ 608static void abx500_chargalg_start_charging(struct abx500_chargalg *di, 609 int vset, int iset) 610{ 611 switch (di->chg_info.charger_type) { 612 case AC_CHG: 613 dev_dbg(di->dev, 614 "AC parameters: Vset %d, Ich %d\n", vset, iset); 615 abx500_chargalg_usb_en(di, false, 0, 0); 616 abx500_chargalg_ac_en(di, true, vset, iset); 617 break; 618 619 case USB_CHG: 620 dev_dbg(di->dev, 621 "USB parameters: Vset %d, Ich %d\n", vset, iset); 622 abx500_chargalg_ac_en(di, false, 0, 0); 623 abx500_chargalg_usb_en(di, true, vset, iset); 624 break; 625 626 default: 627 dev_err(di->dev, "Unknown charger to charge from\n"); 628 break; 629 } 630} 631 632/** 633 * abx500_chargalg_check_temp() - Check battery temperature ranges 634 * @di: pointer to the abx500_chargalg structure 635 * 636 * The battery temperature is checked against the predefined limits and the 637 * charge state is changed accordingly 638 */ 639static void abx500_chargalg_check_temp(struct abx500_chargalg *di) 640{ 641 if (di->batt_data.temp > (di->bat->temp_low + di->t_hyst_norm) && 642 di->batt_data.temp < (di->bat->temp_high - di->t_hyst_norm)) { 643 /* Temp OK! */ 644 di->events.btemp_underover = false; 645 di->events.btemp_lowhigh = false; 646 di->t_hyst_norm = 0; 647 di->t_hyst_lowhigh = 0; 648 } else { 649 if (((di->batt_data.temp >= di->bat->temp_high) && 650 (di->batt_data.temp < 651 (di->bat->temp_over - di->t_hyst_lowhigh))) || 652 ((di->batt_data.temp > 653 (di->bat->temp_under + di->t_hyst_lowhigh)) && 654 (di->batt_data.temp <= di->bat->temp_low))) { 655 /* TEMP minor!!!!! */ 656 di->events.btemp_underover = false; 657 di->events.btemp_lowhigh = true; 658 di->t_hyst_norm = di->bat->temp_hysteresis; 659 di->t_hyst_lowhigh = 0; 660 } else if (di->batt_data.temp <= di->bat->temp_under || 661 di->batt_data.temp >= di->bat->temp_over) { 662 /* TEMP major!!!!! */ 663 di->events.btemp_underover = true; 664 di->events.btemp_lowhigh = false; 665 di->t_hyst_norm = 0; 666 di->t_hyst_lowhigh = di->bat->temp_hysteresis; 667 } else { 668 /* Within hysteresis */ 669 dev_dbg(di->dev, "Within hysteresis limit temp: %d " 670 "hyst_lowhigh %d, hyst normal %d\n", 671 di->batt_data.temp, di->t_hyst_lowhigh, 672 di->t_hyst_norm); 673 } 674 } 675} 676 677/** 678 * abx500_chargalg_check_charger_voltage() - Check charger voltage 679 * @di: pointer to the abx500_chargalg structure 680 * 681 * Charger voltage is checked against maximum limit 682 */ 683static void abx500_chargalg_check_charger_voltage(struct abx500_chargalg *di) 684{ 685 if (di->chg_info.usb_volt > di->bat->chg_params->usb_volt_max) 686 di->chg_info.usb_chg_ok = false; 687 else 688 di->chg_info.usb_chg_ok = true; 689 690 if (di->chg_info.ac_volt > di->bat->chg_params->ac_volt_max) 691 di->chg_info.ac_chg_ok = false; 692 else 693 di->chg_info.ac_chg_ok = true; 694 695} 696 697/** 698 * abx500_chargalg_end_of_charge() - Check if end-of-charge criteria is fulfilled 699 * @di: pointer to the abx500_chargalg structure 700 * 701 * End-of-charge criteria is fulfilled when the battery voltage is above a 702 * certain limit and the battery current is below a certain limit for a 703 * predefined number of consecutive seconds. If true, the battery is full 704 */ 705static void abx500_chargalg_end_of_charge(struct abx500_chargalg *di) 706{ 707 if (di->charge_status == POWER_SUPPLY_STATUS_CHARGING && 708 di->charge_state == STATE_NORMAL && 709 !di->maintenance_chg && (di->batt_data.volt >= 710 di->bat->bat_type[di->bat->batt_id].termination_vol || 711 di->events.usb_cv_active || di->events.ac_cv_active) && 712 di->batt_data.avg_curr < 713 di->bat->bat_type[di->bat->batt_id].termination_curr && 714 di->batt_data.avg_curr > 0) { 715 if (++di->eoc_cnt >= EOC_COND_CNT) { 716 di->eoc_cnt = 0; 717 di->charge_status = POWER_SUPPLY_STATUS_FULL; 718 di->maintenance_chg = true; 719 dev_dbg(di->dev, "EOC reached!\n"); 720 power_supply_changed(&di->chargalg_psy); 721 } else { 722 dev_dbg(di->dev, 723 " EOC limit reached for the %d" 724 " time, out of %d before EOC\n", 725 di->eoc_cnt, 726 EOC_COND_CNT); 727 } 728 } else { 729 di->eoc_cnt = 0; 730 } 731} 732 733static void init_maxim_chg_curr(struct abx500_chargalg *di) 734{ 735 di->ccm.original_iset = 736 di->bat->bat_type[di->bat->batt_id].normal_cur_lvl; 737 di->ccm.current_iset = 738 di->bat->bat_type[di->bat->batt_id].normal_cur_lvl; 739 di->ccm.test_delta_i = di->bat->maxi->charger_curr_step; 740 di->ccm.max_current = di->bat->maxi->chg_curr; 741 di->ccm.condition_cnt = di->bat->maxi->wait_cycles; 742 di->ccm.level = 0; 743} 744 745/** 746 * abx500_chargalg_chg_curr_maxim - increases the charger current to 747 * compensate for the system load 748 * @di pointer to the abx500_chargalg structure 749 * 750 * This maximization function is used to raise the charger current to get the 751 * battery current as close to the optimal value as possible. The battery 752 * current during charging is affected by the system load 753 */ 754static enum maxim_ret abx500_chargalg_chg_curr_maxim(struct abx500_chargalg *di) 755{ 756 int delta_i; 757 758 if (!di->bat->maxi->ena_maxi) 759 return MAXIM_RET_NOACTION; 760 761 delta_i = di->ccm.original_iset - di->batt_data.inst_curr; 762 763 if (di->events.vbus_collapsed) { 764 dev_dbg(di->dev, "Charger voltage has collapsed %d\n", 765 di->ccm.wait_cnt); 766 if (di->ccm.wait_cnt == 0) { 767 dev_dbg(di->dev, "lowering current\n"); 768 di->ccm.wait_cnt++; 769 di->ccm.condition_cnt = di->bat->maxi->wait_cycles; 770 di->ccm.max_current = 771 di->ccm.current_iset - di->ccm.test_delta_i; 772 di->ccm.current_iset = di->ccm.max_current; 773 di->ccm.level--; 774 return MAXIM_RET_CHANGE; 775 } else { 776 dev_dbg(di->dev, "waiting\n"); 777 /* Let's go in here twice before lowering curr again */ 778 di->ccm.wait_cnt = (di->ccm.wait_cnt + 1) % 3; 779 return MAXIM_RET_NOACTION; 780 } 781 } 782 783 di->ccm.wait_cnt = 0; 784 785 if ((di->batt_data.inst_curr > di->ccm.original_iset)) { 786 dev_dbg(di->dev, " Maximization Ibat (%dmA) too high" 787 " (limit %dmA) (current iset: %dmA)!\n", 788 di->batt_data.inst_curr, di->ccm.original_iset, 789 di->ccm.current_iset); 790 791 if (di->ccm.current_iset == di->ccm.original_iset) 792 return MAXIM_RET_NOACTION; 793 794 di->ccm.condition_cnt = di->bat->maxi->wait_cycles; 795 di->ccm.current_iset = di->ccm.original_iset; 796 di->ccm.level = 0; 797 798 return MAXIM_RET_IBAT_TOO_HIGH; 799 } 800 801 if (delta_i > di->ccm.test_delta_i && 802 (di->ccm.current_iset + di->ccm.test_delta_i) < 803 di->ccm.max_current) { 804 if (di->ccm.condition_cnt-- == 0) { 805 /* Increse the iset with cco.test_delta_i */ 806 di->ccm.condition_cnt = di->bat->maxi->wait_cycles; 807 di->ccm.current_iset += di->ccm.test_delta_i; 808 di->ccm.level++; 809 dev_dbg(di->dev, " Maximization needed, increase" 810 " with %d mA to %dmA (Optimal ibat: %d)" 811 " Level %d\n", 812 di->ccm.test_delta_i, 813 di->ccm.current_iset, 814 di->ccm.original_iset, 815 di->ccm.level); 816 return MAXIM_RET_CHANGE; 817 } else { 818 return MAXIM_RET_NOACTION; 819 } 820 } else { 821 di->ccm.condition_cnt = di->bat->maxi->wait_cycles; 822 return MAXIM_RET_NOACTION; 823 } 824} 825 826static void handle_maxim_chg_curr(struct abx500_chargalg *di) 827{ 828 enum maxim_ret ret; 829 int result; 830 831 ret = abx500_chargalg_chg_curr_maxim(di); 832 switch (ret) { 833 case MAXIM_RET_CHANGE: 834 result = abx500_chargalg_update_chg_curr(di, 835 di->ccm.current_iset); 836 if (result) 837 dev_err(di->dev, "failed to set chg curr\n"); 838 break; 839 case MAXIM_RET_IBAT_TOO_HIGH: 840 result = abx500_chargalg_update_chg_curr(di, 841 di->bat->bat_type[di->bat->batt_id].normal_cur_lvl); 842 if (result) 843 dev_err(di->dev, "failed to set chg curr\n"); 844 break; 845 846 case MAXIM_RET_NOACTION: 847 default: 848 /* Do nothing..*/ 849 break; 850 } 851} 852 853static int abx500_chargalg_get_ext_psy_data(struct device *dev, void *data) 854{ 855 struct power_supply *psy; 856 struct power_supply *ext; 857 struct abx500_chargalg *di; 858 union power_supply_propval ret; 859 int i, j; 860 bool psy_found = false; 861 862 psy = (struct power_supply *)data; 863 ext = dev_get_drvdata(dev); 864 di = to_abx500_chargalg_device_info(psy); 865 /* For all psy where the driver name appears in any supplied_to */ 866 for (i = 0; i < ext->num_supplicants; i++) { 867 if (!strcmp(ext->supplied_to[i], psy->name)) 868 psy_found = true; 869 } 870 if (!psy_found) 871 return 0; 872 873 /* Go through all properties for the psy */ 874 for (j = 0; j < ext->num_properties; j++) { 875 enum power_supply_property prop; 876 prop = ext->properties[j]; 877 878 /* Initialize chargers if not already done */ 879 if (!di->ac_chg && 880 ext->type == POWER_SUPPLY_TYPE_MAINS) 881 di->ac_chg = psy_to_ux500_charger(ext); 882 else if (!di->usb_chg && 883 ext->type == POWER_SUPPLY_TYPE_USB) 884 di->usb_chg = psy_to_ux500_charger(ext); 885 886 if (ext->get_property(ext, prop, &ret)) 887 continue; 888 switch (prop) { 889 case POWER_SUPPLY_PROP_PRESENT: 890 switch (ext->type) { 891 case POWER_SUPPLY_TYPE_BATTERY: 892 /* Battery present */ 893 if (ret.intval) 894 di->events.batt_rem = false; 895 /* Battery removed */ 896 else 897 di->events.batt_rem = true; 898 break; 899 case POWER_SUPPLY_TYPE_MAINS: 900 /* AC disconnected */ 901 if (!ret.intval && 902 (di->chg_info.conn_chg & AC_CHG)) { 903 di->chg_info.prev_conn_chg = 904 di->chg_info.conn_chg; 905 di->chg_info.conn_chg &= ~AC_CHG; 906 } 907 /* AC connected */ 908 else if (ret.intval && 909 !(di->chg_info.conn_chg & AC_CHG)) { 910 di->chg_info.prev_conn_chg = 911 di->chg_info.conn_chg; 912 di->chg_info.conn_chg |= AC_CHG; 913 } 914 break; 915 case POWER_SUPPLY_TYPE_USB: 916 /* USB disconnected */ 917 if (!ret.intval && 918 (di->chg_info.conn_chg & USB_CHG)) { 919 di->chg_info.prev_conn_chg = 920 di->chg_info.conn_chg; 921 di->chg_info.conn_chg &= ~USB_CHG; 922 } 923 /* USB connected */ 924 else if (ret.intval && 925 !(di->chg_info.conn_chg & USB_CHG)) { 926 di->chg_info.prev_conn_chg = 927 di->chg_info.conn_chg; 928 di->chg_info.conn_chg |= USB_CHG; 929 } 930 break; 931 default: 932 break; 933 } 934 break; 935 936 case POWER_SUPPLY_PROP_ONLINE: 937 switch (ext->type) { 938 case POWER_SUPPLY_TYPE_BATTERY: 939 break; 940 case POWER_SUPPLY_TYPE_MAINS: 941 /* AC offline */ 942 if (!ret.intval && 943 (di->chg_info.online_chg & AC_CHG)) { 944 di->chg_info.prev_online_chg = 945 di->chg_info.online_chg; 946 di->chg_info.online_chg &= ~AC_CHG; 947 } 948 /* AC online */ 949 else if (ret.intval && 950 !(di->chg_info.online_chg & AC_CHG)) { 951 di->chg_info.prev_online_chg = 952 di->chg_info.online_chg; 953 di->chg_info.online_chg |= AC_CHG; 954 queue_delayed_work(di->chargalg_wq, 955 &di->chargalg_wd_work, 0); 956 } 957 break; 958 case POWER_SUPPLY_TYPE_USB: 959 /* USB offline */ 960 if (!ret.intval && 961 (di->chg_info.online_chg & USB_CHG)) { 962 di->chg_info.prev_online_chg = 963 di->chg_info.online_chg; 964 di->chg_info.online_chg &= ~USB_CHG; 965 } 966 /* USB online */ 967 else if (ret.intval && 968 !(di->chg_info.online_chg & USB_CHG)) { 969 di->chg_info.prev_online_chg = 970 di->chg_info.online_chg; 971 di->chg_info.online_chg |= USB_CHG; 972 queue_delayed_work(di->chargalg_wq, 973 &di->chargalg_wd_work, 0); 974 } 975 break; 976 default: 977 break; 978 } 979 break; 980 981 case POWER_SUPPLY_PROP_HEALTH: 982 switch (ext->type) { 983 case POWER_SUPPLY_TYPE_BATTERY: 984 break; 985 case POWER_SUPPLY_TYPE_MAINS: 986 switch (ret.intval) { 987 case POWER_SUPPLY_HEALTH_UNSPEC_FAILURE: 988 di->events.mainextchnotok = true; 989 di->events.main_thermal_prot = false; 990 di->events.main_ovv = false; 991 di->events.ac_wd_expired = false; 992 break; 993 case POWER_SUPPLY_HEALTH_DEAD: 994 di->events.ac_wd_expired = true; 995 di->events.mainextchnotok = false; 996 di->events.main_ovv = false; 997 di->events.main_thermal_prot = false; 998 break; 999 case POWER_SUPPLY_HEALTH_COLD: 1000 case POWER_SUPPLY_HEALTH_OVERHEAT: 1001 di->events.main_thermal_prot = true; 1002 di->events.mainextchnotok = false; 1003 di->events.main_ovv = false; 1004 di->events.ac_wd_expired = false; 1005 break; 1006 case POWER_SUPPLY_HEALTH_OVERVOLTAGE: 1007 di->events.main_ovv = true; 1008 di->events.mainextchnotok = false; 1009 di->events.main_thermal_prot = false; 1010 di->events.ac_wd_expired = false; 1011 break; 1012 case POWER_SUPPLY_HEALTH_GOOD: 1013 di->events.main_thermal_prot = false; 1014 di->events.mainextchnotok = false; 1015 di->events.main_ovv = false; 1016 di->events.ac_wd_expired = false; 1017 break; 1018 default: 1019 break; 1020 } 1021 break; 1022 1023 case POWER_SUPPLY_TYPE_USB: 1024 switch (ret.intval) { 1025 case POWER_SUPPLY_HEALTH_UNSPEC_FAILURE: 1026 di->events.usbchargernotok = true; 1027 di->events.usb_thermal_prot = false; 1028 di->events.vbus_ovv = false; 1029 di->events.usb_wd_expired = false; 1030 break; 1031 case POWER_SUPPLY_HEALTH_DEAD: 1032 di->events.usb_wd_expired = true; 1033 di->events.usbchargernotok = false; 1034 di->events.usb_thermal_prot = false; 1035 di->events.vbus_ovv = false; 1036 break; 1037 case POWER_SUPPLY_HEALTH_COLD: 1038 case POWER_SUPPLY_HEALTH_OVERHEAT: 1039 di->events.usb_thermal_prot = true; 1040 di->events.usbchargernotok = false; 1041 di->events.vbus_ovv = false; 1042 di->events.usb_wd_expired = false; 1043 break; 1044 case POWER_SUPPLY_HEALTH_OVERVOLTAGE: 1045 di->events.vbus_ovv = true; 1046 di->events.usbchargernotok = false; 1047 di->events.usb_thermal_prot = false; 1048 di->events.usb_wd_expired = false; 1049 break; 1050 case POWER_SUPPLY_HEALTH_GOOD: 1051 di->events.usbchargernotok = false; 1052 di->events.usb_thermal_prot = false; 1053 di->events.vbus_ovv = false; 1054 di->events.usb_wd_expired = false; 1055 break; 1056 default: 1057 break; 1058 } 1059 default: 1060 break; 1061 } 1062 break; 1063 1064 case POWER_SUPPLY_PROP_VOLTAGE_NOW: 1065 switch (ext->type) { 1066 case POWER_SUPPLY_TYPE_BATTERY: 1067 di->batt_data.volt = ret.intval / 1000; 1068 break; 1069 case POWER_SUPPLY_TYPE_MAINS: 1070 di->chg_info.ac_volt = ret.intval / 1000; 1071 break; 1072 case POWER_SUPPLY_TYPE_USB: 1073 di->chg_info.usb_volt = ret.intval / 1000; 1074 break; 1075 default: 1076 break; 1077 } 1078 break; 1079 1080 case POWER_SUPPLY_PROP_VOLTAGE_AVG: 1081 switch (ext->type) { 1082 case POWER_SUPPLY_TYPE_MAINS: 1083 /* AVG is used to indicate when we are 1084 * in CV mode */ 1085 if (ret.intval) 1086 di->events.ac_cv_active = true; 1087 else 1088 di->events.ac_cv_active = false; 1089 1090 break; 1091 case POWER_SUPPLY_TYPE_USB: 1092 /* AVG is used to indicate when we are 1093 * in CV mode */ 1094 if (ret.intval) 1095 di->events.usb_cv_active = true; 1096 else 1097 di->events.usb_cv_active = false; 1098 1099 break; 1100 default: 1101 break; 1102 } 1103 break; 1104 1105 case POWER_SUPPLY_PROP_TECHNOLOGY: 1106 switch (ext->type) { 1107 case POWER_SUPPLY_TYPE_BATTERY: 1108 if (ret.intval) 1109 di->events.batt_unknown = false; 1110 else 1111 di->events.batt_unknown = true; 1112 1113 break; 1114 default: 1115 break; 1116 } 1117 break; 1118 1119 case POWER_SUPPLY_PROP_TEMP: 1120 di->batt_data.temp = ret.intval / 10; 1121 break; 1122 1123 case POWER_SUPPLY_PROP_CURRENT_NOW: 1124 switch (ext->type) { 1125 case POWER_SUPPLY_TYPE_MAINS: 1126 di->chg_info.ac_curr = 1127 ret.intval / 1000; 1128 break; 1129 case POWER_SUPPLY_TYPE_USB: 1130 di->chg_info.usb_curr = 1131 ret.intval / 1000; 1132 break; 1133 case POWER_SUPPLY_TYPE_BATTERY: 1134 di->batt_data.inst_curr = ret.intval / 1000; 1135 break; 1136 default: 1137 break; 1138 } 1139 break; 1140 1141 case POWER_SUPPLY_PROP_CURRENT_AVG: 1142 switch (ext->type) { 1143 case POWER_SUPPLY_TYPE_BATTERY: 1144 di->batt_data.avg_curr = ret.intval / 1000; 1145 break; 1146 case POWER_SUPPLY_TYPE_USB: 1147 if (ret.intval) 1148 di->events.vbus_collapsed = true; 1149 else 1150 di->events.vbus_collapsed = false; 1151 break; 1152 default: 1153 break; 1154 } 1155 break; 1156 case POWER_SUPPLY_PROP_CAPACITY: 1157 di->batt_data.percent = ret.intval; 1158 break; 1159 default: 1160 break; 1161 } 1162 } 1163 return 0; 1164} 1165 1166/** 1167 * abx500_chargalg_external_power_changed() - callback for power supply changes 1168 * @psy: pointer to the structure power_supply 1169 * 1170 * This function is the entry point of the pointer external_power_changed 1171 * of the structure power_supply. 1172 * This function gets executed when there is a change in any external power 1173 * supply that this driver needs to be notified of. 1174 */ 1175static void abx500_chargalg_external_power_changed(struct power_supply *psy) 1176{ 1177 struct abx500_chargalg *di = to_abx500_chargalg_device_info(psy); 1178 1179 /* 1180 * Trigger execution of the algorithm instantly and read 1181 * all power_supply properties there instead 1182 */ 1183 queue_work(di->chargalg_wq, &di->chargalg_work); 1184} 1185 1186/** 1187 * abx500_chargalg_algorithm() - Main function for the algorithm 1188 * @di: pointer to the abx500_chargalg structure 1189 * 1190 * This is the main control function for the charging algorithm. 1191 * It is called periodically or when something happens that will 1192 * trigger a state change 1193 */ 1194static void abx500_chargalg_algorithm(struct abx500_chargalg *di) 1195{ 1196 int charger_status; 1197 1198 /* Collect data from all power_supply class devices */ 1199 class_for_each_device(power_supply_class, NULL, 1200 &di->chargalg_psy, abx500_chargalg_get_ext_psy_data); 1201 1202 abx500_chargalg_end_of_charge(di); 1203 abx500_chargalg_check_temp(di); 1204 abx500_chargalg_check_charger_voltage(di); 1205 1206 charger_status = abx500_chargalg_check_charger_connection(di); 1207 /* 1208 * First check if we have a charger connected. 1209 * Also we don't allow charging of unknown batteries if configured 1210 * this way 1211 */ 1212 if (!charger_status || 1213 (di->events.batt_unknown && !di->bat->chg_unknown_bat)) { 1214 if (di->charge_state != STATE_HANDHELD) { 1215 di->events.safety_timer_expired = false; 1216 abx500_chargalg_state_to(di, STATE_HANDHELD_INIT); 1217 } 1218 } 1219 1220 /* If suspended, we should not continue checking the flags */ 1221 else if (di->charge_state == STATE_SUSPENDED_INIT || 1222 di->charge_state == STATE_SUSPENDED) { 1223 /* We don't do anything here, just don,t continue */ 1224 } 1225 1226 /* Safety timer expiration */ 1227 else if (di->events.safety_timer_expired) { 1228 if (di->charge_state != STATE_SAFETY_TIMER_EXPIRED) 1229 abx500_chargalg_state_to(di, 1230 STATE_SAFETY_TIMER_EXPIRED_INIT); 1231 } 1232 /* 1233 * Check if any interrupts has occured 1234 * that will prevent us from charging 1235 */ 1236 1237 /* Battery removed */ 1238 else if (di->events.batt_rem) { 1239 if (di->charge_state != STATE_BATT_REMOVED) 1240 abx500_chargalg_state_to(di, STATE_BATT_REMOVED_INIT); 1241 } 1242 /* Main or USB charger not ok. */ 1243 else if (di->events.mainextchnotok || di->events.usbchargernotok) { 1244 /* 1245 * If vbus_collapsed is set, we have to lower the charger 1246 * current, which is done in the normal state below 1247 */ 1248 if (di->charge_state != STATE_CHG_NOT_OK && 1249 !di->events.vbus_collapsed) 1250 abx500_chargalg_state_to(di, STATE_CHG_NOT_OK_INIT); 1251 } 1252 /* VBUS, Main or VBAT OVV. */ 1253 else if (di->events.vbus_ovv || 1254 di->events.main_ovv || 1255 di->events.batt_ovv || 1256 !di->chg_info.usb_chg_ok || 1257 !di->chg_info.ac_chg_ok) { 1258 if (di->charge_state != STATE_OVV_PROTECT) 1259 abx500_chargalg_state_to(di, STATE_OVV_PROTECT_INIT); 1260 } 1261 /* USB Thermal, stop charging */ 1262 else if (di->events.main_thermal_prot || 1263 di->events.usb_thermal_prot) { 1264 if (di->charge_state != STATE_HW_TEMP_PROTECT) 1265 abx500_chargalg_state_to(di, 1266 STATE_HW_TEMP_PROTECT_INIT); 1267 } 1268 /* Battery temp over/under */ 1269 else if (di->events.btemp_underover) { 1270 if (di->charge_state != STATE_TEMP_UNDEROVER) 1271 abx500_chargalg_state_to(di, 1272 STATE_TEMP_UNDEROVER_INIT); 1273 } 1274 /* Watchdog expired */ 1275 else if (di->events.ac_wd_expired || 1276 di->events.usb_wd_expired) { 1277 if (di->charge_state != STATE_WD_EXPIRED) 1278 abx500_chargalg_state_to(di, STATE_WD_EXPIRED_INIT); 1279 } 1280 /* Battery temp high/low */ 1281 else if (di->events.btemp_lowhigh) { 1282 if (di->charge_state != STATE_TEMP_LOWHIGH) 1283 abx500_chargalg_state_to(di, STATE_TEMP_LOWHIGH_INIT); 1284 } 1285 1286 dev_dbg(di->dev, 1287 "[CHARGALG] Vb %d Ib_avg %d Ib_inst %d Tb %d Cap %d Maint %d " 1288 "State %s Active_chg %d Chg_status %d AC %d USB %d " 1289 "AC_online %d USB_online %d AC_CV %d USB_CV %d AC_I %d " 1290 "USB_I %d AC_Vset %d AC_Iset %d USB_Vset %d USB_Iset %d\n", 1291 di->batt_data.volt, 1292 di->batt_data.avg_curr, 1293 di->batt_data.inst_curr, 1294 di->batt_data.temp, 1295 di->batt_data.percent, 1296 di->maintenance_chg, 1297 states[di->charge_state], 1298 di->chg_info.charger_type, 1299 di->charge_status, 1300 di->chg_info.conn_chg & AC_CHG, 1301 di->chg_info.conn_chg & USB_CHG, 1302 di->chg_info.online_chg & AC_CHG, 1303 di->chg_info.online_chg & USB_CHG, 1304 di->events.ac_cv_active, 1305 di->events.usb_cv_active, 1306 di->chg_info.ac_curr, 1307 di->chg_info.usb_curr, 1308 di->chg_info.ac_vset, 1309 di->chg_info.ac_iset, 1310 di->chg_info.usb_vset, 1311 di->chg_info.usb_iset); 1312 1313 switch (di->charge_state) { 1314 case STATE_HANDHELD_INIT: 1315 abx500_chargalg_stop_charging(di); 1316 di->charge_status = POWER_SUPPLY_STATUS_DISCHARGING; 1317 abx500_chargalg_state_to(di, STATE_HANDHELD); 1318 /* Intentional fallthrough */ 1319 1320 case STATE_HANDHELD: 1321 break; 1322 1323 case STATE_SUSPENDED_INIT: 1324 if (di->susp_status.ac_suspended) 1325 abx500_chargalg_ac_en(di, false, 0, 0); 1326 if (di->susp_status.usb_suspended) 1327 abx500_chargalg_usb_en(di, false, 0, 0); 1328 abx500_chargalg_stop_safety_timer(di); 1329 abx500_chargalg_stop_maintenance_timer(di); 1330 di->charge_status = POWER_SUPPLY_STATUS_NOT_CHARGING; 1331 di->maintenance_chg = false; 1332 abx500_chargalg_state_to(di, STATE_SUSPENDED); 1333 power_supply_changed(&di->chargalg_psy); 1334 /* Intentional fallthrough */ 1335 1336 case STATE_SUSPENDED: 1337 /* CHARGING is suspended */ 1338 break; 1339 1340 case STATE_BATT_REMOVED_INIT: 1341 abx500_chargalg_stop_charging(di); 1342 abx500_chargalg_state_to(di, STATE_BATT_REMOVED); 1343 /* Intentional fallthrough */ 1344 1345 case STATE_BATT_REMOVED: 1346 if (!di->events.batt_rem) 1347 abx500_chargalg_state_to(di, STATE_NORMAL_INIT); 1348 break; 1349 1350 case STATE_HW_TEMP_PROTECT_INIT: 1351 abx500_chargalg_stop_charging(di); 1352 abx500_chargalg_state_to(di, STATE_HW_TEMP_PROTECT); 1353 /* Intentional fallthrough */ 1354 1355 case STATE_HW_TEMP_PROTECT: 1356 if (!di->events.main_thermal_prot && 1357 !di->events.usb_thermal_prot) 1358 abx500_chargalg_state_to(di, STATE_NORMAL_INIT); 1359 break; 1360 1361 case STATE_OVV_PROTECT_INIT: 1362 abx500_chargalg_stop_charging(di); 1363 abx500_chargalg_state_to(di, STATE_OVV_PROTECT); 1364 /* Intentional fallthrough */ 1365 1366 case STATE_OVV_PROTECT: 1367 if (!di->events.vbus_ovv && 1368 !di->events.main_ovv && 1369 !di->events.batt_ovv && 1370 di->chg_info.usb_chg_ok && 1371 di->chg_info.ac_chg_ok) 1372 abx500_chargalg_state_to(di, STATE_NORMAL_INIT); 1373 break; 1374 1375 case STATE_CHG_NOT_OK_INIT: 1376 abx500_chargalg_stop_charging(di); 1377 abx500_chargalg_state_to(di, STATE_CHG_NOT_OK); 1378 /* Intentional fallthrough */ 1379 1380 case STATE_CHG_NOT_OK: 1381 if (!di->events.mainextchnotok && 1382 !di->events.usbchargernotok) 1383 abx500_chargalg_state_to(di, STATE_NORMAL_INIT); 1384 break; 1385 1386 case STATE_SAFETY_TIMER_EXPIRED_INIT: 1387 abx500_chargalg_stop_charging(di); 1388 abx500_chargalg_state_to(di, STATE_SAFETY_TIMER_EXPIRED); 1389 /* Intentional fallthrough */ 1390 1391 case STATE_SAFETY_TIMER_EXPIRED: 1392 /* We exit this state when charger is removed */ 1393 break; 1394 1395 case STATE_NORMAL_INIT: 1396 abx500_chargalg_start_charging(di, 1397 di->bat->bat_type[di->bat->batt_id].normal_vol_lvl, 1398 di->bat->bat_type[di->bat->batt_id].normal_cur_lvl); 1399 abx500_chargalg_state_to(di, STATE_NORMAL); 1400 abx500_chargalg_start_safety_timer(di); 1401 abx500_chargalg_stop_maintenance_timer(di); 1402 init_maxim_chg_curr(di); 1403 di->charge_status = POWER_SUPPLY_STATUS_CHARGING; 1404 di->eoc_cnt = 0; 1405 di->maintenance_chg = false; 1406 power_supply_changed(&di->chargalg_psy); 1407 1408 break; 1409 1410 case STATE_NORMAL: 1411 handle_maxim_chg_curr(di); 1412 if (di->charge_status == POWER_SUPPLY_STATUS_FULL && 1413 di->maintenance_chg) { 1414 if (di->bat->no_maintenance) 1415 abx500_chargalg_state_to(di, 1416 STATE_WAIT_FOR_RECHARGE_INIT); 1417 else 1418 abx500_chargalg_state_to(di, 1419 STATE_MAINTENANCE_A_INIT); 1420 } 1421 break; 1422 1423 /* This state will be used when the maintenance state is disabled */ 1424 case STATE_WAIT_FOR_RECHARGE_INIT: 1425 abx500_chargalg_hold_charging(di); 1426 abx500_chargalg_state_to(di, STATE_WAIT_FOR_RECHARGE); 1427 di->rch_cnt = RCH_COND_CNT; 1428 /* Intentional fallthrough */ 1429 1430 case STATE_WAIT_FOR_RECHARGE: 1431 if (di->batt_data.volt <= 1432 di->bat->bat_type[di->bat->batt_id].recharge_vol) { 1433 if (di->rch_cnt-- == 0) 1434 abx500_chargalg_state_to(di, STATE_NORMAL_INIT); 1435 } else 1436 di->rch_cnt = RCH_COND_CNT; 1437 break; 1438 1439 case STATE_MAINTENANCE_A_INIT: 1440 abx500_chargalg_stop_safety_timer(di); 1441 abx500_chargalg_start_maintenance_timer(di, 1442 di->bat->bat_type[ 1443 di->bat->batt_id].maint_a_chg_timer_h); 1444 abx500_chargalg_start_charging(di, 1445 di->bat->bat_type[ 1446 di->bat->batt_id].maint_a_vol_lvl, 1447 di->bat->bat_type[ 1448 di->bat->batt_id].maint_a_cur_lvl); 1449 abx500_chargalg_state_to(di, STATE_MAINTENANCE_A); 1450 power_supply_changed(&di->chargalg_psy); 1451 /* Intentional fallthrough*/ 1452 1453 case STATE_MAINTENANCE_A: 1454 if (di->events.maintenance_timer_expired) { 1455 abx500_chargalg_stop_maintenance_timer(di); 1456 abx500_chargalg_state_to(di, STATE_MAINTENANCE_B_INIT); 1457 } 1458 break; 1459 1460 case STATE_MAINTENANCE_B_INIT: 1461 abx500_chargalg_start_maintenance_timer(di, 1462 di->bat->bat_type[ 1463 di->bat->batt_id].maint_b_chg_timer_h); 1464 abx500_chargalg_start_charging(di, 1465 di->bat->bat_type[ 1466 di->bat->batt_id].maint_b_vol_lvl, 1467 di->bat->bat_type[ 1468 di->bat->batt_id].maint_b_cur_lvl); 1469 abx500_chargalg_state_to(di, STATE_MAINTENANCE_B); 1470 power_supply_changed(&di->chargalg_psy); 1471 /* Intentional fallthrough*/ 1472 1473 case STATE_MAINTENANCE_B: 1474 if (di->events.maintenance_timer_expired) { 1475 abx500_chargalg_stop_maintenance_timer(di); 1476 abx500_chargalg_state_to(di, STATE_NORMAL_INIT); 1477 } 1478 break; 1479 1480 case STATE_TEMP_LOWHIGH_INIT: 1481 abx500_chargalg_start_charging(di, 1482 di->bat->bat_type[ 1483 di->bat->batt_id].low_high_vol_lvl, 1484 di->bat->bat_type[ 1485 di->bat->batt_id].low_high_cur_lvl); 1486 abx500_chargalg_stop_maintenance_timer(di); 1487 di->charge_status = POWER_SUPPLY_STATUS_CHARGING; 1488 abx500_chargalg_state_to(di, STATE_TEMP_LOWHIGH); 1489 power_supply_changed(&di->chargalg_psy); 1490 /* Intentional fallthrough */ 1491 1492 case STATE_TEMP_LOWHIGH: 1493 if (!di->events.btemp_lowhigh) 1494 abx500_chargalg_state_to(di, STATE_NORMAL_INIT); 1495 break; 1496 1497 case STATE_WD_EXPIRED_INIT: 1498 abx500_chargalg_stop_charging(di); 1499 abx500_chargalg_state_to(di, STATE_WD_EXPIRED); 1500 /* Intentional fallthrough */ 1501 1502 case STATE_WD_EXPIRED: 1503 if (!di->events.ac_wd_expired && 1504 !di->events.usb_wd_expired) 1505 abx500_chargalg_state_to(di, STATE_NORMAL_INIT); 1506 break; 1507 1508 case STATE_TEMP_UNDEROVER_INIT: 1509 abx500_chargalg_stop_charging(di); 1510 abx500_chargalg_state_to(di, STATE_TEMP_UNDEROVER); 1511 /* Intentional fallthrough */ 1512 1513 case STATE_TEMP_UNDEROVER: 1514 if (!di->events.btemp_underover) 1515 abx500_chargalg_state_to(di, STATE_NORMAL_INIT); 1516 break; 1517 } 1518 1519 /* Start charging directly if the new state is a charge state */ 1520 if (di->charge_state == STATE_NORMAL_INIT || 1521 di->charge_state == STATE_MAINTENANCE_A_INIT || 1522 di->charge_state == STATE_MAINTENANCE_B_INIT) 1523 queue_work(di->chargalg_wq, &di->chargalg_work); 1524} 1525 1526/** 1527 * abx500_chargalg_periodic_work() - Periodic work for the algorithm 1528 * @work: pointer to the work_struct structure 1529 * 1530 * Work queue function for the charging algorithm 1531 */ 1532static void abx500_chargalg_periodic_work(struct work_struct *work) 1533{ 1534 struct abx500_chargalg *di = container_of(work, 1535 struct abx500_chargalg, chargalg_periodic_work.work); 1536 1537 abx500_chargalg_algorithm(di); 1538 1539 /* 1540 * If a charger is connected then the battery has to be monitored 1541 * frequently, else the work can be delayed. 1542 */ 1543 if (di->chg_info.conn_chg) 1544 queue_delayed_work(di->chargalg_wq, 1545 &di->chargalg_periodic_work, 1546 di->bat->interval_charging * HZ); 1547 else 1548 queue_delayed_work(di->chargalg_wq, 1549 &di->chargalg_periodic_work, 1550 di->bat->interval_not_charging * HZ); 1551} 1552 1553/** 1554 * abx500_chargalg_wd_work() - periodic work to kick the charger watchdog 1555 * @work: pointer to the work_struct structure 1556 * 1557 * Work queue function for kicking the charger watchdog 1558 */ 1559static void abx500_chargalg_wd_work(struct work_struct *work) 1560{ 1561 int ret; 1562 struct abx500_chargalg *di = container_of(work, 1563 struct abx500_chargalg, chargalg_wd_work.work); 1564 1565 dev_dbg(di->dev, "abx500_chargalg_wd_work\n"); 1566 1567 ret = abx500_chargalg_kick_watchdog(di); 1568 if (ret < 0) 1569 dev_err(di->dev, "failed to kick watchdog\n"); 1570 1571 queue_delayed_work(di->chargalg_wq, 1572 &di->chargalg_wd_work, CHG_WD_INTERVAL); 1573} 1574 1575/** 1576 * abx500_chargalg_work() - Work to run the charging algorithm instantly 1577 * @work: pointer to the work_struct structure 1578 * 1579 * Work queue function for calling the charging algorithm 1580 */ 1581static void abx500_chargalg_work(struct work_struct *work) 1582{ 1583 struct abx500_chargalg *di = container_of(work, 1584 struct abx500_chargalg, chargalg_work); 1585 1586 abx500_chargalg_algorithm(di); 1587} 1588 1589/** 1590 * abx500_chargalg_get_property() - get the chargalg properties 1591 * @psy: pointer to the power_supply structure 1592 * @psp: pointer to the power_supply_property structure 1593 * @val: pointer to the power_supply_propval union 1594 * 1595 * This function gets called when an application tries to get the 1596 * chargalg properties by reading the sysfs files. 1597 * status: charging/discharging/full/unknown 1598 * health: health of the battery 1599 * Returns error code in case of failure else 0 on success 1600 */ 1601static int abx500_chargalg_get_property(struct power_supply *psy, 1602 enum power_supply_property psp, 1603 union power_supply_propval *val) 1604{ 1605 struct abx500_chargalg *di; 1606 1607 di = to_abx500_chargalg_device_info(psy); 1608 1609 switch (psp) { 1610 case POWER_SUPPLY_PROP_STATUS: 1611 val->intval = di->charge_status; 1612 break; 1613 case POWER_SUPPLY_PROP_HEALTH: 1614 if (di->events.batt_ovv) { 1615 val->intval = POWER_SUPPLY_HEALTH_OVERVOLTAGE; 1616 } else if (di->events.btemp_underover) { 1617 if (di->batt_data.temp <= di->bat->temp_under) 1618 val->intval = POWER_SUPPLY_HEALTH_COLD; 1619 else 1620 val->intval = POWER_SUPPLY_HEALTH_OVERHEAT; 1621 } else { 1622 val->intval = POWER_SUPPLY_HEALTH_GOOD; 1623 } 1624 break; 1625 default: 1626 return -EINVAL; 1627 } 1628 return 0; 1629} 1630 1631/* Exposure to the sysfs interface */ 1632 1633/** 1634 * abx500_chargalg_sysfs_charger() - sysfs store operations 1635 * @kobj: pointer to the struct kobject 1636 * @attr: pointer to the struct attribute 1637 * @buf: buffer that holds the parameter passed from userspace 1638 * @length: length of the parameter passed 1639 * 1640 * Returns length of the buffer(input taken from user space) on success 1641 * else error code on failure 1642 * The operation to be performed on passing the parameters from the user space. 1643 */ 1644static ssize_t abx500_chargalg_sysfs_charger(struct kobject *kobj, 1645 struct attribute *attr, const char *buf, size_t length) 1646{ 1647 struct abx500_chargalg *di = container_of(kobj, 1648 struct abx500_chargalg, chargalg_kobject); 1649 long int param; 1650 int ac_usb; 1651 int ret; 1652 char entry = *attr->name; 1653 1654 switch (entry) { 1655 case 'c': 1656 ret = strict_strtol(buf, 10, &param); 1657 if (ret < 0) 1658 return ret; 1659 1660 ac_usb = param; 1661 switch (ac_usb) { 1662 case 0: 1663 /* Disable charging */ 1664 di->susp_status.ac_suspended = true; 1665 di->susp_status.usb_suspended = true; 1666 di->susp_status.suspended_change = true; 1667 /* Trigger a state change */ 1668 queue_work(di->chargalg_wq, 1669 &di->chargalg_work); 1670 break; 1671 case 1: 1672 /* Enable AC Charging */ 1673 di->susp_status.ac_suspended = false; 1674 di->susp_status.suspended_change = true; 1675 /* Trigger a state change */ 1676 queue_work(di->chargalg_wq, 1677 &di->chargalg_work); 1678 break; 1679 case 2: 1680 /* Enable USB charging */ 1681 di->susp_status.usb_suspended = false; 1682 di->susp_status.suspended_change = true; 1683 /* Trigger a state change */ 1684 queue_work(di->chargalg_wq, 1685 &di->chargalg_work); 1686 break; 1687 default: 1688 dev_info(di->dev, "Wrong input\n" 1689 "Enter 0. Disable AC/USB Charging\n" 1690 "1. Enable AC charging\n" 1691 "2. Enable USB Charging\n"); 1692 }; 1693 break; 1694 }; 1695 return strlen(buf); 1696} 1697 1698static struct attribute abx500_chargalg_en_charger = \ 1699{ 1700 .name = "chargalg", 1701 .mode = S_IWUGO, 1702}; 1703 1704static struct attribute *abx500_chargalg_chg[] = { 1705 &abx500_chargalg_en_charger, 1706 NULL 1707}; 1708 1709static const struct sysfs_ops abx500_chargalg_sysfs_ops = { 1710 .store = abx500_chargalg_sysfs_charger, 1711}; 1712 1713static struct kobj_type abx500_chargalg_ktype = { 1714 .sysfs_ops = &abx500_chargalg_sysfs_ops, 1715 .default_attrs = abx500_chargalg_chg, 1716}; 1717 1718/** 1719 * abx500_chargalg_sysfs_exit() - de-init of sysfs entry 1720 * @di: pointer to the struct abx500_chargalg 1721 * 1722 * This function removes the entry in sysfs. 1723 */ 1724static void abx500_chargalg_sysfs_exit(struct abx500_chargalg *di) 1725{ 1726 kobject_del(&di->chargalg_kobject); 1727} 1728 1729/** 1730 * abx500_chargalg_sysfs_init() - init of sysfs entry 1731 * @di: pointer to the struct abx500_chargalg 1732 * 1733 * This function adds an entry in sysfs. 1734 * Returns error code in case of failure else 0(on success) 1735 */ 1736static int abx500_chargalg_sysfs_init(struct abx500_chargalg *di) 1737{ 1738 int ret = 0; 1739 1740 ret = kobject_init_and_add(&di->chargalg_kobject, 1741 &abx500_chargalg_ktype, 1742 NULL, "abx500_chargalg"); 1743 if (ret < 0) 1744 dev_err(di->dev, "failed to create sysfs entry\n"); 1745 1746 return ret; 1747} 1748/* Exposure to the sysfs interface <<END>> */ 1749 1750#if defined(CONFIG_PM) 1751static int abx500_chargalg_resume(struct platform_device *pdev) 1752{ 1753 struct abx500_chargalg *di = platform_get_drvdata(pdev); 1754 1755 /* Kick charger watchdog if charging (any charger online) */ 1756 if (di->chg_info.online_chg) 1757 queue_delayed_work(di->chargalg_wq, &di->chargalg_wd_work, 0); 1758 1759 /* 1760 * Run the charging algorithm directly to be sure we don't 1761 * do it too seldom 1762 */ 1763 queue_delayed_work(di->chargalg_wq, &di->chargalg_periodic_work, 0); 1764 1765 return 0; 1766} 1767 1768static int abx500_chargalg_suspend(struct platform_device *pdev, 1769 pm_message_t state) 1770{ 1771 struct abx500_chargalg *di = platform_get_drvdata(pdev); 1772 1773 if (di->chg_info.online_chg) 1774 cancel_delayed_work_sync(&di->chargalg_wd_work); 1775 1776 cancel_delayed_work_sync(&di->chargalg_periodic_work); 1777 1778 return 0; 1779} 1780#else 1781#define abx500_chargalg_suspend NULL 1782#define abx500_chargalg_resume NULL 1783#endif 1784 1785static int __devexit abx500_chargalg_remove(struct platform_device *pdev) 1786{ 1787 struct abx500_chargalg *di = platform_get_drvdata(pdev); 1788 1789 /* sysfs interface to enable/disbale charging from user space */ 1790 abx500_chargalg_sysfs_exit(di); 1791 1792 /* Delete the work queue */ 1793 destroy_workqueue(di->chargalg_wq); 1794 1795 flush_scheduled_work(); 1796 power_supply_unregister(&di->chargalg_psy); 1797 platform_set_drvdata(pdev, NULL); 1798 kfree(di); 1799 1800 return 0; 1801} 1802 1803static int __devinit abx500_chargalg_probe(struct platform_device *pdev) 1804{ 1805 struct abx500_bm_plat_data *plat_data; 1806 int ret = 0; 1807 1808 struct abx500_chargalg *di = 1809 kzalloc(sizeof(struct abx500_chargalg), GFP_KERNEL); 1810 if (!di) 1811 return -ENOMEM; 1812 1813 /* get device struct */ 1814 di->dev = &pdev->dev; 1815 1816 plat_data = pdev->dev.platform_data; 1817 di->pdata = plat_data->chargalg; 1818 di->bat = plat_data->battery; 1819 1820 /* chargalg supply */ 1821 di->chargalg_psy.name = "abx500_chargalg"; 1822 di->chargalg_psy.type = POWER_SUPPLY_TYPE_BATTERY; 1823 di->chargalg_psy.properties = abx500_chargalg_props; 1824 di->chargalg_psy.num_properties = ARRAY_SIZE(abx500_chargalg_props); 1825 di->chargalg_psy.get_property = abx500_chargalg_get_property; 1826 di->chargalg_psy.supplied_to = di->pdata->supplied_to; 1827 di->chargalg_psy.num_supplicants = di->pdata->num_supplicants; 1828 di->chargalg_psy.external_power_changed = 1829 abx500_chargalg_external_power_changed; 1830 1831 /* Initilialize safety timer */ 1832 init_timer(&di->safety_timer); 1833 di->safety_timer.function = abx500_chargalg_safety_timer_expired; 1834 di->safety_timer.data = (unsigned long) di; 1835 1836 /* Initilialize maintenance timer */ 1837 init_timer(&di->maintenance_timer); 1838 di->maintenance_timer.function = 1839 abx500_chargalg_maintenance_timer_expired; 1840 di->maintenance_timer.data = (unsigned long) di; 1841 1842 /* Create a work queue for the chargalg */ 1843 di->chargalg_wq = 1844 create_singlethread_workqueue("abx500_chargalg_wq"); 1845 if (di->chargalg_wq == NULL) { 1846 dev_err(di->dev, "failed to create work queue\n"); 1847 goto free_device_info; 1848 } 1849 1850 /* Init work for chargalg */ 1851 INIT_DEFERRABLE_WORK(&di->chargalg_periodic_work, 1852 abx500_chargalg_periodic_work); 1853 INIT_DEFERRABLE_WORK(&di->chargalg_wd_work, 1854 abx500_chargalg_wd_work); 1855 1856 /* Init work for chargalg */ 1857 INIT_WORK(&di->chargalg_work, abx500_chargalg_work); 1858 1859 /* To detect charger at startup */ 1860 di->chg_info.prev_conn_chg = -1; 1861 1862 /* Register chargalg power supply class */ 1863 ret = power_supply_register(di->dev, &di->chargalg_psy); 1864 if (ret) { 1865 dev_err(di->dev, "failed to register chargalg psy\n"); 1866 goto free_chargalg_wq; 1867 } 1868 1869 platform_set_drvdata(pdev, di); 1870 1871 /* sysfs interface to enable/disable charging from user space */ 1872 ret = abx500_chargalg_sysfs_init(di); 1873 if (ret) { 1874 dev_err(di->dev, "failed to create sysfs entry\n"); 1875 goto free_psy; 1876 } 1877 1878 /* Run the charging algorithm */ 1879 queue_delayed_work(di->chargalg_wq, &di->chargalg_periodic_work, 0); 1880 1881 dev_info(di->dev, "probe success\n"); 1882 return ret; 1883 1884free_psy: 1885 power_supply_unregister(&di->chargalg_psy); 1886free_chargalg_wq: 1887 destroy_workqueue(di->chargalg_wq); 1888free_device_info: 1889 kfree(di); 1890 1891 return ret; 1892} 1893 1894static struct platform_driver abx500_chargalg_driver = { 1895 .probe = abx500_chargalg_probe, 1896 .remove = __devexit_p(abx500_chargalg_remove), 1897 .suspend = abx500_chargalg_suspend, 1898 .resume = abx500_chargalg_resume, 1899 .driver = { 1900 .name = "abx500-chargalg", 1901 .owner = THIS_MODULE, 1902 }, 1903}; 1904 1905static int __init abx500_chargalg_init(void) 1906{ 1907 return platform_driver_register(&abx500_chargalg_driver); 1908} 1909 1910static void __exit abx500_chargalg_exit(void) 1911{ 1912 platform_driver_unregister(&abx500_chargalg_driver); 1913} 1914 1915module_init(abx500_chargalg_init); 1916module_exit(abx500_chargalg_exit); 1917 1918MODULE_LICENSE("GPL v2"); 1919MODULE_AUTHOR("Johan Palsson, Karl Komierowski"); 1920MODULE_ALIAS("platform:abx500-chargalg"); 1921MODULE_DESCRIPTION("abx500 battery charging algorithm");