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
24 #include <linux/interrupt.h>
36 * struct ipa_interrupt - IPA interrupt information
47 /* Clear the suspend interrupt for all endpoints that signaled it */
48 static void ipa_interrupt_suspend_clear_all(struct ipa_interrupt *interrupt)
50 struct ipa *ipa = interrupt->ipa;
62 /* SUSPEND interrupt status isn't cleared on IPA version 3.0 */
71 /* Process a particular interrupt type that has been received */
72 static void ipa_interrupt_process(struct ipa_interrupt *interrupt, u32 irq_id)
74 struct ipa *ipa = interrupt->ipa;
85 /* For microcontroller interrupts, clear the interrupt right
93 /* Clearing the SUSPEND_TX interrupt also clears the
95 * caused the interrupt, so defer clearing until after
98 ipa_interrupt_suspend_clear_all(interrupt);
110 struct ipa_interrupt *interrupt = dev_id;
111 struct ipa *ipa = interrupt->ipa;
112 u32 enabled = interrupt->enabled;
125 * including conditions whose interrupt is not enabled. Handle
137 ipa_interrupt_process(interrupt, irq_id);
160 iowrite32(ipa->interrupt->enabled, ipa->reg_virt + reg_offset(reg));
163 /* Enable an IPA interrupt type */
166 /* Update the IPA interrupt mask to enable it */
167 ipa->interrupt->enabled |= BIT(ipa_irq);
171 /* Disable an IPA interrupt type */
174 /* Update the IPA interrupt mask to disable it */
175 ipa->interrupt->enabled &= ~BIT(ipa_irq);
181 disable_irq(ipa->interrupt->irq);
186 enable_irq(ipa->interrupt->irq);
190 static void ipa_interrupt_suspend_control(struct ipa_interrupt *interrupt,
193 struct ipa *ipa = interrupt->ipa;
202 /* IPA version 3.0 does not support TX_SUSPEND interrupt control */
220 ipa_interrupt_suspend_enable(struct ipa_interrupt *interrupt, u32 endpoint_id)
222 ipa_interrupt_suspend_control(interrupt, endpoint_id, true);
227 ipa_interrupt_suspend_disable(struct ipa_interrupt *interrupt, u32 endpoint_id)
229 ipa_interrupt_suspend_control(interrupt, endpoint_id, false);
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 */
241 struct ipa_interrupt *interrupt = ipa->interrupt;
242 unsigned int irq = interrupt->irq;
247 interrupt->ipa = ipa;
249 /* Disable all IPA interrupt types */
254 "ipa", interrupt);
267 ipa->interrupt = interrupt;
272 free_irq(interrupt->irq, interrupt);
274 kfree(interrupt);
282 struct ipa_interrupt *interrupt = ipa->interrupt;
285 ipa->interrupt = NULL;
288 free_irq(interrupt->irq, interrupt);
291 /* Initialize the IPA interrupt structure */
295 struct ipa_interrupt *interrupt;
305 interrupt = kzalloc(sizeof(*interrupt), GFP_KERNEL);
306 if (!interrupt)
308 interrupt->irq = irq;
310 return interrupt;
314 void ipa_interrupt_exit(struct ipa_interrupt *interrupt)
316 kfree(interrupt);