*             reached from DETACHED or SHUTDOWN.
  * ONESHOT:    Device is programmed to generate event only once. Can be reached
  *             from DETACHED or SHUTDOWN.
+ * ONESHOT_STOPPED: Device was programmed in ONESHOT mode and is temporarily
+ *                 stopped.
  */
 enum clock_event_state {
        CLOCK_EVT_STATE_DETACHED,
        CLOCK_EVT_STATE_SHUTDOWN,
        CLOCK_EVT_STATE_PERIODIC,
        CLOCK_EVT_STATE_ONESHOT,
+       CLOCK_EVT_STATE_ONESHOT_STOPPED,
 };
 
 /*
  * @set_mode:          legacy set mode function, only for modes <= CLOCK_EVT_MODE_RESUME.
  * @set_state_periodic:        switch state to periodic, if !set_mode
  * @set_state_oneshot: switch state to oneshot, if !set_mode
+ * @set_state_oneshot_stopped: switch state to oneshot_stopped, if !set_mode
  * @set_state_shutdown:        switch state to shutdown, if !set_mode
  * @tick_resume:       resume clkevt device, if !set_mode
  * @broadcast:         function to broadcast events
         * State transition callback(s): Only one of the two groups should be
         * defined:
         * - set_mode(), only for modes <= CLOCK_EVT_MODE_RESUME.
-        * - set_state_{shutdown|periodic|oneshot}(), tick_resume().
+        * - set_state_{shutdown|periodic|oneshot|oneshot_stopped}(), tick_resume().
         */
        void                    (*set_mode)(enum clock_event_mode mode, struct clock_event_device *);
        int                     (*set_state_periodic)(struct clock_event_device *);
        int                     (*set_state_oneshot)(struct clock_event_device *);
+       int                     (*set_state_oneshot_stopped)(struct clock_event_device *);
        int                     (*set_state_shutdown)(struct clock_event_device *);
        int                     (*tick_resume)(struct clock_event_device *);
 
 
                        return -ENOSYS;
                return dev->set_state_oneshot(dev);
 
+       case CLOCK_EVT_STATE_ONESHOT_STOPPED:
+               /* Core internal bug */
+               if (WARN_ONCE(dev->state != CLOCK_EVT_STATE_ONESHOT,
+                             "Current state: %d\n", dev->state))
+                       return -EINVAL;
+
+               if (dev->set_state_oneshot_stopped)
+                       return dev->set_state_oneshot_stopped(dev);
+               else
+                       return -ENOSYS;
+
        default:
                return -ENOSYS;
        }
        if (dev->set_mode) {
                /* We shouldn't be supporting new modes now */
                WARN_ON(dev->set_state_periodic || dev->set_state_oneshot ||
-                       dev->set_state_shutdown || dev->tick_resume);
+                       dev->set_state_shutdown || dev->tick_resume ||
+                       dev->set_state_oneshot_stopped);
 
                BUG_ON(dev->mode != CLOCK_EVT_MODE_UNUSED);
                return 0;
 
                        SEQ_printf(m, "\n");
                }
 
+               if (dev->set_state_oneshot_stopped) {
+                       SEQ_printf(m, " oneshot stopped: ");
+                       print_name_offset(m, dev->set_state_oneshot_stopped);
+                       SEQ_printf(m, "\n");
+               }
+
                if (dev->tick_resume) {
                        SEQ_printf(m, " resume:   ");
                        print_name_offset(m, dev->tick_resume);