#include <linux/alarmtimer.h>
 #include "android_alarm.h"
 
-/* XXX - Hack out wakelocks, while they are out of tree */
-struct wake_lock {
-       int i;
-};
-#define wake_lock(x)
-#define wake_lock_timeout(x, y)
-#define wake_unlock(x)
-#define WAKE_LOCK_SUSPEND 0
-#define wake_lock_init(x, y, z) ((x)->i = 1)
-#define wake_lock_destroy(x)
-
 #define ANDROID_ALARM_PRINT_INFO (1U << 0)
 #define ANDROID_ALARM_PRINT_IO (1U << 1)
 #define ANDROID_ALARM_PRINT_INT (1U << 2)
 
 static int alarm_opened;
 static DEFINE_SPINLOCK(alarm_slock);
-static struct wake_lock alarm_wake_lock;
+static struct wakeup_source alarm_wake_lock;
 static DECLARE_WAIT_QUEUE_HEAD(alarm_wait_queue);
 static uint32_t alarm_pending;
 static uint32_t alarm_enabled;
                if (alarm_pending) {
                        alarm_pending &= ~alarm_type_mask;
                        if (!alarm_pending && !wait_pending)
-                               wake_unlock(&alarm_wake_lock);
+                               __pm_relax(&alarm_wake_lock);
                }
                alarm_enabled &= ~alarm_type_mask;
                spin_unlock_irqrestore(&alarm_slock, flags);
                spin_lock_irqsave(&alarm_slock, flags);
                pr_alarm(IO, "alarm wait\n");
                if (!alarm_pending && wait_pending) {
-                       wake_unlock(&alarm_wake_lock);
+                       __pm_relax(&alarm_wake_lock);
                        wait_pending = 0;
                }
                spin_unlock_irqrestore(&alarm_slock, flags);
                        if (alarm_pending)
                                pr_alarm(INFO, "alarm_release: clear "
                                        "pending alarms %x\n", alarm_pending);
-                       wake_unlock(&alarm_wake_lock);
+                       __pm_relax(&alarm_wake_lock);
                        wait_pending = 0;
                        alarm_pending = 0;
                }
        pr_alarm(INT, "devalarm_triggered type %d\n", alarm->type);
        spin_lock_irqsave(&alarm_slock, flags);
        if (alarm_enabled & alarm_type_mask) {
-               wake_lock_timeout(&alarm_wake_lock, 5 * HZ);
+               __pm_wakeup_event(&alarm_wake_lock, 5000); /* 5secs */
                alarm_enabled &= ~alarm_type_mask;
                alarm_pending |= alarm_type_mask;
                wake_up(&alarm_wait_queue);
                        alarms[i].u.hrt.function = devalarm_hrthandler;
        }
 
-       wake_lock_init(&alarm_wake_lock, WAKE_LOCK_SUSPEND, "alarm");
-
+       wakeup_source_init(&alarm_wake_lock, "alarm");
        return 0;
 }
 
 static void  __exit alarm_dev_exit(void)
 {
        misc_deregister(&alarm_device);
-       wake_lock_destroy(&alarm_wake_lock);
+       wakeup_source_trash(&alarm_wake_lock);
 }
 
 module_init(alarm_dev_init);