*/
 static inline void set_bit(unsigned long nr, volatile unsigned long *addr)
 {
-       unsigned long *m = ((unsigned long *)addr) + (nr >> SZLONG_LOG);
-       int bit = nr & SZLONG_MASK;
+       volatile unsigned long *m = &addr[BIT_WORD(nr)];
+       int bit = nr % BITS_PER_LONG;
 
        if (!kernel_uses_llsc) {
                __mips_set_bit(nr, addr);
  */
 static inline void clear_bit(unsigned long nr, volatile unsigned long *addr)
 {
-       unsigned long *m = ((unsigned long *)addr) + (nr >> SZLONG_LOG);
-       int bit = nr & SZLONG_MASK;
+       volatile unsigned long *m = &addr[BIT_WORD(nr)];
+       int bit = nr % BITS_PER_LONG;
 
        if (!kernel_uses_llsc) {
                __mips_clear_bit(nr, addr);
  */
 static inline void change_bit(unsigned long nr, volatile unsigned long *addr)
 {
-       unsigned long *m = ((unsigned long *)addr) + (nr >> SZLONG_LOG);
-       int bit = nr & SZLONG_MASK;
+       volatile unsigned long *m = &addr[BIT_WORD(nr)];
+       int bit = nr % BITS_PER_LONG;
 
        if (!kernel_uses_llsc) {
                __mips_change_bit(nr, addr);
 static inline int test_and_set_bit_lock(unsigned long nr,
        volatile unsigned long *addr)
 {
-       unsigned long *m = ((unsigned long *)addr) + (nr >> SZLONG_LOG);
-       int bit = nr & SZLONG_MASK;
+       volatile unsigned long *m = &addr[BIT_WORD(nr)];
+       int bit = nr % BITS_PER_LONG;
        unsigned long res, orig;
 
        if (!kernel_uses_llsc) {
 static inline int test_and_clear_bit(unsigned long nr,
        volatile unsigned long *addr)
 {
-       unsigned long *m = ((unsigned long *)addr) + (nr >> SZLONG_LOG);
-       int bit = nr & SZLONG_MASK;
+       volatile unsigned long *m = &addr[BIT_WORD(nr)];
+       int bit = nr % BITS_PER_LONG;
        unsigned long res, orig;
 
        smp_mb__before_llsc();
 static inline int test_and_change_bit(unsigned long nr,
        volatile unsigned long *addr)
 {
-       unsigned long *m = ((unsigned long *)addr) + (nr >> SZLONG_LOG);
-       int bit = nr & SZLONG_MASK;
+       volatile unsigned long *m = &addr[BIT_WORD(nr)];
+       int bit = nr % BITS_PER_LONG;
        unsigned long res, orig;
 
        smp_mb__before_llsc();
 
  * Copyright (c) 1999, 2000  Silicon Graphics, Inc.
  */
 #include <linux/bitops.h>
+#include <linux/bits.h>
 #include <linux/irqflags.h>
 #include <linux/export.h>
 
  */
 void __mips_set_bit(unsigned long nr, volatile unsigned long *addr)
 {
-       unsigned long *a = (unsigned long *)addr;
-       unsigned bit = nr & SZLONG_MASK;
+       volatile unsigned long *a = &addr[BIT_WORD(nr)];
+       unsigned int bit = nr % BITS_PER_LONG;
        unsigned long mask;
        unsigned long flags;
 
-       a += nr >> SZLONG_LOG;
        mask = 1UL << bit;
        raw_local_irq_save(flags);
        *a |= mask;
  */
 void __mips_clear_bit(unsigned long nr, volatile unsigned long *addr)
 {
-       unsigned long *a = (unsigned long *)addr;
-       unsigned bit = nr & SZLONG_MASK;
+       volatile unsigned long *a = &addr[BIT_WORD(nr)];
+       unsigned int bit = nr % BITS_PER_LONG;
        unsigned long mask;
        unsigned long flags;
 
-       a += nr >> SZLONG_LOG;
        mask = 1UL << bit;
        raw_local_irq_save(flags);
        *a &= ~mask;
  */
 void __mips_change_bit(unsigned long nr, volatile unsigned long *addr)
 {
-       unsigned long *a = (unsigned long *)addr;
-       unsigned bit = nr & SZLONG_MASK;
+       volatile unsigned long *a = &addr[BIT_WORD(nr)];
+       unsigned int bit = nr % BITS_PER_LONG;
        unsigned long mask;
        unsigned long flags;
 
-       a += nr >> SZLONG_LOG;
        mask = 1UL << bit;
        raw_local_irq_save(flags);
        *a ^= mask;
 int __mips_test_and_set_bit_lock(unsigned long nr,
                                 volatile unsigned long *addr)
 {
-       unsigned long *a = (unsigned long *)addr;
-       unsigned bit = nr & SZLONG_MASK;
+       volatile unsigned long *a = &addr[BIT_WORD(nr)];
+       unsigned int bit = nr % BITS_PER_LONG;
        unsigned long mask;
        unsigned long flags;
        int res;
 
-       a += nr >> SZLONG_LOG;
        mask = 1UL << bit;
        raw_local_irq_save(flags);
        res = (mask & *a) != 0;
  */
 int __mips_test_and_clear_bit(unsigned long nr, volatile unsigned long *addr)
 {
-       unsigned long *a = (unsigned long *)addr;
-       unsigned bit = nr & SZLONG_MASK;
+       volatile unsigned long *a = &addr[BIT_WORD(nr)];
+       unsigned int bit = nr % BITS_PER_LONG;
        unsigned long mask;
        unsigned long flags;
        int res;
 
-       a += nr >> SZLONG_LOG;
        mask = 1UL << bit;
        raw_local_irq_save(flags);
        res = (mask & *a) != 0;
  */
 int __mips_test_and_change_bit(unsigned long nr, volatile unsigned long *addr)
 {
-       unsigned long *a = (unsigned long *)addr;
-       unsigned bit = nr & SZLONG_MASK;
+       volatile unsigned long *a = &addr[BIT_WORD(nr)];
+       unsigned int bit = nr % BITS_PER_LONG;
        unsigned long mask;
        unsigned long flags;
        int res;
 
-       a += nr >> SZLONG_LOG;
        mask = 1UL << bit;
        raw_local_irq_save(flags);
        res = (mask & *a) != 0;