pmd_t *pmd;
        unsigned long next;
 
-       phys_addr -= addr;
        pmd = pmd_alloc(&init_mm, pud, addr);
        if (!pmd)
                return -ENOMEM;
        do {
                next = pmd_addr_end(addr, end);
 
-               if (ioremap_try_huge_pmd(pmd, addr, next, phys_addr + addr, prot))
+               if (ioremap_try_huge_pmd(pmd, addr, next, phys_addr, prot))
                        continue;
 
-               if (ioremap_pte_range(pmd, addr, next, phys_addr + addr, prot))
+               if (ioremap_pte_range(pmd, addr, next, phys_addr, prot))
                        return -ENOMEM;
-       } while (pmd++, addr = next, addr != end);
+       } while (pmd++, phys_addr += (next - addr), addr = next, addr != end);
        return 0;
 }
 
        pud_t *pud;
        unsigned long next;
 
-       phys_addr -= addr;
        pud = pud_alloc(&init_mm, p4d, addr);
        if (!pud)
                return -ENOMEM;
        do {
                next = pud_addr_end(addr, end);
 
-               if (ioremap_try_huge_pud(pud, addr, next, phys_addr + addr, prot))
+               if (ioremap_try_huge_pud(pud, addr, next, phys_addr, prot))
                        continue;
 
-               if (ioremap_pmd_range(pud, addr, next, phys_addr + addr, prot))
+               if (ioremap_pmd_range(pud, addr, next, phys_addr, prot))
                        return -ENOMEM;
-       } while (pud++, addr = next, addr != end);
+       } while (pud++, phys_addr += (next - addr), addr = next, addr != end);
        return 0;
 }
 
        p4d_t *p4d;
        unsigned long next;
 
-       phys_addr -= addr;
        p4d = p4d_alloc(&init_mm, pgd, addr);
        if (!p4d)
                return -ENOMEM;
 
                if (ioremap_p4d_enabled() &&
                    ((next - addr) == P4D_SIZE) &&
-                   IS_ALIGNED(phys_addr + addr, P4D_SIZE)) {
-                       if (p4d_set_huge(p4d, phys_addr + addr, prot))
+                   IS_ALIGNED(phys_addr, P4D_SIZE)) {
+                       if (p4d_set_huge(p4d, phys_addr, prot))
                                continue;
                }
 
-               if (ioremap_pud_range(p4d, addr, next, phys_addr + addr, prot))
+               if (ioremap_pud_range(p4d, addr, next, phys_addr, prot))
                        return -ENOMEM;
-       } while (p4d++, addr = next, addr != end);
+       } while (p4d++, phys_addr += (next - addr), addr = next, addr != end);
        return 0;
 }
 
        BUG_ON(addr >= end);
 
        start = addr;
-       phys_addr -= addr;
        pgd = pgd_offset_k(addr);
        do {
                next = pgd_addr_end(addr, end);
-               err = ioremap_p4d_range(pgd, addr, next, phys_addr+addr, prot);
+               err = ioremap_p4d_range(pgd, addr, next, phys_addr, prot);
                if (err)
                        break;
-       } while (pgd++, addr = next, addr != end);
+       } while (pgd++, phys_addr += (next - addr), addr = next, addr != end);
 
        flush_cache_vmap(start, end);