Rev 3674 | Rev 4344 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
| Rev 3674 | Rev 4343 | ||
|---|---|---|---|
| Line 37... | Line 37... | ||
| 37 | * devices and logic for dispatching interrupts to IRQ handlers |
37 | * devices and logic for dispatching interrupts to IRQ handlers |
| 38 | * defined by those devices. |
38 | * defined by those devices. |
| 39 | * |
39 | * |
| 40 | * This code is designed to support: |
40 | * This code is designed to support: |
| 41 | * - multiple devices sharing single IRQ |
41 | * - multiple devices sharing single IRQ |
| 42 | * - multiple IRQs per signle device |
42 | * - multiple IRQs per single device |
| - | 43 | * - multiple instances of the same device |
|
| 43 | * |
44 | * |
| 44 | * |
45 | * |
| 45 | * Note about architectures. |
46 | * Note about architectures. |
| 46 | * |
47 | * |
| 47 | * Some architectures has the term IRQ well defined. Examples |
48 | * Some architectures has the term IRQ well defined. Examples |
| Line 142... | Line 143... | ||
| 142 | irq->inr = -1; |
143 | irq->inr = -1; |
| 143 | irq->devno = -1; |
144 | irq->devno = -1; |
| 144 | irq->trigger = (irq_trigger_t) 0; |
145 | irq->trigger = (irq_trigger_t) 0; |
| 145 | irq->claim = NULL; |
146 | irq->claim = NULL; |
| 146 | irq->handler = NULL; |
147 | irq->handler = NULL; |
| 147 | irq->arg = NULL; |
148 | irq->instance = NULL; |
| 148 | irq->cir = NULL; |
149 | irq->cir = NULL; |
| 149 | irq->cir_arg = NULL; |
150 | irq->cir_arg = NULL; |
| 150 | irq->notif_cfg.notify = false; |
151 | irq->notif_cfg.notify = false; |
| 151 | irq->notif_cfg.answerbox = NULL; |
152 | irq->notif_cfg.answerbox = NULL; |
| 152 | irq->notif_cfg.code = NULL; |
153 | irq->notif_cfg.code = NULL; |
| Line 304... | Line 305... | ||
| 304 | bool rv; |
305 | bool rv; |
| 305 | 306 | ||
| 306 | spinlock_lock(&irq->lock); |
307 | spinlock_lock(&irq->lock); |
| 307 | if (devno == -1) { |
308 | if (devno == -1) { |
| 308 | /* Invoked by irq_dispatch_and_lock(). */ |
309 | /* Invoked by irq_dispatch_and_lock(). */ |
| - | 310 | rv = ((irq->inr == inr) && |
|
| 309 | rv = ((irq->inr == inr) && (irq->claim() == IRQ_ACCEPT)); |
311 | (irq->claim(irq->instance) == IRQ_ACCEPT)); |
| 310 | } else { |
312 | } else { |
| 311 | /* Invoked by irq_find_and_lock(). */ |
313 | /* Invoked by irq_find_and_lock(). */ |
| 312 | rv = ((irq->inr == inr) && (irq->devno == devno)); |
314 | rv = ((irq->inr == inr) && (irq->devno == devno)); |
| 313 | } |
315 | } |
| 314 | 316 | ||
| Line 363... | Line 365... | ||
| 363 | bool rv; |
365 | bool rv; |
| 364 | 366 | ||
| 365 | spinlock_lock(&irq->lock); |
367 | spinlock_lock(&irq->lock); |
| 366 | if (devno == -1) { |
368 | if (devno == -1) { |
| 367 | /* Invoked by irq_dispatch_and_lock() */ |
369 | /* Invoked by irq_dispatch_and_lock() */ |
| 368 | rv = (irq->claim() == IRQ_ACCEPT); |
370 | rv = (irq->claim(irq->instance) == IRQ_ACCEPT); |
| 369 | } else { |
371 | } else { |
| 370 | /* Invoked by irq_find_and_lock() */ |
372 | /* Invoked by irq_find_and_lock() */ |
| 371 | rv = (irq->devno == devno); |
373 | rv = (irq->devno == devno); |
| 372 | } |
374 | } |
| 373 | 375 | ||