]> git.karo-electronics.de Git - mv-sheeva.git/blob - arch/arm/mach-nomadik/cpu-8815.c
[ARM] 5584/1: nomadik: add gpio driver and devices
[mv-sheeva.git] / arch / arm / mach-nomadik / cpu-8815.c
1 /*
2  * Copyright STMicroelectronics, 2007.
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 as published by
6  *  the Free Software Foundation; either version 2 of the License, or
7  *  (at your option) any later version.
8  *
9  *  This program is distributed in the hope that it will be useful,
10  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
11  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12  *  GNU General Public License for more details.
13  *
14  *  You should have received a copy of the GNU General Public License
15  *  along with this program; if not, write to the Free Software
16  *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
17  */
18
19 #include <linux/types.h>
20 #include <linux/init.h>
21 #include <linux/device.h>
22 #include <linux/amba/bus.h>
23 #include <linux/gpio.h>
24
25 #include <mach/hardware.h>
26 #include <mach/irqs.h>
27 #include <asm/mach/map.h>
28 #include <asm/hardware/vic.h>
29
30 /* The 8815 has 4 GPIO blocks, let's register them immediately */
31 static struct nmk_gpio_platform_data cpu8815_gpio[] = {
32         {
33                 .name = "GPIO-0-31",
34                 .first_gpio = 0,
35                 .first_irq = NOMADIK_GPIO_TO_IRQ(0),
36                 .parent_irq = IRQ_GPIO0,
37         }, {
38                 .name = "GPIO-32-63",
39                 .first_gpio = 32,
40                 .first_irq = NOMADIK_GPIO_TO_IRQ(32),
41                 .parent_irq = IRQ_GPIO1,
42         }, {
43                 .name = "GPIO-64-95",
44                 .first_gpio = 64,
45                 .first_irq = NOMADIK_GPIO_TO_IRQ(64),
46                 .parent_irq = IRQ_GPIO2,
47         }, {
48                 .name = "GPIO-96-127", /* 124..127 not routed to pin */
49                 .first_gpio = 96,
50                 .first_irq = NOMADIK_GPIO_TO_IRQ(96),
51                 .parent_irq = IRQ_GPIO3,
52         }
53 };
54
55 #define __MEM_4K_RESOURCE(x) \
56         .res = {.start = (x), .end = (x) + SZ_4K - 1, .flags = IORESOURCE_MEM}
57
58 static struct amba_device cpu8815_amba_gpio[] = {
59         {
60                 .dev = {
61                         .init_name = "gpio0",
62                         .platform_data = cpu8815_gpio + 0,
63                 },
64                 __MEM_4K_RESOURCE(NOMADIK_GPIO0_BASE),
65         }, {
66                 .dev = {
67                         .init_name = "gpio1",
68                         .platform_data = cpu8815_gpio + 1,
69                 },
70                 __MEM_4K_RESOURCE(NOMADIK_GPIO1_BASE),
71         }, {
72                 .dev = {
73                         .init_name = "gpio2",
74                         .platform_data = cpu8815_gpio + 2,
75                 },
76                 __MEM_4K_RESOURCE(NOMADIK_GPIO2_BASE),
77         }, {
78                 .dev = {
79                         .init_name = "gpio3",
80                         .platform_data = cpu8815_gpio + 3,
81                 },
82                 __MEM_4K_RESOURCE(NOMADIK_GPIO3_BASE),
83         },
84 };
85
86 static struct amba_device *amba_devs[] __initdata = {
87         cpu8815_amba_gpio + 0,
88         cpu8815_amba_gpio + 1,
89         cpu8815_amba_gpio + 2,
90         cpu8815_amba_gpio + 3,
91 };
92
93 static int __init cpu8815_init(void)
94 {
95         int i;
96
97         for (i = 0; i < ARRAY_SIZE(amba_devs); i++)
98                 amba_device_register(amba_devs[i], &iomem_resource);
99         return 0;
100 }
101 arch_initcall(cpu8815_init);
102
103 /* All SoC devices live in the same area (see hardware.h) */
104 static struct map_desc nomadik_io_desc[] __initdata = {
105         {
106                 .virtual =      NOMADIK_IO_VIRTUAL,
107                 .pfn =          __phys_to_pfn(NOMADIK_IO_PHYSICAL),
108                 .length =       NOMADIK_IO_SIZE,
109                 .type =         MT_DEVICE,
110         }
111         /* static ram and secured ram may be added later */
112 };
113
114 void __init cpu8815_map_io(void)
115 {
116         iotable_init(nomadik_io_desc, ARRAY_SIZE(nomadik_io_desc));
117 }
118
119 void __init cpu8815_init_irq(void)
120 {
121         /* This modified VIC cell has two register blocks, at 0 and 0x20 */
122         vic_init(io_p2v(NOMADIK_IC_BASE + 0x00), IRQ_VIC_START +  0, ~0, 0);
123         vic_init(io_p2v(NOMADIK_IC_BASE + 0x20), IRQ_VIC_START + 32, ~0, 0);
124 }
125
126 /*
127  * This function is called from the board init ("init_machine").
128  * Currently nothing is done as we can't register amba devs so early.
129  */
130  void __init cpu8815_platform_init(void)
131 {
132          return;
133 }