#ifdef GICISBYTELITTLEENDIAN
 #define GICREAD(reg, data)     ((data) = (reg), (data) = le32_to_cpu(data))
 #define GICWRITE(reg, data)    ((reg) = cpu_to_le32(data))
-#define GICBIS(reg, bits)                      \
-       ({unsigned int data;                    \
-               GICREAD(reg, data);             \
-               data |= bits;                   \
-               GICWRITE(reg, data);            \
-       })
-
 #else
 #define GICREAD(reg, data)     ((data) = (reg))
 #define GICWRITE(reg, data)    ((reg) = (data))
-#define GICBIS(reg, bits)      ((reg) |= (bits))
 #endif
+#define GICBIS(reg, mask, bits)                        \
+       do { u32 data;                          \
+               GICREAD((reg), data);           \
+               data &= ~(mask);                \
+               data |= ((bits) & (mask));      \
+               GICWRITE((reg), data);          \
+       } while (0)
 
 
 /* GIC Address Space */
 #define GIC_SH_SET_POLARITY_OFS                0x0100
 #define GIC_SET_POLARITY(intr, pol) \
        GICBIS(GIC_REG_ADDR(SHARED, GIC_SH_SET_POLARITY_OFS + \
-               GIC_INTR_OFS(intr)), (pol) << GIC_INTR_BIT(intr))
+               GIC_INTR_OFS(intr)), (1 << GIC_INTR_BIT(intr)), \
+               (pol) << GIC_INTR_BIT(intr))
 
 /* Triggering : Reset Value is always 0 */
 #define GIC_SH_SET_TRIGGER_OFS         0x0180
 #define GIC_SET_TRIGGER(intr, trig) \
        GICBIS(GIC_REG_ADDR(SHARED, GIC_SH_SET_TRIGGER_OFS + \
-               GIC_INTR_OFS(intr)), (trig) << GIC_INTR_BIT(intr))
+               GIC_INTR_OFS(intr)), (1 << GIC_INTR_BIT(intr)), \
+               (trig) << GIC_INTR_BIT(intr))
 
 /* Mask manipulation */
 #define GIC_SH_SMASK_OFS               0x0380