- int c;
-
- c = 0;
- while (!(omap_dm_timer_read_reg(timer, OMAP_TIMER_SYS_STAT_REG) & 1)) {
- c++;
- if (c > 100000) {
- printk(KERN_ERR "Timer failed to reset\n");
- return;
- }
- }
-}
-
-static void omap_dm_timer_reset(struct omap_dm_timer *timer)
-{
- u32 l;
-
- if (timer != &dm_timers[0]) {
- omap_dm_timer_write_reg(timer, OMAP_TIMER_IF_CTRL_REG, 0x06);
- omap_dm_timer_wait_for_reset(timer);
- }
- omap_dm_timer_set_source(timer, OMAP_TIMER_SRC_SYS_CLK);
-
- /* Set to smart-idle mode */
- l = omap_dm_timer_read_reg(timer, OMAP_TIMER_OCP_CFG_REG);
- l |= 0x02 << 3;
- omap_dm_timer_write_reg(timer, OMAP_TIMER_OCP_CFG_REG, l);
-}
-
-static void omap_dm_timer_prepare(struct omap_dm_timer *timer)
-{
-#ifdef CONFIG_ARCH_OMAP2
- clk_enable(timer->iclk);
- clk_enable(timer->fclk);
-#endif
- omap_dm_timer_reset(timer);
-}
-
-struct omap_dm_timer *omap_dm_timer_request(void)
-{
- struct omap_dm_timer *timer = NULL;
- unsigned long flags;
- int i;
-
- spin_lock_irqsave(&dm_timer_lock, flags);
- for (i = 0; i < dm_timer_count; i++) {
- if (dm_timers[i].reserved)
- continue;
-
- timer = &dm_timers[i];
- timer->reserved = 1;
- break;
- }
- spin_unlock_irqrestore(&dm_timer_lock, flags);
-
- if (timer != NULL)
- omap_dm_timer_prepare(timer);
-
- return timer;