summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Documentation/devicetree/bindings/power/bq2419x-charger.txt2
-rw-r--r--drivers/power/bq2419x-charger.c71
-rw-r--r--include/linux/power/bq2419x-charger.h1
3 files changed, 73 insertions, 1 deletions
diff --git a/Documentation/devicetree/bindings/power/bq2419x-charger.txt b/Documentation/devicetree/bindings/power/bq2419x-charger.txt
index 71816ce693e7..5ed8a1cd13bb 100644
--- a/Documentation/devicetree/bindings/power/bq2419x-charger.txt
+++ b/Documentation/devicetree/bindings/power/bq2419x-charger.txt
@@ -50,6 +50,8 @@ Optional properties:
11 to 15 -> 2048mA
16 to 60 -> 5200 mA
> 60 : Charging will be disabled by HW.
+-ti,auto-recharge-time-suspend: time setting in seconds to register
+ rtc alarm timer to wake the device from LP0.
Subnode properties:
==================
diff --git a/drivers/power/bq2419x-charger.c b/drivers/power/bq2419x-charger.c
index 5e071ebce935..7b52e07f0862 100644
--- a/drivers/power/bq2419x-charger.c
+++ b/drivers/power/bq2419x-charger.c
@@ -104,6 +104,7 @@ struct bq2419x_chip {
int last_charging_current;
bool disable_suspend_during_charging;
int last_temp;
+ u32 auto_recharge_time_supend;
struct bq2419x_reg_info input_src;
struct bq2419x_reg_info chg_current_control;
struct bq2419x_reg_info prechg_term_control;
@@ -702,6 +703,25 @@ static irqreturn_t bq2419x_irq(int irq, void *data)
ret);
return ret;
}
+
+ ret = regmap_read(bq2419x->regmap, BQ2419X_PWR_ON_REG, &val);
+ if (ret < 0) {
+ dev_err(bq2419x->dev, "PWR_ON_REG read failed %d",
+ ret);
+ return ret;
+ }
+
+ if ((val & BQ2419X_ENABLE_CHARGE_MASK) ==
+ BQ2419X_DISABLE_CHARGE) {
+ ret = regmap_update_bits(bq2419x->regmap,
+ BQ2419X_PWR_ON_REG, BQ2419X_ENABLE_CHARGE_MASK,
+ BQ2419X_ENABLE_CHARGE);
+ if (ret < 0) {
+ dev_err(bq2419x->dev,
+ "PWR_ON_REG update failed, %d\n", ret);
+ return ret;
+ }
+ }
check_chg_state = 1;
break;
default:
@@ -1356,6 +1376,13 @@ static struct bq2419x_platform_data *bq2419x_dt_parse(struct i2c_client *client)
chg_restart_time;
ret = of_property_read_u32(batt_reg_node,
+ "ti,auto-recharge-time-suspend",
+ &chg_restart_time);
+ if (!ret)
+ pdata->bcharger_pdata->auto_recharge_time_supend =
+ chg_restart_time;
+
+ ret = of_property_read_u32(batt_reg_node,
"ti,temp-polling-time-sec", &temp_polling_time);
if (!ret)
bcharger_pdata->temp_polling_time_sec =
@@ -1553,6 +1580,8 @@ static int bq2419x_probe(struct i2c_client *client,
bq2419x->last_temp = -1000;
bq2419x->disable_suspend_during_charging =
pdata->bcharger_pdata->disable_suspend_during_charging;
+ bq2419x->auto_recharge_time_supend =
+ pdata->bcharger_pdata->auto_recharge_time_supend;
bq2419x_process_charger_plat_data(bq2419x, pdata->bcharger_pdata);
@@ -1703,7 +1732,18 @@ static int bq2419x_suspend(struct device *dev)
(bq2419x->in_current_limit > 500)) {
battery_charging_wakeup(bq2419x->bc_dev,
bq2419x->wdt_refresh_timeout);
- } else {
+ } else if (bq2419x->cable_connected &&
+ bq2419x->auto_recharge_time_supend &&
+ (bq2419x->in_current_limit > 500) &&
+ (bq2419x->chg_status == BATTERY_CHARGING_DONE)){
+ battery_charging_wakeup(bq2419x->bc_dev,
+ bq2419x->auto_recharge_time_supend);
+ ret = bq2419x_set_charging_current_suspend(
+ bq2419x, 500);
+ if (ret < 0)
+ dev_err(bq2419x->dev,
+ "Configuration of charging failed: %d\n", ret);
+ } else {
ret = bq2419x_set_charging_current_suspend(bq2419x, 500);
if (ret < 0)
dev_err(bq2419x->dev,
@@ -1764,6 +1804,35 @@ static int bq2419x_resume(struct device *dev)
dev_err(bq2419x->dev, "Reset WDT failed: %d\n", ret);
}
+ if(val & BQ2419x_FAULT_CHRG_SAFTY) {
+ bq_chg_err(bq2419x, "Safety timer Expired\n");
+ ret = bq2419x_reset_safety_timer(bq2419x);
+ if (ret < 0) {
+ dev_err(bq2419x->dev,
+ "Reset safety timer failed %d\n", ret);
+ return ret;
+ }
+
+ ret = regmap_read(bq2419x->regmap, BQ2419X_PWR_ON_REG, &val);
+ if (ret < 0) {
+ dev_err(bq2419x->dev,
+ "PWR_ON_REG read failed %d", ret);
+ return ret;
+ }
+
+ if ((val & BQ2419X_ENABLE_CHARGE_MASK) ==
+ BQ2419X_DISABLE_CHARGE) {
+ ret = regmap_update_bits(bq2419x->regmap,
+ BQ2419X_PWR_ON_REG, BQ2419X_ENABLE_CHARGE_MASK,
+ BQ2419X_ENABLE_CHARGE);
+ if (ret < 0) {
+ dev_err(bq2419x->dev,
+ "PWR_ON_REG update failed, %d\n", ret);
+ return ret;
+ }
+ }
+ }
+
return 0;
};
#endif
diff --git a/include/linux/power/bq2419x-charger.h b/include/linux/power/bq2419x-charger.h
index 02f6b0fe55d1..e77c10efdb7a 100644
--- a/include/linux/power/bq2419x-charger.h
+++ b/include/linux/power/bq2419x-charger.h
@@ -150,6 +150,7 @@ struct bq2419x_charger_platform_data {
u32 *temp_range;
u32 *chg_current_limit;
u32 *chg_thermal_voltage_limit;
+ u32 auto_recharge_time_supend;
};
/*