aboutsummaryrefslogtreecommitdiffstats
path: root/kernel/irq/manage.c
diff options
context:
space:
mode:
Diffstat (limited to 'kernel/irq/manage.c')
-rw-r--r--kernel/irq/manage.c44
1 files changed, 27 insertions, 17 deletions
diff --git a/kernel/irq/manage.c b/kernel/irq/manage.c
index 8246afc81956..9ae758ed8e66 100644
--- a/kernel/irq/manage.c
+++ b/kernel/irq/manage.c
@@ -567,23 +567,32 @@ int __irq_set_trigger(struct irq_desc *desc, unsigned int irq,
567 return 0; 567 return 0;
568 } 568 }
569 569
570 flags &= IRQ_TYPE_SENSE_MASK;
570 /* caller masked out all except trigger mode flags */ 571 /* caller masked out all except trigger mode flags */
571 ret = chip->irq_set_type(&desc->irq_data, flags); 572 ret = chip->irq_set_type(&desc->irq_data, flags);
572 573
573 if (ret) 574 switch (ret) {
574 pr_err("setting trigger mode %lu for irq %u failed (%pF)\n", 575 case IRQ_SET_MASK_OK:
575 flags, irq, chip->irq_set_type); 576 irqd_clear(&desc->irq_data, IRQD_TRIGGER_MASK);
576 else { 577 irqd_set(&desc->irq_data, flags);
577 if (flags & (IRQ_TYPE_LEVEL_LOW | IRQ_TYPE_LEVEL_HIGH)) 578
578 flags |= IRQ_LEVEL; 579 case IRQ_SET_MASK_OK_NOCOPY:
579 /* note that IRQF_TRIGGER_MASK == IRQ_TYPE_SENSE_MASK */ 580 flags = irqd_get_trigger_type(&desc->irq_data);
580 desc->status &= ~(IRQ_LEVEL | IRQ_TYPE_SENSE_MASK); 581 irq_settings_set_trigger_mask(desc, flags);
581 desc->status |= flags; 582 irqd_clear(&desc->irq_data, IRQD_LEVEL);
583 irq_settings_clr_level(desc);
584 if (flags & IRQ_TYPE_LEVEL_MASK) {
585 irq_settings_set_level(desc);
586 irqd_set(&desc->irq_data, IRQD_LEVEL);
587 }
582 588
583 if (chip != desc->irq_data.chip) 589 if (chip != desc->irq_data.chip)
584 irq_chip_set_defaults(desc->irq_data.chip); 590 irq_chip_set_defaults(desc->irq_data.chip);
591 return 0;
592 default:
593 pr_err("setting trigger mode %lu for irq %u failed (%pF)\n",
594 flags, irq, chip->irq_set_type);
585 } 595 }
586
587 return ret; 596 return ret;
588} 597}
589 598
@@ -923,13 +932,14 @@ __setup_irq(unsigned int irq, struct irq_desc *desc, struct irqaction *new)
923 /* Set default affinity mask once everything is setup */ 932 /* Set default affinity mask once everything is setup */
924 setup_affinity(irq, desc, mask); 933 setup_affinity(irq, desc, mask);
925 934
926 } else if ((new->flags & IRQF_TRIGGER_MASK) 935 } else if (new->flags & IRQF_TRIGGER_MASK) {
927 && (new->flags & IRQF_TRIGGER_MASK) 936 unsigned int nmsk = new->flags & IRQF_TRIGGER_MASK;
928 != (desc->status & IRQ_TYPE_SENSE_MASK)) { 937 unsigned int omsk = irq_settings_get_trigger_mask(desc);
929 /* hope the handler works with the actual trigger mode... */ 938
930 pr_warning("IRQ %d uses trigger mode %d; requested %d\n", 939 if (nmsk != omsk)
931 irq, (int)(desc->status & IRQ_TYPE_SENSE_MASK), 940 /* hope the handler works with current trigger mode */
932 (int)(new->flags & IRQF_TRIGGER_MASK)); 941 pr_warning("IRQ %d uses trigger mode %u; requested %u\n",
942 irq, nmsk, omsk);
933 } 943 }
934 944
935 new->irq = irq; 945 new->irq = irq;