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 12struct ipa; 13struct ipa_interrupt; 14enum 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 */ 26void 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 */ 34void 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 */ 43void 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 */ 54void 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 */ 61void 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 */ 68void 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 */ 76void 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 */ 84void 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 */ 92struct 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 */ 98void ipa_interrupt_deconfig(struct ipa_interrupt *interrupt); 99 100#endif /* _IPA_INTERRUPT_H_ */ 101