Linux Kernel  3.7.1
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
board-g4evm.c
Go to the documentation of this file.
1 /*
2  * G4EVM 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/regulator/fixed.h>
31 #include <linux/usb/r8a66597.h>
32 #include <linux/io.h>
33 #include <linux/input.h>
34 #include <linux/input/sh_keysc.h>
35 #include <linux/mmc/host.h>
37 #include <linux/gpio.h>
38 #include <linux/dma-mapping.h>
39 #include <mach/irqs.h>
40 #include <mach/sh7377.h>
41 #include <mach/common.h>
42 #include <asm/mach-types.h>
43 #include <asm/mach/arch.h>
44 
45 #include "sh-gpio.h"
46 
47 /*
48  * SDHI
49  *
50  * SDHI0 : card detection is possible
51  * SDHI1 : card detection is impossible
52  *
53  * [G4-MAIN-BOARD]
54  * JP74 : short # DBG_2V8A for SDHI0
55  * JP75 : NC # DBG_3V3A for SDHI0
56  * JP76 : NC # DBG_3V3A_SD for SDHI0
57  * JP77 : NC # 3V3A_SDIO for SDHI1
58  * JP78 : short # DBG_2V8A for SDHI1
59  * JP79 : NC # DBG_3V3A for SDHI1
60  * JP80 : NC # DBG_3V3A_SD for SDHI1
61  *
62  * [G4-CORE-BOARD]
63  * S32 : all off # to dissever from G3-CORE_DBG board
64  * S33 : all off # to dissever from G3-CORE_DBG board
65  *
66  * [G3-CORE_DBG-BOARD]
67  * S1 : all off # to dissever from G3-CORE_DBG board
68  * S3 : all off # to dissever from G3-CORE_DBG board
69  * S4 : all off # to dissever from G3-CORE_DBG board
70  */
71 
72 static struct mtd_partition nor_flash_partitions[] = {
73  {
74  .name = "loader",
75  .offset = 0x00000000,
76  .size = 512 * 1024,
77  },
78  {
79  .name = "bootenv",
80  .offset = MTDPART_OFS_APPEND,
81  .size = 512 * 1024,
82  },
83  {
84  .name = "kernel_ro",
85  .offset = MTDPART_OFS_APPEND,
86  .size = 8 * 1024 * 1024,
87  .mask_flags = MTD_WRITEABLE,
88  },
89  {
90  .name = "kernel",
91  .offset = MTDPART_OFS_APPEND,
92  .size = 8 * 1024 * 1024,
93  },
94  {
95  .name = "data",
96  .offset = MTDPART_OFS_APPEND,
97  .size = MTDPART_SIZ_FULL,
98  },
99 };
100 
101 static struct physmap_flash_data nor_flash_data = {
102  .width = 2,
103  .parts = nor_flash_partitions,
104  .nr_parts = ARRAY_SIZE(nor_flash_partitions),
105 };
106 
107 static struct resource nor_flash_resources[] = {
108  [0] = {
109  .start = 0x00000000,
110  .end = 0x08000000 - 1,
111  .flags = IORESOURCE_MEM,
112  }
113 };
114 
115 static struct platform_device nor_flash_device = {
116  .name = "physmap-flash",
117  .dev = {
118  .platform_data = &nor_flash_data,
119  },
120  .num_resources = ARRAY_SIZE(nor_flash_resources),
121  .resource = nor_flash_resources,
122 };
123 
124 /* USBHS */
125 static void usb_host_port_power(int port, int power)
126 {
127  if (!power) /* only power-on supported for now */
128  return;
129 
130  /* set VBOUT/PWEN and EXTLP0 in DVSTCTR */
131  __raw_writew(__raw_readw(IOMEM(0xe6890008)) | 0x600, IOMEM(0xe6890008));
132 }
133 
134 static struct r8a66597_platdata usb_host_data = {
135  .on_chip = 1,
136  .port_power = usb_host_port_power,
137 };
138 
139 static struct resource usb_host_resources[] = {
140  [0] = {
141  .name = "USBHS",
142  .start = 0xe6890000,
143  .end = 0xe68900e5,
144  .flags = IORESOURCE_MEM,
145  },
146  [1] = {
147  .start = evt2irq(0x0a20), /* USBHS_USHI0 */
148  .flags = IORESOURCE_IRQ,
149  },
150 };
151 
152 static struct platform_device usb_host_device = {
153  .name = "r8a66597_hcd",
154  .id = 0,
155  .dev = {
156  .platform_data = &usb_host_data,
157  .dma_mask = NULL,
158  .coherent_dma_mask = 0xffffffff,
159  },
160  .num_resources = ARRAY_SIZE(usb_host_resources),
161  .resource = usb_host_resources,
162 };
163 
164 /* KEYSC */
165 static struct sh_keysc_info keysc_info = {
166  .mode = SH_KEYSC_MODE_5,
167  .scan_timing = 3,
168  .delay = 100,
169  .keycodes = {
177  },
178 };
179 
180 static struct resource keysc_resources[] = {
181  [0] = {
182  .name = "KEYSC",
183  .start = 0xe61b0000,
184  .end = 0xe61b000f,
185  .flags = IORESOURCE_MEM,
186  },
187  [1] = {
188  .start = evt2irq(0x0be0), /* KEYSC_KEY */
189  .flags = IORESOURCE_IRQ,
190  },
191 };
192 
193 static struct platform_device keysc_device = {
194  .name = "sh_keysc",
195  .id = 0, /* keysc0 clock */
196  .num_resources = ARRAY_SIZE(keysc_resources),
197  .resource = keysc_resources,
198  .dev = {
199  .platform_data = &keysc_info,
200  },
201 };
202 
203 /* Fixed 3.3V regulator to be used by SDHI0 and SDHI1 */
204 static struct regulator_consumer_supply fixed3v3_power_consumers[] =
205 {
206  REGULATOR_SUPPLY("vmmc", "sh_mobile_sdhi.0"),
207  REGULATOR_SUPPLY("vqmmc", "sh_mobile_sdhi.0"),
208  REGULATOR_SUPPLY("vmmc", "sh_mobile_sdhi.1"),
209  REGULATOR_SUPPLY("vqmmc", "sh_mobile_sdhi.1"),
210 };
211 
212 /* SDHI */
213 static struct sh_mobile_sdhi_info sdhi0_info = {
214  .tmio_caps = MMC_CAP_SDIO_IRQ,
215 };
216 
217 static struct resource sdhi0_resources[] = {
218  [0] = {
219  .name = "SDHI0",
220  .start = 0xe6d50000,
221  .end = 0xe6d500ff,
222  .flags = IORESOURCE_MEM,
223  },
224  [1] = {
225  .start = evt2irq(0x0e00), /* SDHI0 */
226  .flags = IORESOURCE_IRQ,
227  },
228 };
229 
230 static struct platform_device sdhi0_device = {
231  .name = "sh_mobile_sdhi",
232  .num_resources = ARRAY_SIZE(sdhi0_resources),
233  .resource = sdhi0_resources,
234  .id = 0,
235  .dev = {
236  .platform_data = &sdhi0_info,
237  },
238 };
239 
240 static struct sh_mobile_sdhi_info sdhi1_info = {
241  .tmio_caps = MMC_CAP_NONREMOVABLE | MMC_CAP_SDIO_IRQ,
242 };
243 
244 static struct resource sdhi1_resources[] = {
245  [0] = {
246  .name = "SDHI1",
247  .start = 0xe6d60000,
248  .end = 0xe6d600ff,
249  .flags = IORESOURCE_MEM,
250  },
251  [1] = {
252  .start = evt2irq(0x0e80), /* SDHI1 */
253  .flags = IORESOURCE_IRQ,
254  },
255 };
256 
257 static struct platform_device sdhi1_device = {
258  .name = "sh_mobile_sdhi",
259  .num_resources = ARRAY_SIZE(sdhi1_resources),
260  .resource = sdhi1_resources,
261  .id = 1,
262  .dev = {
263  .platform_data = &sdhi1_info,
264  },
265 };
266 
267 static struct platform_device *g4evm_devices[] __initdata = {
268  &nor_flash_device,
269  &usb_host_device,
270  &keysc_device,
271  &sdhi0_device,
272  &sdhi1_device,
273 };
274 
275 #define GPIO_SDHID0_D0 IOMEM(0xe60520fc)
276 #define GPIO_SDHID0_D1 IOMEM(0xe60520fd)
277 #define GPIO_SDHID0_D2 IOMEM(0xe60520fe)
278 #define GPIO_SDHID0_D3 IOMEM(0xe60520ff)
279 #define GPIO_SDHICMD0 IOMEM(0xe6052100)
280 
281 #define GPIO_SDHID1_D0 IOMEM(0xe6052103)
282 #define GPIO_SDHID1_D1 IOMEM(0xe6052104)
283 #define GPIO_SDHID1_D2 IOMEM(0xe6052105)
284 #define GPIO_SDHID1_D3 IOMEM(0xe6052106)
285 #define GPIO_SDHICMD1 IOMEM(0xe6052107)
286 
287 static void __init g4evm_init(void)
288 {
289  regulator_register_always_on(0, "fixed-3.3V", fixed3v3_power_consumers,
290  ARRAY_SIZE(fixed3v3_power_consumers), 3300000);
291 
293 
294  /* Lit DS14 LED */
297  gpio_export(GPIO_PORT109, 1);
298 
299  /* Lit DS15 LED */
302  gpio_export(GPIO_PORT110, 1);
303 
304  /* Lit DS16 LED */
307  gpio_export(GPIO_PORT112, 1);
308 
309  /* Lit DS17 LED */
312  gpio_export(GPIO_PORT113, 1);
313 
314  /* USBHS */
321 
322  /* setup USB phy */
323  __raw_writew(0x0200, IOMEM(0xe605810a)); /* USBCR1 */
324  __raw_writew(0x00e0, IOMEM(0xe60581c0)); /* CPFCH */
325  __raw_writew(0x6010, IOMEM(0xe60581c6)); /* CGPOSR */
326  __raw_writew(0x8a0a, IOMEM(0xe605810c)); /* USBCR2 */
327 
328  /* KEYSC @ CN31 */
342 
343  /* SDHI0 */
352  gpio_request_pullup(GPIO_SDHID0_D0);
353  gpio_request_pullup(GPIO_SDHID0_D1);
354  gpio_request_pullup(GPIO_SDHID0_D2);
355  gpio_request_pullup(GPIO_SDHID0_D3);
356  gpio_request_pullup(GPIO_SDHICMD0);
357 
358  /* SDHI1 */
365  gpio_request_pullup(GPIO_SDHID1_D0);
366  gpio_request_pullup(GPIO_SDHID1_D1);
367  gpio_request_pullup(GPIO_SDHID1_D2);
368  gpio_request_pullup(GPIO_SDHID1_D3);
369  gpio_request_pullup(GPIO_SDHICMD1);
370 
372 
373  platform_add_devices(g4evm_devices, ARRAY_SIZE(g4evm_devices));
374 }
375 
376 MACHINE_START(G4EVM, "g4evm")
377  .map_io = sh7377_map_io,
379  .init_irq = sh7377_init_irq,
381  .init_machine = g4evm_init,
382  .init_late = shmobile_init_late,
383  .timer = &shmobile_timer,