diff options
Diffstat (limited to 'kernel/irq/irqdesc.c')
| -rw-r--r-- | kernel/irq/irqdesc.c | 32 |
1 files changed, 31 insertions, 1 deletions
diff --git a/kernel/irq/irqdesc.c b/kernel/irq/irqdesc.c index 039b889ea053..1550e8447a16 100644 --- a/kernel/irq/irqdesc.c +++ b/kernel/irq/irqdesc.c | |||
| @@ -424,11 +424,22 @@ unsigned int irq_get_next_irq(unsigned int offset) | |||
| 424 | } | 424 | } |
| 425 | 425 | ||
| 426 | struct irq_desc * | 426 | struct irq_desc * |
| 427 | __irq_get_desc_lock(unsigned int irq, unsigned long *flags, bool bus) | 427 | __irq_get_desc_lock(unsigned int irq, unsigned long *flags, bool bus, |
| 428 | unsigned int check) | ||
| 428 | { | 429 | { |
| 429 | struct irq_desc *desc = irq_to_desc(irq); | 430 | struct irq_desc *desc = irq_to_desc(irq); |
| 430 | 431 | ||
| 431 | if (desc) { | 432 | if (desc) { |
| 433 | if (check & _IRQ_DESC_CHECK) { | ||
| 434 | if ((check & _IRQ_DESC_PERCPU) && | ||
| 435 | !irq_settings_is_per_cpu_devid(desc)) | ||
| 436 | return NULL; | ||
| 437 | |||
| 438 | if (!(check & _IRQ_DESC_PERCPU) && | ||
| 439 | irq_settings_is_per_cpu_devid(desc)) | ||
| 440 | return NULL; | ||
| 441 | } | ||
| 442 | |||
| 432 | if (bus) | 443 | if (bus) |
| 433 | chip_bus_lock(desc); | 444 | chip_bus_lock(desc); |
| 434 | raw_spin_lock_irqsave(&desc->lock, *flags); | 445 | raw_spin_lock_irqsave(&desc->lock, *flags); |
| @@ -443,6 +454,25 @@ void __irq_put_desc_unlock(struct irq_desc *desc, unsigned long flags, bool bus) | |||
| 443 | chip_bus_sync_unlock(desc); | 454 | chip_bus_sync_unlock(desc); |
| 444 | } | 455 | } |
| 445 | 456 | ||
| 457 | int irq_set_percpu_devid(unsigned int irq) | ||
| 458 | { | ||
| 459 | struct irq_desc *desc = irq_to_desc(irq); | ||
| 460 | |||
| 461 | if (!desc) | ||
| 462 | return -EINVAL; | ||
| 463 | |||
| 464 | if (desc->percpu_enabled) | ||
| 465 | return -EINVAL; | ||
| 466 | |||
| 467 | desc->percpu_enabled = kzalloc(sizeof(*desc->percpu_enabled), GFP_KERNEL); | ||
| 468 | |||
| 469 | if (!desc->percpu_enabled) | ||
| 470 | return -ENOMEM; | ||
| 471 | |||
| 472 | irq_set_percpu_devid_flags(irq); | ||
| 473 | return 0; | ||
| 474 | } | ||
| 475 | |||
| 446 | /** | 476 | /** |
| 447 | * dynamic_irq_cleanup - cleanup a dynamically allocated irq | 477 | * dynamic_irq_cleanup - cleanup a dynamically allocated irq |
| 448 | * @irq: irq number to initialize | 478 | * @irq: irq number to initialize |
