diff options
Diffstat (limited to 'drivers/usb/renesas_usbhs/mod.c')
-rw-r--r-- | drivers/usb/renesas_usbhs/mod.c | 25 |
1 files changed, 22 insertions, 3 deletions
diff --git a/drivers/usb/renesas_usbhs/mod.c b/drivers/usb/renesas_usbhs/mod.c index 82a628f96c03..35c5208f3249 100644 --- a/drivers/usb/renesas_usbhs/mod.c +++ b/drivers/usb/renesas_usbhs/mod.c | |||
@@ -209,14 +209,18 @@ int usbhs_status_get_ctrl_stage(struct usbhs_irq_state *irq_state) | |||
209 | return (int)irq_state->intsts0 & CTSQ_MASK; | 209 | return (int)irq_state->intsts0 & CTSQ_MASK; |
210 | } | 210 | } |
211 | 211 | ||
212 | static void usbhs_status_get_each_irq(struct usbhs_priv *priv, | 212 | static int usbhs_status_get_each_irq(struct usbhs_priv *priv, |
213 | struct usbhs_irq_state *state) | 213 | struct usbhs_irq_state *state) |
214 | { | 214 | { |
215 | struct usbhs_mod *mod = usbhs_mod_get_current(priv); | 215 | struct usbhs_mod *mod = usbhs_mod_get_current(priv); |
216 | u16 intenb0, intenb1; | ||
216 | 217 | ||
217 | state->intsts0 = usbhs_read(priv, INTSTS0); | 218 | state->intsts0 = usbhs_read(priv, INTSTS0); |
218 | state->intsts1 = usbhs_read(priv, INTSTS1); | 219 | state->intsts1 = usbhs_read(priv, INTSTS1); |
219 | 220 | ||
221 | intenb0 = usbhs_read(priv, INTENB0); | ||
222 | intenb1 = usbhs_read(priv, INTENB1); | ||
223 | |||
220 | /* mask */ | 224 | /* mask */ |
221 | if (mod) { | 225 | if (mod) { |
222 | state->brdysts = usbhs_read(priv, BRDYSTS); | 226 | state->brdysts = usbhs_read(priv, BRDYSTS); |
@@ -226,6 +230,20 @@ static void usbhs_status_get_each_irq(struct usbhs_priv *priv, | |||
226 | state->bempsts &= mod->irq_bempsts; | 230 | state->bempsts &= mod->irq_bempsts; |
227 | state->brdysts &= mod->irq_brdysts; | 231 | state->brdysts &= mod->irq_brdysts; |
228 | } | 232 | } |
233 | |||
234 | /* | ||
235 | * Check whether the irq enable registers and the irq status are set | ||
236 | * when IRQF_SHARED is set. | ||
237 | */ | ||
238 | if (priv->irqflags & IRQF_SHARED) { | ||
239 | if (!(intenb0 & state->intsts0) && | ||
240 | !(intenb1 & state->intsts1) && | ||
241 | !(state->bempsts) && | ||
242 | !(state->brdysts)) | ||
243 | return -EIO; | ||
244 | } | ||
245 | |||
246 | return 0; | ||
229 | } | 247 | } |
230 | 248 | ||
231 | /* | 249 | /* |
@@ -238,7 +256,8 @@ static irqreturn_t usbhs_interrupt(int irq, void *data) | |||
238 | struct usbhs_priv *priv = data; | 256 | struct usbhs_priv *priv = data; |
239 | struct usbhs_irq_state irq_state; | 257 | struct usbhs_irq_state irq_state; |
240 | 258 | ||
241 | usbhs_status_get_each_irq(priv, &irq_state); | 259 | if (usbhs_status_get_each_irq(priv, &irq_state) < 0) |
260 | return IRQ_NONE; | ||
242 | 261 | ||
243 | /* | 262 | /* |
244 | * clear interrupt | 263 | * clear interrupt |