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
22 #include <linux/interrupt.h>
36 * struct ipa_interrupt - IPA interrupt information
40 * @suspend_enabled: Bitmap of endpoints with the SUSPEND interrupt enabled
49 /* Clear the suspend interrupt for all endpoints that signaled it */
50 static void ipa_interrupt_suspend_clear_all(struct ipa_interrupt *interrupt) in ipa_interrupt_suspend_clear_all() argument
52 struct ipa *ipa = interrupt->ipa; in ipa_interrupt_suspend_clear_all()
64 /* SUSPEND interrupt status isn't cleared on IPA version 3.0 */ in ipa_interrupt_suspend_clear_all()
73 /* Process a particular interrupt type that has been received */
74 static void ipa_interrupt_process(struct ipa_interrupt *interrupt, u32 irq_id) in ipa_interrupt_process() argument
76 struct ipa *ipa = interrupt->ipa; in ipa_interrupt_process()
87 /* For microcontroller interrupts, clear the interrupt right in ipa_interrupt_process()
95 /* Clearing the SUSPEND_TX interrupt also clears the in ipa_interrupt_process()
97 * caused the interrupt, so defer clearing until after in ipa_interrupt_process()
100 ipa_interrupt_suspend_clear_all(interrupt); in ipa_interrupt_process()
112 struct ipa_interrupt *interrupt = dev_id; in ipa_isr_thread() local
113 struct ipa *ipa = interrupt->ipa; in ipa_isr_thread()
114 u32 enabled = interrupt->enabled; in ipa_isr_thread()
127 * including conditions whose interrupt is not enabled. Handle in ipa_isr_thread()
139 ipa_interrupt_process(interrupt, irq_id); in ipa_isr_thread()
162 iowrite32(ipa->interrupt->enabled, ipa->reg_virt + reg_offset(reg)); in ipa_interrupt_enabled_update()
165 /* Enable an IPA interrupt type */
168 /* Update the IPA interrupt mask to enable it */ in ipa_interrupt_enable()
169 ipa->interrupt->enabled |= BIT(ipa_irq); in ipa_interrupt_enable()
173 /* Disable an IPA interrupt type */
176 /* Update the IPA interrupt mask to disable it */ in ipa_interrupt_disable()
177 ipa->interrupt->enabled &= ~BIT(ipa_irq); in ipa_interrupt_disable()
183 disable_irq(ipa->interrupt->irq); in ipa_interrupt_irq_disable()
188 enable_irq(ipa->interrupt->irq); in ipa_interrupt_irq_enable()
192 static void ipa_interrupt_suspend_control(struct ipa_interrupt *interrupt, in ipa_interrupt_suspend_control() argument
195 struct ipa *ipa = interrupt->ipa; in ipa_interrupt_suspend_control()
205 /* IPA version 3.0 does not support TX_SUSPEND interrupt control */ in ipa_interrupt_suspend_control()
209 weight = bitmap_weight(interrupt->suspend_enabled, ipa->endpoint_count); in ipa_interrupt_suspend_control()
221 __change_bit(endpoint_id, interrupt->suspend_enabled); in ipa_interrupt_suspend_control()
231 ipa_interrupt_suspend_enable(struct ipa_interrupt *interrupt, u32 endpoint_id) in ipa_interrupt_suspend_enable() argument
233 ipa_interrupt_suspend_control(interrupt, endpoint_id, true); in ipa_interrupt_suspend_enable()
238 ipa_interrupt_suspend_disable(struct ipa_interrupt *interrupt, u32 endpoint_id) in ipa_interrupt_suspend_disable() argument
240 ipa_interrupt_suspend_control(interrupt, endpoint_id, false); in ipa_interrupt_suspend_disable()
243 /* Simulate arrival of an IPA TX_SUSPEND interrupt */
244 void ipa_interrupt_simulate_suspend(struct ipa_interrupt *interrupt) in ipa_interrupt_simulate_suspend() argument
246 ipa_interrupt_process(interrupt, IPA_IRQ_TX_SUSPEND); in ipa_interrupt_simulate_suspend()
249 /* Configure the IPA interrupt framework */
252 struct ipa_interrupt *interrupt = ipa->interrupt; in ipa_interrupt_config() local
253 unsigned int irq = interrupt->irq; in ipa_interrupt_config()
258 interrupt->ipa = ipa; in ipa_interrupt_config()
260 /* Initially all IPA interrupt types are disabled */ in ipa_interrupt_config()
261 interrupt->enabled = 0; in ipa_interrupt_config()
262 interrupt->suspend_enabled = bitmap_zalloc(ipa->endpoint_count, in ipa_interrupt_config()
264 if (!interrupt->suspend_enabled) { in ipa_interrupt_config()
269 /* Disable IPA interrupt types */ in ipa_interrupt_config()
274 "ipa", interrupt); in ipa_interrupt_config()
293 ipa->interrupt = interrupt; in ipa_interrupt_config()
300 free_irq(interrupt->irq, interrupt); in ipa_interrupt_config()
302 bitmap_free(interrupt->suspend_enabled); in ipa_interrupt_config()
304 kfree(interrupt); in ipa_interrupt_config()
312 struct ipa_interrupt *interrupt = ipa->interrupt; in ipa_interrupt_deconfig() local
315 ipa->interrupt = NULL; in ipa_interrupt_deconfig()
319 free_irq(interrupt->irq, interrupt); in ipa_interrupt_deconfig()
320 bitmap_free(interrupt->suspend_enabled); in ipa_interrupt_deconfig()
323 /* Initialize the IPA interrupt structure */
326 struct ipa_interrupt *interrupt; in ipa_interrupt_init() local
333 interrupt = kzalloc(sizeof(*interrupt), GFP_KERNEL); in ipa_interrupt_init()
334 if (!interrupt) in ipa_interrupt_init()
336 interrupt->irq = irq; in ipa_interrupt_init()
338 return interrupt; in ipa_interrupt_init()
342 void ipa_interrupt_exit(struct ipa_interrupt *interrupt) in ipa_interrupt_exit() argument
344 kfree(interrupt); in ipa_interrupt_exit()