|
@@ -351,3 +351,28 @@ static void __init vic_init_st(void __iomem *base, unsigned int irq_start,
|
|
|
|
|
|
writel(32, base + VIC_PL190_DEF_VECT_ADDR);
|
|
|
}
|
|
|
+
|
|
|
+ vic_register(base, irq_start, vic_sources, 0, node);
|
|
|
+}
|
|
|
+
|
|
|
+void __init __vic_init(void __iomem *base, int irq_start,
|
|
|
+ u32 vic_sources, u32 resume_sources,
|
|
|
+ struct device_node *node)
|
|
|
+{
|
|
|
+ unsigned int i;
|
|
|
+ u32 cellid = 0;
|
|
|
+ enum amba_vendor vendor;
|
|
|
+
|
|
|
+ /* Identify which VIC cell this one is, by reading the ID */
|
|
|
+ for (i = 0; i < 4; i++) {
|
|
|
+ void __iomem *addr;
|
|
|
+ addr = (void __iomem *)((u32)base & PAGE_MASK) + 0xfe0 + (i * 4);
|
|
|
+ cellid |= (readl(addr) & 0xff) << (8 * i);
|
|
|
+ }
|
|
|
+ vendor = (cellid >> 12) & 0xff;
|
|
|
+ printk(KERN_INFO "VIC @%p: id 0x%08x, vendor 0x%02x\n",
|
|
|
+ base, cellid, vendor);
|
|
|
+
|
|
|
+ switch(vendor) {
|
|
|
+ case AMBA_VENDOR_ST:
|
|
|
+ vic_init_st(base, irq_start, vic_sources, node);
|