aboutsummaryrefslogtreecommitdiffstats
path: root/kernel/irq/manage.c
diff options
context:
space:
mode:
authorThomas Gleixner <tglx@linutronix.de>2011-02-12 04:37:36 -0500
committerThomas Gleixner <tglx@linutronix.de>2011-02-19 06:58:23 -0500
commit02725e7471b8dd58fa96f6604bdb5dde45405a2e (patch)
tree7c5243d0a2e33f2165d1531febbe9752fad389c7 /kernel/irq/manage.c
parentd5eb4ad2dfb2dfae43fd51bc8630b4fc3ef00e92 (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.c81
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
173int irq_set_affinity_hint(unsigned int irq, const struct cpumask *m) 173int 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}
187EXPORT_SYMBOL_GPL(irq_set_affinity_hint); 184EXPORT_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
336static 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 */
350void disable_irq_nosync(unsigned int irq) 359void 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}
364EXPORT_SYMBOL(disable_irq_nosync); 363EXPORT_SYMBOL(disable_irq_nosync);
365 364
@@ -377,13 +376,7 @@ EXPORT_SYMBOL(disable_irq_nosync);
377 */ 376 */
378void disable_irq(unsigned int irq) 377void 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}
389EXPORT_SYMBOL(disable_irq); 382EXPORT_SYMBOL(disable_irq);
@@ -434,21 +427,18 @@ void __enable_irq(struct irq_desc *desc, unsigned int irq, bool resume)
434 */ 427 */
435void enable_irq(unsigned int irq) 428void 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); 440out:
451 chip_bus_sync_unlock(desc); 441 irq_put_desc_busunlock(desc, flags);
452} 442}
453EXPORT_SYMBOL(enable_irq); 443EXPORT_SYMBOL(enable_irq);
454 444
@@ -477,15 +467,13 @@ static int set_irq_wake_real(unsigned int irq, unsigned int on)
477 */ 467 */
478int irq_set_irq_wake(unsigned int irq, unsigned int on) 468int 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}
513EXPORT_SYMBOL(irq_set_irq_wake); 499EXPORT_SYMBOL(irq_set_irq_wake);
@@ -519,25 +505,20 @@ EXPORT_SYMBOL(irq_set_irq_wake);
519 */ 505 */
520int can_request_irq(unsigned int irq, unsigned long irqflags) 506int 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
543int __irq_set_trigger(struct irq_desc *desc, unsigned int irq, 524int __irq_set_trigger(struct irq_desc *desc, unsigned int irq,