Lines Matching refs: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)
49 struct ipa *ipa = interrupt->ipa;
60 /* For microcontroller interrupts, clear the interrupt right
68 /* Clearing the SUSPEND_TX interrupt also clears the
70 * caused the interrupt, so defer clearing until after
85 struct ipa_interrupt *interrupt = dev_id;
86 struct ipa *ipa = interrupt->ipa;
87 u32 enabled = interrupt->enabled;
101 * including conditions whose interrupt is not enabled. Handle
113 ipa_interrupt_process(interrupt, irq_id);
136 iowrite32(ipa->interrupt->enabled, ipa->reg_virt + reg_offset(reg));
139 /* Enable an IPA interrupt type */
142 /* Update the IPA interrupt mask to enable it */
143 ipa->interrupt->enabled |= BIT(ipa_irq);
147 /* Disable an IPA interrupt type */
150 /* Update the IPA interrupt mask to disable it */
151 ipa->interrupt->enabled &= ~BIT(ipa_irq);
157 disable_irq(ipa->interrupt->irq);
162 enable_irq(ipa->interrupt->irq);
166 static void ipa_interrupt_suspend_control(struct ipa_interrupt *interrupt,
169 struct ipa *ipa = interrupt->ipa;
178 /* IPA version 3.0 does not support TX_SUSPEND interrupt control */
196 ipa_interrupt_suspend_enable(struct ipa_interrupt *interrupt, u32 endpoint_id)
198 ipa_interrupt_suspend_control(interrupt, endpoint_id, true);
203 ipa_interrupt_suspend_disable(struct ipa_interrupt *interrupt, u32 endpoint_id)
205 ipa_interrupt_suspend_control(interrupt, endpoint_id, false);
208 /* Clear the suspend interrupt for all endpoints that signaled it */
209 void ipa_interrupt_suspend_clear_all(struct ipa_interrupt *interrupt)
211 struct ipa *ipa = interrupt->ipa;
223 /* SUSPEND interrupt status isn't cleared on IPA version 3.0 */
232 /* Simulate arrival of an IPA TX_SUSPEND interrupt */
233 void ipa_interrupt_simulate_suspend(struct ipa_interrupt *interrupt)
235 ipa_interrupt_process(interrupt, IPA_IRQ_TX_SUSPEND);
238 /* Configure the IPA interrupt framework */
242 struct ipa_interrupt *interrupt;
255 interrupt = kzalloc(sizeof(*interrupt), GFP_KERNEL);
256 if (!interrupt)
258 interrupt->ipa = ipa;
259 interrupt->irq = irq;
266 "ipa", interrupt);
278 return interrupt;
281 free_irq(interrupt->irq, interrupt);
283 kfree(interrupt);
289 void ipa_interrupt_deconfig(struct ipa_interrupt *interrupt)
291 struct device *dev = &interrupt->ipa->pdev->dev;
294 free_irq(interrupt->irq, interrupt);
295 kfree(interrupt);