This commit was manufactured by cvs2svn to create branch 'vserver'.
[linux-2.6.git] / arch / sh / boards / landisk / irq.c
diff --git a/arch/sh/boards/landisk/irq.c b/arch/sh/boards/landisk/irq.c
new file mode 100644 (file)
index 0000000..3eba6d0
--- /dev/null
@@ -0,0 +1,97 @@
+/*
+ * arch/sh/boards/landisk/irq.c
+ *
+ * Copyright (C) 2001  Ian da Silva, Jeremy Siegel
+ * Based largely on io_se.c.
+ *
+ * I/O routine for I-O Data Device, Inc. LANDISK.
+ *
+ * Initial version only to support LAN access; some
+ * placeholder code from io_landisk.c left in with the
+ * expectation of later SuperIO and PCMCIA access.
+ */
+/*
+ * modified by kogiidena
+ * 2005.03.03
+ */
+#include <linux/init.h>
+#include <linux/irq.h>
+#include <linux/interrupt.h>
+#include <linux/io.h>
+#include <asm/landisk/iodata_landisk.h>
+
+static void enable_landisk_irq(unsigned int irq);
+static void disable_landisk_irq(unsigned int irq);
+
+/* shutdown is same as "disable" */
+#define shutdown_landisk_irq disable_landisk_irq
+
+static void ack_landisk_irq(unsigned int irq);
+static void end_landisk_irq(unsigned int irq);
+
+static unsigned int startup_landisk_irq(unsigned int irq)
+{
+       enable_landisk_irq(irq);
+       return 0;               /* never anything pending */
+}
+
+static void disable_landisk_irq(unsigned int irq)
+{
+       unsigned char val;
+       unsigned char mask = 0xff ^ (0x01 << (irq - 5));
+
+       /* Set the priority in IPR to 0 */
+       val = ctrl_inb(PA_IMASK);
+       val &= mask;
+       ctrl_outb(val, PA_IMASK);
+}
+
+static void enable_landisk_irq(unsigned int irq)
+{
+       unsigned char val;
+       unsigned char value = (0x01 << (irq - 5));
+
+       /* Set priority in IPR back to original value */
+       val = ctrl_inb(PA_IMASK);
+       val |= value;
+       ctrl_outb(val, PA_IMASK);
+}
+
+static void ack_landisk_irq(unsigned int irq)
+{
+       disable_landisk_irq(irq);
+}
+
+static void end_landisk_irq(unsigned int irq)
+{
+       if (!(irq_desc[irq].status & (IRQ_DISABLED | IRQ_INPROGRESS)))
+               enable_landisk_irq(irq);
+}
+
+static struct hw_interrupt_type landisk_irq_type = {
+       .typename = "LANDISK IRQ",
+       .startup = startup_landisk_irq,
+       .shutdown = shutdown_landisk_irq,
+       .enable = enable_landisk_irq,
+       .disable = disable_landisk_irq,
+       .ack = ack_landisk_irq,
+       .end = end_landisk_irq
+};
+
+static void make_landisk_irq(unsigned int irq)
+{
+       disable_irq_nosync(irq);
+       irq_desc[irq].chip = &landisk_irq_type;
+       disable_landisk_irq(irq);
+}
+
+/*
+ * Initialize IRQ setting
+ */
+void __init init_landisk_IRQ(void)
+{
+       int i;
+
+       for (i = 5; i < 14; i++)
+               make_landisk_irq(i);
+}