Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6
[pandora-kernel.git] / arch / powerpc / lib / locks.c
index 35bd03c..80b482c 100644 (file)
@@ -12,7 +12,6 @@
  * 2 of the License, or (at your option) any later version.
  */
 
-#include <linux/config.h>
 #include <linux/kernel.h>
 #include <linux/spinlock.h>
 #include <linux/module.h>
 #include <asm/hvcall.h>
 #include <asm/iseries/hv_call.h>
 #include <asm/smp.h>
+#include <asm/firmware.h>
 
 void __spin_yield(raw_spinlock_t *lock)
 {
        unsigned int lock_value, holder_cpu, yield_count;
-       struct paca_struct *holder_paca;
 
        lock_value = lock->slock;
        if (lock_value == 0)
                return;
        holder_cpu = lock_value & 0xffff;
        BUG_ON(holder_cpu >= NR_CPUS);
-       holder_paca = &paca[holder_cpu];
-       yield_count = holder_paca->lppaca.yield_count;
+       yield_count = lppaca[holder_cpu].yield_count;
        if ((yield_count & 1) == 0)
                return;         /* virtual cpu is currently running */
        rmb();
        if (lock->slock != lock_value)
                return;         /* something has changed */
-#ifdef CONFIG_PPC_ISERIES
-       HvCall2(HvCallBaseYieldProcessor, HvCall_YieldToProc,
-               ((u64)holder_cpu << 32) | yield_count);
-#else
-       plpar_hcall_norets(H_CONFER, get_hard_smp_processor_id(holder_cpu),
-                          yield_count);
-#endif
+       if (firmware_has_feature(FW_FEATURE_ISERIES))
+               HvCall2(HvCallBaseYieldProcessor, HvCall_YieldToProc,
+                       ((u64)holder_cpu << 32) | yield_count);
+       else
+               plpar_hcall_norets(H_CONFER,
+                       get_hard_smp_processor_id(holder_cpu), yield_count);
 }
 
 /*
@@ -60,27 +57,24 @@ void __rw_yield(raw_rwlock_t *rw)
 {
        int lock_value;
        unsigned int holder_cpu, yield_count;
-       struct paca_struct *holder_paca;
 
        lock_value = rw->lock;
        if (lock_value >= 0)
                return;         /* no write lock at present */
        holder_cpu = lock_value & 0xffff;
        BUG_ON(holder_cpu >= NR_CPUS);
-       holder_paca = &paca[holder_cpu];
-       yield_count = holder_paca->lppaca.yield_count;
+       yield_count = lppaca[holder_cpu].yield_count;
        if ((yield_count & 1) == 0)
                return;         /* virtual cpu is currently running */
        rmb();
        if (rw->lock != lock_value)
                return;         /* something has changed */
-#ifdef CONFIG_PPC_ISERIES
-       HvCall2(HvCallBaseYieldProcessor, HvCall_YieldToProc,
-               ((u64)holder_cpu << 32) | yield_count);
-#else
-       plpar_hcall_norets(H_CONFER, get_hard_smp_processor_id(holder_cpu),
-                          yield_count);
-#endif
+       if (firmware_has_feature(FW_FEATURE_ISERIES))
+               HvCall2(HvCallBaseYieldProcessor, HvCall_YieldToProc,
+                       ((u64)holder_cpu << 32) | yield_count);
+       else
+               plpar_hcall_norets(H_CONFER,
+                       get_hard_smp_processor_id(holder_cpu), yield_count);
 }
 #endif