Commit 8e4e276a authored by Kees Cook's avatar Kees Cook Committed by Greg Kroah-Hartman

usb: r8a66597-hcd: Convert timers to use timer_setup()

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: default avatarKees Cook <keescook@chromium.org>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 7e33da59
...@@ -1273,7 +1273,7 @@ static void set_td_timer(struct r8a66597 *r8a66597, struct r8a66597_td *td) ...@@ -1273,7 +1273,7 @@ static void set_td_timer(struct r8a66597 *r8a66597, struct r8a66597_td *td)
break; break;
} }
mod_timer(&r8a66597->td_timer[td->pipenum], mod_timer(&r8a66597->timers[td->pipenum].td,
jiffies + msecs_to_jiffies(time)); jiffies + msecs_to_jiffies(time));
} }
} }
...@@ -1733,9 +1733,10 @@ static void r8a66597_root_hub_control(struct r8a66597 *r8a66597, int port) ...@@ -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; unsigned long flags;
u16 pipenum; u16 pipenum;
struct r8a66597_td *td; struct r8a66597_td *td;
...@@ -1745,7 +1746,7 @@ static void r8a66597_interval_timer(unsigned long _r8a66597) ...@@ -1745,7 +1746,7 @@ static void r8a66597_interval_timer(unsigned long _r8a66597)
for (pipenum = 0; pipenum < R8A66597_MAX_NUM_PIPE; pipenum++) { for (pipenum = 0; pipenum < R8A66597_MAX_NUM_PIPE; pipenum++) {
if (!(r8a66597->interval_map & (1 << pipenum))) if (!(r8a66597->interval_map & (1 << pipenum)))
continue; continue;
if (timer_pending(&r8a66597->interval_timer[pipenum])) if (timer_pending(&r8a66597->timers[pipenum].interval))
continue; continue;
td = r8a66597_get_td(r8a66597, pipenum); td = r8a66597_get_td(r8a66597, pipenum);
...@@ -1756,9 +1757,10 @@ static void r8a66597_interval_timer(unsigned long _r8a66597) ...@@ -1756,9 +1757,10 @@ static void r8a66597_interval_timer(unsigned long _r8a66597)
spin_unlock_irqrestore(&r8a66597->lock, flags); 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; unsigned long flags;
u16 pipenum; u16 pipenum;
struct r8a66597_td *td, *new_td = NULL; struct r8a66597_td *td, *new_td = NULL;
...@@ -1768,7 +1770,7 @@ static void r8a66597_td_timer(unsigned long _r8a66597) ...@@ -1768,7 +1770,7 @@ static void r8a66597_td_timer(unsigned long _r8a66597)
for (pipenum = 0; pipenum < R8A66597_MAX_NUM_PIPE; pipenum++) { for (pipenum = 0; pipenum < R8A66597_MAX_NUM_PIPE; pipenum++) {
if (!(r8a66597->timeout_map & (1 << pipenum))) if (!(r8a66597->timeout_map & (1 << pipenum)))
continue; continue;
if (timer_pending(&r8a66597->td_timer[pipenum])) if (timer_pending(&r8a66597->timers[pipenum].td))
continue; continue;
td = r8a66597_get_td(r8a66597, pipenum); td = r8a66597_get_td(r8a66597, pipenum);
...@@ -1942,7 +1944,7 @@ static int r8a66597_urb_enqueue(struct usb_hcd *hcd, ...@@ -1942,7 +1944,7 @@ static int r8a66597_urb_enqueue(struct usb_hcd *hcd,
if (request) { if (request) {
if (td->pipe->info.timer_interval) { if (td->pipe->info.timer_interval) {
r8a66597->interval_map |= 1 << td->pipenum; r8a66597->interval_map |= 1 << td->pipenum;
mod_timer(&r8a66597->interval_timer[td->pipenum], mod_timer(&r8a66597->timers[td->pipenum].interval,
jiffies + msecs_to_jiffies( jiffies + msecs_to_jiffies(
td->pipe->info.timer_interval)); td->pipe->info.timer_interval));
} else { } else {
...@@ -2495,11 +2497,10 @@ static int r8a66597_probe(struct platform_device *pdev) ...@@ -2495,11 +2497,10 @@ static int r8a66597_probe(struct platform_device *pdev)
for (i = 0; i < R8A66597_MAX_NUM_PIPE; i++) { for (i = 0; i < R8A66597_MAX_NUM_PIPE; i++) {
INIT_LIST_HEAD(&r8a66597->pipe_queue[i]); INIT_LIST_HEAD(&r8a66597->pipe_queue[i]);
setup_timer(&r8a66597->td_timer[i], r8a66597_td_timer, r8a66597->timers[i].r8a66597 = r8a66597;
(unsigned long)r8a66597); timer_setup(&r8a66597->timers[i].td, r8a66597_td_timer, 0);
setup_timer(&r8a66597->interval_timer[i], timer_setup(&r8a66597->timers[i].interval,
r8a66597_interval_timer, r8a66597_interval_timer, 0);
(unsigned long)r8a66597);
} }
INIT_LIST_HEAD(&r8a66597->child_device); INIT_LIST_HEAD(&r8a66597->child_device);
......
...@@ -107,6 +107,14 @@ struct r8a66597_root_hub { ...@@ -107,6 +107,14 @@ struct r8a66597_root_hub {
struct r8a66597_device *dev; struct r8a66597_device *dev;
}; };
struct r8a66597;
struct r8a66597_timers {
struct timer_list td;
struct timer_list interval;
struct r8a66597 *r8a66597;
};
struct r8a66597 { struct r8a66597 {
spinlock_t lock; spinlock_t lock;
void __iomem *reg; void __iomem *reg;
...@@ -117,8 +125,7 @@ struct r8a66597 { ...@@ -117,8 +125,7 @@ struct r8a66597 {
struct list_head pipe_queue[R8A66597_MAX_NUM_PIPE]; struct list_head pipe_queue[R8A66597_MAX_NUM_PIPE];
struct timer_list rh_timer; struct timer_list rh_timer;
struct timer_list td_timer[R8A66597_MAX_NUM_PIPE]; struct r8a66597_timers timers[R8A66597_MAX_NUM_PIPE];
struct timer_list interval_timer[R8A66597_MAX_NUM_PIPE];
unsigned short address_map; unsigned short address_map;
unsigned short timeout_map; unsigned short timeout_map;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment