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}