chip.c (091738a266fc74329ae186f22ff2b3f01319112d) | chip.c (02725e7471b8dd58fa96f6604bdb5dde45405a2e) |
---|---|
1/* 2 * linux/kernel/irq/chip.c 3 * 4 * Copyright (C) 1992, 1998-2006 Linus Torvalds, Ingo Molnar 5 * Copyright (C) 2005-2006, Thomas Gleixner, Russell King 6 * 7 * This file contains the core interrupt handling code, for irq-chip 8 * based architectures. --- 11 unchanged lines hidden (view full) --- 20 21/** 22 * irq_set_chip - set the irq chip for an irq 23 * @irq: irq number 24 * @chip: pointer to irq chip description structure 25 */ 26int irq_set_chip(unsigned int irq, struct irq_chip *chip) 27{ | 1/* 2 * linux/kernel/irq/chip.c 3 * 4 * Copyright (C) 1992, 1998-2006 Linus Torvalds, Ingo Molnar 5 * Copyright (C) 2005-2006, Thomas Gleixner, Russell King 6 * 7 * This file contains the core interrupt handling code, for irq-chip 8 * based architectures. --- 11 unchanged lines hidden (view full) --- 20 21/** 22 * irq_set_chip - set the irq chip for an irq 23 * @irq: irq number 24 * @chip: pointer to irq chip description structure 25 */ 26int irq_set_chip(unsigned int irq, struct irq_chip *chip) 27{ |
28 struct irq_desc *desc = irq_to_desc(irq); | |
29 unsigned long flags; | 28 unsigned long flags; |
29 struct irq_desc *desc = irq_get_desc_lock(irq, &flags); |
|
30 | 30 |
31 if (!desc) { 32 WARN(1, KERN_ERR "Trying to install chip for IRQ%d\n", irq); | 31 if (!desc) |
33 return -EINVAL; | 32 return -EINVAL; |
34 } | |
35 36 if (!chip) 37 chip = &no_irq_chip; 38 | 33 34 if (!chip) 35 chip = &no_irq_chip; 36 |
39 raw_spin_lock_irqsave(&desc->lock, flags); | |
40 irq_chip_set_defaults(chip); 41 desc->irq_data.chip = chip; | 37 irq_chip_set_defaults(chip); 38 desc->irq_data.chip = chip; |
42 raw_spin_unlock_irqrestore(&desc->lock, flags); 43 | 39 irq_put_desc_unlock(desc, flags); |
44 return 0; 45} 46EXPORT_SYMBOL(irq_set_chip); 47 48/** 49 * irq_set_type - set the irq trigger type for an irq 50 * @irq: irq number 51 * @type: IRQ_TYPE_{LEVEL,EDGE}_* value - see include/linux/irq.h 52 */ 53int irq_set_irq_type(unsigned int irq, unsigned int type) 54{ | 40 return 0; 41} 42EXPORT_SYMBOL(irq_set_chip); 43 44/** 45 * irq_set_type - set the irq trigger type for an irq 46 * @irq: irq number 47 * @type: IRQ_TYPE_{LEVEL,EDGE}_* value - see include/linux/irq.h 48 */ 49int irq_set_irq_type(unsigned int irq, unsigned int type) 50{ |
55 struct irq_desc *desc = irq_to_desc(irq); | |
56 unsigned long flags; | 51 unsigned long flags; |
57 int ret = -ENXIO; | 52 struct irq_desc *desc = irq_get_desc_buslock(irq, &flags); 53 int ret = 0; |
58 | 54 |
59 if (!desc) { 60 printk(KERN_ERR "Trying to set irq type for IRQ%d\n", irq); 61 return -ENODEV; 62 } | 55 if (!desc) 56 return -EINVAL; |
63 64 type &= IRQ_TYPE_SENSE_MASK; | 57 58 type &= IRQ_TYPE_SENSE_MASK; |
65 if (type == IRQ_TYPE_NONE) 66 return 0; 67 68 chip_bus_lock(desc); 69 raw_spin_lock_irqsave(&desc->lock, flags); 70 ret = __irq_set_trigger(desc, irq, type); 71 raw_spin_unlock_irqrestore(&desc->lock, flags); 72 chip_bus_sync_unlock(desc); | 59 if (type != IRQ_TYPE_NONE) 60 ret = __irq_set_trigger(desc, irq, type); 61 irq_put_desc_busunlock(desc, flags); |
73 return ret; 74} 75EXPORT_SYMBOL(irq_set_irq_type); 76 77/** 78 * irq_set_handler_data - set irq handler data for an irq 79 * @irq: Interrupt number 80 * @data: Pointer to interrupt specific data 81 * 82 * Set the hardware irq controller data for an irq 83 */ 84int irq_set_handler_data(unsigned int irq, void *data) 85{ | 62 return ret; 63} 64EXPORT_SYMBOL(irq_set_irq_type); 65 66/** 67 * irq_set_handler_data - set irq handler data for an irq 68 * @irq: Interrupt number 69 * @data: Pointer to interrupt specific data 70 * 71 * Set the hardware irq controller data for an irq 72 */ 73int irq_set_handler_data(unsigned int irq, void *data) 74{ |
86 struct irq_desc *desc = irq_to_desc(irq); | |
87 unsigned long flags; | 75 unsigned long flags; |
76 struct irq_desc *desc = irq_get_desc_lock(irq, &flags); |
|
88 | 77 |
89 if (!desc) { 90 printk(KERN_ERR 91 "Trying to install controller data for IRQ%d\n", irq); | 78 if (!desc) |
92 return -EINVAL; | 79 return -EINVAL; |
93 } 94 95 raw_spin_lock_irqsave(&desc->lock, flags); | |
96 desc->irq_data.handler_data = data; | 80 desc->irq_data.handler_data = data; |
97 raw_spin_unlock_irqrestore(&desc->lock, flags); | 81 irq_put_desc_unlock(desc, flags); |
98 return 0; 99} 100EXPORT_SYMBOL(irq_set_handler_data); 101 102/** 103 * irq_set_msi_desc - set MSI descriptor data for an irq 104 * @irq: Interrupt number 105 * @entry: Pointer to MSI descriptor data 106 * 107 * Set the MSI descriptor entry for an irq 108 */ 109int irq_set_msi_desc(unsigned int irq, struct msi_desc *entry) 110{ | 82 return 0; 83} 84EXPORT_SYMBOL(irq_set_handler_data); 85 86/** 87 * irq_set_msi_desc - set MSI descriptor data for an irq 88 * @irq: Interrupt number 89 * @entry: Pointer to MSI descriptor data 90 * 91 * Set the MSI descriptor entry for an irq 92 */ 93int irq_set_msi_desc(unsigned int irq, struct msi_desc *entry) 94{ |
111 struct irq_desc *desc = irq_to_desc(irq); | |
112 unsigned long flags; | 95 unsigned long flags; |
96 struct irq_desc *desc = irq_get_desc_lock(irq, &flags); |
|
113 | 97 |
114 if (!desc) { 115 printk(KERN_ERR 116 "Trying to install msi data for IRQ%d\n", irq); | 98 if (!desc) |
117 return -EINVAL; | 99 return -EINVAL; |
118 } 119 120 raw_spin_lock_irqsave(&desc->lock, flags); | |
121 desc->irq_data.msi_desc = entry; 122 if (entry) 123 entry->irq = irq; | 100 desc->irq_data.msi_desc = entry; 101 if (entry) 102 entry->irq = irq; |
124 raw_spin_unlock_irqrestore(&desc->lock, flags); | 103 irq_put_desc_unlock(desc, flags); |
125 return 0; 126} 127 128/** 129 * irq_set_chip_data - set irq chip data for an irq 130 * @irq: Interrupt number 131 * @data: Pointer to chip specific data 132 * 133 * Set the hardware irq chip data for an irq 134 */ 135int irq_set_chip_data(unsigned int irq, void *data) 136{ | 104 return 0; 105} 106 107/** 108 * irq_set_chip_data - set irq chip data for an irq 109 * @irq: Interrupt number 110 * @data: Pointer to chip specific data 111 * 112 * Set the hardware irq chip data for an irq 113 */ 114int irq_set_chip_data(unsigned int irq, void *data) 115{ |
137 struct irq_desc *desc = irq_to_desc(irq); | |
138 unsigned long flags; | 116 unsigned long flags; |
117 struct irq_desc *desc = irq_get_desc_lock(irq, &flags); |
|
139 | 118 |
140 if (!desc) { 141 printk(KERN_ERR 142 "Trying to install chip data for IRQ%d\n", irq); | 119 if (!desc) |
143 return -EINVAL; | 120 return -EINVAL; |
144 } 145 146 if (!desc->irq_data.chip) { 147 printk(KERN_ERR "BUG: bad set_irq_chip_data(IRQ#%d)\n", irq); 148 return -EINVAL; 149 } 150 151 raw_spin_lock_irqsave(&desc->lock, flags); | |
152 desc->irq_data.chip_data = data; | 121 desc->irq_data.chip_data = data; |
153 raw_spin_unlock_irqrestore(&desc->lock, flags); 154 | 122 irq_put_desc_unlock(desc, flags); |
155 return 0; 156} 157EXPORT_SYMBOL(irq_set_chip_data); 158 159struct irq_data *irq_get_irq_data(unsigned int irq) 160{ 161 struct irq_desc *desc = irq_to_desc(irq); 162 --- 467 unchanged lines hidden (view full) --- 630 if (chip->irq_eoi) 631 chip->irq_eoi(&desc->irq_data); 632} 633 634void 635__set_irq_handler(unsigned int irq, irq_flow_handler_t handle, int is_chained, 636 const char *name) 637{ | 123 return 0; 124} 125EXPORT_SYMBOL(irq_set_chip_data); 126 127struct irq_data *irq_get_irq_data(unsigned int irq) 128{ 129 struct irq_desc *desc = irq_to_desc(irq); 130 --- 467 unchanged lines hidden (view full) --- 598 if (chip->irq_eoi) 599 chip->irq_eoi(&desc->irq_data); 600} 601 602void 603__set_irq_handler(unsigned int irq, irq_flow_handler_t handle, int is_chained, 604 const char *name) 605{ |
638 struct irq_desc *desc = irq_to_desc(irq); | |
639 unsigned long flags; | 606 unsigned long flags; |
607 struct irq_desc *desc = irq_get_desc_buslock(irq, &flags); |
|
640 | 608 |
641 if (!desc) { 642 printk(KERN_ERR 643 "Trying to install type control for IRQ%d\n", irq); | 609 if (!desc) |
644 return; | 610 return; |
645 } | |
646 647 if (!handle) { 648 handle = handle_bad_irq; 649 } else { 650 if (WARN_ON(desc->irq_data.chip == &no_irq_chip)) | 611 612 if (!handle) { 613 handle = handle_bad_irq; 614 } else { 615 if (WARN_ON(desc->irq_data.chip == &no_irq_chip)) |
651 return; | 616 goto out; |
652 } 653 | 617 } 618 |
654 chip_bus_lock(desc); 655 raw_spin_lock_irqsave(&desc->lock, flags); 656 | |
657 /* Uninstall? */ 658 if (handle == handle_bad_irq) { 659 if (desc->irq_data.chip != &no_irq_chip) 660 mask_ack_irq(desc); 661 irq_compat_set_disabled(desc); 662 desc->istate |= IRQS_DISABLED; 663 desc->depth = 1; 664 } 665 desc->handle_irq = handle; 666 desc->name = name; 667 668 if (handle != handle_bad_irq && is_chained) { 669 irq_settings_set_noprobe(desc); 670 irq_settings_set_norequest(desc); 671 irq_startup(desc); 672 } | 619 /* Uninstall? */ 620 if (handle == handle_bad_irq) { 621 if (desc->irq_data.chip != &no_irq_chip) 622 mask_ack_irq(desc); 623 irq_compat_set_disabled(desc); 624 desc->istate |= IRQS_DISABLED; 625 desc->depth = 1; 626 } 627 desc->handle_irq = handle; 628 desc->name = name; 629 630 if (handle != handle_bad_irq && is_chained) { 631 irq_settings_set_noprobe(desc); 632 irq_settings_set_norequest(desc); 633 irq_startup(desc); 634 } |
673 raw_spin_unlock_irqrestore(&desc->lock, flags); 674 chip_bus_sync_unlock(desc); | 635out: 636 irq_put_desc_busunlock(desc, flags); |
675} 676EXPORT_SYMBOL_GPL(__set_irq_handler); 677 678void 679set_irq_chip_and_handler(unsigned int irq, struct irq_chip *chip, 680 irq_flow_handler_t handle) 681{ 682 irq_set_chip(irq, chip); --- 5 unchanged lines hidden (view full) --- 688 irq_flow_handler_t handle, const char *name) 689{ 690 irq_set_chip(irq, chip); 691 __set_irq_handler(irq, handle, 0, name); 692} 693 694void irq_modify_status(unsigned int irq, unsigned long clr, unsigned long set) 695{ | 637} 638EXPORT_SYMBOL_GPL(__set_irq_handler); 639 640void 641set_irq_chip_and_handler(unsigned int irq, struct irq_chip *chip, 642 irq_flow_handler_t handle) 643{ 644 irq_set_chip(irq, chip); --- 5 unchanged lines hidden (view full) --- 650 irq_flow_handler_t handle, const char *name) 651{ 652 irq_set_chip(irq, chip); 653 __set_irq_handler(irq, handle, 0, name); 654} 655 656void irq_modify_status(unsigned int irq, unsigned long clr, unsigned long set) 657{ |
696 struct irq_desc *desc = irq_to_desc(irq); | |
697 unsigned long flags; | 658 unsigned long flags; |
659 struct irq_desc *desc = irq_get_desc_lock(irq, &flags); |
|
698 699 if (!desc) 700 return; | 660 661 if (!desc) 662 return; |
701 702 raw_spin_lock_irqsave(&desc->lock, flags); 703 | |
704 irq_settings_clr_and_set(desc, clr, set); 705 706 irqd_clear(&desc->irq_data, IRQD_NO_BALANCING | IRQD_PER_CPU | 707 IRQD_TRIGGER_MASK | IRQD_LEVEL | IRQD_MOVE_PCNTXT); 708 if (irq_settings_has_no_balance_set(desc)) 709 irqd_set(&desc->irq_data, IRQD_NO_BALANCING); 710 if (irq_settings_is_per_cpu(desc)) 711 irqd_set(&desc->irq_data, IRQD_PER_CPU); 712 if (irq_settings_can_move_pcntxt(desc)) 713 irqd_set(&desc->irq_data, IRQD_MOVE_PCNTXT); 714 715 irqd_set(&desc->irq_data, irq_settings_get_trigger_mask(desc)); 716 | 663 irq_settings_clr_and_set(desc, clr, set); 664 665 irqd_clear(&desc->irq_data, IRQD_NO_BALANCING | IRQD_PER_CPU | 666 IRQD_TRIGGER_MASK | IRQD_LEVEL | IRQD_MOVE_PCNTXT); 667 if (irq_settings_has_no_balance_set(desc)) 668 irqd_set(&desc->irq_data, IRQD_NO_BALANCING); 669 if (irq_settings_is_per_cpu(desc)) 670 irqd_set(&desc->irq_data, IRQD_PER_CPU); 671 if (irq_settings_can_move_pcntxt(desc)) 672 irqd_set(&desc->irq_data, IRQD_MOVE_PCNTXT); 673 674 irqd_set(&desc->irq_data, irq_settings_get_trigger_mask(desc)); 675 |
717 raw_spin_unlock_irqrestore(&desc->lock, flags); | 676 irq_put_desc_unlock(desc, flags); |
718} | 677} |