Lines Matching +full:parent +full:- +full:interrupt +full:- +full:base

1 // SPDX-License-Identifier: GPL-2.0
28 MODULE_DESCRIPTION("Amazon's Annapurna Labs Interrupt Controller Driver");
37 void __iomem *base; member
49 u32 control = readl_relaxed(fic->base + AL_FIC_CONTROL); in al_fic_set_trigger()
58 gc->chip_types->handler = handler; in al_fic_set_trigger()
59 fic->state = new_state; in al_fic_set_trigger()
60 writel_relaxed(control, fic->base + AL_FIC_CONTROL); in al_fic_set_trigger()
66 struct al_fic *fic = gc->private; in al_fic_irq_set_type()
69 guard(raw_spinlock)(&gc->lock); in al_fic_irq_set_type()
74 return -EINVAL; in al_fic_irq_set_type()
89 if (fic->state == AL_FIC_UNCONFIGURED) { in al_fic_irq_set_type()
91 } else if (fic->state != new_state) { in al_fic_irq_set_type()
92 pr_debug("fic %s state already configured to %d\n", fic->name, fic->state); in al_fic_irq_set_type()
93 return -EINVAL; in al_fic_irq_set_type()
101 struct irq_domain *domain = fic->domain; in al_fic_irq_handler()
109 pending = readl_relaxed(fic->base + AL_FIC_CAUSE); in al_fic_irq_handler()
110 pending &= ~gc->mask_cache; in al_fic_irq_handler()
121 struct al_fic *fic = gc->private; in al_fic_irq_retrigger()
123 writel_relaxed(BIT(data->hwirq), fic->base + AL_FIC_SET_CAUSE); in al_fic_irq_retrigger()
134 fic->domain = irq_domain_create_linear(of_fwnode_handle(node), in al_fic_register()
138 if (!fic->domain) { in al_fic_register()
140 return -ENOMEM; in al_fic_register()
143 ret = irq_alloc_domain_generic_chips(fic->domain, in al_fic_register()
145 1, fic->name, in al_fic_register()
153 gc = irq_get_domain_generic_chip(fic->domain, 0); in al_fic_register()
154 gc->reg_base = fic->base; in al_fic_register()
155 gc->chip_types->regs.mask = AL_FIC_MASK; in al_fic_register()
156 gc->chip_types->regs.ack = AL_FIC_CAUSE; in al_fic_register()
157 gc->chip_types->chip.irq_mask = irq_gc_mask_set_bit; in al_fic_register()
158 gc->chip_types->chip.irq_unmask = irq_gc_mask_clr_bit; in al_fic_register()
159 gc->chip_types->chip.irq_ack = irq_gc_ack_clr_bit; in al_fic_register()
160 gc->chip_types->chip.irq_set_type = al_fic_irq_set_type; in al_fic_register()
161 gc->chip_types->chip.irq_retrigger = al_fic_irq_retrigger; in al_fic_register()
162 gc->chip_types->chip.flags = IRQCHIP_SKIP_SET_WAKE; in al_fic_register()
163 gc->private = fic; in al_fic_register()
165 irq_set_chained_handler_and_data(fic->parent_irq, in al_fic_register()
171 irq_domain_remove(fic->domain); in al_fic_register()
177 * al_fic_wire_init() - initialize and configure fic in wire mode
178 * @of_node: optional pointer to interrupt controller's device tree node.
179 * @base: mmio to fic register
181 * @parent_irq: interrupt of parent
184 * In wire mode, fic hardware is generating a wire ("wired") interrupt.
185 * Interrupt can be generated based on positive edge or level - configuration is
189 void __iomem *base, in al_fic_wire_init() argument
199 return ERR_PTR(-ENOMEM); in al_fic_wire_init()
201 fic->base = base; in al_fic_wire_init()
202 fic->parent_irq = parent_irq; in al_fic_wire_init()
203 fic->name = name; in al_fic_wire_init()
206 writel_relaxed(0xFFFFFFFF, fic->base + AL_FIC_MASK); in al_fic_wire_init()
208 /* clear any pending interrupt */ in al_fic_wire_init()
209 writel_relaxed(0, fic->base + AL_FIC_CAUSE); in al_fic_wire_init()
211 writel_relaxed(control, fic->base + AL_FIC_CONTROL); in al_fic_wire_init()
219 pr_debug("%s initialized successfully in Legacy mode (parent-irq=%u)\n", in al_fic_wire_init()
220 fic->name, parent_irq); in al_fic_wire_init()
230 struct device_node *parent) in al_fic_init_dt() argument
233 void __iomem *base; in al_fic_init_dt() local
237 if (!parent) { in al_fic_init_dt()
238 pr_err("%s: unsupported - device require a parent\n", in al_fic_init_dt()
239 node->name); in al_fic_init_dt()
240 return -EINVAL; in al_fic_init_dt()
243 base = of_iomap(node, 0); in al_fic_init_dt()
244 if (!base) { in al_fic_init_dt()
245 pr_err("%s: fail to map memory\n", node->name); in al_fic_init_dt()
246 return -ENOMEM; in al_fic_init_dt()
251 pr_err("%s: fail to map irq\n", node->name); in al_fic_init_dt()
252 ret = -EINVAL; in al_fic_init_dt()
257 base, in al_fic_init_dt()
258 node->name, in al_fic_init_dt()
262 node->name, in al_fic_init_dt()
273 iounmap(base); in al_fic_init_dt()
278 IRQCHIP_DECLARE(al_fic, "amazon,al-fic", al_fic_init_dt);