return result;
  }
  
 -static inline void atomic64_set(atomic64_t *v, u64 i)
 +static inline void atomic64_set(atomic64_t *v, long long i)
  {
 -      u64 tmp;
 +      long long tmp;
  
+       prefetchw(&v->counter);
        __asm__ __volatile__("@ atomic64_set\n"
  "1:   ldrexd  %0, %H0, [%2]\n"
  "     strexd  %0, %3, %H3, [%2]\n"
  }
  #endif
  
 -static inline void atomic64_add(u64 i, atomic64_t *v)
 +static inline void atomic64_add(long long i, atomic64_t *v)
  {
 -      u64 result;
 +      long long result;
        unsigned long tmp;
  
+       prefetchw(&v->counter);
        __asm__ __volatile__("@ atomic64_add\n"
  "1:   ldrexd  %0, %H0, [%3]\n"
- "     adds    %0, %0, %4\n"
- "     adc     %H0, %H0, %H4\n"
+ "     adds    %Q0, %Q0, %Q4\n"
+ "     adc     %R0, %R0, %R4\n"
  "     strexd  %1, %0, %H0, [%3]\n"
  "     teq     %1, #0\n"
  "     bne     1b"
        return result;
  }
  
 -static inline void atomic64_sub(u64 i, atomic64_t *v)
 +static inline void atomic64_sub(long long i, atomic64_t *v)
  {
 -      u64 result;
 +      long long result;
        unsigned long tmp;
  
+       prefetchw(&v->counter);
        __asm__ __volatile__("@ atomic64_sub\n"
  "1:   ldrexd  %0, %H0, [%3]\n"
- "     subs    %0, %0, %4\n"
- "     sbc     %H0, %H0, %H4\n"
+ "     subs    %Q0, %Q0, %Q4\n"
+ "     sbc     %R0, %R0, %R4\n"
  "     strexd  %1, %0, %H0, [%3]\n"
  "     teq     %1, #0\n"
  "     bne     1b"
 
        IPI_CALL_FUNC,
        IPI_CALL_FUNC_SINGLE,
        IPI_CPU_STOP,
 +      IPI_IRQ_WORK,
+       IPI_COMPLETION,
  };
  
  static DECLARE_COMPLETION(cpu_running);
        S(IPI_CALL_FUNC, "Function call interrupts"),
        S(IPI_CALL_FUNC_SINGLE, "Single function call interrupts"),
        S(IPI_CPU_STOP, "CPU stop interrupts"),
 +      S(IPI_IRQ_WORK, "IRQ work interrupts"),
+       S(IPI_COMPLETION, "completion interrupts"),
  };
  
  void show_ipi_list(struct seq_file *p, int prec)
                irq_exit();
                break;
  
 +#ifdef CONFIG_IRQ_WORK
 +      case IPI_IRQ_WORK:
 +              irq_enter();
 +              irq_work_run();
 +              irq_exit();
 +              break;
 +#endif
 +
+       case IPI_COMPLETION:
+               irq_enter();
+               ipi_complete(cpu);
+               irq_exit();
+               break;
+ 
        default:
                printk(KERN_CRIT "CPU%u: Unknown IPI message 0x%x\n",
                       cpu, ipinr);