#define OMAP3_SECURE_TIMER     1
 #endif
 
-static u32 sys_timer_reserved;
-
 /* Clockevent code */
 
 static struct omap_dm_timer clkev;
 
        omap_hwmod_enable(oh);
 
-       sys_timer_reserved |= (1 << (gptimer_id - 1));
+       if (omap_dm_timer_reserve_systimer(gptimer_id))
+               return -ENODEV;
 
        if (gptimer_id != 12) {
                struct clk *src;
        pdata->set_timer_src = omap2_dm_timer_set_src;
        pdata->timer_ip_version = oh->class->rev;
 
-       /* Mark clocksource and clockevent timers as reserved */
-       if ((sys_timer_reserved >> (id - 1)) & 0x1)
-               pdata->reserved = 1;
-
        pwrdm = omap_hwmod_get_pwrdm(oh);
        pdata->loses_context = pwrdm_can_ever_lose_context(pwrdm);
 #ifdef CONFIG_PM
 
 
 #include <mach/hardware.h>
 
+static u32 omap_reserved_systimers;
 static LIST_HEAD(omap_timer_list);
 static DEFINE_SPINLOCK(dm_timer_lock);
 
        return ret;
 }
 
+static inline u32 omap_dm_timer_reserved_systimer(int id)
+{
+       return (omap_reserved_systimers & (1 << (id - 1))) ? 1 : 0;
+}
+
+int omap_dm_timer_reserve_systimer(int id)
+{
+       if (omap_dm_timer_reserved_systimer(id))
+               return -ENODEV;
+
+       omap_reserved_systimers |= (1 << (id - 1));
+
+       return 0;
+}
+
 struct omap_dm_timer *omap_dm_timer_request(void)
 {
        struct omap_dm_timer *timer = NULL, *t;
 
        timer->id = pdev->id;
        timer->irq = irq->start;
-       timer->reserved = pdata->reserved;
+       timer->reserved = omap_dm_timer_reserved_systimer(timer->id);
        timer->pdev = pdev;
        timer->loses_context = pdata->loses_context;
        timer->get_context_loss_count = pdata->get_context_loss_count;
 
        int (*set_timer_src)(struct platform_device *pdev, int source);
        int timer_ip_version;
        u32 needs_manual_reset:1;
-       bool reserved;
-
        bool loses_context;
 
        int (*get_context_loss_count)(struct device *dev);
 };
 
+int omap_dm_timer_reserve_systimer(int id);
 struct omap_dm_timer *omap_dm_timer_request(void);
 struct omap_dm_timer *omap_dm_timer_request_specific(int timer_id);
 int omap_dm_timer_free(struct omap_dm_timer *timer);