]> git.kernelconcepts.de Git - karo-tx-linux.git/blob - arch/arm/mach-picoxcell/io.c
picoxcell: support for Picochip picoxcell devices
[karo-tx-linux.git] / arch / arm / mach-picoxcell / io.c
1 /*
2  * Copyright (c) 2011 Picochip Ltd., Jamie Iles
3  *
4  * This program is free software; you can redistribute it and/or modify
5  * it under the terms of the GNU General Public License version 2 as
6  * published by the Free Software Foundation.
7  *
8  * All enquiries to support@picochip.com
9  */
10 #include <linux/io.h>
11 #include <linux/mm.h>
12 #include <linux/module.h>
13 #include <linux/of.h>
14
15 #include <asm/mach/map.h>
16
17 #include <mach/map.h>
18 #include <mach/picoxcell_soc.h>
19
20 #include "common.h"
21
22 void __init picoxcell_map_io(void)
23 {
24         struct map_desc io_map = {
25                 .virtual        = PHYS_TO_IO(PICOXCELL_PERIPH_BASE),
26                 .pfn            = __phys_to_pfn(PICOXCELL_PERIPH_BASE),
27                 .length         = PICOXCELL_PERIPH_LENGTH,
28                 .type           = MT_DEVICE,
29         };
30
31         iotable_init(&io_map, 1);
32 }
33
34 void __iomem *picoxcell_ioremap(unsigned long p, size_t size,
35                                 unsigned int type)
36 {
37         if (unlikely(size == 0))
38                 return NULL;
39
40         if (p >= PICOXCELL_PERIPH_BASE &&
41             p < PICOXCELL_PERIPH_BASE + PICOXCELL_PERIPH_LENGTH)
42                 return IO_ADDRESS(p);
43
44         return __arm_ioremap_caller(p, size, type,
45                                     __builtin_return_address(0));
46 }
47 EXPORT_SYMBOL_GPL(picoxcell_ioremap);
48
49 void picoxcell_iounmap(volatile void __iomem *addr)
50 {
51         unsigned long virt = (unsigned long)addr;
52
53         if (virt >= VMALLOC_START && virt < VMALLOC_END)
54                 __iounmap(addr);
55 }
56 EXPORT_SYMBOL_GPL(picoxcell_iounmap);