linux/arch/hexagon/mm/ioremap.c
<<
>>
Prefs
   1/*
   2 * I/O remap functions for Hexagon
   3 *
   4 * Copyright (c) 2010-2011, The Linux Foundation. All rights reserved.
   5 *
   6 * This program is free software; you can redistribute it and/or modify
   7 * it under the terms of the GNU General Public License version 2 and
   8 * only version 2 as published by the Free Software Foundation.
   9 *
  10 * This program is distributed in the hope that it will be useful,
  11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
  12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  13 * GNU General Public License for more details.
  14 *
  15 * You should have received a copy of the GNU General Public License
  16 * along with this program; if not, write to the Free Software
  17 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
  18 * 02110-1301, USA.
  19 */
  20
  21#include <linux/io.h>
  22#include <linux/vmalloc.h>
  23
  24void __iomem *ioremap_nocache(unsigned long phys_addr, unsigned long size)
  25{
  26        unsigned long last_addr, addr;
  27        unsigned long offset = phys_addr & ~PAGE_MASK;
  28        struct vm_struct *area;
  29
  30        pgprot_t prot = __pgprot(_PAGE_PRESENT|_PAGE_READ|_PAGE_WRITE
  31                                        |(__HEXAGON_C_DEV << 6));
  32
  33        last_addr = phys_addr + size - 1;
  34
  35        /*  Wrapping not allowed  */
  36        if (!size || (last_addr < phys_addr))
  37                return NULL;
  38
  39        /*  Rounds up to next page size, including whole-page offset */
  40        size = PAGE_ALIGN(offset + size);
  41
  42        area = get_vm_area(size, VM_IOREMAP);
  43        addr = (unsigned long)area->addr;
  44
  45        if (ioremap_page_range(addr, addr+size, phys_addr, prot)) {
  46                vunmap((void *)addr);
  47                return NULL;
  48        }
  49
  50        return (void __iomem *) (offset + addr);
  51}
  52
  53void __iounmap(const volatile void __iomem *addr)
  54{
  55        vunmap((void *) ((unsigned long) addr & PAGE_MASK));
  56}
  57