From 4417e0261451073564dadec4f30b99791bedfa1d Mon Sep 17 00:00:00 2001
From: Ondrej Jirman <megi@xff.cz>
Date: Sat, 2 Apr 2022 03:17:34 +0200
Subject: [PATCH 413/480] power: supply: ip5xxx: Add boost status property

Boost can be enabled, but actually off. Real status is reported by
POWER_SUPPLY_PROP_PRESENT property.

Signed-off-by: Ondrej Jirman <megi@xff.cz>
---
 drivers/power/supply/ip5xxx_power.c | 17 ++++++++++++++++-
 1 file changed, 16 insertions(+), 1 deletion(-)

diff --git a/drivers/power/supply/ip5xxx_power.c b/drivers/power/supply/ip5xxx_power.c
index be88f05a6287..b5c739e76ac3 100644
--- a/drivers/power/supply/ip5xxx_power.c
+++ b/drivers/power/supply/ip5xxx_power.c
@@ -42,6 +42,8 @@ struct ip5xxx {
 			struct regmap_field *vin_overvolt;
 		} charger;
 		struct {
+			/* Boost converter status */
+			struct regmap_field *status;
 			/* Boost converter enable */
 			struct regmap_field *enable;
 			struct {
@@ -125,6 +127,7 @@ struct ip5xxx_regfield_config {
 	const struct reg_field charger_chg_end;
 	const struct reg_field charger_timeout;
 	const struct reg_field charger_vin_overvolt;
+	const struct reg_field boost_status;
 	const struct reg_field boost_enable;
 	const struct reg_field boost_llshdn_enable;
 	const struct reg_field boost_llshdn_i_limit;
@@ -647,6 +650,7 @@ static const struct power_supply_desc ip5xxx_battery_desc = {
 
 static const enum power_supply_property ip5xxx_boost_properties[] = {
 	POWER_SUPPLY_PROP_ONLINE,
+	POWER_SUPPLY_PROP_PRESENT,
 	POWER_SUPPLY_PROP_VOLTAGE_MIN_DESIGN,
 };
 
@@ -671,6 +675,14 @@ static int ip5xxx_boost_get_property(struct power_supply *psy,
 		val->intval = !!rval;
 		return 0;
 
+	case POWER_SUPPLY_PROP_PRESENT:
+		ret = ip5xxx_read(ip5xxx, ip5xxx->regs.boost.status, &rval);
+		if (ret)
+			return ret;
+
+		val->intval = !!rval;
+		return 0;
+
 	case POWER_SUPPLY_PROP_VOLTAGE_MIN_DESIGN:
 		ret = ip5xxx_read(ip5xxx, ip5xxx->regs.boost.undervolt_limit, &rval);
 		if (ret)
@@ -714,7 +726,7 @@ static int ip5xxx_boost_set_property(struct power_supply *psy,
 static int ip5xxx_boost_property_is_writeable(struct power_supply *psy,
 					      enum power_supply_property psp)
 {
-	return true;
+	return psp != POWER_SUPPLY_PROP_PRESENT;
 }
 
 static const struct power_supply_desc ip5xxx_boost_desc = {
@@ -741,6 +753,7 @@ static struct ip5xxx_regfield_config ip51xx_fields = {
 	.charger_chg_end = REG_FIELD(0x71, 3, 3),
 	.charger_timeout = REG_FIELD(0x71, 0, 2),
 	.charger_vin_overvolt = REG_FIELD(0x72, 5, 5),
+	.boost_status = REG_FIELD(0x70, 2, 2),
 	.boost_enable = REG_FIELD(0x01, 2, 2),
 	.boost_llshdn_enable = REG_FIELD(0x02, 1, 1),
 	.boost_llshdn_i_limit = REG_FIELD(0x0c, 3, 7),
@@ -781,6 +794,7 @@ static struct ip5xxx_regfield_config ip5306_fields = {
 	.charger_chg_end = REG_FIELD(0x71, 3, 3),
 	.charger_timeout = REG_FIELD_UNSUPPORTED,
 	.charger_vin_overvolt = REG_FIELD_UNSUPPORTED,
+	.boost_status = REG_FIELD_UNSUPPORTED,
 	.boost_enable = REG_FIELD(0x00, 5, 5),
 	.boost_llshdn_enable = REG_FIELD_UNSUPPORTED,
 	.boost_llshdn_i_limit = REG_FIELD_UNSUPPORTED,
@@ -837,6 +851,7 @@ static void ip5xxx_setup_regs(struct device *dev, struct ip5xxx *ip5xxx,
 	ip5xxx_setup_reg(charger_timeout, charger.timeout);
 	ip5xxx_setup_reg(charger_vin_overvolt, charger.vin_overvolt);
 	ip5xxx_setup_reg(boost_enable, boost.enable);
+	ip5xxx_setup_reg(boost_status, boost.status);
 	ip5xxx_setup_reg(boost_llshdn_enable, boost.light_load_shutdown.enable);
 	ip5xxx_setup_reg(boost_llshdn_i_limit, boost.light_load_shutdown.i_limit);
 	ip5xxx_setup_reg(boost_load_powerup_en, boost.load_powerup_en);
-- 
2.49.0

