static int omap2_gp_timer_set_next_event(unsigned long cycles,
                                         struct clock_event_device *evt)
 {
-       omap_dm_timer_set_load(gptimer, 0, 0xffffffff - cycles);
-       omap_dm_timer_start(gptimer);
+       omap_dm_timer_set_load_start(gptimer, 0, 0xffffffff - cycles);
 
        return 0;
 }
                period = clk_get_rate(omap_dm_timer_get_fclk(gptimer)) / HZ;
                period -= 1;
 
-               omap_dm_timer_set_load(gptimer, 1, 0xffffffff - period);
-               omap_dm_timer_start(gptimer);
+               omap_dm_timer_set_load_start(gptimer, 1, 0xffffffff - period);
                break;
        case CLOCK_EVT_MODE_ONESHOT:
                break;
        tick_rate = clk_get_rate(omap_dm_timer_get_fclk(gpt));
        tick_period = (tick_rate / HZ) - 1;
 
-       omap_dm_timer_set_load(gpt, 1, 0);
-       omap_dm_timer_start(gpt);
+       omap_dm_timer_set_load_start(gpt, 1, 0);
 
        clocksource_gpt.mult =
                clocksource_khz2mult(tick_rate/1000, clocksource_gpt.shift);
 
        omap_dm_timer_write_reg(timer, OMAP_TIMER_TRIGGER_REG, 0);
 }
 
+/* Optimized set_load which removes costly spin wait in timer_start */
+void omap_dm_timer_set_load_start(struct omap_dm_timer *timer, int autoreload,
+                            unsigned int load)
+{
+       u32 l;
+
+       l = omap_dm_timer_read_reg(timer, OMAP_TIMER_CTRL_REG);
+       if (autoreload)
+               l |= OMAP_TIMER_CTRL_AR;
+       else
+               l &= ~OMAP_TIMER_CTRL_AR;
+       l |= OMAP_TIMER_CTRL_ST;
+
+       omap_dm_timer_write_reg(timer, OMAP_TIMER_COUNTER_REG, load);
+       omap_dm_timer_write_reg(timer, OMAP_TIMER_LOAD_REG, load);
+       omap_dm_timer_write_reg(timer, OMAP_TIMER_CTRL_REG, l);
+}
+
 void omap_dm_timer_set_match(struct omap_dm_timer *timer, int enable,
                             unsigned int match)
 {
        omap_dm_timer_write_reg(timer, OMAP_TIMER_MATCH_REG, match);
 }
 
-
 void omap_dm_timer_set_pwm(struct omap_dm_timer *timer, int def_on,
                           int toggle, int trigger)
 {
 
 
 void omap_dm_timer_set_source(struct omap_dm_timer *timer, int source);
 void omap_dm_timer_set_load(struct omap_dm_timer *timer, int autoreload, unsigned int value);
+void omap_dm_timer_set_load_start(struct omap_dm_timer *timer, int autoreload, unsigned int value);
 void omap_dm_timer_set_match(struct omap_dm_timer *timer, int enable, unsigned int match);
 void omap_dm_timer_set_pwm(struct omap_dm_timer *timer, int def_on, int toggle, int trigger);
 void omap_dm_timer_set_prescaler(struct omap_dm_timer *timer, int prescaler);