Commit 41fd50db authored by Tony Lindgren's avatar Tony Lindgren

Merge branch 'spurious'

parents d33dcd32 ea153a17
...@@ -25,7 +25,6 @@ struct map_desc { ...@@ -25,7 +25,6 @@ struct map_desc {
#define MT_HIGH_VECTORS 7 #define MT_HIGH_VECTORS 7
#define MT_MEMORY 8 #define MT_MEMORY 8
#define MT_ROM 9 #define MT_ROM 9
#define MT_MEMORY_SO 10
#ifdef CONFIG_MMU #ifdef CONFIG_MMU
extern void iotable_init(struct map_desc *, int); extern void iotable_init(struct map_desc *, int);
......
...@@ -119,13 +119,13 @@ static struct map_desc omap34xx_io_desc[] __initdata = { ...@@ -119,13 +119,13 @@ static struct map_desc omap34xx_io_desc[] __initdata = {
.virtual = L3_34XX_VIRT, .virtual = L3_34XX_VIRT,
.pfn = __phys_to_pfn(L3_34XX_PHYS), .pfn = __phys_to_pfn(L3_34XX_PHYS),
.length = L3_34XX_SIZE, .length = L3_34XX_SIZE,
.type = MT_MEMORY_SO .type = MT_DEVICE
}, },
{ {
.virtual = L4_34XX_VIRT, .virtual = L4_34XX_VIRT,
.pfn = __phys_to_pfn(L4_34XX_PHYS), .pfn = __phys_to_pfn(L4_34XX_PHYS),
.length = L4_34XX_SIZE, .length = L4_34XX_SIZE,
.type = MT_MEMORY_SO .type = MT_DEVICE
}, },
{ {
.virtual = L4_WK_34XX_VIRT, .virtual = L4_WK_34XX_VIRT,
...@@ -137,19 +137,19 @@ static struct map_desc omap34xx_io_desc[] __initdata = { ...@@ -137,19 +137,19 @@ static struct map_desc omap34xx_io_desc[] __initdata = {
.virtual = OMAP34XX_GPMC_VIRT, .virtual = OMAP34XX_GPMC_VIRT,
.pfn = __phys_to_pfn(OMAP34XX_GPMC_PHYS), .pfn = __phys_to_pfn(OMAP34XX_GPMC_PHYS),
.length = OMAP34XX_GPMC_SIZE, .length = OMAP34XX_GPMC_SIZE,
.type = MT_MEMORY_SO .type = MT_DEVICE
}, },
{ {
.virtual = OMAP343X_SMS_VIRT, .virtual = OMAP343X_SMS_VIRT,
.pfn = __phys_to_pfn(OMAP343X_SMS_PHYS), .pfn = __phys_to_pfn(OMAP343X_SMS_PHYS),
.length = OMAP343X_SMS_SIZE, .length = OMAP343X_SMS_SIZE,
.type = MT_MEMORY_SO .type = MT_DEVICE
}, },
{ {
.virtual = OMAP343X_SDRC_VIRT, .virtual = OMAP343X_SDRC_VIRT,
.pfn = __phys_to_pfn(OMAP343X_SDRC_PHYS), .pfn = __phys_to_pfn(OMAP343X_SDRC_PHYS),
.length = OMAP343X_SDRC_SIZE, .length = OMAP343X_SDRC_SIZE,
.type = MT_MEMORY_SO .type = MT_DEVICE
}, },
{ {
.virtual = L4_PER_34XX_VIRT, .virtual = L4_PER_34XX_VIRT,
...@@ -161,7 +161,7 @@ static struct map_desc omap34xx_io_desc[] __initdata = { ...@@ -161,7 +161,7 @@ static struct map_desc omap34xx_io_desc[] __initdata = {
.virtual = L4_EMU_34XX_VIRT, .virtual = L4_EMU_34XX_VIRT,
.pfn = __phys_to_pfn(L4_EMU_34XX_PHYS), .pfn = __phys_to_pfn(L4_EMU_34XX_PHYS),
.length = L4_EMU_34XX_SIZE, .length = L4_EMU_34XX_SIZE,
.type = MT_MEMORY_SO .type = MT_DEVICE
}, },
}; };
#endif #endif
......
...@@ -23,6 +23,7 @@ ...@@ -23,6 +23,7 @@
#define INTC_REVISION 0x0000 #define INTC_REVISION 0x0000
#define INTC_SYSCONFIG 0x0010 #define INTC_SYSCONFIG 0x0010
#define INTC_SYSSTATUS 0x0014 #define INTC_SYSSTATUS 0x0014
#define INTC_SIR 0x0040
#define INTC_CONTROL 0x0048 #define INTC_CONTROL 0x0048
#define INTC_MIR_CLEAR0 0x0088 #define INTC_MIR_CLEAR0 0x0088
#define INTC_MIR_SET0 0x008c #define INTC_MIR_SET0 0x008c
...@@ -60,6 +61,30 @@ static u32 intc_bank_read_reg(struct omap_irq_bank *bank, u16 reg) ...@@ -60,6 +61,30 @@ static u32 intc_bank_read_reg(struct omap_irq_bank *bank, u16 reg)
return __raw_readl(bank->base_reg + 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) */ /* XXX: FIQ and additional INTC support (only MPU at the moment) */
static void omap_ack_irq(unsigned int irq) static void omap_ack_irq(unsigned int irq)
{ {
...@@ -70,6 +95,20 @@ static void omap_mask_irq(unsigned int irq) ...@@ -70,6 +95,20 @@ static void omap_mask_irq(unsigned int irq)
{ {
int offset = irq & (~(IRQ_BITS_PER_REG - 1)); 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); irq &= (IRQ_BITS_PER_REG - 1);
intc_bank_write_reg(1 << irq, &irq_banks[0], INTC_MIR_SET0 + offset); intc_bank_write_reg(1 << irq, &irq_banks[0], INTC_MIR_SET0 + offset);
......
...@@ -236,10 +236,6 @@ static struct mem_type mem_types[] = { ...@@ -236,10 +236,6 @@ static struct mem_type mem_types[] = {
.prot_sect = PMD_TYPE_SECT, .prot_sect = PMD_TYPE_SECT,
.domain = DOMAIN_KERNEL, .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) const struct mem_type *get_mem_type(unsigned int type)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment