m68knommu: remove duplicate ColdFire mcf_autovector() code
authorGreg Ungerer <gerg@uclinux.org>
Tue, 19 May 2009 04:08:47 +0000 (14:08 +1000)
committerGreg Ungerer <gerg@uclinux.org>
Tue, 15 Sep 2009 23:43:50 +0000 (09:43 +1000)
Each of the ColdFire CPU platform code that used the old style interrupt
controller had its own copy of the mcf_autovector() function. They are all
the same, remove them all and create a single function in the common
coldfire/intc.c code.

Signed-off-by: Greg Ungerer <gerg@uclinux.org>
arch/m68knommu/platform/5206/config.c
arch/m68knommu/platform/5206e/config.c
arch/m68knommu/platform/5249/config.c
arch/m68knommu/platform/5272/config.c
arch/m68knommu/platform/5307/config.c
arch/m68knommu/platform/5407/config.c
arch/m68knommu/platform/coldfire/intc.c

index f6f7987..481617a 100644 (file)
@@ -68,23 +68,6 @@ static void __init m5206_uarts_init(void)
 
 /***************************************************************************/
 
-void mcf_autovector(unsigned int vec)
-{
-       volatile unsigned char  *mbar;
-       unsigned char           icr;
-
-       if ((vec >= 25) && (vec <= 31)) {
-               vec -= 25;
-               mbar = (volatile unsigned char *) MCF_MBAR;
-               icr = MCFSIM_ICR_AUTOVEC | (vec << 3);
-               *(mbar + MCFSIM_ICR1 + vec) = icr;
-               vec = 0x1 << (vec + 1);
-               mcf_setimr(mcf_getimr() & ~vec);
-       }
-}
-
-/***************************************************************************/
-
 void mcf_settimericr(unsigned int timer, unsigned int level)
 {
        volatile unsigned char *icrp;
index fcf1400..29e565a 100644 (file)
@@ -69,23 +69,6 @@ static void __init m5206e_uarts_init(void)
 
 /***************************************************************************/
 
-void mcf_autovector(unsigned int vec)
-{
-       volatile unsigned char  *mbar;
-       unsigned char           icr;
-
-       if ((vec >= 25) && (vec <= 31)) {
-               vec -= 25;
-               mbar = (volatile unsigned char *) MCF_MBAR;
-               icr = MCFSIM_ICR_AUTOVEC | (vec << 3);
-               *(mbar + MCFSIM_ICR1 + vec) = icr;
-               vec = 0x1 << (vec + 1);
-               mcf_setimr(mcf_getimr() & ~vec);
-       }
-}
-
-/***************************************************************************/
-
 void mcf_settimericr(unsigned int timer, unsigned int level)
 {
        volatile unsigned char *icrp;
index 93d9988..365fb6c 100644 (file)
@@ -68,20 +68,6 @@ static void __init m5249_uarts_init(void)
 
 /***************************************************************************/
 
-void mcf_autovector(unsigned int vec)
-{
-       volatile unsigned char  *mbar;
-
-       if ((vec >= 25) && (vec <= 31)) {
-               mbar = (volatile unsigned char *) MCF_MBAR;
-               vec = 0x1 << (vec - 24);
-               *(mbar + MCFSIM_AVR) |= vec;
-               mcf_setimr(mcf_getimr() & ~vec);
-       }
-}
-
-/***************************************************************************/
-
 void mcf_settimericr(unsigned int timer, unsigned int level)
 {
        volatile unsigned char *icrp;
index 5f95fcd..94a66c1 100644 (file)
@@ -148,13 +148,6 @@ void mcf_disableall(void)
 
 /***************************************************************************/
 
-void mcf_autovector(unsigned int vec)
-{
-       /* Everything is auto-vectored on the 5272 */
-}
-
-/***************************************************************************/
-
 void mcf_settimericr(int timer, int level)
 {
        volatile unsigned long *icrp;
index 39da9e9..60fe45d 100644 (file)
@@ -83,20 +83,6 @@ static void __init m5307_uarts_init(void)
 
 /***************************************************************************/
 
-void mcf_autovector(unsigned int vec)
-{
-       volatile unsigned char  *mbar;
-
-       if ((vec >= 25) && (vec <= 31)) {
-               mbar = (volatile unsigned char *) MCF_MBAR;
-               vec = 0x1 << (vec - 24);
-               *(mbar + MCFSIM_AVR) |= vec;
-               mcf_setimr(mcf_getimr() & ~vec);
-       }
-}
-
-/***************************************************************************/
-
 void mcf_settimericr(unsigned int timer, unsigned int level)
 {
        volatile unsigned char *icrp;
index b41d942..1e8ef74 100644 (file)
@@ -74,20 +74,6 @@ static void __init m5407_uarts_init(void)
 
 /***************************************************************************/
 
-void mcf_autovector(unsigned int vec)
-{
-       volatile unsigned char  *mbar;
-
-       if ((vec >= 25) && (vec <= 31)) {
-               mbar = (volatile unsigned char *) MCF_MBAR;
-               vec = 0x1 << (vec - 24);
-               *(mbar + MCFSIM_AVR) |= vec;
-               mcf_setimr(mcf_getimr() & ~vec);
-       }
-}
-
-/***************************************************************************/
-
 void mcf_settimericr(unsigned int timer, unsigned int level)
 {
        volatile unsigned char *icrp;
index c81ab6e..f7a6134 100644 (file)
 #include <asm/coldfire.h>
 #include <asm/mcfsim.h>
 
+/*
+ * Define the vector numbers for the basic 7 interrupt sources.
+ * These are often referred to as the "external" interrupts in
+ * the ColdFire documentation (for the early ColdFire cores at least).
+ */
+#define        EIRQ1   25
+#define        EIRQ7   31
+
+/*
+ * Interrupts can be "vectored" on the ColdFire cores that support this old
+ * interrupt controller. That is, the device raising the interrupt can also
+ * supply the vector number to interrupt through. The AVR register of the
+ * interrupt controller enables or disables this for each external interrupt,
+ * so provide generic support for this. Setting this up is out-of-band for
+ * the interrupt system API's, and needs to be done by the driver that
+ * supports this device. Very few devices actually use this.
+ */
+void mcf_autovector(int irq)
+{
+       if ((irq >= EIRQ1) && (irq <= EIRQ7)) {
+               u8 avec;
+               avec = __raw_readb(MCF_MBAR + MCFSIM_AVR);
+               avec |= (0x1 << (irq - EIRQ1 + 1));
+               __raw_writeb(avec, MCF_MBAR + MCFSIM_AVR);
+       }
+}
+
 static void intc_irq_mask(unsigned int irq)
 {
 }