]> git.proxmox.com Git - mirror_ubuntu-eoan-kernel.git/commitdiff
powerpc/mpic_timer: avoid struct timeval
authorArnd Bergmann <arnd@arndb.de>
Tue, 16 Jan 2018 17:01:50 +0000 (18:01 +0100)
committerMichael Ellerman <mpe@ellerman.id.au>
Sun, 21 Jan 2018 04:06:16 +0000 (15:06 +1100)
In an effort to remove all instances of 'struct timeval'
from the kernel, I'm changing the powerpc mpic_timer interface
to use plain seconds instead. There is only one user of this
interface, and that doesn't use the microseconds portion, so
the code gets noticeably simpler in the process.

Signed-off-by: Arnd Bergmann <arnd@arndb.de>
Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
arch/powerpc/include/asm/mpic_timer.h
arch/powerpc/sysdev/fsl_mpic_timer_wakeup.c
arch/powerpc/sysdev/mpic_timer.c

index 0e23cd4ac8aabc4bbc02aca3f674e7651c1cbf51..13e6702ec458af4b9d103cb9bbefa0d04de56493 100644 (file)
@@ -29,17 +29,17 @@ struct mpic_timer {
 
 #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
 
index 1707bf04dec6a7d55a4e13bc5eb8dc82a77d7e35..94278e8af1920c5a2d257c24f3c8d005d132ae8e 100644 (file)
@@ -56,17 +56,16 @@ static ssize_t fsl_timer_wakeup_show(struct device *dev,
                                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,
@@ -74,11 +73,10 @@ 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);
@@ -89,13 +87,13 @@ static ssize_t fsl_timer_wakeup_store(struct device *dev,
                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;
index a418579591bed5e3de647afc2087e780d1d6c8ab..87e7c42777a8c919a959c0b264a14b96b8d33112 100644 (file)
@@ -47,9 +47,6 @@
 #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];
@@ -90,51 +87,23 @@ static struct cascade_priv cascade_timer[] = {
 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;
 }
@@ -223,7 +192,7 @@ static struct mpic_timer *get_cascade_timer(struct timer_group_priv *priv,
        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;
@@ -277,7 +246,7 @@ static struct mpic_timer *get_timer(const struct timeval *time)
  * @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)
 {
@@ -319,7 +288,7 @@ EXPORT_SYMBOL(mpic_stop_timer);
  *
  * 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]);
@@ -391,7 +360,7 @@ EXPORT_SYMBOL(mpic_free_timer);
  * 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;
@@ -399,11 +368,7 @@ struct mpic_timer *mpic_request_timer(irq_handler_t fn, void *dev,
        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);