Lines Matching +full:pic +full:- +full:base +full:- +full:vec

1 // SPDX-License-Identifier: GPL-2.0
4 * Loongson PCH PIC support
7 #define pr_fmt(fmt) "pch-pic: " fmt
37 void __iomem *base; member
46 void __iomem *addr = priv->base + offset + PIC_REG_IDX(bit) * 4; in pch_pic_bitset()
48 raw_spin_lock(&priv->pic_lock); in pch_pic_bitset()
52 raw_spin_unlock(&priv->pic_lock); in pch_pic_bitset()
58 void __iomem *addr = priv->base + offset + PIC_REG_IDX(bit) * 4; in pch_pic_bitclr()
60 raw_spin_lock(&priv->pic_lock); in pch_pic_bitclr()
64 raw_spin_unlock(&priv->pic_lock); in pch_pic_bitclr()
71 pch_pic_bitset(priv, PCH_PIC_MASK, d->hwirq); in pch_pic_mask_irq()
79 writel(BIT(PIC_REG_BIT(d->hwirq)), in pch_pic_unmask_irq()
80 priv->base + PCH_PIC_CLR + PIC_REG_IDX(d->hwirq) * 4); in pch_pic_unmask_irq()
83 pch_pic_bitclr(priv, PCH_PIC_MASK, d->hwirq); in pch_pic_unmask_irq()
93 pch_pic_bitset(priv, PCH_PIC_EDGE, d->hwirq); in pch_pic_set_type()
94 pch_pic_bitclr(priv, PCH_PIC_POL, d->hwirq); in pch_pic_set_type()
98 pch_pic_bitset(priv, PCH_PIC_EDGE, d->hwirq); in pch_pic_set_type()
99 pch_pic_bitset(priv, PCH_PIC_POL, d->hwirq); in pch_pic_set_type()
103 pch_pic_bitclr(priv, PCH_PIC_EDGE, d->hwirq); in pch_pic_set_type()
104 pch_pic_bitclr(priv, PCH_PIC_POL, d->hwirq); in pch_pic_set_type()
108 pch_pic_bitclr(priv, PCH_PIC_EDGE, d->hwirq); in pch_pic_set_type()
109 pch_pic_bitset(priv, PCH_PIC_POL, d->hwirq); in pch_pic_set_type()
113 ret = -EINVAL; in pch_pic_set_type()
125 reg = readl(priv->base + PCH_PIC_EDGE + PIC_REG_IDX(d->hwirq) * 4); in pch_pic_ack_irq()
126 if (reg & BIT(PIC_REG_BIT(d->hwirq))) { in pch_pic_ack_irq()
127 writel(BIT(PIC_REG_BIT(d->hwirq)), in pch_pic_ack_irq()
128 priv->base + PCH_PIC_CLR + PIC_REG_IDX(d->hwirq) * 4); in pch_pic_ack_irq()
134 .name = "PCH PIC",
150 struct pch_pic *priv = domain->host_data; in pch_pic_alloc()
156 parent_fwspec.fwnode = domain->parent->fwnode; in pch_pic_alloc()
158 parent_fwspec.param[0] = hwirq + priv->ht_vec_base; in pch_pic_alloc()
184 writeb(priv->ht_vec_base + i, priv->base + PCH_INT_HTVEC(i)); in pch_pic_reset()
186 writeb(1, priv->base + PCH_INT_ROUTE(i)); in pch_pic_reset()
191 writel_relaxed(0xFFFFFFFF, priv->base + PCH_PIC_MASK + 4 * i); in pch_pic_reset()
192 writel_relaxed(0xFFFFFFFF, priv->base + PCH_PIC_CLR + 4 * i); in pch_pic_reset()
194 writel_relaxed(0, priv->base + PCH_PIC_AUTO0 + 4 * i); in pch_pic_reset()
195 writel_relaxed(0, priv->base + PCH_PIC_AUTO1 + 4 * i); in pch_pic_reset()
197 writel_relaxed(0xFFFFFFFF, priv->base + PCH_PIC_HTMSI_EN + 4 * i); in pch_pic_reset()
210 return -ENOMEM; in pch_pic_of_init()
212 raw_spin_lock_init(&priv->pic_lock); in pch_pic_of_init()
213 priv->base = of_iomap(node, 0); in pch_pic_of_init()
214 if (!priv->base) { in pch_pic_of_init()
215 err = -ENOMEM; in pch_pic_of_init()
222 err = -ENXIO; in pch_pic_of_init()
226 if (of_property_read_u32(node, "loongson,pic-base-vec", in pch_pic_of_init()
227 &priv->ht_vec_base)) { in pch_pic_of_init()
228 pr_err("Failed to determine pic-base-vec\n"); in pch_pic_of_init()
229 err = -EINVAL; in pch_pic_of_init()
233 priv->pic_domain = irq_domain_create_hierarchy(parent_domain, 0, in pch_pic_of_init()
238 if (!priv->pic_domain) { in pch_pic_of_init()
240 err = -ENOMEM; in pch_pic_of_init()
249 iounmap(priv->base); in pch_pic_of_init()
256 IRQCHIP_DECLARE(pch_pic, "loongson,pch-pic-1.0", pch_pic_of_init);