EXTRA_CFLAGS   += -mno-minimal-toc
 endif
 
-obj-y                          := fault.o mem.o pgtable.o \
+obj-y                          := fault.o mem.o pgtable.o gup.o \
                                   init_$(CONFIG_WORD_SIZE).o \
                                   pgtable_$(CONFIG_WORD_SIZE).o
 obj-$(CONFIG_PPC_MMU_NOHASH)   += mmu_context_nohash.o tlb_nohash.o \
 hash-$(CONFIG_PPC_NATIVE)      := hash_native_64.o
 obj-$(CONFIG_PPC64)            += hash_utils_64.o \
                                   slb_low.o slb.o stab.o \
-                                  gup.o mmap.o $(hash-y)
+                                  mmap.o $(hash-y)
 obj-$(CONFIG_PPC_STD_MMU_32)   += ppc_mmu_32.o
 obj-$(CONFIG_PPC_STD_MMU)      += hash_low_$(CONFIG_WORD_SIZE).o \
                                   tlb_hash$(CONFIG_WORD_SIZE).o \
 
 #include <linux/rwsem.h>
 #include <asm/pgtable.h>
 
+#ifdef __HAVE_ARCH_PTE_SPECIAL
+
 /*
  * The performance critical leaf functions are made noinline otherwise gcc
  * inlines everything into a single function which results in too much
        unsigned long addr, len, end;
        unsigned long next;
        pgd_t *pgdp;
-       int psize, nr = 0;
+       int nr = 0;
+#ifdef CONFIG_PPC64
        unsigned int shift;
+       int psize;
+#endif
 
        pr_debug("%s(%lx,%x,%s)\n", __func__, start, nr_pages, write ? "write" : "read");
 
         */
        local_irq_disable();
 
+#ifdef CONFIG_PPC64
+       /* Those bits are related to hugetlbfs implementation and only exist
+        * on 64-bit for now
+        */
        psize = get_slice_psize(mm, addr);
        shift = mmu_psize_defs[psize].shift;
+#endif /* CONFIG_PPC64 */
 
 #ifdef CONFIG_HUGETLB_PAGE
        if (unlikely(mmu_huge_psizes[psize])) {
                do {
                        pgd_t pgd = *pgdp;
 
+#ifdef CONFIG_PPC64
                        VM_BUG_ON(shift != mmu_psize_defs[get_slice_psize(mm, addr)].shift);
+#endif
                        pr_debug("  %016lx: normal pgd %p\n", addr,
                                 (void *)pgd_val(pgd));
                        next = pgd_addr_end(addr, end);
                return ret;
        }
 }
+
+#endif /* __HAVE_ARCH_PTE_SPECIAL */