Commit 71fa641e authored by Jason Gerecke's avatar Jason Gerecke Committed by Jiri Kosina

HID: wacom: Add battery presence indicator to wireless tablets

Declare the POWER_SUPPLY_PROP_PRESENT property to provide userspace
with a way to determine if the battery on a wireless tablet is plugged
in. Although current wireless tablets do not explicitly report this
information, it can be inferred from other state information. In
particular, a battery is assumed to be present if any of the following
are true: a non-zero battery level reported, the battery is reported as
charging, or the tablet is operating wirelessly.

Note: The last condition above may not strictly hold for the Graphire
Wireless (it charges from a DC barrel jack instead of a USB port), but I
do not know what is reported in the no-battery condition.
Signed-off-by: default avatarJason Gerecke <killertofu@gmail.com>
Signed-off-by: default avatarJiri Kosina <jkosina@suse.cz>
parent 8fac1722
...@@ -945,6 +945,7 @@ static void wacom_destroy_leds(struct wacom *wacom) ...@@ -945,6 +945,7 @@ static void wacom_destroy_leds(struct wacom *wacom)
} }
static enum power_supply_property wacom_battery_props[] = { static enum power_supply_property wacom_battery_props[] = {
POWER_SUPPLY_PROP_PRESENT,
POWER_SUPPLY_PROP_STATUS, POWER_SUPPLY_PROP_STATUS,
POWER_SUPPLY_PROP_SCOPE, POWER_SUPPLY_PROP_SCOPE,
POWER_SUPPLY_PROP_CAPACITY POWER_SUPPLY_PROP_CAPACITY
...@@ -964,6 +965,9 @@ static int wacom_battery_get_property(struct power_supply *psy, ...@@ -964,6 +965,9 @@ static int wacom_battery_get_property(struct power_supply *psy,
int ret = 0; int ret = 0;
switch (psp) { switch (psp) {
case POWER_SUPPLY_PROP_PRESENT:
val->intval = wacom->wacom_wac.bat_connected;
break;
case POWER_SUPPLY_PROP_SCOPE: case POWER_SUPPLY_PROP_SCOPE:
val->intval = POWER_SUPPLY_SCOPE_DEVICE; val->intval = POWER_SUPPLY_SCOPE_DEVICE;
break; break;
......
...@@ -46,16 +46,19 @@ static unsigned short batcap_gr[8] = { 1, 15, 25, 35, 50, 70, 100, 100 }; ...@@ -46,16 +46,19 @@ static unsigned short batcap_gr[8] = { 1, 15, 25, 35, 50, 70, 100, 100 };
static unsigned short batcap_i4[8] = { 1, 15, 30, 45, 60, 70, 85, 100 }; static unsigned short batcap_i4[8] = { 1, 15, 30, 45, 60, 70, 85, 100 };
static void wacom_notify_battery(struct wacom_wac *wacom_wac, static void wacom_notify_battery(struct wacom_wac *wacom_wac,
int bat_capacity, bool bat_charging, bool ps_connected) int bat_capacity, bool bat_charging, bool bat_connected,
bool ps_connected)
{ {
struct wacom *wacom = container_of(wacom_wac, struct wacom, wacom_wac); struct wacom *wacom = container_of(wacom_wac, struct wacom, wacom_wac);
bool changed = wacom_wac->battery_capacity != bat_capacity || bool changed = wacom_wac->battery_capacity != bat_capacity ||
wacom_wac->bat_charging != bat_charging || wacom_wac->bat_charging != bat_charging ||
wacom_wac->bat_connected != bat_connected ||
wacom_wac->ps_connected != ps_connected; wacom_wac->ps_connected != ps_connected;
if (changed) { if (changed) {
wacom_wac->battery_capacity = bat_capacity; wacom_wac->battery_capacity = bat_capacity;
wacom_wac->bat_charging = bat_charging; wacom_wac->bat_charging = bat_charging;
wacom_wac->bat_connected = bat_connected;
wacom_wac->ps_connected = ps_connected; wacom_wac->ps_connected = ps_connected;
if (wacom->battery.dev) if (wacom->battery.dev)
...@@ -438,7 +441,7 @@ static int wacom_graphire_irq(struct wacom_wac *wacom) ...@@ -438,7 +441,7 @@ static int wacom_graphire_irq(struct wacom_wac *wacom)
battery_capacity = batcap_gr[rw]; battery_capacity = batcap_gr[rw];
ps_connected = rw == 7; ps_connected = rw == 7;
wacom_notify_battery(wacom, battery_capacity, ps_connected, wacom_notify_battery(wacom, battery_capacity, ps_connected,
ps_connected); 1, ps_connected);
} }
exit: exit:
return retval; return retval;
...@@ -1029,6 +1032,7 @@ static int wacom_intuos_bt_irq(struct wacom_wac *wacom, size_t len) ...@@ -1029,6 +1032,7 @@ static int wacom_intuos_bt_irq(struct wacom_wac *wacom, size_t len)
ps_connected = (power_raw & 0x10) ? 1 : 0; ps_connected = (power_raw & 0x10) ? 1 : 0;
battery_capacity = batcap_i4[power_raw & 0x07]; battery_capacity = batcap_i4[power_raw & 0x07];
wacom_notify_battery(wacom, battery_capacity, bat_charging, wacom_notify_battery(wacom, battery_capacity, bat_charging,
battery_capacity || bat_charging,
ps_connected); ps_connected);
break; break;
default: default:
...@@ -1936,13 +1940,13 @@ static int wacom_wireless_irq(struct wacom_wac *wacom, size_t len) ...@@ -1936,13 +1940,13 @@ static int wacom_wireless_irq(struct wacom_wac *wacom, size_t len)
} }
if (wacom->shared->type) if (wacom->shared->type)
wacom_notify_battery(wacom, battery, charging, 0); wacom_notify_battery(wacom, battery, charging, 1, 0);
} else if (wacom->pid != 0) { } else if (wacom->pid != 0) {
/* disconnected while previously connected */ /* disconnected while previously connected */
wacom->pid = 0; wacom->pid = 0;
wacom_schedule_work(wacom); wacom_schedule_work(wacom);
wacom_notify_battery(wacom, 0, 0, 0); wacom_notify_battery(wacom, 0, 0, 0, 0);
} }
return 0; return 0;
...@@ -1970,7 +1974,7 @@ static int wacom_status_irq(struct wacom_wac *wacom_wac, size_t len) ...@@ -1970,7 +1974,7 @@ static int wacom_status_irq(struct wacom_wac *wacom_wac, size_t len)
bool charging = !!(data[8] & 0x80); bool charging = !!(data[8] & 0x80);
wacom_notify_battery(wacom_wac, battery, charging, wacom_notify_battery(wacom_wac, battery, charging,
1); battery || charging, 1);
if (!wacom->battery.dev && if (!wacom->battery.dev &&
!(features->quirks & WACOM_QUIRK_BATTERY)) { !(features->quirks & WACOM_QUIRK_BATTERY)) {
...@@ -1984,7 +1988,7 @@ static int wacom_status_irq(struct wacom_wac *wacom_wac, size_t len) ...@@ -1984,7 +1988,7 @@ static int wacom_status_irq(struct wacom_wac *wacom_wac, size_t len)
features->quirks &= ~WACOM_QUIRK_BATTERY; features->quirks &= ~WACOM_QUIRK_BATTERY;
INIT_WORK(&wacom->work, wacom_battery_work); INIT_WORK(&wacom->work, wacom_battery_work);
wacom_schedule_work(wacom_wac); wacom_schedule_work(wacom_wac);
wacom_notify_battery(wacom_wac, 0, 0, 0); wacom_notify_battery(wacom_wac, 0, 0, 0, 0);
} }
return 0; return 0;
} }
......
...@@ -212,6 +212,7 @@ struct wacom_wac { ...@@ -212,6 +212,7 @@ struct wacom_wac {
int battery_capacity; int battery_capacity;
int num_contacts_left; int num_contacts_left;
int bat_charging; int bat_charging;
int bat_connected;
int ps_connected; int ps_connected;
u8 bt_features; u8 bt_features;
u8 bt_high_speed; u8 bt_high_speed;
......
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