]> asedeno.scripts.mit.edu Git - linux.git/commitdiff
usb: r8a66597-hcd: Convert timers to use timer_setup()
authorKees Cook <keescook@chromium.org>
Tue, 24 Oct 2017 10:08:42 +0000 (03:08 -0700)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 1 Nov 2017 15:57:23 +0000 (16:57 +0100)
In preparation for unconditionally passing the struct timer_list pointer to
all timer callbacks, switch to using the new timer_setup() and from_timer()
to pass the timer pointer explicitly. This rearranges the arrays of timers
to minimize the need for a pointer back to the main structure.

Cc: Chris Brandt <chris.brandt@renesas.com>
Cc: Julia Lawall <Julia.Lawall@lip6.fr>
Signed-off-by: Kees Cook <keescook@chromium.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/usb/host/r8a66597-hcd.c
drivers/usb/host/r8a66597.h

index 5e5fc9d7d533d22952e41c780b23f7b9b2ca783f..0f3d2aedaec5af1f43284276add4656fd7ccae30 100644 (file)
@@ -1273,7 +1273,7 @@ static void set_td_timer(struct r8a66597 *r8a66597, struct r8a66597_td *td)
                        break;
                }
 
-               mod_timer(&r8a66597->td_timer[td->pipenum],
+               mod_timer(&r8a66597->timers[td->pipenum].td,
                          jiffies + msecs_to_jiffies(time));
        }
 }
@@ -1733,9 +1733,10 @@ static void r8a66597_root_hub_control(struct r8a66597 *r8a66597, int port)
        }
 }
 
-static void r8a66597_interval_timer(unsigned long _r8a66597)
+static void r8a66597_interval_timer(struct timer_list *t)
 {
-       struct r8a66597 *r8a66597 = (struct r8a66597 *)_r8a66597;
+       struct r8a66597_timers *timers = from_timer(timers, t, interval);
+       struct r8a66597 *r8a66597 = timers->r8a66597;
        unsigned long flags;
        u16 pipenum;
        struct r8a66597_td *td;
@@ -1745,7 +1746,7 @@ static void r8a66597_interval_timer(unsigned long _r8a66597)
        for (pipenum = 0; pipenum < R8A66597_MAX_NUM_PIPE; pipenum++) {
                if (!(r8a66597->interval_map & (1 << pipenum)))
                        continue;
-               if (timer_pending(&r8a66597->interval_timer[pipenum]))
+               if (timer_pending(&r8a66597->timers[pipenum].interval))
                        continue;
 
                td = r8a66597_get_td(r8a66597, pipenum);
@@ -1756,9 +1757,10 @@ static void r8a66597_interval_timer(unsigned long _r8a66597)
        spin_unlock_irqrestore(&r8a66597->lock, flags);
 }
 
-static void r8a66597_td_timer(unsigned long _r8a66597)
+static void r8a66597_td_timer(struct timer_list *t)
 {
-       struct r8a66597 *r8a66597 = (struct r8a66597 *)_r8a66597;
+       struct r8a66597_timers *timers = from_timer(timers, t, td);
+       struct r8a66597 *r8a66597 = timers->r8a66597;
        unsigned long flags;
        u16 pipenum;
        struct r8a66597_td *td, *new_td = NULL;
@@ -1768,7 +1770,7 @@ static void r8a66597_td_timer(unsigned long _r8a66597)
        for (pipenum = 0; pipenum < R8A66597_MAX_NUM_PIPE; pipenum++) {
                if (!(r8a66597->timeout_map & (1 << pipenum)))
                        continue;
-               if (timer_pending(&r8a66597->td_timer[pipenum]))
+               if (timer_pending(&r8a66597->timers[pipenum].td))
                        continue;
 
                td = r8a66597_get_td(r8a66597, pipenum);
@@ -1942,7 +1944,7 @@ static int r8a66597_urb_enqueue(struct usb_hcd *hcd,
        if (request) {
                if (td->pipe->info.timer_interval) {
                        r8a66597->interval_map |= 1 << td->pipenum;
-                       mod_timer(&r8a66597->interval_timer[td->pipenum],
+                       mod_timer(&r8a66597->timers[td->pipenum].interval,
                                  jiffies + msecs_to_jiffies(
                                        td->pipe->info.timer_interval));
                } else {
@@ -2495,11 +2497,10 @@ static int r8a66597_probe(struct platform_device *pdev)
 
        for (i = 0; i < R8A66597_MAX_NUM_PIPE; i++) {
                INIT_LIST_HEAD(&r8a66597->pipe_queue[i]);
-               setup_timer(&r8a66597->td_timer[i], r8a66597_td_timer,
-                           (unsigned long)r8a66597);
-               setup_timer(&r8a66597->interval_timer[i],
-                               r8a66597_interval_timer,
-                               (unsigned long)r8a66597);
+               r8a66597->timers[i].r8a66597 = r8a66597;
+               timer_setup(&r8a66597->timers[i].td, r8a66597_td_timer, 0);
+               timer_setup(&r8a66597->timers[i].interval,
+                           r8a66597_interval_timer, 0);
        }
        INIT_LIST_HEAD(&r8a66597->child_device);
 
index 672cea307abb774639d6e362b0603309bcdb2c45..b8406c07f3632b08530edfff7bbc40f67ecbd577 100644 (file)
@@ -107,6 +107,14 @@ struct r8a66597_root_hub {
        struct r8a66597_device  *dev;
 };
 
+struct r8a66597;
+
+struct r8a66597_timers {
+       struct timer_list td;
+       struct timer_list interval;
+       struct r8a66597 *r8a66597;
+};
+
 struct r8a66597 {
        spinlock_t lock;
        void __iomem *reg;
@@ -117,8 +125,7 @@ struct r8a66597 {
        struct list_head                pipe_queue[R8A66597_MAX_NUM_PIPE];
 
        struct timer_list rh_timer;
-       struct timer_list td_timer[R8A66597_MAX_NUM_PIPE];
-       struct timer_list interval_timer[R8A66597_MAX_NUM_PIPE];
+       struct r8a66597_timers timers[R8A66597_MAX_NUM_PIPE];
 
        unsigned short address_map;
        unsigned short timeout_map;