[PATCH] power: supply: bq256xx: Support enter shipping mode

From: Hermes Zhang
Date: Mon Feb 20 2023 - 02:46:20 EST


Enable shipping mode for bq256xx chip. The shipping mode can be enabled
by echo 0 > /sys/class/power_supply/bq256xx-charger/online.

Signed-off-by: Hermes Zhang <chenhuiz@xxxxxxxx>
---
drivers/power/supply/bq256xx_charger.c | 35 ++++++++++++++++++++++++--
1 file changed, 33 insertions(+), 2 deletions(-)

diff --git a/drivers/power/supply/bq256xx_charger.c b/drivers/power/supply/bq256xx_charger.c
index db13e288e439..c01ef9d26d31 100644
--- a/drivers/power/supply/bq256xx_charger.c
+++ b/drivers/power/supply/bq256xx_charger.c
@@ -115,6 +115,9 @@
#define BQ256XX_VBUS_STAT_USB_DCP (BIT(6) | BIT(5))
#define BQ256XX_VBUS_STAT_USB_OTG (BIT(7) | BIT(6) | BIT(5))

+#define BQ256XX_BATFET_DISABLE_MASK BIT(5)
+#define BQ256XX_BATFET_DISABLE_BIT_SHIFT 5
+
#define BQ256XX_CHRG_STAT_MASK GENMASK(4, 3)
#define BQ256XX_CHRG_STAT_NOT_CHRGING 0
#define BQ256XX_CHRG_STAT_PRECHRGING BIT(3)
@@ -290,6 +293,7 @@ struct bq256xx_chip_info {
int (*bq256xx_set_iterm)(struct bq256xx_device *bq, int iterm);
int (*bq256xx_set_iprechg)(struct bq256xx_device *bq, int iprechg);
int (*bq256xx_set_vindpm)(struct bq256xx_device *bq, int vindpm);
+ int (*bq256xx_set_online)(struct bq256xx_device *bq, bool online);

int bq256xx_def_ichg;
int bq256xx_def_iindpm;
@@ -425,6 +429,7 @@ static int bq256xx_get_state(struct bq256xx_device *bq,
{
unsigned int charger_status_0;
unsigned int charger_status_1;
+ unsigned int charger_control_3;
int ret;

ret = regmap_read(bq->regmap, BQ256XX_CHARGER_STATUS_0,
@@ -437,9 +442,15 @@ static int bq256xx_get_state(struct bq256xx_device *bq,
if (ret)
return ret;

+ ret = regmap_read(bq->regmap, BQ256XX_CHARGER_CONTROL_3,
+ &charger_control_3);
+ if (ret)
+ return ret;
+
state->vbus_stat = charger_status_0 & BQ256XX_VBUS_STAT_MASK;
state->chrg_stat = charger_status_0 & BQ256XX_CHRG_STAT_MASK;
- state->online = charger_status_0 & BQ256XX_PG_STAT_MASK;
+ state->online = (charger_status_0 & BQ256XX_PG_STAT_MASK)
+ && !(charger_control_3 & BQ256XX_BATFET_DISABLE_MASK);

state->wdt_fault = charger_status_1 & BQ256XX_WDT_FAULT_MASK;
state->bat_fault = charger_status_1 & BQ256XX_BAT_FAULT_MASK;
@@ -702,6 +713,13 @@ static int bq256xx_set_prechrg_curr(struct bq256xx_device *bq, int iprechg)
BQ256XX_IPRECHG_MASK, iprechg_reg_code);
}

+static int bq256xx_set_online(struct bq256xx_device *bq, bool online)
+{
+ return regmap_update_bits(bq->regmap, BQ256XX_CHARGER_CONTROL_3,
+ BQ256XX_BATFET_DISABLE_MASK,
+ (online ? 0 : 1) << BQ256XX_BATFET_DISABLE_BIT_SHIFT);
+}
+
static int bq25618_619_get_prechrg_curr(struct bq256xx_device *bq)
{
unsigned int prechg_and_term_curr_lim;
@@ -915,6 +933,11 @@ static int bq256xx_set_charger_property(struct power_supply *psy,
return ret;
break;

+ case POWER_SUPPLY_PROP_ONLINE:
+ ret = bq->chip_info->bq256xx_set_online(bq, val->intval);
+ if (ret)
+ return ret;
+ break;
default:
break;
}
@@ -1197,6 +1220,7 @@ static int bq256xx_property_is_writeable(struct power_supply *psy,
case POWER_SUPPLY_PROP_CHARGE_TERM_CURRENT:
case POWER_SUPPLY_PROP_STATUS:
case POWER_SUPPLY_PROP_INPUT_VOLTAGE_LIMIT:
+ case POWER_SUPPLY_PROP_ONLINE:
return true;
default:
return false;
@@ -1229,7 +1253,7 @@ static bool bq256xx_is_volatile_reg(struct device *dev, unsigned int reg)
{
switch (reg) {
case BQ256XX_INPUT_CURRENT_LIMIT:
- case BQ256XX_CHARGER_STATUS_0...BQ256XX_CHARGER_STATUS_2:
+ case BQ256XX_CHARGER_CONTROL_3...BQ256XX_CHARGER_STATUS_2:
return true;
default:
return false;
@@ -1286,6 +1310,7 @@ static const struct bq256xx_chip_info bq256xx_chip_info_tbl[] = {
.bq256xx_set_iterm = bq256xx_set_term_curr,
.bq256xx_set_iprechg = bq256xx_set_prechrg_curr,
.bq256xx_set_vindpm = bq256xx_set_input_volt_lim,
+ .bq256xx_set_online = bq256xx_set_online,

.bq256xx_def_ichg = BQ2560X_ICHG_DEF_uA,
.bq256xx_def_iindpm = BQ256XX_IINDPM_DEF_uA,
@@ -1316,6 +1341,7 @@ static const struct bq256xx_chip_info bq256xx_chip_info_tbl[] = {
.bq256xx_set_iterm = bq256xx_set_term_curr,
.bq256xx_set_iprechg = bq256xx_set_prechrg_curr,
.bq256xx_set_vindpm = bq256xx_set_input_volt_lim,
+ .bq256xx_set_online = bq256xx_set_online,

.bq256xx_def_ichg = BQ2560X_ICHG_DEF_uA,
.bq256xx_def_iindpm = BQ256XX_IINDPM_DEF_uA,
@@ -1346,6 +1372,7 @@ static const struct bq256xx_chip_info bq256xx_chip_info_tbl[] = {
.bq256xx_set_iterm = bq256xx_set_term_curr,
.bq256xx_set_iprechg = bq256xx_set_prechrg_curr,
.bq256xx_set_vindpm = bq256xx_set_input_volt_lim,
+ .bq256xx_set_online = bq256xx_set_online,

.bq256xx_def_ichg = BQ2560X_ICHG_DEF_uA,
.bq256xx_def_iindpm = BQ256XX_IINDPM_DEF_uA,
@@ -1376,6 +1403,7 @@ static const struct bq256xx_chip_info bq256xx_chip_info_tbl[] = {
.bq256xx_set_iterm = bq256xx_set_term_curr,
.bq256xx_set_iprechg = bq256xx_set_prechrg_curr,
.bq256xx_set_vindpm = bq256xx_set_input_volt_lim,
+ .bq256xx_set_online = bq256xx_set_online,

.bq256xx_def_ichg = BQ2560X_ICHG_DEF_uA,
.bq256xx_def_iindpm = BQ256XX_IINDPM_DEF_uA,
@@ -1406,6 +1434,7 @@ static const struct bq256xx_chip_info bq256xx_chip_info_tbl[] = {
.bq256xx_set_iterm = bq256xx_set_term_curr,
.bq256xx_set_iprechg = bq256xx_set_prechrg_curr,
.bq256xx_set_vindpm = bq256xx_set_input_volt_lim,
+ .bq256xx_set_online = bq256xx_set_online,

.bq256xx_def_ichg = BQ25611D_ICHG_DEF_uA,
.bq256xx_def_iindpm = BQ256XX_IINDPM_DEF_uA,
@@ -1436,6 +1465,7 @@ static const struct bq256xx_chip_info bq256xx_chip_info_tbl[] = {
.bq256xx_set_iterm = bq25618_619_set_term_curr,
.bq256xx_set_iprechg = bq25618_619_set_prechrg_curr,
.bq256xx_set_vindpm = bq256xx_set_input_volt_lim,
+ .bq256xx_set_online = bq256xx_set_online,

.bq256xx_def_ichg = BQ25618_ICHG_DEF_uA,
.bq256xx_def_iindpm = BQ256XX_IINDPM_DEF_uA,
@@ -1466,6 +1496,7 @@ static const struct bq256xx_chip_info bq256xx_chip_info_tbl[] = {
.bq256xx_set_iterm = bq25618_619_set_term_curr,
.bq256xx_set_iprechg = bq25618_619_set_prechrg_curr,
.bq256xx_set_vindpm = bq256xx_set_input_volt_lim,
+ .bq256xx_set_online = bq256xx_set_online,

.bq256xx_def_ichg = BQ25618_ICHG_DEF_uA,
.bq256xx_def_iindpm = BQ256XX_IINDPM_DEF_uA,
--
2.30.2