diff options
-rw-r--r-- | drivers/power/bq2419x-charger.c | 45 | ||||
-rw-r--r-- | include/linux/power/bq2419x-charger.h | 2 |
2 files changed, 26 insertions, 21 deletions
diff --git a/drivers/power/bq2419x-charger.c b/drivers/power/bq2419x-charger.c index 70219674e837..d82a99abbc61 100644 --- a/drivers/power/bq2419x-charger.c +++ b/drivers/power/bq2419x-charger.c @@ -217,38 +217,41 @@ static int bq2419x_usb_get_property(struct power_supply *psy, static int bq2419x_init(struct bq2419x_chip *bq2419x) { - int val, ret = 0; + int val = 0; + int ret = 0; + int floor = 0; + + /* Configure input voltage to 4.52 in case of NV charger */ + if (bq2419x->in_current_limit == 2000) + val |= BQ2419x_NVCHARGER_INPUT_VOL_SEL; + else + val |= BQ2419x_DEFAULT_INPUT_VOL_SEL; /* Clear EN_HIZ */ - ret = regmap_update_bits(bq2419x->regmap, - BQ2419X_INPUT_SRC_REG, BQ2419X_EN_HIZ, 0); + ret = regmap_update_bits(bq2419x->regmap, BQ2419X_INPUT_SRC_REG, + BQ2419X_EN_HIZ | BQ2419x_INPUT_VOLTAGE_MASK, val); if (ret < 0) { - dev_err(bq2419x->dev, "error reading reg: 0x%x\n", - BQ2419X_INPUT_SRC_REG); + dev_err(bq2419x->dev, "INPUT_SRC_REG update failed %d\n", ret); return ret; } /* Configure input current limit */ val = current_to_reg(iinlim, ARRAY_SIZE(iinlim), bq2419x->in_current_limit); - if (val < 0) - return 0; - val &= ~(BQ2419x_INPUT_VOLTAGE_MASK); - /* Configure inout voltage to 4.52 in case of NV - * NV charger. - */ - if (bq2419x->in_current_limit == 2000) - val |= BQ2419x_NVCHARGER_INPUT_VOL_SEL; - else - val |= BQ2419x_DEFAULT_INPUT_VOL_SEL; + /* Start from 500mA and then step to val */ + floor = current_to_reg(iinlim, ARRAY_SIZE(iinlim), 500); + if (val < 0 || floor < 0) + return 0; - ret = regmap_update_bits(bq2419x->regmap, - BQ2419X_INPUT_SRC_REG, BQ2419x_CONFIG_MASK | - BQ2419x_INPUT_VOLTAGE_MASK, val); - if (ret < 0) - dev_err(bq2419x->dev, "error reading reg: 0x%x\n", - BQ2419X_INPUT_SRC_REG); + for (; floor <= val; floor++) { + udelay(BQ2419x_CHARGING_CURRENT_STEP_DELAY_US); + ret = regmap_update_bits(bq2419x->regmap, BQ2419X_INPUT_SRC_REG, + BQ2419x_CONFIG_MASK, floor); + if (ret < 0) + dev_err(bq2419x->dev, + "INPUT_SRC_REG update failed: %d\n", ret); + } return ret; } diff --git a/include/linux/power/bq2419x-charger.h b/include/linux/power/bq2419x-charger.h index 30b72e7aff91..21812caa0687 100644 --- a/include/linux/power/bq2419x-charger.h +++ b/include/linux/power/bq2419x-charger.h @@ -84,6 +84,8 @@ #define BQ2419x_NVCHARGER_INPUT_VOL_SEL 0x40 #define BQ2419x_DEFAULT_INPUT_VOL_SEL 0x30 +#define BQ2419x_CHARGING_CURRENT_STEP_DELAY_US 1000 + #define BQ2419X_MAX_REGS (BQ2419X_REVISION_REG + 1) /* |