Lines Matching +full:interrupt +full:- +full:affinity

1 // SPDX-License-Identifier: GPL-2.0
3 * Copyright (C) 1992, 1998-2006 Linus Torvalds, Ingo Molnar
4 * Copyright (C) 2005-2006, Thomas Gleixner, Russell King
6 * This file contains the core interrupt handling code, for irq-chip based
8 * Documentation/core-api/genericirq.rst
14 #include <linux/interrupt.h>
37 * irq_set_chip - set the irq chip for an irq
43 int ret = -EINVAL; in irq_set_chip()
46 scoped_irqdesc->irq_data.chip = (struct irq_chip *)(chip ?: &no_irq_chip); in irq_set_chip()
57 * irq_set_irq_type - set the irq trigger type for an irq
59 * @type: IRQ_TYPE_{LEVEL,EDGE}_* value - see include/linux/irq.h
65 return -EINVAL; in irq_set_irq_type()
70 * irq_set_handler_data - set irq handler data for an irq
71 * @irq: Interrupt number
72 * @data: Pointer to interrupt specific data
79 scoped_irqdesc->irq_common_data.handler_data = data; in irq_set_handler_data()
82 return -EINVAL; in irq_set_handler_data()
87 * irq_set_msi_desc_off - set MSI descriptor data for an irq at offset
88 * @irq_base: Interrupt number base
89 * @irq_offset: Interrupt number offset
97 scoped_irqdesc->irq_common_data.msi_desc = entry; in irq_set_msi_desc_off()
99 entry->irq = irq_base; in irq_set_msi_desc_off()
102 return -EINVAL; in irq_set_msi_desc_off()
106 * irq_set_msi_desc - set MSI descriptor data for an irq
107 * @irq: Interrupt number
118 * irq_set_chip_data - set irq chip data for an irq
119 * @irq: Interrupt number
127 scoped_irqdesc->irq_data.chip_data = data; in irq_set_chip_data()
130 return -EINVAL; in irq_set_chip_data()
138 return desc ? &desc->irq_data : NULL; in irq_get_irq_data()
144 irqd_clear(&desc->irq_data, IRQD_IRQ_DISABLED); in irq_state_clr_disabled()
149 irqd_clear(&desc->irq_data, IRQD_IRQ_MASKED); in irq_state_clr_masked()
154 irqd_clear(&desc->irq_data, IRQD_IRQ_STARTED); in irq_state_clr_started()
159 irqd_set(&desc->irq_data, IRQD_IRQ_STARTED); in irq_state_set_started()
183 * and potentially shutdown IRQ. Chained interrupt in __irq_startup_managed()
190 * The interrupt was requested, but there is no online CPU in __irq_startup_managed()
191 * in it's affinity mask. Put it into managed shutdown in __irq_startup_managed()
211 * Clear managed-shutdown flag, so we don't repeat managed-startup for in irq_startup_managed()
221 desc->depth--; in irq_startup_managed()
222 if (!desc->depth) in irq_startup_managed()
237 if (!irqd_irq_disabled(&desc->irq_data)) { in irq_enable()
241 if (desc->irq_data.chip->irq_enable) { in irq_enable()
242 desc->irq_data.chip->irq_enable(&desc->irq_data); in irq_enable()
255 /* Warn if this interrupt is not activated but try nevertheless */ in __irq_startup()
258 if (d->chip->irq_startup) { in __irq_startup()
259 ret = d->chip->irq_startup(d); in __irq_startup()
275 desc->depth = 0; in irq_startup()
282 if (d->chip->flags & IRQCHIP_AFFINITY_PRE_STARTUP) in irq_startup()
285 if (!(d->chip->flags & IRQCHIP_AFFINITY_PRE_STARTUP)) in irq_startup()
293 desc->depth = 1; in irq_startup()
324 if (irqd_is_started(&desc->irq_data)) { in irq_shutdown()
331 desc->depth++; in irq_shutdown()
333 if (desc->irq_data.chip->irq_shutdown) { in irq_shutdown()
334 desc->irq_data.chip->irq_shutdown(&desc->irq_data); in irq_shutdown()
349 * This must be called even if the interrupt was never started up, in irq_shutdown_and_deactivate()
350 * because the activation can happen before the interrupt is in irq_shutdown_and_deactivate()
354 irq_domain_deactivate_irq(&desc->irq_data); in irq_shutdown_and_deactivate()
359 if (irqd_irq_disabled(&desc->irq_data)) { in __irq_disable()
364 if (desc->irq_data.chip->irq_disable) { in __irq_disable()
365 desc->irq_data.chip->irq_disable(&desc->irq_data); in __irq_disable()
374 * irq_disable - Mark interrupt disabled
378 * use a lazy disable approach. That means we mark the interrupt
381 * common case where no interrupt happens after we marked it
382 * disabled. If an interrupt happens, then the interrupt flow
386 * If the interrupt chip does not implement the irq_disable callback,
389 * be used for devices which cannot disable the interrupt at the
400 if (desc->irq_data.chip->irq_enable) in irq_percpu_enable()
401 desc->irq_data.chip->irq_enable(&desc->irq_data); in irq_percpu_enable()
403 desc->irq_data.chip->irq_unmask(&desc->irq_data); in irq_percpu_enable()
404 cpumask_set_cpu(cpu, desc->percpu_enabled); in irq_percpu_enable()
409 if (desc->irq_data.chip->irq_disable) in irq_percpu_disable()
410 desc->irq_data.chip->irq_disable(&desc->irq_data); in irq_percpu_disable()
412 desc->irq_data.chip->irq_mask(&desc->irq_data); in irq_percpu_disable()
413 cpumask_clear_cpu(cpu, desc->percpu_enabled); in irq_percpu_disable()
418 if (desc->irq_data.chip->irq_mask_ack) { in mask_ack_irq()
419 desc->irq_data.chip->irq_mask_ack(&desc->irq_data); in mask_ack_irq()
423 if (desc->irq_data.chip->irq_ack) in mask_ack_irq()
424 desc->irq_data.chip->irq_ack(&desc->irq_data); in mask_ack_irq()
430 if (irqd_irq_masked(&desc->irq_data)) in mask_irq()
433 if (desc->irq_data.chip->irq_mask) { in mask_irq()
434 desc->irq_data.chip->irq_mask(&desc->irq_data); in mask_irq()
441 if (!irqd_irq_masked(&desc->irq_data)) in unmask_irq()
444 if (desc->irq_data.chip->irq_unmask) { in unmask_irq()
445 desc->irq_data.chip->irq_unmask(&desc->irq_data); in unmask_irq()
452 struct irq_chip *chip = desc->irq_data.chip; in unmask_threaded_irq()
454 if (chip->flags & IRQCHIP_EOI_THREADED) in unmask_threaded_irq()
455 chip->irq_eoi(&desc->irq_data); in unmask_threaded_irq()
465 raw_spin_unlock(&desc->lock); in irq_wait_on_inprogress()
466 while (irqd_irq_inprogress(&desc->irq_data)) in irq_wait_on_inprogress()
468 raw_spin_lock(&desc->lock); in irq_wait_on_inprogress()
469 } while (irqd_irq_inprogress(&desc->irq_data)); in irq_wait_on_inprogress()
472 return !irqd_irq_disabled(&desc->irq_data) && desc->action; in irq_wait_on_inprogress()
479 struct irq_data *irqd = &desc->irq_data; in irq_can_handle_pm()
483 * If the interrupt is not in progress and is not an armed in irq_can_handle_pm()
484 * wakeup interrupt, proceed. in irq_can_handle_pm()
490 * If the interrupt is an armed wakeup source, mark it pending in irq_can_handle_pm()
499 /* Check whether the interrupt is polled on another CPU */ in irq_can_handle_pm()
500 if (unlikely(desc->istate & IRQS_POLL_INPROGRESS)) { in irq_can_handle_pm()
503 smp_processor_id(), desc->irq_data.irq)) in irq_can_handle_pm()
510 !irqd_is_single_target(irqd) || desc->handle_irq != handle_edge_irq) in irq_can_handle_pm()
514 * If the interrupt affinity was moved to this CPU and the in irq_can_handle_pm()
515 * interrupt is currently handled on the previous target CPU, then in irq_can_handle_pm()
546 desc->istate &= ~(IRQS_REPLAY | IRQS_WAITING); in irq_can_handle_actions()
548 if (unlikely(!desc->action || irqd_irq_disabled(&desc->irq_data))) { in irq_can_handle_actions()
549 desc->istate |= IRQS_PENDING; in irq_can_handle_actions()
564 * handle_nested_irq - Handle a nested irq from a irq thread
565 * @irq: the interrupt number
567 * Handle interrupts which are nested into a threaded interrupt
579 scoped_guard(raw_spinlock_irq, &desc->lock) { in handle_nested_irq()
583 action = desc->action; in handle_nested_irq()
585 atomic_inc(&desc->threads_active); in handle_nested_irq()
590 action_ret |= action->thread_fn(action->irq, action->dev_id); in handle_nested_irq()
600 * handle_simple_irq - Simple and software-decoded IRQs.
601 * @desc: the interrupt description structure for this irq
603 * Simple interrupts are either sent from a demultiplexing interrupt
604 * handler or come from hardware, where no interrupt hardware control is
612 guard(raw_spinlock)(&desc->lock); in handle_simple_irq()
615 if (irqd_needs_resend_when_in_progress(&desc->irq_data)) in handle_simple_irq()
616 desc->istate |= IRQS_PENDING; in handle_simple_irq()
629 * handle_untracked_irq - Simple and software-decoded IRQs.
630 * @desc: the interrupt description structure for this irq
632 * Untracked interrupts are sent from a demultiplexing interrupt handler
634 * domain generated the interrupt. IRQ's handled through here are not
635 * subjected to stats tracking, randomness, or spurious interrupt
643 scoped_guard(raw_spinlock, &desc->lock) { in handle_untracked_irq()
647 desc->istate &= ~IRQS_PENDING; in handle_untracked_irq()
648 irqd_set(&desc->irq_data, IRQD_IRQ_INPROGRESS); in handle_untracked_irq()
653 scoped_guard(raw_spinlock, &desc->lock) in handle_untracked_irq()
654 irqd_clear(&desc->irq_data, IRQD_IRQ_INPROGRESS); in handle_untracked_irq()
666 * - Standard level irq (IRQF_ONESHOT is not set) in cond_unmask_irq()
667 * - Oneshot irq which did not wake the thread (caused by a in cond_unmask_irq()
668 * spurious interrupt or a primary handler handling it in cond_unmask_irq()
671 if (!irqd_irq_disabled(&desc->irq_data) && in cond_unmask_irq()
672 irqd_irq_masked(&desc->irq_data) && !desc->threads_oneshot) in cond_unmask_irq()
677 * handle_level_irq - Level type irq handler
678 * @desc: the interrupt description structure for this irq
681 * active level. This may require to mask the interrupt and unmask it after
682 * the associated handler has acknowledged the device, so the interrupt
687 guard(raw_spinlock)(&desc->lock); in handle_level_irq()
702 if (!(desc->istate & IRQS_ONESHOT)) { in cond_unmask_eoi_irq()
703 chip->irq_eoi(&desc->irq_data); in cond_unmask_eoi_irq()
708 * - Oneshot irq which did not wake the thread (caused by a in cond_unmask_eoi_irq()
709 * spurious interrupt or a primary handler handling it in cond_unmask_eoi_irq()
712 if (!irqd_irq_disabled(&desc->irq_data) && in cond_unmask_eoi_irq()
713 irqd_irq_masked(&desc->irq_data) && !desc->threads_oneshot) { in cond_unmask_eoi_irq()
714 chip->irq_eoi(&desc->irq_data); in cond_unmask_eoi_irq()
716 } else if (!(chip->flags & IRQCHIP_EOI_THREADED)) { in cond_unmask_eoi_irq()
717 chip->irq_eoi(&desc->irq_data); in cond_unmask_eoi_irq()
723 if (!(chip->flags & IRQCHIP_EOI_IF_HANDLED)) in cond_eoi_irq()
724 chip->irq_eoi(data); in cond_eoi_irq()
728 * handle_fasteoi_irq - irq handler for transparent controllers
729 * @desc: the interrupt description structure for this irq
731 * Only a single callback will be issued to the chip: an ->eoi() call when
732 * the interrupt has been serviced. This enables support for modern forms
733 * of interrupt handlers, which handle the flow details in hardware,
738 struct irq_chip *chip = desc->irq_data.chip; in handle_fasteoi_irq()
740 guard(raw_spinlock)(&desc->lock); in handle_fasteoi_irq()
743 * When an affinity change races with IRQ handling, the next interrupt in handle_fasteoi_irq()
745 * handling the previous one - it may need to be resent. in handle_fasteoi_irq()
748 if (irqd_needs_resend_when_in_progress(&desc->irq_data)) in handle_fasteoi_irq()
749 desc->istate |= IRQS_PENDING; in handle_fasteoi_irq()
750 cond_eoi_irq(chip, &desc->irq_data); in handle_fasteoi_irq()
756 cond_eoi_irq(chip, &desc->irq_data); in handle_fasteoi_irq()
761 if (desc->istate & IRQS_ONESHOT) in handle_fasteoi_irq()
769 * When the race described above happens this will resend the interrupt. in handle_fasteoi_irq()
771 if (unlikely(desc->istate & IRQS_PENDING)) in handle_fasteoi_irq()
777 * handle_fasteoi_nmi - irq handler for NMI interrupt lines
778 * @desc: the interrupt description structure for this irq
780 * A simple NMI-safe handler, considering the restrictions
783 * Only a single callback will be issued to the chip: an ->eoi()
784 * call when the interrupt has been serviced. This enables support
785 * for modern forms of interrupt handlers, which handle the flow
791 struct irqaction *action = desc->action; in handle_fasteoi_nmi()
801 res = action->handler(irq, action->dev_id); in handle_fasteoi_nmi()
804 if (chip->irq_eoi) in handle_fasteoi_nmi()
805 chip->irq_eoi(&desc->irq_data); in handle_fasteoi_nmi()
810 * handle_edge_irq - edge type IRQ handler
811 * @desc: the interrupt description structure for this irq
813 * Interrupt occurs on the falling and/or rising edge of a hardware
815 * must be acked in order to be reenabled. After the ack another interrupt
818 * disable (mask) the interrupt depending on the controller hardware. This
819 * requires to reenable the interrupt inside of the loop which handles the
825 guard(raw_spinlock)(&desc->lock); in handle_edge_irq()
828 desc->istate |= IRQS_PENDING; in handle_edge_irq()
836 desc->irq_data.chip->irq_ack(&desc->irq_data); in handle_edge_irq()
839 if (unlikely(!desc->action)) { in handle_edge_irq()
849 if (unlikely(desc->istate & IRQS_PENDING)) { in handle_edge_irq()
850 if (!irqd_irq_disabled(&desc->irq_data) && in handle_edge_irq()
851 irqd_irq_masked(&desc->irq_data)) in handle_edge_irq()
857 } while ((desc->istate & IRQS_PENDING) && !irqd_irq_disabled(&desc->irq_data)); in handle_edge_irq()
862 * handle_percpu_irq - Per CPU local irq handler
863 * @desc: the interrupt description structure for this irq
873 * desc->tot_count. in handle_percpu_irq()
877 if (chip->irq_ack) in handle_percpu_irq()
878 chip->irq_ack(&desc->irq_data); in handle_percpu_irq()
882 if (chip->irq_eoi) in handle_percpu_irq()
883 chip->irq_eoi(&desc->irq_data); in handle_percpu_irq()
887 * handle_percpu_devid_irq - Per CPU local irq handler with per cpu dev ids
888 * @desc: the interrupt description structure for this irq
893 * action->percpu_dev_id is a pointer to percpu variables which
907 * desc->tot_count. in handle_percpu_devid_irq()
911 if (chip->irq_ack) in handle_percpu_devid_irq()
912 chip->irq_ack(&desc->irq_data); in handle_percpu_devid_irq()
914 for (action = desc->action; action; action = action->next) in handle_percpu_devid_irq()
915 if (cpumask_test_cpu(cpu, action->affinity)) in handle_percpu_devid_irq()
920 res = action->handler(irq, raw_cpu_ptr(action->percpu_dev_id)); in handle_percpu_devid_irq()
923 bool enabled = cpumask_test_cpu(cpu, desc->percpu_enabled); in handle_percpu_devid_irq()
932 if (chip->irq_eoi) in handle_percpu_devid_irq()
933 chip->irq_eoi(&desc->irq_data); in handle_percpu_devid_irq()
943 struct irq_data *irq_data = &desc->irq_data; in __irq_do_set_handler()
950 * cannot enable/startup the interrupt at this point. in __irq_do_set_handler()
953 if (irq_data->chip != &no_irq_chip) in __irq_do_set_handler()
957 * and the interrupt supposed to be started in __irq_do_set_handler()
963 irq_data = irq_data->parent_data; in __irq_do_set_handler()
966 if (WARN_ON(!irq_data || irq_data->chip == &no_irq_chip)) in __irq_do_set_handler()
972 if (desc->irq_data.chip != &no_irq_chip) in __irq_do_set_handler()
976 desc->action = NULL; in __irq_do_set_handler()
979 desc->depth = 1; in __irq_do_set_handler()
981 desc->handle_irq = handle; in __irq_do_set_handler()
982 desc->name = name; in __irq_do_set_handler()
985 unsigned int type = irqd_get_trigger_type(&desc->irq_data); in __irq_do_set_handler()
988 * We're about to start this interrupt immediately, in __irq_do_set_handler()
992 * chained interrupt. Reset it immediately because we in __irq_do_set_handler()
997 desc->handle_irq = handle; in __irq_do_set_handler()
1003 desc->action = &chained_action; in __irq_do_set_handler()
1023 desc->irq_common_data.handler_data = data; in irq_set_chained_handler_and_data()
1045 * active interrupt. in irq_modify_status()
1047 WARN_ON_ONCE(!desc->depth && (set & _IRQ_NOAUTOEN)); in irq_modify_status()
1051 trigger = irqd_get_trigger_type(&desc->irq_data); in irq_modify_status()
1053 irqd_clear(&desc->irq_data, IRQD_NO_BALANCING | IRQD_PER_CPU | in irq_modify_status()
1056 irqd_set(&desc->irq_data, IRQD_NO_BALANCING); in irq_modify_status()
1058 irqd_set(&desc->irq_data, IRQD_PER_CPU); in irq_modify_status()
1060 irqd_set(&desc->irq_data, IRQD_LEVEL); in irq_modify_status()
1066 irqd_set(&desc->irq_data, trigger); in irq_modify_status()
1073 * irq_cpu_online - Invoke all irq_cpu_online functions.
1089 guard(raw_spinlock_irqsave)(&desc->lock); in irq_cpu_online()
1090 chip = irq_data_get_irq_chip(&desc->irq_data); in irq_cpu_online()
1091 if (chip && chip->irq_cpu_online && in irq_cpu_online()
1092 (!(chip->flags & IRQCHIP_ONOFFLINE_ENABLED) || in irq_cpu_online()
1093 !irqd_irq_disabled(&desc->irq_data))) in irq_cpu_online()
1094 chip->irq_cpu_online(&desc->irq_data); in irq_cpu_online()
1099 * irq_cpu_offline - Invoke all irq_cpu_offline functions.
1115 guard(raw_spinlock_irqsave)(&desc->lock); in irq_cpu_offline()
1116 chip = irq_data_get_irq_chip(&desc->irq_data); in irq_cpu_offline()
1117 if (chip && chip->irq_cpu_offline && in irq_cpu_offline()
1118 (!(chip->flags & IRQCHIP_ONOFFLINE_ENABLED) || in irq_cpu_offline()
1119 !irqd_irq_disabled(&desc->irq_data))) in irq_cpu_offline()
1120 chip->irq_cpu_offline(&desc->irq_data); in irq_cpu_offline()
1129 * handle_fasteoi_ack_irq - irq handler for edge hierarchy stacked on
1132 * @desc: the interrupt description structure for this irq
1135 * also needs to have its ->irq_ack() function called.
1139 struct irq_chip *chip = desc->irq_data.chip; in handle_fasteoi_ack_irq()
1141 guard(raw_spinlock)(&desc->lock); in handle_fasteoi_ack_irq()
1144 cond_eoi_irq(chip, &desc->irq_data); in handle_fasteoi_ack_irq()
1150 cond_eoi_irq(chip, &desc->irq_data); in handle_fasteoi_ack_irq()
1155 if (desc->istate & IRQS_ONESHOT) in handle_fasteoi_ack_irq()
1158 desc->irq_data.chip->irq_ack(&desc->irq_data); in handle_fasteoi_ack_irq()
1167 * handle_fasteoi_mask_irq - irq handler for level hierarchy stacked on
1170 * @desc: the interrupt description structure for this irq
1173 * also needs to have its ->irq_mask_ack() function called.
1177 struct irq_chip *chip = desc->irq_data.chip; in handle_fasteoi_mask_irq()
1179 guard(raw_spinlock)(&desc->lock); in handle_fasteoi_mask_irq()
1183 cond_eoi_irq(chip, &desc->irq_data); in handle_fasteoi_mask_irq()
1198 * irq_chip_set_parent_state - set the state of a parent interrupt.
1200 * @data: Pointer to interrupt specific data
1210 data = data->parent_data; in irq_chip_set_parent_state()
1212 if (!data || !data->chip->irq_set_irqchip_state) in irq_chip_set_parent_state()
1215 return data->chip->irq_set_irqchip_state(data, which, val); in irq_chip_set_parent_state()
1220 * irq_chip_get_parent_state - get the state of a parent interrupt.
1222 * @data: Pointer to interrupt specific data
1232 data = data->parent_data; in irq_chip_get_parent_state()
1234 if (!data || !data->chip->irq_get_irqchip_state) in irq_chip_get_parent_state()
1237 return data->chip->irq_get_irqchip_state(data, which, state); in irq_chip_get_parent_state()
1242 * irq_chip_shutdown_parent - Shutdown the parent interrupt
1243 * @data: Pointer to interrupt specific data
1250 struct irq_data *parent = data->parent_data; in irq_chip_shutdown_parent()
1252 if (parent->chip->irq_shutdown) in irq_chip_shutdown_parent()
1253 parent->chip->irq_shutdown(parent); in irq_chip_shutdown_parent()
1260 * irq_chip_startup_parent - Startup the parent interrupt
1261 * @data: Pointer to interrupt specific data
1268 struct irq_data *parent = data->parent_data; in irq_chip_startup_parent()
1270 if (parent->chip->irq_startup) in irq_chip_startup_parent()
1271 return parent->chip->irq_startup(parent); in irq_chip_startup_parent()
1279 * irq_chip_enable_parent - Enable the parent interrupt (defaults to unmask if
1281 * @data: Pointer to interrupt specific data
1285 data = data->parent_data; in irq_chip_enable_parent()
1286 if (data->chip->irq_enable) in irq_chip_enable_parent()
1287 data->chip->irq_enable(data); in irq_chip_enable_parent()
1289 data->chip->irq_unmask(data); in irq_chip_enable_parent()
1294 * irq_chip_disable_parent - Disable the parent interrupt (defaults to mask if
1296 * @data: Pointer to interrupt specific data
1300 data = data->parent_data; in irq_chip_disable_parent()
1301 if (data->chip->irq_disable) in irq_chip_disable_parent()
1302 data->chip->irq_disable(data); in irq_chip_disable_parent()
1304 data->chip->irq_mask(data); in irq_chip_disable_parent()
1309 * irq_chip_ack_parent - Acknowledge the parent interrupt
1310 * @data: Pointer to interrupt specific data
1314 data = data->parent_data; in irq_chip_ack_parent()
1315 data->chip->irq_ack(data); in irq_chip_ack_parent()
1320 * irq_chip_mask_parent - Mask the parent interrupt
1321 * @data: Pointer to interrupt specific data
1325 data = data->parent_data; in irq_chip_mask_parent()
1326 data->chip->irq_mask(data); in irq_chip_mask_parent()
1331 * irq_chip_mask_ack_parent - Mask and acknowledge the parent interrupt
1332 * @data: Pointer to interrupt specific data
1336 data = data->parent_data; in irq_chip_mask_ack_parent()
1337 data->chip->irq_mask_ack(data); in irq_chip_mask_ack_parent()
1342 * irq_chip_unmask_parent - Unmask the parent interrupt
1343 * @data: Pointer to interrupt specific data
1347 data = data->parent_data; in irq_chip_unmask_parent()
1348 data->chip->irq_unmask(data); in irq_chip_unmask_parent()
1353 * irq_chip_eoi_parent - Invoke EOI on the parent interrupt
1354 * @data: Pointer to interrupt specific data
1358 data = data->parent_data; in irq_chip_eoi_parent()
1359 data->chip->irq_eoi(data); in irq_chip_eoi_parent()
1364 * irq_chip_set_affinity_parent - Set affinity on the parent interrupt
1365 * @data: Pointer to interrupt specific data
1366 * @dest: The affinity mask to set
1374 data = data->parent_data; in irq_chip_set_affinity_parent()
1375 if (data->chip->irq_set_affinity) in irq_chip_set_affinity_parent()
1376 return data->chip->irq_set_affinity(data, dest, force); in irq_chip_set_affinity_parent()
1378 return -ENOSYS; in irq_chip_set_affinity_parent()
1383 * irq_chip_set_type_parent - Set IRQ type on the parent interrupt
1384 * @data: Pointer to interrupt specific data
1385 * @type: IRQ_TYPE_{LEVEL,EDGE}_* value - see include/linux/irq.h
1391 data = data->parent_data; in irq_chip_set_type_parent()
1393 if (data->chip->irq_set_type) in irq_chip_set_type_parent()
1394 return data->chip->irq_set_type(data, type); in irq_chip_set_type_parent()
1396 return -ENOSYS; in irq_chip_set_type_parent()
1401 * irq_chip_retrigger_hierarchy - Retrigger an interrupt in hardware
1402 * @data: Pointer to interrupt specific data
1404 * Iterate through the domain hierarchy of the interrupt and check
1409 for (data = data->parent_data; data; data = data->parent_data) in irq_chip_retrigger_hierarchy()
1410 if (data->chip && data->chip->irq_retrigger) in irq_chip_retrigger_hierarchy()
1411 return data->chip->irq_retrigger(data); in irq_chip_retrigger_hierarchy()
1418 * irq_chip_set_vcpu_affinity_parent - Set vcpu affinity on the parent interrupt
1419 * @data: Pointer to interrupt specific data
1420 * @vcpu_info: The vcpu affinity information
1424 data = data->parent_data; in irq_chip_set_vcpu_affinity_parent()
1425 if (data->chip->irq_set_vcpu_affinity) in irq_chip_set_vcpu_affinity_parent()
1426 return data->chip->irq_set_vcpu_affinity(data, vcpu_info); in irq_chip_set_vcpu_affinity_parent()
1428 return -ENOSYS; in irq_chip_set_vcpu_affinity_parent()
1432 * irq_chip_set_wake_parent - Set/reset wake-up on the parent interrupt
1433 * @data: Pointer to interrupt specific data
1434 * @on: Whether to set or reset the wake-up capability of this irq
1440 data = data->parent_data; in irq_chip_set_wake_parent()
1442 if (data->chip->flags & IRQCHIP_SKIP_SET_WAKE) in irq_chip_set_wake_parent()
1445 if (data->chip->irq_set_wake) in irq_chip_set_wake_parent()
1446 return data->chip->irq_set_wake(data, on); in irq_chip_set_wake_parent()
1448 return -ENOSYS; in irq_chip_set_wake_parent()
1453 * irq_chip_request_resources_parent - Request resources on the parent interrupt
1454 * @data: Pointer to interrupt specific data
1458 data = data->parent_data; in irq_chip_request_resources_parent()
1460 if (data->chip->irq_request_resources) in irq_chip_request_resources_parent()
1461 return data->chip->irq_request_resources(data); in irq_chip_request_resources_parent()
1469 * irq_chip_release_resources_parent - Release resources on the parent interrupt
1470 * @data: Pointer to interrupt specific data
1474 data = data->parent_data; in irq_chip_release_resources_parent()
1475 if (data->chip->irq_release_resources) in irq_chip_release_resources_parent()
1476 data->chip->irq_release_resources(data); in irq_chip_release_resources_parent()
1482 * irq_chip_compose_msi_msg - Compose msi message for a irq chip
1483 * @data: Pointer to interrupt specific data
1495 if (data->chip && data->chip->irq_compose_msi_msg) in irq_chip_compose_msi_msg()
1500 return -ENOSYS; in irq_chip_compose_msi_msg()
1502 pos->chip->irq_compose_msi_msg(pos, msg); in irq_chip_compose_msi_msg()
1508 if (data->domain) in irq_get_pm_device()
1509 return data->domain->pm_dev; in irq_get_pm_device()
1515 * irq_chip_pm_get - Enable power for an IRQ chip
1516 * @data: Pointer to interrupt specific data
1518 * Enable the power to the IRQ chip referenced by the interrupt data
1533 * irq_chip_pm_put - Disable power for an IRQ chip
1534 * @data: Pointer to interrupt specific data
1536 * Disable the power to the IRQ chip referenced by the interrupt data