diff options
-rw-r--r-- | drivers/power/bq2419x-charger.c | 39 | ||||
-rw-r--r-- | include/linux/power/bq2419x-charger.h | 4 |
2 files changed, 38 insertions, 5 deletions
diff --git a/drivers/power/bq2419x-charger.c b/drivers/power/bq2419x-charger.c index 594f55be2ada..4e829e69967d 100644 --- a/drivers/power/bq2419x-charger.c +++ b/drivers/power/bq2419x-charger.c @@ -71,6 +71,7 @@ static const unsigned int bq2419x_maxcharge_voltage_lookup[] = { #define BQ2419X_CHARGE_ICHG_OFFSET 512 #define BQ2419X_PRE_CHG_IPRECHG_OFFSET 128 #define BQ2419X_PRE_CHG_TERM_OFFSET 128 +#define BQ2419X_CHARGE_VOLTAGE_OFFSET 3504 /* input current limit */ static const unsigned int iinlim[] = { @@ -122,6 +123,7 @@ struct bq2419x_chip { struct bq2419x_reg_info chg_current_control; struct bq2419x_reg_info prechg_term_control; struct bq2419x_reg_info ir_comp_therm; + struct bq2419x_reg_info chg_voltage_control; }; static inline int convert_to_reg(int x) @@ -153,11 +155,12 @@ static int bq2419x_charger_enable(struct bq2419x_chip *bq2419x) if (bq2419x->battery_presense) { dev_info(bq2419x->dev, "Charging enabled\n"); /* set default Charge regulation voltage */ - ret = regmap_write(bq2419x->regmap, BQ2419X_VOLT_CTRL_REG, - BQ2419x_DEFAULT_CHARGE_VOLTAGE); + ret = regmap_update_bits(bq2419x->regmap, BQ2419X_VOLT_CTRL_REG, + bq2419x->chg_voltage_control.mask, + bq2419x->chg_voltage_control.val); if (ret < 0) { dev_err(bq2419x->dev, - "VOLT_CTRL_REG write failed %d\n", ret); + "VOLT_CTRL_REG update failed %d\n", ret); return ret; } ret = regmap_update_bits(bq2419x->regmap, BQ2419X_PWR_ON_REG, @@ -230,7 +233,8 @@ static int bq2419x_process_charger_plat_data(struct bq2419x_chip *bq2419x, int ir_compensation_resistor; int ir_compensation_voltage; int thermal_regulation_threshold; - int vindpm, ichg, iprechg, iterm, bat_comp, vclamp, treg; + int charge_voltage_limit; + int vindpm, ichg, iprechg, iterm, bat_comp, vclamp, treg, vreg; if (chg_pdata) { voltage_input = chg_pdata->input_voltage_limit_mV ?: 4200; @@ -246,6 +250,8 @@ static int bq2419x_process_charger_plat_data(struct bq2419x_chip *bq2419x, chg_pdata->ir_compensation_voltage_mV ?: 112; thermal_regulation_threshold = chg_pdata->thermal_regulation_threshold_degC ?: 100; + charge_voltage_limit = + chg_pdata->charge_voltage_limit_mV ?: 4208; } else { voltage_input = 4200; fast_charge_current = 4544; @@ -254,6 +260,7 @@ static int bq2419x_process_charger_plat_data(struct bq2419x_chip *bq2419x, ir_compensation_resistor = 70; ir_compensation_voltage = 112; thermal_regulation_threshold = 100; + charge_voltage_limit = 4208; } vindpm = (voltage_input - BQ2419X_INPUT_VINDPM_OFFSET) / 80; @@ -289,6 +296,10 @@ static int bq2419x_process_charger_plat_data(struct bq2419x_chip *bq2419x, else treg = 3; bq2419x->ir_comp_therm.val |= treg; + + vreg = (charge_voltage_limit - BQ2419X_CHARGE_VOLTAGE_OFFSET) / 16; + bq2419x->chg_voltage_control.mask = BQ2419X_CHG_VOLT_LIMIT_MASK; + bq2419x->chg_voltage_control.val = vreg << 2; return 0; } @@ -322,6 +333,12 @@ static int bq2419x_charger_init(struct bq2419x_chip *bq2419x) if (ret < 0) dev_err(bq2419x->dev, "THERM_REG write failed: %d\n", ret); + ret = regmap_update_bits(bq2419x->regmap, BQ2419X_VOLT_CTRL_REG, + bq2419x->chg_voltage_control.mask, + bq2419x->chg_voltage_control.val); + if (ret < 0) + dev_err(bq2419x->dev, "VOLT_CTRL update failed: %d\n", ret); + return ret; } @@ -1113,6 +1130,15 @@ static int bq2419x_charger_thermal_configure( if (enable_charger) { if (!enable_charg_half_current && bq2419x->charging_state != ENABLED_FULL_IBAT) { + ret = regmap_update_bits(bq2419x->regmap, + BQ2419X_VOLT_CTRL_REG, + bq2419x->chg_voltage_control.mask, + bq2419x->chg_voltage_control.val); + if (ret < 0) { + dev_err(bq2419x->dev, + "VOLT_CTRL update failed %d\n", ret); + return ret; + } bq2419x_full_current_enable(bq2419x); battery_charging_status_update(bq2419x->bc_dev, BATTERY_CHARGING); @@ -1255,6 +1281,11 @@ static struct bq2419x_platform_data *bq2419x_dt_parse(struct i2c_client *client) bcharger_pdata->thermal_regulation_threshold_degC = pval; + ret = of_property_read_u32(batt_reg_node, + "ti,charge-voltage-limit-millivolt", &pval); + if (!ret) + pdata->bcharger_pdata->charge_voltage_limit_mV = pval; + pdata->bcharger_pdata->disable_suspend_during_charging = of_property_read_bool(batt_reg_node, "ti,disbale-suspend-during-charging"); diff --git a/include/linux/power/bq2419x-charger.h b/include/linux/power/bq2419x-charger.h index dbf1aaa7e0ee..b55ccbcdc895 100644 --- a/include/linux/power/bq2419x-charger.h +++ b/include/linux/power/bq2419x-charger.h @@ -51,6 +51,8 @@ #define BQ2419X_THERM_VCLAMP_MASK 0x1C #define BQ2419X_THERM_TREG_MASK 0x03 +#define BQ2419X_CHG_VOLT_LIMIT_MASK 0xFC + #define BQ24190_IC_VER 0x40 #define BQ24192_IC_VER 0x28 #define BQ24192i_IC_VER 0x18 @@ -102,7 +104,6 @@ #define BQ2419x_NVCHARGER_INPUT_VOL_SEL 0x40 #define BQ2419x_DEFAULT_INPUT_VOL_SEL 0x30 #define BQ2419x_VOLTAGE_CTRL_MASK 0xFC -#define BQ2419x_DEFAULT_CHARGE_VOLTAGE 0xB2 #define BQ2419x_CHARGING_CURRENT_STEP_DELAY_US 1000 @@ -132,6 +133,7 @@ struct bq2419x_charger_platform_data { int ir_compensation_resister_ohm; int ir_compensation_voltage_mV; int thermal_regulation_threshold_degC; + int charge_voltage_limit_mV; int max_charge_current_mA; int wdt_timeout; int rtc_alarm_time; |