diff options
-rw-r--r-- | MAINTAINERS | 2 | ||||
-rw-r--r-- | arch/arm/mach-omap2/Kconfig | 13 | ||||
-rw-r--r-- | arch/arm/mach-omap2/Makefile | 1 | ||||
-rw-r--r-- | arch/arm/mach-omap2/board-igep0020.c | 683 |
4 files changed, 1 insertions, 698 deletions
diff --git a/MAINTAINERS b/MAINTAINERS index 8a0cbf3cf2c8..1f006f15668c 100644 --- a/MAINTAINERS +++ b/MAINTAINERS | |||
@@ -929,7 +929,7 @@ M: Javier Martinez Canillas <javier@dowhile0.org> | |||
929 | L: linux-omap@vger.kernel.org | 929 | L: linux-omap@vger.kernel.org |
930 | L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers) | 930 | L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers) |
931 | S: Maintained | 931 | S: Maintained |
932 | F: arch/arm/mach-omap2/board-igep0020.c | 932 | F: arch/arm/boot/dts/omap3-igep* |
933 | 933 | ||
934 | ARM/INCOME PXA270 SUPPORT | 934 | ARM/INCOME PXA270 SUPPORT |
935 | M: Marek Vasut <marek.vasut@gmail.com> | 935 | M: Marek Vasut <marek.vasut@gmail.com> |
diff --git a/arch/arm/mach-omap2/Kconfig b/arch/arm/mach-omap2/Kconfig index 7a020c5f985c..68c9688815aa 100644 --- a/arch/arm/mach-omap2/Kconfig +++ b/arch/arm/mach-omap2/Kconfig | |||
@@ -326,19 +326,6 @@ config MACH_CM_T3517 | |||
326 | config MACH_CM_T3730 | 326 | config MACH_CM_T3730 |
327 | bool | 327 | bool |
328 | 328 | ||
329 | config MACH_IGEP0020 | ||
330 | bool "IGEP v2 board" | ||
331 | depends on ARCH_OMAP3 | ||
332 | default y | ||
333 | select OMAP_PACKAGE_CBB | ||
334 | |||
335 | config MACH_IGEP0030 | ||
336 | bool "IGEP OMAP3 module" | ||
337 | depends on ARCH_OMAP3 | ||
338 | default y | ||
339 | select MACH_IGEP0020 | ||
340 | select OMAP_PACKAGE_CBB | ||
341 | |||
342 | config MACH_SBC3530 | 329 | config MACH_SBC3530 |
343 | bool "OMAP3 SBC STALKER board" | 330 | bool "OMAP3 SBC STALKER board" |
344 | depends on ARCH_OMAP3 | 331 | depends on ARCH_OMAP3 |
diff --git a/arch/arm/mach-omap2/Makefile b/arch/arm/mach-omap2/Makefile index 449a174ab926..096d6bbcd3bc 100644 --- a/arch/arm/mach-omap2/Makefile +++ b/arch/arm/mach-omap2/Makefile | |||
@@ -250,7 +250,6 @@ obj-$(CONFIG_MACH_NOKIA_RX51) += board-rx51-peripherals.o | |||
250 | obj-$(CONFIG_MACH_NOKIA_RX51) += board-rx51-video.o | 250 | obj-$(CONFIG_MACH_NOKIA_RX51) += board-rx51-video.o |
251 | obj-$(CONFIG_MACH_CM_T35) += board-cm-t35.o | 251 | obj-$(CONFIG_MACH_CM_T35) += board-cm-t35.o |
252 | obj-$(CONFIG_MACH_CM_T3517) += board-cm-t3517.o | 252 | obj-$(CONFIG_MACH_CM_T3517) += board-cm-t3517.o |
253 | obj-$(CONFIG_MACH_IGEP0020) += board-igep0020.o | ||
254 | obj-$(CONFIG_MACH_TOUCHBOOK) += board-omap3touchbook.o | 253 | obj-$(CONFIG_MACH_TOUCHBOOK) += board-omap3touchbook.o |
255 | 254 | ||
256 | obj-$(CONFIG_MACH_OMAP3517EVM) += board-am3517evm.o | 255 | obj-$(CONFIG_MACH_OMAP3517EVM) += board-am3517evm.o |
diff --git a/arch/arm/mach-omap2/board-igep0020.c b/arch/arm/mach-omap2/board-igep0020.c deleted file mode 100644 index d648d50d9d24..000000000000 --- a/arch/arm/mach-omap2/board-igep0020.c +++ /dev/null | |||
@@ -1,683 +0,0 @@ | |||
1 | /* | ||
2 | * Copyright (C) 2009 Integration Software and Electronic Engineering. | ||
3 | * | ||
4 | * Modified from mach-omap2/board-generic.c | ||
5 | * | ||
6 | * This program is free software; you can redistribute it and/or modify | ||
7 | * it under the terms of the GNU General Public License version 2 as | ||
8 | * published by the Free Software Foundation. | ||
9 | */ | ||
10 | |||
11 | #include <linux/kernel.h> | ||
12 | #include <linux/init.h> | ||
13 | #include <linux/platform_device.h> | ||
14 | #include <linux/delay.h> | ||
15 | #include <linux/err.h> | ||
16 | #include <linux/clk.h> | ||
17 | #include <linux/io.h> | ||
18 | #include <linux/gpio.h> | ||
19 | #include <linux/interrupt.h> | ||
20 | #include <linux/input.h> | ||
21 | #include <linux/usb/phy.h> | ||
22 | |||
23 | #include <linux/regulator/machine.h> | ||
24 | #include <linux/regulator/fixed.h> | ||
25 | #include <linux/i2c/twl.h> | ||
26 | #include <linux/mmc/host.h> | ||
27 | |||
28 | #include <linux/mtd/nand.h> | ||
29 | |||
30 | #include <asm/mach-types.h> | ||
31 | #include <asm/mach/arch.h> | ||
32 | |||
33 | #include <video/omapdss.h> | ||
34 | #include <video/omap-panel-data.h> | ||
35 | #include <linux/platform_data/mtd-onenand-omap2.h> | ||
36 | |||
37 | #include "common.h" | ||
38 | #include "gpmc.h" | ||
39 | #include "mux.h" | ||
40 | #include "hsmmc.h" | ||
41 | #include "sdram-numonyx-m65kxxxxam.h" | ||
42 | #include "common-board-devices.h" | ||
43 | #include "board-flash.h" | ||
44 | #include "control.h" | ||
45 | #include "gpmc-onenand.h" | ||
46 | #include "dss-common.h" | ||
47 | |||
48 | #define IGEP2_SMSC911X_CS 5 | ||
49 | #define IGEP2_SMSC911X_GPIO 176 | ||
50 | #define IGEP2_GPIO_USBH_NRESET 24 | ||
51 | #define IGEP2_GPIO_LED0_GREEN 26 | ||
52 | #define IGEP2_GPIO_LED0_RED 27 | ||
53 | #define IGEP2_GPIO_LED1_RED 28 | ||
54 | |||
55 | #define IGEP2_RB_GPIO_WIFI_NPD 94 | ||
56 | #define IGEP2_RB_GPIO_WIFI_NRESET 95 | ||
57 | #define IGEP2_RB_GPIO_BT_NRESET 137 | ||
58 | #define IGEP2_RC_GPIO_WIFI_NPD 138 | ||
59 | #define IGEP2_RC_GPIO_WIFI_NRESET 139 | ||
60 | #define IGEP2_RC_GPIO_BT_NRESET 137 | ||
61 | |||
62 | #define IGEP3_GPIO_LED0_GREEN 54 | ||
63 | #define IGEP3_GPIO_LED0_RED 53 | ||
64 | #define IGEP3_GPIO_LED1_RED 16 | ||
65 | #define IGEP3_GPIO_USBH_NRESET 183 | ||
66 | |||
67 | #define IGEP_SYSBOOT_MASK 0x1f | ||
68 | #define IGEP_SYSBOOT_NAND 0x0f | ||
69 | #define IGEP_SYSBOOT_ONENAND 0x10 | ||
70 | |||
71 | /* | ||
72 | * IGEP2 Hardware Revision Table | ||
73 | * | ||
74 | * -------------------------------------------------------------------------- | ||
75 | * | Id. | Hw Rev. | HW0 (28) | WIFI_NPD | WIFI_NRESET | BT_NRESET | | ||
76 | * -------------------------------------------------------------------------- | ||
77 | * | 0 | B | high | gpio94 | gpio95 | - | | ||
78 | * | 0 | B/C (B-compatible) | high | gpio94 | gpio95 | gpio137 | | ||
79 | * | 1 | C | low | gpio138 | gpio139 | gpio137 | | ||
80 | * -------------------------------------------------------------------------- | ||
81 | */ | ||
82 | |||
83 | #define IGEP2_BOARD_HWREV_B 0 | ||
84 | #define IGEP2_BOARD_HWREV_C 1 | ||
85 | #define IGEP3_BOARD_HWREV 2 | ||
86 | |||
87 | static u8 hwrev; | ||
88 | |||
89 | static void __init igep2_get_revision(void) | ||
90 | { | ||
91 | u8 ret; | ||
92 | |||
93 | if (machine_is_igep0030()) { | ||
94 | hwrev = IGEP3_BOARD_HWREV; | ||
95 | return; | ||
96 | } | ||
97 | |||
98 | omap_mux_init_gpio(IGEP2_GPIO_LED1_RED, OMAP_PIN_INPUT); | ||
99 | |||
100 | if (gpio_request_one(IGEP2_GPIO_LED1_RED, GPIOF_IN, "GPIO_HW0_REV")) { | ||
101 | pr_warning("IGEP2: Could not obtain gpio GPIO_HW0_REV\n"); | ||
102 | pr_err("IGEP2: Unknown Hardware Revision\n"); | ||
103 | return; | ||
104 | } | ||
105 | |||
106 | ret = gpio_get_value(IGEP2_GPIO_LED1_RED); | ||
107 | if (ret == 0) { | ||
108 | pr_info("IGEP2: Hardware Revision C (B-NON compatible)\n"); | ||
109 | hwrev = IGEP2_BOARD_HWREV_C; | ||
110 | } else if (ret == 1) { | ||
111 | pr_info("IGEP2: Hardware Revision B/C (B compatible)\n"); | ||
112 | hwrev = IGEP2_BOARD_HWREV_B; | ||
113 | } else { | ||
114 | pr_err("IGEP2: Unknown Hardware Revision\n"); | ||
115 | hwrev = -1; | ||
116 | } | ||
117 | |||
118 | gpio_free(IGEP2_GPIO_LED1_RED); | ||
119 | } | ||
120 | |||
121 | #if defined(CONFIG_MTD_ONENAND_OMAP2) || \ | ||
122 | defined(CONFIG_MTD_ONENAND_OMAP2_MODULE) || \ | ||
123 | defined(CONFIG_MTD_NAND_OMAP2) || \ | ||
124 | defined(CONFIG_MTD_NAND_OMAP2_MODULE) | ||
125 | |||
126 | #define ONENAND_MAP 0x20000000 | ||
127 | |||
128 | /* NAND04GR4E1A ( x2 Flash built-in COMBO POP MEMORY ) | ||
129 | * Since the device is equipped with two DataRAMs, and two-plane NAND | ||
130 | * Flash memory array, these two component enables simultaneous program | ||
131 | * of 4KiB. Plane1 has only even blocks such as block0, block2, block4 | ||
132 | * while Plane2 has only odd blocks such as block1, block3, block5. | ||
133 | * So MTD regards it as 4KiB page size and 256KiB block size 64*(2*2048) | ||
134 | */ | ||
135 | |||
136 | static struct mtd_partition igep_flash_partitions[] = { | ||
137 | { | ||
138 | .name = "X-Loader", | ||
139 | .offset = 0, | ||
140 | .size = 2 * (64*(2*2048)) | ||
141 | }, | ||
142 | { | ||
143 | .name = "U-Boot", | ||
144 | .offset = MTDPART_OFS_APPEND, | ||
145 | .size = 6 * (64*(2*2048)), | ||
146 | }, | ||
147 | { | ||
148 | .name = "Environment", | ||
149 | .offset = MTDPART_OFS_APPEND, | ||
150 | .size = 2 * (64*(2*2048)), | ||
151 | }, | ||
152 | { | ||
153 | .name = "Kernel", | ||
154 | .offset = MTDPART_OFS_APPEND, | ||
155 | .size = 12 * (64*(2*2048)), | ||
156 | }, | ||
157 | { | ||
158 | .name = "File System", | ||
159 | .offset = MTDPART_OFS_APPEND, | ||
160 | .size = MTDPART_SIZ_FULL, | ||
161 | }, | ||
162 | }; | ||
163 | |||
164 | static inline u32 igep_get_sysboot_value(void) | ||
165 | { | ||
166 | return omap_ctrl_readl(OMAP343X_CONTROL_STATUS) & IGEP_SYSBOOT_MASK; | ||
167 | } | ||
168 | |||
169 | static void __init igep_flash_init(void) | ||
170 | { | ||
171 | u32 mux; | ||
172 | mux = igep_get_sysboot_value(); | ||
173 | |||
174 | if (mux == IGEP_SYSBOOT_NAND) { | ||
175 | pr_info("IGEP: initializing NAND memory device\n"); | ||
176 | board_nand_init(igep_flash_partitions, | ||
177 | ARRAY_SIZE(igep_flash_partitions), | ||
178 | 0, NAND_BUSWIDTH_16, nand_default_timings); | ||
179 | } else if (mux == IGEP_SYSBOOT_ONENAND) { | ||
180 | pr_info("IGEP: initializing OneNAND memory device\n"); | ||
181 | board_onenand_init(igep_flash_partitions, | ||
182 | ARRAY_SIZE(igep_flash_partitions), 0); | ||
183 | } else { | ||
184 | pr_err("IGEP: Flash: unsupported sysboot sequence found\n"); | ||
185 | } | ||
186 | } | ||
187 | |||
188 | #else | ||
189 | static void __init igep_flash_init(void) {} | ||
190 | #endif | ||
191 | |||
192 | #if defined(CONFIG_SMSC911X) || defined(CONFIG_SMSC911X_MODULE) | ||
193 | |||
194 | #include <linux/smsc911x.h> | ||
195 | #include "gpmc-smsc911x.h" | ||
196 | |||
197 | static struct omap_smsc911x_platform_data smsc911x_cfg = { | ||
198 | .cs = IGEP2_SMSC911X_CS, | ||
199 | .gpio_irq = IGEP2_SMSC911X_GPIO, | ||
200 | .gpio_reset = -EINVAL, | ||
201 | .flags = SMSC911X_USE_32BIT | SMSC911X_SAVE_MAC_ADDRESS, | ||
202 | }; | ||
203 | |||
204 | static inline void __init igep2_init_smsc911x(void) | ||
205 | { | ||
206 | gpmc_smsc911x_init(&smsc911x_cfg); | ||
207 | } | ||
208 | |||
209 | #else | ||
210 | static inline void __init igep2_init_smsc911x(void) { } | ||
211 | #endif | ||
212 | |||
213 | static struct regulator_consumer_supply igep_vmmc1_supply[] = { | ||
214 | REGULATOR_SUPPLY("vmmc", "omap_hsmmc.0"), | ||
215 | }; | ||
216 | |||
217 | /* VMMC1 for OMAP VDD_MMC1 (i/o) and MMC1 card */ | ||
218 | static struct regulator_init_data igep_vmmc1 = { | ||
219 | .constraints = { | ||
220 | .min_uV = 1850000, | ||
221 | .max_uV = 3150000, | ||
222 | .valid_modes_mask = REGULATOR_MODE_NORMAL | ||
223 | | REGULATOR_MODE_STANDBY, | ||
224 | .valid_ops_mask = REGULATOR_CHANGE_VOLTAGE | ||
225 | | REGULATOR_CHANGE_MODE | ||
226 | | REGULATOR_CHANGE_STATUS, | ||
227 | }, | ||
228 | .num_consumer_supplies = ARRAY_SIZE(igep_vmmc1_supply), | ||
229 | .consumer_supplies = igep_vmmc1_supply, | ||
230 | }; | ||
231 | |||
232 | static struct regulator_consumer_supply igep_vio_supply[] = { | ||
233 | REGULATOR_SUPPLY("vmmc_aux", "omap_hsmmc.1"), | ||
234 | }; | ||
235 | |||
236 | static struct regulator_init_data igep_vio = { | ||
237 | .constraints = { | ||
238 | .min_uV = 1800000, | ||
239 | .max_uV = 1800000, | ||
240 | .apply_uV = 1, | ||
241 | .valid_modes_mask = REGULATOR_MODE_NORMAL | ||
242 | | REGULATOR_MODE_STANDBY, | ||
243 | .valid_ops_mask = REGULATOR_CHANGE_VOLTAGE | ||
244 | | REGULATOR_CHANGE_MODE | ||
245 | | REGULATOR_CHANGE_STATUS, | ||
246 | }, | ||
247 | .num_consumer_supplies = ARRAY_SIZE(igep_vio_supply), | ||
248 | .consumer_supplies = igep_vio_supply, | ||
249 | }; | ||
250 | |||
251 | static struct regulator_consumer_supply igep_vmmc2_supply[] = { | ||
252 | REGULATOR_SUPPLY("vmmc", "omap_hsmmc.1"), | ||
253 | }; | ||
254 | |||
255 | static struct regulator_init_data igep_vmmc2 = { | ||
256 | .constraints = { | ||
257 | .valid_modes_mask = REGULATOR_MODE_NORMAL, | ||
258 | .always_on = 1, | ||
259 | }, | ||
260 | .num_consumer_supplies = ARRAY_SIZE(igep_vmmc2_supply), | ||
261 | .consumer_supplies = igep_vmmc2_supply, | ||
262 | }; | ||
263 | |||
264 | static struct fixed_voltage_config igep_vwlan = { | ||
265 | .supply_name = "vwlan", | ||
266 | .microvolts = 3300000, | ||
267 | .gpio = -EINVAL, | ||
268 | .enabled_at_boot = 1, | ||
269 | .init_data = &igep_vmmc2, | ||
270 | }; | ||
271 | |||
272 | static struct platform_device igep_vwlan_device = { | ||
273 | .name = "reg-fixed-voltage", | ||
274 | .id = 0, | ||
275 | .dev = { | ||
276 | .platform_data = &igep_vwlan, | ||
277 | }, | ||
278 | }; | ||
279 | |||
280 | static struct omap2_hsmmc_info mmc[] = { | ||
281 | { | ||
282 | .mmc = 1, | ||
283 | .caps = MMC_CAP_4_BIT_DATA, | ||
284 | .gpio_cd = -EINVAL, | ||
285 | .gpio_wp = -EINVAL, | ||
286 | .deferred = true, | ||
287 | }, | ||
288 | #if defined(CONFIG_LIBERTAS_SDIO) || defined(CONFIG_LIBERTAS_SDIO_MODULE) | ||
289 | { | ||
290 | .mmc = 2, | ||
291 | .caps = MMC_CAP_4_BIT_DATA, | ||
292 | .gpio_cd = -EINVAL, | ||
293 | .gpio_wp = -EINVAL, | ||
294 | }, | ||
295 | #endif | ||
296 | {} /* Terminator */ | ||
297 | }; | ||
298 | |||
299 | #if defined(CONFIG_LEDS_GPIO) || defined(CONFIG_LEDS_GPIO_MODULE) | ||
300 | #include <linux/leds.h> | ||
301 | |||
302 | static struct gpio_led igep_gpio_leds[] = { | ||
303 | [0] = { | ||
304 | .name = "omap3:red:user0", | ||
305 | .default_state = 0, | ||
306 | }, | ||
307 | [1] = { | ||
308 | .name = "omap3:green:boot", | ||
309 | .default_state = 1, | ||
310 | }, | ||
311 | [2] = { | ||
312 | .name = "omap3:red:user1", | ||
313 | .default_state = 0, | ||
314 | }, | ||
315 | [3] = { | ||
316 | .name = "omap3:green:user1", | ||
317 | .default_state = 0, | ||
318 | .gpio = -EINVAL, /* gets replaced */ | ||
319 | .active_low = 1, | ||
320 | }, | ||
321 | }; | ||
322 | |||
323 | static struct gpio_led_platform_data igep_led_pdata = { | ||
324 | .leds = igep_gpio_leds, | ||
325 | .num_leds = ARRAY_SIZE(igep_gpio_leds), | ||
326 | }; | ||
327 | |||
328 | static struct platform_device igep_led_device = { | ||
329 | .name = "leds-gpio", | ||
330 | .id = -1, | ||
331 | .dev = { | ||
332 | .platform_data = &igep_led_pdata, | ||
333 | }, | ||
334 | }; | ||
335 | |||
336 | static void __init igep_leds_init(void) | ||
337 | { | ||
338 | if (machine_is_igep0020()) { | ||
339 | igep_gpio_leds[0].gpio = IGEP2_GPIO_LED0_RED; | ||
340 | igep_gpio_leds[1].gpio = IGEP2_GPIO_LED0_GREEN; | ||
341 | igep_gpio_leds[2].gpio = IGEP2_GPIO_LED1_RED; | ||
342 | } else { | ||
343 | igep_gpio_leds[0].gpio = IGEP3_GPIO_LED0_RED; | ||
344 | igep_gpio_leds[1].gpio = IGEP3_GPIO_LED0_GREEN; | ||
345 | igep_gpio_leds[2].gpio = IGEP3_GPIO_LED1_RED; | ||
346 | } | ||
347 | |||
348 | platform_device_register(&igep_led_device); | ||
349 | } | ||
350 | |||
351 | #else | ||
352 | static struct gpio igep_gpio_leds[] __initdata = { | ||
353 | { -EINVAL, GPIOF_OUT_INIT_LOW, "gpio-led:red:d0" }, | ||
354 | { -EINVAL, GPIOF_OUT_INIT_LOW, "gpio-led:green:d0" }, | ||
355 | { -EINVAL, GPIOF_OUT_INIT_LOW, "gpio-led:red:d1" }, | ||
356 | }; | ||
357 | |||
358 | static inline void igep_leds_init(void) | ||
359 | { | ||
360 | int i; | ||
361 | |||
362 | if (machine_is_igep0020()) { | ||
363 | igep_gpio_leds[0].gpio = IGEP2_GPIO_LED0_RED; | ||
364 | igep_gpio_leds[1].gpio = IGEP2_GPIO_LED0_GREEN; | ||
365 | igep_gpio_leds[2].gpio = IGEP2_GPIO_LED1_RED; | ||
366 | } else { | ||
367 | igep_gpio_leds[0].gpio = IGEP3_GPIO_LED0_RED; | ||
368 | igep_gpio_leds[1].gpio = IGEP3_GPIO_LED0_GREEN; | ||
369 | igep_gpio_leds[2].gpio = IGEP3_GPIO_LED1_RED; | ||
370 | } | ||
371 | |||
372 | if (gpio_request_array(igep_gpio_leds, ARRAY_SIZE(igep_gpio_leds))) { | ||
373 | pr_warning("IGEP v2: Could not obtain leds gpios\n"); | ||
374 | return; | ||
375 | } | ||
376 | |||
377 | for (i = 0; i < ARRAY_SIZE(igep_gpio_leds); i++) | ||
378 | gpio_export(igep_gpio_leds[i].gpio, 0); | ||
379 | } | ||
380 | #endif | ||
381 | |||
382 | static struct gpio igep2_twl_gpios[] = { | ||
383 | { -EINVAL, GPIOF_IN, "GPIO_EHCI_NOC" }, | ||
384 | { -EINVAL, GPIOF_OUT_INIT_LOW, "GPIO_USBH_CPEN" }, | ||
385 | }; | ||
386 | |||
387 | static int igep_twl_gpio_setup(struct device *dev, | ||
388 | unsigned gpio, unsigned ngpio) | ||
389 | { | ||
390 | int ret; | ||
391 | |||
392 | /* gpio + 0 is "mmc0_cd" (input/IRQ) */ | ||
393 | mmc[0].gpio_cd = gpio + 0; | ||
394 | omap_hsmmc_late_init(mmc); | ||
395 | |||
396 | /* TWL4030_GPIO_MAX + 1 == ledB (out, active low LED) */ | ||
397 | #if !defined(CONFIG_LEDS_GPIO) && !defined(CONFIG_LEDS_GPIO_MODULE) | ||
398 | ret = gpio_request_one(gpio + TWL4030_GPIO_MAX + 1, GPIOF_OUT_INIT_HIGH, | ||
399 | "gpio-led:green:d1"); | ||
400 | if (ret == 0) | ||
401 | gpio_export(gpio + TWL4030_GPIO_MAX + 1, 0); | ||
402 | else | ||
403 | pr_warning("IGEP: Could not obtain gpio GPIO_LED1_GREEN\n"); | ||
404 | #else | ||
405 | igep_gpio_leds[3].gpio = gpio + TWL4030_GPIO_MAX + 1; | ||
406 | #endif | ||
407 | |||
408 | if (machine_is_igep0030()) | ||
409 | return 0; | ||
410 | |||
411 | /* | ||
412 | * REVISIT: need ehci-omap hooks for external VBUS | ||
413 | * power switch and overcurrent detect | ||
414 | */ | ||
415 | igep2_twl_gpios[0].gpio = gpio + 1; | ||
416 | |||
417 | /* TWL4030_GPIO_MAX + 0 == ledA, GPIO_USBH_CPEN (out, active low) */ | ||
418 | igep2_twl_gpios[1].gpio = gpio + TWL4030_GPIO_MAX; | ||
419 | |||
420 | ret = gpio_request_array(igep2_twl_gpios, ARRAY_SIZE(igep2_twl_gpios)); | ||
421 | if (ret < 0) | ||
422 | pr_err("IGEP2: Could not obtain gpio for USBH_CPEN"); | ||
423 | |||
424 | return 0; | ||
425 | }; | ||
426 | |||
427 | static struct twl4030_gpio_platform_data igep_twl4030_gpio_pdata = { | ||
428 | .use_leds = true, | ||
429 | .setup = igep_twl_gpio_setup, | ||
430 | }; | ||
431 | |||
432 | static int igep2_keymap[] = { | ||
433 | KEY(0, 0, KEY_LEFT), | ||
434 | KEY(0, 1, KEY_RIGHT), | ||
435 | KEY(0, 2, KEY_A), | ||
436 | KEY(0, 3, KEY_B), | ||
437 | KEY(1, 0, KEY_DOWN), | ||
438 | KEY(1, 1, KEY_UP), | ||
439 | KEY(1, 2, KEY_E), | ||
440 | KEY(1, 3, KEY_F), | ||
441 | KEY(2, 0, KEY_ENTER), | ||
442 | KEY(2, 1, KEY_I), | ||
443 | KEY(2, 2, KEY_J), | ||
444 | KEY(2, 3, KEY_K), | ||
445 | KEY(3, 0, KEY_M), | ||
446 | KEY(3, 1, KEY_N), | ||
447 | KEY(3, 2, KEY_O), | ||
448 | KEY(3, 3, KEY_P) | ||
449 | }; | ||
450 | |||
451 | static struct matrix_keymap_data igep2_keymap_data = { | ||
452 | .keymap = igep2_keymap, | ||
453 | .keymap_size = ARRAY_SIZE(igep2_keymap), | ||
454 | }; | ||
455 | |||
456 | static struct twl4030_keypad_data igep2_keypad_pdata = { | ||
457 | .keymap_data = &igep2_keymap_data, | ||
458 | .rows = 4, | ||
459 | .cols = 4, | ||
460 | .rep = 1, | ||
461 | }; | ||
462 | |||
463 | static struct twl4030_platform_data igep_twldata = { | ||
464 | /* platform_data for children goes here */ | ||
465 | .gpio = &igep_twl4030_gpio_pdata, | ||
466 | .vmmc1 = &igep_vmmc1, | ||
467 | .vio = &igep_vio, | ||
468 | }; | ||
469 | |||
470 | static struct i2c_board_info __initdata igep2_i2c3_boardinfo[] = { | ||
471 | { | ||
472 | I2C_BOARD_INFO("eeprom", 0x50), | ||
473 | }, | ||
474 | }; | ||
475 | |||
476 | static void __init igep_i2c_init(void) | ||
477 | { | ||
478 | int ret; | ||
479 | |||
480 | omap3_pmic_get_config(&igep_twldata, TWL_COMMON_PDATA_USB, | ||
481 | TWL_COMMON_REGULATOR_VPLL2); | ||
482 | igep_twldata.vpll2->constraints.apply_uV = true; | ||
483 | igep_twldata.vpll2->constraints.name = "VDVI"; | ||
484 | |||
485 | if (machine_is_igep0020()) { | ||
486 | /* | ||
487 | * Bus 3 is attached to the DVI port where devices like the | ||
488 | * pico DLP projector don't work reliably with 400kHz | ||
489 | */ | ||
490 | ret = omap_register_i2c_bus(3, 100, igep2_i2c3_boardinfo, | ||
491 | ARRAY_SIZE(igep2_i2c3_boardinfo)); | ||
492 | if (ret) | ||
493 | pr_warning("IGEP2: Could not register I2C3 bus (%d)\n", ret); | ||
494 | |||
495 | igep_twldata.keypad = &igep2_keypad_pdata; | ||
496 | /* Get common pmic data */ | ||
497 | omap3_pmic_get_config(&igep_twldata, TWL_COMMON_PDATA_AUDIO, 0); | ||
498 | } | ||
499 | |||
500 | omap3_pmic_init("twl4030", &igep_twldata); | ||
501 | } | ||
502 | |||
503 | static struct usbhs_phy_data igep2_phy_data[] __initdata = { | ||
504 | { | ||
505 | .port = 1, | ||
506 | .reset_gpio = IGEP2_GPIO_USBH_NRESET, | ||
507 | .vcc_gpio = -EINVAL, | ||
508 | }, | ||
509 | }; | ||
510 | |||
511 | static struct usbhs_phy_data igep3_phy_data[] __initdata = { | ||
512 | { | ||
513 | .port = 2, | ||
514 | .reset_gpio = IGEP3_GPIO_USBH_NRESET, | ||
515 | .vcc_gpio = -EINVAL, | ||
516 | }, | ||
517 | }; | ||
518 | |||
519 | static struct usbhs_omap_platform_data igep2_usbhs_bdata __initdata = { | ||
520 | .port_mode[0] = OMAP_EHCI_PORT_MODE_PHY, | ||
521 | }; | ||
522 | |||
523 | static struct usbhs_omap_platform_data igep3_usbhs_bdata __initdata = { | ||
524 | .port_mode[1] = OMAP_EHCI_PORT_MODE_PHY, | ||
525 | }; | ||
526 | |||
527 | #ifdef CONFIG_OMAP_MUX | ||
528 | static struct omap_board_mux board_mux[] __initdata = { | ||
529 | /* Display Sub System */ | ||
530 | OMAP3_MUX(DSS_PCLK, OMAP_MUX_MODE0 | OMAP_PIN_OUTPUT), | ||
531 | OMAP3_MUX(DSS_HSYNC, OMAP_MUX_MODE0 | OMAP_PIN_OUTPUT), | ||
532 | OMAP3_MUX(DSS_VSYNC, OMAP_MUX_MODE0 | OMAP_PIN_OUTPUT), | ||
533 | OMAP3_MUX(DSS_ACBIAS, OMAP_MUX_MODE0 | OMAP_PIN_OUTPUT), | ||
534 | OMAP3_MUX(DSS_DATA0, OMAP_MUX_MODE0 | OMAP_PIN_OUTPUT), | ||
535 | OMAP3_MUX(DSS_DATA1, OMAP_MUX_MODE0 | OMAP_PIN_OUTPUT), | ||
536 | OMAP3_MUX(DSS_DATA2, OMAP_MUX_MODE0 | OMAP_PIN_OUTPUT), | ||
537 | OMAP3_MUX(DSS_DATA3, OMAP_MUX_MODE0 | OMAP_PIN_OUTPUT), | ||
538 | OMAP3_MUX(DSS_DATA4, OMAP_MUX_MODE0 | OMAP_PIN_OUTPUT), | ||
539 | OMAP3_MUX(DSS_DATA5, OMAP_MUX_MODE0 | OMAP_PIN_OUTPUT), | ||
540 | OMAP3_MUX(DSS_DATA6, OMAP_MUX_MODE0 | OMAP_PIN_OUTPUT), | ||
541 | OMAP3_MUX(DSS_DATA7, OMAP_MUX_MODE0 | OMAP_PIN_OUTPUT), | ||
542 | OMAP3_MUX(DSS_DATA8, OMAP_MUX_MODE0 | OMAP_PIN_OUTPUT), | ||
543 | OMAP3_MUX(DSS_DATA9, OMAP_MUX_MODE0 | OMAP_PIN_OUTPUT), | ||
544 | OMAP3_MUX(DSS_DATA10, OMAP_MUX_MODE0 | OMAP_PIN_OUTPUT), | ||
545 | OMAP3_MUX(DSS_DATA11, OMAP_MUX_MODE0 | OMAP_PIN_OUTPUT), | ||
546 | OMAP3_MUX(DSS_DATA12, OMAP_MUX_MODE0 | OMAP_PIN_OUTPUT), | ||
547 | OMAP3_MUX(DSS_DATA13, OMAP_MUX_MODE0 | OMAP_PIN_OUTPUT), | ||
548 | OMAP3_MUX(DSS_DATA14, OMAP_MUX_MODE0 | OMAP_PIN_OUTPUT), | ||
549 | OMAP3_MUX(DSS_DATA15, OMAP_MUX_MODE0 | OMAP_PIN_OUTPUT), | ||
550 | OMAP3_MUX(DSS_DATA16, OMAP_MUX_MODE0 | OMAP_PIN_OUTPUT), | ||
551 | OMAP3_MUX(DSS_DATA17, OMAP_MUX_MODE0 | OMAP_PIN_OUTPUT), | ||
552 | OMAP3_MUX(DSS_DATA18, OMAP_MUX_MODE0 | OMAP_PIN_OUTPUT), | ||
553 | OMAP3_MUX(DSS_DATA19, OMAP_MUX_MODE0 | OMAP_PIN_OUTPUT), | ||
554 | OMAP3_MUX(DSS_DATA20, OMAP_MUX_MODE0 | OMAP_PIN_OUTPUT), | ||
555 | OMAP3_MUX(DSS_DATA21, OMAP_MUX_MODE0 | OMAP_PIN_OUTPUT), | ||
556 | OMAP3_MUX(DSS_DATA22, OMAP_MUX_MODE0 | OMAP_PIN_OUTPUT), | ||
557 | OMAP3_MUX(DSS_DATA23, OMAP_MUX_MODE0 | OMAP_PIN_OUTPUT), | ||
558 | /* TFP410 PanelBus DVI Transmitte (GPIO_170) */ | ||
559 | OMAP3_MUX(HDQ_SIO, OMAP_MUX_MODE4 | OMAP_PIN_OUTPUT), | ||
560 | /* SMSC9221 LAN Controller ETH IRQ (GPIO_176) */ | ||
561 | OMAP3_MUX(MCSPI1_CS2, OMAP_MUX_MODE4 | OMAP_PIN_INPUT), | ||
562 | { .reg_offset = OMAP_MUX_TERMINATOR }, | ||
563 | }; | ||
564 | #endif | ||
565 | |||
566 | #if defined(CONFIG_LIBERTAS_SDIO) || defined(CONFIG_LIBERTAS_SDIO_MODULE) | ||
567 | static struct gpio igep_wlan_bt_gpios[] __initdata = { | ||
568 | { -EINVAL, GPIOF_OUT_INIT_HIGH, "GPIO_WIFI_NPD" }, | ||
569 | { -EINVAL, GPIOF_OUT_INIT_HIGH, "GPIO_WIFI_NRESET" }, | ||
570 | { -EINVAL, GPIOF_OUT_INIT_HIGH, "GPIO_BT_NRESET" }, | ||
571 | }; | ||
572 | |||
573 | static void __init igep_wlan_bt_init(void) | ||
574 | { | ||
575 | int err; | ||
576 | |||
577 | /* GPIO's for WLAN-BT combo depends on hardware revision */ | ||
578 | if (hwrev == IGEP2_BOARD_HWREV_B) { | ||
579 | igep_wlan_bt_gpios[0].gpio = IGEP2_RB_GPIO_WIFI_NPD; | ||
580 | igep_wlan_bt_gpios[1].gpio = IGEP2_RB_GPIO_WIFI_NRESET; | ||
581 | igep_wlan_bt_gpios[2].gpio = IGEP2_RB_GPIO_BT_NRESET; | ||
582 | } else if (hwrev == IGEP2_BOARD_HWREV_C || machine_is_igep0030()) { | ||
583 | igep_wlan_bt_gpios[0].gpio = IGEP2_RC_GPIO_WIFI_NPD; | ||
584 | igep_wlan_bt_gpios[1].gpio = IGEP2_RC_GPIO_WIFI_NRESET; | ||
585 | igep_wlan_bt_gpios[2].gpio = IGEP2_RC_GPIO_BT_NRESET; | ||
586 | } else | ||
587 | return; | ||
588 | |||
589 | /* Make sure that the GPIO pins are muxed correctly */ | ||
590 | omap_mux_init_gpio(igep_wlan_bt_gpios[0].gpio, OMAP_PIN_OUTPUT); | ||
591 | omap_mux_init_gpio(igep_wlan_bt_gpios[1].gpio, OMAP_PIN_OUTPUT); | ||
592 | omap_mux_init_gpio(igep_wlan_bt_gpios[2].gpio, OMAP_PIN_OUTPUT); | ||
593 | |||
594 | err = gpio_request_array(igep_wlan_bt_gpios, | ||
595 | ARRAY_SIZE(igep_wlan_bt_gpios)); | ||
596 | if (err) { | ||
597 | pr_warning("IGEP2: Could not obtain WIFI/BT gpios\n"); | ||
598 | return; | ||
599 | } | ||
600 | |||
601 | gpio_export(igep_wlan_bt_gpios[0].gpio, 0); | ||
602 | gpio_export(igep_wlan_bt_gpios[1].gpio, 0); | ||
603 | gpio_export(igep_wlan_bt_gpios[2].gpio, 0); | ||
604 | |||
605 | gpio_set_value(igep_wlan_bt_gpios[1].gpio, 0); | ||
606 | udelay(10); | ||
607 | gpio_set_value(igep_wlan_bt_gpios[1].gpio, 1); | ||
608 | |||
609 | } | ||
610 | #else | ||
611 | static inline void __init igep_wlan_bt_init(void) { } | ||
612 | #endif | ||
613 | |||
614 | static struct regulator_consumer_supply dummy_supplies[] = { | ||
615 | REGULATOR_SUPPLY("vddvario", "smsc911x.0"), | ||
616 | REGULATOR_SUPPLY("vdd33a", "smsc911x.0"), | ||
617 | }; | ||
618 | |||
619 | static void __init igep_init(void) | ||
620 | { | ||
621 | regulator_register_fixed(1, dummy_supplies, ARRAY_SIZE(dummy_supplies)); | ||
622 | omap3_mux_init(board_mux, OMAP_PACKAGE_CBB); | ||
623 | |||
624 | /* Get IGEP2 hardware revision */ | ||
625 | igep2_get_revision(); | ||
626 | |||
627 | omap_hsmmc_init(mmc); | ||
628 | |||
629 | /* Register I2C busses and drivers */ | ||
630 | igep_i2c_init(); | ||
631 | platform_device_register(&igep_vwlan_device); | ||
632 | omap3_igep2_display_init_of(); | ||
633 | omap_serial_init(); | ||
634 | omap_sdrc_init(m65kxxxxam_sdrc_params, | ||
635 | m65kxxxxam_sdrc_params); | ||
636 | usb_bind_phy("musb-hdrc.0.auto", 0, "twl4030_usb"); | ||
637 | usb_musb_init(NULL); | ||
638 | |||
639 | igep_flash_init(); | ||
640 | igep_leds_init(); | ||
641 | omap_twl4030_audio_init("igep2", NULL); | ||
642 | |||
643 | /* | ||
644 | * WLAN-BT combo module from MuRata which has a Marvell WLAN | ||
645 | * (88W8686) + CSR Bluetooth chipset. Uses SDIO interface. | ||
646 | */ | ||
647 | igep_wlan_bt_init(); | ||
648 | |||
649 | if (machine_is_igep0020()) { | ||
650 | igep2_init_smsc911x(); | ||
651 | usbhs_init_phys(igep2_phy_data, ARRAY_SIZE(igep2_phy_data)); | ||
652 | usbhs_init(&igep2_usbhs_bdata); | ||
653 | } else { | ||
654 | usbhs_init_phys(igep3_phy_data, ARRAY_SIZE(igep3_phy_data)); | ||
655 | usbhs_init(&igep3_usbhs_bdata); | ||
656 | } | ||
657 | } | ||
658 | |||
659 | MACHINE_START(IGEP0020, "IGEP v2 board") | ||
660 | .atag_offset = 0x100, | ||
661 | .reserve = omap_reserve, | ||
662 | .map_io = omap3_map_io, | ||
663 | .init_early = omap35xx_init_early, | ||
664 | .init_irq = omap3_init_irq, | ||
665 | .handle_irq = omap3_intc_handle_irq, | ||
666 | .init_machine = igep_init, | ||
667 | .init_late = omap35xx_init_late, | ||
668 | .init_time = omap3_sync32k_timer_init, | ||
669 | .restart = omap3xxx_restart, | ||
670 | MACHINE_END | ||
671 | |||
672 | MACHINE_START(IGEP0030, "IGEP OMAP3 module") | ||
673 | .atag_offset = 0x100, | ||
674 | .reserve = omap_reserve, | ||
675 | .map_io = omap3_map_io, | ||
676 | .init_early = omap35xx_init_early, | ||
677 | .init_irq = omap3_init_irq, | ||
678 | .handle_irq = omap3_intc_handle_irq, | ||
679 | .init_machine = igep_init, | ||
680 | .init_late = omap35xx_init_late, | ||
681 | .init_time = omap3_sync32k_timer_init, | ||
682 | .restart = omap3xxx_restart, | ||
683 | MACHINE_END | ||