build/patch/kernel/archive/sunxi-6.4/patches.megous/power-supply-ip5xxx-Add-ip5xxx-usb-supply.patch

85 lines
2.5 KiB
Diff

From 04f66f8c5b666aba1ac9f0e9e65872296ff0b0b3 Mon Sep 17 00:00:00 2001
From: Ondrej Jirman <megi@xff.cz>
Date: Sat, 2 Apr 2022 03:19:36 +0200
Subject: [PATCH 387/469] power: supply: ip5xxx: Add ip5xxx-usb supply
This supply represents presnece of the USB power supply on VIN.
Signed-off-by: Ondrej Jirman <megi@xff.cz>
---
drivers/power/supply/ip5xxx_power.c | 44 +++++++++++++++++++++++++++++
1 file changed, 44 insertions(+)
diff --git a/drivers/power/supply/ip5xxx_power.c b/drivers/power/supply/ip5xxx_power.c
index 70cf8724e638..9459e217cd42 100644
--- a/drivers/power/supply/ip5xxx_power.c
+++ b/drivers/power/supply/ip5xxx_power.c
@@ -46,6 +46,7 @@
#define IP5XXX_GPIO_CTL3 0x55
#define IP5XXX_STATUS 0x70
#define IP5XXX_STATUS_BOOST_ON BIT(2)
+#define IP5XXX_STATUS_VIN_PRESENT BIT(4)
#define IP5XXX_READ0 0x71
#define IP5XXX_READ0_CHG_STAT GENMASK(7, 5)
#define IP5XXX_READ0_CHG_STAT_IDLE (0x0 << 5)
@@ -632,6 +633,45 @@ static const struct power_supply_desc ip5xxx_boost_desc = {
.property_is_writeable = ip5xxx_boost_property_is_writeable,
};
+static const enum power_supply_property ip5xxx_usb_properties[] = {
+ POWER_SUPPLY_PROP_PRESENT,
+};
+
+static int ip5xxx_usb_get_property(struct power_supply *psy,
+ enum power_supply_property psp,
+ union power_supply_propval *val)
+{
+ struct ip5xxx *ip5xxx = power_supply_get_drvdata(psy);
+ unsigned int rval;
+ int ret;
+
+ ret = ip5xxx_initialize(psy);
+ if (ret)
+ return ret;
+
+ switch (psp) {
+ case POWER_SUPPLY_PROP_PRESENT:
+ ret = ip5xxx_read(ip5xxx, IP5XXX_STATUS, &rval);
+ if (ret)
+ return ret;
+
+ val->intval = !!(rval & IP5XXX_STATUS_VIN_PRESENT);
+ return 0;
+
+ default:
+ return -EINVAL;
+ }
+}
+
+static const struct power_supply_desc ip5xxx_usb_desc = {
+ .name = "ip5xxx-usb",
+ .type = POWER_SUPPLY_TYPE_USB,
+ .properties = ip5xxx_usb_properties,
+ .num_properties = ARRAY_SIZE(ip5xxx_usb_properties),
+ .get_property = ip5xxx_usb_get_property,
+ .property_is_writeable = ip5xxx_boost_property_is_writeable,
+};
+
static const struct regmap_config ip5xxx_regmap_config = {
.reg_bits = 8,
.val_bits = 8,
@@ -665,6 +705,10 @@ static int ip5xxx_power_probe(struct i2c_client *client)
if (IS_ERR(psy))
return PTR_ERR(psy);
+ psy = devm_power_supply_register(dev, &ip5xxx_usb_desc, &psy_cfg);
+ if (IS_ERR(psy))
+ return PTR_ERR(psy);
+
ret = power_supply_get_battery_info(psy, &ip5xxx->bat);
if (ret)
return dev_err_probe(dev, ret, "Failed to get battery info\n");
--
2.34.1