Lines Matching +full:vt8500 +full:- +full:intc
1 // SPDX-License-Identifier: GPL-2.0-or-later
3 * arch/arm/mach-vt8500/irq.c
59 /* vt8500 has 1 intc, wm8505 and wm8650 have 2 */
72 struct vt8500_irq_data *priv = d->domain->host_data; in vt8500_irq_ack()
73 void __iomem *base = priv->base; in vt8500_irq_ack()
74 void __iomem *stat_reg = base + VT8500_ICIS + (d->hwirq < 32 ? 0 : 4); in vt8500_irq_ack()
75 u32 status = (1 << (d->hwirq & 0x1f)); in vt8500_irq_ack()
82 struct vt8500_irq_data *priv = d->domain->host_data; in vt8500_irq_mask()
83 void __iomem *base = priv->base; in vt8500_irq_mask()
86 dctr = readb(base + VT8500_ICDC + d->hwirq); in vt8500_irq_mask()
88 writeb(dctr, base + VT8500_ICDC + d->hwirq); in vt8500_irq_mask()
93 struct vt8500_irq_data *priv = d->domain->host_data; in vt8500_irq_unmask()
94 void __iomem *base = priv->base; in vt8500_irq_unmask()
97 dctr = readb(base + VT8500_ICDC + d->hwirq); in vt8500_irq_unmask()
99 writeb(dctr, base + VT8500_ICDC + d->hwirq); in vt8500_irq_unmask()
104 struct vt8500_irq_data *priv = d->domain->host_data; in vt8500_irq_set_type()
105 void __iomem *base = priv->base; in vt8500_irq_set_type()
108 dctr = readb(base + VT8500_ICDC + d->hwirq); in vt8500_irq_set_type()
113 return -EINVAL; in vt8500_irq_set_type()
127 writeb(dctr, base + VT8500_ICDC + d->hwirq); in vt8500_irq_set_type()
133 .name = "vt8500",
166 static inline void vt8500_handle_irq_common(struct vt8500_irq_data *intc) in vt8500_handle_irq_common() argument
168 unsigned long irqnr = readl_relaxed(intc->base) & 0x3F; in vt8500_handle_irq_common()
176 stat = readl_relaxed(intc->base + VT8500_ICIS + 4); in vt8500_handle_irq_common()
181 generic_handle_domain_irq(intc->domain, irqnr); in vt8500_handle_irq_common()
193 struct vt8500_irq_data *intc = d->host_data; in vt8500_handle_irq_chained() local
196 vt8500_handle_irq_common(intc); in vt8500_handle_irq_chained()
203 struct vt8500_irq_data *intc; in vt8500_irq_init() local
206 intc = kzalloc(sizeof(*intc), GFP_KERNEL); in vt8500_irq_init()
207 if (!intc) in vt8500_irq_init()
208 return -ENOMEM; in vt8500_irq_init()
210 intc->base = of_iomap(node, 0); in vt8500_irq_init()
211 if (!intc->base) { in vt8500_irq_init()
213 ret = -ENOMEM; in vt8500_irq_init()
217 intc->domain = irq_domain_create_linear(of_fwnode_handle(node), 64, in vt8500_irq_init()
218 &vt8500_irq_domain_ops, intc); in vt8500_irq_init()
219 if (!intc->domain) { in vt8500_irq_init()
221 ret = -ENOMEM; in vt8500_irq_init()
225 vt8500_init_irq_hw(intc->base); in vt8500_irq_init()
227 pr_info("vt8500-irq: Added interrupt controller\n"); in vt8500_irq_init()
234 intc); in vt8500_irq_init()
237 pr_info("vt8500-irq: Enabled slave->parent interrupts\n"); in vt8500_irq_init()
239 primary_intc = intc; in vt8500_irq_init()
245 iounmap(intc->base); in vt8500_irq_init()
247 kfree(intc); in vt8500_irq_init()
251 IRQCHIP_DECLARE(vt8500_irq, "via,vt8500-intc", vt8500_irq_init);