Lines Matching +full:enable +full:- +full:offset
1 // SPDX-License-Identifier: GPL-2.0
3 /* Copyright (c) 2014-2018, The Linux Foundation. All rights reserved.
4 * Copyright (C) 2018-2024 Linaro Ltd.
36 * struct ipa_interrupt - IPA interrupt information
52 struct ipa *ipa = interrupt->ipa; in ipa_interrupt_suspend_clear_all()
56 unit_count = DIV_ROUND_UP(ipa->endpoint_count, 32); in ipa_interrupt_suspend_clear_all()
62 val = ioread32(ipa->reg_virt + reg_n_offset(reg, unit)); in ipa_interrupt_suspend_clear_all()
65 if (!val || ipa->version == IPA_VERSION_3_0) in ipa_interrupt_suspend_clear_all()
69 iowrite32(val, ipa->reg_virt + reg_n_offset(reg, unit)); in ipa_interrupt_suspend_clear_all()
76 struct ipa *ipa = interrupt->ipa; in ipa_interrupt_process()
79 u32 offset; in ipa_interrupt_process() local
82 offset = reg_offset(reg); in ipa_interrupt_process()
90 iowrite32(mask, ipa->reg_virt + offset); in ipa_interrupt_process()
104 iowrite32(mask, ipa->reg_virt + offset); in ipa_interrupt_process()
113 struct ipa *ipa = interrupt->ipa; in ipa_isr_thread()
114 u32 enabled = interrupt->enabled; in ipa_isr_thread()
115 struct device *dev = ipa->dev; in ipa_isr_thread()
118 u32 offset; in ipa_isr_thread() local
131 offset = reg_offset(reg); in ipa_isr_thread()
132 pending = ioread32(ipa->reg_virt + offset); in ipa_isr_thread()
141 pending = ioread32(ipa->reg_virt + offset); in ipa_isr_thread()
149 iowrite32(pending, ipa->reg_virt + reg_offset(reg)); in ipa_isr_thread()
162 iowrite32(ipa->interrupt->enabled, ipa->reg_virt + reg_offset(reg)); in ipa_interrupt_enabled_update()
165 /* Enable an IPA interrupt type */
168 /* Update the IPA interrupt mask to enable it */ in ipa_interrupt_enable()
169 ipa->interrupt->enabled |= BIT(ipa_irq); in ipa_interrupt_enable()
177 ipa->interrupt->enabled &= ~BIT(ipa_irq); in ipa_interrupt_disable()
183 disable_irq(ipa->interrupt->irq); in ipa_interrupt_irq_disable()
188 enable_irq(ipa->interrupt->irq); in ipa_interrupt_irq_enable()
191 /* Common function used to enable/disable TX_SUSPEND for an endpoint */
193 u32 endpoint_id, bool enable) in ipa_interrupt_suspend_control() argument
195 struct ipa *ipa = interrupt->ipa; in ipa_interrupt_suspend_control()
200 u32 offset; in ipa_interrupt_suspend_control() local
203 WARN_ON(!test_bit(endpoint_id, ipa->available)); in ipa_interrupt_suspend_control()
206 if (ipa->version == IPA_VERSION_3_0) in ipa_interrupt_suspend_control()
209 weight = bitmap_weight(interrupt->suspend_enabled, ipa->endpoint_count); in ipa_interrupt_suspend_control()
210 if (weight == 1 && !enable) in ipa_interrupt_suspend_control()
214 offset = reg_n_offset(reg, unit); in ipa_interrupt_suspend_control()
215 val = ioread32(ipa->reg_virt + offset); in ipa_interrupt_suspend_control()
217 if (enable) in ipa_interrupt_suspend_control()
221 __change_bit(endpoint_id, interrupt->suspend_enabled); in ipa_interrupt_suspend_control()
223 iowrite32(val, ipa->reg_virt + offset); in ipa_interrupt_suspend_control()
225 if (!weight && enable) in ipa_interrupt_suspend_control()
229 /* Enable TX_SUSPEND for an endpoint */
252 struct ipa_interrupt *interrupt = ipa->interrupt; in ipa_interrupt_config()
253 unsigned int irq = interrupt->irq; in ipa_interrupt_config()
254 struct device *dev = ipa->dev; in ipa_interrupt_config()
258 interrupt->ipa = ipa; in ipa_interrupt_config()
261 interrupt->enabled = 0; in ipa_interrupt_config()
262 interrupt->suspend_enabled = bitmap_zalloc(ipa->endpoint_count, in ipa_interrupt_config()
264 if (!interrupt->suspend_enabled) { in ipa_interrupt_config()
265 ret = -ENOMEM; in ipa_interrupt_config()
271 iowrite32(0, ipa->reg_virt + reg_offset(reg)); in ipa_interrupt_config()
293 ipa->interrupt = interrupt; in ipa_interrupt_config()
300 free_irq(interrupt->irq, interrupt); in ipa_interrupt_config()
302 bitmap_free(interrupt->suspend_enabled); in ipa_interrupt_config()
312 struct ipa_interrupt *interrupt = ipa->interrupt; in ipa_interrupt_deconfig()
313 struct device *dev = ipa->dev; in ipa_interrupt_deconfig()
315 ipa->interrupt = NULL; in ipa_interrupt_deconfig()
319 free_irq(interrupt->irq, interrupt); in ipa_interrupt_deconfig()
320 bitmap_free(interrupt->suspend_enabled); in ipa_interrupt_deconfig()
331 return ERR_PTR(irq ? : -EINVAL); in ipa_interrupt_init()
335 return ERR_PTR(-ENOMEM); in ipa_interrupt_init()
336 interrupt->irq = irq; in ipa_interrupt_init()