2 * bq2419x-charger.c -- BQ24190/BQ24192/BQ24192i/BQ24193 Charger driver
4 * Copyright (c) 2013-2014, NVIDIA CORPORATION. All rights reserved.
6 * Author: Laxman Dewangan <ldewangan@nvidia.com>
7 * Author: Syed Rafiuddin <srafiuddin@nvidia.com>
9 * This program is free software; you can redistribute it and/or
10 * modify it under the terms of the GNU General Public License as
11 * published by the Free Software Foundation version 2.
13 * This program is distributed "as is" WITHOUT ANY WARRANTY of any kind,
14 * whether express or implied; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 * General Public License for more details.
18 * You should have received a copy of the GNU General Public License
19 * along with this program; if not, write to the Free Software
20 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
23 #include <linux/delay.h>
24 #include <linux/err.h>
25 #include <linux/i2c.h>
26 #include <linux/init.h>
27 #include <linux/interrupt.h>
28 #include <linux/kthread.h>
29 #include <linux/sched.h>
30 #include <linux/sched/rt.h>
31 #include <linux/time.h>
32 #include <linux/timer.h>
33 #include <linux/gpio.h>
34 #include <linux/of_gpio.h>
35 #include <linux/kernel.h>
36 #include <linux/module.h>
37 #include <linux/power/bq2419x-charger.h>
38 #include <linux/regmap.h>
39 #include <linux/regmap.h>
40 #include <linux/regulator/driver.h>
41 #include <linux/regulator/machine.h>
42 #include <linux/regulator/of_regulator.h>
43 #include <linux/slab.h>
44 #include <linux/alarmtimer.h>
45 #include <linux/power/battery-charger-gauge-comm.h>
46 #include <linux/workqueue.h>
48 #define MAX_STR_PRINT 50
50 #define bq_chg_err(bq, fmt, ...) \
51 dev_err(bq->dev, "Charging Fault: " fmt, ##__VA_ARGS__)
53 #define BQ2419X_INPUT_VINDPM_OFFSET 3880
54 #define BQ2419X_CHARGE_ICHG_OFFSET 512
55 #define BQ2419X_PRE_CHG_IPRECHG_OFFSET 128
56 #define BQ2419X_PRE_CHG_TERM_OFFSET 128
57 #define BQ2419X_CHARGE_VOLTAGE_OFFSET 3504
58 #define BQ2419X_CHARGE_LED_OFF 1
59 #define BQ2419x_OTG_ENABLE_TIME (30*HZ)
61 /* input current limit */
62 static const unsigned int iinlim[] = {
63 100, 150, 500, 900, 1200, 1500, 2000, 3000,
66 static const struct regmap_config bq2419x_regmap_config = {
69 .max_register = BQ2419X_MAX_REGS,
72 struct bq2419x_reg_info {
79 struct regmap *regmap;
82 int wdt_refresh_timeout;
84 int auto_recharge_time_power_off;
85 bool emulate_input_disconnected;
88 struct mutex otg_mutex;
91 struct regulator_dev *chg_rdev;
92 struct regulator_desc chg_reg_desc;
93 struct regulator_init_data chg_reg_init_data;
95 struct regulator_dev *vbus_rdev;
96 struct regulator_desc vbus_reg_desc;
97 struct regulator_init_data vbus_reg_init_data;
99 struct battery_charger_dev *bc_dev;
102 struct delayed_work wdt_restart_wq;
103 struct delayed_work otg_reset_work;
104 int chg_restart_time;
105 int is_otg_connected;
106 int battery_presense;
107 bool cable_connected;
108 int last_charging_current;
109 bool disable_suspend_during_charging;
111 u32 auto_recharge_time_supend;
113 struct bq2419x_reg_info input_src;
114 struct bq2419x_reg_info chg_current_control;
115 struct bq2419x_reg_info prechg_term_control;
116 struct bq2419x_reg_info ir_comp_therm;
117 struct bq2419x_reg_info chg_voltage_control;
118 struct bq2419x_vbus_platform_data *vbus_pdata;
119 struct bq2419x_charger_platform_data *charger_pdata;
120 int last_input_voltage;
123 static int current_to_reg(const unsigned int *tbl,
124 size_t size, unsigned int val)
128 for (i = 0; i < size; i++)
131 return i > 0 ? i - 1 : -EINVAL;
134 static int bq2419x_charger_enable(struct bq2419x_chip *bq2419x)
138 if (bq2419x->battery_presense) {
139 dev_info(bq2419x->dev, "Charging enabled\n");
140 /* set default Charge regulation voltage */
141 ret = regmap_update_bits(bq2419x->regmap, BQ2419X_VOLT_CTRL_REG,
142 bq2419x->chg_voltage_control.mask,
143 bq2419x->chg_voltage_control.val);
145 dev_err(bq2419x->dev,
146 "VOLT_CTRL_REG update failed %d\n", ret);
149 ret = regmap_update_bits(bq2419x->regmap, BQ2419X_PWR_ON_REG,
150 BQ2419X_ENABLE_CHARGE_MASK,
151 BQ2419X_ENABLE_CHARGE);
153 dev_info(bq2419x->dev, "Charging disabled\n");
154 ret = regmap_update_bits(bq2419x->regmap, BQ2419X_PWR_ON_REG,
155 BQ2419X_ENABLE_CHARGE_MASK,
156 BQ2419X_DISABLE_CHARGE);
159 dev_err(bq2419x->dev, "register update failed, err %d\n", ret);
163 static int bq2419x_vbus_enable(struct regulator_dev *rdev)
165 struct bq2419x_chip *bq2419x = rdev_get_drvdata(rdev);
168 dev_info(bq2419x->dev, "VBUS enabled, charging disabled\n");
170 mutex_lock(&bq2419x->otg_mutex);
171 bq2419x->is_otg_connected = true;
172 ret = regmap_update_bits(bq2419x->regmap, BQ2419X_PWR_ON_REG,
173 BQ2419X_ENABLE_CHARGE_MASK, BQ2419X_ENABLE_VBUS);
175 dev_err(bq2419x->dev, "PWR_ON_REG update failed %d", ret);
176 mutex_unlock(&bq2419x->otg_mutex);
181 static int bq2419x_vbus_disable(struct regulator_dev *rdev)
183 struct bq2419x_chip *bq2419x = rdev_get_drvdata(rdev);
186 dev_info(bq2419x->dev, "VBUS disabled, charging enabled\n");
188 mutex_lock(&bq2419x->otg_mutex);
189 bq2419x->is_otg_connected = false;
190 ret = bq2419x_charger_enable(bq2419x);
192 dev_err(bq2419x->dev, "Charger enable failed %d", ret);
193 mutex_unlock(&bq2419x->otg_mutex);
198 static int bq2419x_vbus_is_enabled(struct regulator_dev *rdev)
200 struct bq2419x_chip *bq2419x = rdev_get_drvdata(rdev);
204 ret = regmap_read(bq2419x->regmap, BQ2419X_PWR_ON_REG, &data);
206 dev_err(bq2419x->dev, "PWR_ON_REG read failed %d", ret);
209 return (data & BQ2419X_ENABLE_CHARGE_MASK) == BQ2419X_ENABLE_VBUS;
212 static struct regulator_ops bq2419x_vbus_ops = {
213 .enable = bq2419x_vbus_enable,
214 .disable = bq2419x_vbus_disable,
215 .is_enabled = bq2419x_vbus_is_enabled,
218 static int bq2419x_val_to_reg(int val, int offset, int div, int nbits,
221 int max_val = offset + (BIT(nbits) - 1) * div;
227 return BIT(nbits) - 1;
230 return DIV_ROUND_UP(val - offset, div);
232 return (val - offset) / div;
235 static int bq2419x_process_charger_plat_data(struct bq2419x_chip *bq2419x,
236 struct bq2419x_charger_platform_data *chg_pdata)
239 int fast_charge_current;
240 int pre_charge_current;
241 int termination_current;
242 int ir_compensation_resistor;
243 int ir_compensation_voltage;
244 int thermal_regulation_threshold;
245 int charge_voltage_limit;
246 int vindpm, ichg, iprechg, iterm, bat_comp, vclamp, treg, vreg;
249 voltage_input = chg_pdata->input_voltage_limit_mV ?: 4200;
250 fast_charge_current =
251 chg_pdata->fast_charge_current_limit_mA ?: 4544;
253 chg_pdata->pre_charge_current_limit_mA ?: 256;
254 termination_current =
255 chg_pdata->termination_current_limit_mA ?: 128;
256 ir_compensation_resistor =
257 chg_pdata->ir_compensation_resister_ohm ?: 70;
258 ir_compensation_voltage =
259 chg_pdata->ir_compensation_voltage_mV ?: 112;
260 thermal_regulation_threshold =
261 chg_pdata->thermal_regulation_threshold_degC ?: 100;
262 charge_voltage_limit =
263 chg_pdata->charge_voltage_limit_mV ?: 4208;
265 voltage_input = 4200;
266 fast_charge_current = 4544;
267 pre_charge_current = 256;
268 termination_current = 128;
269 ir_compensation_resistor = 70;
270 ir_compensation_voltage = 112;
271 thermal_regulation_threshold = 100;
272 charge_voltage_limit = 4208;
275 vindpm = bq2419x_val_to_reg(voltage_input,
276 BQ2419X_INPUT_VINDPM_OFFSET, 80, 4, 0);
277 bq2419x->input_src.mask = BQ2419X_INPUT_VINDPM_MASK;
278 bq2419x->input_src.val = vindpm << 3;
279 bq2419x->input_src.mask |= BQ2419X_INPUT_IINLIM_MASK;
280 bq2419x->input_src.val |= 0x2;
282 ichg = bq2419x_val_to_reg(fast_charge_current,
283 BQ2419X_CHARGE_ICHG_OFFSET, 64, 6, 0);
284 bq2419x->chg_current_control.mask = BQ2419X_CHRG_CTRL_ICHG_MASK;
285 bq2419x->chg_current_control.val = ichg << 2;
287 iprechg = bq2419x_val_to_reg(pre_charge_current,
288 BQ2419X_PRE_CHG_IPRECHG_OFFSET, 128, 4, 0);
289 bq2419x->prechg_term_control.mask = BQ2419X_CHRG_TERM_PRECHG_MASK;
290 bq2419x->prechg_term_control.val = iprechg << 4;
291 iterm = bq2419x_val_to_reg(termination_current,
292 BQ2419X_PRE_CHG_TERM_OFFSET, 128, 4, 0);
293 bq2419x->prechg_term_control.mask |= BQ2419X_CHRG_TERM_TERM_MASK;
294 bq2419x->prechg_term_control.val |= iterm;
296 bat_comp = ir_compensation_resistor / 10;
297 bq2419x->ir_comp_therm.mask = BQ2419X_THERM_BAT_COMP_MASK;
298 bq2419x->ir_comp_therm.val = bat_comp << 5;
299 vclamp = ir_compensation_voltage / 16;
300 bq2419x->ir_comp_therm.mask |= BQ2419X_THERM_VCLAMP_MASK;
301 bq2419x->ir_comp_therm.val |= vclamp << 2;
302 bq2419x->ir_comp_therm.mask |= BQ2419X_THERM_TREG_MASK;
303 if (thermal_regulation_threshold <= 60)
305 else if (thermal_regulation_threshold <= 80)
307 else if (thermal_regulation_threshold <= 100)
311 bq2419x->ir_comp_therm.val |= treg;
313 vreg = bq2419x_val_to_reg(charge_voltage_limit,
314 BQ2419X_CHARGE_VOLTAGE_OFFSET, 16, 6, 1);
315 bq2419x->chg_voltage_control.mask = BQ2419X_CHG_VOLT_LIMIT_MASK;
316 bq2419x->chg_voltage_control.val = vreg << 2;
320 static int bq2419x_charger_init(struct bq2419x_chip *bq2419x)
324 ret = regmap_update_bits(bq2419x->regmap, BQ2419X_CHRG_CTRL_REG,
325 bq2419x->chg_current_control.mask,
326 bq2419x->chg_current_control.val);
328 dev_err(bq2419x->dev, "CHRG_CTRL_REG write failed %d\n", ret);
332 ret = regmap_update_bits(bq2419x->regmap, BQ2419X_CHRG_TERM_REG,
333 bq2419x->prechg_term_control.mask,
334 bq2419x->prechg_term_control.val);
336 dev_err(bq2419x->dev, "CHRG_TERM_REG write failed %d\n", ret);
340 ret = regmap_update_bits(bq2419x->regmap, BQ2419X_INPUT_SRC_REG,
341 bq2419x->input_src.mask, bq2419x->input_src.val);
343 dev_err(bq2419x->dev, "INPUT_SRC_REG write failed %d\n", ret);
344 bq2419x->last_input_voltage = (bq2419x->input_src.val >> 3) & 0xF;
346 ret = regmap_update_bits(bq2419x->regmap, BQ2419X_THERM_REG,
347 bq2419x->ir_comp_therm.mask, bq2419x->ir_comp_therm.val);
349 dev_err(bq2419x->dev, "THERM_REG write failed: %d\n", ret);
351 ret = regmap_update_bits(bq2419x->regmap, BQ2419X_VOLT_CTRL_REG,
352 bq2419x->chg_voltage_control.mask,
353 bq2419x->chg_voltage_control.val);
355 dev_err(bq2419x->dev, "VOLT_CTRL update failed: %d\n", ret);
357 ret = regmap_update_bits(bq2419x->regmap, BQ2419X_TIME_CTRL_REG,
358 BQ2419X_TIME_JEITA_ISET, 0);
360 dev_err(bq2419x->dev, "TIME_CTRL update failed: %d\n", ret);
365 static void bq2419x_otg_reset_work_handler(struct work_struct *work)
368 struct bq2419x_chip *bq2419x = container_of(to_delayed_work(work),
369 struct bq2419x_chip, otg_reset_work);
371 if (!mutex_is_locked(&bq2419x->otg_mutex)) {
372 mutex_lock(&bq2419x->otg_mutex);
373 if (bq2419x->is_otg_connected) {
374 ret = regmap_update_bits(bq2419x->regmap,
376 BQ2419X_ENABLE_CHARGE_MASK,
377 BQ2419X_ENABLE_VBUS);
379 dev_err(bq2419x->dev,
380 "PWR_ON_REG update failed %d", ret);
382 mutex_unlock(&bq2419x->otg_mutex);
386 static int bq2419x_disable_otg_mode(struct bq2419x_chip *bq2419x)
390 mutex_lock(&bq2419x->otg_mutex);
391 if (bq2419x->is_otg_connected) {
392 ret = bq2419x_charger_enable(bq2419x);
394 dev_err(bq2419x->dev,
395 "Charger enable failed %d", ret);
396 mutex_unlock(&bq2419x->otg_mutex);
399 schedule_delayed_work(&bq2419x->otg_reset_work,
400 BQ2419x_OTG_ENABLE_TIME);
402 mutex_unlock(&bq2419x->otg_mutex);
407 static int bq2419x_charger_input_voltage_configure(
408 struct battery_charger_dev *bc_dev, int battery_soc)
410 struct bq2419x_chip *bq2419x = battery_charger_get_drvdata(bc_dev);
411 struct bq2419x_charger_platform_data *chg_pdata;
412 u32 input_voltage_limit = 0;
417 chg_pdata = bq2419x->charger_pdata;
418 if (!bq2419x->cable_connected || !chg_pdata->n_soc_profile)
421 for (i = 0; i < chg_pdata->n_soc_profile; ++i) {
422 if (battery_soc < chg_pdata->soc_range[i]) {
423 if (chg_pdata->input_voltage_soc_limit)
424 input_voltage_limit =
425 chg_pdata->input_voltage_soc_limit[i];
430 if (!input_voltage_limit)
433 /*Configure input voltage limit */
434 vreg = bq2419x_val_to_reg(input_voltage_limit,
435 BQ2419X_INPUT_VINDPM_OFFSET, 80, 4, 0);
436 if (bq2419x->last_input_voltage == vreg)
439 dev_info(bq2419x->dev, "Changing VINDPM to soc:voltage:vreg %d:%d:%d\n",
440 battery_soc, input_voltage_limit, vreg);
442 ret = regmap_update_bits(bq2419x->regmap, BQ2419X_INPUT_SRC_REG,
443 BQ2419X_INPUT_VINDPM_MASK,
446 dev_err(bq2419x->dev, "INPUT_VOLTAGE update failed %d\n", ret);
449 bq2419x->last_input_voltage = vreg;
454 static int bq2419x_configure_charging_current(struct bq2419x_chip *bq2419x,
455 int in_current_limit)
463 if (!bq2419x->emulate_input_disconnected) {
464 ret = regmap_update_bits(bq2419x->regmap, BQ2419X_INPUT_SRC_REG,
467 dev_err(bq2419x->dev,
468 "INPUT_SRC_REG update failed %d\n", ret);
473 /* Configure input voltage limit*/
474 ret = regmap_update_bits(bq2419x->regmap, BQ2419X_INPUT_SRC_REG,
475 bq2419x->input_src.mask, bq2419x->input_src.val);
477 dev_err(bq2419x->dev, "INPUT_SRC_REG update failed %d\n", ret);
480 bq2419x->last_input_voltage = (bq2419x->input_src.val >> 3) & 0xF;
482 /* Configure input current limit in steps */
483 val = current_to_reg(iinlim, ARRAY_SIZE(iinlim), in_current_limit);
484 floor = current_to_reg(iinlim, ARRAY_SIZE(iinlim), 500);
485 if (val < 0 || floor < 0)
488 for (; floor <= val; floor++) {
489 ret = regmap_update_bits(bq2419x->regmap, BQ2419X_INPUT_SRC_REG,
490 BQ2419x_CONFIG_MASK, floor);
492 dev_err(bq2419x->dev,
493 "INPUT_SRC_REG update failed: %d\n", ret);
494 udelay(BQ2419x_CHARGING_CURRENT_STEP_DELAY_US);
496 bq2419x->in_current_limit = in_current_limit;
498 if (bq2419x->charger_pdata->n_soc_profile) {
499 battery_soc = battery_gauge_get_battery_soc(bq2419x->bc_dev);
501 bq2419x_charger_input_voltage_configure(
502 bq2419x->bc_dev, battery_soc);
508 static int bq2419x_set_charging_current(struct regulator_dev *rdev,
509 int min_uA, int max_uA)
511 struct bq2419x_chip *bq2419x = rdev_get_drvdata(rdev);
512 int in_current_limit;
513 int old_current_limit;
517 dev_info(bq2419x->dev, "Setting charging current %d\n", max_uA/1000);
519 bq2419x->chg_status = BATTERY_DISCHARGING;
521 if (!bq2419x->is_otg_connected) {
522 ret = bq2419x_charger_enable(bq2419x);
524 dev_err(bq2419x->dev, "Charger enable failed %d", ret);
529 ret = regmap_read(bq2419x->regmap, BQ2419X_SYS_STAT_REG, &val);
531 dev_err(bq2419x->dev, "SYS_STAT_REG read failed: %d\n", ret);
533 if (max_uA == 0 && val != 0)
536 old_current_limit = bq2419x->in_current_limit;
537 bq2419x->last_charging_current = max_uA;
538 if ((val & BQ2419x_VBUS_STAT) == BQ2419x_VBUS_UNKNOWN) {
539 battery_charging_restart_cancel(bq2419x->bc_dev);
540 in_current_limit = 500;
541 bq2419x->cable_connected = 0;
542 bq2419x->chg_status = BATTERY_DISCHARGING;
543 battery_charger_thermal_stop_monitoring(
545 } else if ((val & BQ2419x_CHRG_STATE_MASK) ==
546 BQ2419x_CHRG_STATE_CHARGE_DONE) {
547 dev_info(bq2419x->dev, "Charging completed\n");
548 bq2419x->chg_status = BATTERY_CHARGING_DONE;
549 bq2419x->cable_connected = 1;
550 in_current_limit = max_uA/1000;
551 battery_charging_restart(bq2419x->bc_dev,
552 bq2419x->chg_restart_time);
553 battery_charger_thermal_stop_monitoring(
556 in_current_limit = max_uA/1000;
557 bq2419x->cable_connected = 1;
558 bq2419x->chg_status = BATTERY_CHARGING;
559 battery_charger_thermal_start_monitoring(
562 ret = bq2419x_configure_charging_current(bq2419x, in_current_limit);
566 battery_charging_status_update(bq2419x->bc_dev, bq2419x->chg_status);
567 if (bq2419x->disable_suspend_during_charging) {
568 if (bq2419x->cable_connected && in_current_limit > 500
569 && (bq2419x->chg_status != BATTERY_CHARGING_DONE))
570 battery_charger_acquire_wake_lock(bq2419x->bc_dev);
571 else if (!bq2419x->cable_connected && old_current_limit > 500)
572 battery_charger_release_wake_lock(bq2419x->bc_dev);
577 dev_err(bq2419x->dev, "Charger enable failed, err = %d\n", ret);
581 static struct regulator_ops bq2419x_tegra_regulator_ops = {
582 .set_current_limit = bq2419x_set_charging_current,
585 static int bq2419x_set_charging_current_suspend(struct bq2419x_chip *bq2419x,
586 int in_current_limit)
591 dev_info(bq2419x->dev, "Setting charging current %d mA\n",
594 if (!bq2419x->is_otg_connected) {
595 ret = bq2419x_charger_enable(bq2419x);
597 dev_err(bq2419x->dev, "Charger enable failed %d", ret);
602 ret = regmap_read(bq2419x->regmap, BQ2419X_SYS_STAT_REG, &val);
604 dev_err(bq2419x->dev, "SYS_STAT_REG read failed: %d\n", ret);
606 if (!bq2419x->cable_connected) {
607 battery_charging_restart_cancel(bq2419x->bc_dev);
608 ret = bq2419x_configure_charging_current(bq2419x,
616 static int bq2419x_reset_wdt(struct bq2419x_chip *bq2419x, const char *from)
622 mutex_lock(&bq2419x->mutex);
623 dev_dbg(bq2419x->dev, "%s() from %s()\n", __func__, from);
626 if (bq2419x->emulate_input_disconnected)
627 ret = regmap_update_bits(bq2419x->regmap, BQ2419X_INPUT_SRC_REG,
628 BQ2419X_EN_HIZ, BQ2419X_EN_HIZ);
630 ret = regmap_update_bits(bq2419x->regmap,
631 BQ2419X_INPUT_SRC_REG, BQ2419X_EN_HIZ, 0);
633 dev_err(bq2419x->dev, "INPUT_SRC_REG update failed:%d\n", ret);
637 if (!bq2419x->wdt_refresh_timeout)
640 ret = regmap_read(bq2419x->regmap, BQ2419X_PWR_ON_REG, ®01);
642 dev_err(bq2419x->dev, "PWR_ON_REG read failed: %d\n", ret);
648 /* Write two times to make sure reset WDT */
649 ret = regmap_write(bq2419x->regmap, BQ2419X_PWR_ON_REG, reg01);
651 dev_err(bq2419x->dev, "PWR_ON_REG write failed: %d\n", ret);
654 ret = regmap_write(bq2419x->regmap, BQ2419X_PWR_ON_REG, reg01);
656 dev_err(bq2419x->dev, "PWR_ON_REG write failed: %d\n", ret);
661 mutex_unlock(&bq2419x->mutex);
663 timeout = bq2419x->wdt_refresh_timeout ? : 100;
664 schedule_delayed_work(&bq2419x->wdt_restart_wq, timeout * HZ);
668 static int bq2419x_fault_clear_sts(struct bq2419x_chip *bq2419x,
669 unsigned int *reg09_val)
672 unsigned int reg09_1, reg09_2;
674 ret = regmap_read(bq2419x->regmap, BQ2419X_FAULT_REG, ®09_1);
676 dev_err(bq2419x->dev, "FAULT_REG read failed: %d\n", ret);
680 ret = regmap_read(bq2419x->regmap, BQ2419X_FAULT_REG, ®09_2);
682 dev_err(bq2419x->dev, "FAULT_REG read failed: %d\n", ret);
685 unsigned int reg09 = 0;
687 if ((reg09_1 | reg09_2) & BQ2419x_FAULT_WATCHDOG_FAULT)
688 reg09 |= BQ2419x_FAULT_WATCHDOG_FAULT;
689 if ((reg09_1 | reg09_2) & BQ2419x_FAULT_BOOST_FAULT)
690 reg09 |= BQ2419x_FAULT_BOOST_FAULT;
691 if ((reg09_1 | reg09_2) & BQ2419x_FAULT_BAT_FAULT)
692 reg09 |= BQ2419x_FAULT_BAT_FAULT;
693 if (((reg09_1 & BQ2419x_FAULT_CHRG_FAULT_MASK) ==
694 BQ2419x_FAULT_CHRG_SAFTY) ||
695 ((reg09_2 & BQ2419x_FAULT_CHRG_FAULT_MASK) ==
696 BQ2419x_FAULT_CHRG_SAFTY))
697 reg09 |= BQ2419x_FAULT_CHRG_SAFTY;
698 else if (((reg09_1 & BQ2419x_FAULT_CHRG_FAULT_MASK) ==
699 BQ2419x_FAULT_CHRG_INPUT) ||
700 ((reg09_2 & BQ2419x_FAULT_CHRG_FAULT_MASK) ==
701 BQ2419x_FAULT_CHRG_INPUT))
702 reg09 |= BQ2419x_FAULT_CHRG_INPUT;
703 else if (((reg09_1 & BQ2419x_FAULT_CHRG_FAULT_MASK) ==
704 BQ2419x_FAULT_CHRG_THERMAL) ||
705 ((reg09_2 & BQ2419x_FAULT_CHRG_FAULT_MASK) ==
706 BQ2419x_FAULT_CHRG_THERMAL))
707 reg09 |= BQ2419x_FAULT_CHRG_THERMAL;
709 reg09 |= reg09_2 &BQ2419x_FAULT_NTC_FAULT;
715 static int bq2419x_watchdog_init(struct bq2419x_chip *bq2419x,
716 int timeout, const char *from)
722 ret = regmap_update_bits(bq2419x->regmap, BQ2419X_TIME_CTRL_REG,
725 dev_err(bq2419x->dev, "TIME_CTRL_REG read failed: %d\n",
727 bq2419x->wdt_refresh_timeout = 0;
732 val = BQ2419X_WD_40ms;
733 bq2419x->wdt_refresh_timeout = 25;
734 } else if (timeout <= 120) {
735 val = BQ2419X_WD_80ms;
736 bq2419x->wdt_refresh_timeout = 50;
738 val = BQ2419X_WD_160ms;
739 bq2419x->wdt_refresh_timeout = 125;
742 ret = regmap_read(bq2419x->regmap, BQ2419X_TIME_CTRL_REG, ®05);
744 dev_err(bq2419x->dev, "TIME_CTRL_REG read failed:%d\n", ret);
748 /* Reset WDT to be safe if about to end */
749 ret = bq2419x_reset_wdt(bq2419x, from);
751 dev_err(bq2419x->dev, "bq2419x_reset_wdt failed: %d\n", ret);
753 if ((reg05 & BQ2419X_WD_MASK) != val) {
754 ret = regmap_update_bits(bq2419x->regmap, BQ2419X_TIME_CTRL_REG,
755 BQ2419X_WD_MASK, val);
757 dev_err(bq2419x->dev, "TIME_CTRL_REG read failed: %d\n",
763 ret = bq2419x_reset_wdt(bq2419x, from);
765 dev_err(bq2419x->dev, "bq2419x_reset_wdt failed: %d\n", ret);
770 static void bq2419x_wdt_restart_wq(struct work_struct *work)
772 struct bq2419x_chip *bq2419x;
775 bq2419x = container_of(work, struct bq2419x_chip, wdt_restart_wq.work);
776 ret = bq2419x_reset_wdt(bq2419x, "THREAD");
778 dev_err(bq2419x->dev, "bq2419x_reset_wdt failed: %d\n", ret);
781 static int bq2419x_reconfigure_charger_param(struct bq2419x_chip *bq2419x,
786 dev_info(bq2419x->dev, "Reconfiguring charging param from %s\n", from);
787 ret = bq2419x_watchdog_init(bq2419x, bq2419x->wdt_time_sec, from);
789 dev_err(bq2419x->dev, "BQWDT init failed %d\n", ret);
793 ret = bq2419x_charger_init(bq2419x);
795 dev_err(bq2419x->dev, "Charger init failed: %d\n", ret);
799 ret = bq2419x_configure_charging_current(bq2419x,
800 bq2419x->in_current_limit);
802 dev_err(bq2419x->dev, "Current config failed: %d\n", ret);
808 static int bq2419x_handle_safety_timer_expire(struct bq2419x_chip *bq2419x)
810 struct device *dev = bq2419x->dev;
813 /* Reset saftty timer by setting 0 and then making 1 */
814 ret = regmap_update_bits(bq2419x->regmap, BQ2419X_TIME_CTRL_REG,
815 BQ2419X_EN_SFT_TIMER_MASK, 0);
817 dev_err(dev, "TIME_CTRL_REG update failed: %d\n", ret);
821 ret = regmap_update_bits(bq2419x->regmap, BQ2419X_TIME_CTRL_REG,
822 BQ2419X_EN_SFT_TIMER_MASK, BQ2419X_EN_SFT_TIMER_MASK);
824 dev_err(dev, "TIME_CTRL_REG update failed: %d\n", ret);
828 /* Need to toggel the Charging-enable bit from 1 to 0 to 1 */
829 ret = regmap_update_bits(bq2419x->regmap, BQ2419X_PWR_ON_REG,
830 BQ2419X_ENABLE_CHARGE_MASK, 0);
832 dev_err(dev, "PWR_ON_REG update failed %d\n", ret);
835 ret = regmap_update_bits(bq2419x->regmap, BQ2419X_PWR_ON_REG,
836 BQ2419X_ENABLE_CHARGE_MASK, BQ2419X_ENABLE_CHARGE);
838 dev_err(dev, "PWR_ON_REG update failed %d\n", ret);
842 ret = bq2419x_reconfigure_charger_param(bq2419x, "SAFETY-TIMER_EXPIRE");
844 dev_err(dev, "Reconfig of BQ parm failed: %d\n", ret);
850 static irqreturn_t bq2419x_irq(int irq, void *data)
852 struct bq2419x_chip *bq2419x = data;
855 int check_chg_state = 0;
857 ret = bq2419x_fault_clear_sts(bq2419x, &val);
859 dev_err(bq2419x->dev, "fault clear status failed %d\n", ret);
863 dev_info(bq2419x->dev, "%s() Irq %d status 0x%02x\n",
866 if ((val & BQ2419x_CHARGING_FAULT_MASK) &&
867 gpio_is_valid(bq2419x->chg_status_gpio) &&
868 bq2419x->chg_status == BATTERY_CHARGING) {
869 gpio_set_value(bq2419x->chg_status_gpio, BQ2419X_CHARGE_LED_OFF);
872 if (val & BQ2419x_FAULT_BOOST_FAULT) {
873 bq_chg_err(bq2419x, "VBUS Overloaded\n");
874 ret = bq2419x_disable_otg_mode(bq2419x);
876 bq_chg_err(bq2419x, "otg mode disable failed\n");
881 if (!bq2419x->battery_presense)
884 if (val & BQ2419x_FAULT_WATCHDOG_FAULT) {
885 bq_chg_err(bq2419x, "WatchDog Expired\n");
886 ret = bq2419x_reconfigure_charger_param(bq2419x, "WDT-EXP-ISR");
888 dev_err(bq2419x->dev, "BQ reconfig failed %d\n", ret);
893 switch (val & BQ2419x_FAULT_CHRG_FAULT_MASK) {
894 case BQ2419x_FAULT_CHRG_INPUT:
896 "Input Fault (VBUS OVP or VBAT<VBUS<3.8V)\n");
898 case BQ2419x_FAULT_CHRG_THERMAL:
899 bq_chg_err(bq2419x, "Thermal shutdown\n");
901 ret = bq2419x_disable_otg_mode(bq2419x);
903 bq_chg_err(bq2419x, "otg mode disable failed\n");
907 case BQ2419x_FAULT_CHRG_SAFTY:
908 bq_chg_err(bq2419x, "Safety timer expiration\n");
909 ret = bq2419x_handle_safety_timer_expire(bq2419x);
911 dev_err(bq2419x->dev,
912 "Handling of safty timer expire failed: %d\n",
921 if (val & BQ2419x_FAULT_NTC_FAULT) {
922 bq_chg_err(bq2419x, "NTC fault %d\n",
923 val & BQ2419x_FAULT_NTC_FAULT);
927 ret = regmap_read(bq2419x->regmap, BQ2419X_SYS_STAT_REG, &val);
929 dev_err(bq2419x->dev, "SYS_STAT_REG read failed %d\n", ret);
933 if ((val & BQ2419x_CHRG_STATE_MASK) == BQ2419x_CHRG_STATE_CHARGE_DONE) {
934 dev_info(bq2419x->dev, "Charging completed\n");
935 bq2419x->chg_status = BATTERY_CHARGING_DONE;
936 battery_charging_status_update(bq2419x->bc_dev,
937 bq2419x->chg_status);
938 battery_charging_restart(bq2419x->bc_dev,
939 bq2419x->chg_restart_time);
940 if (bq2419x->disable_suspend_during_charging)
941 battery_charger_release_wake_lock(bq2419x->bc_dev);
942 battery_charger_thermal_stop_monitoring(
946 if ((val & BQ2419x_VSYS_STAT_MASK) == BQ2419x_VSYS_STAT_BATT_LOW)
947 dev_info(bq2419x->dev,
948 "In VSYSMIN regulation, battery is too low\n");
950 /* Update Charging status based on STAT register */
951 if (check_chg_state &&
952 ((val & BQ2419x_CHRG_STATE_MASK) == BQ2419x_CHRG_STATE_NOTCHARGING)) {
953 bq2419x->chg_status = BATTERY_DISCHARGING;
954 battery_charging_status_update(bq2419x->bc_dev,
955 bq2419x->chg_status);
956 battery_charging_restart(bq2419x->bc_dev,
957 bq2419x->chg_restart_time);
958 if (bq2419x->disable_suspend_during_charging)
959 battery_charger_release_wake_lock(bq2419x->bc_dev);
965 static int bq2419x_init_charger_regulator(struct bq2419x_chip *bq2419x,
966 struct bq2419x_platform_data *pdata)
969 struct regulator_config rconfig = { };
971 if (!pdata->bcharger_pdata) {
972 dev_err(bq2419x->dev, "No charger platform data\n");
976 bq2419x->chg_reg_desc.name = "bq2419x-charger";
977 bq2419x->chg_reg_desc.ops = &bq2419x_tegra_regulator_ops;
978 bq2419x->chg_reg_desc.type = REGULATOR_CURRENT;
979 bq2419x->chg_reg_desc.owner = THIS_MODULE;
981 bq2419x->chg_reg_init_data.supply_regulator = NULL;
982 bq2419x->chg_reg_init_data.regulator_init = NULL;
983 bq2419x->chg_reg_init_data.num_consumer_supplies =
984 pdata->bcharger_pdata->num_consumer_supplies;
985 bq2419x->chg_reg_init_data.consumer_supplies =
986 pdata->bcharger_pdata->consumer_supplies;
987 bq2419x->chg_reg_init_data.driver_data = bq2419x;
988 bq2419x->chg_reg_init_data.constraints.name = "bq2419x-charger";
989 bq2419x->chg_reg_init_data.constraints.min_uA = 0;
990 bq2419x->chg_reg_init_data.constraints.max_uA =
991 pdata->bcharger_pdata->max_charge_current_mA * 1000;
993 bq2419x->chg_reg_init_data.constraints.ignore_current_constraint_init =
995 bq2419x->chg_reg_init_data.constraints.valid_modes_mask =
996 REGULATOR_MODE_NORMAL |
997 REGULATOR_MODE_STANDBY;
999 bq2419x->chg_reg_init_data.constraints.valid_ops_mask =
1000 REGULATOR_CHANGE_MODE |
1001 REGULATOR_CHANGE_STATUS |
1002 REGULATOR_CHANGE_CURRENT;
1004 rconfig.dev = bq2419x->dev;
1005 rconfig.of_node = NULL;
1006 rconfig.init_data = &bq2419x->chg_reg_init_data;
1007 rconfig.driver_data = bq2419x;
1008 bq2419x->chg_rdev = devm_regulator_register(bq2419x->dev,
1009 &bq2419x->chg_reg_desc, &rconfig);
1010 if (IS_ERR(bq2419x->chg_rdev)) {
1011 ret = PTR_ERR(bq2419x->chg_rdev);
1012 dev_err(bq2419x->dev,
1013 "vbus-charger regulator register failed %d\n", ret);
1018 static int bq2419x_init_vbus_regulator(struct bq2419x_chip *bq2419x,
1019 struct bq2419x_platform_data *pdata)
1022 struct regulator_config rconfig = { };
1024 if (!pdata->vbus_pdata) {
1025 dev_err(bq2419x->dev, "No vbus platform data\n");
1029 bq2419x->gpio_otg_iusb = pdata->vbus_pdata->gpio_otg_iusb;
1030 bq2419x->vbus_reg_desc.name = "bq2419x-vbus";
1031 bq2419x->vbus_reg_desc.ops = &bq2419x_vbus_ops;
1032 bq2419x->vbus_reg_desc.type = REGULATOR_VOLTAGE;
1033 bq2419x->vbus_reg_desc.owner = THIS_MODULE;
1034 bq2419x->vbus_reg_desc.enable_time = 8000;
1036 bq2419x->vbus_reg_init_data.supply_regulator = NULL;
1037 bq2419x->vbus_reg_init_data.regulator_init = NULL;
1038 bq2419x->vbus_reg_init_data.num_consumer_supplies =
1039 pdata->vbus_pdata->num_consumer_supplies;
1040 bq2419x->vbus_reg_init_data.consumer_supplies =
1041 pdata->vbus_pdata->consumer_supplies;
1042 bq2419x->vbus_reg_init_data.driver_data = bq2419x;
1044 bq2419x->vbus_reg_init_data.constraints.name = "bq2419x-vbus";
1045 bq2419x->vbus_reg_init_data.constraints.min_uV = 0;
1046 bq2419x->vbus_reg_init_data.constraints.max_uV = 5000000,
1047 bq2419x->vbus_reg_init_data.constraints.valid_modes_mask =
1048 REGULATOR_MODE_NORMAL |
1049 REGULATOR_MODE_STANDBY;
1050 bq2419x->vbus_reg_init_data.constraints.valid_ops_mask =
1051 REGULATOR_CHANGE_MODE |
1052 REGULATOR_CHANGE_STATUS |
1053 REGULATOR_CHANGE_VOLTAGE;
1055 if (gpio_is_valid(bq2419x->gpio_otg_iusb)) {
1056 ret = gpio_request_one(bq2419x->gpio_otg_iusb,
1057 GPIOF_OUT_INIT_HIGH, dev_name(bq2419x->dev));
1059 dev_err(bq2419x->dev, "gpio request failed %d\n", ret);
1064 /* Register the regulators */
1065 rconfig.dev = bq2419x->dev;
1066 rconfig.of_node = NULL;
1067 rconfig.init_data = &bq2419x->vbus_reg_init_data;
1068 rconfig.driver_data = bq2419x;
1069 bq2419x->vbus_rdev = devm_regulator_register(bq2419x->dev,
1070 &bq2419x->vbus_reg_desc, &rconfig);
1071 if (IS_ERR(bq2419x->vbus_rdev)) {
1072 ret = PTR_ERR(bq2419x->vbus_rdev);
1073 dev_err(bq2419x->dev,
1074 "VBUS regulator register failed %d\n", ret);
1078 /* Disable the VBUS regulator and enable charging */
1079 ret = bq2419x_charger_enable(bq2419x);
1081 dev_err(bq2419x->dev, "Charging enable failed %d", ret);
1087 if (gpio_is_valid(bq2419x->gpio_otg_iusb))
1088 gpio_free(bq2419x->gpio_otg_iusb);
1092 static int bq2419x_show_chip_version(struct bq2419x_chip *bq2419x)
1097 ret = regmap_read(bq2419x->regmap, BQ2419X_REVISION_REG, &val);
1099 dev_err(bq2419x->dev, "REVISION_REG read failed: %d\n", ret);
1103 if ((val & BQ24190_IC_VER) == BQ24190_IC_VER)
1104 dev_info(bq2419x->dev, "chip type BQ24190 detected\n");
1105 else if ((val & BQ24192_IC_VER) == BQ24192_IC_VER)
1106 dev_info(bq2419x->dev, "chip type BQ2419X/3 detected\n");
1107 else if ((val & BQ24192i_IC_VER) == BQ24192i_IC_VER)
1108 dev_info(bq2419x->dev, "chip type BQ2419Xi detected\n");
1113 static ssize_t bq2419x_show_input_charging_current(struct device *dev,
1114 struct device_attribute *attr, char *buf)
1116 struct i2c_client *client = to_i2c_client(dev);
1117 struct bq2419x_chip *bq2419x = i2c_get_clientdata(client);
1118 unsigned int reg_val;
1121 ret = regmap_read(bq2419x->regmap, BQ2419X_INPUT_SRC_REG, ®_val);
1123 dev_err(bq2419x->dev, "INPUT_SRC read failed: %d\n", ret);
1126 ret = iinlim[BQ2419x_CONFIG_MASK & reg_val];
1127 return snprintf(buf, MAX_STR_PRINT, "%d mA\n", ret);
1130 static ssize_t bq2419x_set_input_charging_current(struct device *dev,
1131 struct device_attribute *attr, const char *buf, size_t count)
1133 struct i2c_client *client = to_i2c_client(dev);
1134 struct bq2419x_chip *bq2419x = i2c_get_clientdata(client);
1136 int in_current_limit;
1137 char *p = (char *)buf;
1139 in_current_limit = memparse(p, &p);
1140 ret = bq2419x_configure_charging_current(bq2419x, in_current_limit);
1142 dev_err(dev, "Current %d mA configuration faild: %d\n",
1143 in_current_limit, ret);
1149 static ssize_t bq2419x_show_charging_state(struct device *dev,
1150 struct device_attribute *attr, char *buf)
1152 struct i2c_client *client = to_i2c_client(dev);
1153 struct bq2419x_chip *bq2419x = i2c_get_clientdata(client);
1154 unsigned int reg_val;
1157 ret = regmap_read(bq2419x->regmap, BQ2419X_PWR_ON_REG, ®_val);
1159 dev_err(dev, "BQ2419X_PWR_ON register read failed: %d\n", ret);
1163 if ((reg_val & BQ2419X_ENABLE_CHARGE_MASK) == BQ2419X_ENABLE_CHARGE)
1164 return snprintf(buf, MAX_STR_PRINT, "enabled\n");
1166 return snprintf(buf, MAX_STR_PRINT, "disabled\n");
1169 static ssize_t bq2419x_set_charging_state(struct device *dev,
1170 struct device_attribute *attr, const char *buf, size_t count)
1172 struct i2c_client *client = to_i2c_client(dev);
1173 struct bq2419x_chip *bq2419x = i2c_get_clientdata(client);
1177 if ((*buf == 'E') || (*buf == 'e'))
1179 else if ((*buf == 'D') || (*buf == 'd'))
1185 ret = regmap_update_bits(bq2419x->regmap, BQ2419X_PWR_ON_REG,
1186 BQ2419X_ENABLE_CHARGE_MASK, BQ2419X_ENABLE_CHARGE);
1188 ret = regmap_update_bits(bq2419x->regmap, BQ2419X_PWR_ON_REG,
1189 BQ2419X_ENABLE_CHARGE_MASK, BQ2419X_DISABLE_CHARGE);
1191 dev_err(bq2419x->dev, "register update failed, %d\n", ret);
1197 static ssize_t bq2419x_show_input_cable_state(struct device *dev,
1198 struct device_attribute *attr, char *buf)
1200 struct i2c_client *client = to_i2c_client(dev);
1201 struct bq2419x_chip *bq2419x = i2c_get_clientdata(client);
1202 unsigned int reg_val;
1205 ret = regmap_read(bq2419x->regmap, BQ2419X_INPUT_SRC_REG, ®_val);
1207 dev_err(dev, "BQ2419X_PWR_ON register read failed: %d\n", ret);
1211 if ((reg_val & BQ2419X_EN_HIZ) == BQ2419X_EN_HIZ)
1212 return snprintf(buf, MAX_STR_PRINT, "Disconnected\n");
1214 return snprintf(buf, MAX_STR_PRINT, "Connected\n");
1217 static ssize_t bq2419x_set_input_cable_state(struct device *dev,
1218 struct device_attribute *attr, const char *buf, size_t count)
1220 struct i2c_client *client = to_i2c_client(dev);
1221 struct bq2419x_chip *bq2419x = i2c_get_clientdata(client);
1225 if ((*buf == 'C') || (*buf == 'c'))
1227 else if ((*buf == 'D') || (*buf == 'd'))
1233 bq2419x->emulate_input_disconnected = false;
1234 ret = regmap_update_bits(bq2419x->regmap, BQ2419X_INPUT_SRC_REG,
1237 bq2419x->emulate_input_disconnected = true;
1238 ret = regmap_update_bits(bq2419x->regmap, BQ2419X_INPUT_SRC_REG,
1239 BQ2419X_EN_HIZ, BQ2419X_EN_HIZ);
1242 dev_err(bq2419x->dev, "register update failed, %d\n", ret);
1246 dev_info(bq2419x->dev,
1247 "Emulation of charger cable disconnect disabled\n");
1249 dev_info(bq2419x->dev,
1250 "Emulated as charger cable Disconnected\n");
1254 static ssize_t bq2419x_show_output_charging_current(struct device *dev,
1255 struct device_attribute *attr,
1258 struct i2c_client *client = to_i2c_client(dev);
1259 struct bq2419x_chip *bq2419x = i2c_get_clientdata(client);
1263 ret = regmap_read(bq2419x->regmap, BQ2419X_CHRG_CTRL_REG, &data);
1265 dev_err(bq2419x->dev, "CHRG_CTRL read failed %d", ret);
1269 data = data * 64 + BQ2419X_CHARGE_ICHG_OFFSET;
1270 return snprintf(buf, MAX_STR_PRINT, "%u mA\n", data);
1273 static ssize_t bq2419x_set_output_charging_current(struct device *dev,
1274 struct device_attribute *attr,
1275 const char *buf, size_t count)
1277 struct i2c_client *client = to_i2c_client(dev);
1278 struct bq2419x_chip *bq2419x = i2c_get_clientdata(client);
1282 if (kstrtouint(buf, 0, &curr_val)) {
1283 dev_err(dev, "\nfile: %s, line=%d return %s()",
1284 __FILE__, __LINE__, __func__);
1288 ichg = bq2419x_val_to_reg(curr_val, BQ2419X_CHARGE_ICHG_OFFSET,
1290 ret = regmap_update_bits(bq2419x->regmap, BQ2419X_CHRG_CTRL_REG,
1291 BQ2419X_CHRG_CTRL_ICHG_MASK, ichg << 2);
1296 static ssize_t bq2419x_show_output_charging_current_values(struct device *dev,
1297 struct device_attribute *attr, char *buf)
1301 for (i = 0; i <= 63; i++)
1302 ret += snprintf(buf + strlen(buf), MAX_STR_PRINT,
1303 "%d mA\n", i * 64 + BQ2419X_CHARGE_ICHG_OFFSET);
1308 static DEVICE_ATTR(output_charging_current, (S_IRUGO | (S_IWUSR | S_IWGRP)),
1309 bq2419x_show_output_charging_current,
1310 bq2419x_set_output_charging_current);
1312 static DEVICE_ATTR(output_current_allowed_values, S_IRUGO,
1313 bq2419x_show_output_charging_current_values, NULL);
1315 static DEVICE_ATTR(input_charging_current_mA, (S_IRUGO | (S_IWUSR | S_IWGRP)),
1316 bq2419x_show_input_charging_current,
1317 bq2419x_set_input_charging_current);
1319 static DEVICE_ATTR(charging_state, (S_IRUGO | (S_IWUSR | S_IWGRP)),
1320 bq2419x_show_charging_state, bq2419x_set_charging_state);
1322 static DEVICE_ATTR(input_cable_state, (S_IRUGO | (S_IWUSR | S_IWGRP)),
1323 bq2419x_show_input_cable_state, bq2419x_set_input_cable_state);
1325 static struct attribute *bq2419x_attributes[] = {
1326 &dev_attr_output_charging_current.attr,
1327 &dev_attr_output_current_allowed_values.attr,
1328 &dev_attr_input_charging_current_mA.attr,
1329 &dev_attr_charging_state.attr,
1330 &dev_attr_input_cable_state.attr,
1334 static const struct attribute_group bq2419x_attr_group = {
1335 .attrs = bq2419x_attributes,
1338 static int bq2419x_charger_get_status(struct battery_charger_dev *bc_dev)
1340 struct bq2419x_chip *bq2419x = battery_charger_get_drvdata(bc_dev);
1342 return bq2419x->chg_status;
1345 static int bq2419x_charger_thermal_configure(
1346 struct battery_charger_dev *bc_dev,
1347 int temp, bool enable_charger, bool enable_charg_half_current,
1348 int battery_voltage)
1350 struct bq2419x_chip *bq2419x = battery_charger_get_drvdata(bc_dev);
1351 struct bq2419x_charger_platform_data *chg_pdata;
1352 int fast_charge_current = 0;
1353 u32 charge_voltage_limit = 0;
1357 int curr_ichg, vreg;
1359 chg_pdata = bq2419x->charger_pdata;
1360 if (!bq2419x->cable_connected || !chg_pdata->n_temp_profile)
1363 if (bq2419x->last_temp == temp)
1366 bq2419x->last_temp = temp;
1368 dev_info(bq2419x->dev, "Battery temp %d\n", temp);
1370 for (i = 0; i < chg_pdata->n_temp_profile; ++i) {
1371 if (temp <= chg_pdata->temp_range[i]) {
1372 fast_charge_current = chg_pdata->chg_current_limit[i];
1373 if (chg_pdata->chg_thermal_voltage_limit)
1374 charge_voltage_limit =
1375 chg_pdata->chg_thermal_voltage_limit[i];
1379 if (!fast_charge_current || !temp) {
1380 dev_info(bq2419x->dev, "Disable charging done by HW\n");
1384 /* Fast charger become 50% when temp is at < 10 degC */
1386 fast_charge_current *= 2;
1388 curr_ichg = bq2419x->chg_current_control.val >> 2;
1389 ichg = bq2419x_val_to_reg(fast_charge_current,
1390 BQ2419X_CHARGE_ICHG_OFFSET, 64, 6, 0);
1391 if (curr_ichg == ichg)
1394 bq2419x->chg_current_control.val = ichg << 2;
1395 ret = regmap_update_bits(bq2419x->regmap, BQ2419X_CHRG_CTRL_REG,
1396 BQ2419X_CHRG_CTRL_ICHG_MASK, ichg << 2);
1398 dev_err(bq2419x->dev, "CHRG_CTRL_REG update failed %d\n", ret);
1402 if (!charge_voltage_limit)
1405 /* Charge voltage limit */
1406 vreg = bq2419x_val_to_reg(charge_voltage_limit,
1407 BQ2419X_CHARGE_VOLTAGE_OFFSET, 16, 6, 1);
1408 bq2419x->chg_voltage_control.mask = BQ2419X_CHG_VOLT_LIMIT_MASK;
1409 bq2419x->chg_voltage_control.val = vreg << 2;
1410 ret = regmap_update_bits(bq2419x->regmap, BQ2419X_VOLT_CTRL_REG,
1411 bq2419x->chg_voltage_control.mask,
1412 bq2419x->chg_voltage_control.val);
1414 dev_err(bq2419x->dev, "VOLT_CTRL_REG update failed %d\n", ret);
1421 static int bq2419x_charging_restart(struct battery_charger_dev *bc_dev)
1423 struct bq2419x_chip *bq2419x = battery_charger_get_drvdata(bc_dev);
1426 if (!bq2419x->cable_connected)
1429 dev_info(bq2419x->dev, "Restarting the charging\n");
1430 ret = bq2419x_set_charging_current(bq2419x->chg_rdev,
1431 bq2419x->last_charging_current,
1432 bq2419x->last_charging_current);
1434 dev_err(bq2419x->dev,
1435 "Restarting of charging failed: %d\n", ret);
1436 battery_charging_restart(bq2419x->bc_dev,
1437 bq2419x->chg_restart_time);
1442 static struct battery_charging_ops bq2419x_charger_bci_ops = {
1443 .get_charging_status = bq2419x_charger_get_status,
1444 .restart_charging = bq2419x_charging_restart,
1445 .thermal_configure = bq2419x_charger_thermal_configure,
1446 .input_voltage_configure = bq2419x_charger_input_voltage_configure,
1449 static struct battery_charger_info bq2419x_charger_bci = {
1451 .bc_ops = &bq2419x_charger_bci_ops,
1454 static struct bq2419x_platform_data *bq2419x_dt_parse(struct i2c_client *client)
1456 struct device_node *np = client->dev.of_node;
1457 struct bq2419x_platform_data *pdata;
1458 struct device_node *batt_reg_node;
1459 struct device_node *vbus_reg_node;
1462 pdata = devm_kzalloc(&client->dev, sizeof(*pdata), GFP_KERNEL);
1464 return ERR_PTR(-ENOMEM);
1466 batt_reg_node = of_find_node_by_name(np, "charger");
1467 if (batt_reg_node) {
1468 int temp_range_len, chg_current_lim_len, chg_voltage_lim_len;
1471 int chg_restart_time;
1472 int auto_recharge_time_power_off;
1473 int temp_polling_time;
1474 int soc_range_len, inut_volt_lim_len = 0;
1475 struct regulator_init_data *batt_init_data;
1476 struct bq2419x_charger_platform_data *chg_pdata;
1477 const char *status_str;
1478 struct bq2419x_charger_platform_data *bcharger_pdata;
1481 status_str = of_get_property(batt_reg_node, "status", NULL);
1482 if (status_str && !(!strcmp(status_str, "okay"))) {
1483 dev_info(&client->dev,
1484 "charger node status is disabled\n");
1488 pdata->bcharger_pdata = devm_kzalloc(&client->dev,
1489 sizeof(*(pdata->bcharger_pdata)), GFP_KERNEL);
1490 if (!pdata->bcharger_pdata)
1491 return ERR_PTR(-ENOMEM);
1492 bcharger_pdata = pdata->bcharger_pdata;
1494 chg_pdata = pdata->bcharger_pdata;
1495 batt_init_data = of_get_regulator_init_data(&client->dev,
1497 if (!batt_init_data)
1498 return ERR_PTR(-EINVAL);
1500 bcharger_pdata->chg_status_gpio =
1501 of_get_named_gpio(batt_reg_node,
1502 "ti,charge-status-gpio", 0);
1504 ret = of_property_read_u32(batt_reg_node,
1505 "ti,input-voltage-limit-millivolt", &pval);
1507 bcharger_pdata->input_voltage_limit_mV = pval;
1509 ret = of_property_read_u32(batt_reg_node,
1510 "ti,fast-charge-current-limit-milliamp", &pval);
1512 bcharger_pdata->fast_charge_current_limit_mA =
1515 ret = of_property_read_u32(batt_reg_node,
1516 "ti,pre-charge-current-limit-milliamp", &pval);
1518 bcharger_pdata->pre_charge_current_limit_mA = pval;
1520 ret = of_property_read_u32(batt_reg_node,
1521 "ti,charge-term-current-limit-milliamp", &pval);
1523 bcharger_pdata->termination_current_limit_mA = pval;
1525 ret = of_property_read_u32(batt_reg_node,
1526 "ti,ir-comp-resister-ohm", &pval);
1528 bcharger_pdata->ir_compensation_resister_ohm = pval;
1530 ret = of_property_read_u32(batt_reg_node,
1531 "ti,ir-comp-voltage-millivolt", &pval);
1533 bcharger_pdata->ir_compensation_voltage_mV = pval;
1535 ret = of_property_read_u32(batt_reg_node,
1536 "ti,thermal-regulation-threshold-degc", &pval);
1538 bcharger_pdata->thermal_regulation_threshold_degC =
1541 ret = of_property_read_u32(batt_reg_node,
1542 "ti,charge-voltage-limit-millivolt", &pval);
1544 pdata->bcharger_pdata->charge_voltage_limit_mV = pval;
1546 pdata->bcharger_pdata->disable_suspend_during_charging =
1547 of_property_read_bool(batt_reg_node,
1548 "ti,disbale-suspend-during-charging");
1550 ret = of_property_read_u32(batt_reg_node,
1551 "ti,watchdog-timeout", &wdt_timeout);
1553 pdata->bcharger_pdata->wdt_timeout = wdt_timeout;
1555 ret = of_property_read_u32(batt_reg_node,
1556 "ti,auto-recharge-time-power-off",
1557 &auto_recharge_time_power_off);
1559 pdata->bcharger_pdata->auto_recharge_time_power_off =
1560 auto_recharge_time_power_off;
1562 pdata->bcharger_pdata->auto_recharge_time_power_off =
1565 ret = of_property_read_u32(batt_reg_node,
1566 "ti,auto-recharge-time", &chg_restart_time);
1568 pdata->bcharger_pdata->chg_restart_time =
1571 ret = of_property_read_u32(batt_reg_node,
1572 "ti,auto-recharge-time-suspend",
1575 pdata->bcharger_pdata->auto_recharge_time_supend =
1578 pdata->bcharger_pdata->auto_recharge_time_supend =
1581 ret = of_property_read_u32(batt_reg_node,
1582 "ti,temp-polling-time-sec", &temp_polling_time);
1584 bcharger_pdata->temp_polling_time_sec =
1587 count = of_property_count_u32(batt_reg_node, "ti,soc-range");
1588 soc_range_len = (count > 0) ? count : 0;
1590 if (soc_range_len) {
1591 chg_pdata->n_soc_profile = soc_range_len;
1592 chg_pdata->soc_range = devm_kzalloc(&client->dev,
1593 sizeof(u32) * soc_range_len, GFP_KERNEL);
1594 if (!chg_pdata->soc_range)
1595 return ERR_PTR(-ENOMEM);
1597 ret = of_property_read_u32_array(batt_reg_node,
1599 chg_pdata->soc_range, soc_range_len);
1601 return ERR_PTR(ret);
1603 count = of_property_count_u32(batt_reg_node,
1604 "ti,input-voltage-soc-limit");
1605 inut_volt_lim_len = (count > 0) ? count : 0;
1608 if (inut_volt_lim_len) {
1609 chg_pdata->input_voltage_soc_limit =
1610 devm_kzalloc(&client->dev,
1611 sizeof(u32) * inut_volt_lim_len,
1613 if (!chg_pdata->input_voltage_soc_limit)
1614 return ERR_PTR(-ENOMEM);
1616 ret = of_property_read_u32_array(batt_reg_node,
1617 "ti,input-voltage-soc-limit",
1618 chg_pdata->input_voltage_soc_limit,
1621 return ERR_PTR(ret);
1624 chg_pdata->tz_name = of_get_property(batt_reg_node,
1625 "ti,thermal-zone", NULL);
1627 count = of_property_count_u32(batt_reg_node, "ti,temp-range");
1628 temp_range_len = (count > 0) ? count : 0;
1630 count = of_property_count_u32(batt_reg_node,
1631 "ti,charge-current-limit");
1633 count = of_property_count_u32(batt_reg_node,
1634 "ti,charge-thermal-current-limit");
1635 chg_current_lim_len = (count > 0) ? count : 0;
1637 count = of_property_count_u32(batt_reg_node,
1638 "ti,charge-thermal-voltage-limit");
1639 chg_voltage_lim_len = (count > 0) ? count : 0;
1641 if (!temp_range_len)
1642 goto skip_therm_profile;
1644 if (temp_range_len != chg_current_lim_len) {
1645 dev_info(&client->dev,
1646 "current thermal profile is not correct\n");
1647 goto skip_therm_profile;
1650 if (chg_voltage_lim_len && (temp_range_len != chg_voltage_lim_len)) {
1651 dev_info(&client->dev,
1652 "voltage thermal profile is not correct\n");
1653 goto skip_therm_profile;
1656 chg_pdata->temp_range = devm_kzalloc(&client->dev,
1657 sizeof(u32) * temp_range_len, GFP_KERNEL);
1658 if (!chg_pdata->temp_range)
1659 return ERR_PTR(-ENOMEM);
1661 ret = of_property_read_u32_array(batt_reg_node, "ti,temp-range",
1662 chg_pdata->temp_range, temp_range_len);
1664 return ERR_PTR(ret);
1666 chg_pdata->chg_current_limit = devm_kzalloc(&client->dev,
1667 sizeof(u32) * temp_range_len, GFP_KERNEL);
1668 if (!chg_pdata->chg_current_limit)
1669 return ERR_PTR(-ENOMEM);
1671 ret = of_property_read_u32_array(batt_reg_node,
1672 "ti,charge-current-limit",
1673 chg_pdata->chg_current_limit,
1676 ret = of_property_read_u32_array(batt_reg_node,
1677 "ti,charge-thermal-current-limit",
1678 chg_pdata->chg_current_limit,
1681 return ERR_PTR(ret);
1683 if (!chg_voltage_lim_len)
1684 goto skip_thermal_volt_profle;
1686 chg_pdata->chg_thermal_voltage_limit =
1687 devm_kzalloc(&client->dev,
1688 sizeof(u32) * temp_range_len,
1690 if (!chg_pdata->chg_thermal_voltage_limit)
1691 return ERR_PTR(-ENOMEM);
1693 ret = of_property_read_u32_array(batt_reg_node,
1694 "ti,charge-thermal-voltage-limit",
1695 chg_pdata->chg_thermal_voltage_limit,
1698 return ERR_PTR(ret);
1700 skip_thermal_volt_profle:
1701 chg_pdata->n_temp_profile = temp_range_len;
1704 pdata->bcharger_pdata->consumer_supplies =
1705 batt_init_data->consumer_supplies;
1706 pdata->bcharger_pdata->num_consumer_supplies =
1707 batt_init_data->num_consumer_supplies;
1708 pdata->bcharger_pdata->max_charge_current_mA =
1709 batt_init_data->constraints.max_uA / 1000;
1713 vbus_reg_node = of_find_node_by_name(np, "vbus");
1714 if (vbus_reg_node) {
1715 struct regulator_init_data *vbus_init_data;
1717 pdata->vbus_pdata = devm_kzalloc(&client->dev,
1718 sizeof(*(pdata->vbus_pdata)), GFP_KERNEL);
1719 if (!pdata->vbus_pdata)
1720 return ERR_PTR(-ENOMEM);
1722 vbus_init_data = of_get_regulator_init_data(
1723 &client->dev, vbus_reg_node);
1724 if (!vbus_init_data)
1725 return ERR_PTR(-EINVAL);
1727 pdata->vbus_pdata->consumer_supplies =
1728 vbus_init_data->consumer_supplies;
1729 pdata->vbus_pdata->num_consumer_supplies =
1730 vbus_init_data->num_consumer_supplies;
1731 pdata->vbus_pdata->gpio_otg_iusb =
1732 of_get_named_gpio(vbus_reg_node,
1733 "ti,otg-iusb-gpio", 0);
1739 static int bq2419x_probe(struct i2c_client *client,
1740 const struct i2c_device_id *id)
1742 struct bq2419x_chip *bq2419x;
1743 struct bq2419x_platform_data *pdata = NULL;
1746 if (client->dev.platform_data)
1747 pdata = client->dev.platform_data;
1749 if (!pdata && client->dev.of_node) {
1750 pdata = bq2419x_dt_parse(client);
1751 if (IS_ERR(pdata)) {
1752 ret = PTR_ERR(pdata);
1753 dev_err(&client->dev, "Parsing of node failed, %d\n",
1760 dev_err(&client->dev, "No Platform data");
1764 bq2419x = devm_kzalloc(&client->dev, sizeof(*bq2419x), GFP_KERNEL);
1766 dev_err(&client->dev, "Memory allocation failed\n");
1769 bq2419x->charger_pdata = pdata->bcharger_pdata;
1770 bq2419x->vbus_pdata = pdata->vbus_pdata;
1772 bq2419x->regmap = devm_regmap_init_i2c(client, &bq2419x_regmap_config);
1773 if (IS_ERR(bq2419x->regmap)) {
1774 ret = PTR_ERR(bq2419x->regmap);
1775 dev_err(&client->dev, "regmap init failed with err %d\n", ret);
1779 bq2419x->dev = &client->dev;
1780 i2c_set_clientdata(client, bq2419x);
1781 bq2419x->irq = client->irq;
1782 mutex_init(&bq2419x->otg_mutex);
1783 bq2419x->is_otg_connected = 0;
1785 ret = bq2419x_show_chip_version(bq2419x);
1787 dev_err(&client->dev, "version read failed %d\n", ret);
1791 ret = sysfs_create_group(&client->dev.kobj, &bq2419x_attr_group);
1793 dev_err(&client->dev, "sysfs create failed %d\n", ret);
1797 mutex_init(&bq2419x->mutex);
1799 if (!pdata->bcharger_pdata) {
1800 dev_info(&client->dev, "No battery charger supported\n");
1801 ret = bq2419x_watchdog_init(bq2419x, 0, "PROBE");
1803 dev_err(bq2419x->dev, "WDT disable failed: %d\n", ret);
1807 ret = bq2419x_fault_clear_sts(bq2419x, NULL);
1809 dev_err(bq2419x->dev, "fault clear status failed %d\n", ret);
1812 goto skip_bcharger_init;
1815 bq2419x->auto_recharge_time_power_off =
1816 pdata->bcharger_pdata->auto_recharge_time_power_off;
1817 bq2419x->wdt_time_sec = pdata->bcharger_pdata->wdt_timeout;
1818 bq2419x->chg_restart_time = pdata->bcharger_pdata->chg_restart_time;
1819 bq2419x->battery_presense = true;
1820 bq2419x->last_temp = -1000;
1821 bq2419x->disable_suspend_during_charging =
1822 pdata->bcharger_pdata->disable_suspend_during_charging;
1823 bq2419x->auto_recharge_time_supend =
1824 pdata->bcharger_pdata->auto_recharge_time_supend;
1825 bq2419x->chg_status_gpio = pdata->bcharger_pdata->chg_status_gpio;
1827 bq2419x_process_charger_plat_data(bq2419x, pdata->bcharger_pdata);
1829 ret = bq2419x_charger_init(bq2419x);
1831 dev_err(bq2419x->dev, "Charger init failed: %d\n", ret);
1835 ret = bq2419x_init_charger_regulator(bq2419x, pdata);
1837 dev_err(&client->dev,
1838 "Charger regualtor init failed %d\n", ret);
1842 bq2419x_charger_bci.polling_time_sec =
1843 pdata->bcharger_pdata->temp_polling_time_sec;
1844 bq2419x_charger_bci.tz_name = pdata->bcharger_pdata->tz_name;
1845 bq2419x->bc_dev = battery_charger_register(bq2419x->dev,
1846 &bq2419x_charger_bci, bq2419x);
1847 if (IS_ERR(bq2419x->bc_dev)) {
1848 ret = PTR_ERR(bq2419x->bc_dev);
1849 dev_err(bq2419x->dev, "battery charger register failed: %d\n",
1854 INIT_DELAYED_WORK(&bq2419x->wdt_restart_wq, bq2419x_wdt_restart_wq);
1855 ret = bq2419x_watchdog_init(bq2419x, bq2419x->wdt_time_sec, "PROBE");
1857 dev_err(bq2419x->dev, "BQWDT init failed %d\n", ret);
1861 INIT_DELAYED_WORK(&bq2419x->otg_reset_work,
1862 bq2419x_otg_reset_work_handler);
1863 ret = bq2419x_fault_clear_sts(bq2419x, NULL);
1865 dev_err(bq2419x->dev, "fault clear status failed %d\n", ret);
1869 ret = devm_request_threaded_irq(bq2419x->dev, bq2419x->irq, NULL,
1870 bq2419x_irq, IRQF_ONESHOT | IRQF_TRIGGER_FALLING,
1871 dev_name(bq2419x->dev), bq2419x);
1873 dev_warn(bq2419x->dev, "request IRQ %d fail, err = %d\n",
1875 dev_info(bq2419x->dev,
1876 "Supporting bq driver without interrupt\n");
1880 if (gpio_is_valid(bq2419x->chg_status_gpio)) {
1881 ret = devm_gpio_request(bq2419x->dev, bq2419x->chg_status_gpio,
1884 dev_err(bq2419x->dev, "error: can't request GPIO%d\n",
1885 bq2419x->chg_status_gpio);
1887 ret = gpio_direction_output(bq2419x->chg_status_gpio, 0);
1889 dev_err(bq2419x->dev,
1890 "can't setup GPIO%d as Output\n",
1891 bq2419x->chg_status_gpio);
1897 ret = bq2419x_init_vbus_regulator(bq2419x, pdata);
1899 dev_err(&client->dev, "VBUS regulator init failed %d\n", ret);
1903 /* enable charging */
1904 ret = bq2419x_charger_enable(bq2419x);
1910 if (pdata->bcharger_pdata) {
1911 cancel_delayed_work(&bq2419x->wdt_restart_wq);
1912 battery_charger_unregister(bq2419x->bc_dev);
1915 mutex_destroy(&bq2419x->mutex);
1916 mutex_destroy(&bq2419x->otg_mutex);
1920 static int bq2419x_remove(struct i2c_client *client)
1922 struct bq2419x_chip *bq2419x = i2c_get_clientdata(client);
1924 if (bq2419x->battery_presense) {
1925 battery_charger_unregister(bq2419x->bc_dev);
1926 cancel_delayed_work(&bq2419x->wdt_restart_wq);
1928 mutex_destroy(&bq2419x->mutex);
1929 mutex_destroy(&bq2419x->otg_mutex);
1930 cancel_delayed_work_sync(&bq2419x->otg_reset_work);
1934 static void bq2419x_shutdown(struct i2c_client *client)
1936 struct bq2419x_chip *bq2419x = i2c_get_clientdata(client);
1937 struct device *dev = &client->dev;
1939 int next_poweron_time = 0;
1941 if (!bq2419x->battery_presense)
1944 if (!bq2419x->cable_connected)
1947 ret = bq2419x_reset_wdt(bq2419x, "SHUTDOWN");
1949 dev_err(bq2419x->dev, "Reset WDT failed: %d\n", ret);
1951 if (bq2419x->chg_status == BATTERY_CHARGING_DONE) {
1952 dev_info(bq2419x->dev, "Battery charging done\n");
1956 if (bq2419x->in_current_limit <= 500) {
1957 dev_info(bq2419x->dev, "Battery charging with 500mA\n");
1958 next_poweron_time = bq2419x->auto_recharge_time_power_off;
1960 dev_info(bq2419x->dev, "Battery charging with high current\n");
1961 next_poweron_time = bq2419x->wdt_refresh_timeout;
1964 ret = battery_charging_system_reset_after(bq2419x->bc_dev,
1967 dev_err(dev, "System poweron after %d config failed %d\n",
1968 next_poweron_time, ret);
1970 if (next_poweron_time)
1971 dev_info(dev, "System-charger will power-ON after %d sec\n",
1974 dev_info(bq2419x->dev, "System-charger will not power-ON\n");
1976 battery_charging_system_power_on_usb_event(bq2419x->bc_dev);
1977 cancel_delayed_work_sync(&bq2419x->otg_reset_work);
1980 #ifdef CONFIG_PM_SLEEP
1981 static int bq2419x_suspend(struct device *dev)
1983 struct bq2419x_chip *bq2419x = dev_get_drvdata(dev);
1984 int next_wakeup = 0;
1987 if (!bq2419x->battery_presense)
1990 battery_charging_restart_cancel(bq2419x->bc_dev);
1992 if (!bq2419x->cable_connected)
1995 ret = bq2419x_reset_wdt(bq2419x, "Suspend");
1997 dev_err(bq2419x->dev, "Reset WDT failed: %d\n", ret);
1999 if (bq2419x->chg_status == BATTERY_CHARGING_DONE) {
2000 dev_info(bq2419x->dev, "Battery charging done\n");
2004 if (bq2419x->in_current_limit <= 500) {
2005 dev_info(bq2419x->dev, "Battery charging with 500mA\n");
2006 next_wakeup = bq2419x->auto_recharge_time_supend;
2008 dev_info(bq2419x->dev, "Battery charging with high current\n");
2009 next_wakeup = bq2419x->wdt_refresh_timeout;
2012 battery_charging_wakeup(bq2419x->bc_dev, next_wakeup);
2015 dev_info(dev, "System-charger will resume after %d sec\n",
2018 dev_info(dev, "System-charger will not have resume time\n");
2020 if (next_wakeup == bq2419x->wdt_refresh_timeout)
2023 ret = bq2419x_set_charging_current_suspend(bq2419x, 500);
2025 dev_err(bq2419x->dev, "Config of charging failed: %d\n", ret);
2029 static int bq2419x_resume(struct device *dev)
2032 struct bq2419x_chip *bq2419x = dev_get_drvdata(dev);
2035 if (!bq2419x->battery_presense)
2038 ret = bq2419x_fault_clear_sts(bq2419x, &val);
2040 dev_err(bq2419x->dev, "fault clear status failed %d\n", ret);
2044 if (val & BQ2419x_FAULT_WATCHDOG_FAULT) {
2045 bq_chg_err(bq2419x, "Watchdog Timer Expired\n");
2047 ret = bq2419x_reconfigure_charger_param(bq2419x,
2050 dev_err(bq2419x->dev, "BQ reconfig failed %d\n", ret);
2054 ret = bq2419x_reset_wdt(bq2419x, "Resume");
2056 dev_err(bq2419x->dev, "Reset WDT failed: %d\n", ret);
2059 if (val & BQ2419x_FAULT_CHRG_SAFTY) {
2060 bq_chg_err(bq2419x, "Safety timer Expired\n");
2061 ret = bq2419x_handle_safety_timer_expire(bq2419x);
2063 dev_err(bq2419x->dev,
2064 "Handling of safty timer expire failed: %d\n",
2073 static const struct dev_pm_ops bq2419x_pm_ops = {
2074 SET_SYSTEM_SLEEP_PM_OPS(bq2419x_suspend, bq2419x_resume)
2077 static const struct i2c_device_id bq2419x_id[] = {
2078 {.name = "bq2419x",},
2081 MODULE_DEVICE_TABLE(i2c, bq2419x_id);
2083 static struct i2c_driver bq2419x_i2c_driver = {
2086 .owner = THIS_MODULE,
2087 .pm = &bq2419x_pm_ops,
2089 .probe = bq2419x_probe,
2090 .remove = bq2419x_remove,
2091 .shutdown = bq2419x_shutdown,
2092 .id_table = bq2419x_id,
2095 static int __init bq2419x_module_init(void)
2097 return i2c_add_driver(&bq2419x_i2c_driver);
2099 subsys_initcall(bq2419x_module_init);
2101 static void __exit bq2419x_cleanup(void)
2103 i2c_del_driver(&bq2419x_i2c_driver);
2105 module_exit(bq2419x_cleanup);
2107 MODULE_DESCRIPTION("BQ24190/BQ24192/BQ24192i/BQ24193 battery charger driver");
2108 MODULE_AUTHOR("Laxman Dewangan <ldewangan@nvidia.com>");
2109 MODULE_AUTHOR("Syed Rafiuddin <srafiuddin@nvidia.com");
2110 MODULE_LICENSE("GPL v2");