@@ -79,6 +79,29 @@ clear_bit_unlock(unsigned long nr, volatile void * addr)
clear_bit(nr, addr);
}
+static inline bool clear_bit_unlock_is_negative_byte(unsigned int nr,
+ volatile unsigned long *p)
+{
+ unsigned long temp;
+ int *m = ((int *)p) + (nr >> 5);
+
+ smp_mb();
+ __asm__ __volatile__(
+ "1: ldl_l %0,%3\n"
+ " bic %0,%2,%0\n"
+ " stl_c %0,%1\n"
+ " beq %0,2f\n"
+ ".subsection 2\n"
+ "2: br 1b\n"
+ ".previous"
+ :"=&r" (temp), "=m" (*m)
+ :"Ir" (1UL << (nr & 31)), "m" (*m));
+
+ return temp & 128;
+}
+#define clear_bit_unlock_is_negative_byte \
+ clear_bit_unlock_is_negative_byte
+
/*
* WARNING: non atomic version.
*/