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()
161 iowrite32(ipa->interrupt->enabled, ipa->reg_virt + reg_offset(reg)); in ipa_interrupt_enabled_update()
164 /* Enable an IPA interrupt type */
167 /* Update the IPA interrupt mask to enable it */ in ipa_interrupt_enable()
168 ipa->interrupt->enabled |= BIT(ipa_irq); in ipa_interrupt_enable()
172 /* Disable an IPA interrupt type */
175 /* Update the IPA interrupt mask to disable it */ in ipa_interrupt_disable()
176 ipa->interrupt->enabled &= ~BIT(ipa_irq); in ipa_interrupt_disable()
182 disable_irq(ipa->interrupt->irq); in ipa_interrupt_irq_disable()
187 enable_irq(ipa->interrupt->irq); in ipa_interrupt_irq_enable()
191 static void ipa_interrupt_suspend_control(struct ipa_interrupt *interrupt, in ipa_interrupt_suspend_control() argument
194 struct ipa *ipa = interrupt->ipa; in ipa_interrupt_suspend_control()
204 /* IPA version 3.0 does not support TX_SUSPEND interrupt control */ in ipa_interrupt_suspend_control()
208 weight = bitmap_weight(interrupt->suspend_enabled, ipa->endpoint_count); in ipa_interrupt_suspend_control()
220 __change_bit(endpoint_id, interrupt->suspend_enabled); in ipa_interrupt_suspend_control()
230 ipa_interrupt_suspend_enable(struct ipa_interrupt *interrupt, u32 endpoint_id) in ipa_interrupt_suspend_enable() argument
232 ipa_interrupt_suspend_control(interrupt, endpoint_id, true); in ipa_interrupt_suspend_enable()
237 ipa_interrupt_suspend_disable(struct ipa_interrupt *interrupt, u32 endpoint_id) in ipa_interrupt_suspend_disable() argument
239 ipa_interrupt_suspend_control(interrupt, endpoint_id, false); in ipa_interrupt_suspend_disable()
242 /* Simulate arrival of an IPA TX_SUSPEND interrupt */
243 void ipa_interrupt_simulate_suspend(struct ipa_interrupt *interrupt) in ipa_interrupt_simulate_suspend() argument
245 ipa_interrupt_process(interrupt, IPA_IRQ_TX_SUSPEND); in ipa_interrupt_simulate_suspend()
248 /* Configure the IPA interrupt framework */
251 struct ipa_interrupt *interrupt = ipa->interrupt; in ipa_interrupt_config() local
252 unsigned int irq = interrupt->irq; in ipa_interrupt_config()
257 interrupt->ipa = ipa; in ipa_interrupt_config()
259 /* Initially all IPA interrupt types are disabled */ in ipa_interrupt_config()
260 interrupt->enabled = 0; in ipa_interrupt_config()
261 interrupt->suspend_enabled = bitmap_zalloc(ipa->endpoint_count, in ipa_interrupt_config()
263 if (!interrupt->suspend_enabled) { in ipa_interrupt_config()
268 /* Disable IPA interrupt types */ in ipa_interrupt_config()
273 "ipa", interrupt); in ipa_interrupt_config()
292 ipa->interrupt = interrupt; in ipa_interrupt_config()
299 free_irq(interrupt->irq, interrupt); in ipa_interrupt_config()
301 bitmap_free(interrupt->suspend_enabled); in ipa_interrupt_config()
303 kfree(interrupt); in ipa_interrupt_config()
311 struct ipa_interrupt *interrupt = ipa->interrupt; in ipa_interrupt_deconfig() local
314 ipa->interrupt = NULL; in ipa_interrupt_deconfig()
318 free_irq(interrupt->irq, interrupt); in ipa_interrupt_deconfig()
319 bitmap_free(interrupt->suspend_enabled); in ipa_interrupt_deconfig()
322 /* Initialize the IPA interrupt structure */
325 struct ipa_interrupt *interrupt; in ipa_interrupt_init() local
332 interrupt = kzalloc_obj(*interrupt); in ipa_interrupt_init()
333 if (!interrupt) in ipa_interrupt_init()
335 interrupt->irq = irq; in ipa_interrupt_init()
337 return interrupt; in ipa_interrupt_init()
341 void ipa_interrupt_exit(struct ipa_interrupt *interrupt) in ipa_interrupt_exit() argument
343 kfree(interrupt); in ipa_interrupt_exit()