#ifdef CONFIG_MPIC_TIMER
 struct mpic_timer *mpic_request_timer(irq_handler_t fn,  void *dev,
-               const struct timeval *time);
+               time64_t time);
 void mpic_start_timer(struct mpic_timer *handle);
 void mpic_stop_timer(struct mpic_timer *handle);
-void mpic_get_remain_time(struct mpic_timer *handle, struct timeval *time);
+void mpic_get_remain_time(struct mpic_timer *handle, time64_t *time);
 void mpic_free_timer(struct mpic_timer *handle);
 #else
 struct mpic_timer *mpic_request_timer(irq_handler_t fn,  void *dev,
-               const struct timeval *time) { return NULL; }
+               time64_t time) { return NULL; }
 void mpic_start_timer(struct mpic_timer *handle) { }
 void mpic_stop_timer(struct mpic_timer *handle) { }
-void mpic_get_remain_time(struct mpic_timer *handle, struct timeval *time) { }
+void mpic_get_remain_time(struct mpic_timer *handle, time64_t *time) { }
 void mpic_free_timer(struct mpic_timer *handle) { }
 #endif
 
 
                                struct device_attribute *attr,
                                char *buf)
 {
-       struct timeval interval;
-       int val = 0;
+       time64_t interval = 0;
 
        mutex_lock(&sysfs_lock);
        if (fsl_wakeup->timer) {
                mpic_get_remain_time(fsl_wakeup->timer, &interval);
-               val = interval.tv_sec + 1;
+               interval++;
        }
        mutex_unlock(&sysfs_lock);
 
-       return sprintf(buf, "%d\n", val);
+       return sprintf(buf, "%lld\n", interval);
 }
 
 static ssize_t fsl_timer_wakeup_store(struct device *dev,
                                const char *buf,
                                size_t count)
 {
-       struct timeval interval;
+       time64_t interval;
        int ret;
 
-       interval.tv_usec = 0;
-       if (kstrtol(buf, 0, &interval.tv_sec))
+       if (kstrtoll(buf, 0, &interval))
                return -EINVAL;
 
        mutex_lock(&sysfs_lock);
                fsl_wakeup->timer = NULL;
        }
 
-       if (!interval.tv_sec) {
+       if (!interval) {
                mutex_unlock(&sysfs_lock);
                return count;
        }
 
        fsl_wakeup->timer = mpic_request_timer(fsl_mpic_timer_irq,
-                                               fsl_wakeup, &interval);
+                                               fsl_wakeup, interval);
        if (!fsl_wakeup->timer) {
                mutex_unlock(&sysfs_lock);
                return -EINVAL;
 
 #define MAX_TICKS_CASCADE              (~0U)
 #define TIMER_OFFSET(num)              (1 << (TIMERS_PER_GROUP - 1 - num))
 
-/* tv_usec should be less than ONE_SECOND, otherwise use tv_sec */
-#define ONE_SECOND                     1000000
-
 struct timer_regs {
        u32     gtccr;
        u32     res0[3];
 static LIST_HEAD(timer_group_list);
 
 static void convert_ticks_to_time(struct timer_group_priv *priv,
-               const u64 ticks, struct timeval *time)
+               const u64 ticks, time64_t *time)
 {
-       u64 tmp_sec;
-
-       time->tv_sec = (__kernel_time_t)div_u64(ticks, priv->timerfreq);
-       tmp_sec = (u64)time->tv_sec * (u64)priv->timerfreq;
-
-       time->tv_usec = 0;
-
-       if (tmp_sec <= ticks)
-               time->tv_usec = (__kernel_suseconds_t)
-                       div_u64((ticks - tmp_sec) * 1000000, priv->timerfreq);
-
-       return;
+       *time = (u64)div_u64(ticks, priv->timerfreq);
 }
 
 /* the time set by the user is converted to "ticks" */
 static int convert_time_to_ticks(struct timer_group_priv *priv,
-               const struct timeval *time, u64 *ticks)
+               time64_t time, u64 *ticks)
 {
        u64 max_value;          /* prevent u64 overflow */
-       u64 tmp = 0;
-
-       u64 tmp_sec;
-       u64 tmp_ms;
-       u64 tmp_us;
 
        max_value = div_u64(ULLONG_MAX, priv->timerfreq);
 
-       if (time->tv_sec > max_value ||
-                       (time->tv_sec == max_value && time->tv_usec > 0))
+       if (time > max_value)
                return -EINVAL;
 
-       tmp_sec = (u64)time->tv_sec * (u64)priv->timerfreq;
-       tmp += tmp_sec;
-
-       tmp_ms = time->tv_usec / 1000;
-       tmp_ms = div_u64((u64)tmp_ms * (u64)priv->timerfreq, 1000);
-       tmp += tmp_ms;
-
-       tmp_us = time->tv_usec % 1000;
-       tmp_us = div_u64((u64)tmp_us * (u64)priv->timerfreq, 1000000);
-       tmp += tmp_us;
-
-       *ticks = tmp;
+       *ticks = (u64)time * (u64)priv->timerfreq;
 
        return 0;
 }
        return allocated_timer;
 }
 
-static struct mpic_timer *get_timer(const struct timeval *time)
+static struct mpic_timer *get_timer(time64_t time)
 {
        struct timer_group_priv *priv;
        struct mpic_timer *timer;
  * @handle: the timer to be started.
  *
  * It will do ->fn(->dev) callback from the hardware interrupt at
- * the ->timeval point in the future.
+ * the 'time64_t' point in the future.
  */
 void mpic_start_timer(struct mpic_timer *handle)
 {
  *
  * Query timer remaining time.
  */
-void mpic_get_remain_time(struct mpic_timer *handle, struct timeval *time)
+void mpic_get_remain_time(struct mpic_timer *handle, time64_t *time)
 {
        struct timer_group_priv *priv = container_of(handle,
                        struct timer_group_priv, timer[handle->num]);
  * else "handle" on success.
  */
 struct mpic_timer *mpic_request_timer(irq_handler_t fn, void *dev,
-                                       const struct timeval *time)
+                                     time64_t time)
 {
        struct mpic_timer *allocated_timer;
        int ret;
        if (list_empty(&timer_group_list))
                return NULL;
 
-       if (!(time->tv_sec + time->tv_usec) ||
-                       time->tv_sec < 0 || time->tv_usec < 0)
-               return NULL;
-
-       if (time->tv_usec > ONE_SECOND)
+       if (time < 0)
                return NULL;
 
        allocated_timer = get_timer(time);