|
@@ -963,6 +963,10 @@ static int wacom_initialize_battery(struct wacom *wacom)
|
|
|
|
|
|
error = power_supply_register(&wacom->usbdev->dev,
|
|
|
&wacom->battery);
|
|
|
+
|
|
|
+ if (!error)
|
|
|
+ power_supply_powers(&wacom->battery,
|
|
|
+ &wacom->usbdev->dev);
|
|
|
}
|
|
|
|
|
|
return error;
|
|
@@ -970,8 +974,11 @@ static int wacom_initialize_battery(struct wacom *wacom)
|
|
|
|
|
|
static void wacom_destroy_battery(struct wacom *wacom)
|
|
|
{
|
|
|
- if (wacom->wacom_wac.features.quirks & WACOM_QUIRK_MONITOR)
|
|
|
+ if (wacom->wacom_wac.features.quirks & WACOM_QUIRK_MONITOR &&
|
|
|
+ wacom->battery.dev) {
|
|
|
power_supply_unregister(&wacom->battery);
|
|
|
+ wacom->battery.dev = NULL;
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
static int wacom_register_input(struct wacom *wacom)
|
|
@@ -1018,23 +1025,30 @@ static void wacom_wireless_work(struct work_struct *work)
|
|
|
struct wacom *wacom = container_of(work, struct wacom, work);
|
|
|
struct usb_device *usbdev = wacom->usbdev;
|
|
|
struct wacom_wac *wacom_wac = &wacom->wacom_wac;
|
|
|
+ struct wacom *wacom1, *wacom2;
|
|
|
+ struct wacom_wac *wacom_wac1, *wacom_wac2;
|
|
|
+ int error;
|
|
|
|
|
|
/*
|
|
|
* Regardless if this is a disconnect or a new tablet,
|
|
|
- * remove any existing input devices.
|
|
|
+ * remove any existing input and battery devices.
|
|
|
*/
|
|
|
|
|
|
+ wacom_destroy_battery(wacom);
|
|
|
+
|
|
|
/* Stylus interface */
|
|
|
- wacom = usb_get_intfdata(usbdev->config->interface[1]);
|
|
|
- if (wacom->wacom_wac.input)
|
|
|
- input_unregister_device(wacom->wacom_wac.input);
|
|
|
- wacom->wacom_wac.input = NULL;
|
|
|
+ wacom1 = usb_get_intfdata(usbdev->config->interface[1]);
|
|
|
+ wacom_wac1 = &(wacom1->wacom_wac);
|
|
|
+ if (wacom_wac1->input)
|
|
|
+ input_unregister_device(wacom_wac1->input);
|
|
|
+ wacom_wac1->input = NULL;
|
|
|
|
|
|
/* Touch interface */
|
|
|
- wacom = usb_get_intfdata(usbdev->config->interface[2]);
|
|
|
- if (wacom->wacom_wac.input)
|
|
|
- input_unregister_device(wacom->wacom_wac.input);
|
|
|
- wacom->wacom_wac.input = NULL;
|
|
|
+ wacom2 = usb_get_intfdata(usbdev->config->interface[2]);
|
|
|
+ wacom_wac2 = &(wacom2->wacom_wac);
|
|
|
+ if (wacom_wac2->input)
|
|
|
+ input_unregister_device(wacom_wac2->input);
|
|
|
+ wacom_wac2->input = NULL;
|
|
|
|
|
|
if (wacom_wac->pid == 0) {
|
|
|
dev_info(&wacom->intf->dev, "wireless tablet disconnected\n");
|
|
@@ -1059,24 +1073,39 @@ static void wacom_wireless_work(struct work_struct *work)
|
|
|
}
|
|
|
|
|
|
/* Stylus interface */
|
|
|
- wacom = usb_get_intfdata(usbdev->config->interface[1]);
|
|
|
- wacom_wac = &wacom->wacom_wac;
|
|
|
- wacom_wac->features =
|
|
|
+ wacom_wac1->features =
|
|
|
*((struct wacom_features *)id->driver_info);
|
|
|
- wacom_wac->features.device_type = BTN_TOOL_PEN;
|
|
|
- wacom_register_input(wacom);
|
|
|
+ wacom_wac1->features.device_type = BTN_TOOL_PEN;
|
|
|
+ error = wacom_register_input(wacom1);
|
|
|
+ if (error)
|
|
|
+ goto fail1;
|
|
|
|
|
|
/* Touch interface */
|
|
|
- wacom = usb_get_intfdata(usbdev->config->interface[2]);
|
|
|
- wacom_wac = &wacom->wacom_wac;
|
|
|
- wacom_wac->features =
|
|
|
+ wacom_wac2->features =
|
|
|
*((struct wacom_features *)id->driver_info);
|
|
|
- wacom_wac->features.pktlen = WACOM_PKGLEN_BBTOUCH3;
|
|
|
- wacom_wac->features.device_type = BTN_TOOL_FINGER;
|
|
|
- wacom_set_phy_from_res(&wacom_wac->features);
|
|
|
- wacom_wac->features.x_max = wacom_wac->features.y_max = 4096;
|
|
|
- wacom_register_input(wacom);
|
|
|
+ wacom_wac2->features.pktlen = WACOM_PKGLEN_BBTOUCH3;
|
|
|
+ wacom_wac2->features.device_type = BTN_TOOL_FINGER;
|
|
|
+ wacom_set_phy_from_res(&wacom_wac2->features);
|
|
|
+ wacom_wac2->features.x_max = wacom_wac2->features.y_max = 4096;
|
|
|
+ error = wacom_register_input(wacom2);
|
|
|
+ if (error)
|
|
|
+ goto fail2;
|
|
|
+
|
|
|
+ error = wacom_initialize_battery(wacom);
|
|
|
+ if (error)
|
|
|
+ goto fail3;
|
|
|
}
|
|
|
+
|
|
|
+ return;
|
|
|
+
|
|
|
+fail3:
|
|
|
+ input_unregister_device(wacom_wac2->input);
|
|
|
+ wacom_wac2->input = NULL;
|
|
|
+fail2:
|
|
|
+ input_unregister_device(wacom_wac1->input);
|
|
|
+ wacom_wac1->input = NULL;
|
|
|
+fail1:
|
|
|
+ return;
|
|
|
}
|
|
|
|
|
|
static int wacom_probe(struct usb_interface *intf, const struct usb_device_id *id)
|
|
@@ -1179,14 +1208,10 @@ static int wacom_probe(struct usb_interface *intf, const struct usb_device_id *i
|
|
|
if (error)
|
|
|
goto fail4;
|
|
|
|
|
|
- error = wacom_initialize_battery(wacom);
|
|
|
- if (error)
|
|
|
- goto fail5;
|
|
|
-
|
|
|
if (!(features->quirks & WACOM_QUIRK_NO_INPUT)) {
|
|
|
error = wacom_register_input(wacom);
|
|
|
if (error)
|
|
|
- goto fail6;
|
|
|
+ goto fail5;
|
|
|
}
|
|
|
|
|
|
/* Note that if query fails it is not a hard failure */
|
|
@@ -1201,7 +1226,6 @@ static int wacom_probe(struct usb_interface *intf, const struct usb_device_id *i
|
|
|
|
|
|
return 0;
|
|
|
|
|
|
- fail6: wacom_destroy_battery(wacom);
|
|
|
fail5: wacom_destroy_leds(wacom);
|
|
|
fail4: wacom_remove_shared_data(wacom_wac);
|
|
|
fail3: usb_free_urb(wacom->irq);
|