Compare commits

...
Author SHA1 Message Date
Sicelo A. Mhlongo 8d63f5f14f linux-postmarketos-omap: test some bq* improvements
- bq27xxx - add VOLTAGE_MIN_DESIGN property
- bq27xxx - do not report bogus capacity values
- bq2415x - report events to userspace
2024-09-30 21:51:56 +02:00
4 changed files with 194 additions and 1 deletions

No files matched your search

@@ -4,7 +4,7 @@
pkgname=linux-postmarketos-omap
pkgver=6.10.6
pkgrel=1
pkgrel=2
pkgdesc="Mainline kernel fork for OMAP devices"
arch="armv7"
url="https://kernel.org/"
@@ -41,6 +41,9 @@ source="
0007-hsi-ssi_port-force-pio-path.patch
0008-n900-dts-volume-keys.patch
0009-ARM-dts-disable-twl-off-idle-configuration-for-N900.patch
bq27k-ENODATA-2.patch
bq27k-VOLTAGE_MIN.patch
bq24-CHANGED.patch
"
builddir="$srcdir/linux-$_kernver"
replaces="linux-samsung-espresso3g linux-nokia-n900"
@@ -81,4 +84,7 @@ f7d1a87088c65278a114125e732d5bebebb560a6245afb34e003083d808ef3f8c5f49ff231319535
c3af9715b3559c2d593f4fcfa078730722c7deeec132c5b83e085ff4d9815d85ef349384097c580efe1bbc37c60f42e18ef559f0abccfe236080670e4403fa77 0007-hsi-ssi_port-force-pio-path.patch
b98ce806b3d5a0122086e4c9670639174470ff6d29851c60258cc5d699ce9a479dbf4996b24299fc075d25e9fe8f6b1250fafdff742deea0ddeaf53d342a9d72 0008-n900-dts-volume-keys.patch
66abb5548910ad369608b08200f5835d5a8526c04cc3617221ef546f3e3d22cd944db91dc6727a5c26a102b24d8ef1306ea01254c9c382759afced91b31747ef 0009-ARM-dts-disable-twl-off-idle-configuration-for-N900.patch
9cba2e6b88e650a06576fd4f3f99ad0334e4938e970e1198eba78195280ec5f5315d8883960f062daee06e71cdcef3ff003de661c8b2afa0500695c2419d8808 bq27k-ENODATA-2.patch
0014534b6a43c3f79900bd29662de515b5a9407f7b4ca8493a96a34fa9167cca3e89cf76517dbd85770c0f43a86c7399bf6e0c07d54f4889288ccb2570348bbe bq27k-VOLTAGE_MIN.patch
b5e0ffad98155507c9be56a36190cb3959505909e3f41322a51d2caff9a1ae5d8311e395bdbdbdad66eaf4868e8c12201dd8a91f4d0fe96f3734d78b1a8b80c1 bq24-CHANGED.patch
"
@@ -0,0 +1,13 @@
diff --git a/drivers/power/supply/bq2415x_charger.c b/drivers/power/supply/bq2415x_charger.c
index 25e28dac900d..a9dc9b0abc03 100644
--- a/drivers/power/supply/bq2415x_charger.c
+++ b/drivers/power/supply/bq2415x_charger.c
@@ -835,6 +835,8 @@ static int bq2415x_notifier_call(struct notifier_block *nb,
if (!bq2415x_update_reported_mode(bq, prop.intval))
return NOTIFY_OK;
+ power_supply_changed(bq->charger);
+
/* if automode is not enabled do not tell about reported_mode */
if (bq->automode < 1)
return NOTIFY_OK;
@@ -0,0 +1,90 @@
diff --git a/drivers/power/supply/bq27xxx_battery.c b/drivers/power/supply/bq27xxx_battery.c
index 750fda543308..2560104c85a9 100644
--- a/drivers/power/supply/bq27xxx_battery.c
+++ b/drivers/power/supply/bq27xxx_battery.c
@@ -1522,6 +1522,18 @@ static void bq27xxx_battery_settings(struct bq27xxx_device_info *di)
bq27xxx_battery_set_config(di, info);
}
+/*
+ * Returns true if reported battery capacity is inaccurate
+ */
+static bool bq27xxx_battery_capacity_inaccurate(struct bq27xxx_device_info *di,
+ u16 flags)
+{
+ if (di->opts & BQ27XXX_O_HAS_CI)
+ return (flags & BQ27000_FLAG_CI);
+ else
+ return false;
+}
+
/*
* Return the battery State-of-Charge
* Or < 0 if something fails.
@@ -1538,6 +1550,12 @@ static int bq27xxx_battery_read_soc(struct bq27xxx_device_info *di)
if (soc < 0)
dev_dbg(di->dev, "error reading State-of-Charge\n");
+ /* If CI flag is set, SoC value always reports zero, therefore hide it
+ * from userspace.
+ */
+ if (soc == 0 && bq27xxx_battery_capacity_inaccurate(di, di->cache.flags))
+ return -ENODATA;
+
return soc;
}
@@ -1562,6 +1580,12 @@ static int bq27xxx_battery_read_charge(struct bq27xxx_device_info *di, u8 reg,
else
charge *= 1000;
+ /* If CI flag is set, reported charge will always be zero since the chip
+ * calculates it from the value of SoC. Therefore hide it from userspace.
+ */
+ if (charge == 0 && bq27xxx_battery_capacity_inaccurate(di, di->cache.flags))
+ return -ENODATA;
+
val->intval = charge;
return 0;
@@ -1655,6 +1679,12 @@ static int bq27xxx_battery_read_energy(struct bq27xxx_device_info *di,
else
ae *= 1000;
+ /* If CI flag is set, reported energy will always be zero since the chip
+ * calculates it from the value of SoC. Therefore hide it from userspace.
+ */
+ if (ae == 0 && bq27xxx_battery_capacity_inaccurate(di, di->cache.flags))
+ return -ENODATA;
+
val->intval = ae;
return 0;
@@ -1720,7 +1750,7 @@ static int bq27xxx_battery_read_time(struct bq27xxx_device_info *di, u8 reg,
return tval;
}
- if (tval == 65535)
+ if (tval == 65535 || (tval == 0 && bq27xxx_battery_capacity_inaccurate(di, di->cache.flags)))
return -ENODATA;
val->intval = tval * 60;
@@ -1765,18 +1795,6 @@ static bool bq27xxx_battery_dead(struct bq27xxx_device_info *di, u16 flags)
return flags & (BQ27XXX_FLAG_SOC1 | BQ27XXX_FLAG_SOCF);
}
-/*
- * Returns true if reported battery capacity is inaccurate
- */
-static bool bq27xxx_battery_capacity_inaccurate(struct bq27xxx_device_info *di,
- u16 flags)
-{
- if (di->opts & BQ27XXX_O_HAS_CI)
- return (flags & BQ27000_FLAG_CI);
- else
- return false;
-}
-
static int bq27xxx_battery_read_health(struct bq27xxx_device_info *di,
union power_supply_propval *val)
{
@@ -0,0 +1,84 @@
diff --git a/drivers/power/supply/bq27xxx_battery.c b/drivers/power/supply/bq27xxx_battery.c
index 750fda543308..c7d06ef877b3 100644
--- a/drivers/power/supply/bq27xxx_battery.c
+++ b/drivers/power/supply/bq27xxx_battery.c
@@ -123,6 +123,7 @@ enum bq27xxx_reg_index {
BQ27XXX_DM_BLOCK, /* Data Block */
BQ27XXX_DM_DATA, /* Block Data */
BQ27XXX_DM_CKSUM, /* Block Data Checksum */
+ BQ27XXX_REG_SEDVF, /* End-of-discharge Voltage */
BQ27XXX_REG_MAX, /* sentinel */
};
@@ -159,6 +160,7 @@ static u8
[BQ27XXX_DM_BLOCK] = INVALID_REG_ADDR,
[BQ27XXX_DM_DATA] = INVALID_REG_ADDR,
[BQ27XXX_DM_CKSUM] = INVALID_REG_ADDR,
+ [BQ27XXX_REG_SEDVF] = 0x77,
},
bq27010_regs[BQ27XXX_REG_MAX] = {
[BQ27XXX_REG_CTRL] = 0x00,
@@ -184,6 +186,7 @@ static u8
[BQ27XXX_DM_BLOCK] = INVALID_REG_ADDR,
[BQ27XXX_DM_DATA] = INVALID_REG_ADDR,
[BQ27XXX_DM_CKSUM] = INVALID_REG_ADDR,
+ [BQ27XXX_REG_SEDVF] = 0x77,
},
bq2750x_regs[BQ27XXX_REG_MAX] = {
[BQ27XXX_REG_CTRL] = 0x00,
@@ -559,6 +562,7 @@ static enum power_supply_property bq27000_props[] = {
POWER_SUPPLY_PROP_POWER_AVG,
POWER_SUPPLY_PROP_HEALTH,
POWER_SUPPLY_PROP_MANUFACTURER,
+ POWER_SUPPLY_PROP_VOLTAGE_MIN_DESIGN,
};
static enum power_supply_property bq27010_props[] = {
@@ -579,6 +583,7 @@ static enum power_supply_property bq27010_props[] = {
POWER_SUPPLY_PROP_CYCLE_COUNT,
POWER_SUPPLY_PROP_HEALTH,
POWER_SUPPLY_PROP_MANUFACTURER,
+ POWER_SUPPLY_PROP_VOLTAGE_MIN_DESIGN,
};
#define bq2750x_props bq27510g3_props
@@ -2006,6 +2011,27 @@ static int bq27xxx_battery_voltage(struct bq27xxx_device_info *di,
return 0;
}
+/*
+ * Return the design minimum battery Voltage in millivolts
+ * Or < 0 if something fails.
+ */
+static int bq27xxx_battery_read_dmin_volt(struct bq27xxx_device_info *di,
+ union power_supply_propval *val)
+{
+ int volt;
+
+ volt = bq27xxx_read(di, BQ27XXX_REG_SEDVF, false);
+ if (volt < 0) {
+ dev_err(di->dev, "error reading design min voltage\n");
+ return volt;
+ }
+
+ /* SEDVF = Design EDVF / 8 - 256 */
+ val->intval = volt * 8000 + 2048000;
+
+ return 0;
+}
+
static int bq27xxx_simple_value(int value,
union power_supply_propval *val)
{
@@ -2086,8 +2112,10 @@ static int bq27xxx_battery_get_property(struct power_supply *psy,
* power_supply_battery_info visible in sysfs.
*/
case POWER_SUPPLY_PROP_ENERGY_FULL_DESIGN:
- case POWER_SUPPLY_PROP_VOLTAGE_MIN_DESIGN:
return -EINVAL;
+ case POWER_SUPPLY_PROP_VOLTAGE_MIN_DESIGN:
+ ret = bq27xxx_battery_read_dmin_volt(di, val);
+ break;
case POWER_SUPPLY_PROP_CYCLE_COUNT:
ret = bq27xxx_battery_read_cyct(di, val);
break;