Merge git://git.infradead.org/battery-2.6
[pandora-kernel.git] / arch / arm / mach-w90x900 / mach-w90p910evb.c
1 /*
2  * linux/arch/arm/mach-w90x900/mach-w90p910evb.c
3  *
4  * Based on mach-s3c2410/mach-smdk2410.c by Jonas Dietsche
5  *
6  * Copyright (C) 2008 Nuvoton technology corporation.
7  *
8  * Wan ZongShun <mcuos.com@gmail.com>
9  *
10  * This program is free software; you can redistribute it and/or
11  * modify it under the terms of the GNU General Public License as
12  * published by the Free Software Foundation;version 2 of the License.
13  *
14  */
15
16 #include <linux/kernel.h>
17 #include <linux/types.h>
18 #include <linux/interrupt.h>
19 #include <linux/list.h>
20 #include <linux/timer.h>
21 #include <linux/init.h>
22 #include <linux/platform_device.h>
23 #include <linux/mtd/physmap.h>
24
25 #include <asm/mach/arch.h>
26 #include <asm/mach/map.h>
27 #include <asm/mach/irq.h>
28 #include <asm/mach-types.h>
29
30 #include <mach/regs-serial.h>
31 #include <mach/map.h>
32
33 #include "cpu.h"
34 /*w90p910 evb norflash driver data */
35
36 #define W90P910_FLASH_BASE      0xA0000000
37 #define W90P910_FLASH_SIZE      0x400000
38
39 static struct mtd_partition w90p910_flash_partitions[] = {
40         {
41                 .name   =       "NOR Partition 1 for kernel (960K)",
42                 .size   =       0xF0000,
43                 .offset =       0x10000,
44         },
45         {
46                 .name   =       "NOR Partition 2 for image (1M)",
47                 .size   =       0x100000,
48                 .offset =       0x100000,
49         },
50         {
51                 .name   =       "NOR Partition 3 for user (2M)",
52                 .size   =       0x200000,
53                 .offset =       0x00200000,
54         }
55 };
56
57 static struct physmap_flash_data w90p910_flash_data = {
58         .width          =       2,
59         .parts          =       w90p910_flash_partitions,
60         .nr_parts       =       ARRAY_SIZE(w90p910_flash_partitions),
61 };
62
63 static struct resource w90p910_flash_resources[] = {
64         {
65                 .start  =       W90P910_FLASH_BASE,
66                 .end    =       W90P910_FLASH_BASE + W90P910_FLASH_SIZE - 1,
67                 .flags  =       IORESOURCE_MEM,
68         }
69 };
70
71 static struct platform_device w90p910_flash_device = {
72         .name           =       "physmap-flash",
73         .id             =       0,
74         .dev            = {
75                                 .platform_data = &w90p910_flash_data,
76                         },
77         .resource       =       w90p910_flash_resources,
78         .num_resources  =       ARRAY_SIZE(w90p910_flash_resources),
79 };
80
81 /* USB EHCI Host Controller */
82
83 static struct resource w90x900_usb_ehci_resource[] = {
84         [0] = {
85                 .start = W90X900_PA_USBEHCIHOST,
86                 .end   = W90X900_PA_USBEHCIHOST + W90X900_SZ_USBEHCIHOST - 1,
87                 .flags = IORESOURCE_MEM,
88         },
89         [1] = {
90                 .start = IRQ_USBH,
91                 .end   = IRQ_USBH,
92                 .flags = IORESOURCE_IRQ,
93         }
94 };
95
96 static u64 w90x900_device_usb_ehci_dmamask = 0xffffffffUL;
97
98 struct platform_device w90x900_device_usb_ehci = {
99         .name             = "w90x900-ehci",
100         .id               = -1,
101         .num_resources    = ARRAY_SIZE(w90x900_usb_ehci_resource),
102         .resource         = w90x900_usb_ehci_resource,
103         .dev              = {
104                 .dma_mask = &w90x900_device_usb_ehci_dmamask,
105                 .coherent_dma_mask = 0xffffffffUL
106         }
107 };
108 EXPORT_SYMBOL(w90x900_device_usb_ehci);
109
110 /* USB OHCI Host Controller */
111
112 static struct resource w90x900_usb_ohci_resource[] = {
113         [0] = {
114                 .start = W90X900_PA_USBOHCIHOST,
115                 .end   = W90X900_PA_USBOHCIHOST + W90X900_SZ_USBOHCIHOST - 1,
116                 .flags = IORESOURCE_MEM,
117         },
118         [1] = {
119                 .start = IRQ_USBH,
120                 .end   = IRQ_USBH,
121                 .flags = IORESOURCE_IRQ,
122         }
123 };
124
125 static u64 w90x900_device_usb_ohci_dmamask = 0xffffffffUL;
126 struct platform_device w90x900_device_usb_ohci = {
127         .name             = "w90x900-ohci",
128         .id               = -1,
129         .num_resources    = ARRAY_SIZE(w90x900_usb_ohci_resource),
130         .resource         = w90x900_usb_ohci_resource,
131         .dev              = {
132                 .dma_mask = &w90x900_device_usb_ohci_dmamask,
133                 .coherent_dma_mask = 0xffffffffUL
134         }
135 };
136 EXPORT_SYMBOL(w90x900_device_usb_ohci);
137
138 /*TouchScreen controller*/
139
140 static struct resource w90x900_ts_resource[] = {
141         [0] = {
142                 .start = W90X900_PA_ADC,
143                 .end   = W90X900_PA_ADC + W90X900_SZ_ADC-1,
144                 .flags = IORESOURCE_MEM,
145         },
146         [1] = {
147                 .start = IRQ_ADC,
148                 .end   = IRQ_ADC,
149                 .flags = IORESOURCE_IRQ,
150         },
151 };
152
153 struct platform_device w90x900_device_ts = {
154         .name           = "w90x900-ts",
155         .id             = -1,
156         .resource       = w90x900_ts_resource,
157         .num_resources  = ARRAY_SIZE(w90x900_ts_resource),
158 };
159 EXPORT_SYMBOL(w90x900_device_ts);
160
161 /* RTC controller*/
162
163 static struct resource w90x900_rtc_resource[] = {
164         [0] = {
165                 .start = W90X900_PA_RTC,
166                 .end   = W90X900_PA_RTC + 0xff,
167                 .flags = IORESOURCE_MEM,
168         },
169         [1] = {
170                 .start = IRQ_RTC,
171                 .end   = IRQ_RTC,
172                 .flags = IORESOURCE_IRQ,
173         },
174 };
175
176 struct platform_device w90x900_device_rtc = {
177         .name           = "w90x900-rtc",
178         .id             = -1,
179         .num_resources  = ARRAY_SIZE(w90x900_rtc_resource),
180         .resource       = w90x900_rtc_resource,
181 };
182 EXPORT_SYMBOL(w90x900_device_rtc);
183
184 /* KPI controller*/
185
186 static struct resource w90x900_kpi_resource[] = {
187         [0] = {
188                 .start = W90X900_PA_KPI,
189                 .end   = W90X900_PA_KPI + W90X900_SZ_KPI - 1,
190                 .flags = IORESOURCE_MEM,
191         },
192         [1] = {
193                 .start = IRQ_KPI,
194                 .end   = IRQ_KPI,
195                 .flags = IORESOURCE_IRQ,
196         }
197
198 };
199
200 struct platform_device w90x900_device_kpi = {
201         .name           = "w90x900-kpi",
202         .id             = -1,
203         .num_resources  = ARRAY_SIZE(w90x900_kpi_resource),
204         .resource       = w90x900_kpi_resource,
205 };
206 EXPORT_SYMBOL(w90x900_device_kpi);
207
208 /* USB Device (Gadget)*/
209
210 static struct resource w90x900_usbgadget_resource[] = {
211         [0] = {
212                 .start = W90X900_PA_USBDEV,
213                 .end   = W90X900_PA_USBDEV + W90X900_SZ_USBDEV - 1,
214                 .flags = IORESOURCE_MEM,
215         },
216         [1] = {
217                 .start = IRQ_USBD,
218                 .end   = IRQ_USBD,
219                 .flags = IORESOURCE_IRQ,
220         }
221 };
222
223 struct platform_device w90x900_device_usbgadget = {
224         .name           = "w90x900-usbgadget",
225         .id             = -1,
226         .num_resources  = ARRAY_SIZE(w90x900_usbgadget_resource),
227         .resource       = w90x900_usbgadget_resource,
228 };
229 EXPORT_SYMBOL(w90x900_device_usbgadget);
230
231 static struct map_desc w90p910_iodesc[] __initdata = {
232 };
233
234 /*Here should be your evb resourse,such as LCD*/
235
236 static struct platform_device *w90p910evb_dev[] __initdata = {
237         &w90p910_serial_device,
238         &w90p910_flash_device,
239         &w90x900_device_usb_ehci,
240         &w90x900_device_usb_ohci,
241         &w90x900_device_ts,
242         &w90x900_device_rtc,
243         &w90x900_device_kpi,
244         &w90x900_device_usbgadget,
245 };
246
247 static void __init w90p910evb_map_io(void)
248 {
249         w90p910_map_io(w90p910_iodesc, ARRAY_SIZE(w90p910_iodesc));
250         w90p910_init_clocks();
251 }
252
253 static void __init w90p910evb_init(void)
254 {
255         platform_add_devices(w90p910evb_dev, ARRAY_SIZE(w90p910evb_dev));
256 }
257
258 MACHINE_START(W90P910EVB, "W90P910EVB")
259         /* Maintainer: Wan ZongShun */
260         .phys_io        = W90X900_PA_UART,
261         .io_pg_offst    = (((u32)W90X900_VA_UART) >> 18) & 0xfffc,
262         .boot_params    = 0,
263         .map_io         = w90p910evb_map_io,
264         .init_irq       = w90x900_init_irq,
265         .init_machine   = w90p910evb_init,
266         .timer          = &w90x900_timer,
267 MACHINE_END