sh: Fixes some write posting issues in the interrupt handling for SH
[linux-block.git] / drivers / sh / intc.c
index 3dd231a643b5edabe44d1b156ffb9de426d640cd..4b1ca9d283534124c34464d87d2c5a9653fa2120 100644 (file)
@@ -77,7 +77,7 @@ static unsigned long ack_handle[NR_IRQS];
 static inline struct intc_desc_int *get_intc_desc(unsigned int irq)
 {
        struct irq_chip *chip = get_irq_chip(irq);
-       return (void *)((char *)chip - offsetof(struct intc_desc_int, chip));
+       return container_of(chip, struct intc_desc_int, chip);
 }
 
 static inline unsigned int set_field(unsigned int value,
@@ -95,16 +95,19 @@ static inline unsigned int set_field(unsigned int value,
 static void write_8(unsigned long addr, unsigned long h, unsigned long data)
 {
        __raw_writeb(set_field(0, data, h), addr);
+       (void)__raw_readb(addr);        /* Defeat write posting */
 }
 
 static void write_16(unsigned long addr, unsigned long h, unsigned long data)
 {
        __raw_writew(set_field(0, data, h), addr);
+       (void)__raw_readw(addr);        /* Defeat write posting */
 }
 
 static void write_32(unsigned long addr, unsigned long h, unsigned long data)
 {
        __raw_writel(set_field(0, data, h), addr);
+       (void)__raw_readl(addr);        /* Defeat write posting */
 }
 
 static void modify_8(unsigned long addr, unsigned long h, unsigned long data)
@@ -112,6 +115,7 @@ static void modify_8(unsigned long addr, unsigned long h, unsigned long data)
        unsigned long flags;
        local_irq_save(flags);
        __raw_writeb(set_field(__raw_readb(addr), data, h), addr);
+       (void)__raw_readb(addr);        /* Defeat write posting */
        local_irq_restore(flags);
 }
 
@@ -120,6 +124,7 @@ static void modify_16(unsigned long addr, unsigned long h, unsigned long data)
        unsigned long flags;
        local_irq_save(flags);
        __raw_writew(set_field(__raw_readw(addr), data, h), addr);
+       (void)__raw_readw(addr);        /* Defeat write posting */
        local_irq_restore(flags);
 }
 
@@ -128,6 +133,7 @@ static void modify_32(unsigned long addr, unsigned long h, unsigned long data)
        unsigned long flags;
        local_irq_save(flags);
        __raw_writel(set_field(__raw_readl(addr), data, h), addr);
+       (void)__raw_readl(addr);        /* Defeat write posting */
        local_irq_restore(flags);
 }