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_simulate_suspend() - Simulate TX_SUSPEND IPA interrupt 39 * @interrupt: IPA interrupt structure 40 * 41 * This calls the TX_SUSPEND interrupt handler, as if such an interrupt 42 * had been signaled. This is needed to work around a hardware quirk 43 * that occurs if aggregation is active on an endpoint when its underlying 44 * channel is suspended. 45 */ 46 void ipa_interrupt_simulate_suspend(struct ipa_interrupt *interrupt); 47 48 /** 49 * ipa_interrupt_enable() - Enable an IPA interrupt type 50 * @ipa: IPA pointer 51 * @ipa_irq: IPA interrupt ID 52 */ 53 void ipa_interrupt_enable(struct ipa *ipa, enum ipa_irq_id ipa_irq); 54 55 /** 56 * ipa_interrupt_disable() - Disable an IPA interrupt type 57 * @ipa: IPA pointer 58 * @ipa_irq: IPA interrupt ID 59 */ 60 void ipa_interrupt_disable(struct ipa *ipa, enum ipa_irq_id ipa_irq); 61 62 /** 63 * ipa_interrupt_irq_enable() - Enable IPA interrupts 64 * @ipa: IPA pointer 65 * 66 * This enables the IPA interrupt line 67 */ 68 void ipa_interrupt_irq_enable(struct ipa *ipa); 69 70 /** 71 * ipa_interrupt_irq_disable() - Disable IPA interrupts 72 * @ipa: IPA pointer 73 * 74 * This disables the IPA interrupt line 75 */ 76 void ipa_interrupt_irq_disable(struct ipa *ipa); 77 78 /** 79 * ipa_interrupt_config() - Configure IPA interrupts 80 * @ipa: IPA pointer 81 * 82 * Return: 0 if successful, or a negative error code 83 */ 84 int ipa_interrupt_config(struct ipa *ipa); 85 86 /** 87 * ipa_interrupt_deconfig() - Inverse of ipa_interrupt_config() 88 * @ipa: IPA pointer 89 */ 90 void ipa_interrupt_deconfig(struct ipa *ipa); 91 92 /** 93 * ipa_interrupt_init() - Initialize the IPA interrupt structure 94 * @pdev: IPA platform device pointer 95 * 96 * Return: Pointer to an IPA interrupt structure, or a pointer-coded error 97 */ 98 struct ipa_interrupt *ipa_interrupt_init(struct platform_device *pdev); 99 100 /** 101 * ipa_interrupt_exit() - Inverse of ipa_interrupt_init() 102 * @interrupt: IPA interrupt structure 103 */ 104 void ipa_interrupt_exit(struct ipa_interrupt *interrupt); 105 106 #endif /* _IPA_INTERRUPT_H_ */ 107