battery->bat.type = POWER_SUPPLY_TYPE_BATTERY;
        battery->bat.get_property = acpi_battery_get_property;
 
-       result = power_supply_register(&battery->device->dev, &battery->bat);
+       result = power_supply_register_no_ws(&battery->device->dev, &battery->bat);
+
        if (result)
                return result;
        return device_create_file(battery->bat.dev, &alarm_attr);
                        return result;
        }
        result = acpi_battery_get_state(battery);
+       if (result)
+               return result;
        acpi_battery_quirks(battery);
+
+       /*
+        * Wakeup the system if battery is critical low
+        * or lower than the alarm level
+        */
+       if ((battery->state & ACPI_BATTERY_STATE_CRITICAL) ||
+           (test_bit(ACPI_BATTERY_ALARM_PRESENT, &battery->flags) &&
+            (battery->capacity_now <= battery->alarm)))
+               pm_wakeup_event(&battery->device->dev, 0);
+
        return result;
 }
 
        battery->pm_nb.notifier_call = battery_notify;
        register_pm_notifier(&battery->pm_nb);
 
+       device_init_wakeup(&device->dev, 1);
+
        return result;
 
 fail:
 
        if (!device || !acpi_driver_data(device))
                return -EINVAL;
+       device_init_wakeup(&device->dev, 0);
        battery = acpi_driver_data(device);
        unregister_pm_notifier(&battery->pm_nb);
 #ifdef CONFIG_ACPI_PROCFS_POWER