Lines Matching full:interrupt
9 * The IPA has an interrupt line distinct from the interrupt used by the GSI
13 * embedded in the IPA. Each IPA interrupt type can be both masked and
23 #include <linux/interrupt.h>
35 * struct ipa_interrupt - IPA interrupt information
46 /* Process a particular interrupt type that has been received */
47 static void ipa_interrupt_process(struct ipa_interrupt *interrupt, u32 irq_id) in ipa_interrupt_process() argument
49 struct ipa *ipa = interrupt->ipa; in ipa_interrupt_process()
60 /* For microcontroller interrupts, clear the interrupt right in ipa_interrupt_process()
68 /* Clearing the SUSPEND_TX interrupt also clears the in ipa_interrupt_process()
70 * caused the interrupt, so defer clearing until after in ipa_interrupt_process()
85 struct ipa_interrupt *interrupt = dev_id; in ipa_isr_thread() local
86 struct ipa *ipa = interrupt->ipa; in ipa_isr_thread()
87 u32 enabled = interrupt->enabled; in ipa_isr_thread()
101 * including conditions whose interrupt is not enabled. Handle in ipa_isr_thread()
113 ipa_interrupt_process(interrupt, irq_id); in ipa_isr_thread()
136 iowrite32(ipa->interrupt->enabled, ipa->reg_virt + reg_offset(reg)); in ipa_interrupt_enabled_update()
139 /* Enable an IPA interrupt type */
142 /* Update the IPA interrupt mask to enable it */ in ipa_interrupt_enable()
143 ipa->interrupt->enabled |= BIT(ipa_irq); in ipa_interrupt_enable()
147 /* Disable an IPA interrupt type */
150 /* Update the IPA interrupt mask to disable it */ in ipa_interrupt_disable()
151 ipa->interrupt->enabled &= ~BIT(ipa_irq); in ipa_interrupt_disable()
157 disable_irq(ipa->interrupt->irq); in ipa_interrupt_irq_disable()
162 enable_irq(ipa->interrupt->irq); in ipa_interrupt_irq_enable()
166 static void ipa_interrupt_suspend_control(struct ipa_interrupt *interrupt, in ipa_interrupt_suspend_control() argument
169 struct ipa *ipa = interrupt->ipa; in ipa_interrupt_suspend_control()
178 /* IPA version 3.0 does not support TX_SUSPEND interrupt control */ in ipa_interrupt_suspend_control()
196 ipa_interrupt_suspend_enable(struct ipa_interrupt *interrupt, u32 endpoint_id) in ipa_interrupt_suspend_enable() argument
198 ipa_interrupt_suspend_control(interrupt, endpoint_id, true); in ipa_interrupt_suspend_enable()
203 ipa_interrupt_suspend_disable(struct ipa_interrupt *interrupt, u32 endpoint_id) in ipa_interrupt_suspend_disable() argument
205 ipa_interrupt_suspend_control(interrupt, endpoint_id, false); in ipa_interrupt_suspend_disable()
208 /* Clear the suspend interrupt for all endpoints that signaled it */
209 void ipa_interrupt_suspend_clear_all(struct ipa_interrupt *interrupt) in ipa_interrupt_suspend_clear_all() argument
211 struct ipa *ipa = interrupt->ipa; in ipa_interrupt_suspend_clear_all()
223 /* SUSPEND interrupt status isn't cleared on IPA version 3.0 */ in ipa_interrupt_suspend_clear_all()
232 /* Simulate arrival of an IPA TX_SUSPEND interrupt */
233 void ipa_interrupt_simulate_suspend(struct ipa_interrupt *interrupt) in ipa_interrupt_simulate_suspend() argument
235 ipa_interrupt_process(interrupt, IPA_IRQ_TX_SUSPEND); in ipa_interrupt_simulate_suspend()
238 /* Configure the IPA interrupt framework */
242 struct ipa_interrupt *interrupt; in ipa_interrupt_config() local
255 interrupt = kzalloc(sizeof(*interrupt), GFP_KERNEL); in ipa_interrupt_config()
256 if (!interrupt) in ipa_interrupt_config()
258 interrupt->ipa = ipa; in ipa_interrupt_config()
259 interrupt->irq = irq; in ipa_interrupt_config()
266 "ipa", interrupt); in ipa_interrupt_config()
278 return interrupt; in ipa_interrupt_config()
281 free_irq(interrupt->irq, interrupt); in ipa_interrupt_config()
283 kfree(interrupt); in ipa_interrupt_config()
289 void ipa_interrupt_deconfig(struct ipa_interrupt *interrupt) in ipa_interrupt_deconfig() argument
291 struct device *dev = &interrupt->ipa->pdev->dev; in ipa_interrupt_deconfig()
294 free_irq(interrupt->irq, interrupt); in ipa_interrupt_deconfig()
295 kfree(interrupt); in ipa_interrupt_deconfig()