Skip to contentSkip to conversation

sh: intc register modify fix

PATCH New Magnus Damm 1 participant 1 message Apr 24, 2008 SuperH

lore
Share & tools
lore
#0 lore raw

PATCH 1/1 sh: intc register modify fix

Make sure register modifications stay atomic. Fixes processors with shared priority register masking. Dual bitmap masking is unaffected.

---

 arch/sh/kernel/cpu/irq/intc.c |    9 +++++++++
 1 file changed, 9 insertions(+)
arch/sh/kernel/cpu/irq/intc.c +9 -0
@@ -101,17 +101,26 @@ static void write_32(unsigned long addr,
 
 static void modify_8(unsigned long addr, unsigned long h, unsigned long data)
 {
+	unsigned long flags;
+	local_irq_save(flags);
 	ctrl_outb(set_field(ctrl_inb(addr), data, h), addr);
+	local_irq_restore(flags);
 }
 
 static void modify_16(unsigned long addr, unsigned long h, unsigned long data)
 {
+	unsigned long flags;
+	local_irq_save(flags);
 	ctrl_outw(set_field(ctrl_inw(addr), data, h), addr);
+	local_irq_restore(flags);
 }
 
 static void modify_32(unsigned long addr, unsigned long h, unsigned long data)
 {
+	unsigned long flags;
+	local_irq_save(flags);
 	ctrl_outl(set_field(ctrl_inl(addr), data, h), addr);
+	local_irq_restore(flags);
 }
 
 enum {	REG_FN_ERR = 0, REG_FN_WRITE_BASE = 1, REG_FN_MODIFY_BASE = 5 };