]> www.pilppa.org Git - linux-2.6-omap-h63xx.git/commitdiff
Merge branch 'spurious'
authorTony Lindgren <tony@atomide.com>
Thu, 13 Nov 2008 18:35:26 +0000 (10:35 -0800)
committerTony Lindgren <tony@atomide.com>
Thu, 13 Nov 2008 18:35:26 +0000 (10:35 -0800)
arch/arm/include/asm/mach/map.h
arch/arm/mach-omap2/io.c
arch/arm/mach-omap2/irq.c
arch/arm/mm/mmu.c

index fa0e695057db317ea3d9407ef34e9dae5e4ba878..cb1139ac19432f555b32ccc188b12f838f1ee9d4 100644 (file)
@@ -25,7 +25,6 @@ struct map_desc {
 #define MT_HIGH_VECTORS                7
 #define MT_MEMORY              8
 #define MT_ROM                 9
-#define MT_MEMORY_SO           10
 
 #ifdef CONFIG_MMU
 extern void iotable_init(struct map_desc *, int);
index c11c0e830c5027fdddceb256c382b194a2847914..adbe21fcd68408c30b712d06aff6daf671afed38 100644 (file)
@@ -119,13 +119,13 @@ static struct map_desc omap34xx_io_desc[] __initdata = {
                .virtual        = L3_34XX_VIRT,
                .pfn            = __phys_to_pfn(L3_34XX_PHYS),
                .length         = L3_34XX_SIZE,
-               .type           = MT_MEMORY_SO
+               .type           = MT_DEVICE
        },
        {
                .virtual        = L4_34XX_VIRT,
                .pfn            = __phys_to_pfn(L4_34XX_PHYS),
                .length         = L4_34XX_SIZE,
-               .type           = MT_MEMORY_SO
+               .type           = MT_DEVICE
        },
        {
                .virtual        = L4_WK_34XX_VIRT,
@@ -137,19 +137,19 @@ static struct map_desc omap34xx_io_desc[] __initdata = {
                .virtual        = OMAP34XX_GPMC_VIRT,
                .pfn            = __phys_to_pfn(OMAP34XX_GPMC_PHYS),
                .length         = OMAP34XX_GPMC_SIZE,
-               .type           = MT_MEMORY_SO
+               .type           = MT_DEVICE
        },
        {
                .virtual        = OMAP343X_SMS_VIRT,
                .pfn            = __phys_to_pfn(OMAP343X_SMS_PHYS),
                .length         = OMAP343X_SMS_SIZE,
-               .type           = MT_MEMORY_SO
+               .type           = MT_DEVICE
        },
        {
                .virtual        = OMAP343X_SDRC_VIRT,
                .pfn            = __phys_to_pfn(OMAP343X_SDRC_PHYS),
                .length         = OMAP343X_SDRC_SIZE,
-               .type           = MT_MEMORY_SO
+               .type           = MT_DEVICE
        },
        {
                .virtual        = L4_PER_34XX_VIRT,
@@ -161,7 +161,7 @@ static struct map_desc omap34xx_io_desc[] __initdata = {
                .virtual        = L4_EMU_34XX_VIRT,
                .pfn            = __phys_to_pfn(L4_EMU_34XX_PHYS),
                .length         = L4_EMU_34XX_SIZE,
-               .type           = MT_MEMORY_SO
+               .type           = MT_DEVICE
        },
 };
 #endif
index 9945146a5db6778ba77a395b3552e3ab0aa2bcd2..9c9e307360dbadb72b70047e4d5c3c014f4f11ed 100644 (file)
@@ -23,6 +23,7 @@
 #define INTC_REVISION          0x0000
 #define INTC_SYSCONFIG         0x0010
 #define INTC_SYSSTATUS         0x0014
+#define INTC_SIR               0x0040
 #define INTC_CONTROL           0x0048
 #define INTC_MIR_CLEAR0                0x0088
 #define INTC_MIR_SET0          0x008c
@@ -60,6 +61,30 @@ static u32 intc_bank_read_reg(struct omap_irq_bank *bank, u16 reg)
        return __raw_readl(bank->base_reg + reg);
 }
 
+static int previous_irq;
+
+/*
+ * On 34xx we can get occasional spurious interrupts if the ack from
+ * an interrupt handler does not get posted before we unmask. Warn about
+ * the interrupt handlers that need to flush posted writes.
+ */
+static int omap_check_spurious(unsigned int irq)
+{
+       u32 sir, spurious;
+
+       sir = intc_bank_read_reg(&irq_banks[0], INTC_SIR);
+       spurious = sir >> 6;
+
+       if (spurious > 1) {
+               printk(KERN_WARNING "Spurious irq %i: 0x%08x, please flush "
+                                       "posted write for irq %i\n",
+                                       irq, sir, previous_irq);
+               return spurious;
+       }
+
+       return 0;
+}
+
 /* XXX: FIQ and additional INTC support (only MPU at the moment) */
 static void omap_ack_irq(unsigned int irq)
 {
@@ -70,6 +95,20 @@ static void omap_mask_irq(unsigned int irq)
 {
        int offset = irq & (~(IRQ_BITS_PER_REG - 1));
 
+       if (cpu_is_omap34xx()) {
+               int spurious;
+
+               /*
+                * INT_34XX_GPT12_IRQ is also the spurious irq. Maybe because
+                * it is the highest irq number?
+                */
+               if (irq == INT_34XX_GPT12_IRQ)
+                       spurious = omap_check_spurious(irq);
+
+               if (!spurious)
+                       previous_irq = irq;
+       }
+
        irq &= (IRQ_BITS_PER_REG - 1);
 
        intc_bank_write_reg(1 << irq, &irq_banks[0], INTC_MIR_SET0 + offset);
index a72d3817896aa83f38a42c53a4c30e63532d9cae..e63db11f16a808fc0de3b73ea841ad2797ca597b 100644 (file)
@@ -236,10 +236,6 @@ static struct mem_type mem_types[] = {
                .prot_sect = PMD_TYPE_SECT,
                .domain    = DOMAIN_KERNEL,
        },
-       [MT_MEMORY_SO] = {
-               .prot_sect = PMD_TYPE_SECT | PMD_SECT_AP_WRITE | PMD_SECT_UNCACHED,
-               .domain    = DOMAIN_KERNEL,
-       },
 };
 
 const struct mem_type *get_mem_type(unsigned int type)