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 f6f79874e9af7a33da56676167b403d85844434e..481617a23d092f84b832c5ef33f791dd1c913413 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 fcf1400db5146f3f2d3d6e183c3a56bd94a87510..29e565a44431aafdd24fa0e15a537fb97b4eeb48 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 93d998825925074addca47dee661c49dc8cec9be..365fb6c5270072090e6e3bd86a7f9fd9e618767c 100644 (file)
@@ -66,20 +66,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)
index 5f95fcde05fd8a8a1e951b32594415bb27453154..94a66c12c96ab010f8ea617506ef1cde7216eaad 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 39da9e9ff674ef87a315a166f168fb979c250833..60fe45d51391dc5c94292526f8db7c41ffc5341e 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 b41d942bf8d07e3bf0079bc53a1e0432b41daa93..1e8ef74ea1566c1409defe471702a9405f8f3418 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 c81ab6e5cf26488fb92a06e870856af19c03e6e0..f7a61346ee25d7f9f3e9d33e83d6cb4dce91fffd 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)
 {
 }