[NET] smc91x: Make smc91x use IRQ resource trigger flags
authorRussell King <rmk@dyn-67.arm.linux.org.uk>
Mon, 14 Jan 2008 22:30:10 +0000 (22:30 +0000)
committerRussell King <rmk+kernel@arm.linux.org.uk>
Mon, 28 Jan 2008 13:13:19 +0000 (13:13 +0000)
smc91x is shared between many different platforms.  Each platform needs
to specify the interrupt type, and in some cases the irq type depends
on more than just the build configuration - it depends on runtime
checks.

Rather than throwing this code into the SMC_IRQ_FLAGS definition, provide
a way for these flags to be passed via the IRQ resource itself.

Note that IRQF_TRIGGER_* constants are intentionally defined to correspond
with the IORESOURCE_IRQ_* interrupt type flags, in much the same way that
the low bits of PCI iomem resources correspond with the BAR flag bits.

Also provide a way to configure smc91x to read the IRQ flags from the
resource.  Once all platforms have been converted over (signified
by all definitions of SMC_IRQ_FLAGS being -1) SMC_IRQ_FLAGS should
be removed.

Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
Acked-by: Nicolas Pitre <nico@cam.org>
Acked-by: Jeff Garzik <jgarzik@redhat.com>
17 files changed:
arch/arm/mach-omap1/board-fsample.c
arch/arm/mach-omap1/board-h2.c
arch/arm/mach-omap1/board-h3.c
arch/arm/mach-omap1/board-innovator.c
arch/arm/mach-omap1/board-osk.c
arch/arm/mach-omap1/board-perseus2.c
arch/arm/mach-omap1/board-voiceblue.c
arch/arm/mach-omap2/board-2430sdp.c
arch/arm/mach-omap2/board-apollon.c
arch/arm/mach-pxa/idp.c
arch/arm/mach-pxa/littleton.c
arch/arm/mach-pxa/lubbock.c
arch/arm/mach-pxa/mainstone.c
arch/arm/mach-pxa/zylonite.c
arch/arm/plat-omap/debug-devices.c
drivers/net/smc91x.c
drivers/net/smc91x.h

index d5f6ea1..f550b19 100644 (file)
@@ -76,7 +76,7 @@ static struct resource smc91x_resources[] = {
        [1] = {
                .start  = INT_730_MPU_EXT_NIRQ,
                .end    = 0,
-               .flags  = IORESOURCE_IRQ,
+               .flags  = IORESOURCE_IRQ | IORESOURCE_IRQ_HIGHEDGE,
        },
 };
 
index 1306812..60c4057 100644 (file)
@@ -209,7 +209,7 @@ static struct resource h2_smc91x_resources[] = {
        [1] = {
                .start  = OMAP_GPIO_IRQ(0),
                .end    = OMAP_GPIO_IRQ(0),
-               .flags  = IORESOURCE_IRQ,
+               .flags  = IORESOURCE_IRQ | IORESOURCE_IRQ_LOWEDGE,
        },
 };
 
index 4f84ae2..15b502e 100644 (file)
@@ -208,7 +208,7 @@ static struct resource smc91x_resources[] = {
        [1] = {
                .start  = OMAP_GPIO_IRQ(40),
                .end    = OMAP_GPIO_IRQ(40),
-               .flags  = IORESOURCE_IRQ,
+               .flags  = IORESOURCE_IRQ | IORESOURCE_IRQ_LOWEDGE,
        },
 };
 
index 7e63a41..7d2d8af 100644 (file)
@@ -202,7 +202,7 @@ static struct resource innovator1510_smc91x_resources[] = {
        [1] = {
                .start  = OMAP1510_INT_ETHER,
                .end    = OMAP1510_INT_ETHER,
-               .flags  = IORESOURCE_IRQ,
+               .flags  = IORESOURCE_IRQ | IORESOURCE_IRQ_HIGHEDGE,
        },
 };
 
@@ -269,7 +269,7 @@ static struct resource innovator1610_smc91x_resources[] = {
        [1] = {
                .start  = OMAP_GPIO_IRQ(0),
                .end    = OMAP_GPIO_IRQ(0),
-               .flags  = IORESOURCE_IRQ,
+               .flags  = IORESOURCE_IRQ | IORESOURCE_IRQ_LOWEDGE,
        },
 };
 
index 5db182d..1fe9ba3 100644 (file)
@@ -111,7 +111,7 @@ static struct resource osk5912_smc91x_resources[] = {
        [1] = {
                .start  = OMAP_GPIO_IRQ(0),
                .end    = OMAP_GPIO_IRQ(0),
-               .flags  = IORESOURCE_IRQ,
+               .flags  = IORESOURCE_IRQ | IORESOURCE_IRQ_HIGHEDGE,
        },
 };
 
index e44437e..534dcfb 100644 (file)
@@ -75,7 +75,7 @@ static struct resource smc91x_resources[] = {
        [1] = {
                .start  = INT_730_MPU_EXT_NIRQ,
                .end    = 0,
-               .flags  = IORESOURCE_IRQ,
+               .flags  = IORESOURCE_IRQ | IORESOURCE_IRQ_HIGHEDGE,
        },
 };
 
index 214dd19..c82a1cd 100644 (file)
@@ -117,7 +117,7 @@ static struct resource voiceblue_smc91x_resources[] = {
        [1] = {
                .start  = OMAP_GPIO_IRQ(8),
                .end    = OMAP_GPIO_IRQ(8),
-               .flags  = IORESOURCE_IRQ,
+               .flags  = IORESOURCE_IRQ | IORESOURCE_IRQ_HIGHEDGE,
        },
 };
 
index 7e76fbf..64235de 100644 (file)
@@ -104,7 +104,7 @@ static struct resource sdp2430_smc91x_resources[] = {
        [1] = {
                .start  = OMAP_GPIO_IRQ(OMAP24XX_ETHR_GPIO_IRQ),
                .end    = OMAP_GPIO_IRQ(OMAP24XX_ETHR_GPIO_IRQ),
-               .flags  = IORESOURCE_IRQ,
+               .flags  = IORESOURCE_IRQ | IORESOURCE_IRQ_HIGHEDGE,
        },
 };
 
index 3bb49c1..401a53c 100644 (file)
@@ -127,7 +127,7 @@ static struct resource apollon_smc91x_resources[] = {
        [1] = {
                .start  = OMAP_GPIO_IRQ(APOLLON_ETHR_GPIO_IRQ),
                .end    = OMAP_GPIO_IRQ(APOLLON_ETHR_GPIO_IRQ),
-               .flags  = IORESOURCE_IRQ,
+               .flags  = IORESOURCE_IRQ | IORESOURCE_IRQ_HIGHEDGE,
        },
 };
 
index 465108d..0a94344 100644 (file)
@@ -54,7 +54,7 @@ static struct resource smc91x_resources[] = {
        [1] = {
                .start  = IRQ_GPIO(4),
                .end    = IRQ_GPIO(4),
-               .flags  = IORESOURCE_IRQ,
+               .flags  = IORESOURCE_IRQ | IORESOURCE_IRQ_HIGHEDGE,
        }
 };
 
index e408a3a..0a4b54c 100644 (file)
@@ -87,7 +87,7 @@ static struct resource smc91x_resources[] = {
        [1] = {
                .start  = IRQ_GPIO(mfp_to_gpio(MFP_PIN_GPIO90)),
                .end    = IRQ_GPIO(mfp_to_gpio(MFP_PIN_GPIO90)),
-               .flags  = IORESOURCE_IRQ,
+               .flags  = IORESOURCE_IRQ | IRQF_TRIGGER_FALLING,
        }
 };
 
index a75594b..e7ae4bb 100644 (file)
@@ -196,7 +196,7 @@ static struct resource smc91x_resources[] = {
        [1] = {
                .start  = LUBBOCK_ETH_IRQ,
                .end    = LUBBOCK_ETH_IRQ,
-               .flags  = IORESOURCE_IRQ,
+               .flags  = IORESOURCE_IRQ | IORESOURCE_IRQ_HIGHEDGE,
        },
        [2] = {
                .name   = "smc91x-attrib",
index 06e1360..ac78dbd 100644 (file)
@@ -156,7 +156,7 @@ static struct resource smc91x_resources[] = {
        [1] = {
                .start  = MAINSTONE_IRQ(3),
                .end    = MAINSTONE_IRQ(3),
-               .flags  = IORESOURCE_IRQ,
+               .flags  = IORESOURCE_IRQ | IORESOURCE_IRQ_HIGHEDGE,
        }
 };
 
index b49c69d..7731d50 100644 (file)
@@ -47,7 +47,7 @@ static struct resource smc91x_resources[] = {
        [1] = {
                .start  = -1,   /* for run-time assignment */
                .end    = -1,
-               .flags  = IORESOURCE_IRQ,
+               .flags  = IORESOURCE_IRQ | IORESOURCE_IRQ_HIGHEDGE,
        }
 };
 
index 83a5f8b..f455233 100644 (file)
@@ -29,7 +29,7 @@ static struct resource smc91x_resources[] = {
                .flags  = IORESOURCE_MEM,
        },
        [1] = {
-               .flags  = IORESOURCE_IRQ,
+               .flags  = IORESOURCE_IRQ | IORESOURCE_IRQ_LOWEDGE,
        },
 };
 
index 7da7589..4020e9e 100644 (file)
@@ -1775,7 +1775,8 @@ static int __init smc_findirq(void __iomem *ioaddr)
  * o  actually GRAB the irq.
  * o  GRAB the region
  */
-static int __init smc_probe(struct net_device *dev, void __iomem *ioaddr)
+static int __init smc_probe(struct net_device *dev, void __iomem *ioaddr,
+                           unsigned long irq_flags)
 {
        struct smc_local *lp = netdev_priv(dev);
        static int version_printed = 0;
@@ -1941,7 +1942,7 @@ static int __init smc_probe(struct net_device *dev, void __iomem *ioaddr)
        }
 
        /* Grab the IRQ */
-       retval = request_irq(dev->irq, &smc_interrupt, SMC_IRQ_FLAGS, dev->name, dev);
+       retval = request_irq(dev->irq, &smc_interrupt, irq_flags, dev->name, dev);
        if (retval)
                goto err_out;
 
@@ -2123,8 +2124,9 @@ static void smc_release_datacs(struct platform_device *pdev, struct net_device *
 static int smc_drv_probe(struct platform_device *pdev)
 {
        struct net_device *ndev;
-       struct resource *res;
+       struct resource *res, *ires;
        unsigned int __iomem *addr;
+       unsigned long irq_flags = SMC_IRQ_FLAGS;
        int ret;
 
        res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "smc91x-regs");
@@ -2150,12 +2152,17 @@ static int smc_drv_probe(struct platform_device *pdev)
        SET_NETDEV_DEV(ndev, &pdev->dev);
 
        ndev->dma = (unsigned char)-1;
-       ndev->irq = platform_get_irq(pdev, 0);
-       if (ndev->irq < 0) {
+
+       ires = platform_get_resource(pdev, IORESOURCE_IRQ, 0);
+       if (!ires) {
                ret = -ENODEV;
                goto out_free_netdev;
        }
 
+       ndev->irq = ires->start;
+       if (SMC_IRQ_FLAGS == -1)
+               irq_flags = ires->flags & IRQF_TRIGGER_MASK;
+
        ret = smc_request_attrib(pdev);
        if (ret)
                goto out_free_netdev;
@@ -2181,7 +2188,7 @@ static int smc_drv_probe(struct platform_device *pdev)
 #endif
 
        platform_set_drvdata(pdev, ndev);
-       ret = smc_probe(ndev, addr);
+       ret = smc_probe(ndev, addr, irq_flags);
        if (ret != 0)
                goto out_iounmap;
 
index 07b7f71..1d97eae 100644 (file)
@@ -54,6 +54,7 @@
 #define SMC_outw(v, a, r)      writew(v, (a) + (r))
 #define SMC_insw(a, r, p, l)   readsw((a) + (r), p, l)
 #define SMC_outsw(a, r, p, l)  writesw((a) + (r), p, l)
+#define SMC_IRQ_FLAGS          (-1)    /* from resource */
 
 #elif defined(CONFIG_BLACKFIN)
 
 #define SMC_outw(v, a, r)      writew(v, (a) + (r))
 #define SMC_outsw(a, r, p, l)  writesw((a) + (r), p, l)
 
-#define SMC_IRQ_FLAGS          (0)
+#define SMC_IRQ_FLAGS          (-1)
 
 #elif defined(CONFIG_SA1100_ASSABET)
 
 #define SMC_outb(v, a, r)      writeb(v, (a) + (r))
 #define SMC_insb(a, r, p, l)   readsb((a) + (r), p, (l))
 #define SMC_outsb(a, r, p, l)  writesb((a) + (r), p, (l))
+#define SMC_IRQ_FLAGS          (-1)    /* from resource */
 
 #elif  defined(CONFIG_MACH_LOGICPD_PXA270)
 
 #define SMC_outl(v, a, r)      writel(v, (a) + (r))
 #define SMC_insl(a, r, p, l)   readsl((a) + (r), p, l)
 #define SMC_outsl(a, r, p, l)  writesl((a) + (r), p, l)
+#define SMC_IRQ_FLAGS          (-1)    /* from resource */
 
 /* We actually can't write halfwords properly if not word aligned */
 static inline void
@@ -238,6 +241,7 @@ SMC_outw(u16 val, void __iomem *ioaddr, int reg)
 #define SMC_outsw(a, r, p, l)   outsw((a) + (r), p, l)
 #define SMC_outb(v, a, r)       writeb(v, (a) + (r))
 #define SMC_outw(v, a, r)       writew(v, (a) + (r))
+#define SMC_IRQ_FLAGS          (-1)    /* from resource */
 
 #elif  defined(CONFIG_ARCH_OMAP)
 
@@ -252,17 +256,7 @@ SMC_outw(u16 val, void __iomem *ioaddr, int reg)
 #define SMC_outw(v, a, r)      writew(v, (a) + (r))
 #define SMC_insw(a, r, p, l)   readsw((a) + (r), p, l)
 #define SMC_outsw(a, r, p, l)  writesw((a) + (r), p, l)
-
-#include <asm/mach-types.h>
-#include <asm/arch/cpu.h>
-
-#define        SMC_IRQ_FLAGS (( \
-                  machine_is_omap_h2() \
-               || machine_is_omap_h3() \
-               || machine_is_omap_h4() \
-               || (machine_is_omap_innovator() && !cpu_is_omap1510()) \
-       ) ? IRQF_TRIGGER_FALLING : IRQF_TRIGGER_RISING)
-
+#define        SMC_IRQ_FLAGS           (-1)    /* from resource */
 
 #elif  defined(CONFIG_SH_SH4202_MICRODEV)
 
@@ -453,8 +447,7 @@ static inline void LPD7_SMC_outsw (unsigned char* a, int r,
 #define SMC_outl(v, a, r)      writel(v, (a) + (r))
 #define SMC_insl(a, r, p, l)   readsl((a) + (r), p, l)
 #define SMC_outsl(a, r, p, l)  writesl((a) + (r), p, l)
-
-#define SMC_IRQ_FLAGS          (0)
+#define SMC_IRQ_FLAGS          (-1)    /* from resource */
 
 #else