19
19
#include "internals.h"
22
* set_irq_chip - set the irq chip for an irq
22
* irq_set_chip - set the irq chip for an irq
24
24
* @chip: pointer to irq chip description structure
26
int set_irq_chip(unsigned int irq, struct irq_chip *chip)
26
int irq_set_chip(unsigned int irq, struct irq_chip *chip)
28
struct irq_desc *desc = irq_to_desc(irq);
29
28
unsigned long flags;
29
struct irq_desc *desc = irq_get_desc_lock(irq, &flags);
32
WARN(1, KERN_ERR "Trying to install chip for IRQ%d\n", irq);
37
35
chip = &no_irq_chip;
39
raw_spin_lock_irqsave(&desc->lock, flags);
40
irq_chip_set_defaults(chip);
41
37
desc->irq_data.chip = chip;
42
raw_spin_unlock_irqrestore(&desc->lock, flags);
38
irq_put_desc_unlock(desc, flags);
40
* For !CONFIG_SPARSE_IRQ make the irq show up in
41
* allocated_irqs. For the CONFIG_SPARSE_IRQ case, it is
42
* already marked, and this call is harmless.
46
EXPORT_SYMBOL(set_irq_chip);
47
EXPORT_SYMBOL(irq_set_chip);
49
* set_irq_type - set the irq trigger type for an irq
50
* irq_set_type - set the irq trigger type for an irq
51
52
* @type: IRQ_TYPE_{LEVEL,EDGE}_* value - see include/linux/irq.h
53
int set_irq_type(unsigned int irq, unsigned int type)
54
int irq_set_irq_type(unsigned int irq, unsigned int type)
55
struct irq_desc *desc = irq_to_desc(irq);
56
56
unsigned long flags;
57
struct irq_desc *desc = irq_get_desc_buslock(irq, &flags);
60
printk(KERN_ERR "Trying to set irq type for IRQ%d\n", irq);
64
63
type &= IRQ_TYPE_SENSE_MASK;
65
if (type == IRQ_TYPE_NONE)
68
raw_spin_lock_irqsave(&desc->lock, flags);
69
ret = __irq_set_trigger(desc, irq, type);
70
raw_spin_unlock_irqrestore(&desc->lock, flags);
64
if (type != IRQ_TYPE_NONE)
65
ret = __irq_set_trigger(desc, irq, type);
66
irq_put_desc_busunlock(desc, flags);
73
EXPORT_SYMBOL(set_irq_type);
69
EXPORT_SYMBOL(irq_set_irq_type);
76
* set_irq_data - set irq type data for an irq
72
* irq_set_handler_data - set irq handler data for an irq
77
73
* @irq: Interrupt number
78
74
* @data: Pointer to interrupt specific data
80
76
* Set the hardware irq controller data for an irq
82
int set_irq_data(unsigned int irq, void *data)
78
int irq_set_handler_data(unsigned int irq, void *data)
84
struct irq_desc *desc = irq_to_desc(irq);
85
80
unsigned long flags;
81
struct irq_desc *desc = irq_get_desc_lock(irq, &flags);
89
"Trying to install controller data for IRQ%d\n", irq);
93
raw_spin_lock_irqsave(&desc->lock, flags);
94
85
desc->irq_data.handler_data = data;
95
raw_spin_unlock_irqrestore(&desc->lock, flags);
86
irq_put_desc_unlock(desc, flags);
98
EXPORT_SYMBOL(set_irq_data);
89
EXPORT_SYMBOL(irq_set_handler_data);
101
* set_irq_msi - set MSI descriptor data for an irq
92
* irq_set_msi_desc - set MSI descriptor data for an irq
102
93
* @irq: Interrupt number
103
94
* @entry: Pointer to MSI descriptor data
105
96
* Set the MSI descriptor entry for an irq
107
int set_irq_msi(unsigned int irq, struct msi_desc *entry)
98
int irq_set_msi_desc(unsigned int irq, struct msi_desc *entry)
109
struct irq_desc *desc = irq_to_desc(irq);
110
100
unsigned long flags;
101
struct irq_desc *desc = irq_get_desc_lock(irq, &flags);
114
"Trying to install msi data for IRQ%d\n", irq);
118
raw_spin_lock_irqsave(&desc->lock, flags);
119
105
desc->irq_data.msi_desc = entry;
121
107
entry->irq = irq;
122
raw_spin_unlock_irqrestore(&desc->lock, flags);
108
irq_put_desc_unlock(desc, flags);
127
* set_irq_chip_data - set irq chip data for an irq
113
* irq_set_chip_data - set irq chip data for an irq
128
114
* @irq: Interrupt number
129
115
* @data: Pointer to chip specific data
131
117
* Set the hardware irq chip data for an irq
133
int set_irq_chip_data(unsigned int irq, void *data)
119
int irq_set_chip_data(unsigned int irq, void *data)
135
struct irq_desc *desc = irq_to_desc(irq);
136
121
unsigned long flags;
140
"Trying to install chip data for IRQ%d\n", irq);
144
if (!desc->irq_data.chip) {
145
printk(KERN_ERR "BUG: bad set_irq_chip_data(IRQ#%d)\n", irq);
149
raw_spin_lock_irqsave(&desc->lock, flags);
122
struct irq_desc *desc = irq_get_desc_lock(irq, &flags);
150
126
desc->irq_data.chip_data = data;
151
raw_spin_unlock_irqrestore(&desc->lock, flags);
127
irq_put_desc_unlock(desc, flags);
155
EXPORT_SYMBOL(set_irq_chip_data);
130
EXPORT_SYMBOL(irq_set_chip_data);
157
132
struct irq_data *irq_get_irq_data(unsigned int irq)
163
138
EXPORT_SYMBOL_GPL(irq_get_irq_data);
166
* set_irq_nested_thread - Set/Reset the IRQ_NESTED_THREAD flag of an irq
168
* @irq: Interrupt number
169
* @nest: 0 to clear / 1 to set the IRQ_NESTED_THREAD flag
171
* The IRQ_NESTED_THREAD flag indicates that on
172
* request_threaded_irq() no separate interrupt thread should be
173
* created for the irq as the handler are called nested in the
174
* context of a demultiplexing interrupt handler thread.
176
void set_irq_nested_thread(unsigned int irq, int nest)
178
struct irq_desc *desc = irq_to_desc(irq);
184
raw_spin_lock_irqsave(&desc->lock, flags);
186
desc->status |= IRQ_NESTED_THREAD;
188
desc->status &= ~IRQ_NESTED_THREAD;
189
raw_spin_unlock_irqrestore(&desc->lock, flags);
191
EXPORT_SYMBOL_GPL(set_irq_nested_thread);
194
* default enable function
196
static void default_enable(struct irq_data *data)
198
struct irq_desc *desc = irq_data_to_desc(data);
200
desc->irq_data.chip->irq_unmask(&desc->irq_data);
201
desc->status &= ~IRQ_MASKED;
205
* default disable function
207
static void default_disable(struct irq_data *data)
212
* default startup function
214
static unsigned int default_startup(struct irq_data *data)
216
struct irq_desc *desc = irq_data_to_desc(data);
218
desc->irq_data.chip->irq_enable(data);
140
static void irq_state_clr_disabled(struct irq_desc *desc)
142
irqd_clear(&desc->irq_data, IRQD_IRQ_DISABLED);
145
static void irq_state_set_disabled(struct irq_desc *desc)
147
irqd_set(&desc->irq_data, IRQD_IRQ_DISABLED);
150
static void irq_state_clr_masked(struct irq_desc *desc)
152
irqd_clear(&desc->irq_data, IRQD_IRQ_MASKED);
155
static void irq_state_set_masked(struct irq_desc *desc)
157
irqd_set(&desc->irq_data, IRQD_IRQ_MASKED);
160
int irq_startup(struct irq_desc *desc)
162
irq_state_clr_disabled(desc);
165
if (desc->irq_data.chip->irq_startup) {
166
int ret = desc->irq_data.chip->irq_startup(&desc->irq_data);
167
irq_state_clr_masked(desc);
223
* default shutdown function
225
static void default_shutdown(struct irq_data *data)
227
struct irq_desc *desc = irq_data_to_desc(data);
229
desc->irq_data.chip->irq_mask(&desc->irq_data);
230
desc->status |= IRQ_MASKED;
233
#ifndef CONFIG_GENERIC_HARDIRQS_NO_DEPRECATED
234
/* Temporary migration helpers */
235
static void compat_irq_mask(struct irq_data *data)
237
data->chip->mask(data->irq);
240
static void compat_irq_unmask(struct irq_data *data)
242
data->chip->unmask(data->irq);
245
static void compat_irq_ack(struct irq_data *data)
247
data->chip->ack(data->irq);
250
static void compat_irq_mask_ack(struct irq_data *data)
252
data->chip->mask_ack(data->irq);
255
static void compat_irq_eoi(struct irq_data *data)
257
data->chip->eoi(data->irq);
260
static void compat_irq_enable(struct irq_data *data)
262
data->chip->enable(data->irq);
265
static void compat_irq_disable(struct irq_data *data)
267
data->chip->disable(data->irq);
270
static void compat_irq_shutdown(struct irq_data *data)
272
data->chip->shutdown(data->irq);
275
static unsigned int compat_irq_startup(struct irq_data *data)
277
return data->chip->startup(data->irq);
280
static int compat_irq_set_affinity(struct irq_data *data,
281
const struct cpumask *dest, bool force)
283
return data->chip->set_affinity(data->irq, dest);
286
static int compat_irq_set_type(struct irq_data *data, unsigned int type)
288
return data->chip->set_type(data->irq, type);
291
static int compat_irq_set_wake(struct irq_data *data, unsigned int on)
293
return data->chip->set_wake(data->irq, on);
296
static int compat_irq_retrigger(struct irq_data *data)
298
return data->chip->retrigger(data->irq);
301
static void compat_bus_lock(struct irq_data *data)
303
data->chip->bus_lock(data->irq);
306
static void compat_bus_sync_unlock(struct irq_data *data)
308
data->chip->bus_sync_unlock(data->irq);
313
* Fixup enable/disable function pointers
315
void irq_chip_set_defaults(struct irq_chip *chip)
317
#ifndef CONFIG_GENERIC_HARDIRQS_NO_DEPRECATED
319
* Compat fixup functions need to be before we set the
320
* defaults for enable/disable/startup/shutdown
323
chip->irq_enable = compat_irq_enable;
325
chip->irq_disable = compat_irq_disable;
327
chip->irq_shutdown = compat_irq_shutdown;
329
chip->irq_startup = compat_irq_startup;
334
if (!chip->irq_enable)
335
chip->irq_enable = default_enable;
336
if (!chip->irq_disable)
337
chip->irq_disable = default_disable;
338
if (!chip->irq_startup)
339
chip->irq_startup = default_startup;
341
* We use chip->irq_disable, when the user provided its own. When
342
* we have default_disable set for chip->irq_disable, then we need
343
* to use default_shutdown, otherwise the irq line is not
344
* disabled on free_irq():
346
if (!chip->irq_shutdown)
347
chip->irq_shutdown = chip->irq_disable != default_disable ?
348
chip->irq_disable : default_shutdown;
350
#ifndef CONFIG_GENERIC_HARDIRQS_NO_DEPRECATED
352
chip->end = dummy_irq_chip.end;
355
* Now fix up the remaining compat handlers
358
chip->irq_bus_lock = compat_bus_lock;
359
if (chip->bus_sync_unlock)
360
chip->irq_bus_sync_unlock = compat_bus_sync_unlock;
362
chip->irq_mask = compat_irq_mask;
364
chip->irq_unmask = compat_irq_unmask;
366
chip->irq_ack = compat_irq_ack;
368
chip->irq_mask_ack = compat_irq_mask_ack;
370
chip->irq_eoi = compat_irq_eoi;
371
if (chip->set_affinity)
372
chip->irq_set_affinity = compat_irq_set_affinity;
374
chip->irq_set_type = compat_irq_set_type;
376
chip->irq_set_wake = compat_irq_set_wake;
378
chip->irq_retrigger = compat_irq_retrigger;
175
void irq_shutdown(struct irq_desc *desc)
177
irq_state_set_disabled(desc);
179
if (desc->irq_data.chip->irq_shutdown)
180
desc->irq_data.chip->irq_shutdown(&desc->irq_data);
181
if (desc->irq_data.chip->irq_disable)
182
desc->irq_data.chip->irq_disable(&desc->irq_data);
184
desc->irq_data.chip->irq_mask(&desc->irq_data);
185
irq_state_set_masked(desc);
188
void irq_enable(struct irq_desc *desc)
190
irq_state_clr_disabled(desc);
191
if (desc->irq_data.chip->irq_enable)
192
desc->irq_data.chip->irq_enable(&desc->irq_data);
194
desc->irq_data.chip->irq_unmask(&desc->irq_data);
195
irq_state_clr_masked(desc);
198
void irq_disable(struct irq_desc *desc)
200
irq_state_set_disabled(desc);
201
if (desc->irq_data.chip->irq_disable) {
202
desc->irq_data.chip->irq_disable(&desc->irq_data);
203
irq_state_set_masked(desc);
382
207
static inline void mask_ack_irq(struct irq_desc *desc)
502
326
handle_level_irq(unsigned int irq, struct irq_desc *desc)
504
struct irqaction *action;
505
irqreturn_t action_ret;
507
328
raw_spin_lock(&desc->lock);
508
329
mask_ack_irq(desc);
510
if (unlikely(desc->status & IRQ_INPROGRESS))
512
desc->status &= ~(IRQ_REPLAY | IRQ_WAITING);
331
if (unlikely(irqd_irq_inprogress(&desc->irq_data)))
332
if (!irq_check_poll(desc))
335
desc->istate &= ~(IRQS_REPLAY | IRQS_WAITING);
513
336
kstat_incr_irqs_this_cpu(irq, desc);
516
339
* If its disabled or no action available
517
340
* keep it masked and get out of here
519
action = desc->action;
520
if (unlikely(!action || (desc->status & IRQ_DISABLED)))
342
if (unlikely(!desc->action || irqd_irq_disabled(&desc->irq_data)))
523
desc->status |= IRQ_INPROGRESS;
524
raw_spin_unlock(&desc->lock);
526
action_ret = handle_IRQ_event(irq, action);
528
note_interrupt(irq, desc, action_ret);
530
raw_spin_lock(&desc->lock);
531
desc->status &= ~IRQ_INPROGRESS;
533
if (!(desc->status & (IRQ_DISABLED | IRQ_ONESHOT)))
345
handle_irq_event(desc);
347
if (!irqd_irq_disabled(&desc->irq_data) && !(desc->istate & IRQS_ONESHOT))
534
348
unmask_irq(desc);
536
350
raw_spin_unlock(&desc->lock);
538
352
EXPORT_SYMBOL_GPL(handle_level_irq);
354
#ifdef CONFIG_IRQ_PREFLOW_FASTEOI
355
static inline void preflow_handler(struct irq_desc *desc)
357
if (desc->preflow_handler)
358
desc->preflow_handler(&desc->irq_data);
361
static inline void preflow_handler(struct irq_desc *desc) { }
541
365
* handle_fasteoi_irq - irq handler for transparent controllers
542
366
* @irq: the interrupt number
551
375
handle_fasteoi_irq(unsigned int irq, struct irq_desc *desc)
553
struct irqaction *action;
554
irqreturn_t action_ret;
556
377
raw_spin_lock(&desc->lock);
558
if (unlikely(desc->status & IRQ_INPROGRESS))
379
if (unlikely(irqd_irq_inprogress(&desc->irq_data)))
380
if (!irq_check_poll(desc))
561
desc->status &= ~(IRQ_REPLAY | IRQ_WAITING);
383
desc->istate &= ~(IRQS_REPLAY | IRQS_WAITING);
562
384
kstat_incr_irqs_this_cpu(irq, desc);
565
387
* If its disabled or no action available
566
388
* then mask it and get out of here:
568
action = desc->action;
569
if (unlikely(!action || (desc->status & IRQ_DISABLED))) {
570
desc->status |= IRQ_PENDING;
390
if (unlikely(!desc->action || irqd_irq_disabled(&desc->irq_data))) {
391
desc->istate |= IRQS_PENDING;
575
desc->status |= IRQ_INPROGRESS;
576
desc->status &= ~IRQ_PENDING;
577
raw_spin_unlock(&desc->lock);
579
action_ret = handle_IRQ_event(irq, action);
581
note_interrupt(irq, desc, action_ret);
583
raw_spin_lock(&desc->lock);
584
desc->status &= ~IRQ_INPROGRESS;
396
if (desc->istate & IRQS_ONESHOT)
399
preflow_handler(desc);
400
handle_irq_event(desc);
586
403
desc->irq_data.chip->irq_eoi(&desc->irq_data);
588
405
raw_spin_unlock(&desc->lock);
408
if (!(desc->irq_data.chip->flags & IRQCHIP_EOI_IF_HANDLED))
644
461
* one, we could have masked the irq.
645
462
* Renable it, if it was not disabled in meantime.
647
if (unlikely((desc->status &
648
(IRQ_PENDING | IRQ_MASKED | IRQ_DISABLED)) ==
649
(IRQ_PENDING | IRQ_MASKED))) {
464
if (unlikely(desc->istate & IRQS_PENDING)) {
465
if (!irqd_irq_disabled(&desc->irq_data) &&
466
irqd_irq_masked(&desc->irq_data))
653
desc->status &= ~IRQ_PENDING;
654
raw_spin_unlock(&desc->lock);
655
action_ret = handle_IRQ_event(irq, action);
657
note_interrupt(irq, desc, action_ret);
658
raw_spin_lock(&desc->lock);
660
} while ((desc->status & (IRQ_PENDING | IRQ_DISABLED)) == IRQ_PENDING);
662
desc->status &= ~IRQ_INPROGRESS;
470
handle_irq_event(desc);
472
} while ((desc->istate & IRQS_PENDING) &&
473
!irqd_irq_disabled(&desc->irq_data));
664
476
raw_spin_unlock(&desc->lock);
479
#ifdef CONFIG_IRQ_EDGE_EOI_HANDLER
481
* handle_edge_eoi_irq - edge eoi type IRQ handler
482
* @irq: the interrupt number
483
* @desc: the interrupt description structure for this irq
485
* Similar as the above handle_edge_irq, but using eoi and w/o the
488
void handle_edge_eoi_irq(unsigned int irq, struct irq_desc *desc)
490
struct irq_chip *chip = irq_desc_get_chip(desc);
492
raw_spin_lock(&desc->lock);
494
desc->istate &= ~(IRQS_REPLAY | IRQS_WAITING);
496
* If we're currently running this IRQ, or its disabled,
497
* we shouldn't process the IRQ. Mark it pending, handle
498
* the necessary masking and go out
500
if (unlikely(irqd_irq_disabled(&desc->irq_data) ||
501
irqd_irq_inprogress(&desc->irq_data) || !desc->action)) {
502
if (!irq_check_poll(desc)) {
503
desc->istate |= IRQS_PENDING;
507
kstat_incr_irqs_this_cpu(irq, desc);
510
if (unlikely(!desc->action))
513
handle_irq_event(desc);
515
} while ((desc->istate & IRQS_PENDING) &&
516
!irqd_irq_disabled(&desc->irq_data));
519
chip->irq_eoi(&desc->irq_data);
520
raw_spin_unlock(&desc->lock);
668
525
* handle_percpu_irq - Per CPU local irq handler
669
526
* @irq: the interrupt number
675
532
handle_percpu_irq(unsigned int irq, struct irq_desc *desc)
677
irqreturn_t action_ret;
534
struct irq_chip *chip = irq_desc_get_chip(desc);
679
536
kstat_incr_irqs_this_cpu(irq, desc);
681
if (desc->irq_data.chip->irq_ack)
682
desc->irq_data.chip->irq_ack(&desc->irq_data);
684
action_ret = handle_IRQ_event(irq, desc->action);
686
note_interrupt(irq, desc, action_ret);
688
if (desc->irq_data.chip->irq_eoi)
689
desc->irq_data.chip->irq_eoi(&desc->irq_data);
539
chip->irq_ack(&desc->irq_data);
541
handle_irq_event_percpu(desc, desc->action);
544
chip->irq_eoi(&desc->irq_data);
693
__set_irq_handler(unsigned int irq, irq_flow_handler_t handle, int is_chained,
548
__irq_set_handler(unsigned int irq, irq_flow_handler_t handle, int is_chained,
694
549
const char *name)
696
struct irq_desc *desc = irq_to_desc(irq);
697
551
unsigned long flags;
552
struct irq_desc *desc = irq_get_desc_buslock(irq, &flags);
701
"Trying to install type control for IRQ%d\n", irq);
706
558
handle = handle_bad_irq;
707
else if (desc->irq_data.chip == &no_irq_chip) {
708
printk(KERN_WARNING "Trying to install %sinterrupt handler "
709
"for IRQ%d\n", is_chained ? "chained " : "", irq);
711
* Some ARM implementations install a handler for really dumb
712
* interrupt hardware without setting an irq_chip. This worked
713
* with the ARM no_irq_chip but the check in setup_irq would
714
* prevent us to setup the interrupt at all. Switch it to
715
* dummy_irq_chip for easy transition.
717
desc->irq_data.chip = &dummy_irq_chip;
560
if (WARN_ON(desc->irq_data.chip == &no_irq_chip))
721
raw_spin_lock_irqsave(&desc->lock, flags);
724
565
if (handle == handle_bad_irq) {
725
566
if (desc->irq_data.chip != &no_irq_chip)
726
567
mask_ack_irq(desc);
727
desc->status |= IRQ_DISABLED;
568
irq_state_set_disabled(desc);
730
571
desc->handle_irq = handle;
731
572
desc->name = name;
733
574
if (handle != handle_bad_irq && is_chained) {
734
desc->status &= ~IRQ_DISABLED;
735
desc->status |= IRQ_NOREQUEST | IRQ_NOPROBE;
737
desc->irq_data.chip->irq_startup(&desc->irq_data);
575
irq_settings_set_noprobe(desc);
576
irq_settings_set_norequest(desc);
577
irq_settings_set_nothread(desc);
739
raw_spin_unlock_irqrestore(&desc->lock, flags);
740
chip_bus_sync_unlock(desc);
742
EXPORT_SYMBOL_GPL(__set_irq_handler);
745
set_irq_chip_and_handler(unsigned int irq, struct irq_chip *chip,
746
irq_flow_handler_t handle)
748
set_irq_chip(irq, chip);
749
__set_irq_handler(irq, handle, 0, NULL);
753
set_irq_chip_and_handler_name(unsigned int irq, struct irq_chip *chip,
581
irq_put_desc_busunlock(desc, flags);
583
EXPORT_SYMBOL_GPL(__irq_set_handler);
586
irq_set_chip_and_handler_name(unsigned int irq, struct irq_chip *chip,
754
587
irq_flow_handler_t handle, const char *name)
756
set_irq_chip(irq, chip);
757
__set_irq_handler(irq, handle, 0, name);
589
irq_set_chip(irq, chip);
590
__irq_set_handler(irq, handle, 0, name);
760
593
void irq_modify_status(unsigned int irq, unsigned long clr, unsigned long set)
762
struct irq_desc *desc = irq_to_desc(irq);
763
595
unsigned long flags;
596
struct irq_desc *desc = irq_get_desc_lock(irq, &flags);
769
set &= IRQF_MODIFY_MASK;
770
clr &= IRQF_MODIFY_MASK;
772
raw_spin_lock_irqsave(&desc->lock, flags);
773
desc->status &= ~clr;
775
raw_spin_unlock_irqrestore(&desc->lock, flags);
600
irq_settings_clr_and_set(desc, clr, set);
602
irqd_clear(&desc->irq_data, IRQD_NO_BALANCING | IRQD_PER_CPU |
603
IRQD_TRIGGER_MASK | IRQD_LEVEL | IRQD_MOVE_PCNTXT);
604
if (irq_settings_has_no_balance_set(desc))
605
irqd_set(&desc->irq_data, IRQD_NO_BALANCING);
606
if (irq_settings_is_per_cpu(desc))
607
irqd_set(&desc->irq_data, IRQD_PER_CPU);
608
if (irq_settings_can_move_pcntxt(desc))
609
irqd_set(&desc->irq_data, IRQD_MOVE_PCNTXT);
610
if (irq_settings_is_level(desc))
611
irqd_set(&desc->irq_data, IRQD_LEVEL);
613
irqd_set(&desc->irq_data, irq_settings_get_trigger_mask(desc));
615
irq_put_desc_unlock(desc, flags);
617
EXPORT_SYMBOL_GPL(irq_modify_status);
620
* irq_cpu_online - Invoke all irq_cpu_online functions.
622
* Iterate through all irqs and invoke the chip.irq_cpu_online()
625
void irq_cpu_online(void)
627
struct irq_desc *desc;
628
struct irq_chip *chip;
632
for_each_active_irq(irq) {
633
desc = irq_to_desc(irq);
637
raw_spin_lock_irqsave(&desc->lock, flags);
639
chip = irq_data_get_irq_chip(&desc->irq_data);
640
if (chip && chip->irq_cpu_online &&
641
(!(chip->flags & IRQCHIP_ONOFFLINE_ENABLED) ||
642
!irqd_irq_disabled(&desc->irq_data)))
643
chip->irq_cpu_online(&desc->irq_data);
645
raw_spin_unlock_irqrestore(&desc->lock, flags);
650
* irq_cpu_offline - Invoke all irq_cpu_offline functions.
652
* Iterate through all irqs and invoke the chip.irq_cpu_offline()
655
void irq_cpu_offline(void)
657
struct irq_desc *desc;
658
struct irq_chip *chip;
662
for_each_active_irq(irq) {
663
desc = irq_to_desc(irq);
667
raw_spin_lock_irqsave(&desc->lock, flags);
669
chip = irq_data_get_irq_chip(&desc->irq_data);
670
if (chip && chip->irq_cpu_offline &&
671
(!(chip->flags & IRQCHIP_ONOFFLINE_ENABLED) ||
672
!irqd_irq_disabled(&desc->irq_data)))
673
chip->irq_cpu_offline(&desc->irq_data);
675
raw_spin_unlock_irqrestore(&desc->lock, flags);