@@ -314,22 +314,32 @@ void irq_shutdown(struct irq_desc *desc)
314
314
315
315
void irq_enable (struct irq_desc * desc )
316
316
{
317
- irq_state_clr_disabled (desc );
318
- if (desc -> irq_data .chip -> irq_enable )
319
- desc -> irq_data .chip -> irq_enable (& desc -> irq_data );
320
- else
321
- desc -> irq_data .chip -> irq_unmask (& desc -> irq_data );
322
- irq_state_clr_masked (desc );
317
+ if (!irqd_irq_disabled (& desc -> irq_data )) {
318
+ unmask_irq (desc );
319
+ } else {
320
+ irq_state_clr_disabled (desc );
321
+ if (desc -> irq_data .chip -> irq_enable ) {
322
+ desc -> irq_data .chip -> irq_enable (& desc -> irq_data );
323
+ irq_state_clr_masked (desc );
324
+ } else {
325
+ unmask_irq (desc );
326
+ }
327
+ }
323
328
}
324
329
325
330
static void __irq_disable (struct irq_desc * desc , bool mask )
326
331
{
327
- irq_state_set_disabled (desc );
328
- if (desc -> irq_data .chip -> irq_disable ) {
329
- desc -> irq_data .chip -> irq_disable (& desc -> irq_data );
330
- irq_state_set_masked (desc );
331
- } else if (mask ) {
332
- mask_irq (desc );
332
+ if (irqd_irq_disabled (& desc -> irq_data )) {
333
+ if (mask )
334
+ mask_irq (desc );
335
+ } else {
336
+ irq_state_set_disabled (desc );
337
+ if (desc -> irq_data .chip -> irq_disable ) {
338
+ desc -> irq_data .chip -> irq_disable (& desc -> irq_data );
339
+ irq_state_set_masked (desc );
340
+ } else if (mask ) {
341
+ mask_irq (desc );
342
+ }
333
343
}
334
344
}
335
345
@@ -378,18 +388,21 @@ void irq_percpu_disable(struct irq_desc *desc, unsigned int cpu)
378
388
379
389
static inline void mask_ack_irq (struct irq_desc * desc )
380
390
{
381
- if (desc -> irq_data .chip -> irq_mask_ack )
391
+ if (desc -> irq_data .chip -> irq_mask_ack ) {
382
392
desc -> irq_data .chip -> irq_mask_ack (& desc -> irq_data );
383
- else {
384
- desc -> irq_data .chip -> irq_mask (& desc -> irq_data );
393
+ irq_state_set_masked (desc );
394
+ } else {
395
+ mask_irq (desc );
385
396
if (desc -> irq_data .chip -> irq_ack )
386
397
desc -> irq_data .chip -> irq_ack (& desc -> irq_data );
387
398
}
388
- irq_state_set_masked (desc );
389
399
}
390
400
391
401
void mask_irq (struct irq_desc * desc )
392
402
{
403
+ if (irqd_irq_masked (& desc -> irq_data ))
404
+ return ;
405
+
393
406
if (desc -> irq_data .chip -> irq_mask ) {
394
407
desc -> irq_data .chip -> irq_mask (& desc -> irq_data );
395
408
irq_state_set_masked (desc );
@@ -398,6 +411,9 @@ void mask_irq(struct irq_desc *desc)
398
411
399
412
void unmask_irq (struct irq_desc * desc )
400
413
{
414
+ if (!irqd_irq_masked (& desc -> irq_data ))
415
+ return ;
416
+
401
417
if (desc -> irq_data .chip -> irq_unmask ) {
402
418
desc -> irq_data .chip -> irq_unmask (& desc -> irq_data );
403
419
irq_state_clr_masked (desc );
@@ -411,10 +427,7 @@ void unmask_threaded_irq(struct irq_desc *desc)
411
427
if (chip -> flags & IRQCHIP_EOI_THREADED )
412
428
chip -> irq_eoi (& desc -> irq_data );
413
429
414
- if (chip -> irq_unmask ) {
415
- chip -> irq_unmask (& desc -> irq_data );
416
- irq_state_clr_masked (desc );
417
- }
430
+ unmask_irq (desc );
418
431
}
419
432
420
433
/*
0 commit comments