Linux Kernel  3.7.1
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
board-g3evm.c
Go to the documentation of this file.
1 /*
2  * G3EVM board support
3  *
4  * Copyright (C) 2010 Magnus Damm
5  * Copyright (C) 2008 Yoshihiro Shimoda
6  *
7  * This program is free software; you can redistribute it and/or modify
8  * it under the terms of the GNU General Public License as published by
9  * the Free Software Foundation; version 2 of the License.
10  *
11  * This program is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with this program; if not, write to the Free Software
18  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
19  */
20 #include <linux/kernel.h>
21 #include <linux/init.h>
22 #include <linux/interrupt.h>
23 #include <linux/irq.h>
24 #include <linux/platform_device.h>
25 #include <linux/delay.h>
26 #include <linux/mtd/mtd.h>
27 #include <linux/mtd/partitions.h>
28 #include <linux/mtd/physmap.h>
29 #include <linux/mtd/sh_flctl.h>
30 #include <linux/usb/r8a66597.h>
31 #include <linux/io.h>
32 #include <linux/gpio.h>
33 #include <linux/input.h>
34 #include <linux/input/sh_keysc.h>
35 #include <linux/dma-mapping.h>
36 #include <mach/irqs.h>
37 #include <mach/sh7367.h>
38 #include <mach/common.h>
39 #include <asm/mach-types.h>
40 #include <asm/mach/arch.h>
41 
42 /*
43  * IrDA
44  *
45  * S67: 5bit : ON power
46  * : 6bit : ON remote control
47  * OFF IrDA
48  */
49 
50 static struct mtd_partition nor_flash_partitions[] = {
51  {
52  .name = "loader",
53  .offset = 0x00000000,
54  .size = 512 * 1024,
55  },
56  {
57  .name = "bootenv",
58  .offset = MTDPART_OFS_APPEND,
59  .size = 512 * 1024,
60  },
61  {
62  .name = "kernel_ro",
63  .offset = MTDPART_OFS_APPEND,
64  .size = 8 * 1024 * 1024,
65  .mask_flags = MTD_WRITEABLE,
66  },
67  {
68  .name = "kernel",
69  .offset = MTDPART_OFS_APPEND,
70  .size = 8 * 1024 * 1024,
71  },
72  {
73  .name = "data",
74  .offset = MTDPART_OFS_APPEND,
75  .size = MTDPART_SIZ_FULL,
76  },
77 };
78 
79 static struct physmap_flash_data nor_flash_data = {
80  .width = 2,
81  .parts = nor_flash_partitions,
82  .nr_parts = ARRAY_SIZE(nor_flash_partitions),
83 };
84 
85 static struct resource nor_flash_resources[] = {
86  [0] = {
87  .start = 0x00000000,
88  .end = 0x08000000 - 1,
89  .flags = IORESOURCE_MEM,
90  }
91 };
92 
93 static struct platform_device nor_flash_device = {
94  .name = "physmap-flash",
95  .dev = {
96  .platform_data = &nor_flash_data,
97  },
98  .num_resources = ARRAY_SIZE(nor_flash_resources),
99  .resource = nor_flash_resources,
100 };
101 
102 /* USBHS */
103 static void usb_host_port_power(int port, int power)
104 {
105  if (!power) /* only power-on supported for now */
106  return;
107 
108  /* set VBOUT/PWEN and EXTLP0 in DVSTCTR */
109  __raw_writew(__raw_readw(IOMEM(0xe6890008)) | 0x600, IOMEM(0xe6890008));
110 }
111 
112 static struct r8a66597_platdata usb_host_data = {
113  .on_chip = 1,
114  .port_power = usb_host_port_power,
115 };
116 
117 static struct resource usb_host_resources[] = {
118  [0] = {
119  .name = "USBHS",
120  .start = 0xe6890000,
121  .end = 0xe68900e5,
122  .flags = IORESOURCE_MEM,
123  },
124  [1] = {
125  .start = evt2irq(0xa20), /* USBHS_USHI0 */
126  .flags = IORESOURCE_IRQ,
127  },
128 };
129 
130 static struct platform_device usb_host_device = {
131  .name = "r8a66597_hcd",
132  .id = 0,
133  .dev = {
134  .platform_data = &usb_host_data,
135  .dma_mask = NULL,
136  .coherent_dma_mask = 0xffffffff,
137  },
138  .num_resources = ARRAY_SIZE(usb_host_resources),
139  .resource = usb_host_resources,
140 };
141 
142 /* KEYSC */
143 static struct sh_keysc_info keysc_info = {
144  .mode = SH_KEYSC_MODE_5,
145  .scan_timing = 3,
146  .delay = 100,
147  .keycodes = {
154  },
155 };
156 
157 static struct resource keysc_resources[] = {
158  [0] = {
159  .name = "KEYSC",
160  .start = 0xe61b0000,
161  .end = 0xe61b000f,
162  .flags = IORESOURCE_MEM,
163  },
164  [1] = {
165  .start = evt2irq(0xbe0), /* KEYSC_KEY */
166  .flags = IORESOURCE_IRQ,
167  },
168 };
169 
170 static struct platform_device keysc_device = {
171  .name = "sh_keysc",
172  .num_resources = ARRAY_SIZE(keysc_resources),
173  .resource = keysc_resources,
174  .dev = {
175  .platform_data = &keysc_info,
176  },
177 };
178 
179 static struct mtd_partition nand_partition_info[] = {
180  {
181  .name = "system",
182  .offset = 0,
183  .size = 64 * 1024 * 1024,
184  },
185  {
186  .name = "userdata",
187  .offset = MTDPART_OFS_APPEND,
188  .size = 128 * 1024 * 1024,
189  },
190  {
191  .name = "cache",
192  .offset = MTDPART_OFS_APPEND,
193  .size = 64 * 1024 * 1024,
194  },
195 };
196 
197 static struct resource nand_flash_resources[] = {
198  [0] = {
199  .start = 0xe6a30000,
200  .end = 0xe6a3009b,
201  .flags = IORESOURCE_MEM,
202  }
203 };
204 
205 static struct sh_flctl_platform_data nand_flash_data = {
206  .parts = nand_partition_info,
207  .nr_parts = ARRAY_SIZE(nand_partition_info),
208  .flcmncr_val = QTSEL_E | FCKSEL_E | TYPESEL_SET | NANWF_E
209  | SHBUSSEL | SEL_16BIT,
210 };
211 
212 static struct platform_device nand_flash_device = {
213  .name = "sh_flctl",
214  .resource = nand_flash_resources,
215  .num_resources = ARRAY_SIZE(nand_flash_resources),
216  .dev = {
217  .platform_data = &nand_flash_data,
218  },
219 };
220 
221 static struct resource irda_resources[] = {
222  [0] = {
223  .start = 0xE6D00000,
224  .end = 0xE6D01FD4 - 1,
225  .flags = IORESOURCE_MEM,
226  },
227  [1] = {
228  .start = evt2irq(0x480), /* IRDA */
229  .flags = IORESOURCE_IRQ,
230  },
231 };
232 
233 static struct platform_device irda_device = {
234  .name = "sh_irda",
235  .id = -1,
236  .resource = irda_resources,
237  .num_resources = ARRAY_SIZE(irda_resources),
238 };
239 
240 static struct platform_device *g3evm_devices[] __initdata = {
241  &nor_flash_device,
242  &usb_host_device,
243  &keysc_device,
244  &nand_flash_device,
245  &irda_device,
246 };
247 
248 static void __init g3evm_init(void)
249 {
251 
252  /* Lit DS4 LED */
255  gpio_export(GPIO_PORT22, 0);
256 
257  /* Lit DS8 LED */
260  gpio_export(GPIO_PORT23, 0);
261 
262  /* Lit DS3 LED */
265  gpio_export(GPIO_PORT24, 0);
266 
267  /* SCIFA1 */
272 
273  /* USBHS */
280 
281  /* setup USB phy */
282  __raw_writew(0x0300, IOMEM(0xe605810a)); /* USBCR1 */
283  __raw_writew(0x00e0, IOMEM(0xe60581c0)); /* CPFCH */
284  __raw_writew(0x6010, IOMEM(0xe60581c6)); /* CGPOSR */
285  __raw_writew(0x8a0a, IOMEM(0xe605810c)); /* USBCR2 */
286 
287  /* KEYSC @ CN7 */
301 
302  /* FLCTL */
322  /* FOE, FCDE, FSC on dedicated pins */
323  __raw_writel(__raw_readl(IOMEM(0xe6158048)) & ~(1 << 15), IOMEM(0xe6158048));
324 
325  /* IrDA */
329 
331 
332  platform_add_devices(g3evm_devices, ARRAY_SIZE(g3evm_devices));
333 }
334 
335 MACHINE_START(G3EVM, "g3evm")
336  .map_io = sh7367_map_io,
338  .init_irq = sh7367_init_irq,
340  .init_machine = g3evm_init,
341  .init_late = shmobile_init_late,
342  .timer = &shmobile_timer,