manage.c (2bdd10558c8d93009cb6c32ce9e30800fbb08add) | manage.c (876dbd4cc1b35c1a4cb96a2be1d43ea0eabce3b4) |
---|---|
1/* 2 * linux/kernel/irq/manage.c 3 * 4 * Copyright (C) 1992, 1998-2006 Linus Torvalds, Ingo Molnar 5 * Copyright (C) 2005-2006 Thomas Gleixner 6 * 7 * This file contains driver APIs to the irq subsystem. 8 */ --- 553 unchanged lines hidden (view full) --- 562 * IRQF_TRIGGER_* but the PIC does not support multiple 563 * flow-types? 564 */ 565 pr_debug("No set_type function for IRQ %d (%s)\n", irq, 566 chip ? (chip->name ? : "unknown") : "unknown"); 567 return 0; 568 } 569 | 1/* 2 * linux/kernel/irq/manage.c 3 * 4 * Copyright (C) 1992, 1998-2006 Linus Torvalds, Ingo Molnar 5 * Copyright (C) 2005-2006 Thomas Gleixner 6 * 7 * This file contains driver APIs to the irq subsystem. 8 */ --- 553 unchanged lines hidden (view full) --- 562 * IRQF_TRIGGER_* but the PIC does not support multiple 563 * flow-types? 564 */ 565 pr_debug("No set_type function for IRQ %d (%s)\n", irq, 566 chip ? (chip->name ? : "unknown") : "unknown"); 567 return 0; 568 } 569 |
570 flags &= IRQ_TYPE_SENSE_MASK; |
|
570 /* caller masked out all except trigger mode flags */ 571 ret = chip->irq_set_type(&desc->irq_data, flags); 572 | 571 /* caller masked out all except trigger mode flags */ 572 ret = chip->irq_set_type(&desc->irq_data, flags); 573 |
573 if (ret) 574 pr_err("setting trigger mode %lu for irq %u failed (%pF)\n", 575 flags, irq, chip->irq_set_type); 576 else { 577 if (flags & (IRQ_TYPE_LEVEL_LOW | IRQ_TYPE_LEVEL_HIGH)) 578 flags |= IRQ_LEVEL; 579 /* note that IRQF_TRIGGER_MASK == IRQ_TYPE_SENSE_MASK */ 580 desc->status &= ~(IRQ_LEVEL | IRQ_TYPE_SENSE_MASK); 581 desc->status |= flags; | 574 switch (ret) { 575 case IRQ_SET_MASK_OK: 576 irqd_clear(&desc->irq_data, IRQD_TRIGGER_MASK); 577 irqd_set(&desc->irq_data, flags); |
582 | 578 |
579 case IRQ_SET_MASK_OK_NOCOPY: 580 flags = irqd_get_trigger_type(&desc->irq_data); 581 irq_settings_set_trigger_mask(desc, 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 } 588 |
|
583 if (chip != desc->irq_data.chip) 584 irq_chip_set_defaults(desc->irq_data.chip); | 589 if (chip != 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; 588} 589 590/* 591 * Default primary interrupt handler for threaded interrupts. Is 592 * assigned as primary handler when request_threaded_irq is called 593 * with handler == NULL. Useful for oneshot interrupts. 594 */ --- 323 unchanged lines hidden (view full) --- 918 if (new->flags & IRQF_NOBALANCING) { 919 irq_settings_set_no_balancing(desc); 920 irqd_set(&desc->irq_data, IRQD_NO_BALANCING); 921 } 922 923 /* Set default affinity mask once everything is setup */ 924 setup_affinity(irq, desc, mask); 925 | 596 return ret; 597} 598 599/* 600 * Default primary interrupt handler for threaded interrupts. Is 601 * assigned as primary handler when request_threaded_irq is called 602 * with handler == NULL. Useful for oneshot interrupts. 603 */ --- 323 unchanged lines hidden (view full) --- 927 if (new->flags & IRQF_NOBALANCING) { 928 irq_settings_set_no_balancing(desc); 929 irqd_set(&desc->irq_data, IRQD_NO_BALANCING); 930 } 931 932 /* Set default affinity mask once everything is setup */ 933 setup_affinity(irq, desc, mask); 934 |
926 } else if ((new->flags & IRQF_TRIGGER_MASK) 927 && (new->flags & IRQF_TRIGGER_MASK) 928 != (desc->status & IRQ_TYPE_SENSE_MASK)) { 929 /* hope the handler works with the actual trigger mode... */ 930 pr_warning("IRQ %d uses trigger mode %d; requested %d\n", 931 irq, (int)(desc->status & IRQ_TYPE_SENSE_MASK), 932 (int)(new->flags & IRQF_TRIGGER_MASK)); | 935 } else if (new->flags & IRQF_TRIGGER_MASK) { 936 unsigned int nmsk = new->flags & IRQF_TRIGGER_MASK; 937 unsigned int omsk = irq_settings_get_trigger_mask(desc); 938 939 if (nmsk != omsk) 940 /* hope the handler works with current trigger mode */ 941 pr_warning("IRQ %d uses trigger mode %u; requested %u\n", 942 irq, nmsk, omsk); |
933 } 934 935 new->irq = irq; 936 *old_ptr = new; 937 938 /* Reset broken irq detection when installing new handler */ 939 desc->irq_count = 0; 940 desc->irqs_unhandled = 0; --- 354 unchanged lines hidden --- | 943 } 944 945 new->irq = irq; 946 *old_ptr = new; 947 948 /* Reset broken irq detection when installing new handler */ 949 desc->irq_count = 0; 950 desc->irqs_unhandled = 0; --- 354 unchanged lines hidden --- |