ARM: dts: Fix gpio interrupts for dm816x
[pandora-kernel.git] / lib / lockref.c
index d2233de..ecb9a66 100644 (file)
@@ -60,7 +60,7 @@ void lockref_get(struct lockref *lockref)
 EXPORT_SYMBOL(lockref_get);
 
 /**
- * lockref_get_not_zero - Increments count unless the count is 0
+ * lockref_get_not_zero - Increments count unless the count is 0 or dead
  * @lockref: pointer to lockref structure
  * Return: 1 if count updated successfully or 0 if count was zero
  */
@@ -70,7 +70,7 @@ int lockref_get_not_zero(struct lockref *lockref)
 
        CMPXCHG_LOOP(
                new.count++;
-               if (!old.count)
+               if (old.count <= 0)
                        return 0;
        ,
                return 1;
@@ -78,7 +78,7 @@ int lockref_get_not_zero(struct lockref *lockref)
 
        spin_lock(&lockref->lock);
        retval = 0;
-       if (lockref->count) {
+       if (lockref->count > 0) {
                lockref->count++;
                retval = 1;
        }
@@ -88,7 +88,7 @@ int lockref_get_not_zero(struct lockref *lockref)
 EXPORT_SYMBOL(lockref_get_not_zero);
 
 /**
- * lockref_get_or_lock - Increments count unless the count is 0
+ * lockref_get_or_lock - Increments count unless the count is 0 or dead
  * @lockref: pointer to lockref structure
  * Return: 1 if count updated successfully or 0 if count was zero
  * and we got the lock instead.
@@ -97,14 +97,14 @@ int lockref_get_or_lock(struct lockref *lockref)
 {
        CMPXCHG_LOOP(
                new.count++;
-               if (!old.count)
+               if (old.count <= 0)
                        break;
        ,
                return 1;
        );
 
        spin_lock(&lockref->lock);
-       if (!lockref->count)
+       if (lockref->count <= 0)
                return 0;
        lockref->count++;
        spin_unlock(&lockref->lock);
@@ -112,6 +112,26 @@ int lockref_get_or_lock(struct lockref *lockref)
 }
 EXPORT_SYMBOL(lockref_get_or_lock);
 
+/**
+ * lockref_put_return - Decrement reference count if possible
+ * @lockref: pointer to lockref structure
+ *
+ * Decrement the reference count and return the new value.
+ * If the lockref was dead or locked, return an error.
+ */
+int lockref_put_return(struct lockref *lockref)
+{
+       CMPXCHG_LOOP(
+               new.count--;
+               if (old.count <= 0)
+                       return -1;
+       ,
+               return new.count;
+       );
+       return -1;
+}
+EXPORT_SYMBOL(lockref_put_return);
+
 /**
  * lockref_put_or_lock - decrements count unless count <= 1 before decrement
  * @lockref: pointer to lockref structure
@@ -158,7 +178,7 @@ int lockref_get_not_dead(struct lockref *lockref)
 
        CMPXCHG_LOOP(
                new.count++;
-               if ((int)old.count < 0)
+               if (old.count < 0)
                        return 0;
        ,
                return 1;
@@ -166,7 +186,7 @@ int lockref_get_not_dead(struct lockref *lockref)
 
        spin_lock(&lockref->lock);
        retval = 0;
-       if ((int) lockref->count >= 0) {
+       if (lockref->count >= 0) {
                lockref->count++;
                retval = 1;
        }