Skip to content

Commit 525f6a2

Browse files
sicelosre
authored andcommitted
bq27xxx: add voltage min design for bq27000 and bq27200
The bq27x00 gauges have an EEPROM register which contains the value of the voltage that should be considered to be zero battery capacity. Expose this to userspace using the VOLTAGE_MIN_DESIGN property. Tested on Nokia N900 with bq27200. Signed-off-by: Sicelo A. Mhlongo <[email protected]> Acked-by: Pali Rohár <[email protected]> Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Sebastian Reichel <[email protected]>
1 parent 156fb70 commit 525f6a2

File tree

2 files changed

+39
-1
lines changed

2 files changed

+39
-1
lines changed

drivers/power/supply/bq27xxx_battery.c

Lines changed: 38 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -123,6 +123,7 @@ enum bq27xxx_reg_index {
123123
BQ27XXX_DM_BLOCK, /* Data Block */
124124
BQ27XXX_DM_DATA, /* Block Data */
125125
BQ27XXX_DM_CKSUM, /* Block Data Checksum */
126+
BQ27XXX_REG_SEDVF, /* End-of-discharge Voltage */
126127
BQ27XXX_REG_MAX, /* sentinel */
127128
};
128129

@@ -159,6 +160,7 @@ static u8
159160
[BQ27XXX_DM_BLOCK] = INVALID_REG_ADDR,
160161
[BQ27XXX_DM_DATA] = INVALID_REG_ADDR,
161162
[BQ27XXX_DM_CKSUM] = INVALID_REG_ADDR,
163+
[BQ27XXX_REG_SEDVF] = 0x77,
162164
},
163165
bq27010_regs[BQ27XXX_REG_MAX] = {
164166
[BQ27XXX_REG_CTRL] = 0x00,
@@ -184,6 +186,7 @@ static u8
184186
[BQ27XXX_DM_BLOCK] = INVALID_REG_ADDR,
185187
[BQ27XXX_DM_DATA] = INVALID_REG_ADDR,
186188
[BQ27XXX_DM_CKSUM] = INVALID_REG_ADDR,
189+
[BQ27XXX_REG_SEDVF] = 0x77,
187190
},
188191
bq2750x_regs[BQ27XXX_REG_MAX] = {
189192
[BQ27XXX_REG_CTRL] = 0x00,
@@ -579,6 +582,7 @@ static enum power_supply_property bq27000_props[] = {
579582
POWER_SUPPLY_PROP_POWER_AVG,
580583
POWER_SUPPLY_PROP_HEALTH,
581584
POWER_SUPPLY_PROP_MANUFACTURER,
585+
POWER_SUPPLY_PROP_VOLTAGE_MIN_DESIGN,
582586
};
583587

584588
static enum power_supply_property bq27010_props[] = {
@@ -599,6 +603,7 @@ static enum power_supply_property bq27010_props[] = {
599603
POWER_SUPPLY_PROP_CYCLE_COUNT,
600604
POWER_SUPPLY_PROP_HEALTH,
601605
POWER_SUPPLY_PROP_MANUFACTURER,
606+
POWER_SUPPLY_PROP_VOLTAGE_MIN_DESIGN,
602607
};
603608

604609
#define bq2750x_props bq27510g3_props
@@ -2039,6 +2044,36 @@ static int bq27xxx_battery_voltage(struct bq27xxx_device_info *di,
20392044
return 0;
20402045
}
20412046

2047+
/*
2048+
* Return the design minimum battery Voltage in microvolts
2049+
* Or < 0 if something fails.
2050+
*/
2051+
static int bq27xxx_battery_read_dmin_volt(struct bq27xxx_device_info *di,
2052+
union power_supply_propval *val)
2053+
{
2054+
int volt;
2055+
2056+
/* We only have to read design minimum voltage once */
2057+
if (di->voltage_min_design > 0) {
2058+
val->intval = di->voltage_min_design;
2059+
return 0;
2060+
}
2061+
2062+
volt = bq27xxx_read(di, BQ27XXX_REG_SEDVF, true);
2063+
if (volt < 0) {
2064+
dev_err(di->dev, "error reading design min voltage\n");
2065+
return volt;
2066+
}
2067+
2068+
/* SEDVF = Design EDVF / 8 - 256 */
2069+
val->intval = volt * 8000 + 2048000;
2070+
2071+
/* Save for later reads */
2072+
di->voltage_min_design = val->intval;
2073+
2074+
return 0;
2075+
}
2076+
20422077
static int bq27xxx_simple_value(int value,
20432078
union power_supply_propval *val)
20442079
{
@@ -2119,8 +2154,10 @@ static int bq27xxx_battery_get_property(struct power_supply *psy,
21192154
* power_supply_battery_info visible in sysfs.
21202155
*/
21212156
case POWER_SUPPLY_PROP_ENERGY_FULL_DESIGN:
2122-
case POWER_SUPPLY_PROP_VOLTAGE_MIN_DESIGN:
21232157
return -EINVAL;
2158+
case POWER_SUPPLY_PROP_VOLTAGE_MIN_DESIGN:
2159+
ret = bq27xxx_battery_read_dmin_volt(di, val);
2160+
break;
21242161
case POWER_SUPPLY_PROP_CYCLE_COUNT:
21252162
ret = bq27xxx_battery_read_cyct(di, val);
21262163
break;

include/linux/power/bq27xxx_battery.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,7 @@ struct bq27xxx_device_info {
6161
struct bq27xxx_access_methods bus;
6262
struct bq27xxx_reg_cache cache;
6363
int charge_design_full;
64+
int voltage_min_design;
6465
bool removed;
6566
unsigned long last_update;
6667
union power_supply_propval last_status;

0 commit comments

Comments
 (0)