Lines Matching +full:irq +full:- +full:signals
1 // SPDX-License-Identifier: GPL-2.0-only
9 #include <linux/irq.h>
42 struct mtk_cirq_chip_data *chip_data = data->chip_data; in mtk_cirq_write_mask()
43 unsigned int cirq_num = data->hwirq; in mtk_cirq_write_mask()
46 writel_relaxed(mask, chip_data->base + offset + (cirq_num / 32) * 4); in mtk_cirq_write_mask()
86 data = data->parent_data; in mtk_cirq_set_type()
87 ret = data->chip->irq_set_type(data, type); in mtk_cirq_set_type()
108 if (is_of_node(fwspec->fwnode)) { in mtk_cirq_domain_translate()
109 if (fwspec->param_count != 3) in mtk_cirq_domain_translate()
110 return -EINVAL; in mtk_cirq_domain_translate()
113 if (fwspec->param[0] != 0) in mtk_cirq_domain_translate()
114 return -EINVAL; in mtk_cirq_domain_translate()
116 /* cirq support irq number check */ in mtk_cirq_domain_translate()
117 if (fwspec->param[1] < cirq_data->ext_irq_start || in mtk_cirq_domain_translate()
118 fwspec->param[1] > cirq_data->ext_irq_end) in mtk_cirq_domain_translate()
119 return -EINVAL; in mtk_cirq_domain_translate()
121 *hwirq = fwspec->param[1] - cirq_data->ext_irq_start; in mtk_cirq_domain_translate()
122 *type = fwspec->param[2] & IRQ_TYPE_SENSE_MASK; in mtk_cirq_domain_translate()
126 return -EINVAL; in mtk_cirq_domain_translate()
143 return -EINVAL; in mtk_cirq_domain_alloc()
147 domain->host_data); in mtk_cirq_domain_alloc()
149 parent_fwspec.fwnode = domain->parent->fwnode; in mtk_cirq_domain_alloc()
164 unsigned int irq, hwirq_num; in mtk_cirq_suspend() local
171 * resend the signals according to the status. So if don't clear the in mtk_cirq_suspend()
172 * status, CIRQ will resend the wrong signals. in mtk_cirq_suspend()
179 * - Iterate over all the CIRQ supported interrupts; in mtk_cirq_suspend()
180 * - For each interrupt, inspect its pending and masked status at GIC in mtk_cirq_suspend()
182 * - If pending and unmasked, it happened between in mtk_cirq_suspend()
186 hwirq_num = cirq_data->ext_irq_end - cirq_data->ext_irq_start + 1; in mtk_cirq_suspend()
188 irq = irq_find_mapping(cirq_data->domain, i); in mtk_cirq_suspend()
189 if (irq) { in mtk_cirq_suspend()
190 pendret = irq_get_irqchip_state(irq, in mtk_cirq_suspend()
194 maskret = irq_get_irqchip_state(irq, in mtk_cirq_suspend()
204 writel_relaxed(mask, cirq_data->base + CIRQ_ACK + (i / 32) * 4); in mtk_cirq_suspend()
207 /* set edge_only mode, record edge-triggerd interrupts */ in mtk_cirq_suspend()
209 value = readl_relaxed(cirq_data->base + CIRQ_CONTROL); in mtk_cirq_suspend()
211 writel_relaxed(value, cirq_data->base + CIRQ_CONTROL); in mtk_cirq_suspend()
220 /* flush recorded interrupts, will send signals to parent controller */ in mtk_cirq_resume()
221 value = readl_relaxed(cirq_data->base + CIRQ_CONTROL); in mtk_cirq_resume()
222 writel_relaxed(value | CIRQ_FLUSH, cirq_data->base + CIRQ_CONTROL); in mtk_cirq_resume()
225 value = readl_relaxed(cirq_data->base + CIRQ_CONTROL); in mtk_cirq_resume()
227 writel_relaxed(value, cirq_data->base + CIRQ_CONTROL); in mtk_cirq_resume()
252 pr_err("mtk_cirq: interrupt-parent not found\n"); in mtk_cirq_of_init()
253 return -EINVAL; in mtk_cirq_of_init()
258 return -ENOMEM; in mtk_cirq_of_init()
260 cirq_data->base = of_iomap(node, 0); in mtk_cirq_of_init()
261 if (!cirq_data->base) { in mtk_cirq_of_init()
263 ret = -ENXIO; in mtk_cirq_of_init()
267 ret = of_property_read_u32_index(node, "mediatek,ext-irq-range", 0, in mtk_cirq_of_init()
268 &cirq_data->ext_irq_start); in mtk_cirq_of_init()
272 ret = of_property_read_u32_index(node, "mediatek,ext-irq-range", 1, in mtk_cirq_of_init()
273 &cirq_data->ext_irq_end); in mtk_cirq_of_init()
277 irq_num = cirq_data->ext_irq_end - cirq_data->ext_irq_start + 1; in mtk_cirq_of_init()
282 ret = -ENOMEM; in mtk_cirq_of_init()
285 cirq_data->domain = domain; in mtk_cirq_of_init()
292 iounmap(cirq_data->base); in mtk_cirq_of_init()
298 IRQCHIP_DECLARE(mtk_cirq, "mediatek,mtk-cirq", mtk_cirq_of_init);