diff options
| author | Magnus Damm <damm@opensource.se> | 2010-01-27 02:41:19 -0500 |
|---|---|---|
| committer | Paul Mundt <lethal@linux-sh.org> | 2010-02-01 21:30:45 -0500 |
| commit | e5ff15bec96ba18698dae5de0bbf7e6a0653ca65 (patch) | |
| tree | d311f375b0297dc4e92c09a50f175de0979241a8 | |
| parent | e8708ef7e86a463b3a5b01d4a9abf16c8748b464 (diff) | |
usb: r8a66597-hdc disable interrupts fix
This patch improves disable_controller() in the r8a66597-hdc
driver to disable all interrupts and clear status flags. It
also makes sure that disable_controller() is called during
probe(). This fixes the relatively rare case of unexpected
pending interrupts after kexec reboot.
Signed-off-by: Magnus Damm <damm@opensource.se>
Acked-by: Yoshihiro Shimoda <shimoda.yoshihiro@renesas.com>
Signed-off-by: Paul Mundt <lethal@linux-sh.org>
| -rw-r--r-- | drivers/usb/host/r8a66597-hcd.c | 17 |
1 files changed, 16 insertions, 1 deletions
diff --git a/drivers/usb/host/r8a66597-hcd.c b/drivers/usb/host/r8a66597-hcd.c index b7a661c02bcd..0ceec123ddfd 100644 --- a/drivers/usb/host/r8a66597-hcd.c +++ b/drivers/usb/host/r8a66597-hcd.c | |||
| @@ -216,8 +216,17 @@ static void disable_controller(struct r8a66597 *r8a66597) | |||
| 216 | { | 216 | { |
| 217 | int port; | 217 | int port; |
| 218 | 218 | ||
| 219 | /* disable interrupts */ | ||
| 219 | r8a66597_write(r8a66597, 0, INTENB0); | 220 | r8a66597_write(r8a66597, 0, INTENB0); |
| 220 | r8a66597_write(r8a66597, 0, INTSTS0); | 221 | r8a66597_write(r8a66597, 0, INTENB1); |
| 222 | r8a66597_write(r8a66597, 0, BRDYENB); | ||
| 223 | r8a66597_write(r8a66597, 0, BEMPENB); | ||
| 224 | r8a66597_write(r8a66597, 0, NRDYENB); | ||
| 225 | |||
| 226 | /* clear status */ | ||
| 227 | r8a66597_write(r8a66597, 0, BRDYSTS); | ||
| 228 | r8a66597_write(r8a66597, 0, NRDYSTS); | ||
| 229 | r8a66597_write(r8a66597, 0, BEMPSTS); | ||
| 221 | 230 | ||
| 222 | for (port = 0; port < r8a66597->max_root_hub; port++) | 231 | for (port = 0; port < r8a66597->max_root_hub; port++) |
| 223 | r8a66597_disable_port(r8a66597, port); | 232 | r8a66597_disable_port(r8a66597, port); |
| @@ -2466,6 +2475,12 @@ static int __devinit r8a66597_probe(struct platform_device *pdev) | |||
| 2466 | r8a66597->rh_timer.data = (unsigned long)r8a66597; | 2475 | r8a66597->rh_timer.data = (unsigned long)r8a66597; |
| 2467 | r8a66597->reg = (unsigned long)reg; | 2476 | r8a66597->reg = (unsigned long)reg; |
| 2468 | 2477 | ||
| 2478 | /* make sure no interrupts are pending */ | ||
| 2479 | ret = r8a66597_clock_enable(r8a66597); | ||
| 2480 | if (ret < 0) | ||
| 2481 | goto clean_up3; | ||
| 2482 | disable_controller(r8a66597); | ||
| 2483 | |||
| 2469 | for (i = 0; i < R8A66597_MAX_NUM_PIPE; i++) { | 2484 | for (i = 0; i < R8A66597_MAX_NUM_PIPE; i++) { |
| 2470 | INIT_LIST_HEAD(&r8a66597->pipe_queue[i]); | 2485 | INIT_LIST_HEAD(&r8a66597->pipe_queue[i]); |
| 2471 | init_timer(&r8a66597->td_timer[i]); | 2486 | init_timer(&r8a66597->td_timer[i]); |
