diff --git a/drivers/power/bq2589x_chg_mmi/bq2589x_charger.c b/drivers/power/bq2589x_chg_mmi/bq2589x_charger.c index cfce8a7101ee..9d9c8cc0cb38 100644 --- a/drivers/power/bq2589x_chg_mmi/bq2589x_charger.c +++ b/drivers/power/bq2589x_chg_mmi/bq2589x_charger.c @@ -287,22 +287,44 @@ static int bq2589x_set_otg_current(struct bq2589x *bq, int curr) { u8 temp; - if (curr >= 2400) - temp = BQ2589X_BOOST_LIM_2400MA; - else if (curr >= 2100) - temp = BQ2589X_BOOST_LIM_2100MA; - else if (curr >= 1800) - temp = BQ2589X_BOOST_LIM_1800MA; - else if (curr >= 1600) - temp = BQ2589X_BOOST_LIM_1600MA; - else if (curr >= 1300) - temp = BQ2589X_BOOST_LIM_1300MA; - else if (curr >= 1100) - temp = BQ2589X_BOOST_LIM_1100MA; - else if (curr >= 700) - temp = BQ2589X_BOOST_LIM_700MA; - else - temp = BQ2589X_BOOST_LIM_500MA; + if (bq->part_no == SC89890H) { + if (curr < 600) + temp = SC89890H_BOOST_LIM_500MA; + else if (curr < 900) + temp = SC89890H_BOOST_LIM_750MA; + else if (curr < 1300) + temp = SC89890H_BOOST_LIM_1200MA; + else if (curr < 1500) + temp = SC89890H_BOOST_LIM_1400MA; + else if (curr < 1700) + temp = SC89890H_BOOST_LIM_1650MA; + else if (curr < 1900) + temp = SC89890H_BOOST_LIM_1875MA; + else if (curr < 2200) + temp = SC89890H_BOOST_LIM_2150MA; + else if (curr < 2500) + temp = SC89890H_BOOST_LIM_2450MA; + else + temp = SC89890H_BOOST_LIM_1400MA; + } else { + if (curr >= 2400) + temp = BQ2589X_BOOST_LIM_2400MA; + else if (curr >= 2100) + temp = BQ2589X_BOOST_LIM_2100MA; + else if (curr >= 1800) + temp = BQ2589X_BOOST_LIM_1800MA; + else if (curr >= 1600) + temp = BQ2589X_BOOST_LIM_1600MA; + else if (curr >= 1300) + temp = BQ2589X_BOOST_LIM_1300MA; + else if (curr >= 1100) + temp = BQ2589X_BOOST_LIM_1100MA; + else if (curr >= 700) + temp = BQ2589X_BOOST_LIM_700MA; + else + temp = BQ2589X_BOOST_LIM_500MA; + } + return bq2589x_update_bits(bq, BQ2589X_REG_0A, BQ2589X_BOOST_LIM_MASK, temp << BQ2589X_BOOST_LIM_SHIFT); } @@ -995,6 +1017,11 @@ static int bq2589x_init_device(struct bq2589x *bq) int ret; /*common initialization*/ + if (bq->part_no == SC89890H) { + bq2589x_update_bits(bq, BQ2589X_REG_00, BQ2589X_ENILIM_MASK, + BQ2589X_ENILIM_DISABLE << BQ2589X_ENILIM_SHIFT); + } + bq2589x_disable_watchdog_timer(bq); /*disable maxcharge en to allow qc2.0 detection*/ @@ -2486,12 +2513,20 @@ static int bq2589x_set_otg_enable(struct charger_device *chg_dev, bool enable) { struct bq2589x *bq = dev_get_drvdata(&chg_dev->dev); u8 val; + int ret = 0; - if (enable) + if (enable) { + if (bq->part_no == SC89890H) { + ret = bq2589x_disable_charger(bq); + } val = BQ2589X_OTG_ENABLE << BQ2589X_OTG_CONFIG_SHIFT; - else + } + else { val = BQ2589X_OTG_DISABLE << BQ2589X_OTG_CONFIG_SHIFT; - + if (bq->part_no == SC89890H) { + ret = bq2589x_enable_charger(bq); + } + } dev_info(bq->dev, "%s: %s otg\n", __func__, enable ? "enable" : "disable"); return bq2589x_update_bits(bq, BQ2589X_REG_03, BQ2589X_OTG_CONFIG_MASK, val); diff --git a/drivers/power/bq2589x_chg_mmi/bq2589x_reg.h b/drivers/power/bq2589x_chg_mmi/bq2589x_reg.h index 54a9387db8f0..961fe1529162 100644 --- a/drivers/power/bq2589x_chg_mmi/bq2589x_reg.h +++ b/drivers/power/bq2589x_chg_mmi/bq2589x_reg.h @@ -224,6 +224,8 @@ #define BQ2589X_BOOSTV_SHIFT 4 #define BQ2589X_BOOSTV_BASE 4550 #define BQ2589X_BOOSTV_LSB 64 +#define SC89890H_BOOSTV_BASE 3900 +#define SC89890H_BOOSTV_LSB 100 #define BQ2589X_BOOST_LIM_MASK 0x07 @@ -236,6 +238,14 @@ #define BQ2589X_BOOST_LIM_1800MA 0x05 #define BQ2589X_BOOST_LIM_2100MA 0x06 #define BQ2589X_BOOST_LIM_2400MA 0x07 +#define SC89890H_BOOST_LIM_500MA 0x00 +#define SC89890H_BOOST_LIM_750MA 0x01 +#define SC89890H_BOOST_LIM_1200MA 0x02 +#define SC89890H_BOOST_LIM_1400MA 0x03 +#define SC89890H_BOOST_LIM_1650MA 0x04 +#define SC89890H_BOOST_LIM_1875MA 0x05 +#define SC89890H_BOOST_LIM_2150MA 0x06 +#define SC89890H_BOOST_LIM_2450MA 0x07 /* Register 0x0B*/ @@ -295,6 +305,10 @@ #define BQ2589X_VINDPM_BASE 2600 #define BQ2589X_VINDPM_LSB 100 +#define SC89890H_VINDPMOS_MASK 0x03 +#define SC89890H_VINDPMOS_SHIFT 0 +#define SC89890H_VINDPMOS_400MV 0 +#define SC89890H_VINDPMOS_600MV 1 /* Register 0x0E*/ #define BQ2589X_REG_0E 0x0E