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_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 */ 46void 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 */ 53void 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 */ 60void 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 */ 68void 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 */ 76void 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 */ 84int ipa_interrupt_config(struct ipa *ipa); 85 86/** 87 * ipa_interrupt_deconfig() - Inverse of ipa_interrupt_config() 88 * @ipa: IPA pointer 89 */ 90void 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 */ 98struct 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 */ 104void ipa_interrupt_exit(struct ipa_interrupt *interrupt); 105 106#endif /* _IPA_INTERRUPT_H_ */ 107