diff options
author | Thomas Gleixner <tglx@linutronix.de> | 2011-02-12 04:37:36 -0500 |
---|---|---|
committer | Thomas Gleixner <tglx@linutronix.de> | 2011-02-19 06:58:23 -0500 |
commit | 02725e7471b8dd58fa96f6604bdb5dde45405a2e (patch) | |
tree | 7c5243d0a2e33f2165d1531febbe9752fad389c7 /kernel/irq/manage.c | |
parent | d5eb4ad2dfb2dfae43fd51bc8630b4fc3ef00e92 (diff) |
genirq: Use irq_get/put functions
Convert the management functions to use the common irq_get/put
function.
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Diffstat (limited to 'kernel/irq/manage.c')
-rw-r--r-- | kernel/irq/manage.c | 81 |
1 files changed, 31 insertions, 50 deletions
diff --git a/kernel/irq/manage.c b/kernel/irq/manage.c index 99395a24f432..6cca1956c503 100644 --- a/kernel/irq/manage.c +++ b/kernel/irq/manage.c | |||
@@ -172,16 +172,13 @@ int irq_set_affinity(unsigned int irq, const struct cpumask *mask) | |||
172 | 172 | ||
173 | int irq_set_affinity_hint(unsigned int irq, const struct cpumask *m) | 173 | int irq_set_affinity_hint(unsigned int irq, const struct cpumask *m) |
174 | { | 174 | { |
175 | struct irq_desc *desc = irq_to_desc(irq); | ||
176 | unsigned long flags; | 175 | unsigned long flags; |
176 | struct irq_desc *desc = irq_get_desc_lock(irq, &flags); | ||
177 | 177 | ||
178 | if (!desc) | 178 | if (!desc) |
179 | return -EINVAL; | 179 | return -EINVAL; |
180 | |||
181 | raw_spin_lock_irqsave(&desc->lock, flags); | ||
182 | desc->affinity_hint = m; | 180 | desc->affinity_hint = m; |
183 | raw_spin_unlock_irqrestore(&desc->lock, flags); | 181 | irq_put_desc_unlock(desc, flags); |
184 | |||
185 | return 0; | 182 | return 0; |
186 | } | 183 | } |
187 | EXPORT_SYMBOL_GPL(irq_set_affinity_hint); | 184 | EXPORT_SYMBOL_GPL(irq_set_affinity_hint); |
@@ -336,6 +333,18 @@ void __disable_irq(struct irq_desc *desc, unsigned int irq, bool suspend) | |||
336 | irq_disable(desc); | 333 | irq_disable(desc); |
337 | } | 334 | } |
338 | 335 | ||
336 | static int __disable_irq_nosync(unsigned int irq) | ||
337 | { | ||
338 | unsigned long flags; | ||
339 | struct irq_desc *desc = irq_get_desc_buslock(irq, &flags); | ||
340 | |||
341 | if (!desc) | ||
342 | return -EINVAL; | ||
343 | __disable_irq(desc, irq, false); | ||
344 | irq_put_desc_busunlock(desc, flags); | ||
345 | return 0; | ||
346 | } | ||
347 | |||
339 | /** | 348 | /** |
340 | * disable_irq_nosync - disable an irq without waiting | 349 | * disable_irq_nosync - disable an irq without waiting |
341 | * @irq: Interrupt to disable | 350 | * @irq: Interrupt to disable |
@@ -349,17 +358,7 @@ void __disable_irq(struct irq_desc *desc, unsigned int irq, bool suspend) | |||
349 | */ | 358 | */ |
350 | void disable_irq_nosync(unsigned int irq) | 359 | void disable_irq_nosync(unsigned int irq) |
351 | { | 360 | { |
352 | struct irq_desc *desc = irq_to_desc(irq); | 361 | __disable_irq_nosync(irq); |
353 | unsigned long flags; | ||
354 | |||
355 | if (!desc) | ||
356 | return; | ||
357 | |||
358 | chip_bus_lock(desc); | ||
359 | raw_spin_lock_irqsave(&desc->lock, flags); | ||
360 | __disable_irq(desc, irq, false); | ||
361 | raw_spin_unlock_irqrestore(&desc->lock, flags); | ||
362 | chip_bus_sync_unlock(desc); | ||
363 | } | 362 | } |
364 | EXPORT_SYMBOL(disable_irq_nosync); | 363 | EXPORT_SYMBOL(disable_irq_nosync); |
365 | 364 | ||
@@ -377,13 +376,7 @@ EXPORT_SYMBOL(disable_irq_nosync); | |||
377 | */ | 376 | */ |
378 | void disable_irq(unsigned int irq) | 377 | void disable_irq(unsigned int irq) |
379 | { | 378 | { |
380 | struct irq_desc *desc = irq_to_desc(irq); | 379 | if (!__disable_irq_nosync(irq)) |
381 | |||
382 | if (!desc) | ||
383 | return; | ||
384 | |||
385 | disable_irq_nosync(irq); | ||
386 | if (desc->action) | ||
387 | synchronize_irq(irq); | 380 | synchronize_irq(irq); |
388 | } | 381 | } |
389 | EXPORT_SYMBOL(disable_irq); | 382 | EXPORT_SYMBOL(disable_irq); |
@@ -434,21 +427,18 @@ void __enable_irq(struct irq_desc *desc, unsigned int irq, bool resume) | |||
434 | */ | 427 | */ |
435 | void enable_irq(unsigned int irq) | 428 | void enable_irq(unsigned int irq) |
436 | { | 429 | { |
437 | struct irq_desc *desc = irq_to_desc(irq); | ||
438 | unsigned long flags; | 430 | unsigned long flags; |
431 | struct irq_desc *desc = irq_get_desc_buslock(irq, &flags); | ||
439 | 432 | ||
440 | if (!desc) | 433 | if (!desc) |
441 | return; | 434 | return; |
442 | |||
443 | if (WARN(!desc->irq_data.chip, | 435 | if (WARN(!desc->irq_data.chip, |
444 | KERN_ERR "enable_irq before setup/request_irq: irq %u\n", irq)) | 436 | KERN_ERR "enable_irq before setup/request_irq: irq %u\n", irq)) |
445 | return; | 437 | goto out; |
446 | 438 | ||
447 | chip_bus_lock(desc); | ||
448 | raw_spin_lock_irqsave(&desc->lock, flags); | ||
449 | __enable_irq(desc, irq, false); | 439 | __enable_irq(desc, irq, false); |
450 | raw_spin_unlock_irqrestore(&desc->lock, flags); | 440 | out: |
451 | chip_bus_sync_unlock(desc); | 441 | irq_put_desc_busunlock(desc, flags); |
452 | } | 442 | } |
453 | EXPORT_SYMBOL(enable_irq); | 443 | EXPORT_SYMBOL(enable_irq); |
454 | 444 | ||
@@ -477,15 +467,13 @@ static int set_irq_wake_real(unsigned int irq, unsigned int on) | |||
477 | */ | 467 | */ |
478 | int irq_set_irq_wake(unsigned int irq, unsigned int on) | 468 | int irq_set_irq_wake(unsigned int irq, unsigned int on) |
479 | { | 469 | { |
480 | struct irq_desc *desc = irq_to_desc(irq); | ||
481 | unsigned long flags; | 470 | unsigned long flags; |
471 | struct irq_desc *desc = irq_get_desc_buslock(irq, &flags); | ||
482 | int ret = 0; | 472 | int ret = 0; |
483 | 473 | ||
484 | /* wakeup-capable irqs can be shared between drivers that | 474 | /* wakeup-capable irqs can be shared between drivers that |
485 | * don't need to have the same sleep mode behaviors. | 475 | * don't need to have the same sleep mode behaviors. |
486 | */ | 476 | */ |
487 | chip_bus_lock(desc); | ||
488 | raw_spin_lock_irqsave(&desc->lock, flags); | ||
489 | if (on) { | 477 | if (on) { |
490 | if (desc->wake_depth++ == 0) { | 478 | if (desc->wake_depth++ == 0) { |
491 | ret = set_irq_wake_real(irq, on); | 479 | ret = set_irq_wake_real(irq, on); |
@@ -505,9 +493,7 @@ int irq_set_irq_wake(unsigned int irq, unsigned int on) | |||
505 | irqd_clear(&desc->irq_data, IRQD_WAKEUP_STATE); | 493 | irqd_clear(&desc->irq_data, IRQD_WAKEUP_STATE); |
506 | } | 494 | } |
507 | } | 495 | } |
508 | 496 | irq_put_desc_busunlock(desc, flags); | |
509 | raw_spin_unlock_irqrestore(&desc->lock, flags); | ||
510 | chip_bus_sync_unlock(desc); | ||
511 | return ret; | 497 | return ret; |
512 | } | 498 | } |
513 | EXPORT_SYMBOL(irq_set_irq_wake); | 499 | EXPORT_SYMBOL(irq_set_irq_wake); |
@@ -519,25 +505,20 @@ EXPORT_SYMBOL(irq_set_irq_wake); | |||
519 | */ | 505 | */ |
520 | int can_request_irq(unsigned int irq, unsigned long irqflags) | 506 | int can_request_irq(unsigned int irq, unsigned long irqflags) |
521 | { | 507 | { |
522 | struct irq_desc *desc = irq_to_desc(irq); | ||
523 | struct irqaction *action; | ||
524 | unsigned long flags; | 508 | unsigned long flags; |
509 | struct irq_desc *desc = irq_get_desc_lock(irq, &flags); | ||
510 | int canrequest = 0; | ||
525 | 511 | ||
526 | if (!desc) | 512 | if (!desc) |
527 | return 0; | 513 | return 0; |
528 | 514 | ||
529 | if (!irq_settings_can_request(desc)) | 515 | if (irq_settings_can_request(desc)) { |
530 | return 0; | 516 | if (desc->action) |
531 | 517 | if (irqflags & desc->action->flags & IRQF_SHARED) | |
532 | raw_spin_lock_irqsave(&desc->lock, flags); | 518 | canrequest =1; |
533 | action = desc->action; | 519 | } |
534 | if (action) | 520 | irq_put_desc_unlock(desc, flags); |
535 | if (irqflags & action->flags & IRQF_SHARED) | 521 | return canrequest; |
536 | action = NULL; | ||
537 | |||
538 | raw_spin_unlock_irqrestore(&desc->lock, flags); | ||
539 | |||
540 | return !action; | ||
541 | } | 522 | } |
542 | 523 | ||
543 | int __irq_set_trigger(struct irq_desc *desc, unsigned int irq, | 524 | int __irq_set_trigger(struct irq_desc *desc, unsigned int irq, |