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 ret = bq2419x_charger_enable(bq2419x);
523 dev_err(bq2419x->dev, "Charger enable failed %d", ret);
527 ret = regmap_read(bq2419x->regmap, BQ2419X_SYS_STAT_REG, &val);
529 dev_err(bq2419x->dev, "SYS_STAT_REG read failed: %d\n", ret);
531 if (max_uA == 0 && val != 0)
534 old_current_limit = bq2419x->in_current_limit;
535 bq2419x->last_charging_current = max_uA;
536 if ((val & BQ2419x_VBUS_STAT) == BQ2419x_VBUS_UNKNOWN) {
537 battery_charging_restart_cancel(bq2419x->bc_dev);
538 in_current_limit = 500;
539 bq2419x->cable_connected = 0;
540 bq2419x->chg_status = BATTERY_DISCHARGING;
541 battery_charger_thermal_stop_monitoring(
543 } else if ((val & BQ2419x_CHRG_STATE_MASK) ==
544 BQ2419x_CHRG_STATE_CHARGE_DONE) {
545 dev_info(bq2419x->dev, "Charging completed\n");
546 bq2419x->chg_status = BATTERY_CHARGING_DONE;
547 bq2419x->cable_connected = 1;
548 in_current_limit = max_uA/1000;
549 battery_charging_restart(bq2419x->bc_dev,
550 bq2419x->chg_restart_time);
551 battery_charger_thermal_stop_monitoring(
554 in_current_limit = max_uA/1000;
555 bq2419x->cable_connected = 1;
556 bq2419x->chg_status = BATTERY_CHARGING;
557 battery_charger_thermal_start_monitoring(
560 ret = bq2419x_configure_charging_current(bq2419x, in_current_limit);
564 battery_charging_status_update(bq2419x->bc_dev, bq2419x->chg_status);
565 if (bq2419x->disable_suspend_during_charging) {
566 if (bq2419x->cable_connected && in_current_limit > 500
567 && (bq2419x->chg_status != BATTERY_CHARGING_DONE))
568 battery_charger_acquire_wake_lock(bq2419x->bc_dev);
569 else if (!bq2419x->cable_connected && old_current_limit > 500)
570 battery_charger_release_wake_lock(bq2419x->bc_dev);
575 dev_err(bq2419x->dev, "Charger enable failed, err = %d\n", ret);
579 static struct regulator_ops bq2419x_tegra_regulator_ops = {
580 .set_current_limit = bq2419x_set_charging_current,
583 static int bq2419x_set_charging_current_suspend(struct bq2419x_chip *bq2419x,
584 int in_current_limit)
589 dev_info(bq2419x->dev, "Setting charging current %d mA\n",
592 ret = bq2419x_charger_enable(bq2419x);
594 dev_err(bq2419x->dev, "Charger enable failed %d", ret);
598 ret = regmap_read(bq2419x->regmap, BQ2419X_SYS_STAT_REG, &val);
600 dev_err(bq2419x->dev, "SYS_STAT_REG read failed: %d\n", ret);
602 if (!bq2419x->cable_connected) {
603 battery_charging_restart_cancel(bq2419x->bc_dev);
604 ret = bq2419x_configure_charging_current(bq2419x,
612 static int bq2419x_reset_wdt(struct bq2419x_chip *bq2419x, const char *from)
618 mutex_lock(&bq2419x->mutex);
619 dev_dbg(bq2419x->dev, "%s() from %s()\n", __func__, from);
622 if (bq2419x->emulate_input_disconnected)
623 ret = regmap_update_bits(bq2419x->regmap, BQ2419X_INPUT_SRC_REG,
624 BQ2419X_EN_HIZ, BQ2419X_EN_HIZ);
626 ret = regmap_update_bits(bq2419x->regmap,
627 BQ2419X_INPUT_SRC_REG, BQ2419X_EN_HIZ, 0);
629 dev_err(bq2419x->dev, "INPUT_SRC_REG update failed:%d\n", ret);
633 if (!bq2419x->wdt_refresh_timeout)
636 ret = regmap_read(bq2419x->regmap, BQ2419X_PWR_ON_REG, ®01);
638 dev_err(bq2419x->dev, "PWR_ON_REG read failed: %d\n", ret);
644 /* Write two times to make sure reset WDT */
645 ret = regmap_write(bq2419x->regmap, BQ2419X_PWR_ON_REG, reg01);
647 dev_err(bq2419x->dev, "PWR_ON_REG write failed: %d\n", ret);
650 ret = regmap_write(bq2419x->regmap, BQ2419X_PWR_ON_REG, reg01);
652 dev_err(bq2419x->dev, "PWR_ON_REG write failed: %d\n", ret);
657 mutex_unlock(&bq2419x->mutex);
659 timeout = bq2419x->wdt_refresh_timeout ? : 100;
660 schedule_delayed_work(&bq2419x->wdt_restart_wq, timeout * HZ);
664 static int bq2419x_fault_clear_sts(struct bq2419x_chip *bq2419x,
665 unsigned int *reg09_val)
668 unsigned int reg09_1, reg09_2;
670 ret = regmap_read(bq2419x->regmap, BQ2419X_FAULT_REG, ®09_1);
672 dev_err(bq2419x->dev, "FAULT_REG read failed: %d\n", ret);
676 ret = regmap_read(bq2419x->regmap, BQ2419X_FAULT_REG, ®09_2);
678 dev_err(bq2419x->dev, "FAULT_REG read failed: %d\n", ret);
681 unsigned int reg09 = 0;
683 if ((reg09_1 | reg09_2) & BQ2419x_FAULT_WATCHDOG_FAULT)
684 reg09 |= BQ2419x_FAULT_WATCHDOG_FAULT;
685 if ((reg09_1 | reg09_2) & BQ2419x_FAULT_BOOST_FAULT)
686 reg09 |= BQ2419x_FAULT_BOOST_FAULT;
687 if ((reg09_1 | reg09_2) & BQ2419x_FAULT_BAT_FAULT)
688 reg09 |= BQ2419x_FAULT_BAT_FAULT;
689 if (((reg09_1 & BQ2419x_FAULT_CHRG_FAULT_MASK) ==
690 BQ2419x_FAULT_CHRG_SAFTY) ||
691 ((reg09_2 & BQ2419x_FAULT_CHRG_FAULT_MASK) ==
692 BQ2419x_FAULT_CHRG_SAFTY))
693 reg09 |= BQ2419x_FAULT_CHRG_SAFTY;
694 else if (((reg09_1 & BQ2419x_FAULT_CHRG_FAULT_MASK) ==
695 BQ2419x_FAULT_CHRG_INPUT) ||
696 ((reg09_2 & BQ2419x_FAULT_CHRG_FAULT_MASK) ==
697 BQ2419x_FAULT_CHRG_INPUT))
698 reg09 |= BQ2419x_FAULT_CHRG_INPUT;
699 else if (((reg09_1 & BQ2419x_FAULT_CHRG_FAULT_MASK) ==
700 BQ2419x_FAULT_CHRG_THERMAL) ||
701 ((reg09_2 & BQ2419x_FAULT_CHRG_FAULT_MASK) ==
702 BQ2419x_FAULT_CHRG_THERMAL))
703 reg09 |= BQ2419x_FAULT_CHRG_THERMAL;
705 reg09 |= reg09_2 &BQ2419x_FAULT_NTC_FAULT;
711 static int bq2419x_watchdog_init(struct bq2419x_chip *bq2419x,
712 int timeout, const char *from)
718 ret = regmap_update_bits(bq2419x->regmap, BQ2419X_TIME_CTRL_REG,
721 dev_err(bq2419x->dev, "TIME_CTRL_REG read failed: %d\n",
723 bq2419x->wdt_refresh_timeout = 0;
728 val = BQ2419X_WD_40ms;
729 bq2419x->wdt_refresh_timeout = 25;
730 } else if (timeout <= 120) {
731 val = BQ2419X_WD_80ms;
732 bq2419x->wdt_refresh_timeout = 50;
734 val = BQ2419X_WD_160ms;
735 bq2419x->wdt_refresh_timeout = 125;
738 ret = regmap_read(bq2419x->regmap, BQ2419X_TIME_CTRL_REG, ®05);
740 dev_err(bq2419x->dev, "TIME_CTRL_REG read failed:%d\n", ret);
744 /* Reset WDT to be safe if about to end */
745 ret = bq2419x_reset_wdt(bq2419x, from);
747 dev_err(bq2419x->dev, "bq2419x_reset_wdt failed: %d\n", ret);
749 if ((reg05 & BQ2419X_WD_MASK) != val) {
750 ret = regmap_update_bits(bq2419x->regmap, BQ2419X_TIME_CTRL_REG,
751 BQ2419X_WD_MASK, val);
753 dev_err(bq2419x->dev, "TIME_CTRL_REG read failed: %d\n",
759 ret = bq2419x_reset_wdt(bq2419x, from);
761 dev_err(bq2419x->dev, "bq2419x_reset_wdt failed: %d\n", ret);
766 static void bq2419x_wdt_restart_wq(struct work_struct *work)
768 struct bq2419x_chip *bq2419x;
771 bq2419x = container_of(work, struct bq2419x_chip, wdt_restart_wq.work);
772 ret = bq2419x_reset_wdt(bq2419x, "THREAD");
774 dev_err(bq2419x->dev, "bq2419x_reset_wdt failed: %d\n", ret);
777 static int bq2419x_reconfigure_charger_param(struct bq2419x_chip *bq2419x,
782 dev_info(bq2419x->dev, "Reconfiguring charging param from %s\n", from);
783 ret = bq2419x_watchdog_init(bq2419x, bq2419x->wdt_time_sec, from);
785 dev_err(bq2419x->dev, "BQWDT init failed %d\n", ret);
789 ret = bq2419x_charger_init(bq2419x);
791 dev_err(bq2419x->dev, "Charger init failed: %d\n", ret);
795 ret = bq2419x_configure_charging_current(bq2419x,
796 bq2419x->in_current_limit);
798 dev_err(bq2419x->dev, "Current config failed: %d\n", ret);
804 static int bq2419x_handle_safety_timer_expire(struct bq2419x_chip *bq2419x)
806 struct device *dev = bq2419x->dev;
809 /* Reset saftty timer by setting 0 and then making 1 */
810 ret = regmap_update_bits(bq2419x->regmap, BQ2419X_TIME_CTRL_REG,
811 BQ2419X_EN_SFT_TIMER_MASK, 0);
813 dev_err(dev, "TIME_CTRL_REG update failed: %d\n", ret);
817 ret = regmap_update_bits(bq2419x->regmap, BQ2419X_TIME_CTRL_REG,
818 BQ2419X_EN_SFT_TIMER_MASK, BQ2419X_EN_SFT_TIMER_MASK);
820 dev_err(dev, "TIME_CTRL_REG update failed: %d\n", ret);
824 /* Need to toggel the Charging-enable bit from 1 to 0 to 1 */
825 ret = regmap_update_bits(bq2419x->regmap, BQ2419X_PWR_ON_REG,
826 BQ2419X_ENABLE_CHARGE_MASK, 0);
828 dev_err(dev, "PWR_ON_REG update failed %d\n", ret);
831 ret = regmap_update_bits(bq2419x->regmap, BQ2419X_PWR_ON_REG,
832 BQ2419X_ENABLE_CHARGE_MASK, BQ2419X_ENABLE_CHARGE);
834 dev_err(dev, "PWR_ON_REG update failed %d\n", ret);
838 ret = bq2419x_reconfigure_charger_param(bq2419x, "SAFETY-TIMER_EXPIRE");
840 dev_err(dev, "Reconfig of BQ parm failed: %d\n", ret);
846 static irqreturn_t bq2419x_irq(int irq, void *data)
848 struct bq2419x_chip *bq2419x = data;
851 int check_chg_state = 0;
853 ret = bq2419x_fault_clear_sts(bq2419x, &val);
855 dev_err(bq2419x->dev, "fault clear status failed %d\n", ret);
859 dev_info(bq2419x->dev, "%s() Irq %d status 0x%02x\n",
862 if ((val & BQ2419x_CHARGING_FAULT_MASK) &&
863 gpio_is_valid(bq2419x->chg_status_gpio) &&
864 bq2419x->chg_status == BATTERY_CHARGING) {
865 gpio_set_value(bq2419x->chg_status_gpio, BQ2419X_CHARGE_LED_OFF);
868 if (val & BQ2419x_FAULT_BOOST_FAULT) {
869 bq_chg_err(bq2419x, "VBUS Overloaded\n");
870 ret = bq2419x_disable_otg_mode(bq2419x);
872 bq_chg_err(bq2419x, "otg mode disable failed\n");
877 if (!bq2419x->battery_presense)
880 if (val & BQ2419x_FAULT_WATCHDOG_FAULT) {
881 bq_chg_err(bq2419x, "WatchDog Expired\n");
882 ret = bq2419x_reconfigure_charger_param(bq2419x, "WDT-EXP-ISR");
884 dev_err(bq2419x->dev, "BQ reconfig failed %d\n", ret);
889 switch (val & BQ2419x_FAULT_CHRG_FAULT_MASK) {
890 case BQ2419x_FAULT_CHRG_INPUT:
892 "Input Fault (VBUS OVP or VBAT<VBUS<3.8V)\n");
894 case BQ2419x_FAULT_CHRG_THERMAL:
895 bq_chg_err(bq2419x, "Thermal shutdown\n");
897 ret = bq2419x_disable_otg_mode(bq2419x);
899 bq_chg_err(bq2419x, "otg mode disable failed\n");
903 case BQ2419x_FAULT_CHRG_SAFTY:
904 bq_chg_err(bq2419x, "Safety timer expiration\n");
905 ret = bq2419x_handle_safety_timer_expire(bq2419x);
907 dev_err(bq2419x->dev,
908 "Handling of safty timer expire failed: %d\n",
917 if (val & BQ2419x_FAULT_NTC_FAULT) {
918 bq_chg_err(bq2419x, "NTC fault %d\n",
919 val & BQ2419x_FAULT_NTC_FAULT);
923 ret = regmap_read(bq2419x->regmap, BQ2419X_SYS_STAT_REG, &val);
925 dev_err(bq2419x->dev, "SYS_STAT_REG read failed %d\n", ret);
929 if ((val & BQ2419x_CHRG_STATE_MASK) == BQ2419x_CHRG_STATE_CHARGE_DONE) {
930 dev_info(bq2419x->dev, "Charging completed\n");
931 bq2419x->chg_status = BATTERY_CHARGING_DONE;
932 battery_charging_status_update(bq2419x->bc_dev,
933 bq2419x->chg_status);
934 battery_charging_restart(bq2419x->bc_dev,
935 bq2419x->chg_restart_time);
936 if (bq2419x->disable_suspend_during_charging)
937 battery_charger_release_wake_lock(bq2419x->bc_dev);
938 battery_charger_thermal_stop_monitoring(
942 if ((val & BQ2419x_VSYS_STAT_MASK) == BQ2419x_VSYS_STAT_BATT_LOW)
943 dev_info(bq2419x->dev,
944 "In VSYSMIN regulation, battery is too low\n");
946 /* Update Charging status based on STAT register */
947 if (check_chg_state &&
948 ((val & BQ2419x_CHRG_STATE_MASK) == BQ2419x_CHRG_STATE_NOTCHARGING)) {
949 bq2419x->chg_status = BATTERY_DISCHARGING;
950 battery_charging_status_update(bq2419x->bc_dev,
951 bq2419x->chg_status);
952 battery_charging_restart(bq2419x->bc_dev,
953 bq2419x->chg_restart_time);
954 if (bq2419x->disable_suspend_during_charging)
955 battery_charger_release_wake_lock(bq2419x->bc_dev);
961 static int bq2419x_init_charger_regulator(struct bq2419x_chip *bq2419x,
962 struct bq2419x_platform_data *pdata)
965 struct regulator_config rconfig = { };
967 if (!pdata->bcharger_pdata) {
968 dev_err(bq2419x->dev, "No charger platform data\n");
972 bq2419x->chg_reg_desc.name = "bq2419x-charger";
973 bq2419x->chg_reg_desc.ops = &bq2419x_tegra_regulator_ops;
974 bq2419x->chg_reg_desc.type = REGULATOR_CURRENT;
975 bq2419x->chg_reg_desc.owner = THIS_MODULE;
977 bq2419x->chg_reg_init_data.supply_regulator = NULL;
978 bq2419x->chg_reg_init_data.regulator_init = NULL;
979 bq2419x->chg_reg_init_data.num_consumer_supplies =
980 pdata->bcharger_pdata->num_consumer_supplies;
981 bq2419x->chg_reg_init_data.consumer_supplies =
982 pdata->bcharger_pdata->consumer_supplies;
983 bq2419x->chg_reg_init_data.driver_data = bq2419x;
984 bq2419x->chg_reg_init_data.constraints.name = "bq2419x-charger";
985 bq2419x->chg_reg_init_data.constraints.min_uA = 0;
986 bq2419x->chg_reg_init_data.constraints.max_uA =
987 pdata->bcharger_pdata->max_charge_current_mA * 1000;
989 bq2419x->chg_reg_init_data.constraints.ignore_current_constraint_init =
991 bq2419x->chg_reg_init_data.constraints.valid_modes_mask =
992 REGULATOR_MODE_NORMAL |
993 REGULATOR_MODE_STANDBY;
995 bq2419x->chg_reg_init_data.constraints.valid_ops_mask =
996 REGULATOR_CHANGE_MODE |
997 REGULATOR_CHANGE_STATUS |
998 REGULATOR_CHANGE_CURRENT;
1000 rconfig.dev = bq2419x->dev;
1001 rconfig.of_node = NULL;
1002 rconfig.init_data = &bq2419x->chg_reg_init_data;
1003 rconfig.driver_data = bq2419x;
1004 bq2419x->chg_rdev = devm_regulator_register(bq2419x->dev,
1005 &bq2419x->chg_reg_desc, &rconfig);
1006 if (IS_ERR(bq2419x->chg_rdev)) {
1007 ret = PTR_ERR(bq2419x->chg_rdev);
1008 dev_err(bq2419x->dev,
1009 "vbus-charger regulator register failed %d\n", ret);
1014 static int bq2419x_init_vbus_regulator(struct bq2419x_chip *bq2419x,
1015 struct bq2419x_platform_data *pdata)
1018 struct regulator_config rconfig = { };
1020 if (!pdata->vbus_pdata) {
1021 dev_err(bq2419x->dev, "No vbus platform data\n");
1025 bq2419x->gpio_otg_iusb = pdata->vbus_pdata->gpio_otg_iusb;
1026 bq2419x->vbus_reg_desc.name = "bq2419x-vbus";
1027 bq2419x->vbus_reg_desc.ops = &bq2419x_vbus_ops;
1028 bq2419x->vbus_reg_desc.type = REGULATOR_VOLTAGE;
1029 bq2419x->vbus_reg_desc.owner = THIS_MODULE;
1030 bq2419x->vbus_reg_desc.enable_time = 8000;
1032 bq2419x->vbus_reg_init_data.supply_regulator = NULL;
1033 bq2419x->vbus_reg_init_data.regulator_init = NULL;
1034 bq2419x->vbus_reg_init_data.num_consumer_supplies =
1035 pdata->vbus_pdata->num_consumer_supplies;
1036 bq2419x->vbus_reg_init_data.consumer_supplies =
1037 pdata->vbus_pdata->consumer_supplies;
1038 bq2419x->vbus_reg_init_data.driver_data = bq2419x;
1040 bq2419x->vbus_reg_init_data.constraints.name = "bq2419x-vbus";
1041 bq2419x->vbus_reg_init_data.constraints.min_uV = 0;
1042 bq2419x->vbus_reg_init_data.constraints.max_uV = 5000000,
1043 bq2419x->vbus_reg_init_data.constraints.valid_modes_mask =
1044 REGULATOR_MODE_NORMAL |
1045 REGULATOR_MODE_STANDBY;
1046 bq2419x->vbus_reg_init_data.constraints.valid_ops_mask =
1047 REGULATOR_CHANGE_MODE |
1048 REGULATOR_CHANGE_STATUS |
1049 REGULATOR_CHANGE_VOLTAGE;
1051 if (gpio_is_valid(bq2419x->gpio_otg_iusb)) {
1052 ret = gpio_request_one(bq2419x->gpio_otg_iusb,
1053 GPIOF_OUT_INIT_HIGH, dev_name(bq2419x->dev));
1055 dev_err(bq2419x->dev, "gpio request failed %d\n", ret);
1060 /* Register the regulators */
1061 rconfig.dev = bq2419x->dev;
1062 rconfig.of_node = NULL;
1063 rconfig.init_data = &bq2419x->vbus_reg_init_data;
1064 rconfig.driver_data = bq2419x;
1065 bq2419x->vbus_rdev = devm_regulator_register(bq2419x->dev,
1066 &bq2419x->vbus_reg_desc, &rconfig);
1067 if (IS_ERR(bq2419x->vbus_rdev)) {
1068 ret = PTR_ERR(bq2419x->vbus_rdev);
1069 dev_err(bq2419x->dev,
1070 "VBUS regulator register failed %d\n", ret);
1074 /* Disable the VBUS regulator and enable charging */
1075 ret = bq2419x_charger_enable(bq2419x);
1077 dev_err(bq2419x->dev, "Charging enable failed %d", ret);
1083 if (gpio_is_valid(bq2419x->gpio_otg_iusb))
1084 gpio_free(bq2419x->gpio_otg_iusb);
1088 static int bq2419x_show_chip_version(struct bq2419x_chip *bq2419x)
1093 ret = regmap_read(bq2419x->regmap, BQ2419X_REVISION_REG, &val);
1095 dev_err(bq2419x->dev, "REVISION_REG read failed: %d\n", ret);
1099 if ((val & BQ24190_IC_VER) == BQ24190_IC_VER)
1100 dev_info(bq2419x->dev, "chip type BQ24190 detected\n");
1101 else if ((val & BQ24192_IC_VER) == BQ24192_IC_VER)
1102 dev_info(bq2419x->dev, "chip type BQ2419X/3 detected\n");
1103 else if ((val & BQ24192i_IC_VER) == BQ24192i_IC_VER)
1104 dev_info(bq2419x->dev, "chip type BQ2419Xi detected\n");
1109 static ssize_t bq2419x_show_input_charging_current(struct device *dev,
1110 struct device_attribute *attr, char *buf)
1112 struct i2c_client *client = to_i2c_client(dev);
1113 struct bq2419x_chip *bq2419x = i2c_get_clientdata(client);
1114 unsigned int reg_val;
1117 ret = regmap_read(bq2419x->regmap, BQ2419X_INPUT_SRC_REG, ®_val);
1119 dev_err(bq2419x->dev, "INPUT_SRC read failed: %d\n", ret);
1122 ret = iinlim[BQ2419x_CONFIG_MASK & reg_val];
1123 return snprintf(buf, MAX_STR_PRINT, "%d mA\n", ret);
1126 static ssize_t bq2419x_set_input_charging_current(struct device *dev,
1127 struct device_attribute *attr, const char *buf, size_t count)
1129 struct i2c_client *client = to_i2c_client(dev);
1130 struct bq2419x_chip *bq2419x = i2c_get_clientdata(client);
1132 int in_current_limit;
1133 char *p = (char *)buf;
1135 in_current_limit = memparse(p, &p);
1136 ret = bq2419x_configure_charging_current(bq2419x, in_current_limit);
1138 dev_err(dev, "Current %d mA configuration faild: %d\n",
1139 in_current_limit, ret);
1145 static ssize_t bq2419x_show_charging_state(struct device *dev,
1146 struct device_attribute *attr, char *buf)
1148 struct i2c_client *client = to_i2c_client(dev);
1149 struct bq2419x_chip *bq2419x = i2c_get_clientdata(client);
1150 unsigned int reg_val;
1153 ret = regmap_read(bq2419x->regmap, BQ2419X_PWR_ON_REG, ®_val);
1155 dev_err(dev, "BQ2419X_PWR_ON register read failed: %d\n", ret);
1159 if ((reg_val & BQ2419X_ENABLE_CHARGE_MASK) == BQ2419X_ENABLE_CHARGE)
1160 return snprintf(buf, MAX_STR_PRINT, "enabled\n");
1162 return snprintf(buf, MAX_STR_PRINT, "disabled\n");
1165 static ssize_t bq2419x_set_charging_state(struct device *dev,
1166 struct device_attribute *attr, const char *buf, size_t count)
1168 struct i2c_client *client = to_i2c_client(dev);
1169 struct bq2419x_chip *bq2419x = i2c_get_clientdata(client);
1173 if ((*buf == 'E') || (*buf == 'e'))
1175 else if ((*buf == 'D') || (*buf == 'd'))
1181 ret = regmap_update_bits(bq2419x->regmap, BQ2419X_PWR_ON_REG,
1182 BQ2419X_ENABLE_CHARGE_MASK, BQ2419X_ENABLE_CHARGE);
1184 ret = regmap_update_bits(bq2419x->regmap, BQ2419X_PWR_ON_REG,
1185 BQ2419X_ENABLE_CHARGE_MASK, BQ2419X_DISABLE_CHARGE);
1187 dev_err(bq2419x->dev, "register update failed, %d\n", ret);
1193 static ssize_t bq2419x_show_input_cable_state(struct device *dev,
1194 struct device_attribute *attr, char *buf)
1196 struct i2c_client *client = to_i2c_client(dev);
1197 struct bq2419x_chip *bq2419x = i2c_get_clientdata(client);
1198 unsigned int reg_val;
1201 ret = regmap_read(bq2419x->regmap, BQ2419X_INPUT_SRC_REG, ®_val);
1203 dev_err(dev, "BQ2419X_PWR_ON register read failed: %d\n", ret);
1207 if ((reg_val & BQ2419X_EN_HIZ) == BQ2419X_EN_HIZ)
1208 return snprintf(buf, MAX_STR_PRINT, "Disconnected\n");
1210 return snprintf(buf, MAX_STR_PRINT, "Connected\n");
1213 static ssize_t bq2419x_set_input_cable_state(struct device *dev,
1214 struct device_attribute *attr, const char *buf, size_t count)
1216 struct i2c_client *client = to_i2c_client(dev);
1217 struct bq2419x_chip *bq2419x = i2c_get_clientdata(client);
1221 if ((*buf == 'C') || (*buf == 'c'))
1223 else if ((*buf == 'D') || (*buf == 'd'))
1229 bq2419x->emulate_input_disconnected = false;
1230 ret = regmap_update_bits(bq2419x->regmap, BQ2419X_INPUT_SRC_REG,
1233 bq2419x->emulate_input_disconnected = true;
1234 ret = regmap_update_bits(bq2419x->regmap, BQ2419X_INPUT_SRC_REG,
1235 BQ2419X_EN_HIZ, BQ2419X_EN_HIZ);
1238 dev_err(bq2419x->dev, "register update failed, %d\n", ret);
1242 dev_info(bq2419x->dev,
1243 "Emulation of charger cable disconnect disabled\n");
1245 dev_info(bq2419x->dev,
1246 "Emulated as charger cable Disconnected\n");
1250 static ssize_t bq2419x_show_output_charging_current(struct device *dev,
1251 struct device_attribute *attr,
1254 struct i2c_client *client = to_i2c_client(dev);
1255 struct bq2419x_chip *bq2419x = i2c_get_clientdata(client);
1259 ret = regmap_read(bq2419x->regmap, BQ2419X_CHRG_CTRL_REG, &data);
1261 dev_err(bq2419x->dev, "CHRG_CTRL read failed %d", ret);
1265 data = data * 64 + BQ2419X_CHARGE_ICHG_OFFSET;
1266 return snprintf(buf, MAX_STR_PRINT, "%u mA\n", data);
1269 static ssize_t bq2419x_set_output_charging_current(struct device *dev,
1270 struct device_attribute *attr,
1271 const char *buf, size_t count)
1273 struct i2c_client *client = to_i2c_client(dev);
1274 struct bq2419x_chip *bq2419x = i2c_get_clientdata(client);
1278 if (kstrtouint(buf, 0, &curr_val)) {
1279 dev_err(dev, "\nfile: %s, line=%d return %s()",
1280 __FILE__, __LINE__, __func__);
1284 ichg = bq2419x_val_to_reg(curr_val, BQ2419X_CHARGE_ICHG_OFFSET,
1286 ret = regmap_update_bits(bq2419x->regmap, BQ2419X_CHRG_CTRL_REG,
1287 BQ2419X_CHRG_CTRL_ICHG_MASK, ichg << 2);
1292 static ssize_t bq2419x_show_output_charging_current_values(struct device *dev,
1293 struct device_attribute *attr, char *buf)
1297 for (i = 0; i <= 63; i++)
1298 ret += snprintf(buf + strlen(buf), MAX_STR_PRINT,
1299 "%d mA\n", i * 64 + BQ2419X_CHARGE_ICHG_OFFSET);
1304 static DEVICE_ATTR(output_charging_current, (S_IRUGO | (S_IWUSR | S_IWGRP)),
1305 bq2419x_show_output_charging_current,
1306 bq2419x_set_output_charging_current);
1308 static DEVICE_ATTR(output_current_allowed_values, S_IRUGO,
1309 bq2419x_show_output_charging_current_values, NULL);
1311 static DEVICE_ATTR(input_charging_current_mA, (S_IRUGO | (S_IWUSR | S_IWGRP)),
1312 bq2419x_show_input_charging_current,
1313 bq2419x_set_input_charging_current);
1315 static DEVICE_ATTR(charging_state, (S_IRUGO | (S_IWUSR | S_IWGRP)),
1316 bq2419x_show_charging_state, bq2419x_set_charging_state);
1318 static DEVICE_ATTR(input_cable_state, (S_IRUGO | (S_IWUSR | S_IWGRP)),
1319 bq2419x_show_input_cable_state, bq2419x_set_input_cable_state);
1321 static struct attribute *bq2419x_attributes[] = {
1322 &dev_attr_output_charging_current.attr,
1323 &dev_attr_output_current_allowed_values.attr,
1324 &dev_attr_input_charging_current_mA.attr,
1325 &dev_attr_charging_state.attr,
1326 &dev_attr_input_cable_state.attr,
1330 static const struct attribute_group bq2419x_attr_group = {
1331 .attrs = bq2419x_attributes,
1334 static int bq2419x_charger_get_status(struct battery_charger_dev *bc_dev)
1336 struct bq2419x_chip *bq2419x = battery_charger_get_drvdata(bc_dev);
1338 return bq2419x->chg_status;
1341 static int bq2419x_charger_thermal_configure(
1342 struct battery_charger_dev *bc_dev,
1343 int temp, bool enable_charger, bool enable_charg_half_current,
1344 int battery_voltage)
1346 struct bq2419x_chip *bq2419x = battery_charger_get_drvdata(bc_dev);
1347 struct bq2419x_charger_platform_data *chg_pdata;
1348 int fast_charge_current = 0;
1349 u32 charge_voltage_limit = 0;
1353 int curr_ichg, vreg;
1355 chg_pdata = bq2419x->charger_pdata;
1356 if (!bq2419x->cable_connected || !chg_pdata->n_temp_profile)
1359 if (bq2419x->last_temp == temp)
1362 bq2419x->last_temp = temp;
1364 dev_info(bq2419x->dev, "Battery temp %d\n", temp);
1366 for (i = 0; i < chg_pdata->n_temp_profile; ++i) {
1367 if (temp <= chg_pdata->temp_range[i]) {
1368 fast_charge_current = chg_pdata->chg_current_limit[i];
1369 if (chg_pdata->chg_thermal_voltage_limit)
1370 charge_voltage_limit =
1371 chg_pdata->chg_thermal_voltage_limit[i];
1375 if (!fast_charge_current || !temp) {
1376 dev_info(bq2419x->dev, "Disable charging done by HW\n");
1380 /* Fast charger become 50% when temp is at < 10 degC */
1382 fast_charge_current *= 2;
1384 curr_ichg = bq2419x->chg_current_control.val >> 2;
1385 ichg = bq2419x_val_to_reg(fast_charge_current,
1386 BQ2419X_CHARGE_ICHG_OFFSET, 64, 6, 0);
1387 if (curr_ichg == ichg)
1390 bq2419x->chg_current_control.val = ichg << 2;
1391 ret = regmap_update_bits(bq2419x->regmap, BQ2419X_CHRG_CTRL_REG,
1392 BQ2419X_CHRG_CTRL_ICHG_MASK, ichg << 2);
1394 dev_err(bq2419x->dev, "CHRG_CTRL_REG update failed %d\n", ret);
1398 if (!charge_voltage_limit)
1401 /* Charge voltage limit */
1402 vreg = bq2419x_val_to_reg(charge_voltage_limit,
1403 BQ2419X_CHARGE_VOLTAGE_OFFSET, 16, 6, 1);
1404 bq2419x->chg_voltage_control.mask = BQ2419X_CHG_VOLT_LIMIT_MASK;
1405 bq2419x->chg_voltage_control.val = vreg << 2;
1406 ret = regmap_update_bits(bq2419x->regmap, BQ2419X_VOLT_CTRL_REG,
1407 bq2419x->chg_voltage_control.mask,
1408 bq2419x->chg_voltage_control.val);
1410 dev_err(bq2419x->dev, "VOLT_CTRL_REG update failed %d\n", ret);
1417 static int bq2419x_charging_restart(struct battery_charger_dev *bc_dev)
1419 struct bq2419x_chip *bq2419x = battery_charger_get_drvdata(bc_dev);
1422 if (!bq2419x->cable_connected)
1425 dev_info(bq2419x->dev, "Restarting the charging\n");
1426 ret = bq2419x_set_charging_current(bq2419x->chg_rdev,
1427 bq2419x->last_charging_current,
1428 bq2419x->last_charging_current);
1430 dev_err(bq2419x->dev,
1431 "Restarting of charging failed: %d\n", ret);
1432 battery_charging_restart(bq2419x->bc_dev,
1433 bq2419x->chg_restart_time);
1438 static struct battery_charging_ops bq2419x_charger_bci_ops = {
1439 .get_charging_status = bq2419x_charger_get_status,
1440 .restart_charging = bq2419x_charging_restart,
1441 .thermal_configure = bq2419x_charger_thermal_configure,
1442 .input_voltage_configure = bq2419x_charger_input_voltage_configure,
1445 static struct battery_charger_info bq2419x_charger_bci = {
1447 .bc_ops = &bq2419x_charger_bci_ops,
1450 static struct bq2419x_platform_data *bq2419x_dt_parse(struct i2c_client *client)
1452 struct device_node *np = client->dev.of_node;
1453 struct bq2419x_platform_data *pdata;
1454 struct device_node *batt_reg_node;
1455 struct device_node *vbus_reg_node;
1458 pdata = devm_kzalloc(&client->dev, sizeof(*pdata), GFP_KERNEL);
1460 return ERR_PTR(-ENOMEM);
1462 batt_reg_node = of_find_node_by_name(np, "charger");
1463 if (batt_reg_node) {
1464 int temp_range_len, chg_current_lim_len, chg_voltage_lim_len;
1467 int chg_restart_time;
1468 int auto_recharge_time_power_off;
1469 int temp_polling_time;
1470 int soc_range_len, inut_volt_lim_len = 0;
1471 struct regulator_init_data *batt_init_data;
1472 struct bq2419x_charger_platform_data *chg_pdata;
1473 const char *status_str;
1474 struct bq2419x_charger_platform_data *bcharger_pdata;
1477 status_str = of_get_property(batt_reg_node, "status", NULL);
1478 if (status_str && !(!strcmp(status_str, "okay"))) {
1479 dev_info(&client->dev,
1480 "charger node status is disabled\n");
1484 pdata->bcharger_pdata = devm_kzalloc(&client->dev,
1485 sizeof(*(pdata->bcharger_pdata)), GFP_KERNEL);
1486 if (!pdata->bcharger_pdata)
1487 return ERR_PTR(-ENOMEM);
1488 bcharger_pdata = pdata->bcharger_pdata;
1490 chg_pdata = pdata->bcharger_pdata;
1491 batt_init_data = of_get_regulator_init_data(&client->dev,
1493 if (!batt_init_data)
1494 return ERR_PTR(-EINVAL);
1496 bcharger_pdata->chg_status_gpio =
1497 of_get_named_gpio(batt_reg_node,
1498 "ti,charge-status-gpio", 0);
1500 ret = of_property_read_u32(batt_reg_node,
1501 "ti,input-voltage-limit-millivolt", &pval);
1503 bcharger_pdata->input_voltage_limit_mV = pval;
1505 ret = of_property_read_u32(batt_reg_node,
1506 "ti,fast-charge-current-limit-milliamp", &pval);
1508 bcharger_pdata->fast_charge_current_limit_mA =
1511 ret = of_property_read_u32(batt_reg_node,
1512 "ti,pre-charge-current-limit-milliamp", &pval);
1514 bcharger_pdata->pre_charge_current_limit_mA = pval;
1516 ret = of_property_read_u32(batt_reg_node,
1517 "ti,charge-term-current-limit-milliamp", &pval);
1519 bcharger_pdata->termination_current_limit_mA = pval;
1521 ret = of_property_read_u32(batt_reg_node,
1522 "ti,ir-comp-resister-ohm", &pval);
1524 bcharger_pdata->ir_compensation_resister_ohm = pval;
1526 ret = of_property_read_u32(batt_reg_node,
1527 "ti,ir-comp-voltage-millivolt", &pval);
1529 bcharger_pdata->ir_compensation_voltage_mV = pval;
1531 ret = of_property_read_u32(batt_reg_node,
1532 "ti,thermal-regulation-threshold-degc", &pval);
1534 bcharger_pdata->thermal_regulation_threshold_degC =
1537 ret = of_property_read_u32(batt_reg_node,
1538 "ti,charge-voltage-limit-millivolt", &pval);
1540 pdata->bcharger_pdata->charge_voltage_limit_mV = pval;
1542 pdata->bcharger_pdata->disable_suspend_during_charging =
1543 of_property_read_bool(batt_reg_node,
1544 "ti,disbale-suspend-during-charging");
1546 ret = of_property_read_u32(batt_reg_node,
1547 "ti,watchdog-timeout", &wdt_timeout);
1549 pdata->bcharger_pdata->wdt_timeout = wdt_timeout;
1551 ret = of_property_read_u32(batt_reg_node,
1552 "ti,auto-recharge-time-power-off",
1553 &auto_recharge_time_power_off);
1555 pdata->bcharger_pdata->auto_recharge_time_power_off =
1556 auto_recharge_time_power_off;
1558 pdata->bcharger_pdata->auto_recharge_time_power_off =
1561 ret = of_property_read_u32(batt_reg_node,
1562 "ti,auto-recharge-time", &chg_restart_time);
1564 pdata->bcharger_pdata->chg_restart_time =
1567 ret = of_property_read_u32(batt_reg_node,
1568 "ti,auto-recharge-time-suspend",
1571 pdata->bcharger_pdata->auto_recharge_time_supend =
1574 pdata->bcharger_pdata->auto_recharge_time_supend =
1577 ret = of_property_read_u32(batt_reg_node,
1578 "ti,temp-polling-time-sec", &temp_polling_time);
1580 bcharger_pdata->temp_polling_time_sec =
1583 count = of_property_count_u32(batt_reg_node, "ti,soc-range");
1584 soc_range_len = (count > 0) ? count : 0;
1586 if (soc_range_len) {
1587 chg_pdata->n_soc_profile = soc_range_len;
1588 chg_pdata->soc_range = devm_kzalloc(&client->dev,
1589 sizeof(u32) * soc_range_len, GFP_KERNEL);
1590 if (!chg_pdata->soc_range)
1591 return ERR_PTR(-ENOMEM);
1593 ret = of_property_read_u32_array(batt_reg_node,
1595 chg_pdata->soc_range, soc_range_len);
1597 return ERR_PTR(ret);
1599 count = of_property_count_u32(batt_reg_node,
1600 "ti,input-voltage-soc-limit");
1601 inut_volt_lim_len = (count > 0) ? count : 0;
1604 if (inut_volt_lim_len) {
1605 chg_pdata->input_voltage_soc_limit =
1606 devm_kzalloc(&client->dev,
1607 sizeof(u32) * inut_volt_lim_len,
1609 if (!chg_pdata->input_voltage_soc_limit)
1610 return ERR_PTR(-ENOMEM);
1612 ret = of_property_read_u32_array(batt_reg_node,
1613 "ti,input-voltage-soc-limit",
1614 chg_pdata->input_voltage_soc_limit,
1617 return ERR_PTR(ret);
1620 chg_pdata->tz_name = of_get_property(batt_reg_node,
1621 "ti,thermal-zone", NULL);
1623 count = of_property_count_u32(batt_reg_node, "ti,temp-range");
1624 temp_range_len = (count > 0) ? count : 0;
1626 count = of_property_count_u32(batt_reg_node,
1627 "ti,charge-current-limit");
1629 count = of_property_count_u32(batt_reg_node,
1630 "ti,charge-thermal-current-limit");
1631 chg_current_lim_len = (count > 0) ? count : 0;
1633 count = of_property_count_u32(batt_reg_node,
1634 "ti,charge-thermal-voltage-limit");
1635 chg_voltage_lim_len = (count > 0) ? count : 0;
1637 if (!temp_range_len)
1638 goto skip_therm_profile;
1640 if (temp_range_len != chg_current_lim_len) {
1641 dev_info(&client->dev,
1642 "current thermal profile is not correct\n");
1643 goto skip_therm_profile;
1646 if (chg_voltage_lim_len && (temp_range_len != chg_voltage_lim_len)) {
1647 dev_info(&client->dev,
1648 "voltage thermal profile is not correct\n");
1649 goto skip_therm_profile;
1652 chg_pdata->temp_range = devm_kzalloc(&client->dev,
1653 sizeof(u32) * temp_range_len, GFP_KERNEL);
1654 if (!chg_pdata->temp_range)
1655 return ERR_PTR(-ENOMEM);
1657 ret = of_property_read_u32_array(batt_reg_node, "ti,temp-range",
1658 chg_pdata->temp_range, temp_range_len);
1660 return ERR_PTR(ret);
1662 chg_pdata->chg_current_limit = devm_kzalloc(&client->dev,
1663 sizeof(u32) * temp_range_len, GFP_KERNEL);
1664 if (!chg_pdata->chg_current_limit)
1665 return ERR_PTR(-ENOMEM);
1667 ret = of_property_read_u32_array(batt_reg_node,
1668 "ti,charge-current-limit",
1669 chg_pdata->chg_current_limit,
1672 ret = of_property_read_u32_array(batt_reg_node,
1673 "ti,charge-thermal-current-limit",
1674 chg_pdata->chg_current_limit,
1677 return ERR_PTR(ret);
1679 if (!chg_voltage_lim_len)
1680 goto skip_thermal_volt_profle;
1682 chg_pdata->chg_thermal_voltage_limit =
1683 devm_kzalloc(&client->dev,
1684 sizeof(u32) * temp_range_len,
1686 if (!chg_pdata->chg_thermal_voltage_limit)
1687 return ERR_PTR(-ENOMEM);
1689 ret = of_property_read_u32_array(batt_reg_node,
1690 "ti,charge-thermal-voltage-limit",
1691 chg_pdata->chg_thermal_voltage_limit,
1694 return ERR_PTR(ret);
1696 skip_thermal_volt_profle:
1697 chg_pdata->n_temp_profile = temp_range_len;
1700 pdata->bcharger_pdata->consumer_supplies =
1701 batt_init_data->consumer_supplies;
1702 pdata->bcharger_pdata->num_consumer_supplies =
1703 batt_init_data->num_consumer_supplies;
1704 pdata->bcharger_pdata->max_charge_current_mA =
1705 batt_init_data->constraints.max_uA / 1000;
1709 vbus_reg_node = of_find_node_by_name(np, "vbus");
1710 if (vbus_reg_node) {
1711 struct regulator_init_data *vbus_init_data;
1713 pdata->vbus_pdata = devm_kzalloc(&client->dev,
1714 sizeof(*(pdata->vbus_pdata)), GFP_KERNEL);
1715 if (!pdata->vbus_pdata)
1716 return ERR_PTR(-ENOMEM);
1718 vbus_init_data = of_get_regulator_init_data(
1719 &client->dev, vbus_reg_node);
1720 if (!vbus_init_data)
1721 return ERR_PTR(-EINVAL);
1723 pdata->vbus_pdata->consumer_supplies =
1724 vbus_init_data->consumer_supplies;
1725 pdata->vbus_pdata->num_consumer_supplies =
1726 vbus_init_data->num_consumer_supplies;
1727 pdata->vbus_pdata->gpio_otg_iusb =
1728 of_get_named_gpio(vbus_reg_node,
1729 "ti,otg-iusb-gpio", 0);
1735 static int bq2419x_probe(struct i2c_client *client,
1736 const struct i2c_device_id *id)
1738 struct bq2419x_chip *bq2419x;
1739 struct bq2419x_platform_data *pdata = NULL;
1742 if (client->dev.platform_data)
1743 pdata = client->dev.platform_data;
1745 if (!pdata && client->dev.of_node) {
1746 pdata = bq2419x_dt_parse(client);
1747 if (IS_ERR(pdata)) {
1748 ret = PTR_ERR(pdata);
1749 dev_err(&client->dev, "Parsing of node failed, %d\n",
1756 dev_err(&client->dev, "No Platform data");
1760 bq2419x = devm_kzalloc(&client->dev, sizeof(*bq2419x), GFP_KERNEL);
1762 dev_err(&client->dev, "Memory allocation failed\n");
1765 bq2419x->charger_pdata = pdata->bcharger_pdata;
1766 bq2419x->vbus_pdata = pdata->vbus_pdata;
1768 bq2419x->regmap = devm_regmap_init_i2c(client, &bq2419x_regmap_config);
1769 if (IS_ERR(bq2419x->regmap)) {
1770 ret = PTR_ERR(bq2419x->regmap);
1771 dev_err(&client->dev, "regmap init failed with err %d\n", ret);
1775 bq2419x->dev = &client->dev;
1776 i2c_set_clientdata(client, bq2419x);
1777 bq2419x->irq = client->irq;
1778 mutex_init(&bq2419x->otg_mutex);
1779 bq2419x->is_otg_connected = 0;
1781 ret = bq2419x_show_chip_version(bq2419x);
1783 dev_err(&client->dev, "version read failed %d\n", ret);
1787 ret = sysfs_create_group(&client->dev.kobj, &bq2419x_attr_group);
1789 dev_err(&client->dev, "sysfs create failed %d\n", ret);
1793 mutex_init(&bq2419x->mutex);
1795 if (!pdata->bcharger_pdata) {
1796 dev_info(&client->dev, "No battery charger supported\n");
1797 ret = bq2419x_watchdog_init(bq2419x, 0, "PROBE");
1799 dev_err(bq2419x->dev, "WDT disable failed: %d\n", ret);
1803 ret = bq2419x_fault_clear_sts(bq2419x, NULL);
1805 dev_err(bq2419x->dev, "fault clear status failed %d\n", ret);
1808 goto skip_bcharger_init;
1811 bq2419x->auto_recharge_time_power_off =
1812 pdata->bcharger_pdata->auto_recharge_time_power_off;
1813 bq2419x->wdt_time_sec = pdata->bcharger_pdata->wdt_timeout;
1814 bq2419x->chg_restart_time = pdata->bcharger_pdata->chg_restart_time;
1815 bq2419x->battery_presense = true;
1816 bq2419x->last_temp = -1000;
1817 bq2419x->disable_suspend_during_charging =
1818 pdata->bcharger_pdata->disable_suspend_during_charging;
1819 bq2419x->auto_recharge_time_supend =
1820 pdata->bcharger_pdata->auto_recharge_time_supend;
1821 bq2419x->chg_status_gpio = pdata->bcharger_pdata->chg_status_gpio;
1823 bq2419x_process_charger_plat_data(bq2419x, pdata->bcharger_pdata);
1825 ret = bq2419x_charger_init(bq2419x);
1827 dev_err(bq2419x->dev, "Charger init failed: %d\n", ret);
1831 ret = bq2419x_init_charger_regulator(bq2419x, pdata);
1833 dev_err(&client->dev,
1834 "Charger regualtor init failed %d\n", ret);
1838 bq2419x_charger_bci.polling_time_sec =
1839 pdata->bcharger_pdata->temp_polling_time_sec;
1840 bq2419x_charger_bci.tz_name = pdata->bcharger_pdata->tz_name;
1841 bq2419x->bc_dev = battery_charger_register(bq2419x->dev,
1842 &bq2419x_charger_bci, bq2419x);
1843 if (IS_ERR(bq2419x->bc_dev)) {
1844 ret = PTR_ERR(bq2419x->bc_dev);
1845 dev_err(bq2419x->dev, "battery charger register failed: %d\n",
1850 INIT_DELAYED_WORK(&bq2419x->wdt_restart_wq, bq2419x_wdt_restart_wq);
1851 ret = bq2419x_watchdog_init(bq2419x, bq2419x->wdt_time_sec, "PROBE");
1853 dev_err(bq2419x->dev, "BQWDT init failed %d\n", ret);
1857 INIT_DELAYED_WORK(&bq2419x->otg_reset_work,
1858 bq2419x_otg_reset_work_handler);
1859 ret = bq2419x_fault_clear_sts(bq2419x, NULL);
1861 dev_err(bq2419x->dev, "fault clear status failed %d\n", ret);
1865 ret = devm_request_threaded_irq(bq2419x->dev, bq2419x->irq, NULL,
1866 bq2419x_irq, IRQF_ONESHOT | IRQF_TRIGGER_FALLING,
1867 dev_name(bq2419x->dev), bq2419x);
1869 dev_warn(bq2419x->dev, "request IRQ %d fail, err = %d\n",
1871 dev_info(bq2419x->dev,
1872 "Supporting bq driver without interrupt\n");
1876 if (gpio_is_valid(bq2419x->chg_status_gpio)) {
1877 ret = devm_gpio_request(bq2419x->dev, bq2419x->chg_status_gpio,
1880 dev_err(bq2419x->dev, "error: can't request GPIO%d\n",
1881 bq2419x->chg_status_gpio);
1883 ret = gpio_direction_output(bq2419x->chg_status_gpio, 0);
1885 dev_err(bq2419x->dev,
1886 "can't setup GPIO%d as Output\n",
1887 bq2419x->chg_status_gpio);
1893 ret = bq2419x_init_vbus_regulator(bq2419x, pdata);
1895 dev_err(&client->dev, "VBUS regulator init failed %d\n", ret);
1899 /* enable charging */
1900 ret = bq2419x_charger_enable(bq2419x);
1906 if (pdata->bcharger_pdata) {
1907 cancel_delayed_work(&bq2419x->wdt_restart_wq);
1908 battery_charger_unregister(bq2419x->bc_dev);
1911 mutex_destroy(&bq2419x->mutex);
1912 mutex_destroy(&bq2419x->otg_mutex);
1916 static int bq2419x_remove(struct i2c_client *client)
1918 struct bq2419x_chip *bq2419x = i2c_get_clientdata(client);
1920 if (bq2419x->battery_presense) {
1921 battery_charger_unregister(bq2419x->bc_dev);
1922 cancel_delayed_work(&bq2419x->wdt_restart_wq);
1924 mutex_destroy(&bq2419x->mutex);
1925 mutex_destroy(&bq2419x->otg_mutex);
1926 cancel_delayed_work_sync(&bq2419x->otg_reset_work);
1930 static void bq2419x_shutdown(struct i2c_client *client)
1932 struct bq2419x_chip *bq2419x = i2c_get_clientdata(client);
1933 struct device *dev = &client->dev;
1935 int next_poweron_time = 0;
1937 if (!bq2419x->battery_presense)
1940 if (!bq2419x->cable_connected)
1943 ret = bq2419x_reset_wdt(bq2419x, "SHUTDOWN");
1945 dev_err(bq2419x->dev, "Reset WDT failed: %d\n", ret);
1947 if (bq2419x->chg_status == BATTERY_CHARGING_DONE) {
1948 dev_info(bq2419x->dev, "Battery charging done\n");
1952 if (bq2419x->in_current_limit <= 500) {
1953 dev_info(bq2419x->dev, "Battery charging with 500mA\n");
1954 next_poweron_time = bq2419x->auto_recharge_time_power_off;
1956 dev_info(bq2419x->dev, "Battery charging with high current\n");
1957 next_poweron_time = bq2419x->wdt_refresh_timeout;
1960 ret = battery_charging_system_reset_after(bq2419x->bc_dev,
1963 dev_err(dev, "System poweron after %d config failed %d\n",
1964 next_poweron_time, ret);
1966 if (next_poweron_time)
1967 dev_info(dev, "System-charger will power-ON after %d sec\n",
1970 dev_info(bq2419x->dev, "System-charger will not power-ON\n");
1972 battery_charging_system_power_on_usb_event(bq2419x->bc_dev);
1973 cancel_delayed_work_sync(&bq2419x->otg_reset_work);
1976 #ifdef CONFIG_PM_SLEEP
1977 static int bq2419x_suspend(struct device *dev)
1979 struct bq2419x_chip *bq2419x = dev_get_drvdata(dev);
1980 int next_wakeup = 0;
1983 if (!bq2419x->battery_presense)
1986 battery_charging_restart_cancel(bq2419x->bc_dev);
1988 if (!bq2419x->cable_connected)
1991 ret = bq2419x_reset_wdt(bq2419x, "Suspend");
1993 dev_err(bq2419x->dev, "Reset WDT failed: %d\n", ret);
1995 if (bq2419x->chg_status == BATTERY_CHARGING_DONE) {
1996 dev_info(bq2419x->dev, "Battery charging done\n");
2000 if (bq2419x->in_current_limit <= 500) {
2001 dev_info(bq2419x->dev, "Battery charging with 500mA\n");
2002 next_wakeup = bq2419x->auto_recharge_time_supend;
2004 dev_info(bq2419x->dev, "Battery charging with high current\n");
2005 next_wakeup = bq2419x->wdt_refresh_timeout;
2008 battery_charging_wakeup(bq2419x->bc_dev, next_wakeup);
2011 dev_info(dev, "System-charger will resume after %d sec\n",
2014 dev_info(dev, "System-charger will not have resume time\n");
2016 if (next_wakeup == bq2419x->wdt_refresh_timeout)
2019 ret = bq2419x_set_charging_current_suspend(bq2419x, 500);
2021 dev_err(bq2419x->dev, "Config of charging failed: %d\n", ret);
2025 static int bq2419x_resume(struct device *dev)
2028 struct bq2419x_chip *bq2419x = dev_get_drvdata(dev);
2031 if (!bq2419x->battery_presense)
2034 ret = bq2419x_fault_clear_sts(bq2419x, &val);
2036 dev_err(bq2419x->dev, "fault clear status failed %d\n", ret);
2040 if (val & BQ2419x_FAULT_WATCHDOG_FAULT) {
2041 bq_chg_err(bq2419x, "Watchdog Timer Expired\n");
2043 ret = bq2419x_reconfigure_charger_param(bq2419x,
2046 dev_err(bq2419x->dev, "BQ reconfig failed %d\n", ret);
2050 ret = bq2419x_reset_wdt(bq2419x, "Resume");
2052 dev_err(bq2419x->dev, "Reset WDT failed: %d\n", ret);
2055 if (val & BQ2419x_FAULT_CHRG_SAFTY) {
2056 bq_chg_err(bq2419x, "Safety timer Expired\n");
2057 ret = bq2419x_handle_safety_timer_expire(bq2419x);
2059 dev_err(bq2419x->dev,
2060 "Handling of safty timer expire failed: %d\n",
2069 static const struct dev_pm_ops bq2419x_pm_ops = {
2070 SET_SYSTEM_SLEEP_PM_OPS(bq2419x_suspend, bq2419x_resume)
2073 static const struct i2c_device_id bq2419x_id[] = {
2074 {.name = "bq2419x",},
2077 MODULE_DEVICE_TABLE(i2c, bq2419x_id);
2079 static struct i2c_driver bq2419x_i2c_driver = {
2082 .owner = THIS_MODULE,
2083 .pm = &bq2419x_pm_ops,
2085 .probe = bq2419x_probe,
2086 .remove = bq2419x_remove,
2087 .shutdown = bq2419x_shutdown,
2088 .id_table = bq2419x_id,
2091 static int __init bq2419x_module_init(void)
2093 return i2c_add_driver(&bq2419x_i2c_driver);
2095 subsys_initcall(bq2419x_module_init);
2097 static void __exit bq2419x_cleanup(void)
2099 i2c_del_driver(&bq2419x_i2c_driver);
2101 module_exit(bq2419x_cleanup);
2103 MODULE_DESCRIPTION("BQ24190/BQ24192/BQ24192i/BQ24193 battery charger driver");
2104 MODULE_AUTHOR("Laxman Dewangan <ldewangan@nvidia.com>");
2105 MODULE_AUTHOR("Syed Rafiuddin <srafiuddin@nvidia.com");
2106 MODULE_LICENSE("GPL v2");