xref: /openbmc/linux/arch/sparc/kernel/irq_32.c (revision b2441318)
1b2441318SGreg Kroah-Hartman // SPDX-License-Identifier: GPL-2.0
2d670bd4fSSam Ravnborg /*
3fd49bf48SSam Ravnborg  * Interrupt request handling routines. On the
4d670bd4fSSam Ravnborg  * Sparc the IRQs are basically 'cast in stone'
5d670bd4fSSam Ravnborg  * and you are supposed to probe the prom's device
6d670bd4fSSam Ravnborg  * node trees to find out who's got which IRQ.
7d670bd4fSSam Ravnborg  *
8d670bd4fSSam Ravnborg  *  Copyright (C) 1995 David S. Miller (davem@caip.rutgers.edu)
9d670bd4fSSam Ravnborg  *  Copyright (C) 1995 Miguel de Icaza (miguel@nuclecu.unam.mx)
10d670bd4fSSam Ravnborg  *  Copyright (C) 1995,2002 Pete A. Zaitcev (zaitcev@yahoo.com)
11d670bd4fSSam Ravnborg  *  Copyright (C) 1996 Dave Redman (djhr@tadpole.co.uk)
12d670bd4fSSam Ravnborg  *  Copyright (C) 1998-2000 Anton Blanchard (anton@samba.org)
13d670bd4fSSam Ravnborg  */
14d670bd4fSSam Ravnborg 
15d670bd4fSSam Ravnborg #include <linux/kernel_stat.h>
16d670bd4fSSam Ravnborg #include <linux/seq_file.h>
177b64db60SPaul Gortmaker #include <linux/export.h>
18d670bd4fSSam Ravnborg 
19a2a211cbSSam Ravnborg #include <asm/cacheflush.h>
206baa9b20SSam Ravnborg #include <asm/cpudata.h>
21fbb86383SSam Ravnborg #include <asm/setup.h>
22d670bd4fSSam Ravnborg #include <asm/pcic.h>
230fd7ef1fSKonrad Eisele #include <asm/leon.h>
24d670bd4fSSam Ravnborg 
2581265fd9SSam Ravnborg #include "kernel.h"
26d670bd4fSSam Ravnborg #include "irq.h"
27d670bd4fSSam Ravnborg 
28bbdc2661SSam Ravnborg /* platform specific irq setup */
29472bc4f2SSam Ravnborg struct sparc_config sparc_config;
30bbdc2661SSam Ravnborg 
arch_local_irq_save(void)31df9ee292SDavid Howells unsigned long arch_local_irq_save(void)
32d670bd4fSSam Ravnborg {
33d670bd4fSSam Ravnborg 	unsigned long retval;
34d670bd4fSSam Ravnborg 	unsigned long tmp;
35d670bd4fSSam Ravnborg 
36d670bd4fSSam Ravnborg 	__asm__ __volatile__(
37d670bd4fSSam Ravnborg 		"rd	%%psr, %0\n\t"
38d670bd4fSSam Ravnborg 		"or	%0, %2, %1\n\t"
39d670bd4fSSam Ravnborg 		"wr	%1, 0, %%psr\n\t"
40d670bd4fSSam Ravnborg 		"nop; nop; nop\n"
41d670bd4fSSam Ravnborg 		: "=&r" (retval), "=r" (tmp)
42d670bd4fSSam Ravnborg 		: "i" (PSR_PIL)
43d670bd4fSSam Ravnborg 		: "memory");
44d670bd4fSSam Ravnborg 
45d670bd4fSSam Ravnborg 	return retval;
46d670bd4fSSam Ravnborg }
47df9ee292SDavid Howells EXPORT_SYMBOL(arch_local_irq_save);
48d670bd4fSSam Ravnborg 
arch_local_irq_enable(void)49df9ee292SDavid Howells void arch_local_irq_enable(void)
50d670bd4fSSam Ravnborg {
51d670bd4fSSam Ravnborg 	unsigned long tmp;
52d670bd4fSSam Ravnborg 
53d670bd4fSSam Ravnborg 	__asm__ __volatile__(
54d670bd4fSSam Ravnborg 		"rd	%%psr, %0\n\t"
55d670bd4fSSam Ravnborg 		"andn	%0, %1, %0\n\t"
56d670bd4fSSam Ravnborg 		"wr	%0, 0, %%psr\n\t"
57d670bd4fSSam Ravnborg 		"nop; nop; nop\n"
58d670bd4fSSam Ravnborg 		: "=&r" (tmp)
59d670bd4fSSam Ravnborg 		: "i" (PSR_PIL)
60d670bd4fSSam Ravnborg 		: "memory");
61d670bd4fSSam Ravnborg }
62df9ee292SDavid Howells EXPORT_SYMBOL(arch_local_irq_enable);
63d670bd4fSSam Ravnborg 
arch_local_irq_restore(unsigned long old_psr)64df9ee292SDavid Howells void arch_local_irq_restore(unsigned long old_psr)
65d670bd4fSSam Ravnborg {
66d670bd4fSSam Ravnborg 	unsigned long tmp;
67d670bd4fSSam Ravnborg 
68d670bd4fSSam Ravnborg 	__asm__ __volatile__(
69d670bd4fSSam Ravnborg 		"rd	%%psr, %0\n\t"
70d670bd4fSSam Ravnborg 		"and	%2, %1, %2\n\t"
71d670bd4fSSam Ravnborg 		"andn	%0, %1, %0\n\t"
72d670bd4fSSam Ravnborg 		"wr	%0, %2, %%psr\n\t"
73d670bd4fSSam Ravnborg 		"nop; nop; nop\n"
74d670bd4fSSam Ravnborg 		: "=&r" (tmp)
75d670bd4fSSam Ravnborg 		: "i" (PSR_PIL), "r" (old_psr)
76d670bd4fSSam Ravnborg 		: "memory");
77d670bd4fSSam Ravnborg }
78df9ee292SDavid Howells EXPORT_SYMBOL(arch_local_irq_restore);
79d670bd4fSSam Ravnborg 
80d670bd4fSSam Ravnborg /*
81d670bd4fSSam Ravnborg  * Dave Redman (djhr@tadpole.co.uk)
82d670bd4fSSam Ravnborg  *
83d670bd4fSSam Ravnborg  * IRQ numbers.. These are no longer restricted to 15..
84d670bd4fSSam Ravnborg  *
85d670bd4fSSam Ravnborg  * this is done to enable SBUS cards and onboard IO to be masked
86d670bd4fSSam Ravnborg  * correctly. using the interrupt level isn't good enough.
87d670bd4fSSam Ravnborg  *
88d670bd4fSSam Ravnborg  * For example:
89d670bd4fSSam Ravnborg  *   A device interrupting at sbus level6 and the Floppy both come in
90d670bd4fSSam Ravnborg  *   at IRQ11, but enabling and disabling them requires writing to
91d670bd4fSSam Ravnborg  *   different bits in the SLAVIO/SEC.
92d670bd4fSSam Ravnborg  *
93d670bd4fSSam Ravnborg  * As a result of these changes sun4m machines could now support
94d670bd4fSSam Ravnborg  * directed CPU interrupts using the existing enable/disable irq code
95d670bd4fSSam Ravnborg  * with tweaks.
96d670bd4fSSam Ravnborg  *
976baa9b20SSam Ravnborg  * Sun4d complicates things even further.  IRQ numbers are arbitrary
986baa9b20SSam Ravnborg  * 32-bit values in that case.  Since this is similar to sparc64,
996baa9b20SSam Ravnborg  * we adopt a virtual IRQ numbering scheme as is done there.
1006baa9b20SSam Ravnborg  * Virutal interrupt numbers are allocated by build_irq().  So NR_IRQS
1016baa9b20SSam Ravnborg  * just becomes a limit of how many interrupt sources we can handle in
1026baa9b20SSam Ravnborg  * a single system.  Even fully loaded SS2000 machines top off at
1036baa9b20SSam Ravnborg  * about 32 interrupt sources or so, therefore a NR_IRQS value of 64
1046baa9b20SSam Ravnborg  * is more than enough.
1056baa9b20SSam Ravnborg   *
1066baa9b20SSam Ravnborg  * We keep a map of per-PIL enable interrupts.  These get wired
1076baa9b20SSam Ravnborg  * up via the irq_chip->startup() method which gets invoked by
1086baa9b20SSam Ravnborg  * the generic IRQ layer during request_irq().
109d670bd4fSSam Ravnborg  */
110d670bd4fSSam Ravnborg 
111d670bd4fSSam Ravnborg 
1126baa9b20SSam Ravnborg /* Table of allocated irqs. Unused entries has irq == 0 */
1136baa9b20SSam Ravnborg static struct irq_bucket irq_table[NR_IRQS];
1146baa9b20SSam Ravnborg /* Protect access to irq_table */
1156baa9b20SSam Ravnborg static DEFINE_SPINLOCK(irq_table_lock);
116d670bd4fSSam Ravnborg 
1176baa9b20SSam Ravnborg /* Map between the irq identifier used in hw to the irq_bucket. */
1186baa9b20SSam Ravnborg struct irq_bucket *irq_map[SUN4D_MAX_IRQ];
1196baa9b20SSam Ravnborg /* Protect access to irq_map */
1206baa9b20SSam Ravnborg static DEFINE_SPINLOCK(irq_map_lock);
121d670bd4fSSam Ravnborg 
1226baa9b20SSam Ravnborg /* Allocate a new irq from the irq_table */
irq_alloc(unsigned int real_irq,unsigned int pil)1236baa9b20SSam Ravnborg unsigned int irq_alloc(unsigned int real_irq, unsigned int pil)
124d670bd4fSSam Ravnborg {
125d670bd4fSSam Ravnborg 	unsigned long flags;
1266baa9b20SSam Ravnborg 	unsigned int i;
127d670bd4fSSam Ravnborg 
1286baa9b20SSam Ravnborg 	spin_lock_irqsave(&irq_table_lock, flags);
1296baa9b20SSam Ravnborg 	for (i = 1; i < NR_IRQS; i++) {
1306baa9b20SSam Ravnborg 		if (irq_table[i].real_irq == real_irq && irq_table[i].pil == pil)
1316baa9b20SSam Ravnborg 			goto found;
1326baa9b20SSam Ravnborg 	}
133fd49bf48SSam Ravnborg 
1346baa9b20SSam Ravnborg 	for (i = 1; i < NR_IRQS; i++) {
1356baa9b20SSam Ravnborg 		if (!irq_table[i].irq)
1366baa9b20SSam Ravnborg 			break;
1376baa9b20SSam Ravnborg 	}
1386baa9b20SSam Ravnborg 
139d670bd4fSSam Ravnborg 	if (i < NR_IRQS) {
1406baa9b20SSam Ravnborg 		irq_table[i].real_irq = real_irq;
1416baa9b20SSam Ravnborg 		irq_table[i].irq = i;
1426baa9b20SSam Ravnborg 		irq_table[i].pil = pil;
1436baa9b20SSam Ravnborg 	} else {
1446baa9b20SSam Ravnborg 		printk(KERN_ERR "IRQ: Out of virtual IRQs.\n");
1456baa9b20SSam Ravnborg 		i = 0;
146d670bd4fSSam Ravnborg 	}
1476baa9b20SSam Ravnborg found:
1486baa9b20SSam Ravnborg 	spin_unlock_irqrestore(&irq_table_lock, flags);
1496baa9b20SSam Ravnborg 
1506baa9b20SSam Ravnborg 	return i;
151d670bd4fSSam Ravnborg }
1526baa9b20SSam Ravnborg 
1536baa9b20SSam Ravnborg /* Based on a single pil handler_irq may need to call several
1546baa9b20SSam Ravnborg  * interrupt handlers. Use irq_map as entry to irq_table,
1556baa9b20SSam Ravnborg  * and let each entry in irq_table point to the next entry.
1566baa9b20SSam Ravnborg  */
irq_link(unsigned int irq)1576baa9b20SSam Ravnborg void irq_link(unsigned int irq)
1586baa9b20SSam Ravnborg {
1596baa9b20SSam Ravnborg 	struct irq_bucket *p;
1606baa9b20SSam Ravnborg 	unsigned long flags;
1616baa9b20SSam Ravnborg 	unsigned int pil;
1626baa9b20SSam Ravnborg 
1636baa9b20SSam Ravnborg 	BUG_ON(irq >= NR_IRQS);
1646baa9b20SSam Ravnborg 
1656baa9b20SSam Ravnborg 	spin_lock_irqsave(&irq_map_lock, flags);
1666baa9b20SSam Ravnborg 
1676baa9b20SSam Ravnborg 	p = &irq_table[irq];
1686baa9b20SSam Ravnborg 	pil = p->pil;
169fa160828SDan Carpenter 	BUG_ON(pil >= SUN4D_MAX_IRQ);
1706baa9b20SSam Ravnborg 	p->next = irq_map[pil];
1716baa9b20SSam Ravnborg 	irq_map[pil] = p;
1726baa9b20SSam Ravnborg 
1736baa9b20SSam Ravnborg 	spin_unlock_irqrestore(&irq_map_lock, flags);
174d670bd4fSSam Ravnborg }
1756baa9b20SSam Ravnborg 
irq_unlink(unsigned int irq)1766baa9b20SSam Ravnborg void irq_unlink(unsigned int irq)
1776baa9b20SSam Ravnborg {
1786baa9b20SSam Ravnborg 	struct irq_bucket *p, **pnext;
1796baa9b20SSam Ravnborg 	unsigned long flags;
1806baa9b20SSam Ravnborg 
1816baa9b20SSam Ravnborg 	BUG_ON(irq >= NR_IRQS);
1826baa9b20SSam Ravnborg 
1836baa9b20SSam Ravnborg 	spin_lock_irqsave(&irq_map_lock, flags);
1846baa9b20SSam Ravnborg 
1856baa9b20SSam Ravnborg 	p = &irq_table[irq];
186fa160828SDan Carpenter 	BUG_ON(p->pil >= SUN4D_MAX_IRQ);
1876baa9b20SSam Ravnborg 	pnext = &irq_map[p->pil];
1886baa9b20SSam Ravnborg 	while (*pnext != p)
1896baa9b20SSam Ravnborg 		pnext = &(*pnext)->next;
1906baa9b20SSam Ravnborg 	*pnext = p->next;
1916baa9b20SSam Ravnborg 
1926baa9b20SSam Ravnborg 	spin_unlock_irqrestore(&irq_map_lock, flags);
1936baa9b20SSam Ravnborg }
1946baa9b20SSam Ravnborg 
1956baa9b20SSam Ravnborg 
1966baa9b20SSam Ravnborg /* /proc/interrupts printing */
arch_show_interrupts(struct seq_file * p,int prec)1976baa9b20SSam Ravnborg int arch_show_interrupts(struct seq_file *p, int prec)
1986baa9b20SSam Ravnborg {
1996baa9b20SSam Ravnborg 	int j;
2006baa9b20SSam Ravnborg 
201d6d04819SDaniel Hellstrom #ifdef CONFIG_SMP
202d6d04819SDaniel Hellstrom 	seq_printf(p, "RES: ");
203d6d04819SDaniel Hellstrom 	for_each_online_cpu(j)
204d6d04819SDaniel Hellstrom 		seq_printf(p, "%10u ", cpu_data(j).irq_resched_count);
205d6d04819SDaniel Hellstrom 	seq_printf(p, "     IPI rescheduling interrupts\n");
206d6d04819SDaniel Hellstrom 	seq_printf(p, "CAL: ");
207d6d04819SDaniel Hellstrom 	for_each_online_cpu(j)
208d6d04819SDaniel Hellstrom 		seq_printf(p, "%10u ", cpu_data(j).irq_call_count);
209d6d04819SDaniel Hellstrom 	seq_printf(p, "     IPI function call interrupts\n");
210d6d04819SDaniel Hellstrom #endif
2116baa9b20SSam Ravnborg 	seq_printf(p, "NMI: ");
2126baa9b20SSam Ravnborg 	for_each_online_cpu(j)
2136baa9b20SSam Ravnborg 		seq_printf(p, "%10u ", cpu_data(j).counter);
2146baa9b20SSam Ravnborg 	seq_printf(p, "     Non-maskable interrupts\n");
215d670bd4fSSam Ravnborg 	return 0;
216d670bd4fSSam Ravnborg }
217d670bd4fSSam Ravnborg 
handler_irq(unsigned int pil,struct pt_regs * regs)2186baa9b20SSam Ravnborg void handler_irq(unsigned int pil, struct pt_regs *regs)
219d670bd4fSSam Ravnborg {
220d670bd4fSSam Ravnborg 	struct pt_regs *old_regs;
2216baa9b20SSam Ravnborg 	struct irq_bucket *p;
222d670bd4fSSam Ravnborg 
2236baa9b20SSam Ravnborg 	BUG_ON(pil > 15);
224d670bd4fSSam Ravnborg 	old_regs = set_irq_regs(regs);
225d670bd4fSSam Ravnborg 	irq_enter();
2266baa9b20SSam Ravnborg 
2276baa9b20SSam Ravnborg 	p = irq_map[pil];
2286baa9b20SSam Ravnborg 	while (p) {
2296baa9b20SSam Ravnborg 		struct irq_bucket *next = p->next;
2306baa9b20SSam Ravnborg 
2316baa9b20SSam Ravnborg 		generic_handle_irq(p->irq);
2326baa9b20SSam Ravnborg 		p = next;
2336baa9b20SSam Ravnborg 	}
234d670bd4fSSam Ravnborg 	irq_exit();
235d670bd4fSSam Ravnborg 	set_irq_regs(old_regs);
236d670bd4fSSam Ravnborg }
237d670bd4fSSam Ravnborg 
238d670bd4fSSam Ravnborg #if defined(CONFIG_BLK_DEV_FD) || defined(CONFIG_BLK_DEV_FD_MODULE)
2396baa9b20SSam Ravnborg static unsigned int floppy_irq;
240d670bd4fSSam Ravnborg 
sparc_floppy_request_irq(unsigned int irq,irq_handler_t irq_handler)2416baa9b20SSam Ravnborg int sparc_floppy_request_irq(unsigned int irq, irq_handler_t irq_handler)
242d670bd4fSSam Ravnborg {
243d670bd4fSSam Ravnborg 	unsigned int cpu_irq;
2446baa9b20SSam Ravnborg 	int err;
2456baa9b20SSam Ravnborg 
246d670bd4fSSam Ravnborg 
2476baa9b20SSam Ravnborg 	err = request_irq(irq, irq_handler, 0, "floppy", NULL);
2486baa9b20SSam Ravnborg 	if (err)
2496baa9b20SSam Ravnborg 		return -1;
250d670bd4fSSam Ravnborg 
2516baa9b20SSam Ravnborg 	/* Save for later use in floppy interrupt handler */
2526baa9b20SSam Ravnborg 	floppy_irq = irq;
253d670bd4fSSam Ravnborg 
2546baa9b20SSam Ravnborg 	cpu_irq = (irq & (NR_IRQS - 1));
255d670bd4fSSam Ravnborg 
256d670bd4fSSam Ravnborg 	/* Dork with trap table if we get this far. */
257d670bd4fSSam Ravnborg #define INSTANTIATE(table) \
258d670bd4fSSam Ravnborg 	table[SP_TRAP_IRQ1+(cpu_irq-1)].inst_one = SPARC_RD_PSR_L0; \
259d670bd4fSSam Ravnborg 	table[SP_TRAP_IRQ1+(cpu_irq-1)].inst_two = \
2606baa9b20SSam Ravnborg 		SPARC_BRANCH((unsigned long) floppy_hardint, \
261d670bd4fSSam Ravnborg 			     (unsigned long) &table[SP_TRAP_IRQ1+(cpu_irq-1)].inst_two);\
262d670bd4fSSam Ravnborg 	table[SP_TRAP_IRQ1+(cpu_irq-1)].inst_three = SPARC_RD_WIM_L3; \
263d670bd4fSSam Ravnborg 	table[SP_TRAP_IRQ1+(cpu_irq-1)].inst_four = SPARC_NOP;
264d670bd4fSSam Ravnborg 
265d670bd4fSSam Ravnborg 	INSTANTIATE(sparc_ttable)
266b08b5c9cSSam Ravnborg 
267b08b5c9cSSam Ravnborg #if defined CONFIG_SMP
268b08b5c9cSSam Ravnborg 	if (sparc_cpu_model != sparc_leon) {
269b08b5c9cSSam Ravnborg 		struct tt_entry *trap_table;
270b08b5c9cSSam Ravnborg 
271fd49bf48SSam Ravnborg 		trap_table = &trapbase_cpu1;
272fd49bf48SSam Ravnborg 		INSTANTIATE(trap_table)
273fd49bf48SSam Ravnborg 		trap_table = &trapbase_cpu2;
274fd49bf48SSam Ravnborg 		INSTANTIATE(trap_table)
275fd49bf48SSam Ravnborg 		trap_table = &trapbase_cpu3;
276fd49bf48SSam Ravnborg 		INSTANTIATE(trap_table)
277b08b5c9cSSam Ravnborg 	}
278d670bd4fSSam Ravnborg #endif
279d670bd4fSSam Ravnborg #undef INSTANTIATE
280d670bd4fSSam Ravnborg 	/*
281d670bd4fSSam Ravnborg 	 * XXX Correct thing whould be to flush only I- and D-cache lines
282d670bd4fSSam Ravnborg 	 * which contain the handler in question. But as of time of the
283d670bd4fSSam Ravnborg 	 * writing we have no CPU-neutral interface to fine-grained flushes.
284d670bd4fSSam Ravnborg 	 */
285d670bd4fSSam Ravnborg 	flush_cache_all();
2866baa9b20SSam Ravnborg 	return 0;
287d670bd4fSSam Ravnborg }
2886baa9b20SSam Ravnborg EXPORT_SYMBOL(sparc_floppy_request_irq);
289d670bd4fSSam Ravnborg 
290fd49bf48SSam Ravnborg /*
291fd49bf48SSam Ravnborg  * These variables are used to access state from the assembler
292d670bd4fSSam Ravnborg  * interrupt handler, floppy_hardint, so we cannot put these in
293d670bd4fSSam Ravnborg  * the floppy driver image because that would not work in the
294d670bd4fSSam Ravnborg  * modular case.
295d670bd4fSSam Ravnborg  */
296d670bd4fSSam Ravnborg volatile unsigned char *fdc_status;
297d670bd4fSSam Ravnborg EXPORT_SYMBOL(fdc_status);
298d670bd4fSSam Ravnborg 
299d670bd4fSSam Ravnborg char *pdma_vaddr;
300d670bd4fSSam Ravnborg EXPORT_SYMBOL(pdma_vaddr);
301d670bd4fSSam Ravnborg 
302d670bd4fSSam Ravnborg unsigned long pdma_size;
303d670bd4fSSam Ravnborg EXPORT_SYMBOL(pdma_size);
304d670bd4fSSam Ravnborg 
305d670bd4fSSam Ravnborg volatile int doing_pdma;
306d670bd4fSSam Ravnborg EXPORT_SYMBOL(doing_pdma);
307d670bd4fSSam Ravnborg 
308d670bd4fSSam Ravnborg char *pdma_base;
309d670bd4fSSam Ravnborg EXPORT_SYMBOL(pdma_base);
310d670bd4fSSam Ravnborg 
311d670bd4fSSam Ravnborg unsigned long pdma_areasize;
312d670bd4fSSam Ravnborg EXPORT_SYMBOL(pdma_areasize);
313d670bd4fSSam Ravnborg 
3146baa9b20SSam Ravnborg /* Use the generic irq support to call floppy_interrupt
3156baa9b20SSam Ravnborg  * which was setup using request_irq() in sparc_floppy_request_irq().
3166baa9b20SSam Ravnborg  * We only have one floppy interrupt so we do not need to check
3176baa9b20SSam Ravnborg  * for additional handlers being wired up by irq_link()
3186baa9b20SSam Ravnborg  */
sparc_floppy_irq(int irq,void * dev_id,struct pt_regs * regs)319d670bd4fSSam Ravnborg void sparc_floppy_irq(int irq, void *dev_id, struct pt_regs *regs)
320d670bd4fSSam Ravnborg {
321d670bd4fSSam Ravnborg 	struct pt_regs *old_regs;
322d670bd4fSSam Ravnborg 
323d670bd4fSSam Ravnborg 	old_regs = set_irq_regs(regs);
324d670bd4fSSam Ravnborg 	irq_enter();
3256baa9b20SSam Ravnborg 	generic_handle_irq(floppy_irq);
326d670bd4fSSam Ravnborg 	irq_exit();
327d670bd4fSSam Ravnborg 	set_irq_regs(old_regs);
328d670bd4fSSam Ravnborg }
329d670bd4fSSam Ravnborg #endif
330d670bd4fSSam Ravnborg 
331d670bd4fSSam Ravnborg /* djhr
332d670bd4fSSam Ravnborg  * This could probably be made indirect too and assigned in the CPU
333d670bd4fSSam Ravnborg  * bits of the code. That would be much nicer I think and would also
334d670bd4fSSam Ravnborg  * fit in with the idea of being able to tune your kernel for your machine
335d670bd4fSSam Ravnborg  * by removing unrequired machine and device support.
336d670bd4fSSam Ravnborg  *
337d670bd4fSSam Ravnborg  */
338d670bd4fSSam Ravnborg 
init_IRQ(void)339d670bd4fSSam Ravnborg void __init init_IRQ(void)
340d670bd4fSSam Ravnborg {
341d670bd4fSSam Ravnborg 	switch (sparc_cpu_model) {
342d670bd4fSSam Ravnborg 	case sun4m:
343d670bd4fSSam Ravnborg 		pcic_probe();
34406010fb5SSam Ravnborg 		if (pcic_present())
345d670bd4fSSam Ravnborg 			sun4m_pci_init_IRQ();
34606010fb5SSam Ravnborg 		else
347d670bd4fSSam Ravnborg 			sun4m_init_IRQ();
348d670bd4fSSam Ravnborg 		break;
349d670bd4fSSam Ravnborg 
350d670bd4fSSam Ravnborg 	case sun4d:
351d670bd4fSSam Ravnborg 		sun4d_init_IRQ();
352d670bd4fSSam Ravnborg 		break;
353d670bd4fSSam Ravnborg 
3540fd7ef1fSKonrad Eisele 	case sparc_leon:
3550fd7ef1fSKonrad Eisele 		leon_init_IRQ();
3560fd7ef1fSKonrad Eisele 		break;
3570fd7ef1fSKonrad Eisele 
358d670bd4fSSam Ravnborg 	default:
359d670bd4fSSam Ravnborg 		prom_printf("Cannot initialize IRQs on this Sun machine...");
360d670bd4fSSam Ravnborg 		break;
361d670bd4fSSam Ravnborg 	}
362d670bd4fSSam Ravnborg }
363d670bd4fSSam Ravnborg 
364