static void wacom_destroy_battery(struct wacom *wacom)
  {
-       if ((wacom->wacom_wac.features.quirks & WACOM_QUIRK_BATTERY) &&
-            wacom->battery) {
 -      if (wacom->battery.dev) {
 -              power_supply_unregister(&wacom->battery);
 -              wacom->battery.dev = NULL;
 -              power_supply_unregister(&wacom->ac);
 -              wacom->ac.dev = NULL;
++      if (wacom->battery) {
 +              power_supply_unregister(wacom->battery);
 +              wacom->battery = NULL;
 +              power_supply_unregister(wacom->ac);
 +              wacom->ac = NULL;
        }
  }
  
        return;
  }
  
 -           !wacom->battery.dev) {
+ void wacom_battery_work(struct work_struct *work)
+ {
+       struct wacom *wacom = container_of(work, struct wacom, work);
+ 
+       if ((wacom->wacom_wac.features.quirks & WACOM_QUIRK_BATTERY) &&
 -               wacom->battery.dev) {
++           !wacom->battery) {
+               wacom_initialize_battery(wacom);
+       }
+       else if (!(wacom->wacom_wac.features.quirks & WACOM_QUIRK_BATTERY) &&
++               wacom->battery) {
+               wacom_destroy_battery(wacom);
+       }
+ }
+ 
  /*
   * Not all devices report physical dimensions from HID.
   * Compute the default from hardcoded logical dimension
 
   */
  static unsigned short batcap_i4[8] = { 1, 15, 30, 45, 60, 70, 85, 100 };
  
 -              if (wacom->battery.dev)
 -                      power_supply_changed(&wacom->battery);
+ static void wacom_notify_battery(struct wacom_wac *wacom_wac,
+       int bat_capacity, bool bat_charging, bool bat_connected,
+       bool ps_connected)
+ {
+       struct wacom *wacom = container_of(wacom_wac, struct wacom, wacom_wac);
+       bool changed = wacom_wac->battery_capacity != bat_capacity  ||
+                      wacom_wac->bat_charging     != bat_charging  ||
+                      wacom_wac->bat_connected    != bat_connected ||
+                      wacom_wac->ps_connected     != ps_connected;
+ 
+       if (changed) {
+               wacom_wac->battery_capacity = bat_capacity;
+               wacom_wac->bat_charging = bat_charging;
+               wacom_wac->bat_connected = bat_connected;
+               wacom_wac->ps_connected = ps_connected;
+ 
++              if (wacom->battery)
++                      power_supply_changed(wacom->battery);
+       }
+ }
+ 
  static int wacom_penpartner_irq(struct wacom_wac *wacom)
  {
        unsigned char *data = wacom->data;
                /* disconnected while previously connected */
                wacom->pid = 0;
                wacom_schedule_work(wacom);
-               wacom->battery_capacity = 0;
-               wacom->bat_charging = 0;
-               wacom->ps_connected = 0;
+               wacom_notify_battery(wacom, 0, 0, 0, 0);
+       }
+ 
+       return 0;
+ }
+ 
+ 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;
+ 
+       if (data[0] != WACOM_REPORT_USB)
+               return 0;
+ 
+       if (features->type == INTUOSHT &&
+           wacom_wac->shared->touch_input &&
+           features->touch_max) {
+               input_report_switch(wacom_wac->shared->touch_input,
+                                   SW_MUTE_DEVICE, data[8] & 0x40);
+               input_sync(wacom_wac->shared->touch_input);
        }
  
 -              if (!wacom->battery.dev &&
+       if (data[9] & 0x02) { /* wireless module is attached */
+               int battery = (data[8] & 0x3f) * 100 / 31;
+               bool charging = !!(data[8] & 0x80);
+ 
+               wacom_notify_battery(wacom_wac, battery, charging,
+                                    battery || charging, 1);
+ 
 -               wacom->battery.dev) {
++              if (!wacom->battery &&
+                   !(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) {
+               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, 0);
+       }
        return 0;
  }