summaryrefslogtreecommitdiffstats
path: root/include/asm-arm/arch-rpc
diff options
context:
space:
mode:
authorRalf Baechle <ralf@linux-mips.org>1998-09-19 19:15:08 +0000
committerRalf Baechle <ralf@linux-mips.org>1998-09-19 19:15:08 +0000
commit03ba4131783cc9e872f8bb26a03f15bc11f27564 (patch)
tree88db8dba75ae06ba3bad08e42c5e52efc162535c /include/asm-arm/arch-rpc
parent257730f99381dd26e10b832fce4c94cae7ac1176 (diff)
- Merge with Linux 2.1.121.
- Bugfixes.
Diffstat (limited to 'include/asm-arm/arch-rpc')
-rw-r--r--include/asm-arm/arch-rpc/irq.h236
-rw-r--r--include/asm-arm/arch-rpc/irqs.h2
-rw-r--r--include/asm-arm/arch-rpc/param.h8
-rw-r--r--include/asm-arm/arch-rpc/uncompress.h4
4 files changed, 150 insertions, 100 deletions
diff --git a/include/asm-arm/arch-rpc/irq.h b/include/asm-arm/arch-rpc/irq.h
index 9ef1bacc7..a65f487d4 100644
--- a/include/asm-arm/arch-rpc/irq.h
+++ b/include/asm-arm/arch-rpc/irq.h
@@ -5,130 +5,170 @@
*
* Changelog:
* 10-10-1996 RMK Brought up to date with arch-sa110eval
+ * 22-08-1998 RMK Restructured IRQ routines
*/
-#define BUILD_IRQ(s,n,m) \
- void IRQ##n##_interrupt(void); \
- void fast_IRQ##n##_interrupt(void); \
- void bad_IRQ##n##_interrupt(void); \
- void probe_IRQ##n##_interrupt(void);
+static void rpc_mask_irq_ack_a(unsigned int irq)
+{
+ unsigned int temp;
-/*
- * The timer is a special interrupt
- */
-#define IRQ5_interrupt timer_IRQ_interrupt
+ __asm__ __volatile__(
+ "ldrb %0, [%2]\n"
+" bic %0, %0, %1\n"
+" strb %0, [%2]\n"
+" strb %1, [%3]"
+ : "=&r" (temp)
+ : "r" (1 << (irq & 7)), "r" (ioaddr(IOMD_IRQMASKA)),
+ "r" (ioaddr(IOMD_IRQCLRA)));
+}
-#define IRQ_INTERRUPT(n) IRQ##n##_interrupt
-#define FAST_INTERRUPT(n) fast_IRQ##n##_interrupt
-#define BAD_INTERRUPT(n) bad_IRQ##n##_interrupt
-#define PROBE_INTERRUPT(n) probe_IRQ##n##_interrupt
+static void rpc_mask_irq_a(unsigned int irq)
+{
+ unsigned int temp;
-#define X(x) (x)|0x01, (x)|0x02, (x)|0x04, (x)|0x08, (x)|0x10, (x)|0x20, (x)|0x40, (x)|0x80
-#define Z(x) (x), (x), (x), (x), (x), (x), (x), (x)
+ __asm__ __volatile__(
+ "ldrb %0, [%2]\n"
+" bic %0, %0, %1\n"
+" strb %0, [%2]"
+ : "=&r" (temp)
+ : "r" (1 << (irq & 7)), "r" (ioaddr(IOMD_IRQMASKA)));
+}
-static __inline__ void mask_and_ack_irq(unsigned int irq)
+static void rpc_unmask_irq_a(unsigned int irq)
{
- static const int addrmasks[] = {
- X((IOMD_IRQMASKA - IOMD_BASE)<<18 | (1 << 15)),
- X((IOMD_IRQMASKB - IOMD_BASE)<<18),
- X((IOMD_DMAMASK - IOMD_BASE)<<18),
- Z(0),
- Z(0),
- Z(0),
- Z(0),
- Z(0),
- X((IOMD_FIQMASK - IOMD_BASE)<<18),
- Z(0),
- Z(0),
- Z(0),
- Z(0),
- Z(0),
- Z(0),
- Z(0)
- };
- unsigned int temp1, temp2;
+ unsigned int temp;
__asm__ __volatile__(
-" ldr %1, [%5, %3, lsl #2]\n"
-" teq %1, #0\n"
-" beq 2f\n"
-" ldrb %0, [%2, %1, lsr #16]\n"
+ "ldrb %0, [%2]\n"
+" orr %0, %0, %1\n"
+" strb %0, [%2]"
+ : "=&r" (temp)
+ : "r" (1 << (irq & 7)), "r" (ioaddr(IOMD_IRQMASKA)));
+}
+
+static void rpc_mask_irq_b(unsigned int irq)
+{
+ unsigned int temp;
+
+ __asm__ __volatile__(
+ "ldrb %0, [%2]\n"
" bic %0, %0, %1\n"
-" strb %0, [%2, %1, lsr #16]\n"
-" tst %1, #0x8000\n" /* do we need an IRQ clear? */
-" strneb %1, [%2, %4]\n"
-"2:"
- : "=&r" (temp1), "=&r" (temp2)
- : "r" (ioaddr(IOMD_BASE)), "r" (irq),
- "I" ((IOMD_IRQCLRA - IOMD_BASE) << 2), "r" (addrmasks));
+" strb %0, [%2]"
+ : "=&r" (temp)
+ : "r" (1 << (irq & 7)), "r" (ioaddr(IOMD_IRQMASKB)));
}
-#undef X
-#undef Z
+static void rpc_unmask_irq_b(unsigned int irq)
+{
+ unsigned int temp;
+
+ __asm__ __volatile__(
+ "ldrb %0, [%2]\n"
+" orr %0, %0, %1\n"
+" strb %0, [%2]"
+ : "=&r" (temp)
+ : "r" (1 << (irq & 7)), "r" (ioaddr(IOMD_IRQMASKB)));
+}
-static __inline__ void mask_irq(unsigned int irq)
+static void rpc_mask_irq_dma(unsigned int irq)
{
- extern void ecard_disableirq (unsigned int);
- extern void ecard_disablefiq (unsigned int);
- unsigned char mask = 1 << (irq & 7);
-
- switch (irq >> 3) {
- case 0:
- outb(inb(IOMD_IRQMASKA) & ~mask, IOMD_IRQMASKA);
- break;
- case 1:
- outb(inb(IOMD_IRQMASKB) & ~mask, IOMD_IRQMASKB);
- break;
- case 2:
- outb(inb(IOMD_DMAMASK) & ~mask, IOMD_DMAMASK);
- break;
- case 4:
- ecard_disableirq (irq & 7);
- break;
- case 8:
- outb(inb(IOMD_FIQMASK) & ~mask, IOMD_FIQMASK);
- break;
- case 12:
- ecard_disablefiq (irq & 7);
- }
+ unsigned int temp;
+
+ __asm__ __volatile__(
+ "ldrb %0, [%2]\n"
+" bic %0, %0, %1\n"
+" strb %0, [%2]"
+ : "=&r" (temp)
+ : "r" (1 << (irq & 7)), "r" (ioaddr(IOMD_DMAMASK)));
}
-static __inline__ void unmask_irq(unsigned int irq)
+static void rpc_unmask_irq_dma(unsigned int irq)
{
- extern void ecard_enableirq (unsigned int);
- extern void ecard_enablefiq (unsigned int);
- unsigned char mask = 1 << (irq & 7);
-
- switch (irq >> 3) {
- case 0:
- outb(inb(IOMD_IRQMASKA) | mask, IOMD_IRQMASKA);
- break;
- case 1:
- outb(inb(IOMD_IRQMASKB) | mask, IOMD_IRQMASKB);
- break;
- case 2:
- outb(inb(IOMD_DMAMASK) | mask, IOMD_DMAMASK);
- break;
- case 4:
- ecard_enableirq (irq & 7);
- break;
- case 8:
- outb(inb(IOMD_FIQMASK) | mask, IOMD_FIQMASK);
- break;
- case 12:
- ecard_enablefiq (irq & 7);
- }
+ unsigned int temp;
+
+ __asm__ __volatile__(
+ "ldrb %0, [%2]\n"
+" orr %0, %0, %1\n"
+" strb %0, [%2]"
+ : "=&r" (temp)
+ : "r" (1 << (irq & 7)), "r" (ioaddr(IOMD_DMAMASK)));
+}
+
+static void rpc_mask_irq_fiq(unsigned int irq)
+{
+ unsigned int temp;
+
+ __asm__ __volatile__(
+ "ldrb %0, [%2]\n"
+" bic %0, %0, %1\n"
+" strb %0, [%2]"
+ : "=&r" (temp)
+ : "r" (1 << (irq & 7)), "r" (ioaddr(IOMD_FIQMASK)));
}
-static __inline__ unsigned long get_enabled_irqs(void)
+static void rpc_unmask_irq_fiq(unsigned int irq)
{
- return inb(IOMD_IRQMASKA) | inb(IOMD_IRQMASKB) << 8 | inb(IOMD_DMAMASK) << 16;
+ unsigned int temp;
+
+ __asm__ __volatile__(
+ "ldrb %0, [%2]\n"
+" orr %0, %0, %1\n"
+" strb %0, [%2]"
+ : "=&r" (temp)
+ : "r" (1 << (irq & 7)), "r" (ioaddr(IOMD_FIQMASK)));
}
static __inline__ void irq_init_irq(void)
{
+ extern void ecard_disableirq(unsigned int irq);
+ extern void ecard_enableirq(unsigned int irq);
+ int irq;
+
outb(0, IOMD_IRQMASKA);
outb(0, IOMD_IRQMASKB);
outb(0, IOMD_FIQMASK);
outb(0, IOMD_DMAMASK);
+
+ for (irq = 0; irq < NR_IRQS; irq++) {
+ switch (irq) {
+ case 0 ... 6:
+ irq_desc[irq].probe_ok = 1;
+ case 7:
+ irq_desc[irq].valid = 1;
+ irq_desc[irq].mask_ack = rpc_mask_irq_ack_a;
+ irq_desc[irq].mask = rpc_mask_irq_a;
+ irq_desc[irq].unmask = rpc_unmask_irq_a;
+ break;
+
+ case 9 ... 15:
+ irq_desc[irq].probe_ok = 1;
+ case 8:
+ irq_desc[irq].valid = 1;
+ irq_desc[irq].mask_ack = rpc_mask_irq_b;
+ irq_desc[irq].mask = rpc_mask_irq_b;
+ irq_desc[irq].unmask = rpc_unmask_irq_b;
+ break;
+
+ case 16 ... 22:
+ irq_desc[irq].valid = 1;
+ irq_desc[irq].mask_ack = rpc_mask_irq_dma;
+ irq_desc[irq].mask = rpc_mask_irq_dma;
+ irq_desc[irq].unmask = rpc_unmask_irq_dma;
+ break;
+
+ case 32 ... 40:
+ irq_desc[irq].valid = 1;
+ irq_desc[irq].mask_ack = ecard_disableirq;
+ irq_desc[irq].mask = ecard_disableirq;
+ irq_desc[irq].unmask = ecard_enableirq;
+ break;
+
+ case 64 ... 72:
+ irq_desc[irq].valid = 1;
+ irq_desc[irq].mask_ack = rpc_mask_irq_fiq;
+ irq_desc[irq].mask = rpc_mask_irq_fiq;
+ irq_desc[irq].unmask = rpc_unmask_irq_fiq;
+ break;
+ }
+ }
}
diff --git a/include/asm-arm/arch-rpc/irqs.h b/include/asm-arm/arch-rpc/irqs.h
index 1faaf758e..948ba961d 100644
--- a/include/asm-arm/arch-rpc/irqs.h
+++ b/include/asm-arm/arch-rpc/irqs.h
@@ -35,5 +35,3 @@
#define IRQ_TIMER IRQ_TIMER0
-#define irq_cannonicalize(i) (i)
-
diff --git a/include/asm-arm/arch-rpc/param.h b/include/asm-arm/arch-rpc/param.h
new file mode 100644
index 000000000..bd1279f60
--- /dev/null
+++ b/include/asm-arm/arch-rpc/param.h
@@ -0,0 +1,8 @@
+/*
+ * linux/include/asm-arm/arch-rpc/param.h
+ *
+ * Copyright (C) 1996 Russell King
+ * Copyright (C) 1998 Philip Blundell
+ */
+
+#define HZ 100
diff --git a/include/asm-arm/arch-rpc/uncompress.h b/include/asm-arm/arch-rpc/uncompress.h
index 577d18d1e..7740f0c3f 100644
--- a/include/asm-arm/arch-rpc/uncompress.h
+++ b/include/asm-arm/arch-rpc/uncompress.h
@@ -141,3 +141,7 @@ static void arch_decomp_setup(void)
}
#endif
+/*
+ * nothing to do
+ */
+#define arch_decomp_wdog()