Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 8f93b0b2 authored by Jason Gerecke's avatar Jason Gerecke Committed by Jiri Kosina
Browse files

HID: wacom: Provide battery charge state to system over USB if available



If a wireless adapter (which contains the charging circuitry) is
detected as being attached to the tablet then create a new battery
interface and update its status as data is reported. Also destroy the
battery if the adapter goes away.

Signed-off-by: default avatarJason Gerecke <killertofu@gmail.com>
Acked-by: default avatarPing Cheng <pingc@wacom.com>
Signed-off-by: default avatarJiri Kosina <jkosina@suse.cz>
parent fce9957d
Loading
Loading
Loading
Loading
+25 −0
Original line number Diff line number Diff line
@@ -1952,6 +1952,7 @@ static int wacom_wireless_irq(struct wacom_wac *wacom, size_t len)

static int wacom_status_irq(struct wacom_wac *wacom_wac, size_t len)
{
	struct wacom *wacom = container_of(wacom_wac, struct wacom, wacom_wac);
	struct wacom_features *features = &wacom_wac->features;
	unsigned char *data = wacom_wac->data;

@@ -1965,6 +1966,30 @@ static int wacom_status_irq(struct wacom_wac *wacom_wac, size_t len)
				    SW_MUTE_DEVICE, data[8] & 0x40);
		input_sync(wacom_wac->shared->touch_input);
	}

	if (data[9] & 0x02) { /* wireless module is attached */
		int battery = (data[8] & 0x3f) * 100 / 31;
		bool ps_connected = !!(data[8] & 0x80);
		bool charging = ps_connected &&
				wacom_wac->battery_capacity < 100;

		wacom_notify_battery(wacom_wac, battery, charging,
				     ps_connected);

		if (!wacom->battery.dev &&
		    !(features->quirks & WACOM_QUIRK_BATTERY)) {
			features->quirks |= WACOM_QUIRK_BATTERY;
			INIT_WORK(&wacom->work, wacom_battery_work);
			wacom_schedule_work(wacom_wac);
		}
	}
	else if ((features->quirks & WACOM_QUIRK_BATTERY) &&
		 wacom->battery.dev) {
		features->quirks &= ~WACOM_QUIRK_BATTERY;
		INIT_WORK(&wacom->work, wacom_battery_work);
		wacom_schedule_work(wacom_wac);
		wacom_notify_battery(wacom_wac, 0, 0, 0);
	}
	return 0;
}