Lines Matching +full:num +full:- +full:irqs

4  * SPDX-License-Identifier:     GPL-2.0+
12 #include <asm/u-boot-arm.h>
13 #include <irq-generic.h>
14 #include "irq-internal.h"
59 if (irq >= desc->irq_base && irq <= desc->irq_end) in find_virq_desc()
73 if (parent_irq == desc->pirq) in find_virq_desc_by_pirq()
87 return -EINVAL; in virq_to_irq()
91 if (desc->chip == chip) { in virq_to_irq()
92 irq = desc->irq_base + virq; in virq_to_irq()
93 if (irq >= desc->irq_base && irq <= desc->irq_end) in virq_to_irq()
98 return -ENONET; in virq_to_irq()
111 int num; in virqs_show() local
118 vdata = desc->virqs; in virqs_show()
119 num = desc->irq_end - desc->irq_base; in virqs_show()
121 for (i = 0; i < num; i++) { in virqs_show()
126 printf(" %3d %d 0x%08lx %-12s |-- %-12s %d\n", in virqs_show()
129 (ulong)vdata[i].handle_irq, dev->driver->name, dev->name, in virqs_show()
140 return -EINVAL; in virq_install_handler()
144 return -ENOENT; in virq_install_handler()
146 virq = irq - desc->irq_base; in virq_install_handler()
147 if (desc->virqs[virq].handle_irq) in virq_install_handler()
148 return -EBUSY; in virq_install_handler()
150 desc->virqs[virq].handle_irq = handler; in virq_install_handler()
151 desc->virqs[virq].data = data; in virq_install_handler()
165 virq = irq - desc->irq_base; in virq_free_handler()
166 desc->virqs[virq].handle_irq = NULL; in virq_free_handler()
167 desc->virqs[virq].data = NULL; in virq_free_handler()
174 if (idx <= desc->unalign_reg_idx) { in reg_base_get()
175 reg_addr = reg_base + (idx * desc->unalign_reg_stride); in reg_base_get()
178 (desc->unalign_reg_idx * desc->unalign_reg_stride); in reg_base_get()
179 reg_addr += (idx - desc->unalign_reg_idx) * desc->reg_stride; in reg_base_get()
201 chip = desc->chip; in virq_chip_generic_handler()
202 vdata = desc->virqs; in virq_chip_generic_handler()
209 for (i = 0; i < chip->num_regs; i++) { in virq_chip_generic_handler()
210 status_reg = reg_base_get(desc, chip->status_base, i); in virq_chip_generic_handler()
211 desc->status_buf[i] = chip->read(parent, status_reg); in virq_chip_generic_handler()
212 if (desc->status_buf[i] < 0) { in virq_chip_generic_handler()
214 __func__, status_reg, desc->status_buf[i]); in virq_chip_generic_handler()
219 for (i = 0; i < chip->num_irqs; i++) { in virq_chip_generic_handler()
220 if (desc->status_buf[chip->irqs[i].reg_offset] & in virq_chip_generic_handler()
221 chip->irqs[i].mask) { in virq_chip_generic_handler()
233 for (i = 0; i < chip->num_regs; i++) { in virq_chip_generic_handler()
234 status_reg = reg_base_get(desc, chip->status_base, i); in virq_chip_generic_handler()
235 ret = chip->write(parent, status_reg, ~0U); in virq_chip_generic_handler()
253 return -EINVAL; in virq_add_chip()
257 return -ENOMEM; in virq_add_chip()
259 vdata = (struct virq_data *)calloc(sizeof(*vdata), chip->num_irqs); in virq_add_chip()
261 ret = -ENOMEM; in virq_add_chip()
265 status_buf = (uint *)calloc(sizeof(*status_buf), chip->num_irqs); in virq_add_chip()
267 ret = -ENOMEM; in virq_add_chip()
271 for (i = 0; i < chip->num_irqs; i++) in virq_add_chip()
274 desc->parent = dev; in virq_add_chip()
275 desc->pirq = irq; in virq_add_chip()
276 desc->chip = chip; in virq_add_chip()
277 desc->virqs = vdata; in virq_add_chip()
278 desc->use_count = 0; in virq_add_chip()
279 desc->irq_base = vdata[0].irq; in virq_add_chip()
280 desc->irq_end = vdata[chip->num_irqs - 1].irq; in virq_add_chip()
281 desc->status_buf = status_buf; in virq_add_chip()
282 desc->reg_stride = chip->irq_reg_stride ? : 1; in virq_add_chip()
283 desc->unalign_reg_stride = chip->irq_unalign_reg_stride ? : 1; in virq_add_chip()
284 desc->unalign_reg_idx = chip->irq_unalign_reg_stride ? in virq_add_chip()
285 chip->irq_unalign_reg_idx : 0; in virq_add_chip()
286 list_add_tail(&desc->node, &virq_desc_head); in virq_add_chip()
289 for (i = 0; i < chip->num_regs; i++) { in virq_add_chip()
290 mask_reg = reg_base_get(desc, chip->mask_base, i); in virq_add_chip()
291 ret = chip->write(dev, mask_reg, ~0U); in virq_add_chip()
298 for (i = 0; i < chip->num_regs; i++) { in virq_add_chip()
299 status_reg = reg_base_get(desc, chip->status_base, i); in virq_add_chip()
300 ret = chip->write(dev, status_reg, ~0U); in virq_add_chip()
338 return -ENOENT; in __virq_enable()
341 chip = desc->chip; in __virq_enable()
343 return -ENOENT; in __virq_enable()
345 virq = irq - desc->irq_base; in __virq_enable()
346 mask_val = chip->irqs[virq].mask; in __virq_enable()
347 mask_reg = reg_base_get(desc, chip->mask_base, in __virq_enable()
348 chip->irqs[virq].reg_offset); in __virq_enable()
349 reg_val = chip->read(desc->parent, mask_reg); in __virq_enable()
355 ret = chip->write(desc->parent, mask_reg, reg_val); in __virq_enable()
363 desc->virqs[virq].flag |= IRQ_FLG_ENABLE; in __virq_enable()
365 desc->virqs[virq].flag &= ~IRQ_FLG_ENABLE; in __virq_enable()
376 return -EINVAL; in virq_enable()
380 if (desc->use_count == 0) in virq_enable()
381 irq_handler_enable(desc->pirq); in virq_enable()
382 desc->use_count++; in virq_enable()
394 return -EINVAL; in virq_disable()
398 if (desc->use_count <= 0) in virq_disable()
401 if (desc->use_count == 1) in virq_disable()
402 irq_handler_disable(desc->pirq); in virq_disable()
403 desc->use_count--; in virq_disable()
410 .name = "virq-irq-chip",