~ubuntu-branches/ubuntu/utopic/linux-ti-omap/utopic

« back to all changes in this revision

Viewing changes to arch/cris/mm/ioremap.c

  • Committer: Bazaar Package Importer
  • Author(s): Amit Kucheria, Amit Kucheria
  • Date: 2010-03-10 02:28:15 UTC
  • Revision ID: james.westby@ubuntu.com-20100310022815-7sd3gwvn5kenaq33
Tags: 2.6.33-500.1
[ Amit Kucheria ]

* Initial release of a 2.6.33-based OMAP kernel
* UBUNTU: [Upstream] Fix omap 1-wire driver compilation
* UBUNTU: ubuntu: AppArmor -- update to mainline 2010-03-04

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/*
 
2
 * arch/cris/mm/ioremap.c
 
3
 *
 
4
 * Re-map IO memory to kernel address space so that we can access it.
 
5
 * Needed for memory-mapped I/O devices mapped outside our normal DRAM
 
6
 * window (that is, all memory-mapped I/O devices).
 
7
 *
 
8
 * (C) Copyright 1995 1996 Linus Torvalds
 
9
 * CRIS-port by Axis Communications AB
 
10
 */
 
11
 
 
12
#include <linux/vmalloc.h>
 
13
#include <linux/io.h>
 
14
#include <asm/pgalloc.h>
 
15
#include <arch/memmap.h>
 
16
 
 
17
/*
 
18
 * Generic mapping function (not visible outside):
 
19
 */
 
20
 
 
21
/*
 
22
 * Remap an arbitrary physical address space into the kernel virtual
 
23
 * address space. Needed when the kernel wants to access high addresses
 
24
 * directly.
 
25
 *
 
26
 * NOTE! We need to allow non-page-aligned mappings too: we will obviously
 
27
 * have to convert them into an offset in a page-aligned mapping, but the
 
28
 * caller shouldn't need to know that small detail.
 
29
 */
 
30
void __iomem * __ioremap_prot(unsigned long phys_addr, unsigned long size, pgprot_t prot)
 
31
{
 
32
        void __iomem * addr;
 
33
        struct vm_struct * area;
 
34
        unsigned long offset, last_addr;
 
35
 
 
36
        /* Don't allow wraparound or zero size */
 
37
        last_addr = phys_addr + size - 1;
 
38
        if (!size || last_addr < phys_addr)
 
39
                return NULL;
 
40
 
 
41
        /*
 
42
         * Mappings have to be page-aligned
 
43
         */
 
44
        offset = phys_addr & ~PAGE_MASK;
 
45
        phys_addr &= PAGE_MASK;
 
46
        size = PAGE_ALIGN(last_addr+1) - phys_addr;
 
47
 
 
48
        /*
 
49
         * Ok, go for it..
 
50
         */
 
51
        area = get_vm_area(size, VM_IOREMAP);
 
52
        if (!area)
 
53
                return NULL;
 
54
        addr = (void __iomem *)area->addr;
 
55
        if (ioremap_page_range((unsigned long)addr, (unsigned long)addr + size,
 
56
                               phys_addr, prot)) {
 
57
                vfree((void __force *)addr);
 
58
                return NULL;
 
59
        }
 
60
        return (void __iomem *) (offset + (char __iomem *)addr);
 
61
}
 
62
 
 
63
void __iomem * __ioremap(unsigned long phys_addr, unsigned long size, unsigned long flags)
 
64
{
 
65
        return __ioremap_prot(phys_addr, size,
 
66
                              __pgprot(_PAGE_PRESENT | __READABLE |
 
67
                                       __WRITEABLE | _PAGE_GLOBAL |
 
68
                                       _PAGE_KERNEL | flags));
 
69
}
 
70
 
 
71
/**
 
72
 * ioremap_nocache     -   map bus memory into CPU space
 
73
 * @offset:    bus address of the memory
 
74
 * @size:      size of the resource to map
 
75
 *
 
76
 * Must be freed with iounmap.
 
77
 */
 
78
 
 
79
void __iomem *ioremap_nocache (unsigned long phys_addr, unsigned long size)
 
80
{
 
81
        return __ioremap(phys_addr | MEM_NON_CACHEABLE, size, 0);
 
82
}
 
83
 
 
84
void iounmap(volatile void __iomem *addr)
 
85
{
 
86
        if (addr > high_memory)
 
87
                return vfree((void *) (PAGE_MASK & (unsigned long) addr));
 
88
}