1 /* SPDX-License-Identifier: GPL-2.0 */ 2 3 /* Copyright (c) 2012-2018, The Linux Foundation. All rights reserved. 4 * Copyright (C) 2018-2022 Linaro Ltd. 5 */ 6 #ifndef _IPA_INTERRUPT_H_ 7 #define _IPA_INTERRUPT_H_ 8 9 #include <linux/types.h> 10 #include <linux/bits.h> 11 12 struct ipa; 13 struct ipa_interrupt; 14 enum ipa_irq_id; 15 16 /** 17 * ipa_interrupt_suspend_enable - Enable TX_SUSPEND for an endpoint 18 * @interrupt: IPA interrupt structure 19 * @endpoint_id: Endpoint whose interrupt should be enabled 20 * 21 * Note: The "TX" in the name is from the perspective of the IPA hardware. 22 * A TX_SUSPEND interrupt arrives on an AP RX enpoint when packet data can't 23 * be delivered to the endpoint because it is suspended (or its underlying 24 * channel is stopped). 25 */ 26 void ipa_interrupt_suspend_enable(struct ipa_interrupt *interrupt, 27 u32 endpoint_id); 28 29 /** 30 * ipa_interrupt_suspend_disable - Disable TX_SUSPEND for an endpoint 31 * @interrupt: IPA interrupt structure 32 * @endpoint_id: Endpoint whose interrupt should be disabled 33 */ 34 void ipa_interrupt_suspend_disable(struct ipa_interrupt *interrupt, 35 u32 endpoint_id); 36 37 /** 38 * ipa_interrupt_suspend_clear_all - clear all suspend interrupts 39 * @interrupt: IPA interrupt structure 40 * 41 * Clear the TX_SUSPEND interrupt for all endpoints that signaled it. 42 */ 43 void ipa_interrupt_suspend_clear_all(struct ipa_interrupt *interrupt); 44 45 /** 46 * ipa_interrupt_simulate_suspend() - Simulate TX_SUSPEND IPA interrupt 47 * @interrupt: IPA interrupt structure 48 * 49 * This calls the TX_SUSPEND interrupt handler, as if such an interrupt 50 * had been signaled. This is needed to work around a hardware quirk 51 * that occurs if aggregation is active on an endpoint when its underlying 52 * channel is suspended. 53 */ 54 void ipa_interrupt_simulate_suspend(struct ipa_interrupt *interrupt); 55 56 /** 57 * ipa_interrupt_enable() - Enable an IPA interrupt type 58 * @ipa: IPA pointer 59 * @ipa_irq: IPA interrupt ID 60 */ 61 void ipa_interrupt_enable(struct ipa *ipa, enum ipa_irq_id ipa_irq); 62 63 /** 64 * ipa_interrupt_disable() - Disable an IPA interrupt type 65 * @ipa: IPA pointer 66 * @ipa_irq: IPA interrupt ID 67 */ 68 void ipa_interrupt_disable(struct ipa *ipa, enum ipa_irq_id ipa_irq); 69 70 /** 71 * ipa_interrupt_irq_enable() - Enable IPA interrupts 72 * @ipa: IPA pointer 73 * 74 * This enables the IPA interrupt line 75 */ 76 void ipa_interrupt_irq_enable(struct ipa *ipa); 77 78 /** 79 * ipa_interrupt_irq_disable() - Disable IPA interrupts 80 * @ipa: IPA pointer 81 * 82 * This disables the IPA interrupt line 83 */ 84 void ipa_interrupt_irq_disable(struct ipa *ipa); 85 86 /** 87 * ipa_interrupt_config() - Configure the IPA interrupt framework 88 * @ipa: IPA pointer 89 * 90 * Return: Pointer to IPA SMP2P info, or a pointer-coded error 91 */ 92 struct ipa_interrupt *ipa_interrupt_config(struct ipa *ipa); 93 94 /** 95 * ipa_interrupt_deconfig() - Inverse of ipa_interrupt_config() 96 * @interrupt: IPA interrupt structure 97 */ 98 void ipa_interrupt_deconfig(struct ipa_interrupt *interrupt); 99 100 #endif /* _IPA_INTERRUPT_H_ */ 101