*/
        if (pfn >= 0x100000 && (__pfn_to_phys(pfn) & ~SUPERSECTION_MASK))
                return NULL;
+ #endif
  
 -      /*
 -       * Don't allow RAM to be mapped - this causes problems with ARMv6+
 -       */
 -      if (WARN_ON(pfn_valid(pfn)))
 -              return NULL;
 -
        type = get_mem_type(mtype);
        if (!type)
                return NULL;
  void __iounmap(volatile void __iomem *io_addr)
  {
        void *addr = (void *)(PAGE_MASK & (unsigned long)io_addr);
 -#if !defined(CONFIG_SMP) && !defined(CONFIG_ARM_LPAE)
 -      struct vm_struct **p, *tmp;
 +      struct vm_struct *vm;
  
 -      /*
 -       * If this is a section based mapping we need to handle it
 -       * specially as the VM subsystem does not know how to handle
 -       * such a beast. We need the lock here b/c we need to clear
 -       * all the mappings before the area can be reclaimed
 -       * by someone else.
 -       */
 -      write_lock(&vmlist_lock);
 -      for (p = &vmlist ; (tmp = *p) ; p = &tmp->next) {
 -              if ((tmp->flags & VM_IOREMAP) && (tmp->addr == addr)) {
 -                      if (tmp->flags & VM_ARM_SECTION_MAPPING) {
 -                              unmap_area_sections((unsigned long)tmp->addr,
 -                                                  tmp->size);
 -                      }
 +      read_lock(&vmlist_lock);
 +      for (vm = vmlist; vm; vm = vm->next) {
 +              if (vm->addr > addr)
 +                      break;
 +              if (!(vm->flags & VM_IOREMAP))
 +                      continue;
 +              /* If this is a static mapping we must leave it alone */
 +              if ((vm->flags & VM_ARM_STATIC_MAPPING) &&
 +                  (vm->addr <= addr) && (vm->addr + vm->size > addr)) {
 +                      read_unlock(&vmlist_lock);
 +                      return;
 +              }
- #ifndef CONFIG_SMP
++#if !defined(CONFIG_SMP) && !defined(CONFIG_ARM_LPAE)
 +              /*
 +               * If this is a section based mapping we need to handle it
 +               * specially as the VM subsystem does not know how to handle
 +               * such a beast.
 +               */
 +              if ((vm->addr == addr) &&
 +                  (vm->flags & VM_ARM_SECTION_MAPPING)) {
 +                      unmap_area_sections((unsigned long)vm->addr, vm->size);
                        break;
                }
 -      }
 -      write_unlock(&vmlist_lock);
  #endif
 +      }
 +      read_unlock(&vmlist_lock);
  
        vunmap(addr);
  }