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