Commit 7faa144a authored by Alexey Starikovskiy's avatar Alexey Starikovskiy Committed by Len Brown

ACPI: battery: add power_{now,avg} properties to power_class

ACPI has smart batteries, which work in units of energy and measure
rate of (dis)charge as power, thus it is not appropriate to export it
as a current_now. Current_now will still be exported to allow
for userland applications to match.
Signed-off-by: default avatarAlexey Starikovskiy <astarikovskiy@suse.de>
Signed-off-by: default avatarLen Brown <len.brown@intel.com>
parent 8e0ee43b
...@@ -92,7 +92,7 @@ struct acpi_battery { ...@@ -92,7 +92,7 @@ struct acpi_battery {
#endif #endif
struct acpi_device *device; struct acpi_device *device;
unsigned long update_time; unsigned long update_time;
int current_now; int rate_now;
int capacity_now; int capacity_now;
int voltage_now; int voltage_now;
int design_capacity; int design_capacity;
...@@ -196,7 +196,8 @@ static int acpi_battery_get_property(struct power_supply *psy, ...@@ -196,7 +196,8 @@ static int acpi_battery_get_property(struct power_supply *psy,
val->intval = battery->voltage_now * 1000; val->intval = battery->voltage_now * 1000;
break; break;
case POWER_SUPPLY_PROP_CURRENT_NOW: case POWER_SUPPLY_PROP_CURRENT_NOW:
val->intval = battery->current_now * 1000; case POWER_SUPPLY_PROP_POWER_NOW:
val->intval = battery->rate_now * 1000;
break; break;
case POWER_SUPPLY_PROP_CHARGE_FULL_DESIGN: case POWER_SUPPLY_PROP_CHARGE_FULL_DESIGN:
case POWER_SUPPLY_PROP_ENERGY_FULL_DESIGN: case POWER_SUPPLY_PROP_ENERGY_FULL_DESIGN:
...@@ -247,6 +248,7 @@ static enum power_supply_property energy_battery_props[] = { ...@@ -247,6 +248,7 @@ static enum power_supply_property energy_battery_props[] = {
POWER_SUPPLY_PROP_VOLTAGE_MIN_DESIGN, POWER_SUPPLY_PROP_VOLTAGE_MIN_DESIGN,
POWER_SUPPLY_PROP_VOLTAGE_NOW, POWER_SUPPLY_PROP_VOLTAGE_NOW,
POWER_SUPPLY_PROP_CURRENT_NOW, POWER_SUPPLY_PROP_CURRENT_NOW,
POWER_SUPPLY_PROP_POWER_NOW,
POWER_SUPPLY_PROP_ENERGY_FULL_DESIGN, POWER_SUPPLY_PROP_ENERGY_FULL_DESIGN,
POWER_SUPPLY_PROP_ENERGY_FULL, POWER_SUPPLY_PROP_ENERGY_FULL,
POWER_SUPPLY_PROP_ENERGY_NOW, POWER_SUPPLY_PROP_ENERGY_NOW,
...@@ -273,7 +275,7 @@ struct acpi_offsets { ...@@ -273,7 +275,7 @@ struct acpi_offsets {
static struct acpi_offsets state_offsets[] = { static struct acpi_offsets state_offsets[] = {
{offsetof(struct acpi_battery, state), 0}, {offsetof(struct acpi_battery, state), 0},
{offsetof(struct acpi_battery, current_now), 0}, {offsetof(struct acpi_battery, rate_now), 0},
{offsetof(struct acpi_battery, capacity_now), 0}, {offsetof(struct acpi_battery, capacity_now), 0},
{offsetof(struct acpi_battery, voltage_now), 0}, {offsetof(struct acpi_battery, voltage_now), 0},
}; };
...@@ -605,11 +607,11 @@ static int acpi_battery_print_state(struct seq_file *seq, int result) ...@@ -605,11 +607,11 @@ static int acpi_battery_print_state(struct seq_file *seq, int result)
else else
seq_printf(seq, "charging state: charged\n"); seq_printf(seq, "charging state: charged\n");
if (battery->current_now == ACPI_BATTERY_VALUE_UNKNOWN) if (battery->rate_now == ACPI_BATTERY_VALUE_UNKNOWN)
seq_printf(seq, "present rate: unknown\n"); seq_printf(seq, "present rate: unknown\n");
else else
seq_printf(seq, "present rate: %d %s\n", seq_printf(seq, "present rate: %d %s\n",
battery->current_now, acpi_battery_units(battery)); battery->rate_now, acpi_battery_units(battery));
if (battery->capacity_now == ACPI_BATTERY_VALUE_UNKNOWN) if (battery->capacity_now == ACPI_BATTERY_VALUE_UNKNOWN)
seq_printf(seq, "remaining capacity: unknown\n"); seq_printf(seq, "remaining capacity: unknown\n");
......
...@@ -102,8 +102,8 @@ struct acpi_battery { ...@@ -102,8 +102,8 @@ struct acpi_battery {
u16 cycle_count; u16 cycle_count;
u16 temp_now; u16 temp_now;
u16 voltage_now; u16 voltage_now;
s16 current_now; s16 rate_now;
s16 current_avg; s16 rate_avg;
u16 capacity_now; u16 capacity_now;
u16 state_of_charge; u16 state_of_charge;
u16 state; u16 state;
...@@ -202,9 +202,9 @@ static int acpi_sbs_battery_get_property(struct power_supply *psy, ...@@ -202,9 +202,9 @@ static int acpi_sbs_battery_get_property(struct power_supply *psy,
return -ENODEV; return -ENODEV;
switch (psp) { switch (psp) {
case POWER_SUPPLY_PROP_STATUS: case POWER_SUPPLY_PROP_STATUS:
if (battery->current_now < 0) if (battery->rate_now < 0)
val->intval = POWER_SUPPLY_STATUS_DISCHARGING; val->intval = POWER_SUPPLY_STATUS_DISCHARGING;
else if (battery->current_now > 0) else if (battery->rate_now > 0)
val->intval = POWER_SUPPLY_STATUS_CHARGING; val->intval = POWER_SUPPLY_STATUS_CHARGING;
else else
val->intval = POWER_SUPPLY_STATUS_FULL; val->intval = POWER_SUPPLY_STATUS_FULL;
...@@ -224,11 +224,13 @@ static int acpi_sbs_battery_get_property(struct power_supply *psy, ...@@ -224,11 +224,13 @@ static int acpi_sbs_battery_get_property(struct power_supply *psy,
acpi_battery_vscale(battery) * 1000; acpi_battery_vscale(battery) * 1000;
break; break;
case POWER_SUPPLY_PROP_CURRENT_NOW: case POWER_SUPPLY_PROP_CURRENT_NOW:
val->intval = abs(battery->current_now) * case POWER_SUPPLY_PROP_POWER_NOW:
val->intval = abs(battery->rate_now) *
acpi_battery_ipscale(battery) * 1000; acpi_battery_ipscale(battery) * 1000;
break; break;
case POWER_SUPPLY_PROP_CURRENT_AVG: case POWER_SUPPLY_PROP_CURRENT_AVG:
val->intval = abs(battery->current_avg) * case POWER_SUPPLY_PROP_POWER_AVG:
val->intval = abs(battery->rate_avg) *
acpi_battery_ipscale(battery) * 1000; acpi_battery_ipscale(battery) * 1000;
break; break;
case POWER_SUPPLY_PROP_CAPACITY: case POWER_SUPPLY_PROP_CAPACITY:
...@@ -293,6 +295,8 @@ static enum power_supply_property sbs_energy_battery_props[] = { ...@@ -293,6 +295,8 @@ static enum power_supply_property sbs_energy_battery_props[] = {
POWER_SUPPLY_PROP_VOLTAGE_NOW, POWER_SUPPLY_PROP_VOLTAGE_NOW,
POWER_SUPPLY_PROP_CURRENT_NOW, POWER_SUPPLY_PROP_CURRENT_NOW,
POWER_SUPPLY_PROP_CURRENT_AVG, POWER_SUPPLY_PROP_CURRENT_AVG,
POWER_SUPPLY_PROP_POWER_NOW,
POWER_SUPPLY_PROP_POWER_AVG,
POWER_SUPPLY_PROP_CAPACITY, POWER_SUPPLY_PROP_CAPACITY,
POWER_SUPPLY_PROP_ENERGY_FULL_DESIGN, POWER_SUPPLY_PROP_ENERGY_FULL_DESIGN,
POWER_SUPPLY_PROP_ENERGY_FULL, POWER_SUPPLY_PROP_ENERGY_FULL,
...@@ -301,6 +305,7 @@ static enum power_supply_property sbs_energy_battery_props[] = { ...@@ -301,6 +305,7 @@ static enum power_supply_property sbs_energy_battery_props[] = {
POWER_SUPPLY_PROP_MODEL_NAME, POWER_SUPPLY_PROP_MODEL_NAME,
POWER_SUPPLY_PROP_MANUFACTURER, POWER_SUPPLY_PROP_MANUFACTURER,
}; };
#endif #endif
/* -------------------------------------------------------------------------- /* --------------------------------------------------------------------------
...@@ -330,8 +335,8 @@ static struct acpi_battery_reader info_readers[] = { ...@@ -330,8 +335,8 @@ static struct acpi_battery_reader info_readers[] = {
static struct acpi_battery_reader state_readers[] = { static struct acpi_battery_reader state_readers[] = {
{0x08, SMBUS_READ_WORD, offsetof(struct acpi_battery, temp_now)}, {0x08, SMBUS_READ_WORD, offsetof(struct acpi_battery, temp_now)},
{0x09, SMBUS_READ_WORD, offsetof(struct acpi_battery, voltage_now)}, {0x09, SMBUS_READ_WORD, offsetof(struct acpi_battery, voltage_now)},
{0x0a, SMBUS_READ_WORD, offsetof(struct acpi_battery, current_now)}, {0x0a, SMBUS_READ_WORD, offsetof(struct acpi_battery, rate_now)},
{0x0b, SMBUS_READ_WORD, offsetof(struct acpi_battery, current_avg)}, {0x0b, SMBUS_READ_WORD, offsetof(struct acpi_battery, rate_avg)},
{0x0f, SMBUS_READ_WORD, offsetof(struct acpi_battery, capacity_now)}, {0x0f, SMBUS_READ_WORD, offsetof(struct acpi_battery, capacity_now)},
{0x0e, SMBUS_READ_WORD, offsetof(struct acpi_battery, state_of_charge)}, {0x0e, SMBUS_READ_WORD, offsetof(struct acpi_battery, state_of_charge)},
{0x16, SMBUS_READ_WORD, offsetof(struct acpi_battery, state)}, {0x16, SMBUS_READ_WORD, offsetof(struct acpi_battery, state)},
...@@ -589,9 +594,9 @@ static int acpi_battery_read_state(struct seq_file *seq, void *offset) ...@@ -589,9 +594,9 @@ static int acpi_battery_read_state(struct seq_file *seq, void *offset)
seq_printf(seq, "capacity state: %s\n", seq_printf(seq, "capacity state: %s\n",
(battery->state & 0x0010) ? "critical" : "ok"); (battery->state & 0x0010) ? "critical" : "ok");
seq_printf(seq, "charging state: %s\n", seq_printf(seq, "charging state: %s\n",
(battery->current_now < 0) ? "discharging" : (battery->rate_now < 0) ? "discharging" :
((battery->current_now > 0) ? "charging" : "charged")); ((battery->rate_now > 0) ? "charging" : "charged"));
rate = abs(battery->current_now) * acpi_battery_ipscale(battery); rate = abs(battery->rate_now) * acpi_battery_ipscale(battery);
rate *= (acpi_battery_mode(battery))?(battery->voltage_now * rate *= (acpi_battery_mode(battery))?(battery->voltage_now *
acpi_battery_vscale(battery)/1000):1; acpi_battery_vscale(battery)/1000):1;
seq_printf(seq, "present rate: %d%s\n", rate, seq_printf(seq, "present rate: %d%s\n", rate,
......
...@@ -93,6 +93,8 @@ static struct device_attribute power_supply_attrs[] = { ...@@ -93,6 +93,8 @@ static struct device_attribute power_supply_attrs[] = {
POWER_SUPPLY_ATTR(voltage_avg), POWER_SUPPLY_ATTR(voltage_avg),
POWER_SUPPLY_ATTR(current_now), POWER_SUPPLY_ATTR(current_now),
POWER_SUPPLY_ATTR(current_avg), POWER_SUPPLY_ATTR(current_avg),
POWER_SUPPLY_ATTR(power_now),
POWER_SUPPLY_ATTR(power_avg),
POWER_SUPPLY_ATTR(charge_full_design), POWER_SUPPLY_ATTR(charge_full_design),
POWER_SUPPLY_ATTR(charge_empty_design), POWER_SUPPLY_ATTR(charge_empty_design),
POWER_SUPPLY_ATTR(charge_full), POWER_SUPPLY_ATTR(charge_full),
......
...@@ -73,6 +73,8 @@ enum power_supply_property { ...@@ -73,6 +73,8 @@ enum power_supply_property {
POWER_SUPPLY_PROP_VOLTAGE_AVG, POWER_SUPPLY_PROP_VOLTAGE_AVG,
POWER_SUPPLY_PROP_CURRENT_NOW, POWER_SUPPLY_PROP_CURRENT_NOW,
POWER_SUPPLY_PROP_CURRENT_AVG, POWER_SUPPLY_PROP_CURRENT_AVG,
POWER_SUPPLY_PROP_POWER_NOW,
POWER_SUPPLY_PROP_POWER_AVG,
POWER_SUPPLY_PROP_CHARGE_FULL_DESIGN, POWER_SUPPLY_PROP_CHARGE_FULL_DESIGN,
POWER_SUPPLY_PROP_CHARGE_EMPTY_DESIGN, POWER_SUPPLY_PROP_CHARGE_EMPTY_DESIGN,
POWER_SUPPLY_PROP_CHARGE_FULL, POWER_SUPPLY_PROP_CHARGE_FULL,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment