Gitweb:     
http://git.kernel.org/git/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commit;h=897cfcd878ccc9c2b0f1b3bb00a2368c43feafc0
Commit:     897cfcd878ccc9c2b0f1b3bb00a2368c43feafc0
Parent:     5cbc3af521a85aab8ae72c25afcf2698a7547cbd
Author:     Magnus Damm <[EMAIL PROTECTED]>
AuthorDate: Mon Sep 10 12:06:03 2007 +0900
Committer:  Paul Mundt <[EMAIL PROTECTED]>
CommitDate: Fri Sep 21 11:57:52 2007 +0900

    sh: intc - rework higlander irq code for r7780mp and r7785rp
    
    This patch reworks the highlander irq code for r7780mp and r7785rp.
    The same strategy as for the new R2D code is used here - the board
    specific interrupts are now starting from HL_FPGA_IRQ_BASE. The code
    for r7780rp is not touched due to lack of hardware.
    
    Tested with CF, AX88796 on r7780mp and r7785rp. The touch switch
    interrupt has also been tested on r7780mp.
    
    Signed-off-by: Magnus Damm <[EMAIL PROTECTED]>
    Signed-off-by: Paul Mundt <[EMAIL PROTECTED]>
---
 arch/sh/boards/renesas/r7780rp/Makefile      |    5 +-
 arch/sh/boards/renesas/r7780rp/irq-r7780mp.c |   61 ++++++++++++++++++++++++++
 arch/sh/boards/renesas/r7780rp/irq-r7780rp.c |    5 +-
 arch/sh/boards/renesas/r7780rp/irq-r7785rp.c |   46 +++++++++++++++++--
 arch/sh/boards/renesas/r7780rp/setup.c       |   54 ++++++++++++++++++----
 include/asm-sh/r7780rp.h                     |   33 ++++++--------
 6 files changed, 166 insertions(+), 38 deletions(-)

diff --git a/arch/sh/boards/renesas/r7780rp/Makefile 
b/arch/sh/boards/renesas/r7780rp/Makefile
index b1d20af..dd26182 100644
--- a/arch/sh/boards/renesas/r7780rp/Makefile
+++ b/arch/sh/boards/renesas/r7780rp/Makefile
@@ -1,9 +1,10 @@
 #
 # Makefile for the R7780RP-1 specific parts of the kernel
 #
-irqinit-y                      := irq-r7780rp.o
+irqinit-$(CONFIG_SH_R7780MP)   := irq-r7780mp.o
 irqinit-$(CONFIG_SH_R7785RP)   := irq-r7785rp.o
-obj-y                          := setup.o irq.o $(irqinit-y)
+irqinit-$(CONFIG_SH_R7780RP)   := irq-r7780rp.o irq.o
+obj-y                          := setup.o $(irqinit-y)
 
 ifneq ($(CONFIG_SH_R7785RP),y)
 obj-$(CONFIG_PUSH_SWITCH)      += psw.o
diff --git a/arch/sh/boards/renesas/r7780rp/irq-r7780mp.c 
b/arch/sh/boards/renesas/r7780rp/irq-r7780mp.c
new file mode 100644
index 0000000..59b47fe
--- /dev/null
+++ b/arch/sh/boards/renesas/r7780rp/irq-r7780mp.c
@@ -0,0 +1,61 @@
+/*
+ * Renesas Solutions Highlander R7780MP Support.
+ *
+ * Copyright (C) 2002  Atom Create Engineering Co., Ltd.
+ * Copyright (C) 2006  Paul Mundt
+ * Copyright (C) 2007  Magnus Damm
+ *
+ * This file is subject to the terms and conditions of the GNU General Public
+ * License.  See the file "COPYING" in the main directory of this archive
+ * for more details.
+ */
+#include <linux/init.h>
+#include <linux/irq.h>
+#include <linux/io.h>
+#include <asm/r7780rp.h>
+
+enum {
+       UNUSED = 0,
+
+       /* board specific interrupt sources */
+       AX88796,          /* Ethernet controller */
+       CF,               /* Compact Flash */
+       PSW,              /* Push Switch */
+       EXT1,             /* EXT1n IRQ */
+       EXT4,             /* EXT4n IRQ */
+};
+
+static struct intc_vect vectors[] __initdata = {
+       INTC_IRQ(CF, IRQ_CF),
+       INTC_IRQ(PSW, IRQ_PSW),
+       INTC_IRQ(AX88796, IRQ_AX88796),
+       INTC_IRQ(EXT1, IRQ_EXT1),
+       INTC_IRQ(EXT4, IRQ_EXT4),
+};
+
+static struct intc_mask_reg mask_registers[] __initdata = {
+       { 0xa4000000, 0, 16, /* IRLMSK */
+         { 0, 0, 0, 0, CF, 0, 0, 0,
+           0, 0, 0, EXT4, 0, EXT1, PSW, AX88796 } },
+};
+
+static unsigned char irl2irq[HL_NR_IRL] __initdata = {
+       0, IRQ_CF, 0, 0,
+       0, 0, 0, 0,
+       0, IRQ_EXT4, 0, IRQ_EXT1,
+       0, IRQ_AX88796, IRQ_PSW,
+};
+
+static DECLARE_INTC_DESC(intc_desc, "r7780mp", vectors,
+                        NULL, NULL, mask_registers, NULL, NULL);
+
+unsigned char * __init highlander_init_irq_r7780mp(void)
+{
+       if ((ctrl_inw(0xa4000700) & 0xf000) == 0x2000) {
+               printk(KERN_INFO "Using r7780mp interrupt controller.\n");
+               register_intc_controller(&intc_desc);
+               return irl2irq;
+       }
+
+       return NULL;
+}
diff --git a/arch/sh/boards/renesas/r7780rp/irq-r7780rp.c 
b/arch/sh/boards/renesas/r7780rp/irq-r7780rp.c
index f5f3587..d6b107a 100644
--- a/arch/sh/boards/renesas/r7780rp/irq-r7780rp.c
+++ b/arch/sh/boards/renesas/r7780rp/irq-r7780rp.c
@@ -9,13 +9,14 @@
  * for more details.
  */
 #include <linux/init.h>
-#include <asm/io.h>
 #include <asm/r7780rp.h>
 
-void __init highlander_init_irq(void)
+unsigned char * __init highlander_init_irq_r7780rp(void)
 {
        int i;
 
        for (i = 0; i < 15; i++)
                make_r7780rp_irq(i);
+
+       return NULL;
 }
diff --git a/arch/sh/boards/renesas/r7780rp/irq-r7785rp.c 
b/arch/sh/boards/renesas/r7780rp/irq-r7785rp.c
index dd6ec4c..b2c6a84 100644
--- a/arch/sh/boards/renesas/r7780rp/irq-r7785rp.c
+++ b/arch/sh/boards/renesas/r7780rp/irq-r7785rp.c
@@ -1,19 +1,55 @@
 /*
- * Renesas Solutions Highlander R7780RP-1 Support.
+ * Renesas Solutions Highlander R7785RP Support.
  *
  * Copyright (C) 2002  Atom Create Engineering Co., Ltd.
  * Copyright (C) 2006  Paul Mundt
+ * Copyright (C) 2007  Magnus Damm
  *
  * This file is subject to the terms and conditions of the GNU General Public
  * License.  See the file "COPYING" in the main directory of this archive
  * for more details.
  */
 #include <linux/init.h>
-#include <asm/io.h>
+#include <linux/irq.h>
+#include <linux/io.h>
 #include <asm/r7780rp.h>
 
-void __init highlander_init_irq(void)
+enum {
+       UNUSED = 0,
+
+       /* board specific interrupt sources */
+       AX88796,          /* Ethernet controller */
+       CF,               /* Compact Flash */
+};
+
+static struct intc_vect vectors[] __initdata = {
+       INTC_IRQ(CF, IRQ_CF),
+       INTC_IRQ(AX88796, IRQ_AX88796),
+};
+
+static struct intc_mask_reg mask_registers[] __initdata = {
+       { 0xa4000010, 0, 16, /* IRLMCR1 */
+         { 0, 0, 0, 0, CF, AX88796, 0, 0,
+           0, 0, 0, 0, 0, 0, 0, 0 } },
+};
+
+static unsigned char irl2irq[HL_NR_IRL] __initdata = {
+       0, IRQ_CF, 0, 0,
+       0, 0, 0, 0,
+       0, 0, IRQ_AX88796, 0,
+       0, 0, 0,
+};
+
+static DECLARE_INTC_DESC(intc_desc, "r7785rp", vectors,
+                        NULL, NULL, mask_registers, NULL, NULL);
+
+unsigned char * __init highlander_init_irq_r7785rp(void)
 {
+       if ((ctrl_inw(0xa4000158) & 0xf000) != 0x1000)
+               return NULL;
+
+       printk(KERN_INFO "Using r7785rp interrupt controller.\n");
+
        ctrl_outw(0x0000, PA_IRLSSR1);  /* FPGA IRLSSR1(CF_CD clear) */
 
        /* Setup the FPGA IRL */
@@ -24,6 +60,6 @@ void __init highlander_init_irq(void)
        ctrl_outw(0x4321, PA_IRLPRE);   /* FPGA IRLE */
        ctrl_outw(0x0000, PA_IRLPRF);   /* FPGA IRLF */
 
-       make_r7780rp_irq(1);    /* CF card */
-       make_r7780rp_irq(10);   /* On-board ethernet */
+       register_intc_controller(&intc_desc);
+       return irl2irq;
 }
diff --git a/arch/sh/boards/renesas/r7780rp/setup.c 
b/arch/sh/boards/renesas/r7780rp/setup.c
index 3ab5fc4..afe9de7 100644
--- a/arch/sh/boards/renesas/r7780rp/setup.c
+++ b/arch/sh/boards/renesas/r7780rp/setup.c
@@ -31,8 +31,8 @@ static struct resource r8a66597_usb_host_resources[] = {
        },
        [1] = {
                .name   = "r8a66597_hcd",
-               .start  = 11,           /* irq number */
-               .end    = 11,
+               .start  = IRQ_EXT1,             /* irq number */
+               .end    = IRQ_EXT1,
                .flags  = IORESOURCE_IRQ,
        },
 };
@@ -57,8 +57,8 @@ static struct resource m66592_usb_peripheral_resources[] = {
        },
        [1] = {
                .name   = "m66592_udc",
-               .start  = 9,            /* irq number */
-               .end    = 9,
+               .start  = IRQ_EXT4,             /* irq number */
+               .end    = IRQ_EXT4,
                .flags  = IORESOURCE_IRQ,
        },
 };
@@ -86,11 +86,7 @@ static struct resource cf_ide_resources[] = {
                .flags  = IORESOURCE_MEM,
        },
        [2] = {
-#ifdef CONFIG_SH_R7780RP
-               .start  = 4,
-#else
-               .start  = 1,
-#endif
+               .start  = IRQ_CF,
                .flags  = IORESOURCE_IRQ,
        },
 };
@@ -225,12 +221,50 @@ static void __init highlander_setup(char **cmdline_p)
        pm_power_off = r7780rp_power_off;
 }
 
+static unsigned char irl2irq[HL_NR_IRL];
+
+int highlander_irq_demux(int irq)
+{
+       if (irq >= HL_NR_IRL || !irl2irq[irq])
+               return irq;
+
+       return irl2irq[irq];
+}
+
+void __init highlander_init_irq(void)
+{
+       unsigned char *ucp = NULL;
+
+       do {
+#ifdef CONFIG_SH_R7780MP
+               ucp = highlander_init_irq_r7780mp();
+               if (ucp)
+                       break;
+#endif
+#ifdef CONFIG_SH_R7785RP
+               ucp = highlander_init_irq_r7785rp();
+               if (ucp)
+                       break;
+#endif
+#ifdef CONFIG_SH_R7780RP
+               highlander_init_irq_r7780rp();
+               ucp = irl2irq;
+               break;
+#endif
+       } while (0);
+
+       if (ucp) {
+               plat_irq_setup_pins(IRQ_MODE_IRL3210);
+               memcpy(irl2irq, ucp, HL_NR_IRL);
+       }
+}
+
 /*
  * The Machine Vector
  */
 static struct sh_machine_vector mv_highlander __initmv = {
        .mv_name                = "Highlander",
-       .mv_nr_irqs             = 109,
        .mv_setup               = highlander_setup,
        .mv_init_irq            = highlander_init_irq,
+       .mv_irq_demux           = highlander_irq_demux,
 };
diff --git a/include/asm-sh/r7780rp.h b/include/asm-sh/r7780rp.h
index 4083b59..de37f93 100644
--- a/include/asm-sh/r7780rp.h
+++ b/include/asm-sh/r7780rp.h
@@ -65,24 +65,6 @@
 #define PA_PMR          (PA_BCR+0x0900) /*  */
 
 #define IRLCNTR1        (PA_BCR + 0)    /* Interrupt Control Register1 */
-
-#define IRQ_PCISLOT1    65              /* PCI Slot #1 IRQ */
-#define IRQ_PCISLOT2    66              /* PCI Slot #2 IRQ */
-#define IRQ_PCISLOT3    67              /* PCI Slot #3 IRQ */
-#define IRQ_PCISLOT4    68              /* PCI Slot #4 IRQ */
-#define IRQ_TP          2               /* Touch Panel IRQ */
-#define IRQ_SCI1        3               /* SCI1 IRQ */
-#define IRQ_SCI0        4               /* SCI0 IRQ */
-#define IRQ_2SERIAL     5               /* Serial IRQ */
-#define IRQ_RTC         6               /* RTC A / B IRQ */
-#define IRQ_EXTENTION6  7               /* EXT6n IRQ */
-#define IRQ_EXTENTION5  8               /* EXT5n IRQ */
-#define IRQ_EXTENTION4  9               /* EXT4n IRQ */
-#define IRQ_EXTENTION2  10              /* EXT2n IRQ */
-#define IRQ_EXTENTION1  11              /* EXT1n IRQ */
-#define IRQ_ONETH       13              /* On board Ethernet IRQ */
-#define IRQ_PSW         14              /* Push Switch IRQ */
-
 #define IVDR_CK_ON     8               /* iVDR Clock ON */
 
 #elif defined(CONFIG_SH_R7780RP)
@@ -203,11 +185,24 @@
 #define PA_MMSR                (PA_BCR+0x0400)
 
 #define IVDR_CK_ON     4               /* iVDR Clock ON */
+#endif
 
+#define HL_FPGA_IRQ_BASE       200
+#define HL_NR_IRL              15
+
+#define IRQ_AX88796            (HL_FPGA_IRQ_BASE + 0)
+#define IRQ_CF                 (HL_FPGA_IRQ_BASE + 1)
+#ifndef IRQ_PSW
+#define IRQ_PSW                        (HL_FPGA_IRQ_BASE + 2)
 #endif
+#define IRQ_EXT1               (HL_FPGA_IRQ_BASE + 3)
+#define IRQ_EXT4               (HL_FPGA_IRQ_BASE + 4)
 
 void make_r7780rp_irq(unsigned int irq);
-void highlander_init_irq(void);
+
+unsigned char *highlander_init_irq_r7780mp(void);
+unsigned char *highlander_init_irq_r7780rp(void);
+unsigned char *highlander_init_irq_r7785rp(void);
 
 #define __IO_PREFIX    r7780rp
 #include <asm/io_generic.h>
-
To unsubscribe from this list: send the line "unsubscribe git-commits-head" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to