void vpa_init(int cpu)
 {
        int hwcpu = get_hard_smp_processor_id(cpu);
-       unsigned long vpa = (unsigned long)&(paca[cpu].lppaca);
+       unsigned long vpa = __pa(&paca[cpu].lppaca);
        long ret;
-       unsigned long flags;
-
-       /* Register the Virtual Processor Area (VPA) */
-       flags = 1UL << (63 - 18);
 
        if (cpu_has_feature(CPU_FTR_ALTIVEC))
                paca[cpu].lppaca.vmxregs_in_use = 1;
 
-       ret = register_vpa(flags, hwcpu, __pa(vpa));
+       ret = register_vpa(hwcpu, vpa);
 
        if (ret)
                printk(KERN_ERR "WARNING: vpa_init: VPA registration for "
                                "cpu %d (hw %d) of area %lx returns %ld\n",
-                               cpu, hwcpu, __pa(vpa), ret);
+                               cpu, hwcpu, vpa, ret);
 }
 
 long pSeries_lpar_hpte_insert(unsigned long hpte_group,
 
        return 0;
 }
 
-static inline long register_vpa(unsigned long flags, unsigned long proc,
+static inline long vpa_call(unsigned long flags, unsigned long cpu,
                unsigned long vpa)
 {
-       return plpar_hcall_norets(H_REGISTER_VPA, flags, proc, vpa);
+       /* flags are in bits 16-18 (counting from most significant bit) */
+       flags = flags << (63 - 18);
+
+       return plpar_hcall_norets(H_REGISTER_VPA, flags, cpu, vpa);
+}
+
+static inline long unregister_vpa(unsigned long cpu, unsigned long vpa)
+{
+       return vpa_call(0x5, cpu, vpa);
+}
+
+static inline long register_vpa(unsigned long cpu, unsigned long vpa)
+{
+       return vpa_call(0x1, cpu, vpa);
 }
 
-void vpa_init(int cpu);
+extern void vpa_init(int cpu);
 
 static inline long plpar_pte_remove(unsigned long flags, unsigned long ptex,
                unsigned long avpn, unsigned long *old_pteh_ret,
 
 
 extern struct smp_ops_t *smp_ops;
 
-#ifdef CONFIG_PPC_PSERIES
-void vpa_init(int cpu);
-#else
-static inline void vpa_init(int cpu)
-{
-}
-#endif /* CONFIG_PPC_PSERIES */
-
 #endif /* __ASSEMBLY__ */
 
 #endif /* !(_PPC64_SMP_H) */